今回は運用関連。
常駐型プロセスの管理、fcronなど。
常駐型アプリケーション(以下サービスと記述)の起動・停止を制御するプログラム。
これで qmail を制御することにする。
http://cr.yp.to/daemontools.html
インストールは例によって特殊。ソースをインストールする場所まで指定されるので
以下の通りに解凍からやること。
mkdir -p /package chmod 1755 /package cd /package tar zxvf daemontools-0.76.tar.gz cd admin/daemontools-0.76
ここでもソース修正。
src/error.h に以下の一文を追加。
#include <errno.h>
インストールコマンドは以下。
package/install
/service というディレクトリが作成される。
さらに svscanboot が起動され、svscan が起動される。
/service の直下に任意名のディレクトリを作成(ServiceRoot)。
このディレクトリ名がそのままサービス名となる。
ServiceRoot の直下に run というファイルを作成。実行属性を付ける。
例) qmail
% cat /service/qmail-send/run #!/bin/sh exec /var/qmail/rc
もしログを出したい場合は、まず ServiceRoot ディレクトリに sticky bit を立てる。
chmod +t /service/qmail-send/
次に ServiceRoot/log ディレクトリを作成し
その直下に run というファイルを作成して、実行属性を付ける。
例) qmail
% cat /service/qmail-send/log/run #!/bin/sh exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail/main \ -'* status: *' \ -'* starting delivery *' \ -'* delivery * success*' \ -'* delivery * failure*' \ -'* new msg *' \ -'* info msg *' \ -'* end msg *' \ -'* bounce msg *' \ -"* delivery * deferral: Sorry,_I_couldn't_find_any_host_by_that_name*" \ -"* delivery * deferral: Sorry,_I_wasn't_able_to_establish_an_SMTP_*" \ /var/log/qmail/alert \ -'*' \ +'* status: *' \ =status
ログディレクトリの所有者を変更する。
chown qmaill:nofiles /service/qmail-send/log/
各ファイルの属性をまとめると、以下のような感じ。
drwxr-xr-t 4 root root 4096 Jan 23 16:51 /service/qmail-send drwxr-xr-x 3 qmaill nofiles 4096 Jan 23 17:32 /service/qmail-send/log -rwxr-xr-x 1 root root 466 Jan 23 17:31 /service/qmail-send/log/run -rwxr-xr-x 1 root root 29 Jan 23 16:51 /service/qmail-send/run
以下を確認しよう。
これで svscan, svscanboot の順に kill すると、サービスが無事起動する。
/service ディレクトリから以下のコマンドが使える。
現在のサービス一覧稼動状況を見る。
サービスを開始する。
サービスを停止する。
注意点
ディレクトリを作れば自動的にサービスが開始するが、そのときにログディレクトリを まだ作ってなかったりすると上記の方法ではうまくサービスを開始できない。 その場合は前述したように svscan, svscanboot の順に kill する。 これでも駄目だったら、OS をリブートするしかない。 qmail や daemontools は、kill しても kill してもすぐに復活するゾンビのようなプロセス。取り扱いは慎重に。
http://cr.yp.to/ucspi-tcp/install.html
TCP接続部分を制御するプログラム。
今度は珍しくソースを好きな場所に展開してよい(笑)。
お決まりのように、error.h に以下の一文を追加。
#include <errno.h>
そしたらインストール。
make sudo make setup check
実は今までの手順では、SMTP Server はまだ起動していない。
SMTP Serverは「SMTPポートからのパケット受信」「他マシンやメールボックスへのメール転送」機能を持つが
qmail は両者を別々のプロセスで管理している。
理由は、ポートは外部に公開する事になるので、非常に高いセキュリティが要求される為。
なるべくならこのプログラムは他と分けておいた方がいい。
qmail が今まで一度もセキュリティホールが発見されていないのは、作者のこういった意思があるから。
では早速SMTPポートを開放しよう。
と、その前に。
どうやら SuSEのデフォルトインストールでは Postfix が入っていて
こいつが SMTP ポートを占拠しているらしい。消してしまおう。
sudo zypper remove postfix
なんか exim 勝手に入れられたが、まぁよしとするか。
あとは qmail-smtpd を起動するだけ。起動スクリプトはこんな感じ。
# cat /service/qmail-smtpd/run
#!/bin/sh
QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`
MAXSMTPD=`cat /var/qmail/control/concurrencyincoming`
LOCAL=`head -1 /var/qmail/control/me`
if [ -z "$QMAILDUID" -o -z "$NOFILESGID" -o -z "$MAXSMTPD" -o -z "$LOCAL" ]; then
echo QMAILDUID, NOFILESGID, MAXSMTPD, or LOCAL is unset in
echo /var/qmail/supervise/qmail-smtpd/run
exit 1
fi
if [ ! -f /var/qmail/control/rcpthosts ]; then
echo "No /var/qmail/control/rcpthosts!"
echo "Refusing to start SMTP listener because it'll create an open relay"
exit 1
fi
exec /usr/local/bin/softlimit -m 2000000 \
/usr/local/bin/tcpserver -v -R -l "$LOCAL" -x /etc/tcp.smtp.cdb -c "$MAXSMTPD" \
-u "$QMAILDUID" -g "$NOFILESGID" 0 smtp /var/qmail/bin/qmail-smtpd 2>&1
起動は成功したが、送信に失敗してしまう。
デフォルトでは全ての受け付けをDenyするようだ(localhostさえ)。
そこで先ほど入れた ucspi-tcp を使う。
以下のファイルを用意する。
# cat /etc/tcp.smtp 127.0.0.1:allow,RELAYCLIENT="" 192.168.1.:allow,RELAYCLIENT=""
このように、ローカルホストおよびプライベートIPアドレスを許可する設定にする。
そしたら以下のコマンドを実行。
tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
これで /etc/tcp.smtp.cdb が作成される。
qmail-smtpd を再起動して、メーラーの送信サーバをUnixマシンにしてみよう。
メール送信に成功すればOK。
プロバイダのメールをLinuxマシンに取り込むために使う。
Linux version : OpenSUSE 11.2fetchmail : 6.3.11
sudo zypper install fetchmail
fetchmail の設定はユーザ毎に行う。~/.fetchmailrc を用意すればよい。
% cat ~mailuser/.fetchmailrc defaults protocol pop3 no rewrite flush smtphost localhost poll PROVIDER.SMTP.HOST username "USERNAME" password "PASSWORD"
こんな感じに書いておいて、mailuser でログインして fetchmail コマンドを実行する。
すると、PROVIDER.SMTP.HOST から POP3 形式でメールを受信して
それを mailuser の Maildir に取り込むことができる。
cron よりも高性能のスケジューラ。
http://fcron.free.fr/download.phpLinux version : OpenSUSE 11.2fcron : 3.0.4
./configure make sudo make install
これで fcron が起動する。/etc/init.d/ にも登録されている。
今回は、10分間隔で fetchmail を呼び出すようにする。
cron と同様、fcron も設定はユーザ単位。fcrontab -e で設定を行う。
@ 10 /usr/bin/fetchmail
最後に、既存の sendmail コマンドを置き換える。
cd /usr/sbin mv sendmail sendmail.dist chmod 0 sendmail.dist ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail
こうすれば、fcron が送信するメールも qmail 経由になる。
ただしこのままだと10分おきに mailuser にメールが飛んでしまうので
fcrontab の設定を変えておこう。
@mail(no) 10 /usr/bin/fetchmail
これでOK。