====== Backup Manager ====== ===== Installation ===== apt-get install backup-manager ===== Configuration ===== Tout est déjà très bien décrit sur ce site => http://doc.ubuntu-fr.org/backup-manager Pour automatiser backup-manager, il faut normalement rendre exécutable le fichier **/etc/cron.daily/backup-manager** Bizarrement je n'ai pas ce fichier sur mon serveur, et même si je l'avais, je n'aime pas le cron.daily, on ne sait jamais à quel heure il va lancer notre script.\\ Je préfère configurer le cron système comme suit: Créé ce fichier dans **/etc/cron.d** # /etc/cron.d/backup-manager: exécute backup-manager une fois par jour à 2h du mat' 00 2 * * * root [ -x /usr/sbin/backup-manager ] && /usr/sbin/backup-manager || exit 0 ===== Erreur ===== Il n'est pas rare de voir dans nos log ceci backup-manager[4097]: warning * Creating a default MySQL client configuration file: /root/.backup-manager_my.cnf Ce n'est pas grave mais si comme moi vous ne trouvez ça pas très propre, il suffit de changer un mot dans un fichier. vi /usr/share/backup-manager/backup-methods.sh Allez à la ligne 909 et changez warning "Creating a default MySQL client configuration file: \$mysql_conffile" par info "Creating a default MySQL client configuration file: \$mysql_conffile" Le message n’apparaîtra que si vous configuré le niveau de log sur **info** dans **/etc/backup-manager** export BM_LOGGER_LEVEL="info" ===== Script de control ===== #!/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); ?> --- source : http://franek.chicour.net/post/2009/12/29/Am%C3%A9lioration-du-post-script-de-backup-manager ===== Vérifier l'exécution du script post-command ===== Le script ci-dessus ne semblait pas s'exécuter chez moi et aucun message d'erreur n'apparaissait dans les log même en mode debug. Je vous offre donc cette astuce pour aller plus loin dans la recherche de la panne. Ouvrez le fichier**/usr/share/backup-manager/actions.sh** et ligne 140 remplacez RET=`$BM_POST_BACKUP_COMMAND >/dev/null 2>&1` || RET="false" par RET=`$BM_POST_BACKUP_COMMAND >/tmp/BM_post_command.log 2>&1` || RET="false" Reprogrammé l'exécution de backup-manager (chez moi ça marchait en le lançant en direct mais pas via le cron) J'ai pu constater le message d'erreur suivant sh: sendmail: not found J'ai résolu ce problème en modifiant le **/etc/php5/cli/php.ini** ligne 1050 remplacé sendmail_path = sendmail -t -i par sendmail_path = /usr/sbin/sendmail -t -i Et ça marche ;) Bizarrement sur d'autre serveur, cette ligne sendmail_path est commenté donc pas de problème.