maj.class.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. <?php
  2. /**
  3. * Classe maj
  4. *
  5. * Cette classe gère les mises à jour du système, y compris les opérations SQL, les sauvegardes, et les interactions avec Git.
  6. */
  7. class maj
  8. {
  9. /**
  10. * @var string Couleur grise pour les lignes de log.
  11. */
  12. private static $colorLineGrey = "#6c757d";
  13. /**
  14. * @var string Couleur rouge pour les lignes de log.
  15. */
  16. private static $colorLineRed = "red";
  17. /**
  18. * @var string Couleur orange pour les lignes de log.
  19. */
  20. private static $colorLineOrange = "orange";
  21. /**
  22. * Lit le contenu du fichier SQL de mise à jour.
  23. *
  24. * @return string Contenu du fichier SQL.
  25. */
  26. public static function readFileSQL()
  27. {
  28. return file_get_contents(DIR_MAJ . "sql/maj.sql");
  29. }
  30. /**
  31. * Exécute une requête SQL donnée.
  32. *
  33. * @param string|null $query La requête SQL à exécuter.
  34. * @return bool TRUE en cas de succès, FALSE en cas d'échec.
  35. */
  36. public static function query(?string $query = NULL)
  37. {
  38. if($query != NULL){
  39. db::query($query);
  40. try {
  41. db::execute();
  42. return TRUE;
  43. } catch (Exception $ex) {
  44. maj::print("ERREUR TECHNIQUE SQL : " . $ex, self::$colorLineRed);
  45. return FALSE;
  46. }
  47. }
  48. }
  49. /**
  50. * Compare les hash Git pour vérifier si une mise à jour est nécessaire.
  51. *
  52. * @return bool TRUE si les hash correspondent, FALSE sinon.
  53. */
  54. public static function compareHash()
  55. {
  56. if(git::getCommitHash() == git::getCommitHash(MAJ_TARGET)){
  57. return TRUE;
  58. } else {
  59. return FALSE;
  60. }
  61. }
  62. /**
  63. * Affiche un message avec une couleur optionnelle.
  64. *
  65. * @param string $_string Le message à afficher.
  66. * @param string|null $_color La couleur du message.
  67. */
  68. public static function print(string $_string, ?string $_color = NULL)
  69. {
  70. if($_color == NULL){
  71. echo "<div>" . $_string . "</div>";
  72. } else {
  73. echo '<div style="color:' . $_color . '">' . $_string . '</div>';
  74. }
  75. }
  76. /**
  77. * Affiche un séparateur dans les logs.
  78. */
  79. public static function printSeparateur()
  80. {
  81. self::print("**********************");
  82. }
  83. /**
  84. * Lance le processus de mise à jour.
  85. */
  86. public static function start()
  87. {
  88. self::printSeparateur();
  89. self::print(">> Démarrage de la mise à jour de " . DOMAIN_CMS, self::$colorLineGrey);
  90. historique::recRef("/parametres.html");
  91. historique::add(array(
  92. "idType" => historique::getIdRef("ACTION"),
  93. "idUser" => session::getId(),
  94. "idPage" => historique::getIdRef("/parametres.html"),
  95. "log" => "Lancement de la mise à jour [" . MAJ_TARGET . " - " . git::getCommitHash(MAJ_TARGET) . "]"
  96. ));
  97. // Activation du mode maintenance
  98. self::printSeparateur();
  99. self::print(">> Mode maintenance activé", self::$colorLineGrey);
  100. debug::addFile("maintenance");
  101. // Création d'un backUp
  102. self::printSeparateur();
  103. self::print(">> Création du backup", self::$colorLineGrey);
  104. backup::create();
  105. file::cleanFilesByOrder(DIR_BACKUP, BACKUP_LIMIT);
  106. self::printSeparateur();
  107. self::print(">> Récupération de la branche GIT", self::$colorLineGrey);
  108. // Git
  109. $gitReturn = self::bashMaj();
  110. if($gitReturn == FALSE){
  111. self::printSeparateur();
  112. self::print("ERROR : Repo GIT [" . MAJ_TARGET . " - " . git::getCommitHash(MAJ_TARGET) . "]", self::$colorLineRed);
  113. self::printSeparateur();
  114. self::print(">> ROLLBACK : Restauration des données", self::$colorLineOrange);
  115. backup::restore(DIR_BACKUP . backup::last());
  116. alert::recError("Mise à jour en erreur de [" . MAJ_TARGET . " - " . git::getCommitHash(MAJ_TARGET) . "]");
  117. historique::recRef("/parametres.html");
  118. historique::add(array(
  119. "idType" => historique::getIdRef("ERROR"),
  120. "idUser" => session::getId(),
  121. "idPage" => historique::getIdRef("/parametres.html"),
  122. "log" => "Erreur lors de la mise à jour [" . MAJ_TARGET . " - " . git::getCommitHash(MAJ_TARGET) . "]"
  123. ));
  124. } else {
  125. self::printSeparateur();
  126. self::print("Mise à jour du repo GIT [" . MAJ_TARGET . " - " . git::getCommitHash(MAJ_TARGET) . "] effectué", self::$colorLineGrey);
  127. }
  128. if($gitReturn == TRUE){
  129. self::printSeparateur();
  130. $sql = maj::readFileSQL();
  131. $tmpMajSQL = md5($sql);
  132. if($tmpMajSQL != core::getConfig("LAST_MD5_MYSQL")) {
  133. if($sql != NULL AND strlen(trim($sql)) != 0){
  134. $sqlReturn = maj::query($sql);
  135. if($sqlReturn == FALSE){
  136. self::print("ERROR : Maj SQL", self::$colorLineRed);
  137. self::print(">> ROLLBACK : Restauration des données", self::$colorLineOrange);
  138. backup::restore(DIR_BACKUP . backup::last());
  139. alert::recError("ERROR : Maj SQL");
  140. historique::recRef("/parametres.html");
  141. historique::add(array(
  142. "idType" => historique::getIdRef("ERROR"),
  143. "idUser" => session::getId(),
  144. "idPage" => historique::getIdRef("/parametres.html"),
  145. "log" => "ERROR : Maj SQL"
  146. ));
  147. } else {
  148. core::updateConfig("LAST_MD5_MYSQL", $tmpMajSQL);
  149. self::print("La mise à jour de la base de données s'est correctement réalisée", self::$colorLineGrey);
  150. }
  151. } else {
  152. $sqlReturn = TRUE;
  153. self::print("Pas de Maj SQL à réaliser", self::$colorLineGrey);
  154. }
  155. } else {
  156. $sqlReturn = TRUE;
  157. self::print("Le fichier maj.sql a déjà été exécuté et a été ignoré.", self::$colorLineOrange);
  158. }
  159. }
  160. self::printSeparateur();
  161. self::print(">> Mode maintenance désactivé", self::$colorLineGrey);
  162. debug::removeFile("maintenance");
  163. self::printSeparateur();
  164. self::print(">> Fin de la mise à jour de " . DOMAIN_CMS, self::$colorLineGrey);
  165. self::printSeparateur();
  166. if($gitReturn == TRUE AND $sqlReturn == TRUE){
  167. historique::recRef("/parametres-maj.html");
  168. historique::add(array(
  169. "idType" => historique::getIdRef("ACTION"),
  170. "idUser" => session::getId(),
  171. "idPage" => historique::getIdRef("/parametres-maj.html"),
  172. "log" => "Mise à jour [" . MAJ_TARGET . " - " . git::getCommitHash(MAJ_TARGET) . "] terminée"
  173. ));
  174. self::print("MAJ EN SUCCES [" . MAJ_TARGET . " - " . git::getCommitHash(MAJ_TARGET) . "]", self::$colorLineGrey);
  175. self::printSeparateur();
  176. } else {
  177. self::print("MAJ EN ERREUR [" . MAJ_TARGET . " - " . git::getCommitHash(MAJ_TARGET) . "]", self::$colorLineRed);
  178. self::printSeparateur();
  179. }
  180. }
  181. /**
  182. * Exécute le script Bash pour la mise à jour.
  183. *
  184. * @return bool TRUE en cas de succès, FALSE en cas d'échec.
  185. */
  186. public static function bashMaj()
  187. {
  188. $output = NULL;
  189. $retval = NULL;
  190. $bash = DIR_MAJ . MAJ . ".sh";
  191. $error = 0;
  192. // Affichage du chemin du script
  193. self::print("Script path: " . $bash, self::$colorLineGrey);
  194. if(is_file($bash)){
  195. try {
  196. // Exécution du script avec redirection des erreurs
  197. exec("bash " . $bash . " 2>&1", $output, $retval);
  198. // Affichage du code de retour
  199. self::print("Return code: " . $retval, self::$colorLineGrey);
  200. foreach ($output as $value) {
  201. self::print($value, self::$colorLineGrey);
  202. if(git::checkError($value) == TRUE){
  203. $error = 1;
  204. }
  205. }
  206. } catch (\Throwable $th) {
  207. self::print("ERROR : " . $bash, self::$colorLineRed);
  208. return FALSE;
  209. }
  210. return ($error == 0) ? TRUE : FALSE;
  211. } else {
  212. self::print("ERROR : " . $bash . " not found", self::$colorLineRed);
  213. return FALSE;
  214. }
  215. }
  216. /**
  217. * Exécute le script Bash pour récupérer l'origine Git.
  218. *
  219. * @return bool TRUE en cas de succès, FALSE en cas d'échec.
  220. */
  221. public static function bashFetch()
  222. {
  223. $output = NULL;
  224. $retval = NULL;
  225. $bash = DIR_MAJ . "get-origin.sh";
  226. $error = 0;
  227. if(is_file($bash)){
  228. try {
  229. // Exécution du script avec redirection des erreurs
  230. exec("bash " . $bash . " 2>&1", $output, $retval);
  231. } catch (\Throwable $th) {
  232. alert::recError("ERROR : " . $bash);
  233. return FALSE;
  234. }
  235. return $error == 0 ? TRUE : FALSE;
  236. } else {
  237. alert::recError("ERROR : " . $bash . " not found");
  238. return FALSE;
  239. }
  240. }
  241. }