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