#1 Le 26/03/2014, à 01:16
- alexandre.laidin
[SCRIPT] Backup-Manager - Post Script - Contrôle FTP et Mise en Forme
Bonjour,
Pour mon premier post sur le Forum, je vais non pas vous poser une question mais déposer mon script POST de BAckup-Manager. J'ai trop utilisé ce forum sans participer donc pour me racheter le voici.
Vous y trouverez de la mise en forme et un controle des fichiers sur le serveur FTP. Il s'agit d'une amélioration du script que l'on trouve sur le net posté par franek.chicour.net.
#!/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);
?>
Bien à vous
Alex
Dernière modification par alexandre.laidin (Le 27/03/2014, à 21:58)
Hors ligne