Newsgroup: it.comp.os.linux.software
Titolo: estrapolazione dati dai log di postfix

Salve,
esiste un software che, dato un indirizzo mittente, mi estrapoli dal
mail.log tutte le righe che riguardano le mail spedite da quell'indirizzo?
Magari compresi anche i giri di amavis che vengono fatti da postfix. :)
Grazie.

 mail.log tutte le righe che riguardano le mail spedite da quell'indirizzo?
Grep?
grep "indirizzo/ /var/log/mail.log
-- 
Luca Villani        NOC, OpenSailing.org
                     Remove "+settanta" in address for e-mail replies
http://www.opensailing.org
 , il primo Portolano collaborativo online

 Grep?
Troppo facile. :)
Purtroppo non basta. Questo e` un esempio:
Jan 29 15:25:36 posta postfix/qmgr[14369]: 8682D5F44F2: from=<MITTENTE>,
size=55087, nrcpt=1 (queue active)
Jan 29 15:25:36 posta amavis[15971]: (15971-01-2) Passed, <MITTENTE> ->
<DESTINATARIO>, Message-ID: <20070129152244.7003.xxx>, Hits: - 
Jan 29 15:25:36 posta postfix/lmtp[16008]: 421725F44F0:
to=<DESTINATARIO>, relay=127.0.0.1[127.0.0.1], delay=124,
status=sent (250 2.6.0 Ok, id=15971-01-2, from MTA: 250 Ok: queued as
8682D5F44F2)
Jan 29 15:25:36 posta postfix/qmgr[14369]: 421725F44F0:
removed Jan 29 15:25:36 posta postfix/smtp[15786]: 8682D5F44F2: host
mxrm.virgilio.it
[62.211.72.33] refused to talk to me: 421 
vsmtp7.tin.it
Service not available - too busy 
Jan 29 15:25:36 posta
postfix/smtp[15786]: 8682D5F44F2: to=<DESTINATARIO>,
relay=
mxrm.virgilio.it
[62.211.72.32], delay=0, status=deferred (host
mxrm.virgilio.it
[62.211.72.32] refused to talk to me: 421 
vsmtp19.tin.it
Service not available - too busy)
Come vedi, l'unico collegamento e' l'id interno di postfix, perche` il
mittente appare solo in due delle cinque righe di cui ho bisogno, e una e`
quella di amavis.
Al limite mi basterebbero la prima e l'ultima, in modo da collegare
mittente, destinatario, data e ora e risultato, ma si puo` fare solo
accomunando gli ID.
Il problema e` che prendere tutti gli ID a mano quando mandi una
newsletter a 15.000 iscritti e` dura... :)
Servirebbe un tool che prende gli id e li collega per estrapolare i dati.

 Servirebbe un tool che prende gli id e li collega per estrapolare i dati.
Se ti fai un banale scriptino che caccia i log su DB, basta una join sul
queue-ID.
L'alternativa è uno script che dia una prima passata al file di log, si
memorizzi tutti i queue-ID in un array, e poi ri-parsi il file estraendo
tutte le righe che hanno un queue-ID nell'array.
Se qualcuno vede altre vie...
-- 
Skull & Bones (ER6n Silver)
Neo:  I know Sendmail!
Morpheus:  Show me.

 tutte le righe che hanno un queue-ID nell'array.
Proprio questo speravo esistesse gia`.
Per ora mi e` capitato con una trentina di destinatari e ho fatto a mano,
ma non vorrei mi ricapitasse con numeri piu` consistenti... :/
In quel caso credo mi scriverei lo script.
Grazie a entrambi per la risposta, comunque. :)
Bye.

 In quel caso credo mi scriverei lo script.
Uhm... buttando giù in quattro righe...
Assumendo che $sender contenga il mittente adeguatamente quotato a prova
di regex, una cosa tipo:
my @mailQueueCodes;
open LogFile, "<$logfile";
while (<LogFile>) {
        if ($_ =~ /postfix\/\w+\[\d+\]: ([0-9A-F]+): from=<$sender>,/){
                push (@mailQueueCodes,$1);
        }
}
close LogFile;
# Unicizza i membri dell'array, potrebbe anche non servire...
my @uniqQueueCodes = keys %{{ map { $_ => 1 } @mailQueueCodes }};
open LogFile, "<$logfile";
while (<LogFile>) {
        if ($_ =~ /postfix\/\w+\[\d+\]: ([0-9A-F]+): /) {
                my $thisQueue = $1;
                my $line = $_;
                foreach  (@mailQueueCodes) {
                        if ( $_ eq $thisQueue ) {
			print $line;
                        }
                }
        }
}
close LogFile;
Nota che
- fa un po' ca*are
- probabilmente la si fa molto più performante (anzi: non ne dubito
  affatto) con un po' di sforzo in più...
- non sono un buon programmatore (il che è la ragione di entrambi i
  punti sopra)


 accomunando gli ID.
grep "postfix/qmgr" /var/log/mail.log | grep  "queue active" | cut 
--fields=3 --delimiter=':' >>risultato.txt
Ovviamente tutto su una riga.
Poi, a partire dall'elendo degli id, ci fai quello che vuoi.


 Uhm... buttando giù in quattro righe...
Che linguaggi brutti che usi... ;)
Purtroppo non capisco quasi niente di Perl, ma ti ringrazio, mi sono
salvato lo script e mi riservo di studiarlo ed eventualmente adattalo in
PHP o Python quando mi servira`.
Grazie anche a Luca, anche se mi pare di capire che il suo script si
limita ad estrarre gli id di tutti i messaggi, ma penso possa essere
adattato anche per filtrare sul mittente.
Bye.

Alessandro Pellizzari ha scritto:

Vedo un piccolo problema: Ti perdi le connect/disconnect (ancora non è stato 
assegnato l'id).
Quando devo girellare per vedere cos'è successo ad un'email affogo nei log..
-- 
Roberto Tagliaferri-Linux user #30785 <-> r.tagliaferri@(forse)
tosnet.it
Lo sai come si chiamano gli abitanti di Santa Giusta?
Gavino Marroccu, Anna Pirastu, Bachisio Mureddu...
		-- Lucio Salis