Commit d88a7d55 authored by Laurent Lécluse's avatar Laurent Lécluse
Browse files

Nouveau système de gestion des mises à jour, avec possibilité de créer des...

Nouveau système de gestion des mises à jour, avec possibilité de créer des users ET de mettre à jour automatiquement la BDD
parent 53ceff82
......@@ -10,6 +10,13 @@ author: Laurent Lécluse - DSI - Unicaen
## Améliorations
* Pour une fiche intervenant, les champs suivants n'ont plus besoin d'être systématiquement fournis :
* Civilité
* Composante d'affectation
* Pays de naissance
* Nom patronymique
# OSE 8.1.2 (à venir)
## Corrections de bugs
......
<?php
$oa->exec('calcul-tableaux-bord');
\ No newline at end of file
<?php
$c->println("Veuillez saisir un login :");
$login = $c->getInput();
$c->println("Veuillez maintenant saisir un mot de passe :");
$pwd1 = $c->getSilentInput();
$c->println("Veuillez saisir à nouveau le même mot de passe :");
$pwd2 = $c->getSilentInput();
if ($pwd1 <> $pwd2) {
$c->printDie('Les mots de passe saisis ne correspondent pas!');
}
$c->println('Application du changement de mot de pase ...');
$oa->exec("changement-mot-de-passe --utilisateur=$login --mot-de-passe=$pwd1");
$c->println('Mot de passe changé', $c::COLOR_LIGHT_GREEN);
\ No newline at end of file
<?php
$oa->exec('chargens-calcul-effectifs');
\ No newline at end of file
<?php
$osedir = $oa->getOseDir();
// Néttoyage des caches et mise à jour des proxies
$c->exec([
"cd $osedir",
"rm -Rf cache/*",
"php vendor/bin/doctrine-module orm:generate-proxies",
"chmod -R 777 cache/DoctrineProxy",
"chmod -R 777 cache/Doctrine",
]);
\ No newline at end of file
<?php
$c->println("\nCréation d'un nouveau compte utilisateur", $c::COLOR_LIGHT_CYAN);
$params = $c->getInputs([
'nom' => 'Nom de l\'utilisateur',
'prenom' => 'Prénom',
'date-naissance' => ['description' => 'Date de naissance (format jj/mm/aaaa)', 'type' => 'date'],
'login' => 'Login',
'mot-de-passe' => ['description' => 'Mot de passe (6 caractères minimum)', 'silent' => true],
'creer-intervenant' => ['description' => 'Voulez-vous créer un intervenant pour cet utilisateur ? (O ou Y pour oui)', 'type' => 'bool'],
]);
var_export($params);
\ No newline at end of file
<?php
$oa->exec('formule-calcul');
\ No newline at end of file
<?php
$actions = [
"update" => "Mise à jour de l'application",
"notifier-indicateurs" => "Envoi des mails relatifs aux indicateurs",
"synchronisation" => "<job> : Effectue la synchronisation des données pour le <job> transmis",
"chargens-calcul-effectifs" => "Calcul des effectifs du module Charges",
"calcul-tableaux-bord" => "Recalcule tous les tableaux de bord de calculs itermédiaires",
"formule-calcul" => "Calcul de toutes les heures complémentaires à l'aide de la formule",
"changement-mot-de-passe" => "Changement de mot de passe (pour un utilisateur local uniquement)",
"maj-public-links" => "Mise à jour des liens vers les répertoires publics des dépendances",
"clear-cache" => "Vidage du cache de l'application",
];
$c->println('Actions possibles :');
foreach ($actions as $a => $l) {
$c->print($a, $c::COLOR_BLACK, $c::BG_LIGHT_GRAY);
$c->println(" : " . $l);
}
\ No newline at end of file
<?php
$fromMaster = true;
$osedir = $oa->getOseDir();
$c->println("Installation de OSE");
if (!$fromMaster) {
// Choix de la version
$c->println("\nSélection de la version à déployer", $c::COLOR_LIGHT_CYAN);
$c->println("Voici la liste des versions de OSE disponibles:");
$tags = $oa->getTags();
foreach ($tags as $tag) {
$c->println($tag);
}
$ok = false;
while (!$ok) {
$c->print("Veuillez choisir une version à déployer: ");
$version = $c->getInput('version');
if ($oa->tagIsValid($version)) {
$ok = true;
} else {
$c->println("$version n'est pas dans la liste des versions disponibles.");
}
}
// Récupération des sources
$c->println("\nDéploiement à partir des sources GIT", $c::COLOR_LIGHT_CYAN);
$c->exec([
"cd $osedir",
"git checkout tags/$version",
"mkdir cache",
"chmod 777 cache",
"chmod +7 bin/ose",
]);
$oa->writeVersion($osedir, $version);
} else {
$c->exec([
"cd $osedir",
"mkdir cache",
"chmod 777 cache",
"chmod +7 bin/ose",
]);
}
try {
$e = $c->exec('composer', false, true);
$composerExists = true;
} catch (\Exception $e) {
$composerExists = false;
}
if ($composerExists) {
// Récupération des dépendances
$c->println("\nChargement des dépendances à l'aide de Composer", $c::COLOR_LIGHT_CYAN);
$c->passthru("cd $osedir;composer install");
} else {
// Récupération de Composer
$c->println("\nRécupération de l'outil de gestion des dépendances Composer", $c::COLOR_LIGHT_CYAN);
$c->passthru("cd $osedir;wget https://getcomposer.org/composer.phar");
// Récupération des dépendances
$c->println("\nChargement des dépendances à l'aide de Composer", $c::COLOR_LIGHT_CYAN);
$c->passthru("cd $osedir;php composer.phar install");
}
// Mise à jour des liens vers les répertoires publics des dépendances
$c->println("\nMise à jour des liens vers les répertoires publics des dépendances", $c::COLOR_LIGHT_CYAN);
$oa->majUnicaenSymLinks($osedir);
$c->println('Liens mis en place', $c::COLOR_LIGHT_GREEN);
// Configuration locale
//$c->println("\nMise en place de la base de données", $c::COLOR_LIGHT_CYAN);
//$c->println("\nUne base de données Oracle doit préalablement avoir été créée. Merci de fournir dès à présent ses"
//." paramètres d'accès pour que OSE initialialise la base de données :");
$c->exec([
"cd $osedir",
"cp config.local.php.default config.local.php",
]);
// Génération des proxies pour l'ORM Doctrine
$c->println("\nGénération des proxies pour l'ORM Doctrine", $c::COLOR_LIGHT_CYAN);
$c->exec([
"cd $osedir",
"php vendor/bin/doctrine-module orm:generate-proxies",
"chmod -R 777 cache/DoctrineProxy",
"chmod -R 777 cache/Doctrine",
]);
// Mise en place des tâches CRON ??
// Conclusion
$c->println("\nFin du script d'installation des fichiers", $c::COLOR_LIGHT_GREEN);
\ No newline at end of file
<?php
$osedir = $oa->getOseDir();
$c->println("\nMise à jour des liens vers les répertoires publics des dépendances", $c::COLOR_LIGHT_CYAN);
$res = $oa->majUnicaenSymLinks($osedir);
if ($res) {
$c->println('Liens mis à jour', $c::COLOR_LIGHT_GREEN);
} else {
$c->println('Liens déjà à jour', $c::COLOR_LIGHT_GREEN);
}
\ No newline at end of file
<?php
$oa->exec('notifier indicateurs');
\ No newline at end of file
<?php
$job = $c->getArg(2);
$oa->exec('UnicaenImport SyncJob ' . $job);
\ No newline at end of file
<?php
$bdd = $oa->getBdd();
$schema = new \BddAdmin\Schema($bdd);
$ref = $schema->loadFromFile($oa->getOseDir().'bdd/ddl.php');
$ddlConfig = [];
// On me met à jour que les objets présents dans le schéma par défaut
foreach( $ref as $ddlClass => $config ){
$ddlConfig[$ddlClass] = ['includes' => array_keys($config)];
}
$ddlConfig = [\BddAdmin\Ddl\DdlSequence::class => $ddlConfig[\BddAdmin\Ddl\DdlSequence::class]];
$scl = new \BddAdmin\SchemaConsoleLogger();
$scl->console = $c;
$schema->setLogger($scl);
$r = $schema->alter($ref, $ddlConfig, false);
//var_dump($r);
<?php
$osedir = $oa->getOseDir();
// Choix de la version
$c->println("Mise à jour de OSE");
$c->println("Assurez-vous bien d'avoir mis OSE en mode maintenance avant de démarrer\n(pressez Entrée pour continuer)...");
$c->getInput();
$c->exec([
"cd $osedir",
"git fetch --all --tags --prune",
], false);
$oldVersion = $oa->currentVersion($osedir);
$c->println("Sélection de la version à déployer", $c::COLOR_LIGHT_CYAN);
$c->println("La version actuellement installée est la " . $oldVersion);
$c->println("Voici la liste des versions de OSE disponibles:");
$tags = $oa->getTags();
foreach ($tags as $tag) {
$c->println($tag);
}
$ok = false;
while (!$ok) {
$c->print("Veuillez choisir une version à déployer: ");
$version = $c->getInput();
if ($oa->tagIsValid($version)) {
$ok = true;
} else {
$c->println("$version n'est pas dans la liste des versions disponibles.");
}
}
// Récupération des sources
$c->println("\nMise à jour des fichiers à partir de GIT", $c::COLOR_LIGHT_CYAN);
$c->passthru([
"cd $osedir",
"git checkout tags/$version",
]);
$oa->writeVersion($osedir, $version);
// Récupération des dépendances
$c->println("\nMise à jour des dépendances à l'aide de Composer", $c::COLOR_LIGHT_CYAN);
$c->passthru([
"cd $osedir",
"php composer.phar self-update",
"php composer.phar install",
]);
// Néttoyage des caches et mise à jour des proxies, lancement du script de migration éventuel
clearCache($c, $oa);
$c->exec([
"cd $osedir",
"php bin/ose migration $oldVersion $version",
]);
// Mise à jour des liens vers les répertoires publics des dépendances
$c->println("\nMise à jour des liens vers les répertoires publics des dépendances", $c::COLOR_LIGHT_CYAN);
$res = $oa->majUnicaenSymLinks($osedir);
$c->println($res ? 'Liens mis à jour' : 'Liens déjà à jour', $c::COLOR_LIGHT_GREEN);
// Conclusion
$c->println("\nFin de la mise à jour des fichiers", $c::COLOR_LIGHT_GREEN);
$c->println("Il reste encore votre base de données à mettre à jour.");
$c->println("N'oubliez pas de sortir du mode maintenance!");
$c->println('');
\ No newline at end of file
<?php
namespace BddAdmin;
use BddAdmin\Exception\BddCompileException;
use BddAdmin\Exception\BddException;
use BddAdmin\Exception\BddIndexExistsException;
class Bdd
{
const FETCH_ALL = 32;
const FETCH_EACH = 16;
const FETCH_ONE = 8;
/**
* @var string
*/
private $host;
/**
* @var integer
*/
private $port;
/**
* @var string
*/
private $dbname;
/**
* @var string
*/
private $username;
/**
* @var string
*/
private $password;
/**
* @var resource
*/
private $connexion;
/**
* @var string
*/
private $currentSchema;
/**
* @var int
*/
private $commitMode = OCI_COMMIT_ON_SUCCESS;
/**
* Bdd constructor.
*
* @param string $host
*/
public function __construct(array $config = [])
{
if (!empty($config)) {
$this->setConfig($config);
$this->connect();
}
}
/**
* @return self
* @throws BddCompileException
* @throws BddException
* @throws BddIndexExistsException
*/
public function connect(): self
{
$cs = $this->getHost() . ':' . $this->getPort() . '/' . $this->getDbname();
$characterSet = 'AL32UTF8';
$this->connexion = oci_pconnect($this->getUsername(), $this->password, $cs, $characterSet);
if (!$this->connexion) {
$error = oci_error();
throw $this->sendException($error);
}
return $this;
}
protected function sendException(array $error)
{
$message = $error['message'];
$offset = $error['offset'];
$sqlText = $error['sqltext'];
$code = $error['code'];
$msg = "$message (offset $offset\n$sqlText\n";
switch ($code) {
case 24344: // erreur de compilation
return new BddCompileException($msg, $code);
case 955:
case 1408:
return new BddIndexExistsException($msg, $code);
default: // par défaut
return new BddException($msg, $code);
}
}
private function execStatement($sql, array $params = [])
{
$statement = oci_parse($this->connexion, $sql);
foreach ($params as $key => $val) {
${$key} = $val;
oci_bind_by_name($statement, ':' . $key, ${$key});
}
if (false === @oci_execute($statement, $this->commitMode)) {
$error = oci_error($statement);
oci_free_statement($statement);
throw $this->sendException($error);
}
return $statement;
}
/**
* @return string
* @throws BddCompileException
* @throws BddException
* @throws BddIndexExistsException
*/
public function getCurrentSchema(): string
{
if (!$this->currentSchema) {
$sql = "SELECT user scname FROM dual";
$this->currentSchema = $this->select($sql)[0]['SCNAME'];
}
return $this->currentSchema;
}
/**
* @return self
*/
public function beginTransaction(): self
{
$this->commitMode = OCI_NO_AUTO_COMMIT;
return $this;
}
/**
* @return $this
* @throws BddCompileException
* @throws BddException
* @throws BddIndexExistsException
*/
public function commitTransaction(): self
{
$this->commitMode = OCI_COMMIT_ON_SUCCESS;
if (!oci_commit($this->connexion)) {
$error = oci_error($this->connexion);
throw $this->sendException($error);
}
return $this;
}
/**
* @return $this
*/
public function rollbackTransaction(): self
{
oci_rollback($this->connexion);
$this->commitMode = OCI_COMMIT_ON_SUCCESS;
return $this;
}
/**
* @param string $sql
* @param array $params
*
* @return bool
* @throws BddCompileException
* @throws BddException
* @throws BddIndexExistsException
*/
public function exec(string $sql, array $params = [])
{
list($s, $p) = $this->prepareQuery($sql, $params);
$statement = $this->execStatement($s, $p);
oci_free_statement($statement);
return true;
}
/**
* @param string $sql
* @param array $params
* @param int $fetchMode
*
* @return resource
* @throws BddCompileException
* @throws BddException
* @throws BddIndexExistsException
*/
public function select(string $sql, array $params = [], $fetchMode = self::FETCH_ALL)
{
list($s, $p) = $this->prepareQuery($sql, $params);
// $begin = microtime(true);
$statement = $this->execStatement($s, $p);
if ($fetchMode == self::FETCH_EACH) {
return $statement;
}
if (false === oci_fetch_all($statement, $res, 0, -1, OCI_FETCHSTATEMENT_BY_ROW)) {
$error = oci_error($statement);
oci_free_statement($statement);
throw $this->sendException($error);
}
oci_free_statement($statement);
if ($fetchMode == self::FETCH_ONE && isset($res[0])) {
return $res[0];
}
// var_dump($sql);
// var_dump( round(microtime(true) - $begin, 3).' secondes' );
return $res;
}
/**
* @param $table
* @param $data
*
* @return bool
*/
public function insert($table, $data, array $params = [])
{
$cols = array_keys($data);
$cols = implode(',', $cols);
$vals = '';
foreach ($data as $col => $val) {
if ($vals != '') $vals .= ',';
$vals .= ":$col";
}
$sql = "INSERT INTO $table ($cols) VALUES ($vals)";
return $this->exec($sql, $data);
}
public function copy(self $source, string $table)
{
}
/**
* @param string $table
* @param array|string|integer $data
*
* @return bool
*/
public function delete(string $table, $data)
{
if (!is_array($data)) {
$data = ['ID' => $data];
}
$sql = "DELETE FROM \"$table\" WHERE ";
$conds = "";
foreach ($data as $col => $val) {
if ($conds != '') {
$conds .= ' AND ';
}