Analizzare i log di qmail con qmailanalog


Quanti di voi hanno provato ad intepretare i log dei vari moduli di Qmail sicuramente avranno imparato a loro spese quanto possa essere un lavoro poco gratificante; perdersi in numerose righe del tipo (spezzone di log fittizio non reale):

@40000000433225833b6e1a8c tcpserver: status: 7/30
@40000000433225833b6e2644 tcpserver: pid 26162 from 198.206.24.40
@40000000433225840c85ba04 tcpserver: ok 26162 a.mx.xxx.net:208.114.200.128:25 :198.206.24.40::1521
@40000000423225840c8f0cbc rblsmtpd: 198.206.24.40 pid 26162: 451 We do not accept mail from IP addresses without reverse DNS.
@40000000433225852a9ada4c tcpserver: status: 8/30
@40000000433225852a9ae604 tcpserver: pid 26163 from 195.123.2.227
@40000000433225852aa997bc tcpserver: ok 26163 a.mx.xxx.net:208.114.200.128:25 pixelwww.pixelpower.com:195.123.2.227::4232
@40000000433225852aa9a374 rblsmtpd: 195.123.2.227 pid 26163: 553 Sent mail to honeypot jymyhoey@delete.net on 2013-06-27
@400000004332258538eae27c tcpserver: end 26163 status 0
@400000004332258538eaea4c tcpserver: status: 7/30

Cerchiamo di capire come usare qmailanalog per aiutarci nell’arduo compito della comprensione.

Introduzione:
Il programma qmailanalog ( http://cr.yp.to/qmailanalog.html ) ci permette di analizzare i log di qmail e generare diverse varietà di statistiche:

* overall: quanti messaggi? destinatari? tentativi? etc.

* ddist: quanto spesso, il 50% dei messaggi sono stati consegnati? 90%? 95%? 99%?

* rxdelay: qual’è il miglior ordine dei destinatari per le mailing lists?

* recipients, rhosts: chi sta ricevendo posta? bytes? messaggi? tentativi?

* successes, failures, deferrals: perché? Quanto spesso? Quanto ritardo?

* senders, suids: messaggi? bytes? carico? destinatari? tentativi? ritardi?

E’ provvisto anche di alcuni strumenti che permettono di focalizzare la nostra attenzione su particolari mittenti, destinatari o messaggi.

 

Prerequisiti:

Sceglieremo come piattaforma per la simulazione dell’installazione la distribuzione Centos 5.4 con il server di posta Qmail già configurato e funzionante a bordo.

Installazione:

Prima di iniziare è bene premettere che i nomi e le versioni dei vari pacchetti/librerie utilizzate qui di seguito possono variare col tempo e quindi dovrete verificarne l’attendibilità di volta in volta.

Cominciamo con l’installazione di alcune librerie:

yum install sharutils unzip perl-suidperl

Installiamo ora il pacchetto tai64nfrac; posizionatevi in una directory di appoggio per le nostre installazioni e dalla shell dei comandi digitiamo in sequenza:

wget http://archives.eyrie.org/software/system/tai64nfrac-1.4.tar.gz
tar -zxvf tai64nfrac-1.4.tar.gz
cd tai64nfrac-1.4
make
make install

Proseguiamo installando i vari pacchetti di monitoraggio:

wget http://cr.yp.to/software/qmailanalog-0.70.tar.gz
tar zxvf qmailanalog-0.70.tar.gz
cd qmailanalog-0.70
wget http://djbware.csi.hu/patches/qmailanalog-0.70.errno.patch
patch < qmailanalog-0.70.errno.patch
make && make setup check
wget http://untroubled.org/qlogtools/qlogtools-3.1.tar.gz
tar zxvf qlogtools-3.1.tar.gz
cd qlogtools-3.1
wget http://www.qmailrocks.org/downloads/patches/qlogtools_errno.patch
patch < qlogtools_errno.patch
mkdir /usr/local/man
make
./installer
cd ..
wget http://downloads.sourceforge.net/project/qms-analog/qms-analog/qms-analog-0.4.4/qms-analog-0.4.4.tar.gz?r=http%3A%2F%2Fwww.qms-analog.teel.ws%2F&ts=1369747048&use_mirror=garr
tar xzf qms-analog-0.4.4.tar.gz
cd qms-analog-0.4.4
make all
make install
cp qmailstats /var/qmail/bin/qmailstats
chmod 750 /var/qmail/bin/qmailstats

Test:

Ora che abbiamo installato i vari pacchetti necessari potete variare le email dei destinatari del report con la propria email; per fare tale variazione dovete modificare il file qmailstats con il comando:

vi /var/qmail/bin/qmailstats

Testiamo ora il corretto funzionamento dell’invio del report eseguendo:

/var/qmail/bin/qmailstats

Schedulazione:

Bene, abbiamo il nostro bel report e possiamo schedulare il nostro amato server per inviarci una email con le statistiche di qmailanalog alle 3am di tutti i giorni:

crontab -e
0 3 * * * /var/qmail/bin/qmailstats 1 > /dev/null 2 > /dev/null

Conclusione:

Spero che adesso abbiate una situazione più chiara di quello che combina il vostro server di posta.
Al momento sto rielaborando uno script per rendere una visualizzazione più ottimale ( sencondo i miei criteri ) di alcune statistiche; se qualcuno di voi dovesse esserne interessato, commentate pure questo articolo.

Approfondimento:

Per tutti quelli a cui non piace lo script “/var/qmail/bin/qmailstats” , ho trovato e riadattato ai miei scopi un altro valido sostituto che vi posto nella sua integrità qui di seguito:

#!/usr/bin/python
import os
import string
LOGFILE_PATH = "/var/log/qmail/send/"
CURRENT_LOGFILE = LOGFILE_PATH + "current"
ARCHIVED_CMD = "ls -1 " + LOGFILE_PATH + "@*"
MATCHUP_CMD = "/usr/local/bin/tai64nfrac | /usr/local/qmailanalog/bin/matchup"
WORKFILE_PATH = "/tmp/"
ARCHIVED_PENDING = WORKFILE_PATH + "qmstat.archived.pending"
CURRENT_PENDING = WORKFILE_PATH + "qmstat.current.pending"
CURRENT_MATCHUP = WORKFILE_PATH + "qmstat.current.matchup"
CMDS = [
        [ "Overall Statistics", "/usr/local/qmailanalog/bin/zoverall" ],
        [ "Failures", "/usr/local/qmailanalog/bin/zfailures" ],
        [ "Deferrals", "/usr/local/qmailanalog/bin/zdeferrals" ],
        # sort whines about a broken pipe, so we throw away its errors
        [ "Top Ten Senders", "/usr/local/qmailanalog/bin/zsenders | sort -rk 1 2>/dev/null | head -20" ],
        [ "Top Ten Recipients", "/usr/local/qmailanalog/bin/zrecipients | sort -rk 2 2>/dev/null | head -16" ]
]
def NewerThanArchivedPending( file ):
        if ( os.path.getmtime( ARCHIVED_PENDING ) < os.path.getmtime( file ) ):                 return 1         else:                 return None def UpdateArchivedPending( file ):         os.system( "cat %s %s | %s > /dev/null 5> %s" %
                ( file, ARCHIVED_PENDING, MATCHUP_CMD, ARCHIVED_PENDING ) )
os.chdir( LOGFILE_PATH )
fileCmd = os.popen( ARCHIVED_CMD )
archivedFiles = fileCmd.readlines( )
archivedFiles = map( string.strip, archivedFiles ) # Remove whitespace
archivedFiles.sort( ) # Most recent archived logfile now last element
fileCmd.close( )
if os.path.exists( ARCHIVED_PENDING ):
        # Make sure pending contains all archived logs
        # Note that archived logs are in order, since we sorted the list above
        map( UpdateArchivedPending,
                filter( NewerThanArchivedPending, archivedFiles ) )
else:
        # Regenerate pending file from archived logs
        # (assumes archived logs are complete)
        map( UpdateArchivedPending, archivedFiles )
os.system( "cat %s %s | %s > %s 5> %s" %
        ( ARCHIVED_PENDING, CURRENT_LOGFILE, MATCHUP_CMD,
                CURRENT_MATCHUP, CURRENT_PENDING ) )
for cmd in CMDS:
        # Print heading
        print "***************************************************************"
        print cmd[0]
        print "----------------"
        # Print command output
        cmdFile = os.popen( "cat %s | %s" % ( CURRENT_MATCHUP, cmd[1] ) )
        cmdOutput = cmdFile.readlines( )
        cmdFile.close( )
        print string.join( cmdOutput )

 

Se vi piace come mostra le varie statistiche non vi resta che schedularlo per inviarvele per email con un comando simile a questo:

0 8 * * * /script/qmail-stats.py | mail -s "Log Qmail " vostraemail@vostrodominio.it

Buona lettura.

 

[Voti: 4    Media Voto: 8.5/5]
Scritto da Alessandro Consorti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *