SendmailAnalyzerを使う

明け方5時くらいにスパムチェックをしているmimedefangさんがオーバーロードしていて、新しくきたSMTPコネクションを一旦お断りして1時間程度の遅延が起きるという現象が発生。Sendmailのログをチェックしてみることに。とはいえ、/var/log/syslogのログをざっと眺めていてもよくわからんのでツールに頼ることにする。

Google先生に聞くと、SendmailのログをCLFに変換してくれるスクリプトと、メールのログをそのまま解析してくれるツールなんかがあるみたい。前者は前にも試したことがあるので、今回は後者のうち、SendmailAnalyzerにトライ。

インストール前に必要なPerlモジュールは以下の通り。GDにはlibgdが必要だったり、libpngやlibjpeg,FreeType2が必要だったりします。グラフなんかいらんってことならGD以下はなくても動作します。

  • MIME::Base64;
  • MIME::QuotedPrint;
  • Math::Trig
  • GD
  • GD::TextUtil
  • GD::Graph
  • GD::Graph3D

ブツをダウンロードしてくる。

http://www.samse.fr/GPL/SendmailAnalyzer/からダウンロードする。

ブツを展開する。

tarballを展開して、展開物の中のcgi-bin以下をapachecgi-bin以下へコピーします。

$ /usr/local/bin/tar -zxvf  SendmailAnalyzer-3.0.tar.gz
$ cd SendmailAnalyzer
# cp cgi-bin/* /usr/local/apache2/cgi-bin

SendmailAnalyzer.confを用意する。

展開物のなかに2つのサンプルファイルがあるので、適当なものを/etcへコピーする。

# cp SendmailAnalyzer.conf.gw /etc/SendmailAnalyzer.conf

SendmailAnalyzer.plも適当なところへ入れる。

実際に解析するプログラムも適当なところへ入れてあげる。

# cp SendmailAnalyzer.pl /usr/local/bin

/etc/SendmailAnalyzer.confを適当に編集する

ファイル中のコメントを見ながら適当に編集。メールログの場所とか、言語設定とか、レポートの出力場所とか。私の環境の場合、diffは以下の通り。
ADMINのところ。基本認証を使いたいときはここにユーザ名を指定します。

3c3
< LOG_FILE              /var/log/syslog
---
> LOG_FILE              /var/log/maillog
21c21
< OUT_DIR       /usr/local/apache2/htdocs/SendmailReport
---
> OUT_DIR       /var/www/htdocs/SendmailReport
80c80
< LANG  lang/en_US
---
> LANG  lang/fr_FR
96c96,97
< #ADMIN   admuser
---
> ADMIN   admuser

出力先に指定したディレクトリ(上記の場合、/usr/local/apache2/htdocs/SendmailReport)も忘れずに作っておく。

# mkdir /usr/local/apache2/htdocs/SendmailReport

一発動かしてみる。

早速動かしてみる

# /usr/local/bin/SendmailAnalyzer.pl -i -b -f -l /var/log/syslog

*** SendmailAnalyzer v3.0 (pid:5853) started at Wed Dec 26 10:00:48 2007
#

早速見てみる

適当なブラウザで/cgi-bin/sa_report.plを見る。

最初の画面はこんな感じ。

hereをクリックするとこんなの。

日毎、月毎、それに時間単位での流通量がわかるようです。サイズが全部0になってるな。まだ調整しなくてはいけない箇所があるみたいです。

ついでに

ついでなのでINSTALLのへなちょこ訳を載せておきます。間違いあれば遠慮なく指摘してください。

Sendmail Analyzer v3.0 Installation

                                                          • -

次のようにお好みのディレクトリにtarballを展開するだけです。

     tar xzf SendmailAnalyzer-3.x.tar.gz --directory /usr/local/

そしてコンフィグレーションファイルを/etc/SendmailAnalyzer.confに用意します。

このtarballにはメールゲートウェイ用(SendmailAnalyzer.conf.gw)と、メールハブ用(SendmailAnaluzer.conf.hub)のサンプルコンフィギュレーションファイルが含まれています。

cgi-binディレクトリの中身をCGIロケーションにコピーして、お好みのブラウザからしよう出来るようにします。

CGIスクリプトのsa_report.plからreadできる場所に統計出力用のディレクトリを作成します。

インストール後/etc/SendmailAnalyzerを編集して、コンフィギュレーションディレクティブの set/modify を調整します。詳しい情報については、サンプルコンフィギュレーションファイルのコメントを参照してください。


SendmailAnalyzerの使い方

                                              • -

毎日cronから動かすか、またはリアルタイムでの統計が知りたければバックグラウンドで動かすこともできます。

cronで動かす場合には、こんなコマンドを実行します。

    /usr/local/SendmailAnalyzer/SendmailAnalyzer.pl -i -b -f -l /var/log/maillog

デーモンとしてSendmailAnalyzerを動かすためには、この配布物に含まれている start/stop/restart のスクリプトを使用します。

        /usr/local/SendmailAnalyzer/rc.sendmailanalyzer start

過去のメールログを解析したい場合は、以下のようなコマンドを実行します。

    /usr/local/SendmailAnalyzer/SendmailAnalyzer.pl -i -b -f -l /var/log/maillog.1

統計レポートを見る

                                  • -

解析結果のレポートは、以下のURLから参照できます。

        http://your.domain.dom/cgi-bin/sa_report.pl

デフォルトでは今日の統計が見えます。


出力結果のキャッシュ

                                      • -

CGIからレポートを見るとき、毎回データファイルから統計を計算しています。一日分ならとても早く表示できるでしょうが、月単位、年単位の表示だと、とても遅くなります。なので、キャッシュを有効化すべきでしょう。

キャッシュ作成スクリプトを動かして日毎、月、年毎のPerlデータファイルを作成します。このキャッシュ作成スクリプトコンフィギュレーションファイルに設定した統計レポートの対象ドメイン毎に動作させます。グローバルキャッシュを作成する前に、いつもドメイン毎のキャッシュを作成しなくてはいけません。グローバルキャッシュを作成するとデータファイルはアーカイブされ、データファイルが見えなくなってしまうからです。

アーカイブして今月より古いデータファイルを削除すると、ディスクスペースの削減にもつながります。

crondにSendmailAnalyzerのキャッシュ作成スクリプトを登録します。ドメイン毎が先で、グローバルキャッシュが後です。

10 6 * * * /usr/local/SendmailAnalyzer/sa_cache.pl mailhost firstdomain.dom
20 6 * * * /usr/local/SendmailAnalyzer/sa_cache.pl mailhost seconddomain.dom
30 6 * * * /usr/local/SendmailAnalyzer/sa_cache.pl mailhost

ログのローテートとリアルタイム統計

                                                                  • -

リアルタイム統計が欲しい場合で、メールのログをローテートする設定をしている場合は、ログをローテートするたびにSendmailAnalyzerを再起動する必要があります。
/etc/logrotate.d/sysloファイルを編集して、postrorate部分に以下の行を追加します。

/var/log/cron /var/log/debug /var/log/maillog /var/log/messages /var/log/secure
/var/log/spooler /var/log/syslog {
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2>/dev/null` 2>/dev/null || true
        /usr/local/SendmailAnalyzer/rc.sendmailanalyzer restart >/dev/null 2>&1 || true
    endscript
}

時々スクリプトがちゃんと動作しないことがあります。なので、cronでログローテートのあとにきっちりと再起動させた方がいいかもしれません。