Salut
Je suis en train de bricoler un tuto sur "Bakup-Manager" et j'aurais besoin d'un coup de main pour une histoire de PHP.
Donc il s'agit d'un script qui se lance en fin de backup pour contrôler le bon déroulement de l'envoi FTP des archives.
( trouvé ici:
http://forum.ubuntu-fr.org/d/0/0 )
C'est le plus évolué que j'ai vu... Soucis quand je le teste, il me retourne une erreur (c'est peut-être pas la seule en plus) et le PHP et moi....
PHP Parse error: syntax error, unexpected 'var' (T_VAR) in /usr/share/scripts-perso/backup-manager-post.php on line 19
Le script en question:
#!/usr/bin/php
<?php
/**
* backup-manager post script :
* - permet de vérifier l'intégrité des fichiers uploadés sur le serveur de sauvegarde
* (comparaison des chaines md5)
* - envoie d'un mail récapitulatif contenant la liste des fichiers et la taille totale utilisée
*
* @references script inspiré de Alsacréation : http://www.alsacreations.com/tuto/lire/618-Sauvegarde-backup-manager.html et @Franek <franek at chicour dot net>
* @author alexandre.laidin
*/
/**
* Configuration
*/
# email des destinataires
$email_dest = array('mail@domaine.tld);
# répertoire local de stockage des fichiers de sauvegarde
$archives_dir = '/var/archives';
# adresse du serveur FTP
$ftp_server = 'ftp.domaine.tld';
# identifiant du serveur FTP
$ftp_user_name = 'user';
# mot de passe du serveur FTP
$ftp_user_pass = '';
$ftp_directory = '';
/**
* Ne pas modifier - ci-dessous
*/
/**
*
* Envoi d'un mail
*
* @param array $email_dest
* @param string $subject
* @param string $content
*/
function sendMail($email_dest, $subject, $content, $headers)
{
foreach($email_dest as $dest)
{
mail($dest, $subject, $content, $headers);
}
}
/**
* Récupère la liste des fichiers présents en local pour une date donnée
* @param $archives_dir string répertoire de stockage des fichiers
* @param $filtre_date string date à filtrer (format YYYYMMDD)
* @return array
*/
function getLocalFiles($archives_dir, $filtre_date)
{
clearstatcache();
$files = array();
foreach (new DirectoryIterator($archives_dir) as $file_info)
{
if($file_info->isDot() || !preg_match('/'.date('Ymd').'/',$file_info->getFileName()))
{
continue;
}
$file['name'] = $file_info->getFilename();
// on utilise cette commande car filesize ne gère pas les fichiers de plus de 2Go.
$file['size'] = exec("stat -c %s '".$file_info->getPathname()."'");
$files[] = $file;
}
sort($files);
return $files;
}
/**
*
* Compare le hachage md5 des fichiers locaux avec les fichiers envoyés
* sur le serveur FTP
* Si le hachage est identique, renvoie true.
* Sinon, renvoie false
*
* @param string $md5_file
* @param string $ftp_server
* @param string $ftp_user_name
* @param string $ftp_user_pass
* @param string $filtre_date
* @return bool
*/
function verifMd5Ftp($md5_file, $ftp_server, $ftp_user_name, $ftp_user_pass, $ftp_directory)
{
$handle = fopen($md5_file, "r");
if ($handle !== false)
{
while (!feof($handle))
{
$buffer = fgets($handle, 4096);
if (!empty($buffer)){
list($md5, $filename) = explode(" ", $buffer);
// pour supprimer /n
$filename = trim($filename);
if (!empty($filename))
{
if ($md5 !== getMd5OverFtp($filename, $ftp_server, $ftp_user_name, $ftp_user_pass, $ftp_directory))
{
fclose($handle);
return false;
}
}
}
}
fclose($handle);
}
else
{
return false;
}
return true;
}
/**
* * Renvoie le hachage md5 d'un fichier présent sur le serveur FTP de sauvegarde
*
* @param string $file fichier dont le md5 doit être calculé
* @param string $ftp_server adresse du serveur FTP de sauvegarde
* @param string $ftp_user_name identifiant de connexion du serveur FTP
* @param string $ftp_user_pass mot de passe de connexion du serveur FTP
* @return string
*/
function getMd5OverFtp($file, $ftp_server, $ftp_user_name, $ftp_user_pass, $ftp_directory)
{
$connect_string = 'ftp://';
$connect_string .= $ftp_user_name;
if (!empty($ftp_user_pass))
{
$connect_string .= ':'.$ftp_user_pass;
}
$connect_string .= '@'.$ftp_server;
$connect_string .= $ftp_directory;
$connect_string .= '/'.$file;
return md5_file($connect_string);
}
/**
* Renvoie la taille du fichier en un format compréhensif
*
* source : http://fr.php.net/manual/en/function.filesize.php (nak5ive at DONT-SPAM-ME dot gmail dot com)
*
* @param int $bytes
* @param int $precision
* @return string
*/
function formatBytes($bytes, $precision = 2)
{
$units = array('B', 'KB', 'MB', 'GB', 'TB');
$bytes = max($bytes, 0);
$pow = floor(($bytes ? log($bytes) : 0) / log(1024));
$pow = min($pow, count($units) - 1);
$bytes /= pow(1024, $pow);
return round($bytes, $precision) . ' ' . $units[$pow];
}
/**
* début du script
*/
$date = date('Ymd');
$host = trim(file_get_contents('/etc/hostname'));
# fichier contenant les chaines md5 de tous les fichiers sauvegardés
$md5_file = $archives_dir.'/'.$host.'-'.$date.'.md5';
$check_md5_ftp = false;
$output = "";
$message_html = "<html><head></head>";
$message_html .= "<style type='text/css'> table{border:solid 1px #777777; border-collapse:collapse; font-family:arial; $
$message_html .= "body{font-family:Arial, Helvetica, sans-serif; font-size:13px;}";
$message_html .= ".info, .success, .warning, .error, .validation {border: 1px solid;margin: 10px 0px;padding:15px 10px 15px 50px;ba$
$message_html .= ".info {color: #00529B;background-color: #BDE5F8;}";
$message_html .= ".success {color: #4F8A10;background-color: #DFF2BF;}";
$message_html .= ".warning {color: #9F6000;background-color: #FEEFB3;}";
$message_html .= ".error {color: #D8000C;background-color: #FFBABA;}";
$message_html .= "</style>";
$message_html.= "<body>";
clearstatcache();
$local_files = getLocalFiles($archives_dir, $date);
$subject = '['.$host.']';
if(empty($local_files))
{
$message_html .= "<div class='error'>Fichiers non présents en local</div>";
$subject .= '- Backup - LOCAL KO';
}
else
{
$subject .= '- Backup - LOCAL OK';
$message_html .= "<div class='info'>Sauvegarde Local effective</div>";
$message_html .= "<table cellspacing='0' cellpadding='3px' rules='rows'>";
$message_html .= "<caption>Détail de la sauvegarde</caption>";
$message_html .= "<thead><tr class='ligne'><th class='colti'>Fichier</th><th>Taille</th></tr></thead>";
$total_size = 0;
// affichage de la liste des fichiers avec leur taille et un total global
foreach($local_files as $file)
{
$message_html .= "<tr><td class='colti'>".$file['name']."</td><td>".formatBytes($file['size'])."</td></tr>";
$total_size += $file['size'];
}
$message_html .= "<tfoot><tr><td>Total :</td><td>".formatBytes($total_size)."</td></tr></tfoot></table>";
$message_html .= "</br></br>";
// lance la vérification md5 des fichiers uploadés sur le serveur FTP
$check_md5_ftp = verifMd5Ftp($md5_file, $ftp_server, $ftp_user_name, $ftp_user_pass, $ftp_directory);
if ($check_md5_ftp === false)
{
$message_html .= "<div class='warning'>Problème d'intégrité des fichiers sur serveur FTP</div>";
$subject .= ' - FTP KO';
}
else
{
$message_html .= "<div class='info'>Intégrité contrôlée des fichiers sur serveur FTP</div>";
$subject .= ' - FTP OK';
}
}
$message_html.= "</body></html>";
$headers = "From: root <>\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=utf8\r\n";
sendMail($email_dest, $subject, $message_html, $headers);
?>
Alors si un talentueux programmeur (on doit bien avoir ça stock sur mondedie !) voulait jeter un œil au truc, ça m’arrangerait bien
Et deuxième chose, le script utilise "sendMail" pour l'envoi, j'aurais bien voulu utiliser Postfix pour être raccord avec les autres tutos donc, pareil si quelqu'un à la soluce pour modifier la chose il est le bienvenu.
Pour le tuto, il faudra être patient, j'en suis qu'à la prise de notes là mais c'est un outil vraiment sympa ! ( le teaser du diable 🆒)
Ex.