| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 |
- <?php
- /**
- * Classe maj
- *
- * Cette classe gère les mises à jour du système, y compris les opérations SQL, les sauvegardes, et les interactions avec Git.
- */
- class maj
- {
- /**
- * @var string Couleur grise pour les lignes de log.
- */
- private static $colorLineGrey = "#6c757d";
- /**
- * @var string Couleur rouge pour les lignes de log.
- */
- private static $colorLineRed = "red";
- /**
- * @var string Couleur orange pour les lignes de log.
- */
- private static $colorLineOrange = "orange";
- /**
- * Lit le contenu du fichier SQL de mise à jour.
- *
- * @return string Contenu du fichier SQL.
- */
- public static function readFileSQL()
- {
- return file_get_contents(DIR_MAJ . "sql/maj.sql");
- }
- /**
- * Exécute une requête SQL donnée.
- *
- * @param string|null $query La requête SQL à exécuter.
- * @return bool TRUE en cas de succès, FALSE en cas d'échec.
- */
- public static function query(?string $query = NULL)
- {
- if($query != NULL){
- db::query($query);
- try {
- db::execute();
- return TRUE;
- } catch (Exception $ex) {
- maj::print("ERREUR TECHNIQUE SQL : " . $ex, self::$colorLineRed);
- return FALSE;
- }
- }
- }
- /**
- * Compare les hash Git pour vérifier si une mise à jour est nécessaire.
- *
- * @return bool TRUE si les hash correspondent, FALSE sinon.
- */
- public static function compareHash()
- {
- if(git::getCommitHash() == git::getCommitHash(MAJ_TARGET)){
- return TRUE;
- } else {
- return FALSE;
- }
- }
- /**
- * Affiche un message avec une couleur optionnelle.
- *
- * @param string $_string Le message à afficher.
- * @param string|null $_color La couleur du message.
- */
- public static function print(string $_string, ?string $_color = NULL)
- {
- if($_color == NULL){
- echo "<div>" . $_string . "</div>";
- } else {
- echo '<div style="color:' . $_color . '">' . $_string . '</div>';
- }
- }
- /**
- * Affiche un séparateur dans les logs.
- */
- public static function printSeparateur()
- {
- self::print("**********************");
- }
- /**
- * Lance le processus de mise à jour.
- */
- public static function start()
- {
- self::printSeparateur();
- self::print(">> Démarrage de la mise à jour de " . DOMAIN_CMS, self::$colorLineGrey);
- historique::recRef("/parametres.html");
- historique::add(array(
- "idType" => historique::getIdRef("ACTION"),
- "idUser" => session::getId(),
- "idPage" => historique::getIdRef("/parametres.html"),
- "log" => "Lancement de la mise à jour [" . MAJ_TARGET . " - " . git::getCommitHash(MAJ_TARGET) . "]"
- ));
- // Activation du mode maintenance
- self::printSeparateur();
- self::print(">> Mode maintenance activé", self::$colorLineGrey);
- debug::addFile("maintenance");
- // Création d'un backUp
- self::printSeparateur();
- self::print(">> Création du backup", self::$colorLineGrey);
- backup::create();
- file::cleanFilesByOrder(DIR_BACKUP, BACKUP_LIMIT);
- self::printSeparateur();
- self::print(">> Récupération de la branche GIT", self::$colorLineGrey);
- // Git
- $gitReturn = self::bashMaj();
- if($gitReturn == FALSE){
- self::printSeparateur();
- self::print("ERROR : Repo GIT [" . MAJ_TARGET . " - " . git::getCommitHash(MAJ_TARGET) . "]", self::$colorLineRed);
- self::printSeparateur();
- self::print(">> ROLLBACK : Restauration des données", self::$colorLineOrange);
- backup::restore(DIR_BACKUP . backup::last());
- alert::recError("Mise à jour en erreur de [" . MAJ_TARGET . " - " . git::getCommitHash(MAJ_TARGET) . "]");
- historique::recRef("/parametres.html");
- historique::add(array(
- "idType" => historique::getIdRef("ERROR"),
- "idUser" => session::getId(),
- "idPage" => historique::getIdRef("/parametres.html"),
- "log" => "Erreur lors de la mise à jour [" . MAJ_TARGET . " - " . git::getCommitHash(MAJ_TARGET) . "]"
- ));
- } else {
- self::printSeparateur();
- self::print("Mise à jour du repo GIT [" . MAJ_TARGET . " - " . git::getCommitHash(MAJ_TARGET) . "] effectué", self::$colorLineGrey);
- }
- if($gitReturn == TRUE){
- self::printSeparateur();
-
- $sql = maj::readFileSQL();
- $tmpMajSQL = md5($sql);
- if($tmpMajSQL != core::getConfig("LAST_MD5_MYSQL")) {
- if($sql != NULL AND strlen(trim($sql)) != 0){
- $sqlReturn = maj::query($sql);
- if($sqlReturn == FALSE){
- self::print("ERROR : Maj SQL", self::$colorLineRed);
- self::print(">> ROLLBACK : Restauration des données", self::$colorLineOrange);
- backup::restore(DIR_BACKUP . backup::last());
-
- alert::recError("ERROR : Maj SQL");
-
- historique::recRef("/parametres.html");
- historique::add(array(
- "idType" => historique::getIdRef("ERROR"),
- "idUser" => session::getId(),
- "idPage" => historique::getIdRef("/parametres.html"),
- "log" => "ERROR : Maj SQL"
- ));
- } else {
- core::updateConfig("LAST_MD5_MYSQL", $tmpMajSQL);
- self::print("La mise à jour de la base de données s'est correctement réalisée", self::$colorLineGrey);
- }
- } else {
- $sqlReturn = TRUE;
- self::print("Pas de Maj SQL à réaliser", self::$colorLineGrey);
- }
- } else {
- $sqlReturn = TRUE;
- self::print("Le fichier maj.sql a déjà été exécuté et a été ignoré.", self::$colorLineOrange);
- }
- }
- self::printSeparateur();
- self::print(">> Mode maintenance désactivé", self::$colorLineGrey);
- debug::removeFile("maintenance");
- self::printSeparateur();
- self::print(">> Fin de la mise à jour de " . DOMAIN_CMS, self::$colorLineGrey);
- self::printSeparateur();
- if($gitReturn == TRUE AND $sqlReturn == TRUE){
- historique::recRef("/parametres-maj.html");
- historique::add(array(
- "idType" => historique::getIdRef("ACTION"),
- "idUser" => session::getId(),
- "idPage" => historique::getIdRef("/parametres-maj.html"),
- "log" => "Mise à jour [" . MAJ_TARGET . " - " . git::getCommitHash(MAJ_TARGET) . "] terminée"
- ));
- self::print("MAJ EN SUCCES [" . MAJ_TARGET . " - " . git::getCommitHash(MAJ_TARGET) . "]", self::$colorLineGrey);
- self::printSeparateur();
- } else {
- self::print("MAJ EN ERREUR [" . MAJ_TARGET . " - " . git::getCommitHash(MAJ_TARGET) . "]", self::$colorLineRed);
- self::printSeparateur();
- }
- }
- /**
- * Exécute le script Bash pour la mise à jour.
- *
- * @return bool TRUE en cas de succès, FALSE en cas d'échec.
- */
- public static function bashMaj()
- {
- $output = NULL;
- $retval = NULL;
- $bash = DIR_MAJ . MAJ . ".sh";
- $error = 0;
-
- // Affichage du chemin du script
- self::print("Script path: " . $bash, self::$colorLineGrey);
-
- if(is_file($bash)){
- try {
- // Exécution du script avec redirection des erreurs
- exec("bash " . $bash . " 2>&1", $output, $retval);
-
- // Affichage du code de retour
- self::print("Return code: " . $retval, self::$colorLineGrey);
-
- foreach ($output as $value) {
- self::print($value, self::$colorLineGrey);
- if(git::checkError($value) == TRUE){
- $error = 1;
- }
- }
- } catch (\Throwable $th) {
- self::print("ERROR : " . $bash, self::$colorLineRed);
- return FALSE;
- }
- return ($error == 0) ? TRUE : FALSE;
- } else {
- self::print("ERROR : " . $bash . " not found", self::$colorLineRed);
- return FALSE;
- }
- }
- /**
- * Exécute le script Bash pour récupérer l'origine Git.
- *
- * @return bool TRUE en cas de succès, FALSE en cas d'échec.
- */
- public static function bashFetch()
- {
- $output = NULL;
- $retval = NULL;
- $bash = DIR_MAJ . "get-origin.sh";
- $error = 0;
- if(is_file($bash)){
- try {
- // Exécution du script avec redirection des erreurs
- exec("bash " . $bash . " 2>&1", $output, $retval);
- } catch (\Throwable $th) {
- alert::recError("ERROR : " . $bash);
- return FALSE;
- }
- return $error == 0 ? TRUE : FALSE;
- } else {
- alert::recError("ERROR : " . $bash . " not found");
- return FALSE;
- }
- }
- }
|