function launchBackup($id_sauvegarde) { global $base_path, $dbh, $PMBuserid, $PMBusername, $msg; if (SESSrights & SAUV_AUTH) { $report = array(); //Recherche des paramètres de la sauvegarde $requete = "select sauv_sauvegarde_nom, sauv_sauvegarde_file_prefix, sauv_sauvegarde_tables, sauv_sauvegarde_lieux, sauv_sauvegarde_users,sauv_sauvegarde_compress,sauv_sauvegarde_compress_command, sauv_sauvegarde_crypt from sauv_sauvegardes where sauv_sauvegarde_id=" . $id_sauvegarde; $resultat = mysql_query($requete, $dbh); $res = mysql_fetch_object($resultat); $liste_users = explode(",", $res->sauv_sauvegarde_users); $access_allow = false; foreach ($liste_users as $user) { if ($user == $PMBuserid) { $access_allow = true; } } if (!$access_allow) { $report[] = "Error : User " . $PMBusername . " don't have permissions"; $result = array("logid" => "", "report" => $report); return $result; // throw new Exception("Error : User ".$PMBusername." don't have permissions"); } //Création du log dans la base de log $log_messages = "Start time : " . date("H:i", time()) . "\r\n"; $report[] = $log_messages; $log_file = $res->sauv_sauvegarde_file_prefix . "_" . date("Y_m_d", time()); $report[] = $log_file; //Recherche si nom de fichier déjà existant $n_version = 0; if (!defined('SAUV_PREFIX')) { define('SAUV_PREFIX', ""); } else { define('SAUV_PREFIX', SAUV_PREFIX . "_"); } $log_file_test = SAUV_PREFIX . $log_file . ".sav"; while (file_exists($base_path . "/admin/backup/backups/" . $log_file_test)) { $n_version++; $log_file_test = $log_file . "_" . $n_version . ".sav"; } $log_file = $log_file_test; $requete = "insert into sauv_log (sauv_log_start_date,sauv_log_file,sauv_log_messages,sauv_log_userid) values(now(),'{$log_file}','{$log_messages}',{$PMBuserid})"; $res_query = mysql_query($requete, $dbh); if (!$res_query) { $report[] = mysql_error(); $result = array("logid" => "", "report" => $report); return $result; } $logid = mysql_insert_id(); //Création du fichier d'export $path_name = $base_path . "/admin/backup/backups/" . $log_file; $fe = @fopen($path_name, "w+"); if (!$fe) { $report[] = stop("The file {$log_file} could not be created", $logid); $result = array("logid" => $logid, "report" => $report); return $result; } fwrite($fe, "#Name : " . $res->sauv_sauvegarde_nom . "\r\n"); fwrite($fe, "#" . $log_messages); fwrite($fe, "#Date : " . date("Y-m-d", time()) . "\r\n"); //Récupération des tables $requete = "select sauv_table_tables from sauv_tables where sauv_table_id in (" . $res->sauv_sauvegarde_tables . ")"; $resultat = mysql_query($requete); if (!$resultat) { $report[] = $requete; $report[] = stop("Tables could not be retrived", $logid); $result = array("logid" => $logid, "report" => $report); return $result; } $tables = array(); while (list($sauv_table_tables) = mysql_fetch_row($resultat)) { $tSauv_table_tables = explode(",", $sauv_table_tables); for ($i = 0; $i < count($tSauv_table_tables); $i++) { $as = array_search($tSauv_table_tables[$i], $tables); if ($as !== null && $as !== false) { // } else { $tables[] = $tSauv_table_tables[$i]; } } } //Export SQL $temp_file = "temp_" . (SAUV_PREFIX != "" ? SAUV_PREFIX . "_" : "") . $res->sauv_sauvegarde_file_prefix . "_" . date("d_m_Y", time()) . ".sql"; $temp_path_name = $base_path . "/admin/backup/backups/" . $temp_file; $ftemp = @fopen($temp_path_name, "w+"); if (!$ftemp) { $report[] = stop("Temporary file for SQL export could not be created", $logid); $result = array("logid" => $logid, "report" => $report); return $result; } //Log de l'entête fwrite($fe, "#Groups : " . $res->sauv_sauvegarde_tables . "\r\n"); fwrite($fe, "#Tables : " . implode(",", $tables) . "\r\n"); //Ecriture du fichier SQL for ($i = 0; $i < count($tables); $i++) { table_dump($tables[$i], $ftemp); } write_log("SQL OK : SQL export is OK", $logid); $report[] = "SQL OK : SQL export is OK"; fclose($ftemp); //Compression éventuelle fwrite($fe, "#Compress : " . $res->sauv_sauvegarde_compress . "\r\n"); if ($res->sauv_sauvegarde_compress == 1) { fwrite($fe, "#Compress commands : " . $res->sauv_sauvegarde_compress_command . "\r\n"); $command = explode(":", $res->sauv_sauvegarde_compress_command); switch ($command[0]) { case 'external': $c_command = str_replace("%s", $temp_path_name, $command[1]); exec($c_command); @unlink($temp_path_name); $temp_pathfile = $temp_path_name . "." . $command[3]; if (!file_exists($temp_path_name)) { $report[] = stop("Compression failed", $logid); $result = array("logid" => $logid, "report" => $report); return $result; } break; case 'internal': $fz = bzopen($temp_path_name . ".bz2", "w"); if (!$fz) { $report[] = stop("Compression failed", $logid); $result = array("logid" => $logid, "report" => $report); return $result; } $ftemp = fopen($temp_path_name, "r"); if (!$ftemp) { $report[] = stop("Compression failed", $logid); $result = array("logid" => $logid, "report" => $report); return $result; } $to_crypt = fread($ftemp, filesize($temp_path_name)); bzwrite($fz, $to_crypt); bzclose($fz); fclose($ftemp); unlink($temp_path_name); $temp_path_name = $temp_path_name . ".bz2"; break; } write_log("Compress OK : Compress is OK", $logid); $report[] = "Compress OK : Compress is OK"; } else { $temp_path_name = $base_path . "/admin/backup/backups/" . $temp_file; } //cryptage ? if ($res->sauv_sauvegarde_crypt == 1) { //Recherche des paramètres de cryptage $requete = "select sauv_sauvegarde_key1, sauv_sauvegarde_key2 from sauv_sauvegardes where sauv_sauvegarde_id=" . $currentSauv; $resultat = mysql_query($requete, $dbh); $res = mysql_fetch_object($resultat); //Ajout du cryptage $fe = @fopen($path_name, "a"); if (!$fe) { $report[] = stop("The file {$path_name} could not be opened", $logid); $result = array("logid" => $logid, "report" => $report); return $result; } fwrite($fe, "#Crypt : 1\r\n"); $ftemp = @fopen($temp_path_name, "r"); if (!$ftemp) { $report[] = stop("Temporary file for SQL export could not be opened for crypting", $logid); $result = array("logid" => $logid, "report" => $report); return $result; } if ($res->sauv_sauvegarde_key1 == "") { $cle1 = $sauvegarde_cle_crypt1; } else { $cle1 = $res->sauv_sauvegarde_key1; } if ($res->sauv_sauvegarde_key2 == "") { $cle2 = $sauvegarde_cle_crypt2; } else { $cle2 = $res->sauv_sauvegarde_key2; } $cr = new Crypt($cle1, $cle2); $to_crypt = fread($ftemp, filesize($temp_path_name)); fclose($ftemp); $ftemp = @fopen($temp_path_name, "w+"); if (!$ftemp) { $report[] = stop("Temporary file for SQL export could not be opened for crypting", $logid); $result = array("logid" => $logid, "report" => $report); return $result; } fwrite($ftemp, $cr->getCrypt("PMBCrypt")); fwrite($ftemp, $cr->getCrypt($to_crypt)); write_log("Crypt OK : Crypting file is OK", $logid); $result[] = "Crypt OK : Crypting file is OK"; fclose($ftemp); // } else { // $result[] = $msg["sauv_misc_end_message"]; } //Succeed - Executer cette requete si le fichier a bien été crée $requete = "update sauv_log set sauv_log_succeed=1 where sauv_log_id=" . $logid; @mysql_query($requete); $fe = @fopen($path_name, "a"); $fsql = @fopen($temp_path_name, "rb"); if (!$fe || !$fsql) { $report[] = stop("Could not create final file", $logid); $result = array("logid" => $logid, "report" => $report); return $result; } //$to_happend=fread($fsql,filesize($temp_file)); //fwrite($fe,"#data-section\r\n".$to_happend); // MaxMan: modified because this error: //Fatal error: Allowed memory size of 8388608 bytes exhausted //(tried to allocate 6495315 bytes) in ///var/www/pmb/admin/sauvegarde/end_save.php on line 52 fwrite($fe, "#data-section\r\n"); do { $to_append = fread($fsql, 8192); if (strlen($to_append) == 0) { break; } fwrite($fe, $to_append); } while (true); fclose($fsql); fclose($fe); unlink($temp_path_name); //Log : Backup complet write_log("Backup complete", $logid); $report[] = "Backup complete"; //Succeed $requete = "update sauv_log set sauv_log_succeed=1 where sauv_log_id=" . $logid; @mysql_query($requete); //Récupération des lieux $requete = "select sauv_sauvegarde_lieux from sauv_sauvegardes where sauv_sauvegarde_id=" . $id_sauvegarde; $resultat = @mysql_query($requete); $lieux = mysql_result($resultat, 0, 0); $tLieux = explode(",", $lieux); //Pour chaque lieu, transférer le fichier for ($i = 0; $i < count($tLieux); $i++) { $requete = "select sauv_lieu_nom,sauv_lieu_url, sauv_lieu_protocol, sauv_lieu_login, sauv_lieu_password, sauv_lieu_host from sauv_lieux where sauv_lieu_id=" . $tLieux[$i]; $resultat = @mysql_query($requete); $res = mysql_fetch_object($resultat); $tfilecopy = explode("/", $path_name); $filecopy = $tfilecopy[count($tfilecopy) - 1]; switch ($res->sauv_lieu_protocol) { //Si protocol = file case "file": if (!copy($path_name, $res->sauv_lieu_url . "/" . $filecopy)) { $report[] = stop("Copy : " . $res->sauv_lieu_nom . " : Failed", $logid); } else { write_log("Copy : " . $res->sauv_lieu_nom . " : Succeed", $logid); $report[] = "Copy : " . $res->sauv_lieu_nom . " : Succeed"; } break; //Si protocol = ftp //Si protocol = ftp case "ftp": $msg_ = ""; //Connexion + passage dans le répertoire concerné $conn_id = connectFtp($res->sauv_lieu_host, $res->sauv_lieu_login, $res->sauv_lieu_password, $res->sauv_lieu_url, $msg_); if ($conn_id == "") { abort_copy("Copy : " . $res->sauv_lieu_nom . " : Failed : " . $msg_, $logid); } else { //Transfert if (!ftp_put($conn_id, $filecopy, $path_name, FTP_BINARY)) { $report[] = stop_copy("Copy : " . $res->sauv_lieu_nom . " : Failed", $logid); $result = array("logid" => $logid, "report" => $report); return $result; } else { write_log("Copy : " . $res->sauv_lieu_nom . " : Succeed", $logid); $report[] = "Copy : " . $res->sauv_lieu_nom . " : Succeed"; } } break; } } $report[] = $msg["sauv_misc_end_message"]; $result = array("logid" => $logid, "report" => $report); return $result; } else { $result = array("logid" => "", "report" => ""); return $result; } }
$tfilecopy = explode("/", $filename); $filecopy = $tfilecopy[count($tfilecopy) - 1]; switch ($res->sauv_lieu_protocol) { //Si protocol = file case "file": if (!copy($filename, $res->sauv_lieu_url . "/" . $filecopy)) { abort("Copy : " . $res->sauv_lieu_nom . " : Failed", $logid); } else { write_log("Copy : " . $res->sauv_lieu_nom . " : Succeed", $logid); } break; //Si protocol = ftp //Si protocol = ftp case "ftp": $msg_ = ""; //Connexion + passage dans le répertoire concerné $conn_id = connectFtp($res->sauv_lieu_host, $res->sauv_lieu_login, $res->sauv_lieu_password, $res->sauv_lieu_url, $msg_); if ($conn_id == "") { abort_copy("Copy : " . $res->sauv_lieu_nom . " : Failed : " . $msg_, $logid); } else { //Transfert if (!ftp_put($conn_id, $filecopy, $filename, FTP_BINARY)) { abort_copy("Copy : " . $res->sauv_lieu_nom . " : Failed", $logid); } else { write_log("Copy : " . $res->sauv_lieu_nom . " : Succeed", $logid); } } break; } echo "<script>self.close();</script>"; echo "</div>";
print '<html><head><link rel=\\"stylesheet\\" type=\\"text/css\\" href=\\"../../styles/$stylesheet; ?>\\"></head><body>'; require_once "{$include_path}/user_error.inc.php"; error_message($msg[11], $msg[12], 1); print '</body></html>'; exit; } if (SESSlang) { $lang = SESSlang; $helpdir = $lang; } // localisation (fichier XML) $messages = new XMLlist("{$include_path}/messages/{$lang}.xml", 0); $messages->analyser(); $msg = $messages->table; require "{$include_path}/templates/common.tpl.php"; header("Content-Type: text/html; charset=" . $charset); print "\n<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'\n 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>\n<html xmlns='http://www.w3.org/1999/xhtml' lang='{$msg['1002']}' charset='" . $charset . "'>\n\t<meta http-equiv='Pragma' content='no-cache'>\n\t\t<meta http-equiv='Cache-Control' content='no-cache'>"; print link_styles($stylesheet); print "\t</head>\n\t<body>"; echo "<center><small><b>" . $msg["sauv_ftp_test_running"] . "</b></small></center>"; echo "<center><img src=\"connect.gif\"></center>"; flush(); $msg_ = ""; if ($chemin == "") { $chemin = "/"; } $conn_id = connectFtp($url, $user, $password, $chemin, $msg_); if ($conn_id != "") { $msg_ = $msg["sauv_ftp_test_succeed"]; } echo "<script>alert(\"{$msg_}\");self.close();</script>";