FTPMonit – Monitoring FTP comme Nagios en PHP

Ci-dessous un script de monitoring FTP permettant de pouvoir superviser n’importe quel serveur FTP .  Celui-ci ce veux autonome en cas d’un échec détecté, permettant de pouvoir exécuter des commandes PHP CLI avec exec() par exemple .

Celui-ci nécessite :

– Création d’un dossier :

mkdir -p /home/automate/ftpmonit/alerte
chmod o+x /home/automate/ftpmonit/alerte

– Création d’un fichier  connect.txt dans /home/automate/ftpmonit du format suivant :

<SERVEUR>|<UTILISATEUR>|<PASSWORD>

– Copie du code suivant dans le fichier : /home/automate/ftpmonit/monit.php

– Création d’un cron pour qui soit répétitif ( http://fr.wikipedia.org/wiki/Crontab )

 

<?php
function restore($user,$server){


$file = "/home/automate/ftpmonit/alerte/$user.$server.txt";
$num = file_get_contents($file);
$numc = trim($num)+1;
file_put_contents($file,$numc);

if ($numc > 2 ){

if ($numc < 4 ){
        echo "Trop de tentative : echec des relances\n";
        $daten = date("d/m/Y H:i:s");
        $message = "Panne du serveur : $user@$server a $daten \n ECHEC DES 3 TENTATIVES :  \n\n Status : en attente d'une OPERATION MANUELLE";

                mail("< VOTRE EMAIL >","[URGENT ALERTE FTP : $user]",$message,"From:< VOTRE EMAIL >");

}else{
        echo "Trop de tentative - Message deja effectif\n";
}

}else{

    < VOS EXÉCUTIONS >

}



}

function alerte($user,$server){

$file = "/home/automate/ftpmonit/alerte/$user.$server.txt";

        if (! file_exists($file)){
                file_put_contents($file,"ALERTE");
                $daten = date("d/m/Y H:i:s");
                $message = "Panne du serveur : $user@$server a $daten \n\n Status : en attente d'un RECOVERY";

                mail("< VOTRE EMAIL >","[ALERTE FTP : $user]",$message,"From:< VOTRE EMAIL >");

                restore($user,$server);
        }else{

                echo "\nFile Lock d<E9>ja present pour $user \n";

                restore($user,$server);

        }


}

function recovery($user,$server){

$file = "/home/automate/ftpmonit/alerte/$user.$server.txt";

        if (file_exists($file)){

                unlink($file);
                $daten = date("d/m/Y H:i:s");
                $message = "Restauration du serveur : $user@$server a $daten";
                mail("< VOTRE EMAIL >","[RECOVERY FTP : $user]",$message,"From:< VOTRE EMAIL >");


        }


}

// Mise en place d'une connexion basique

$lines = file('/home/automate/ftpmonit/connect.txt');
/*On parcourt le tableau $lines et on affiche le contenu de chaque ligne pr<E9>c<E9>d<E9>e de son num<E9>ro*/
foreach ($lines as $lineContent)
{

list($ftpd,$user,$passwd)=explode("|",$lineContent);

$ftp_server = $ftpd;
$ftp_user = $user;
$ftp_pass = $passwd;

echo "CONNEXION : $ftpd - AVEC $user \n";


if (@ftp_connect(trim($ftpd))){

$conn_id = @ftp_connect(trim($ftpd)) or die("Couldn't connect to $ftp_server");

}else{
echo "\nEchec de connexion $ftpd\n";
$no = 1;
alerte($ftpd,$user);


}

if ($no != 1){
// Tentative d'identification
if (@ftp_login($conn_id, trim($ftp_user), trim($passwd))) {

echo "OK";

$file = "/home/automate/ftpmonit/alerte/$ftp_user.$ftp_server.txt";

   if (file_exists($file)){
                echo " Recovery : $ftp_user@$ftp_server\n";
                recovery($user,$ftpd);
        }else{

                 echo " Connect $ftp_user@$ftp_server\n";

        }

} else {
    echo "NOK $ftp_user\n";
    alerte($user,$ftpd);

}

}

// Fermeture de la connexion
@ftp_close($conn_id);


unset($ftpd);
unset($user);
unset($passwd);
unset($no);

sleep("10");

echo "\n\n=========================================\n\n";

}


?>