security_check(); //Décommenter la ligne suivante pour le mode "manuel et bavard" //$debug="yes"; // Désactiver le mode deflate afin que les ob_flush() et flush() fonctionnent if (function_exists('apache_setenv')) apache_setenv("no-gzip","1"); //apache_setenv("dont-vary","1"); if (!isset($action) or ($action != "restaure")) { if ($resultat_session == 'c') { header("Location: ../utilisateurs/mon_compte.php?change_mdp=yes"); die(); } else if ($resultat_session == '0') { header("Location: ../logout.php?auto=1"); die(); } } if (!isset($action) or ($action != "restaure")) { if (!checkAccess()) { header("Location: ../logout.php?auto=1"); die(); } } else { // On s'assure que l'utilisateur qui a initié la restauration était bien // un admin ! if (!isset($_SESSION["tempstatut"])) { $_SESSION["tempstatut"] = $_SESSION['statut']; } if ($_SESSION["tempstatut"] != "administrateur") { die(); } } // Initialisation du répertoire actuel de sauvegarde $dirname = getSettingValue("backup_directory"); // Téléchargement d'un fichier vers backup if (isset($action) and ($action == 'upload')) { check_token(); $sav_file = isset($_FILES["sav_file"]) ? $_FILES["sav_file"] : NULL; //echo "\$sav_file['tmp_name']=".$sav_file['tmp_name']."
"; if (!isset($sav_file['tmp_name']) or ($sav_file['tmp_name'] =='')) { $msg = "Erreur de téléchargement ".$sav_file['tmp_name'].' '.$dirname; } else if (!file_exists($sav_file['tmp_name'])) { $msg = "Erreur de téléchargement.".$dirname.' '.$sav_file['tmp_name']; } else if (!preg_match('/sql$/',$sav_file['name']) AND !preg_match('/gz$/',$sav_file['name'])){ $msg = "Erreur : seuls les fichiers ayant l'extension .sql ou .gz sont autorisés."; } else { $dest = "../backup/".$dirname."/"; $n = 0; $nom_corrige = preg_replace("/[^.a-zA-Z0-9_=-]+/", "_", $sav_file['name']); if (!deplacer_fichier_upload($sav_file['tmp_name'], "../backup/".$dirname."/".$nom_corrige)) { $msg = "Problème de transfert : le fichier n'a pas pu être transféré sur le répertoire backup"; } else { $msg = "Téléchargement réussi."; } } } // Suppression d'un fichier if (isset($action) and ($action == 'sup')) { check_token(); if (isset($_GET['file']) && ($_GET['file']!='')) { if((isset($_GET['sous_dossier']))&&($_GET['sous_dossier']=='absences')) { if (@unlink("../backup/".$dirname."/absences/".$_GET['file'])) { $msg = "Le fichier ".$_GET['file']." a été supprimé.
\n"; } else { $msg = "Un problème est survenu lors de la tentative de suppression du fichier ".$_GET['file'].".
Il s'agit peut-être un problème de droits sur le répertoire backup.
\n"; } } else { if (@unlink("../backup/".$dirname."/".$_GET['file'])) { $msg = "Le fichier ".$_GET['file']." a été supprimé.
\n"; if(file_exists("../backup/".$dirname."/".$_GET['file'].".txt")) { @unlink("../backup/".$dirname."/".$_GET['file'].".txt"); } } else { $msg = "Un problème est survenu lors de la tentative de suppression du fichier ".$_GET['file'].".
Il s'agit peut-être un problème de droits sur le répertoire backup.
\n"; } } } } // Protection du répertoire backup if (isset($action) and ($action == 'protect')) { check_token(); include_once("../lib/class.htaccess.php"); // Instance of the htaccess class // $ht = & new htaccess(TRUE); $ht = new htaccess(TRUE); $user = array(); // Get the logins from the password file $user = $ht->get_htpasswd(); // Add an Administrator if(empty($_POST['pwd1_backup']) || empty($_POST['pwd2_backup'])) { $msg = "Problème : les deux mots de passe ne sont pas identiques ou sont vides."; $error = 1; } elseif ($_POST['pwd1_backup'] != $_POST['pwd2_backup']) { $msg = "Problème : les deux mots de passe ne sont pas identiques."; $error = 1; } elseif (empty($_POST['login_backup'])) { $msg = "Problème : l'identifiant est vide."; $error = 1; } else { $_login = my_strtolower(unslashes($_POST['login_backup'])); if(is_array($user)) { foreach($user as $key => $value) { if($_login == $key) { $ht->delete_user($_login); } } } } if(!isset($error)) { $ht->set_user($_login, $_POST['pwd1_backup']); $ht->set_htpasswd(); $user = array(); $user = $ht->get_htpasswd(); clearstatcache(); if(!is_file('../backup/'.$dirname.'/.htaccess')) { $ht->option['AuthName'] = '"PROTECTION BACKUP"'; $ht->set_htaccess(); } } } // Suppression de la protection if (isset($action) and ($action == 'del_protect')) { check_token(); if ((@unlink("../backup/".$dirname."/.htaccess")) and (@unlink("../backup/".$dirname."/.htpasswd"))) { $msg = "Les fichiers .htaccess et .htpasswd ont été supprimés. Le répertoire /backup n'est plus protégé\n"; } } function gzip($src, $level = 5, $dst = false){ // Pour compresser un fichier existant if($dst == false) { $dst = $src.".gz"; } if(file_exists($src)){ $filesize = filesize($src); $src_handle = fopen($src, "r"); if(!file_exists($dst)){ $dst_handle = gzopen($dst, "w$level"); while(!feof($src_handle)){ $chunk = fread($src_handle, 32768); gzwrite($dst_handle, $chunk); } fclose($src_handle); gzclose($dst_handle); return true; } else { return false; } } else { return false; } } function deplacer_fichier_upload($source, $dest) { $ok = @copy($source, $dest); if (!$ok) $ok = @move_uploaded_file($source, $dest); return $ok; } function test_ecriture_backup() { $ok = 'no'; if ($f = @fopen("../backup/test", "w")) { @fputs($f, '<'.'?php $ok = "yes"; ?'.'>'); @fclose($f); include("../backup/test"); $del = @unlink("../backup/test"); } return $ok; } function mysql_version2() { $result = mysqli_query($GLOBALS["mysqli"], 'SELECT VERSION() AS version'); if ($result != FALSE && @mysqli_num_rows($result) > 0) { $row = mysqli_fetch_array($result); $match = explode('.', $row['version']); } else { $result = @mysqli_query($GLOBALS["mysqli"], 'SHOW VARIABLES LIKE \'version\''); if ($result != FALSE && @mysqli_num_rows($result) > 0) { $row = mysqli_fetch_row($result); $match = explode('.', $row[1]); } } if (!isset($match) || !isset($match[0])) $match[0] = 3; if (!isset($match[1])) $match[1] = 21; if (!isset($match[2])) $match[2] = 0; return $match[0] . "." . $match[1] . "." . $match[2]; } function init_time() { global $TPSDEB,$TPSCOUR; list ($usec,$sec)=explode(" ",microtime()); $TPSDEB=$sec; $TPSCOUR=0; } function current_time() { global $TPSDEB,$TPSCOUR; list ($usec,$sec)=explode(" ",microtime()); $TPSFIN=$sec; if (round($TPSFIN-$TPSDEB,1)>=$TPSCOUR+1) //une seconde de plus { $TPSCOUR=round($TPSFIN-$TPSDEB,1); flush(); } } function backupMySql($db,$dumpFile,$duree,$rowlimit) { global $TPSCOUR,$offsettable,$offsetrow,$cpt,$debug; $fileHandle = fopen($dumpFile, "a"); if(!$fileHandle) { echo "Ouverture de $dumpFile impossible
\n"; return FALSE; } if ($offsettable==0&&$offsetrow==-1){ $todump ="#**************** BASE DE DONNEES ".$db." ****************"."\n" .date("\#\ \L\e\ \:\ d\ m\ Y\ \a\ H\h\ i")."\n"; $todump.="# Serveur : ".$_SERVER['SERVER_NAME']."\n"; $todump.="# Version PHP : " . phpversion()."\n"; $todump.="# Version mySQL : " . mysql_version2()."\n"; $todump.="# IP Client : ".$_SERVER['REMOTE_ADDR']."\n"; $todump.="# Fichier SQL compatible PHPMyadmin\n#\n"; $todump.="# ******* debut du fichier ********\n"; fwrite ($fileHandle,$todump); } $sql="SHOW TABLES;"; $result=mysqli_query($GLOBALS["mysqli"], $sql); $numtab=0; while ($t = mysqli_fetch_array($result)) { $tables[$numtab]=$t[0]; $numtab++; } if (mysqli_error($GLOBALS["mysqli"])) { echo "
\nERREUR lors de la sauvegarde du à un problème dans la la base.
".mysqli_error($GLOBALS["mysqli"])."
\n"; return false; die(); } for (;$offsettable<$numtab;$offsettable++){ // Dump de la strucutre table if ($offsetrow==-1){ $todump = get_def($db,$tables[$offsettable]); if (isset($debug)&&$debug!='') echo "
Dump de la structure de la table ".$tables[$offsettable]."

\n"; fwrite($fileHandle,$todump); $offsetrow++; $cpt++; } current_time(); if ($duree>0 and $TPSCOUR>=$duree) //on atteint la fin du temps imparti return TRUE; if (isset($debug)&&$debug!='') echo "
Dump des données de la table ".$tables[$offsettable]."
\n"; $fin=0; while (!$fin){ $todump = get_content($db,$tables[$offsettable],$offsetrow,$rowlimit); $rowtodump=substr_count($todump, "INSERT INTO"); if ($rowtodump>0){ fwrite ($fileHandle,$todump); $cpt+=$rowtodump; $offsetrow+=$rowlimit; if ($rowtodump<$rowlimit) $fin=1; current_time(); if ($duree>0 and $TPSCOUR>=$duree) {//on atteint la fin du temps imparti if (isset($debug)&&$debug!='') echo "

Nombre de lignes actuellement dans le fichier : ".$cpt."
\n"; return TRUE; } } else { $fin=1;$offsetrow=-1; } } if (isset($debug)&&$debug!='') echo "Pour cette table, nombre de lignes sauvegardées : ".$offsetrow."
\n"; if ($fin) $offsetrow=-1; current_time(); if ($duree>0 and $TPSCOUR>=$duree) //on atteint la fin du temps imparti return TRUE; } $offsettable=-1; $todump ="#\n"; $todump.="# ******* Fin du fichier - La sauvegarde s'est terminée normalement ********\n"; fwrite ($fileHandle,$todump); fclose($fileHandle); return TRUE; } //function restoreMySqlDump($dumpFile,$duree) { function restoreMySqlDump($duree) { // $dumpFile, fichier source // ON TRANSMET EN FAIT LA VERSION EXTRAITE // $duree=timeout pour changement de page (-1 = aucun) global $TPSCOUR,$offset,$cpt,$erreur_mysql; //global $nom_table; //global $table_log_passee; global $dirname; global $debug_restaure; $sql="SELECT * FROM a_tmp_setting WHERE name LIKE 'table_%' AND value!='log' AND value!='setting' AND value!='utilisateurs' AND value!='a_tmp_setting' ORDER BY name LIMIT 1;"; if($debug_restaure=='y') {echo "$sql
\n";} $res=mysqli_query($GLOBALS["mysqli"], $sql); if(mysqli_num_rows($res)>0) { $lig=mysqli_fetch_object($res); $num_table=preg_replace('/^table_/','',$lig->name); $nom_table=$lig->value; $dumpFile="../backup/".$dirname."/base_extraite_table_".$num_table.".sql"; if(!file_exists($dumpFile)) { echo "$dumpFile non trouvé
\n"; return FALSE; } $sql="SELECT value FROM a_tmp_setting WHERE name='nb_tables';"; $res=mysqli_query($GLOBALS["mysqli"], $sql); $lig=mysqli_fetch_object($res); $nb_tables=$lig->value; $sql="SELECT 1=1 FROM a_tmp_setting WHERE name LIKE 'table_%';"; $res=mysqli_query($GLOBALS["mysqli"], $sql); $nb_tables_passees=$nb_tables-mysqli_num_rows($res); // Ca ne correspond plus à un nombre de tables, mais à un nombre de fichiers echo "

Fichier ".($nb_tables_passees+1)."/".$nb_tables."

\n"; echo "

Traitement de la table $nom_table
"; $fileHandle = gzopen($dumpFile, "rb"); $cpt_insert=0; $formattedQuery = ""; $old_offset = $offset; while(!gzeof($fileHandle)) { current_time(); if ($duree>0 and $TPSCOUR>=$duree) { //on atteint la fin du temps imparti if ($old_offset == $offset) { echo "

La procédure de restauration ne peut pas continuer.
Un problème est survenu lors du traitement d'une requête près de :.
".$debut_req."


\n"; return FALSE; } $old_offset = $offset; return TRUE; } //echo $TPSCOUR."
"; $buffer=gzgets($fileHandle); if (mb_substr($buffer,mb_strlen($buffer),1)==0) { $buffer=mb_substr($buffer,0,mb_strlen($buffer)-1); } //echo $buffer."
"; if(mb_substr($buffer, 0, 1) != "#" AND mb_substr($buffer, 0, 1) != "/") { if (!isset($debut_req)) $debut_req = $buffer; $formattedQuery .= $buffer; //echo $formattedQuery."
"; if ($formattedQuery) { $sql = $formattedQuery; if (mysqli_query($GLOBALS["mysqli"], $sql)) {//réussie sinon continue à concaténer if(preg_match("/^DROP TABLE /",$sql)) { echo "Suppression de la table $nom_table si elle existe.
"; } elseif(preg_match("/^CREATE TABLE /",$sql)) { echo "Création de la table $nom_table d'après la sauvegarde.
"; } else { if($cpt_insert==0) { //echo "
"; echo "Restauration des enregistrements de la table $nom_table d'après la sauvegarde: "; } else { echo ". "; } $cpt_insert++; } flush(); debug_pb($sql); $offset=gztell($fileHandle); //echo $offset; $formattedQuery = ""; unset($debut_req); $cpt++; //echo $cpt; } } } } if($cpt_insert>0) { echo "
"; echo "$cpt_insert enregistrement(s) restauré(s)."; } if (mysqli_error($GLOBALS["mysqli"])) { echo "
\nERREUR à partir de ".nl2br($formattedQuery)."
".mysqli_error($GLOBALS["mysqli"])."
\n"; $erreur_mysql=TRUE; } gzclose($fileHandle); $sql="DELETE FROM a_tmp_setting WHERE name='table_".$num_table."';"; if($debug_restaure=='y') { if($nettoyage=mysqli_query($GLOBALS["mysqli"], $sql)) { echo "Succès de la suppression dans a_tmp_setting.
\n"; } else { echo "

Erreur lors de la suppression dans 'a_tmp_setting'.

\n"; } if(unlink($dumpFile)) { echo "Succès de la suppression de $dumpFile.
"; } else { echo "

Erreur lors de la suppression de $dumpFile.

\n"; } } else { if(!$nettoyage=mysqli_query($GLOBALS["mysqli"], $sql)) { echo "

Erreur lors de la suppression dans 'a_tmp_setting'.

\n"; } if(!unlink($dumpFile)) { echo "

Erreur lors de la suppression de $dumpFile.

\n"; } } } else { // Il ne reste que les tables log, setting et utilisateurs à restaurer $tab_tables=array("setting","utilisateurs","log"); for($i=0;$i0) { // On peut avoir plusieurs enregistrements pour une même table s'il y a plus de 1000 enregistrements dans la table // Ou alors, il ne faut pas scinder ces tables while($lig=mysqli_fetch_object($res)) { $num_table=preg_replace('/^table_/','',$lig->name); $nom_table=$lig->value; $dumpFile="../backup/".$dirname."/base_extraite_table_".$num_table.".sql"; if(!file_exists($dumpFile)) { echo "$dumpFile non trouvé
\n"; return FALSE; } echo "

Traitement de la table $nom_table
"; $fileHandle = gzopen($dumpFile, "rb"); $cpt_insert=0; $formattedQuery = ""; $old_offset = $offset; while(!gzeof($fileHandle)) { current_time(); if ($duree>0 and $TPSCOUR>=$duree) { //on atteint la fin du temps imparti if ($old_offset == $offset) { echo "

La procédure de restauration ne peut pas continuer.
Un problème est survenu lors du traitement d'une requête près de :.
".$debut_req."


\n"; return FALSE; } $old_offset = $offset; return TRUE; } //echo $TPSCOUR."
"; $buffer=gzgets($fileHandle); if (mb_substr($buffer,mb_strlen($buffer),1)==0) { $buffer=mb_substr($buffer,0,mb_strlen($buffer)-1); } //echo $buffer."
"; if(mb_substr($buffer, 0, 1) != "#" AND mb_substr($buffer, 0, 1) != "/") { if (!isset($debut_req)) $debut_req = $buffer; $formattedQuery .= $buffer; //echo $formattedQuery."
"; if ($formattedQuery) { $sql = $formattedQuery; if (mysqli_query($GLOBALS["mysqli"], $sql)) {//réussie sinon continue à concaténer if(preg_match("/^DROP TABLE /",$sql)) { echo "Suppression de la table $nom_table si elle existe.
"; } elseif(preg_match("/^CREATE TABLE /",$sql)) { echo "Création de la table $nom_table d'après la sauvegarde.
"; } else { if($cpt_insert==0) { //echo "
"; echo "Restauration des enregistrements de la table $nom_table d'après la sauvegarde: "; } else { echo ". "; } $cpt_insert++; } flush(); debug_pb($sql); $offset=gztell($fileHandle); //echo $offset; $formattedQuery = ""; unset($debut_req); $cpt++; //echo $cpt; } } } } if($cpt_insert>0) { echo "
"; echo "$cpt_insert enregistrement(s) restauré(s)."; //echo "
\n"; } if (mysqli_error($GLOBALS["mysqli"])) { echo "
\nERREUR à partir de
".nl2br($formattedQuery)."
".mysqli_error($GLOBALS["mysqli"])."
\n"; $erreur_mysql=TRUE; } gzclose($fileHandle); $sql="DELETE FROM a_tmp_setting WHERE name='table_".$num_table."';"; if($debug_restaure=='y') { if($nettoyage=mysqli_query($GLOBALS["mysqli"], $sql)) { echo "Succès de la suppression dans a_tmp_setting.
\n"; } else { echo "

Erreur lors de la suppression dans 'a_tmp_setting'.

\n"; } if(unlink($dumpFile)) { echo "Succès de la suppression de $dumpFile.
"; } else { echo "

Erreur lors de la suppression de $dumpFile.

\n"; } } else { if(!$nettoyage=mysqli_query($GLOBALS["mysqli"], $sql)) { echo "

Erreur lors de la suppression dans 'a_tmp_setting'.

\n"; } if(!unlink($dumpFile)) { echo "

Erreur lors de la suppression de $dumpFile.

\n"; } } } } } } return TRUE; } function extractMySqlDump($dumpFile,$duree) { // $dumpFile, fichier source // $duree=timeout pour changement de page (-1 = aucun) global $TPSCOUR,$offset,$cpt; //global $nom_table; global $dirname; //global $table_log_passee; global $ne_pas_restaurer_log; global $ne_pas_restaurer_tentatives_intrusion; if(!file_exists($dumpFile)) { echo "$dumpFile non trouvé
\n"; return FALSE; } $fileHandle = gzopen($dumpFile, "rb"); if(!$fileHandle) { echo "Ouverture de $dumpFile impossible.
\n"; return FALSE; } if ($offset!=0) { if (gzseek($fileHandle,$offset,SEEK_SET)!=0) { //erreur echo "Impossible de trouver l'octet ".number_format($offset,0,""," ")."
\n"; return FALSE; } flush(); } $formattedQuery = ""; $old_offset = $offset; $num_table=0; while(!gzeof($fileHandle)) { current_time(); if ($duree>0 and $TPSCOUR>=$duree) { //on atteint la fin du temps imparti if ($old_offset == $offset) { echo "

La procédure de restauration ne peut pas continuer.
Un problème est survenu lors du traitement d'une requête près de :.
".$debut_req."


\n"; return FALSE; } $old_offset = $offset; return TRUE; } //echo $TPSCOUR."
"; $buffer=gzgets($fileHandle); // On ne met pas les lignes de commentaire, ni les lignes vides if(mb_substr($buffer, 0, 1) != "#" AND mb_substr($buffer, 0, 1) != "/" AND trim($buffer)!='') { if(preg_match("/^DROP TABLE /",$buffer)) { if(isset($fich)) {fclose($fich);} //$fich=fopen("../backup/".$dirname."/base_extraite_table_".$num_table.".sql","w+"); $fich=fopen("../backup/".$dirname."/base_extraite_table_".sprintf("%03d",$num_table).".sql","w+"); $nom_table=trim(preg_replace("/[ `;]/","",preg_replace("/^DROP TABLE /","",preg_replace("/^DROP TABLE IF EXISTS /","",$buffer)))); $sql="INSERT INTO a_tmp_setting SET name='table_".sprintf("%03d",$num_table)."', value='$nom_table';"; $res=mysqli_query($GLOBALS["mysqli"], $sql); $cpt_lignes_fichier=0; $num_table++; } if(isset($fich)) { if($nom_table=='log') { if(($ne_pas_restaurer_log!='y')||(!preg_match("/^INSERT INTO /i",$buffer))) { fwrite($fich,$buffer); } } elseif($nom_table=='tentatives_intrusion') { if(($ne_pas_restaurer_tentatives_intrusion!='y')||(!preg_match("/^INSERT INTO /i",$buffer))) { fwrite($fich,$buffer); } } else { if($cpt_lignes_fichier>1000) { if(isset($fich)) {fclose($fich);} $fich=fopen("../backup/".$dirname."/base_extraite_table_".sprintf("%03d",$num_table).".sql","w+"); // Le nom de table n'a pas changé: $sql="INSERT INTO a_tmp_setting SET name='table_".sprintf("%03d",$num_table)."', value='$nom_table';"; $res=mysqli_query($GLOBALS["mysqli"], $sql); $cpt_lignes_fichier=0; $num_table++; // Du coup, la variable ne correspond plus au nombre de tables, mais au nombre de morceaux. } fwrite($fich,$buffer); $cpt_lignes_fichier++; } } else { echo "Non enregistré: \$buffer=$buffer
"; } } } if(isset($fich)) {fclose($fich);} gzclose($fileHandle); $sql="INSERT INTO a_tmp_setting SET name='nb_tables', value='$num_table';"; $res=mysqli_query($GLOBALS["mysqli"], $sql); return TRUE; } function restoreMySqlDump_old($dumpFile,$duree) { // $dumpFile, fichier source // $duree=timeout pour changement de page (-1 = aucun) global $TPSCOUR,$offset,$cpt,$erreur_mysql; if(!file_exists($dumpFile)) { echo "$dumpFile non trouvé
\n"; return FALSE; } $fileHandle = gzopen($dumpFile, "rb"); if(!$fileHandle) { echo "Ouverture de $dumpFile impossible.
\n"; return FALSE; } if ($offset!=0) { if (gzseek($fileHandle,$offset,SEEK_SET)!=0) { //erreur echo "Impossible de trouver l'octet ".number_format($offset,0,""," ")."
\n"; return FALSE; } flush(); } $formattedQuery = ""; $old_offset = $offset; while(!gzeof($fileHandle)) { current_time(); if ($duree>0 and $TPSCOUR>=$duree) { //on atteint la fin du temps imparti if ($old_offset == $offset) { echo "

La procédure de restauration ne peut pas continuer.
Un problème est survenu lors du traitement d'une requête près de :.
".$debut_req."


\n"; return FALSE; } $old_offset = $offset; return TRUE; } //echo $TPSCOUR."
"; $buffer=gzgets($fileHandle); if (mb_substr($buffer,mb_strlen($buffer),1)==0) { $buffer=mb_substr($buffer,0,mb_strlen($buffer)-1); } //echo $buffer."
"; if(mb_substr($buffer, 0, 1) != "#" AND mb_substr($buffer, 0, 1) != "/") { if (!isset($debut_req)) {$debut_req = $buffer;} $formattedQuery .= $buffer; //echo $formattedQuery."
"; if (trim($formattedQuery)!="") { $sql = $formattedQuery; if (mysqli_query($GLOBALS["mysqli"], $sql)) {//réussie sinon continue à concaténer $offset=gztell($fileHandle); //echo $offset; $formattedQuery = ""; unset($debut_req); $cpt++; //echo "$cpt requêtes exécutées avec succès jusque là.
"; } } } } if (mysqli_error($GLOBALS["mysqli"])) { echo "
\nERREUR à partir de ".nl2br($formattedQuery)."
".mysqli_error($GLOBALS["mysqli"])."
\n"; $erreur_mysql=TRUE; } gzclose($fileHandle); $offset=-1; return TRUE; } function debug_pb($ligne) { $debug=0; if($debug==1) { $fich=fopen("/tmp/rest.txt","a+"); fwrite($fich,$ligne."\n"); fclose($fich); } } function get_def($db, $table) { $def="#\n# Structure de la table $table\n#\n"; $def .="DROP TABLE IF EXISTS `$table`;\n"; // requete de creation de la table $query = "SHOW CREATE TABLE $table"; $resCreate = mysqli_query($GLOBALS["mysqli"], $query); $row = mysqli_fetch_array($resCreate); $schema = $row[1].";"; $def .="$schema\n"; return $def; } function get_content($db, $table,$from,$limit) { $search = array("\x00", "\x0a", "\x0d", "\x1a"); $replace = array('\0', '\n', '\r', '\Z'); // les données de la table $def = ''; $query = "SELECT * FROM $table LIMIT $from,$limit"; $resData = @mysqli_query($GLOBALS["mysqli"], $query); //peut survenir avec la corruption d'une table, on prévient if (!$resData) { $def .="Problème avec les données de $table, corruption possible !\n"; } else { if (@mysqli_num_rows($resData) > 0) { $sFieldnames = ""; $num_fields = (($___mysqli_tmp = mysqli_num_fields($resData)) ? $___mysqli_tmp : false); $sInsert = "INSERT INTO $table $sFieldnames values "; while($rowdata = mysqli_fetch_row($resData)) { $lesDonnees = ""; for ($mp = 0; $mp < $num_fields; $mp++) { if (is_null($rowdata[$mp])) { $lesDonnees .= "NULL"; } else { $lesDonnees .= "'" . str_replace($search, $replace, traitement_magic_quotes($rowdata[$mp])) . "'"; } //on ajoute à la fin une virgule si nécessaire if ($mp<$num_fields-1) $lesDonnees .= ","; } $lesDonnees = "$sInsert($lesDonnees);\n"; $def .="$lesDonnees"; } } } return $def; } // Type de fichier $filetype = "sql"; // Chemin vers /backup if (!isset($_GET["path"])) $path="../backup/" . $dirname . "/" ; else $path=$_GET["path"]; // Durée d'une portion if (!isset($_SESSION['defaulttimeout'])) { $_SESSION['defaulttimeout']=max(get_cfg_var("max_execution_time")-2,5); } // Lors d'une sauvegarde, nombre de lignes traitées dans la base entre chaque vérification du temps restant $defaultrowlimit=10; //**************** EN-TETE ***************** $titre_page = "Outil de gestion | Sauvegardes/Restauration"; require_once("../lib/header.inc.php"); //**************** FIN EN-TETE ***************** //debug_var(); // Test d'écriture dans /backup $test_write = test_ecriture_backup(); if ($test_write == 'no') { echo "

Problème de droits d'accès :

\n"; echo "

Le répertoire \"/backup\" n'est pas accessible en écriture.

\n"; echo "

Vous ne pouvez donc pas accéder aux fonctions de sauvegarde/restauration de GEPI. Contactez l'administrateur technique afin de régler ce problème.

\n"; require("../lib/footer.inc.php"); die(); } if (!function_exists("gzwrite")) { echo "

Problème de configuration :

\n"; echo "

Les fonctions de compression 'zlib' ne sont pas activées. Vous devez configurer PHP pour qu'il utilise 'zlib'.

\n"; echo "

Vous ne pouvez donc pas accéder aux fonctions de sauvegarde/restauration de GEPI. Contactez l'administrateur technique afin de régler ce problème.

\n"; require("../lib/footer.inc.php"); die(); } // Confirmation de la restauration if (isset($action) and ($action == 'restaure_confirm')) { check_token(); echo "

Confirmation de la restauration de la base

\n"; echo "Fichier sélectionné pour la restauration : ".$_GET['file']."\n"; echo "

ATTENTION : La procédure de restauration de la base est irréversible. Le fichier de restauration doit être valide. Selon le contenu de ce fichier, tout ou partie de la structure actuelle de la base ainsi que des données existantes peuvent être supprimées et remplacées par la structure et les données présentes dans le fichier.

\nAVERTISSEMENT : Cette procédure peut être très longue selon la quantité de données à restaurer.

\n"; echo "
Options de restauration :\n"; echo "
\n"; echo "
\n"; echo "

".add_token_field()."

"; echo "
"; echo "--Restauration par tables (option par défaut)--
"; echo "
\n"; echo "

\n"; echo "\n"; echo "

\n"; echo "

\n"; echo "\n"; echo "

\n"; echo "

\n"; echo "\n"; echo "

\n"; echo "
\n"; echo "
"; echo "
"; echo "--Restauration d'un bloc--
"; echo "
\n"; echo "

\n"; echo "\n"; echo "

\n"; echo "
\n"; echo "
"; echo "
"; echo "--Restauration par MySQL--
"; echo "
\n"; echo "

\n"; echo "

\n"; echo "

\n"; //echo " -> préciser si le fichier à restaurer est codé en UTF8 (sauvegarde GEPI >=1.6.0) ou en ISO (sauvegarde GEPI <=1.5.5)\n"; echo '

préciser si le fichier à restaurer est

'; if (substr(PHP_OS,0,3) == 'WIN' && !file_exists("mysql.exe")) { echo "

Attention : pour utiliser la commande système mysql lorsque Gepi est hébergé sous Windows il faut au préalable copier le fichier \"mysql.exe\" dans le dossier \"gestion\" de Gepi. Ce fichier \"mysql.exe\" se trouve généralement dans le sous-dossier \"bin\" du dossier d'installation de MySQL.

"; } echo "
\n"; echo "
"; echo "



"; echo "\n"; echo "\n"; echo "\n"; echo "

\n"; echo "
\n"; echo "

ou

\n"; echo "
\n"; echo "

\n"; echo "
\n"; echo "
\n"; require("../lib/footer.inc.php"); die(); } // Restauration if (isset($action) and ($action == 'restaure')) { check_token(); $restauration_mysql=isset($_POST["restauration_mysql"]) ? $_POST["restauration_mysql"] : (isset($_GET["restauration_mysql"]) ? $_GET["restauration_mysql"] : "n"); unset($file); $file = isset($_POST["file"]) ? $_POST["file"] : (isset($_GET["file"]) ? $_GET["file"] : NULL); $restauration_old_way=isset($_POST["restauration_old_way"]) ? $_POST["restauration_old_way"] : (isset($_GET["restauration_old_way"]) ? $_GET["restauration_old_way"] : "n"); $cpt=isset($_POST["cpt"]) ? $_POST["cpt"] : (isset($_GET["cpt"]) ? $_GET["cpt"] : 0); $t_debut=isset($_POST["t_debut"]) ? $_POST["t_debut"] : (isset($_GET["t_debut"]) ? $_GET["t_debut"] : time()); if($restauration_old_way=='y') { //=============================================== init_time(); //initialise le temps //début de fichier if (!isset($_GET["offset"])) $offset=0; else $offset=$_GET["offset"]; //timeout if (!isset($_GET["duree"])) $duree=$_SESSION['defaulttimeout']; else $duree=$_GET["duree"]; $fsize=filesize($path.$file); if(isset($offset)) { if ($offset==-1) $percent=100; else $percent=min(100,round(100*$offset/$fsize,0)); } else $percent=0; if ($percent >= 0) { $percentwitdh=$percent*4; echo "
Restauration en cours

Progression ".$percent."%
 
\n"; } if (ob_get_contents()) { ob_flush(); } flush(); if ($offset!=-1) { $erreur_mysql=FALSE; if (restoreMySqlDump_old($path.$file,$duree)) { echo "$cpt requête(s) exécutée(s) avec succès jusque là.
"; if (isset($debug)&&$debug!='') { echo "
\nCliquez ici pour poursuivre la restauration\n"; } if (!isset($debug)||$debug=='') { if (!$erreur_mysql) echo "
\nRedirection automatique sinon"; else echo "
\nPour continuer"; echo " cliquez ici\n"; } if (!$erreur_mysql && (!isset($debug)||$debug=='')) { echo "\n"; } flush(); exit; } else die("
Erreur restoreMySqlDump_old"); } else { echo "

$cpt requête(s) exécutée(s) avec succès en tout.

"; // durée de la restauration $t_duree=time()-$t_debut; $s=$t_duree%60; $t_duree=floor($t_duree/60); $m=$t_duree%60; $h=floor($t_duree/60); echo "

Restauration terminée en ".$h." h ".$m." min ".$s." s.

Votre session GEPI n'est plus valide, vous devez vous reconnecter
Se connecter

\n"; require("../lib/footer.inc.php"); die(); } //=============================================== } if($restauration_mysql=='y') { function shutdown() { global $retour,$t_retour,$t_debut,$creation_fichier_sql,$gepiPath,$dirname,$file; // durée de la restauration $t_duree=time()-$t_debut; $s=$t_duree%60; $t_duree=floor($t_duree/60); $m=$t_duree%60; $h=floor($t_duree/60); echo ""; // bilan de la restauration if ($retour==0) { echo "

La restauration a été correctement effectuée."; // on ne peut pas utliser unlink car dans la fonction shutdown() la arcine // devient le dossier d'installation de PHP (echo getcwd();) //unlink($gepiPath."/backup/".$dirname."/bilan_restauration_".$file.".txt"); echo "
Un fichier texte nommé 'bilan_restauration_".$file.".txt' a été créé dans le dossier des sauvegardes, vous pouvez le supprimer."; } else { echo "

ATTENTION : la restauration a échoué."; echo "
Un fichier texte nommé 'bilan_restauration_".$file.".txt' a été créé dans le dossier des sauvegardes,
la requête qui a fait échouer la restauration se trouve à la fin de ce fichier."; } if ($creation_fichier_sql) echo "
Un fichier nommé '".$file."' a été créé dans le dossier des sauvegardes, vous pouvez le supprimer."; echo "

"; // dernière erreur fatale ou warning enregistrée $error = error_get_last(); //if(($error!==NULL) && ($error['type'] & ( E_ERROR | E_WARNING))) { if(isset($_POST['debug_restaure']) && $_POST['debug_restaure']=="y") { echo "

Dernière erreur PHP : ".$error['message']." dans le fichier ".$error['file']." en ligne ".$error['line']."

"; } echo "

Votre session Gepi n'est plus valide, vous devez vous reconnecter.

"; // On détruit la session //session_destroy(); } // on fait patienter echo "
"; echo "

Restauration de ".$file." en cours...

"; if (ob_get_contents()) ob_flush(); flush(); // on teste l'accès à mysql if (substr(PHP_OS,0,3) == 'WIN' && file_exists("mysqldump.exe")) @exec("mysql.exe --help",$t_retour,$retour); else @exec("mysql --help",$t_retour,$retour); if ($retour!=0) { echo ""; echo "
"; echo "

La commande mysql n'est pas accessible, vérifiez votre configuration (sans doute un problème de PATH).

"; exit(); } // Quel est le char set à utiliser ? $char_set=(isset($_POST['char_set']))?$_POST['char_set']:"utf8"; // Tests sur le type du fichier à restaurer if (!is_readable("../backup/".$dirname."/".$file) || !is_writable("../backup/".$dirname."/".$file)){ echo ""; echo "
"; echo "

Le fichier ".$file." n'est pas accessible en lecture et/ou en écriture, vérifiez les droits.

"; exit(); } $file_info=pathinfo("../backup/".$dirname."/".$file); if(!isset($file_info['extension']) || (strtolower($file_info['extension']!="gz") && strtolower($file_info['extension']!="sql"))) { echo ""; echo "
"; echo "

Le fichier à restaurer doit avoir pour extension '.sql' ou '.gz'.

"; exit(); } // il faut éventuellement décompresser le fichier, car le serveur peut être sous Windows // (sinon un pipe et gunzip suffiraient) $creation_fichier_sql=false; if (strtolower($file_info['extension']=="gz")) { // on décompresse l'archive $d_file=$file_info['filename']; if (!file_exists("../backup/".$dirname."/".$d_file)) { $h=gzopen("../backup/".$dirname."/".$file,"rb"); $d_h=fopen("../backup/".$dirname."/".$d_file,"wb"); // ajout de SET NAMES... while($buffer=gzread($h,10240)) { fwrite($d_h,$buffer,strlen($buffer)); } gzclose($h); fclose($d_h); $file=$d_file; $creation_fichier_sql=true; } else { echo ""; echo "
"; echo "

La restauration ne peut se faire avec la commande système mysql car un fichier ".$d_file." est déjà présent dans le dossier backup.

"; exit(); } } // C'est parti pour la restauration register_shutdown_function('shutdown'); if (substr(PHP_OS,0,3) == 'WIN' && file_exists("mysql.exe")) { $cmd="mysql.exe -v --default_character_set ".$char_set." -p".$dbPass." -u ".$dbUser." ".$dbDb." --host=".$dbHost; if (isset($dbPort)) {$cmd.=" --port=".$dbPort;} $cmd.=" < ../backup/".$dirname."/".$file ." > ../backup/".$dirname."/bilan_restauration_".$file.".txt"; } else { $cmd="mysql -v --default_character_set ".$char_set." -p".$dbPass." -u ".$dbUser." ".$dbDb." --host=".$dbHost; if (isset($dbPort)) {$cmd.=" --port=".$dbPort;} $cmd.=" < ../backup/".$dirname."/".$file ." > ../backup/".$dirname."/bilan_restauration_".$file.".txt"; } @exec($cmd,$t_retour,$retour); // ici le script est terminé, et donc la fonction 'shutdown' est appelée } else { $debug_restaure=isset($_POST["debug_restaure"]) ? $_POST["debug_restaure"] : (isset($_GET["debug_restaure"]) ? $_GET["debug_restaure"] : "n"); $ne_pas_restaurer_log=isset($_POST["ne_pas_restaurer_log"]) ? $_POST["ne_pas_restaurer_log"] : (isset($_GET["ne_pas_restaurer_log"]) ? $_GET["ne_pas_restaurer_log"] : "n"); $ne_pas_restaurer_tentatives_intrusion=isset($_POST["ne_pas_restaurer_tentatives_intrusion"]) ? $_POST["ne_pas_restaurer_tentatives_intrusion"] : (isset($_GET["ne_pas_restaurer_tentatives_intrusion"]) ? $_GET["ne_pas_restaurer_tentatives_intrusion"] : "n"); init_time(); //initialise le temps //début de fichier // En fait d'offset, on compte maintenant des lignes if (!isset($_GET["offset"])) {$offset=0;} else {$offset=$_GET["offset"];} //timeout if (!isset($_GET["duree"])) {$duree=$_SESSION['defaulttimeout'];} else {$duree=$_GET["duree"];} echo "
Restauration en cours
\n"; $suite_restauration=isset($_GET['suite_restauration']) ? $_GET['suite_restauration'] : NULL; if(!isset($suite_restauration)) { // EXTRAIRE -> SCINDER $sql="SHOW TABLES LIKE 'a_tmp_setting';"; $res=mysqli_query($GLOBALS["mysqli"], $sql); if(mysqli_num_rows($res)>0) { // Nettoyage au cas où la restauration précédente aurait échoué $sql="SELECT * FROM a_tmp_setting WHERE name LIKE 'table_%';"; $res=mysqli_query($GLOBALS["mysqli"], $sql); if(mysqli_num_rows($res)>0) { while($lig=mysqli_fetch_object($res)) { $num_table=preg_replace('/^table_/','',$lig->name); if(file_exists("../backup/".$dirname."/base_extraite_table_".$num_table.".sql")) { unlink("../backup/".$dirname."/base_extraite_table_".$num_table.".sql"); } } } } // On achève le ménage: $sql="DROP TABLE a_tmp_setting;"; $res=mysqli_query($GLOBALS["mysqli"], $sql); $sql="CREATE TABLE a_tmp_setting ( name VARCHAR(255) NOT NULL, value VARCHAR(255) NOT NULL) ENGINE=MyISAM CHARACTER SET utf8 COLLATE utf8_general_ci;"; $res=mysqli_query($GLOBALS["mysqli"], $sql); $sql="INSERT INTO a_tmp_setting SET name='offset', value='0';"; $res=mysqli_query($GLOBALS["mysqli"], $sql); $sql="INSERT INTO a_tmp_setting SET name='nom_table', value='';"; $res=mysqli_query($GLOBALS["mysqli"], $sql); echo "

Extraction de l'archive...
"; if(extractMySqlDump($path.$file,$duree)) { $succes_etape="y"; } } else { // TESTER S'IL RESTE DES table_% $sql="SELECT 1=1 FROM a_tmp_setting WHERE name LIKE 'table_%';"; $res=mysqli_query($GLOBALS["mysqli"], $sql); if(mysqli_num_rows($res)>0) { $erreur_mysql=FALSE; // Il reste des tables à restaurer //if (restoreMySqlDump($path."/base_extraite.sql",$duree)) { if (restoreMySqlDump($duree)) { $succes_etape="y"; } } else { // La restauration est achevée // On ne devrait pas arriver là. echo "

Restauration terminée.

Votre session GEPI n'est plus valide, vous devez vous reconnecter
Se connecter

\n"; require("../lib/footer.inc.php"); die(); } } if($succes_etape!="y") { echo "

Une erreur s'est produite!
"; } else { // durée de la sauvegarde $t_duree=time()-$t_debut; $s=$t_duree%60; $t_duree=floor($t_duree/60); $m=$t_duree%60; $h=floor($t_duree/60); //$sql="SELECT * FROM a_tmp_setting WHERE name LIKE 'table_%';"; // Pour nettoyer aussi une trace d'une sauvegarde consécutive à une restauration ratée... pas sûr que ce soit prudent... $sql="SELECT * FROM a_tmp_setting WHERE name LIKE 'table_%' AND value!='a_tmp_setting';"; $res=mysqli_query($GLOBALS["mysqli"], $sql); if(mysqli_num_rows($res)==0) { echo "

\n"; echo "
"; echo "Restauration terminée"; echo "
\n"; echo "
\n"; echo "

Restauration terminée en ".$h." h ".$m." min ".$s." s.

Votre session GEPI n'est plus valide, vous devez vous reconnecter
Se connecter

\n"; //echo "

NOTE: J'ai un problème bizarre! Alors que le lien pointe bien vers ../login.php, je me retrouve un dossier plus haut sur un logout.php hors du dossier de Gepi si bien que j'obtiens un 404 Not Found???

\n"; echo "
\n"; echo "
\n"; // Il peut rester un fichier base_extraite_table_XXX.sql correspondant à a_tmp_setting si on a restauré une sauvegarde faite après une restauration ratée/incomplète... inquiètant. $sql="DROP TABLE a_tmp_setting;"; $res=mysqli_query($GLOBALS["mysqli"], $sql); // Il ne faut pas recharger la page après restauration des tables log, setting, utilisateurs. require("../lib/footer.inc.php"); die(); } // RESOUMETTRE echo "
\n"; echo "

\n"; echo "\n"; echo "\n"; echo "\n"; echo add_token_field(); echo "\n"; echo "\n"; echo "\n"; echo "

\n"; echo "
\n"; if (((isset($erreur_mysql) && !$erreur_mysql)) || !isset($erreur_mysql)) echo "\n"; echo "
\n"; echo "\n"; echo "Cliquez ici pour poursuivre la restauration\n"; } } require("../lib/footer.inc.php"); die(); } $quitter_la_page=isset($_POST['quitter_la_page']) ? $_POST['quitter_la_page'] : (isset($_GET['quitter_la_page']) ? $_GET['quitter_la_page'] : NULL); // Sauvegarde if (isset($action) and ($action == 'dump')) { $t_debut=isset($_POST["t_debut"]) ? $_POST["t_debut"] : (isset($_GET["t_debut"]) ? $_GET["t_debut"] : time()); // On enregistre le paramètre pour s'en souvenir la prochaine fois saveSetting("mode_sauvegarde", "gepi"); // Sauvegarde de la base $nomsql = $dbDb."_le_".date("Y_m_d_\a_H\hi"); $cur_time=date("Y-m-d H:i"); $filename=$path.$nomsql.".".$filetype; if((isset($_POST['description_sauvegarde']))&&($_POST['description_sauvegarde']!='')) { $f_desc=fopen($filename.".txt", "a+"); $description_sauvegarde=suppression_sauts_de_lignes_surnumeraires($_POST['description_sauvegarde']); fwrite($f_desc, $description_sauvegarde); fclose($f_desc); } // Ce nom est modifié à chaque passage dans action=dump, mais pour les passages suivant le premier, on reçoit $fichier en $_GET donc on n'utilise pas $filename if (!isset($_GET["duree"])&&is_file($filename)){ echo "Le fichier existe déjà. Patientez une minute avant de retenter la sauvegarde.\n
\n"; } else { init_time(); //initialise le temps //début de fichier if (!isset($_GET["offsettable"])) $offsettable=0; else $offsettable=$_GET["offsettable"]; //début de fichier if (!isset($_GET["offsetrow"])) $offsetrow=-1; else $offsetrow=$_GET["offsetrow"]; //timeout de 5 secondes par défaut, -1 pour utiliser sans timeout if (!isset($_GET["duree"])) $duree=$_SESSION['defaulttimeout']; else $duree=$_GET["duree"]; //Limite de lignes à dumper à chaque fois if (!isset($_GET["rowlimit"])) $rowlimit=$defaultrowlimit; else $rowlimit=$_GET["rowlimit"]; //si le nom du fichier n'est pas en paramètre le mettre ici if (!isset($_GET["fichier"])) { $fichier=$filename; } else { check_token(); $fichier=$_GET["fichier"]; } $sql="SHOW TABLES;"; $tab=mysqli_query($GLOBALS["mysqli"], $sql); $tot=mysqli_num_rows($tab); if(isset($offsettable)){ if ($offsettable>=0) $percent=min(100,round(100*$offsettable/$tot,0)); else $percent=100; } else $percent=0; if ($percent >= 0) { $percentwitdh=$percent*4; echo "
\n\n\n
Sauvegarde en cours

A la fin de la sauvegarde, Gepi vous proposera automatiquement de télécharger le fichier.

Progression ".$percent."%
\n
 
\n
\n
\n"; } if ($percent != 100) { if (ob_get_contents()) { ob_flush(); } flush(); } if ($offsettable>=0){ if (backupMySql($dbDb,$fichier,$duree,$rowlimit)) { if (isset($debug)&&$debug!='') { echo "
\nCliquez ici pour poursuivre la sauvegarde.\n"; } if (!isset($debug)||$debug=='') { echo "
\nRedirection automatique sinon cliquez ici\n"; } if (!isset($debug)||$debug=='') { echo "\n"; } flush(); exit; } } else { // La sauvegarde est terminée. On compresse le fichier $compress = gzip($fichier, 9); if ($compress) { $filetype = "sql.gz"; } @unlink($fichier); // durée de la sauvegarde $t_duree=time()-$t_debut; $s=$t_duree%60; $t_duree=floor($t_duree/60); $m=$t_duree%60; $h=floor($t_duree/60); echo "

Sauvegarde terminée en ".$h." h ".$m." min ".$s." s.
\n"; //$nomsql.$filetype /* $handle=opendir($path); $tab_file = array(); $n=0; while ($file = readdir($handle)) { if (($file != '.') and ($file != '..') and ($file != 'remove.txt') //================================= // AJOUT: boireaus and ($file != 'csv') and ($file != 'notanet') //le dossier notanet à ne pas afficher dans la liste //================================= and ($file != '.htaccess') and ($file != '.htpasswd') and ($file != 'index.html')) { $tab_file[] = $file; $n++; } } closedir($handle); rsort($tab_file); */ $tab_file=get_tab_fichiers_du_dossier_de_sauvegarde($path); $n=count($tab_file); $nom_fichier=str_replace($path,'',$fichier); $nom_fichier=str_replace('.sql','',$nom_fichier); $fileid=null; if ($n > 0) { for($m=0;$m"; if($tab_file[$m]==$nom_fichier.'.'.$filetype){ $fileid=$m; } } clearstatcache(); } echo "

Télécharger le fichier généré par la sauvegarde

\n"; echo "

Retour vers l'interface de sauvegarde/restauration
\n"; require("../lib/footer.inc.php"); die(); } } } if (isset($action) and ($action == 'system_dump')) { check_token(); // On enregistre le paramètre pour s'en souvenir la prochaine fois saveSetting("mode_sauvegarde", "mysqldump"); // Sauvegarde de la base en utilisant l'utilitaire système mysqldump $nomsql = $dbDb."_le_".date("Y_m_d_\a_H\hi"); $cur_time=date("Y-m-d H:i"); $filetype = "sql.gz"; $filename=$path.$nomsql.".".$filetype; // Juste pour être sûr : $no_escapeshellarg=getSettingValue('no_escapeshellarg'); if($no_escapeshellarg=='y') { $dbHost = preg_replace("/[^A-Za-z0-9_-.]/","",$dbHost); $dbUser = preg_replace("/[^A-Za-z0-9_-.]/","",$dbUser); $dbPass = preg_replace("/[^A-Za-z0-9_-.]/","",$dbPass); $dbDb = preg_replace("/[^A-Za-z0-9_-.]/","",$dbDb); } else { $dbHost = escapeshellarg($dbHost); $dbUser = escapeshellarg($dbUser); $dbPass = escapeshellarg($dbPass); $dbDb = escapeshellarg($dbDb); } $req_version = old_mysql_result(mysqli_query($GLOBALS["mysqli"], "SELECT version();"), 0); $ver_mysql = explode(".", $req_version); if (!is_numeric(mb_substr($ver_mysql[2], 1, 1))) { $ver_mysql[2] = mb_substr($ver_mysql[2], 0, 1); } else { $ver_mysql[2] = mb_substr($ver_mysql[2], 0, 2); } // on fait patienter echo "
"; echo "

Sauvegarde en cours...

"; if (ob_get_contents()) ob_flush(); flush(); $t_debut=time(); if (substr(PHP_OS,0,3) == 'WIN' && file_exists("mysqldump.exe")) { // on est sous Window$ et on a $filename : "xxxx.sql.gz" $filename=substr($filename,0,-3); // $filename : "xxxx.sql" $command = "mysqldump.exe --skip-opt --add-drop-table --skip-disable-keys --quick -Q --create-options --set-charset --skip-comments -h $dbHost -u $dbUser --password=$dbPass"; if (isset($dbPort)) {$command.=" --port=".$dbPort;} $command .= " $dbDb > $filename"; $exec = exec($command); gzip($filename); // on compresse et on obtient un fichier xxxx.sql.gz unlink($filename); // on supprime le fichier xxxx.sql $filename=$filename.".gz"; // // $filename : xxxx.sql.gz } else { if ($ver_mysql[0] == "5" OR ($ver_mysql[0] == "4" AND $ver_mysql[1] >= "1")) { $command = "mysqldump --skip-opt --add-drop-table --skip-disable-keys --quick -Q --create-options --set-charset --skip-comments -h $dbHost -u $dbUser --password=$dbPass"; if (isset($dbPort)) {$command.=" --port=".$dbPort;} $command .= " $dbDb | gzip > $filename"; } elseif ($ver_mysql[0] == "4" AND $ver_mysql[1] == "0" AND $ver_mysql[2] >= "17") { // Si on est là, c'est que le serveur mysql est d'une version 4.0.17 ou supérieure $command = "mysqldump --add-drop-table --quick --quote-names --skip-comments -h $dbHost -u $dbUser --password=$dbPass"; if (isset($dbPort)) {$command.=" --port=".$dbPort;} $command .= " $dbDb | gzip > $filename"; } else { // Et là c'est qu'on a une version inférieure à 4.0.17 $command = "mysqldump --add-drop-table --quick --quote-names -h $dbHost -u $dbUser --password=$dbPass"; if (isset($dbPort)) {$command.=" --port=".$dbPort;} $command .= " $dbDb | gzip > $filename"; } $exec = exec($command); } // durée de la sauvegarde $t_duree=time()-$t_debut; $s=$t_duree%60; $t_duree=floor($t_duree/60); $m=$t_duree%60; $h=floor($t_duree/60); if (filesize($filename) > 10000) { echo ""; echo "

La sauvegarde a été réalisée avec succès en ".$h." h ".$m." min ".$s." s.

\n"; if((isset($_POST['description_sauvegarde']))&&($_POST['description_sauvegarde']!='')) { $f_desc=fopen($filename.".txt", "a+"); $description_sauvegarde=suppression_sauts_de_lignes_surnumeraires($_POST['description_sauvegarde']); fwrite($f_desc, $description_sauvegarde); fclose($f_desc); } } else { echo "

Erreur lors de la sauvegarde.

\n"; } } //Ajout Eric if (isset($action) and ($action == 'zip')) { check_token(); define( 'PCLZIP_TEMPORARY_DIR', '../backup/' ); require_once('../lib/pclzip.lib.php'); if (isset($dossier_a_archiver)) { $suffixe_zip="_le_".date("Y_m_d_\a_H\hi"); switch ($dossier_a_archiver) { case "cdt": $chemin_stockage = $path."/_cdt".$suffixe_zip.".zip"; //l'endroit où sera stockée l'archive if((isset($GLOBALS['multisite']) AND $GLOBALS['multisite'] == 'y')) { if((isset($_COOKIE['RNE']))&&($_COOKIE['RNE']!='')) { if(!preg_match('/^[A-Za-z0-9]*$/', $_COOKIE['RNE'])) { echo "

RNE invalide : ".$_COOKIE['RNE']."

\n"; $chemin_stockage=""; } else { if (!is_dir('../documents/'.$_COOKIE['RNE'])){ @mkdir('../documents/'.$_COOKIE['RNE']); } $dossier_a_traiter = '../documents/'.$_COOKIE['RNE'].'/'; //le dossier à traiter $dossier_dans_archive = 'documents'; //le nom du dossier dans l'archive créée } } else { echo "

RNE invalide.

\n"; $chemin_stockage=""; } } else { $dossier_a_traiter = '../documents/'; //le dossier à traiter $dossier_dans_archive = 'documents'; //le nom du dossier dans l'archive créée } if ($chemin_stockage !='') { $handle=opendir($dossier_a_traiter); $tab_file = array(); $n=0; $zip_error=0; $zip_debug="n"; while ($file = readdir($handle)) { if(preg_match("#^cl#", $file)) { if($zip_debug=='y') {echo "";} $enregistrer="y"; } else { if($zip_debug=='y') {echo "";} $enregistrer="n"; } if($zip_debug=='y') {echo "$file
";} if($enregistrer=="y") { if($n==0) { $archive = new PclZip($chemin_stockage); $v_list = $archive->create("$dossier_a_traiter/$file", PCLZIP_OPT_REMOVE_PATH,$dossier_a_traiter, PCLZIP_OPT_ADD_PATH, $dossier_dans_archive); if($v_list==0) {$zip_error++;} } else { $v_list = $archive->add("$dossier_a_traiter/$file", PCLZIP_OPT_REMOVE_PATH,$dossier_a_traiter, PCLZIP_OPT_ADD_PATH, $dossier_dans_archive); if($v_list==0) {$zip_error++;} } $n++; } } closedir($handle); if ($zip_error != 0) { die("

Error : ".$archive->errorInfo(true)."

"); } elseif($n>0) { echo "

Le Zip a été créé ($n dossier(s) archivé(s)).

"; } else { echo "

Aucun dossier de documents joints à une notice n'a été trouvé.

"; } } break; case "photos": $retour=cree_zip_archive_avec_msg_erreur("photos",1); if ($retour!="") die("

".$retour."

\n"); break; default: $chemin_stockage = ''; echo "

La nature de l'archivage à effectuer est inconnue.

"; } } } if(!isset($quitter_la_page)){ if(isset($_GET['chgt_annee'])) {$_SESSION['chgt_annee']="y";} echo "

Retour Retour"; } else { echo "

Refermer la page"; } // Test présence de fichiers htaccess if (!(file_exists("../backup/".$dirname."/.htaccess")) or !(file_exists("../backup/".$dirname."/.htpasswd"))) { echo "

\n"; echo "

Répertoire backup non protégé :

\n"; echo "

Le répertoire \"/backup\" n'est actuellement pas protégé. Si vous stockez des fichiers dans ce répertoire, ils seront accessibles de l'extérieur à l'aide d'un simple navigateur.

\n"; echo "
\n"; echo "

\n"; echo add_token_field(); echo "

\n"; echo "\n"; echo "\n"; echo "
\n"; echo "

\n"; echo "

\n"; echo "\n"; echo "

\n"; echo "
\n"; echo "
\n"; } else { echo " | Protection du répertoire backup\n"; echo "
\n"; echo "

Protection du répertoire backup :

\n"; echo "

Le répertoire \"/backup\" est actuellement protégé par un identifiant et un mot de passe. Pour accéder aux fichiers stockés dans ce répertoire à partir d'un navigateur web, il est nécessaire de s'authentifier.

Cliquez sur le bouton ci-dessous pour supprimer la protection ou bien pour définir un nouvel identifiant et un mot de passe

\n"; echo "
\n"; echo "

\n"; echo add_token_field(); echo "

\n"; echo "

\n"; echo "

\n"; echo "
\n"; echo "
\n"; } ?>

Créer un fichier de sauvegarde/restauration de la base

Deux méthodes de sauvegarde sont disponibles : l'utilisation de la commande système mysqldump ou bien le système intégré à Gepi.
La première méthode (mysqldump) est vigoureusement recommandée car beaucoup moins lourde en ressources, mais ne fonctionnera que sur certaines configurations serveurs.
La seconde méthode est lourde en ressources mais passera sur toutes les configurations.

Attention : pour utiliser la commande système mysqldump lorsque Gepi est hébergé sous Windows il faut au préalable copier le fichier "mysqldump.exe" dans le dossier "gestion" de Gepi. Ce fichier "mysqldump.exe" se trouve généralement dans le sous-dossier "bin" du dossier d'installation de MySQL.


Remarque : les répertoires 'documents' (contenant les documents joints aux cahiers de textes) et 'photos' (contenant les photos du trombinoscope) ne seront pas sauvegardés. Un outil de sauvegarde spécifique se trouve en bas de cette page.


0) { echo "

Fichiers de restauration

\n"; echo "

Le tableau ci-dessous indique la liste des fichiers de restauration actuellement stockés dans le répertoire \"backup\" à la racine de GEPI.

\n"; // echo "\n\n"; echo "
Nom du fichier de sauvegarde    
\n\n"; $m = 0; $alt=1; foreach($tab_file as $value) { $alt=$alt*(-1); echo "\n"; echo "\n"; echo "\n"; $type_sauvegarde=""; if (preg_match('/^_photos/i',$value)&& preg_match('/.zip$/i',$value))$type_sauvegarde="photos"; if (preg_match('/^_cdt/i',$value)&& preg_match('/.zip$/i',$value)) $type_sauvegarde="cdt"; if ((preg_match('/.sql.gz$/i',$value) || preg_match('/.sql$/i',$value))) $type_sauvegarde="base"; switch ($type_sauvegarde) { case "photos" : echo "\n"; break; case "base" : echo "\n"; break; default : echo "\n"; break; } echo "\n"; echo "\n"; echo "\n"; $m++; } clearstatcache(); echo "
Nom du fichier de sauvegarde    
\n"; echo ""; if(file_exists('../backup/'.$dirname.'/'.$value.'.txt')) { $handle = fopen('../backup/'.$dirname.'/'.$value.'.txt', "r"); $contents = fread($handle, filesize('../backup/'.$dirname.'/'.$value.'.txt')); fclose($handle); $contents=preg_replace('/"/', "", $contents); $titre_infobulle=$value; $texte_infobulle=nl2br($contents); $tabdiv_infobulle[]=creer_div_infobulle('div_description_svg_'.$m,$titre_infobulle,"",$texte_infobulle,"",30,0,'y','y','n','n'); echo ""; echo $value; echo ""; //$m++; } else { echo $value; } echo "  (". round((filesize("../backup/".$dirname."/".$value)/1024),0)." Ko)\n"; echo "SupprimerRestaurerTéléchargerTéléch. direct
\n
\n"; } if($temoin_dossier_backup_absences=="y") { $tab_file=get_tab_fichiers_du_dossier_de_sauvegarde('../backup/' . $dirname."/absences", "y"); $n=count($tab_file); if($n>0) { echo "

Fichiers export des absences

\n"; echo "

Les fichiers d'export des absences en fin d'année sont générés dans le sous-dossier 'absences' du dossier de stockage des sauvegardes.

"; echo ""; $m = 0; foreach($tab_file as $value) { $alt=$alt*(-1); echo " \n"; $m++; } clearstatcache(); echo "
Nom du fichier d'export      
".$value."  (". round((filesize("../backup/".$dirname."/absences/".$value)/1024),0)." Ko) Supprimer Télécharger Téléch. direct

\n"; } } echo "

Uploader un fichier (de restauration) vers le répertoire backup

\n"; echo "
\n"; echo "

\n"; echo add_token_field(); echo "

\n"; $sav_file=""; echo "

\n"; echo "Les fichiers de sauvegarde sont sauvegardés dans un sous-répertoire du répertoire \"/backup\", dont le nom change de manière aléatoire régulièrement. Si vous le souhaitez, vous pouvez uploader un fichier de sauvegarde directement dans ce répertoire. Une fois cela fait, vous pourrez le sélectionner dans la liste des fichiers de restauration, sur cette page.\n"; echo "

\n"; echo "

\n"; echo "Vous pouvez également directement télécharger le fichier par ftp dans le répertoire \"/backup\".\n"; echo "

\n"; echo "

\n"; echo "

\n"; $post_max_size=ini_get('post_max_size'); $upload_max_filesize=ini_get('upload_max_filesize'); echo "

Attention:

\n"; echo "

Selon la configuration du serveur et la taille du fichier, l'opération de téléchargement vers le répertoire \"/backup\" peut échouer (par exemple si la taille du fichier dépasse la taille maximale autorisée lors des téléchargements).
Si c'est le cas, signalez le problème à l'administrateur du serveur.

\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "
VariableValeur
post_max_size$post_max_size
upload_max_filesize$upload_max_filesize
\n"; echo "

"; echo "

Créer une archive (Zip) de dossiers de Gepi

\n"; echo "Une fois créée, pour télécharger l'archive, rendez-vous à la section \"Fichiers de restauration\" de cette page.
"; echo "

ATTENTION : veillez à supprimer le fichier créé une fois l'archive téléchargée.

"; echo "
\n"; echo "

\n"; echo add_token_field(); echo "
Dossier à sauvegarder :
"; echo "

\n"; $dossier_photos = '../photos/'; //le dossier photos $dossier_documents = '../documents/'; //le dossier documents $dossiers_OK = true; if (isset($GLOBALS['multisite']) AND $GLOBALS['multisite'] == 'y') { //$dossier_photos .=$_COOKIE['RNE']."/"; if((isset($_COOKIE['RNE']))&&($_COOKIE['RNE']!='')) { if(!preg_match('/^[A-Za-z0-9]*$/', $_COOKIE['RNE'])) { echo "

RNE invalide : ".$_COOKIE['RNE']."

\n"; $dossiers_OK = false; } else { $dossier_photos = '../photos/'.$_COOKIE['RNE'].'/'; //le dossier photos $dossier_documents = '../documents/'.$_COOKIE['RNE'].'/'; //le dossier documents } } else { echo "

RNE invalide.

\n"; $dossiers_OK = false; } } echo "

"; if ($dossiers_OK) { echo "
  (volume du dossier 'photos' : ".volume_dir_human($dossier_photos).")"; } echo "
\n"; if(!getSettingAOui('active_module_trombinoscopes')) {echo "Le module Trombinoscopes est inactif, il ne devrait pas y avoir de photos à archiver.
";} echo "\n"; if ($dossiers_OK) { echo "
  (volume du dossier 'documents' : ".volume_dir_human($dossier_documents).", dont ".volume_dir_human($dossier_documents."/archives")." dans le sous-dossier 'archives'"; if (is_dir($dossier_documents."/discipline")) { echo " et ".volume_dir_human($dossier_documents."/discipline")." dans le sous-dossier 'discipline'"; echo " qui ne seront"; } else echo " qui ne sera"; echo " pas inclus dans l'archive)"; } echo "
\n"; if(!getSettingAOui('active_cahiers_texte')) {echo "Le module Cahiers de textes est inactif, il ne devrait pas y avoir de documents à archiver
";} echo "
\n"; echo "\n \n

\n"; echo "

"; echo "

Contrôle des dossiers devant être accessibles en écriture pour la sauvegarde/restauration

\n"; $tab_restriction=array("backup"); test_ecriture_dossier($tab_restriction); echo "
\n"; echo "

Les autres fichiers et dossiers devant être accessibles en écriture peuvent être contrôlés dans la page Configuration serveur"; echo "
\n"; echo " \n"; echo "

\n"; require("../lib/footer.inc.php"); ?>