minimize

今回は運用関連。
常駐型プロセスの管理、fcronなど。

daemontools

常駐型アプリケーション(以下サービスと記述)の起動・停止を制御するプログラム。
これで 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 してもすぐに復活するゾンビのようなプロセス。取り扱いは慎重に。

ucspi-tcp

http://cr.yp.to/ucspi-tcp/install.html
TCP接続部分を制御するプログラム。

今度は珍しくソースを好きな場所に展開してよい(笑)。
お決まりのように、error.h に以下の一文を追加。

#include <errno.h>

そしたらインストール。

make
sudo make setup check

qmail-smtpd

実は今までの手順では、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さえ)。

tcprules

そこで先ほど入れた 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。

fetchmail

プロバイダのメールをLinuxマシンに取り込むために使う。

Linux version : OpenSUSE 11.2
fetchmail : 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 に取り込むことができる。

fcron

cron よりも高性能のスケジューラ。

http://fcron.free.fr/download.php
Linux version : OpenSUSE 11.2
fcron : 3.0.4

./configure
make
sudo make install

これで fcron が起動する。/etc/init.d/ にも登録されている。

今回は、10分間隔で fetchmail を呼び出すようにする。
cron と同様、fcron も設定はユーザ単位。fcrontab -e で設定を行う。

@ 10 /usr/bin/fetchmail

sendmail置き換え

最後に、既存の 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。

[コメント(0)]