Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/03/2014, à 02: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, à 22:58)

Hors ligne