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.