1. Objectifs

Souvent quand je suis au taf, j'ai besoin de faire des manipulations concernants des commandes GNU/Linux générales que je manipule depuis mon serveur à Montpellier. Parfois, j'ai besoin d'appeler mon colocataire à Montpellier pour lui demander d'intervenir. Ce qui n'est pas toujours juste. La plupart du temps, je dois redémarrer mon serveur. Le problème est que je n'ai pas souvent l'occasion de me rappeler quels sont les services qui sont actifs et ce qui sont désactivés, vu que mon serveur gère aussi bien par iptables le réseau interne à mon appartement que le réseau entrant depuis l'extérieur.

Aussi depuis quelques jours, je travaille sur une notification d'envoi de mails me rappellant les services importants manipulés par iptables qui sont activés ou désactivés....Par rapport à ce qui existe, on peut faire largement mieux mais ici c'est juste pour faire au plus simple!!!

2. Mise en place

Le principe repose sur l'envoi de mail en utilisant qmail-inject, qui me renverra un message au format HTML avec un titre générique et par un utilisateur info spécifique pour la gestion de l'envoi de ce type de mail. Comme la plupart de mes commandes iptables sont dans /etc/rc.local. On commence donc par définir les fonctions suivantes dans /etc/rc.local

....
....
#======================================[++ Fonctions utilisees ++]=======================================
#
MAIL_NOTIFY="/root/mail_notify.txt";

InitMailToSend(){
        echo "Subject: [DavidGIS.fr] Message de olivia.davidgis.fr" > ${MAIL_NOTIFY};
        echo "Content-Type: text/html" >> ${MAIL_NOTIFY};
        echo "" >> ${MAIL_NOTIFY};
        echo "<html>" >> ${MAIL_NOTIFY};
        echo "<head>" >> ${MAIL_NOTIFY};
        echo "<style type='text/css'>" >> ${MAIL_NOTIFY};
        echo "table {border: 5px solid white}" >> ${MAIL_NOTIFY};
        echo "td {border: 5px solid green}" >> ${MAIL_NOTIFY};
        echo "</style>" >> ${MAIL_NOTIFY};
        echo "</head>" >> ${MAIL_NOTIFY};
        echo "<body>" >> ${MAIL_NOTIFY};
        echo "<h1 align='center'>Message du serveur olivia.davidgis.fr</h1>" >> ${MAIL_NOTIFY};
        echo "<center>" >> ${MAIL_NOTIFY};
        echo "<b>+++ Le serveur a redémarré le $(date '+ %Y-%m-%d vers  %H:%M:%S') +++</b><br>" >> ${MAIL_NOTIFY};
        echo "<table>" >> ${MAIL_NOTIFY};
        echo "<tr>" >> ${MAIL_NOTIFY};
        echo "<td style='border: 5px solid black'>" >> ${MAIL_NOTIFY};
        echo "<img src='http://www.davidgis.fr/download/janita.jpg'/>" >> ${MAIL_NOTIFY};
        echo "</td>" >> ${MAIL_NOTIFY};
        echo "<td style='border: 5px solid black'>" >> ${MAIL_NOTIFY};
        echo "<h2>INFOS:</h2>" >> ${MAIL_NOTIFY};
        echo "<table>" >> ${MAIL_NOTIFY};
}

FinalizeMailToSend() {
        echo "</table>" >> ${MAIL_NOTIFY};
        echo "</td>" >> ${MAIL_NOTIFY};
        echo "</tr>" >> ${MAIL_NOTIFY};
        echo "</table>" >> ${MAIL_NOTIFY};
        echo "</body>" >> ${MAIL_NOTIFY};
        echo "</html>" >> ${MAIL_NOTIFY};
}

CorrectInfoMailToSend() {
    echo "<tr><td> $1</td></tr> " >> ${MAIL_NOTIFY};  
}

WarningInfoMailToSend() {
    echo "<tr><td style='border: 5px solid red'>$1!!!</td></tr>" >> ${MAIL_NOTIFY};  
}

InitMailToSend;
# ouverture de port
# 1 := oui
# 0 := non
...
OPEN_PORT_SQUID3=1
OPEN_PORT_P3SCAN=0
...
....
# P3Scan
# Pour appeler SpamAssassin et F-prot (anti-virus)
#
if [ $OPEN_PORT_P3SCAN -eq 1 ]
then
        CorrectInfoMailToSend "Redirection de POP3 pour les mails du reseau vers P3Scan --> Spam (SpamAssassin ) et Virus (F-Prot)"
        iptables -A INPUT -d 82.236.232.184 -p tcp --dport 8110 -j ACCEPT
        for port in pop3 imap3 imap2 imap
        do
                iptables -t nat -A OUTPUT  -p tcp --dport $port -m owner --uid-owner 115 -j ACCEPT
                iptables -t nat -A OUTPUT  -p tcp --dport $port -j REDIRECT --to 8110
                iptables -t nat -A PREROUTING -p tcp -i $INTERFACE_INTERNET --dport $port -j REDIRECT --to 8110
        done
        for port in 110 143 220
        do
                iptables -t nat -A PREROUTING -i $INTERFACE_LAN -s 192.168.2.1/10 -p tcp --dport $port -j DNAT --to-destination 192.168.2.1:8110
                iptables -t nat -A PREROUTING -i $INTERFACE_INTERNET -d 192.168.2.0/24 -p tcp --dport $port -j REDIRECT --to-port 8110
        done
else
        WarningInfoMailToSend "P3Scan est inactif!!!"
fi

....
....
#================================================================
# Notification par mail du redémarrage du serveur!
#===============================================================

FinalizeMailToSend;
cat ${MAIL_NOTIFY} | QMAILUSER=info /var/qmail/bin/qmail-inject davidtecher@yahoo.fr

3. Création de l'utilisateur info pour la notification de mail

C'est maintenant que les smbldap-qmail-tools rentrent en action...

On commence par créer l'utisateur info grâce à smbldap-useradd. On se connecte ensuite en tant que info puis on se déconnecte!

root@olivia:~# smbldap-useradd -a -s /bin/bash -c "Infos.DavidGIS.FR" -m -P info
Changing UNIX and samba passwords for info
New password: 
Retype new password: 
root@olivia:~# su info
info@olivia:/root$ exit

Maintenant on crée la boîte aux lettres

root@olivia:~# smbldap-qmail-useradd -A active  -m info@davidgis.fr -H davidgis.fr -M nolocal \
-D ldapwithprog -P /var/qmail/bin/spamcheck.sh -S /home/user/info/Maildir -c 0 -q 0 -s 0  info
Use of uninitialized value in concatenation (.) or string at /usr/local/sbin/smbldap-qmail-useradd line 136.

Un premier envoi de mail pour crée le répertoire Maildir ne donne rien

root@olivia:~# echo test|/var/qmail/bin/qmail-inject info
root@olivia:~# tail -f /service/qmail/log/main/current |tai64nlocal 
2008-11-29 00:23:16.328211500 status: local 1/10 remote 0/20
2008-11-29 00:23:22.477099500 delivery 3: success: 1227914606.M542633P13934.olivia/did_0+0+1/
2008-11-29 00:23:22.477104500 status: local 0/10 remote 0/20
2008-11-29 00:23:22.477106500 end msg 11748467
2008-11-29 00:26:22.141431500 new msg 11748589
2008-11-29 00:26:22.141590500 info msg 11748589: bytes 216 from  qp 15311 uid 0
2008-11-29 00:26:22.145000500 starting delivery 4: msg 11748589 to local info@davidgis.fr
2008-11-29 00:26:22.145100500 status: local 1/10 remote 0/20
2008-11-29 00:26:26.156750500 delivery 4: deferral: safecat:_fatal:_could_not_stat_directory:_file_does_not_exist/
2008-11-29 00:26:26.156754500 status: local 0/10 remote 0/20

root@olivia:~# ls /home/user/info/.
./             ../            .bash_history  .bash_logout   .bashrc        .profile       .pyzor/        .spamassassin/

Il est nécessaire de se connecter une première fois sous Horde pour créer le répertoire comme l'atteste ensuite le log de qmail

root@olivia:~# echo test|/var/qmail/bin/qmail-inject info
root@olivia:~# tail -f /service/qmail/log/main/current |tai64nlocal 
2008-11-29 00:26:26.156750500 delivery 4: deferral: safecat:_fatal:_could_not_stat_directory:_file_does_not_exist/
2008-11-29 00:26:26.156754500 status: local 0/10 remote 0/20
2008-11-29 00:28:03.159003500 starting delivery 5: msg 11748589 to local info@davidgis.fr
2008-11-29 00:28:03.159008500 status: local 1/10 remote 0/20
2008-11-29 00:28:05.931564500 delivery 5: deferral: safecat:_fatal:_could_not_stat_directory:_file_does_not_exist/
2008-11-29 00:28:05.931568500 status: local 0/10 remote 0/20
2008-11-29 00:28:57.518062500 new msg 11748467
2008-11-29 00:28:57.518066500 info msg 11748467: bytes 216 from  qp 15366 uid 0
2008-11-29 00:28:57.523103500 starting delivery 6: msg 11748467 to local info@davidgis.fr
2008-11-29 00:28:57.523107500 status: local 1/10 remote 0/20
2008-11-29 00:29:00.398939500 delivery 6: success: 1227914947.M551504P15376.olivia/did_0+0+1/
2008-11-29 00:29:00.398943500 status: local 0/10 remote 0/20
2008-11-29 00:29:00.398944500 end msg 11748467

root@olivia:~# ls /home/user/info/
Maildir

4. Tests

Dans la nuit de vendredi à samedi, j'ai donc redémarré mon serveur et attendu le mail dans ma boîte aux lettres


Fig 1. Réception du mail suite au redémarrage du serveur.

Voici le résumé comme attendu avec comme toujours une image de Jana pour égayer le mail


Fig 2. Résumé suite au redémarrage du serveur (vert: ce qui est actif/rouge: ce qui est inactif).