diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/controller/MaintenanceController.php | 2 | ||||
| -rw-r--r-- | src/controller/ViewDirector.php (renamed from src/controller/ViewController.php) | 7 | ||||
| -rw-r--r-- | src/service/Backup.php | 22 | ||||
| -rw-r--r-- | src/service/Installation.php | 54 | ||||
| -rw-r--r-- | src/service/router.php | 2 | ||||
| -rw-r--r-- | src/view/MaintenanceBuilder.php | 7 | ||||
| -rw-r--r-- | src/view/templates/maintenance.php | 20 |
7 files changed, 91 insertions, 23 deletions
diff --git a/src/controller/MaintenanceController.php b/src/controller/MaintenanceController.php index fca45f1..c60ca1c 100644 --- a/src/controller/MaintenanceController.php +++ b/src/controller/MaintenanceController.php | |||
| @@ -52,7 +52,7 @@ class MaintenanceController | |||
| 52 | static public function getLastDump(EntityManager $entityManager): void | 52 | static public function getLastDump(EntityManager $entityManager): void |
| 53 | { | 53 | { |
| 54 | try{ | 54 | try{ |
| 55 | $file_path = Backup::mySQLdump($entityManager); | 55 | $file_path = Backup::getLastBackupName(); |
| 56 | header('Content-Type: application/octet-stream'); // signifie fichier quelconque, du binaire quoi! | 56 | header('Content-Type: application/octet-stream'); // signifie fichier quelconque, du binaire quoi! |
| 57 | header('Content-Disposition: attachment; filename="' . basename($file_path) . '"'); // pour provoquer un téléchargement et non pour afficher | 57 | header('Content-Disposition: attachment; filename="' . basename($file_path) . '"'); // pour provoquer un téléchargement et non pour afficher |
| 58 | header('Content-Length: ' . filesize($file_path)); // peut servir côté client (barre de progression...) | 58 | header('Content-Length: ' . filesize($file_path)); // peut servir côté client (barre de progression...) |
diff --git a/src/controller/ViewController.php b/src/controller/ViewDirector.php index cf3477c..6883b73 100644 --- a/src/controller/ViewController.php +++ b/src/controller/ViewDirector.php | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | <?php | 1 | <?php |
| 2 | // src/view/ViewController.php | 2 | // src/view/ViewDirector.php |
| 3 | // | 3 | // |
| 4 | // génère le HTML avec des Builder | 4 | // génère le HTML avec des Builder |
| 5 | 5 | ||
| @@ -10,7 +10,7 @@ use Doctrine\ORM\EntityManager; | |||
| 10 | use Symfony\Component\HttpFoundation\Request; | 10 | use Symfony\Component\HttpFoundation\Request; |
| 11 | use Symfony\Component\HttpFoundation\Response; | 11 | use Symfony\Component\HttpFoundation\Response; |
| 12 | 12 | ||
| 13 | class ViewController extends AbstractBuilder // ViewController est aussi le premier Builder | 13 | class ViewDirector extends AbstractBuilder // ViewDirector est aussi le premier Builder |
| 14 | { | 14 | { |
| 15 | static public Node $root_node; | 15 | static public Node $root_node; |
| 16 | 16 | ||
| @@ -61,6 +61,9 @@ class ViewController extends AbstractBuilder // ViewController est aussi le prem | |||
| 61 | if(CURRENT_PAGE === 'article' && !IS_ADMIN && self::$root_node->getNodeByName('main')->getAdoptedChild() === null){ | 61 | if(CURRENT_PAGE === 'article' && !IS_ADMIN && self::$root_node->getNodeByName('main')->getAdoptedChild() === null){ |
| 62 | return new Response($this->html, 302); | 62 | return new Response($this->html, 302); |
| 63 | } | 63 | } |
| 64 | elseif(CURRENT_PAGE === 'maintenance'){ | ||
| 65 | Backup::mySQLdump($entityManager); // créer un nouveau backup | ||
| 66 | } | ||
| 64 | 67 | ||
| 65 | 68 | ||
| 66 | /* 4/ construction de la page avec builders et vues */ | 69 | /* 4/ construction de la page avec builders et vues */ |
diff --git a/src/service/Backup.php b/src/service/Backup.php index d628c27..313d1f6 100644 --- a/src/service/Backup.php +++ b/src/service/Backup.php | |||
| @@ -37,7 +37,12 @@ class Backup | |||
| 37 | ]); | 37 | ]); |
| 38 | 38 | ||
| 39 | try{ | 39 | try{ |
| 40 | // unlink et chmod permettent que le serveur et l'utilisateur appelant bin/mysqldump.php réussissent | ||
| 41 | if(file_exists($file_path)){ | ||
| 42 | unlink($file_path); | ||
| 43 | } | ||
| 40 | $command->mustRun(); // comme run() mais lance une ProcessFailedException | 44 | $command->mustRun(); // comme run() mais lance une ProcessFailedException |
| 45 | chmod($file_path, 0666); | ||
| 41 | return $file_path; | 46 | return $file_path; |
| 42 | } | 47 | } |
| 43 | finally{ | 48 | finally{ |
| @@ -59,6 +64,23 @@ class Backup | |||
| 59 | }*/ | 64 | }*/ |
| 60 | } | 65 | } |
| 61 | 66 | ||
| 67 | static public function getBackupList(): array | ||
| 68 | { | ||
| 69 | $backup_array = []; | ||
| 70 | foreach(scandir(Backup::$backup_dir) as $file){ | ||
| 71 | if($file[0] === '.'){ | ||
| 72 | continue; | ||
| 73 | } | ||
| 74 | $backup_array[] = $file; | ||
| 75 | } | ||
| 76 | return $backup_array; | ||
| 77 | } | ||
| 78 | static public function getLastBackupName(): string | ||
| 79 | { | ||
| 80 | $backup_list = self::getBackupList(); | ||
| 81 | return $backup_list[count($backup_list) - 1]; | ||
| 82 | } | ||
| 83 | |||
| 62 | static public function cleanBackups(): void { | 84 | static public function cleanBackups(): void { |
| 63 | $files = glob(self::$backup_dir . '/*.sql'); | 85 | $files = glob(self::$backup_dir . '/*.sql'); |
| 64 | usort($files, fn($a, $b) => filemtime($b) <=> filemtime($a)); // filemtime = date de dernière modification | 86 | usort($files, fn($a, $b) => filemtime($b) <=> filemtime($a)); // filemtime = date de dernière modification |
diff --git a/src/service/Installation.php b/src/service/Installation.php index eb4b6db..995ed4a 100644 --- a/src/service/Installation.php +++ b/src/service/Installation.php | |||
| @@ -12,10 +12,14 @@ class Installation | |||
| 12 | // ajouter plus tard zlib pour la compression des backups | 12 | // ajouter plus tard zlib pour la compression des backups |
| 13 | foreach($extensions as $extension){ | 13 | foreach($extensions as $extension){ |
| 14 | if(!extension_loaded($extension)){ | 14 | if(!extension_loaded($extension)){ |
| 15 | echo("<p>l'extension <b>" . $extension . '</b> est manquante</p>'); | 15 | echo("<p>l'extension <b>" . $extension . "</b> est manquante.</p>"); |
| 16 | $flag = true; | 16 | $flag = true; |
| 17 | } | 17 | } |
| 18 | } | 18 | } |
| 19 | if(!class_exists(DOMDocument::class)){ // théoriquement plus fiable que extension_loaded() | ||
| 20 | echo("<p>l'extension <b>dom</b> est manquante.</p>"); | ||
| 21 | $flag = true; | ||
| 22 | } | ||
| 19 | 23 | ||
| 20 | /*if(!extension_loaded('imagick') && !extension_loaded('gd')){ | 24 | /*if(!extension_loaded('imagick') && !extension_loaded('gd')){ |
| 21 | echo("<p>il manque une de ces extensions au choix pour le traitement des images: <b>imagick</b> (de préférence) ou <b>gd</b>.</p>"); | 25 | echo("<p>il manque une de ces extensions au choix pour le traitement des images: <b>imagick</b> (de préférence) ou <b>gd</b>.</p>"); |
| @@ -33,27 +37,40 @@ class Installation | |||
| 33 | static public function checkFilesAndFoldersRights(): void | 37 | static public function checkFilesAndFoldersRights(): void |
| 34 | { | 38 | { |
| 35 | // -- droits des fichiers et dossiers -- | 39 | // -- droits des fichiers et dossiers -- |
| 36 | $droits_dossiers = 0755; | 40 | $droits_dossiers = 0777; |
| 37 | $droits_fichiers = 0644; | ||
| 38 | 41 | ||
| 42 | $flag = false; | ||
| 39 | if(!file_exists('user_data')){ | 43 | if(!file_exists('user_data')){ |
| 40 | // créer le dossier user_data | 44 | try{ |
| 41 | mkdir('user_data/'); | 45 | mkdir('user_data/'); |
| 42 | chmod('user_data/', $droits_dossiers); | 46 | chmod('user_data/', $droits_dossiers); |
| 43 | echo '<p style="color: red;">Le dossier public/user_data introuvable et le serveur n\'a pas la permission de le créer.<br> | 47 | } |
| 44 | Pour faire ça bien:<br>sudo -u "serveur web" mkdir /chemin/du/site/public/user_data</p> | 48 | catch(Exception $e){ |
| 45 | <p>Aide: "serveur web" se nomme "www-data" sur debian et ubuntu, il s\'appelera "http" sur d\'autres distributions.</p>'; | 49 | echo '<p style="color: red;">Le dossier public/user_data introuvable et le serveur n\'a pas la permission de le créer.<br> |
| 46 | die; | 50 | Pour faire ça bien:<br>sudo -u "serveur web" mkdir /chemin/du/site/public/user_data</p>'; |
| 51 | echo $e; | ||
| 52 | $flag = true; | ||
| 53 | } | ||
| 47 | } | 54 | } |
| 48 | if(!file_exists('../var')){ | 55 | if(!file_exists('../var')){ |
| 49 | mkdir('../var'); | 56 | try{ |
| 50 | chmod('../var', $droits_dossiers); | 57 | mkdir('../var'); |
| 51 | // | 58 | chmod('../var', $droits_dossiers); |
| 59 | } | ||
| 60 | catch(Exception $e){ | ||
| 61 | echo $e; | ||
| 62 | $flag = true; | ||
| 63 | } | ||
| 52 | } | 64 | } |
| 53 | if(!file_exists('../var/backups')){ | 65 | if(!file_exists('../var/backups')){ |
| 54 | mkdir('../var/backups'); | 66 | try{ |
| 55 | chmod('../var/backups', $droits_dossiers); | 67 | mkdir('../var/backups'); |
| 56 | // | 68 | chmod('../var/backups', $droits_dossiers); // autoriser à la fois le serveur et les scripts dans bin/ |
| 69 | } | ||
| 70 | catch(Exception $e){ | ||
| 71 | echo $e; | ||
| 72 | $flag = true; | ||
| 73 | } | ||
| 57 | } | 74 | } |
| 58 | 75 | ||
| 59 | // droits 600 pour celui-ci | 76 | // droits 600 pour celui-ci |
| @@ -63,7 +80,7 @@ class Installation | |||
| 63 | echo '<p>Il doit obligatoirement contenir les codes de la base de données, le protocole http ou https (et éventuellement le port) utilisé pour créer les liens internes.<br> | 80 | echo '<p>Il doit obligatoirement contenir les codes de la base de données, le protocole http ou https (et éventuellement le port) utilisé pour créer les liens internes.<br> |
| 64 | Un modèle est disponible, il s\'agit du fichier config/config-template.ini</p> | 81 | Un modèle est disponible, il s\'agit du fichier config/config-template.ini</p> |
| 65 | <p>Ce fichier a une importance critique. Si vous le pouvez faites en sorte que le serveur en soit le propriétaire et donner lui des droits 600.</p>'; | 82 | <p>Ce fichier a une importance critique. Si vous le pouvez faites en sorte que le serveur en soit le propriétaire et donner lui des droits 600.</p>'; |
| 66 | die; | 83 | $flag = true; |
| 67 | } | 84 | } |
| 68 | /*else{ | 85 | /*else{ |
| 69 | // propriétaire du fichier | 86 | // propriétaire du fichier |
| @@ -78,6 +95,9 @@ class Installation | |||
| 78 | } | 95 | } |
| 79 | } | 96 | } |
| 80 | }*/ | 97 | }*/ |
| 98 | if($flag){ | ||
| 99 | die; | ||
| 100 | } | ||
| 81 | 101 | ||
| 82 | // tester les liens internes | 102 | // tester les liens internes |
| 83 | // | 103 | // |
diff --git a/src/service/router.php b/src/service/router.php index 6973656..98f8fd6 100644 --- a/src/service/router.php +++ b/src/service/router.php | |||
| @@ -52,7 +52,7 @@ if($request->getMethod() === 'GET'){ | |||
| 52 | } | 52 | } |
| 53 | 53 | ||
| 54 | // construction d'une page | 54 | // construction d'une page |
| 55 | $response = (new ViewController)->buildView($entityManager, $request); // utilise Model | 55 | $response = (new ViewDirector)->buildView($entityManager, $request); // utilise Model |
| 56 | // parenthèses nécéssaires autour de l'instanciation pour PHP < 8.4 | 56 | // parenthèses nécéssaires autour de l'instanciation pour PHP < 8.4 |
| 57 | } | 57 | } |
| 58 | 58 | ||
diff --git a/src/view/MaintenanceBuilder.php b/src/view/MaintenanceBuilder.php index f5c60ed..d9c52b1 100644 --- a/src/view/MaintenanceBuilder.php +++ b/src/view/MaintenanceBuilder.php | |||
| @@ -10,6 +10,13 @@ class MaintenanceBuilder extends AbstractBuilder | |||
| 10 | public function __construct(Node $node){ | 10 | public function __construct(Node $node){ |
| 11 | $viewFile = self::VIEWS_PATH . $node->getName() . '.php'; | 11 | $viewFile = self::VIEWS_PATH . $node->getName() . '.php'; |
| 12 | 12 | ||
| 13 | // noter qu'un backup vient d'être créé depuis ViewDirector | ||
| 14 | $backup_array = Backup::getBackupList(); | ||
| 15 | $backup_options = ''; | ||
| 16 | for($i = count($backup_array) - 1; $i >= 0; $i--){ | ||
| 17 | $backup_options .= '<option value="' . $backup_array[$i] . '">' . $backup_array[$i] . '</option>'; | ||
| 18 | } | ||
| 19 | |||
| 13 | if(file_exists($viewFile)){ | 20 | if(file_exists($viewFile)){ |
| 14 | ob_start(); | 21 | ob_start(); |
| 15 | require $viewFile; | 22 | require $viewFile; |
diff --git a/src/view/templates/maintenance.php b/src/view/templates/maintenance.php index 3501fa4..58e04c0 100644 --- a/src/view/templates/maintenance.php +++ b/src/view/templates/maintenance.php | |||
| @@ -19,9 +19,25 @@ | |||
| 19 | <div class="basic_div"> | 19 | <div class="basic_div"> |
| 20 | <p> | 20 | <p> |
| 21 | <a href="<?= new URL(['action' => 'get_mysqldump']) ?>"> | 21 | <a href="<?= new URL(['action' => 'get_mysqldump']) ?>"> |
| 22 | <button id="get_mysqldump">Télécharger la base de données</button> | 22 | <button id="get_mysqldump">Télécharger une sauvegarde de la base de données</button> |
| 23 | </a><br> | 23 | </a><br> |
| 24 | <i>Réalise un "mysqldump", vous obtiendrez un unique fichier contenant toute la BDD.</i> | 24 | <i>Obtenir un fichier SQL à conserver sur votre ordinateur. Une sauvegarde est réalisée à chaque visite de cette page.</i> |
| 25 | </p> | ||
| 26 | </div> | ||
| 27 | <div class="basic_div"> | ||
| 28 | <p>Restaurer la base de données à partir d'un fichier SQL.<br> | ||
| 29 | <i>Attention l'actuelle BDD sera écrasée!</i> | ||
| 30 | </p> | ||
| 31 | <p> | ||
| 32 | <label for="">Utiliser une sauvegarde conservée sur le serveur</label> | ||
| 33 | <select> | ||
| 34 | <?= $backup_options ?> | ||
| 35 | </select> | ||
| 36 | </p> | ||
| 37 | <p> | ||
| 38 | <label for="restore_sql_dump">Utiliser un fichier sur votre ordinateur:</label> | ||
| 39 | <input id="restore_sql_dump" type="file" accept=".sql" name="restore_sql_dump"> | ||
| 40 | |||
| 25 | </p> | 41 | </p> |
| 26 | </div> | 42 | </div> |
| 27 | 43 | ||
