From f85e6c0113b4f5f0617d24d459ebf18c46f338eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurent=20L=C3=A9cluse?= <laurent.lecluse@unicaen.fr> Date: Tue, 28 Jan 2020 15:05:27 +0100 Subject: [PATCH] =?UTF-8?q?Passage=20de=20param=C3=A8tres=20possibles=20po?= =?UTF-8?q?ur=20toutes=20les=20=C3=A9tapes=20d'install=20ou=20de=20MAJ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 6 ++- admin/actions/help.php | 8 ++- admin/actions/install-bdd.php | 30 +++++------ admin/actions/install.php | 21 ++++---- admin/actions/test.php | 6 +-- admin/actions/update.php | 39 +++++++++------ admin/src/OseAdmin.php | 61 +++++++++++++++++++---- bin/install | 93 +++++++++++++++++++++++------------ 8 files changed, 176 insertions(+), 88 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a2b0c92a3..270efa2a8f 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,10 @@ * les formules des établissements concernés ont été modifiées pour tenir compte de cette nouveauté. * les heures de décharge ne sont plus gérées en tant que telles, mais impactent le paramètre "Dépassement de service dû sans HC" * il est maintenant possible de personnaliser les structures gérées dans l'interface de test. -* Possibilité de saisir le taux de charges patronales directement dans l'IHM d'administration des statuts des intervenants -* Lorsqu'on utilise la commande ./bin/ose creer-utilisateur et que l'on demande à créer un intervenant, la feuille de route s'initialisera dans la foulée +* Possibilité de saisir le taux de charges patronales directement dans l'IHM d'administration des statuts des intervenants. +* Lorsqu'on utilise la commande ./bin/ose creer-utilisateur et que l'on demande à créer un intervenant, la feuille de route s'initialisera dans la foulée. +* Possibilité de définir des paramètres (version, etc.) avant les mises à jour de l'application afin de pouvoir automatiser à 100% les processue d'installation et de mise à jour. +* Possibilité de mettre à jour OSE vers une branche et plus uniquement vers un TAG de version (utile pour les développeurs ou en test) ## Correction de bugs diff --git a/admin/actions/help.php b/admin/actions/help.php index dda32ce2e0..dac620638e 100644 --- a/admin/actions/help.php +++ b/admin/actions/help.php @@ -1,7 +1,10 @@ <?php $actions = [ - "update" => "Mise à jour de l'application", + "update" => "Mise à jour de l'application" + . "\n\t--maintenance=no : pas de prompt pour être averti du mode maintenance" + . "\n\t--version=<version cible> : Met à jour directement vers la version indiquée" + , "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", @@ -12,6 +15,9 @@ $actions = [ "maj-public-links" => "Mise à jour des liens vers les répertoires publics des dépendances", "clear-cache" => "Vidage du cache de l'application", "test-bdd" => "Test d'accès à la base de données", + "install-bdd" => "Installe la base de données" + . "\n\t--oseappli-pwd=<votre mdp> : mot de passe de l'utilisateur oseappli" + , "update-bdd" => "Mise à jour de la base de données de l'application (sans les fichiers)", ]; $actionsDev = [ diff --git a/admin/actions/install-bdd.php b/admin/actions/install-bdd.php index a9bfe870fd..d568e333bc 100644 --- a/admin/actions/install-bdd.php +++ b/admin/actions/install-bdd.php @@ -4,14 +4,13 @@ $c->println("\nInstallation de la base de données", $c::COLOR_LIGHT_CYAN); if (!$oa->bddIsOk($msg)) { $c->printDie("Impossible d'accéder à la base de données : $msg!" - ."\nVeuillez contrôler les paramètres de configurations entrés dans le fichier confg.local.php s'il vous plaît, avant de refaire une tentative d'installation de la base de données."); + . "\nVeuillez contrôler les paramètres de configurations entrés dans le fichier confg.local.php s'il vous plaît, avant de refaire une tentative d'installation de la base de données."); } $bdd = $oa->getBdd(); $schema = new \BddAdmin\Schema($bdd); - /* Mise en place du schéma de la BDD */ $c->println("\n" . 'Création des définitions de la base de données', $c::COLOR_LIGHT_PURPLE); @@ -23,7 +22,6 @@ $schema->setLogger($scl); $schema->create($ref, true); - /* Insertion des données */ $c->println("\n" . 'Insertion des données', $c::COLOR_LIGHT_PURPLE); $dataGen = new DataGen($oa); @@ -33,20 +31,23 @@ $c->println("\n" . 'Mise à jour du point d\'indice pour les HETD', $c::COLOR_LI $bdd->exec('BEGIN OSE_FORMULE.UPDATE_ANNEE_TAUX_HETD; END;'); - /* Définition d'un mdp pour oseappli */ -$c->println("\n" . 'Choix d\'un mot de passe pour l\'utilisateur système oseappli', $c::COLOR_LIGHT_CYAN); -$c->println("Veuillez 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!'); +if ($c->hasOption('oseappli-pwd')) { + $pwd1 = $c->getOption('oseappli-pwd'); +} else { + $c->println("\n" . 'Choix d\'un mot de passe pour l\'utilisateur système oseappli', $c::COLOR_LIGHT_CYAN); + $c->println("Veuillez 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 ...'); +$c->println('Application du de mot de pase de oseappli...'); $oa->exec("changement-mot-de-passe --utilisateur=oseappli --mot-de-passe=$pwd1"); $c->println('Mot de passe changé', $c::COLOR_LIGHT_GREEN); @@ -54,6 +55,5 @@ $c->println('Mot de passe changé', $c::COLOR_LIGHT_GREEN); $c->println('Vous pourrez vous connecteur à OSE avec le login "oseappli" et votre nouveau mot de passe.'); - /* Terminé!! */ $c->println('L\'installation de la base de données est maintenant terminée!', $c::COLOR_LIGHT_GREEN); \ No newline at end of file diff --git a/admin/actions/install.php b/admin/actions/install.php index fa42a13b9c..1de54681bf 100644 --- a/admin/actions/install.php +++ b/admin/actions/install.php @@ -14,24 +14,23 @@ if (!$fromMaster) { 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."); - } + $c->print("Veuillez choisir une version à déployer: "); + $version = $c->getInput(); + if (!($oa->tagIsValid($version) || $oa->brancheIsValid($version))) { + $c->printDie("$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); + $tbr = $oa->tagIsValid($version) ? 'tags/' : ''; $c->exec([ "cd $osedir", - "git checkout tags/$version", + "git checkout $tbr$version", "mkdir cache", "chmod 777 cache", + "mkdir log", + "chmod 777 log", "chmod +7 bin/ose", ]); $oa->writeVersion($version); @@ -40,6 +39,8 @@ if (!$fromMaster) { "cd $osedir", "mkdir cache", "chmod 777 cache", + "mkdir log", + "chmod 777 log", "chmod +7 bin/ose", ]); } diff --git a/admin/actions/test.php b/admin/actions/test.php index f199b74586..ad980963a8 100644 --- a/admin/actions/test.php +++ b/admin/actions/test.php @@ -1,7 +1,5 @@ <?php -$bdd = new \BddAdmin\Bdd(Config::get('bdds', 'dev-local')); -$schema = new \BddAdmin\Schema($bdd); +//$bdd = new \BddAdmin\Bdd(Config::get('bdds', 'dev-local')); +//$schema = new \BddAdmin\Schema($bdd); - -$oa->migration(AbstractMigration::CONTEXTE_POST, 'DepartementsInitCodes'); \ No newline at end of file diff --git a/admin/actions/update.php b/admin/actions/update.php index 6dbe9229a6..e45dbc4beb 100644 --- a/admin/actions/update.php +++ b/admin/actions/update.php @@ -2,8 +2,10 @@ // 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(); +if ($c->getOption('maintenance') != 'no') { + $c->println("Assurez-vous bien d'avoir mis OSE en mode maintenance avant de démarrer\n(pressez Entrée pour continuer)..."); + $c->getInput(); +} if (!$oa->bddIsOk($msg)) { $c->printDie('La mise à jour ne peut pas se poursuivre : la base de données est inaccessible : ' . "\n" . $msg); @@ -16,28 +18,30 @@ $c->exec([ "git fetch --all --tags --prune", ], false); -$c->println("Sélection de la version à déployer", $c::COLOR_LIGHT_CYAN); -$c->println("La version actuellement installée est la " . $oa->oldVersion); -$c->println("Voici la liste des versions de OSE disponibles:"); -$tags = $oa->getTags(); -foreach ($tags as $tag) { - $c->println($tag); -} - +if (!$c->hasOption('version')) { + $c->println("Sélection de la version à déployer", $c::COLOR_LIGHT_CYAN); + $c->println("La version actuellement installée est la " . $oa->oldVersion); + $c->println("Voici la liste des versions de OSE disponibles:"); + $tags = $oa->getTags(); + foreach ($tags as $tag) { + $c->println($tag); + } -// Choix de la version -$c->print("Veuillez choisir une version à déployer: "); -$version = $c->getInput(); -if (!$oa->tagIsValid($version)) { + // Choix de la version + $c->print("Veuillez choisir une version à déployer: "); +} +$version = $c->getInput('version'); +if (!($oa->tagIsValid($version) || $oa->brancheIsValid($version))) { $c->printDie("$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); +$tbr = $oa->tagIsValid($version) ? 'tags/' : ''; $c->passthru([ "cd $osedir", - "git checkout tags/$version", + "git checkout $tbr$version", ]); @@ -59,5 +63,8 @@ $c->println("\nMise à jour des fichiers OK : la version installée est désorma // Mise à jour de la base de données à partir d'un nouveau processus $oa->run('update-bdd', true); -$c->println("\nFin de la mise à jour. N'oubliez pas de sortir du mode maintenance!"); +$c->println("\nFin de la mise à jour."); +if ($c->getOption('maintenance') != 'no') { + $c->println("N'oubliez pas de sortir du mode maintenance!"); +} $c->println(''); \ No newline at end of file diff --git a/admin/src/OseAdmin.php b/admin/src/OseAdmin.php index a2d1979aec..872d7a8199 100644 --- a/admin/src/OseAdmin.php +++ b/admin/src/OseAdmin.php @@ -7,7 +7,7 @@ class OseAdmin { const OSE_ORIGIN = 'https://git.unicaen.fr/open-source/OSE'; - const MIN_VERSION = 8; // version minimum installable + const MIN_VERSION = 10; // version minimum installable /** * @var Console @@ -24,6 +24,11 @@ class OseAdmin */ private $tags = false; + /** + * @var array + */ + private $branches = false; + /** * @var int */ @@ -77,9 +82,7 @@ class OseAdmin public function gitlabIsReachable(): bool { - $gitCheck = $this->console->exec("git ls-remote --heads " . self::OSE_ORIGIN, false); - - return (false !== strpos(implode(' ', $gitCheck), 'heads/master')); + return $this->brancheIsValid('master'); } @@ -93,14 +96,42 @@ class OseAdmin foreach ($ts as $tag) { $this->tags[] = substr($tag, strpos($tag, 'refs/tags/') + 10); } + + usort($this->tags, function ($a, $b) { + $va = (int)substr($a, 0, strpos($a, '.')); + $vb = (int)substr($b, 0, strpos($b, '.')); + + if ($va == $vb) return $a > $b; + + return $va > $vb; + }); } - foreach ($this->tags as $i => $tag) { + $tags = $this->tags; + foreach ($tags as $i => $tag) { $version = (int)substr($tag, 0, strpos($tag, '.')); - if ($version < $minVersion) unset($this->tags[$i]); + if ($version < $minVersion) unset($tags[$i]); + } + + return $tags; + } + + + + public function getBranches(): array + { + if (false === $this->branches) { + $this->branches = []; + + $bs = $this->console->exec("git ls-remote --heads --refs " . self::OSE_ORIGIN, false); + foreach ($bs as $branche) { + $this->branches[] = substr($branche, strpos($branche, 'refs/heads/') + 11); + } + + sort($this->branches); } - return $this->tags; + return $this->branches; } @@ -117,6 +148,18 @@ class OseAdmin + /** + * @param string $tag + * + * @return bool + */ + public function brancheIsValid(string $branche): bool + { + return in_array($branche, $this->getBranches()); + } + + + public function currentVersion(): string { $vf = $this->getOseDir() . 'VERSION'; @@ -229,7 +272,7 @@ class OseAdmin public function getOseAppliId(): int { if (!$this->oseAppliId) { - $u = $this->getBdd()->select("SELECT id FROM UTILISATEUR WHERE USERNAME='oseappli'"); + $u = $this->getBdd()->select("SELECT ID FROM UTILISATEUR WHERE USERNAME='oseappli'"); if (isset($u[0]['ID'])) { $this->oseAppliId = (int)$u[0]['ID']; } else { @@ -245,7 +288,7 @@ class OseAdmin public function getSourceOseId(): int { if (!$this->sourceOseId) { - $src = $this->getBdd()->select("SELECT id FROM SOURCE WHERE CODE='OSE'"); + $src = $this->getBdd()->select("SELECT ID FROM SOURCE WHERE CODE='OSE'"); if (isset($src[0]['ID'])) { $this->sourceOseId = (int)$src[0]['ID']; } else { diff --git a/bin/install b/bin/install index 4b9ad9ae3f..e5d81cbab4 100644 --- a/bin/install +++ b/bin/install @@ -24,7 +24,7 @@ if (!$od->checkPhpModules([ 'json' => 'Json', 'ldap' => 'Ldap', 'mbstring' => 'MbString', - // 'mcrypt' => 'MCrypt', + // 'mcrypt' => 'MCrypt', 'Zend OPcache' => 'Zend OPcache', 'xml' => 'XML', 'zip' => 'ZIP', @@ -69,23 +69,19 @@ $tags = $od->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 ($od->tagIsValid($version)) { - $ok = true; - } else { - $c->println("$version n'est pas dans la liste des versions disponibles."); - } +$c->print("Veuillez choisir une version à déployer: "); +$version = $c->getInput(); +if (!($od->tagIsValid($version) || $od->brancheIsValid($version))) { + $c->printDie("$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); +$tbr = $od->tagIsValid($version) ? 'tags/' : ''; $c->exec([ "cd $osedir", - "git checkout tags/$version", + "git checkout $tbr$version", "mkdir cache", "mkdir cache/Doctrine", "chmod 777 cache/Doctrine", @@ -145,21 +141,13 @@ $c->exec([ // Conclusion $c->println("\nFin du script d'installation des fichiers", $c::COLOR_LIGHT_GREEN); $c->println("Il reste encore plusieurs étapes à réaliser pour que OSE soit pleinement fonctionnel :"); -$c->println(" 1 - Configurez votre serveur Apache"); -$c->println(" 2 - Initialisez la base de données de OSE à l'aide du script prévu à cet effet"); -$c->println(" 3 - Mettez en place la configuration locale de l'application, si ce n'est déjà le cas"); -$c->println(" 4 - Une fois bien connecté, configurez vos connecteurs en vous appuyant\n le cas échéant sur ceux qui vous sont fournis"); -$c->println(" 5 - Mettez en place les tâches CRON nécessaires (envoi de mails pour les indicateurs, Synchronisation automatique, etc."); -$c->println(" 6 - Paramétrez l'application pour l'adapter à vos besoins"); +$c->println(" 1 - Configurez votre serveur Apache si ce n'est déjà fait"); +$c->println(" 2 - Veuillez personnaliser le fichier de configuration de OSE config.local.php, si ce n'est déjà le cas"); +$c->println(" 3 - La base de données devra au besoin être initialisée à l'aide de la commande ./bin/ose install-bdd. Si votre base était déjà initialisée, alors la commande ./bin/ose update-bdd sera privilégiée"); +$c->println(" 4 - Mettez en place les tâches CRON nécessaires (envoi de mails pour les indicateurs, Synchronisation automatique, etc."); $c->println(''); $c->println("Pour la suite, merci de vous reporter au guide de l'administrateur pour vous aider à configurer l'application"); $c->println(''); -/* -$c->println(" 1 - Configurez le cas échéant votre serveur Apache"); -$c->println(" 2 - Veuillez personnaliser le fichier de configuration de OSE config.local.php, si ce n'est déjà le cas"); -$c->println(" 3 - La base de données devra au besoin être initialisée à l'aide de la commande ./bin/ose install-bdd"); -$c->println(" 4 - Mettez en place les tâches CRON nécessaires (envoi de mails pour les indicateurs, Synchronisation automatique, etc."); -*/ /************************************************************ @@ -168,6 +156,7 @@ $c->println(" 4 - Mettez en place les tâches CRON nécessaires (envoi de mails class OseDeploy { const OSE_ORIGIN = 'https://git.unicaen.fr/open-source/OSE'; + const MIN_VERSION = 10; // version minimum installable /** * @var Console @@ -179,6 +168,11 @@ class OseDeploy */ private $tags = false; + /** + * @var array + */ + private $branches = false; + /** @@ -267,14 +261,12 @@ class OseDeploy public function gitlabIsReachable(): bool { - exec("git ls-remote --heads " . self::OSE_ORIGIN, $gitCheck ); - - return (false !== strpos(implode(' ', $gitCheck), 'heads/master')); + return $this->brancheIsValid('master'); } - public function getTags(): array + public function getTags($minVersion = self::MIN_VERSION): array { if (false === $this->tags) { $this->tags = []; @@ -283,15 +275,42 @@ class OseDeploy foreach ($ts as $tag) { $this->tags[] = substr($tag, strpos($tag, 'refs/tags/') + 10); } + + usort($this->tags, function ($a, $b) { + $va = (int)substr($a, 0, strpos($a, '.')); + $vb = (int)substr($b, 0, strpos($b, '.')); + + if ($va == $vb) return $a > $b; + + return $va > $vb; + }); } - $minVersion = 8; - foreach ($this->tags as $i => $tag) { + $tags = $this->tags; + foreach ($tags as $i => $tag) { $version = (int)substr($tag, 0, strpos($tag, '.')); - if ($version < $minVersion) unset($this->tags[$i]); + if ($version < $minVersion) unset($tags[$i]); } - return $this->tags; + return $tags; + } + + + + public function getBranches(): array + { + if (false === $this->branches) { + $this->branches = []; + + $bs = $this->console->exec("git ls-remote --heads --refs " . self::OSE_ORIGIN, false); + foreach ($bs as $branche) { + $this->branches[] = substr($branche, strpos($branche, 'refs/heads/') + 11); + } + + sort($this->branches); + } + + return $this->branches; } @@ -308,6 +327,18 @@ class OseDeploy + /** + * @param string $tag + * + * @return bool + */ + public function brancheIsValid(string $branche): bool + { + return in_array($branche, $this->getBranches()); + } + + + public function currentVersion(string $osedir): string { $vf = $this->getVersionFile($osedir); -- GitLab