迷惑メール対策にて出力される/var/log/auth.logの情報を、集計してWebで参照できるようにしてみました。
<!--
迷惑メール対策したqmailのauth.logをサマリ化して表示する
qmail-spam-control.php
Version:
0.0 Start
0.1 ホワイトリスト救済が0件の際にゼロを表示するように修正
0.2 再試行者の表示は3回以上に。文言も修正
0.3 毎月1~9日は、格納が1つずれるので、それに対応
0.4 配列を宣言するように修正
-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<META http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<LINK REV="MADE" HREF="mailto:webmaster@yamanakake.com">
<LINK rel="INDEX" href="./index.html">
<title>qmail-spam-control</title>
</head>
<body>
<?php
for($n=-1;$n<=7;$n++)
{
if ($n==-1)
{
echo '<H1>'.date('Y/n/d',time()).'の状況(未確定)</H1>'."\n";
$fp = fopen('/var/log/auth.log','r');
}
else
{
echo '<H1>'.date('Y/n/d',time()-($n+1)*24*60*60).'の状況(確定)</H1>'."\n";
$fp = fopen('/var/log/auth.log.'.$n,'r');
}
$counter = array();
$whitelist = array();
$retry = array();
while(!feof($fp))
{
$buffer = explode(' ',fgets($fp));
if ($buffer[1] == '')
{
$bias = 1;
}
else
{
$bias = 0;
}
if ($buffer[6+$bias] == 'qmail-smtpd:')
{
if ($buffer[7+$bias] == 'badremotehost:')
{
$counter[$buffer[10+$bias]] += 1;
$fromserver = $buffer[8+$bias];
$buffer = explode(' ',fgets($fp));
$retry[$fromserver." ".htmlentities($buffer[8+$bias])." ".htmlentities($buffer[10+$bias])] += 1;
}
if ($buffer[7+$bias] == 'goodremotehost:')
{
$whitelist[$buffer[8+$bias]] += 1;
}
}
}
echo '<H2>拒否したリモートホストのパターンと拒否数</H2>'."\n";
echo '<TABLE BORDER="1" SUMMARY="拒否したリモートホストのパターンと拒否数">'."\n";
echo '<TR><TH ABBR="Pattern">パターン</TH><TH ABBR="DenyCount">拒否数</TH></TR>'."\n";
foreach($counter as $patname => $count)
{
echo '<TR><TD>'.$patname.'</TD><TD ALIGN="RIGHT">'.$count.'</TD></TR>'."\n";
}
echo '</TABLE>'."\n";
echo '<H2>ホワイトリストでの救済数</H2>'."\n";
echo '<TABLE BORDER="1" SUMMARY="ホワイトリストでの救済数">'."\n";
echo '<TR><TH ABBR="Pattern">送信元</TH><TH ABBR="OKCount">救済数</TH></TR>'."\n";
foreach($whitelist as $patname => $count)
{
echo '<TR><TD>'.$patname.'</TD><TD ALIGN="RIGHT">'.$count.'</TD></TR>'."\n";
}
echo '</TABLE>';
echo '<H2>3回以上の再試行</H2>'."\n";
echo '<TABLE BORDER="1" SUMMARY="3回以上の再試行">'."\n";
echo '<TR><TH ABBR="Server">送信元</TH><TH ABBR="Mailfrom">差出人</TH><TH ABBR="Reciptto">あて先</TH><TH ABBR="DenyCount">再試行数</TH></TR>'."\n";
$flag = 0;
foreach($retry as $patname => $count)
{
if ($count >= 3)
{
$flag += 1;
$buffer = explode(' ',$patname);
echo '<TR><TD>'.$buffer[0].'</TD><TD>'.$buffer[1].'</TD><TD>'.$buffer[2].'</TD><TD ALIGN="RIGHT">'.$count.'</TD></TR>'."\n";
}
}
if ($flag == 0)
{
echo '<TR><TD COLSPAN="4">なし</TD></TR>'."\n";
}
echo '</TABLE>'."\n";
echo '<BR>'."\n";
}
?>
</body>
</html>


コメントする