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

ちゃんと解析されました。