Retour


Garder un historique des données de Spamassassin

Présentation

Il s'agit de mon pense-bête pour la mise en place de quelques scripts permettant de connaître :

Prérequis

Bien entendu il faut avoir un démon spamd mais celui-ci doit avoir son fichier log à lui.
Dans notre cas ça sera :
/var/log/spamassassin/spamd.log
Pour avoir ce comportement il suffit de modifier le fichier de configuration /etc/default/spamassassin en faisant apparaître l'option -s /var/log/spamassassin/spamd.log dans la ligne :
OPTIONS="--create-prefs --max-children 3 --username spamd --helper-home-dir ${SAHOME} -s /var/log/spamassassin/spamd.log"
Bien entendu la rotation du fichier de log ne se fera plus automatiquement et donc nous la ferons manuellement.

Script d'analyse

Voici le script qui fait tout le boulot. Il n'est pas optimisé du tout, surtout avec les awk | sed | awk tout moches :
#!/bin/sh
# cronspamdata : analyse de log spamassassin et alimente base de donnees

# fichier de bdd
BDD_FILE="/var/log/spamassassin/SpamData.log"
BDD_FILE_BCKP="/var/log/spamassassin/SpamData.log.1"
# les champs de donnees
HEADER_NB_SPAM="NombreSpam="
HEADER_NB_HAM="NombreHam="
HEADER_TEMPS_SPAM="TempsAnalyseSpam="
HEADER_TEMPS_HAM="TempsAnalyseHam="
# et les valeurs associees
NB_SPAM=0
NB_HAM=0
TEMPS_SPAM=0
TEMPS_HAM=0
# le fichier de log
SPAMD_LOG="/var/log/spamassassin/spamd.log"
# les tags du fichier log
SPAM_TAG="result: Y "
HAM_TAG="result: . "

# test de l'existence du fichier
if [ -f $BDD_FILE ]; then
	# sauvegarde et lecture du fichier
	cp $BDD_FILE $BDD_FILE_BCKP
	NB_SPAM=`grep ${HEADER_NB_SPAM} ${BDD_FILE} |  awk 'BEGIN{FS="="}{print $2}'`
	NB_HAM=`grep ${HEADER_NB_HAM} ${BDD_FILE} |  awk 'BEGIN{FS="="}{print $2}'`
	TEMPS_SPAM=`grep ${HEADER_TEMPS_SPAM} ${BDD_FILE} |  awk 'BEGIN{FS="="}{print $2}'`
	TEMPS_HAM=`grep ${HEADER_TEMPS_HAM} ${BDD_FILE} |  awk 'BEGIN{FS="="}{print $2}'`
else
	touch $BDD_FILE
fi

# traitement du log
#nombre de spams
echo "******************************"
echo "*** Analyse du fichier log ***"
TEMP_SPAM=`grep -c "$SPAM_TAG" $SPAMD_LOG`
echo "Nombre de SPAM trouves = ${TEMP_SPAM}"
#nombre de ham
TEMP_HAM=`grep -c "$HAM_TAG" $SPAMD_LOG`
echo "Nombre de HAM trouves = ${TEMP_HAM}"
# calcul du temps passe sur les SPAMS
TEMP_SPAM_TIME=0.0
for DATA in `grep "$SPAM_TAG" $SPAMD_LOG | awk 'BEGIN{FS="scantime="}{print $2}' | sed -e "s/,/ /g" | awk 'BEGIN{OFS="size"}{print $1}'`
	do TEMP_SPAM_TIME=`echo "scale=2; $TEMP_SPAM_TIME+$DATA" | bc`
done
echo "Temps passe sur les SPAMs = ${TEMP_SPAM_TIME}"
# calcul du temps passe sur les HAM
TEMP_HAM_TIME=0.0
for DATA in `grep "$HAM_TAG" $SPAMD_LOG | awk 'BEGIN{FS="scantime="}{print $2}' | sed -e "s/,/ /g" | awk 'BEGIN{OFS="size"}{print $1}'`
	do TEMP_HAM_TIME=`echo "scale=2; $TEMP_HAM_TIME+$DATA" | bc`
done
echo "Temps passe sur les HAMs = ${TEMP_HAM_TIME}"
echo "*** Analyse globale ***"
NB_SPAM=`expr $NB_SPAM + $TEMP_SPAM`
echo "Nombre total de SPAMs trouves : ${NB_SPAM}"
NB_HAM=`expr $NB_HAM + $TEMP_HAM`
echo "Nombre total de SPAMs trouves : ${NB_HAM}"
TEMPS_SPAM=`echo "scale=2; $TEMP_SPAM_TIME+$TEMPS_SPAM" | bc `
echo "Temps total passe sur les SPAMs : ${TEMPS_SPAM}"
TEMPS_HAM=`echo "scale=2; $TEMP_HAM_TIME+$TEMPS_HAM" | bc `
echo "Temps total passe sur les HAMs : ${TEMPS_HAM}"
echo "******************************"
# sauvegarde dans le fichier
echo "# SpamData.log" > $BDD_FILE
echo "# Fichier de donnees statistiques pour spamassassin" >> $BDD_FILE
echo "${HEADER_NB_SPAM}${NB_SPAM}" >> $BDD_FILE
echo "${HEADER_NB_HAM}${NB_HAM}" >> $BDD_FILE
echo "${HEADER_TEMPS_SPAM}${TEMPS_SPAM}" >> $BDD_FILE
echo "${HEADER_TEMPS_HAM}${TEMPS_HAM}" >> $BDD_FILE
Ce script a besoin d'un fichier pour sauvegarder ses données. Ici ça sera /var/log/spamassassin/SpamData.log.
Au lancement le script lit les données du fichier de sauvegarde où le crée s'il n'existe pas.
Une fois les données lues le fichier est sauvegardé dans /var/log/spamassassin/SpamData.log.1.
Le fichier de log est alors scanné en réalisant les tâches suivantes : Au final le cumul avec les données sauvegardées est calculé et un nouveau SpamData.log est écrit. D'où la sauvegarde en début d'exécution, on ne sait jamais ce qu'il peut se passer.

Mise en place

Ce script est prévu pour être lancé en tâche de cron, juste avant la rotation du fichier log.
Le petit script suivant s'occupe de tout ça, il s'appelle rotanaspam.
#!/bin/sh
# rotanaspam : analyse et rotation des logs spamd

# analyse - le script plus haut
/usr/local/bin/cronspamdata
# rotation des logs
/usr/sbin/logrotate -f /etc/default/spam_rotate
Avec le fichier de config de logrotate spam_rotate :
/var/log/spamassassin/spamd.log
{
	daily
	rotate 7
	compress
	missingok
	delaycompress
	postrotate
		/etc/init.d/spamassassin restart > /dev/null
	endscript
}
Voilà, maintenant un petit cat /var/log/spamassassin/SpamData.log dans le terminal vous donne
# SpamData.log
# Fichier de donnees statistiques pour spamassassin
NombreSpam=42
NombreHam=4242
TempsAnalyseSpam=420.4
TempsAnalyseHam=4242.4
Si vous avez configuré votre tâche de con comme suit, à 6h40 par exemple :
# m h  dom mon dow   command
40 6 * * * /usr/local/bin/rotanaspam
Le dépositaire des mails système ou root recevra un petit mail lui résumant la situation sous la forme
******************************
*** Analyse du fichier log ***
Nombre de SPAM trouves = 2
Nombre de HAM trouves = 27
Temps passe sur les SPAMs = 16.6
Temps passe sur les HAMs = 176.2
*** Analyse globale ***
Nombre total de SPAMs trouves : 13
Nombre total de SPAMs trouves : 490
Temps total passe sur les SPAMs : 112.6
Temps total passe sur les HAMs : 3528.5
******************************

Un graphique d'historique

Pour aller plus loin on peut se fendre d'une historisation du nombre de spams détectés chaque jour et en tirer un graphique.
Dans le script cronspamdata rajouter la ligne suivante à la fin
echo "${TEMP_SPAM}" >> /var/log/spamassassin/SpamHistory.dat
Puis installez gnuplot et créez lui un fichier de commande /usr/local/bin/commandes.txt avec
# passage de la sortie en fichier png
set terminal png
# chemin vers le fichier a generer
set output '/home/user/data/spams.png'
# les noms des axes et le titre
set xlabel 'jours'
set ylabel 'spams'
set title 'Historique des Spams'
# generation du graph
plot '/var/log/spamassassin/SpamHistory.dat' with lines
exit
Maintenant il ne vous reste plus qu'à rajouter la ligne suivante dans le script d'analyse et rotation des logs rotanaspam
gnuplot /usr/local/bin/commandes.txt
Un graphique sera généré tous les jours, faites-en ce que vous voulez.