#!/usr/bin/php */ /** * Configuration */ # email des destinataires $email_dest = array(dest@domain.com'); # répertoire local de stockage des fichiers de sauvegarde $archives_dir = '/var/archives'; # adresse du serveur FTP $ftp_server = ''; # identifiant du serveur FTP $ftp_user_name = ''; # mot de passe du serveur FTP $ftp_user_pass = ''; /** * 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) { foreach($email_dest as $dest) { mail($dest, $subject, $content); } } /** * 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, $filtre_date) { $handle = fopen($md5_file, "r"); if ($handle !== false) { while (!feof($handle)) { $buffer = fgets($handle, 4096); 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)) { 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) { $connect_string = 'ftp://'; $connect_string .= $ftp_user_name; if (!empty($ftp_user_pass)) { $connect_string .= ':'.$ftp_user_pass; } $connect_string .= '@'.$ftp_server; $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; clearstatcache(); $local_files = getLocalFiles($archives_dir, $date); if(empty($local_files)) { $output .= ' - Fichiers non présents en local (attention : cela peut venir d\'un problème de droit).'."\n"; } else { $output .= ' - Fichiers présents en local :'."\n\n"; $total_size = 0; // affichage de la liste des fichiers avec leur taille et un total global foreach($local_files as $file) { $output .= ' # '.$file['name']; $output .= ' ('.formatBytes($file['size']).')'; $output .= "\n"; $total_size += $file['size']; } $output .= "\n".' # TOTAL : '.formatBytes($total_size)."\n\n"; // 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, $filtre_date); if ($check_md5_ftp === false) { $output .= ' - problème d\'intégrité dans les fichiers transmis sur le serveur FTP'."\n"; } else { $output .= ' - intégrité des fichiers sur le serveur FTP vérifiés.'."\n"; } } // construction du sujet du mail $subject = '['.$host.']'; if ($check_md5_ftp === true) { $subject .= ' backup ok'; } else { $subject .= ' backup ko'; } sendMail($email_dest, $subject, $output); ?>