PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mail.log als HTML-Tabelle



marcdevil
06.12.07, 15:24
Hi

kennt jemand ein Tool, das die mail.log eines postfix in eine HTML-Tabelle umwandelt?
Ich bräuchte das für meine Kollegen, damit sie selbst nachsehen können warum/ob eine Mail nicht raus gegangen ist.
Das sind die Felder, die ich in der mail.log in mehrere Zeilen verteilt sehen kann und in der HTML Datei in einer Zeile sehen möchte:


-------------------------------------------------------------------------------------------
| Zeit | Vorgangsnummer | von | an | status | Kommentar |
| Dec 6 09:38:07 | C996949008E: | foo@bla.org | bla@mail.net | sent | 250 Thanks |
-------------------------------------------------------------------------------------------
bei 550er Fehlern soll dann der hintergrund rot, bei 250er grün und bei allen anderen gelb.

ciao

Huhn Hur Tu
06.12.07, 16:38
Warum nicht webmin?

Gruss Stefan

marcdevil
06.12.07, 17:55
das maillog für webmin sieht nach reiner statistik aus, ich benötige detailierte Infos zu jedem Vorgang.

hier mal was schnell in bash gebastelt:

if [[ $1 != '' ]] ; then
log=$1
else
log=/var/log/mail.log
fi

echo '<html>'
echo '<body>'
echo '<H2>mail.log</H2>'
echo 'letze Aktualisierung:'$(date)
echo '<table border="1">'
echo '<tr>'
echo '<th>Zeitpunkt</th><th>Vorgangsnr.</th><th>IP</th><th>SMTPAuth</th><th>von</th><th>an</th><th>status</th><th>Kommentar</th>'
echo '</tr>'

for i in $(grep 'to=<' $log| awk '{print $6}' | grep [A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]: | sort | uniq
all=$(grep $i $log)
an=$(echo $all | grep 'to=' | sed -e 's#.*to=<##' -e 's#>.*##' | cut -b 0-50 )
if [[ $an != postmaster ]] ; then
if [[ $an != "" ]] ; then
zeit=$(echo $all | head -1 | awk '{print $1" "$2" "$3}')
von=$(echo $all | grep 'from=' | grep -v 'from=<>' | sed -e 's#.*from=<\([a-zA-Z0-9._-]*@[a-zA-Z0-9._-]*\)>.*#\1#' | cut -b 0-50 )
kommentar=$(echo $all | grep 'status=' | sed -e 's#.*status=##' -e 's#(##' -e 's#).*##' )
status=$(echo $kommentar | sed -e 's#\ .*##')
warning=$(echo $all | grep warning | grep -v header | sed -e 's#.*warning##')
ip=$(echo $all | grep client | sed -e 's#.*client=[A-Za-z0-9._-]*\[\([^]]*\)\].*#\1#' )
username=$(echo $all | grep sasl_username | sed -e 's#.*sasl_username=\([A-Za-z0-9._-]*\).*#\1#' )
fi
fi

if [[ $status == sent ]] ; then
col="#00ff00"
elif [[ $warning != "" ]] ; then
col="#ff0000"
elif [[ $status == deferred ]] ; then
col="#ff0000"
elif [[ $status == bounced ]] ; then
col="#ff0000"
else
col="#ffff00"
fi


if [[ $an != postmaster ]] ; then
if [[ $an != "" ]] ; then
echo '<tr bgcolor="'"$col"'"><td>'"$zeit"'</td><td>'"$i"'</td><td>'"$ip"'</td><td>'"$username"'</td><td>'"$von"'</td><td>'"$an"'</td><td>'"$status"'</td><td>
fi
fi
done

echo '</table>'
echo '</body>'
echo '</html>'

ultralahm und statisches HTML -> keine sortierung/fiilter :(

marcdevil
07.12.07, 10:49
kann jemand perl?
kann Perl nur zeilenweise, oder auch global parsen, grepen, sortieren und ausschneiden?

marce
07.12.07, 10:52
Sinnvoll wäre in dem Fall glaube ich, das Maillog nicht als Datei zu halten (wird größer und damit langsamer) sondern es per syslog in eine MySQL zu schicken - die kannst Du dann recht bequem nach User, Datum oder was auch immer durchsuchen...

Der Aufwand dafür dürfte nur minimal größer sein als das Parsen der Textdatei...

marcdevil
07.12.07, 11:35
aber seperieren muss ich die Felder (to, from, qid, status, ...) dennoch, oder "erkennt" syslog diese?

marce
07.12.07, 11:38
da bin ich momentan überfragt... *GelbenZettelanMonitorkleb*

Quick'n'Dirty-Workarround wäre dann, Syslog per Pipe in Script, welches den Input zerlegt und in die DB jagt...