SendmailAnalyzer
昨年ちゃんと解析してくれないという報告をかいたSendmailAnalyzer。すこしデバッグして原因がわかりました。
ログを実際に解析する関数がparse_sendmailってところで、16通りの正規表現でいろいろと解析しています。この関数が受け取る引数は3つ。
my ($date,$time,$host,$str) = @_;
この$strっていうのが実際のログ部分で、これに対して正規表現でマッチさせる。私が管理している機器が吐き出すsendmailのログをSendmailAnalyzerに食わせると、この関数にわたってくる$strはこんなの。
ID 801593 mail.info mxxxxxx000880: from=<hogehoge@hoge.gr>, size=576, class=0, nrcpts=1, msgid=<200801041810.m04IAWMx4856372@hoge.hoge.co.jp>, proto=ESMTP, daemon=MTA, relay=XX.XXX.XX.XXX
parse_sendmail関数に書かれている正規表現を見ると、例えばこんなの。
if ($str =~ m#^([^:\s]+): SYSERR[^:]+: (.*)# ) { $SYSERR{$host}{$1}{date} = $date . $time; $SYSERR{$host}{$1}{message} = $2; # Parse virus found by clamav-milter }
$1は多分メールのIDで、$2がメッセージ。とすると、parse_sendmailにわたってくる$strのうち
ID 801593 mail.info mxxxxxx000880: from=
, size=576, class=0, nrcpts=1, msgid=<200801041810.m04IAWMx4856372@hoge.hoge.co.jp>, proto=ESMTP, daemon=MTA, relay=XX.XXX.XX.XXX
赤字部分が余計みたい。
じゃぁ消しちまえってことでparse_sendmailの最初にこんなコードを挿入。
$str =~ s#ID \d+ mail\.[^:\s]+ ## ;
これで解析を実行。
/usr/local/bin/SendmailAnalyzer.pl -d -i -b -f -l /var/log/syslog
ちゃんと解析されました。