2012/04/17 CentOS5.5





rsyslogモジュールommailの時刻ズレに対処する


rsyslogで、特定の文字列を含むsyslogが流れてきたらメールを送信するモジュール「ommail」ですが、一点気になる点があります。
通常使ってるとあまり気づかないのですが、「標準時でメールを送信する」という問題です。

ommailはメール送信時に、明示的に「UT(ユニバーサルタイム)」を指定して送信します。
そのためDateヘッダを解釈するメーラを使用すると、メールの送信日時が9時間ズレて表示されます。
(つまり18時に発生したメールは送信時間9時と表示されます)
なお送信日時を「最初のReceived」を参照しているOutlookなどのメーラや、そもそも送信時間が表示されない携帯メールではこれらの問題は無視されます。

ommailが送ってくるメールDate行
 Date: Sun, 9 Sep 2011 07:30:45 UT
 あるいは
 Date: Sun, 9 Sep 2011 07:30:45 +0000

期待したいメールDate行
 Date: Sun, 9 Sep 2011 16:30:45 +0900

なにが困るのかというと、メールをソートしたときに時系列順に並ばないことです。

ソースコードを修正する

この部分はommailのソースコード内で静的に記述されているため、ソースコードを修正する以外対処はありません。
ソースコード修正としては一番簡単な部類に入るでしょう。
インストールする前なら、あらかじめ修正しておけば意識せず済みます。
インストールした後なら、コンパイル後、生成されたモジュールを手作業で入れ替えるのが簡単でしょう。

まずはソースコードを眺めます。
ommailはpluginディレクトリの下にあります。

#vi (ソースDir)/plugins/ommail/ommail.c

Date行がメール送信、つまりSMTPのシーケンスで行われていることは容易に想像できるので、HELOを検索してみましょう。
すると、「sendSMTP」という関数の中にHELO文字を見つけられました。

ここがメール送信の実体であることは間違いありません。

さらに見ていくと、いかにもメールの送信時間を設定してそうなmkSMTPTimestampという関数があります。

(ちなみに画面上部に「DATA」という文字が見えますが、「Date」と勘違いしてはいけません。DATAは本文部分です)

で呼び出されているmkSMTPTimestampという関数を検索してみると、ありました。

Date行とさらに問題となる「UT」の文字が明示的に記述されています。
ここをJSTに書き換えてもいいのですが、そもそもDate行など組み込まなくともメール送信に実害はありません。

mkSMTPTimestamp関数の呼び出しを、丸ごとコメントアウトします。

始まりを「/*」で、終わりを「*/」で括ります。

未インストール時なら、後は普通にインストールします。
rsyslogをインストールする


すでにインストール済みの場合は、モジュールのみ入れ替えます。
コンパイル済み情報がある場合があるので「make clean」を実施してからmakeします。

#make clean
#make

コンパイルされたファイルはommailディレクトリの「.(ドット)libs」の下に生成されます。

#service rsyslog stop
#cd (ソースコードdir)/plugin/ommail/.libs/
#cp ommail.so /usr/local/lib/rsyslog/
#cp ommail.la /usr/local/lib/rsyslog/
#service rsyslog start

これでメールの送信時間が日本時間に(というか送信メールサーバのローカル時間に)なります。
というかなぜUTを指定してるのか不明ですが、おそらく作者なりのメールマナーのつもりだったのでしょう。





prev.gif