FreeBSD 14.0 RELEASE - qmail - 起動スクリプトの作成 - qmail-smtpd
1. qmail-smtpd 「qmail-smtpd」の起動スクリプトを、作成して編集します。 vi /usr/local/etc/rc.d/qmail-smtpd 以下を記述します。 #!/bin/sh # $FreeBSD: head/mail/qmail/files/qmailsmtpd.in 400559 2015-10-30 23:07:16Z bdrewery $ # # PROVIDE: qmailsmtpd # REQUIRE: LOGIN cleanvar # KEYWORD: shutdown # # To use the checkpassword interface to qmail-smtpd, set # qmailsmtpd_checkpassword to the full path to the checkpassword program (e.g. # security/checkpassword or security checkpassword-pam). # # Note: tcpserver can be found in the sysutils/ucspi-tcp package. # # qmailsmtpd_checkpassword could be set to e.g. /usr/local/bin/checkpassword-pam . /etc/rc.subr name=qmailsmtpd rcvar=qmailsmtpd_enable load_rc_config $name : ${qmailsmtpd_tcpserver:=/usr/local/bin/tcpserver} : ${qmailsmtpd_tcprules:=/usr/local/bin/tcprules} : ${qmailsmtpd_pidfile:=/var/run/qmailsmtpd.pid} : ${qmailsmtpd_enable:=NO} : ${qmailsmtpd_cdb:=/etc/tcp/tcp.smtp} : ${qmailsmtpd_flags="-R -H -u 82 -g 81"} : ${qmailsmtpd_host:=0} : ${qmailsmtpd_port:=smtp} : ${qmailsmtpd_smtpd:=/var/qmail/bin/qmail-smtpd} : ${qmailsmtpd_fqdn:=`hostname`} : ${qmailsmtpd_checksubprogram:=/usr/bin/true} start_cmd=qmailsmtpd_start start_precmd=qmailsmtpd_precmd pidfile=${qmailsmtpd_pidfile} procname=${qmailsmtpd_tcpserver} qmailsmtpd_start() { if [ -n "$qmailsmtpd_checkpassword" ]; then qmailsmtpd_usercheck="$qmailsmtpd_fqdn $qmailsmtpd_checkpassword $qmailsmtpd_checksubprogram" fi echo "Starting qmailsmtpd." $qmailsmtpd_tcpserver -v \ -x $qmailsmtpd_cdb.cdb \ $qmailsmtpd_flags $qmailsmtpd_host \ $qmailsmtpd_port \ $qmailsmtpd_smtpd \ $qmailsmtpd_usercheck \ 2>&1 | /var/qmail/bin/splogger smtpd & pid=`expr $! - 1` echo $pid > $pidfile } qmailsmtpd_precmd() { if ! [ -e "${qmailsmtpd_tcpserver}" ]; then echo "sysutils/ucspi-tcp is required" >&2 return 1 fi if ! [ -e "${qmailsmtpd_cdb}" ]; then echo "TCP rules file '${qmailsmtpd_cdb}' is missing." >&2 return 1 fi $qmailsmtpd_tcprules $qmailsmtpd_cdb.cdb $qmailsmtpd_cdb.tmp < $qmailsmtpd_cdb \ || return 1 } run_rc_command "$1" 49行目の「-v」オプションは、「tcpserver」のログを冗長(Verbose)にしています。 起動・終了・接続の都度ログを出力しますので、抑えるのであれば、「-v」をはずします。(以下同様) 56~57行目は、いささかくるしまぎれの設定ですので解説しておきます。 55行目で「splogger」に出力を食わせているのは、デフォルトの設定だと、ログが標準出力もしくはエラー出力に表示されてログに記録されないのです。 ログインした状態で再起動するとわかりますが、ログインしたコンソールに「simscan」のログが出力されてしまうのです。 ところが「splogger」に出力すると、「qmail-smtpd」と「splogger」と2つのプロセスが同時に起動するのです。 で「echo $! > $pidfile」でプロセス ID を出力すると、「$!」は最後に起動したプロセスなので、「splogger」のプロセス ID で「pid」ファイルが出力されてしまうのです。 そうなると「stop」「restart」「status」で見る「pid」が、「splogger」のものなのでまともな判断ができなくなります。 で、「pid」は最後に起動したプロセスのIDをデクリメントしたものを出力しているのです。 「daemontools」の使用も検討してみましたが、設定が面倒なので、このような設定に落ち着きました。 もっとよい方法があったら誰か教えてください。 2. qmail-smtpd-ssl 前項の「SSL」版です。 本項は、「SSL」の証明書が必要ですので、必ず先に「FreeBSD - メンテナンス・トラブルシュート - メールサーバ」の「証明書」に関する項を参考にして、作成しておいてください。 「qmail-smtpd」の起動スクリプトを、作成して編集します。 vi /usr/local/etc/rc.d/qmail-smtpd-ssl 以下を記述します。 ほとんど前項と同じですので、違う箇所を緑太字にしています。 #!/bin/sh # $FreeBSD: head/mail/qmail/files/qmailsmtpd.in 400559 2015-10-30 23:07:16Z bdrewery $ # # PROVIDE: qmailsmtpd # REQUIRE: LOGIN cleanvar # KEYWORD: shutdown # # To use the checkpassword interface to qmail-smtpd, set # qmailsmtpd_checkpassword to the full path to the checkpassword program (e.g. # security/checkpassword or security checkpassword-pam). # # Note: tcpserver can be found in the sysutils/ucspi-tcp package. # # qmailsmtpd_checkpassword could be set to e.g. /usr/local/bin/checkpassword-pam . /etc/rc.subr name=qmailsmtpd_ssl rcvar=qmailsmtpd_enable load_rc_config $name : ${qmailsmtpd_tcpserver:=/usr/local/bin/tcpserver} : ${qmailsmtpd_tcprules:=/usr/local/bin/tcprules} : ${qmailsmtpd_pidfile:=/var/run/qmailsmtpd-ssl.pid} : ${qmailsmtpd_enable:=NO} : ${qmailsmtpd_cdb:=/etc/tcp/tcp.smtp} : ${qmailsmtpd_flags="-R -H -u 82 -g 81"} : ${qmailsmtpd_host:=0} : ${qmailsmtpd_port:=smtps} : ${qmailsmtpd_smtpd:=/var/qmail/bin/qmail-smtpd} : ${qmailsmtpd_fqdn:=`hostname`} : ${qmailsmtpd_checksubprogram:=/usr/bin/true} start_cmd=qmailsmtpd_start start_precmd=qmailsmtpd_precmd pidfile=${qmailsmtpd_pidfile} procname=${qmailsmtpd_tcpserver} qmailsmtpd_start() { if [ -n "$qmailsmtpd_checkpassword" ]; then qmailsmtpd_usercheck="$qmailsmtpd_fqdn $qmailsmtpd_checkpassword $qmailsmtpd_checksubprogram" fi echo "Starting qmailsmtpd-ssl." $qmailsmtpd_tcpserver -v \ -s -n /etc/ssl/mail/cert.pem \ -x $qmailsmtpd_cdb.cdb \ $qmailsmtpd_flags $qmailsmtpd_host \ $qmailsmtpd_port \ $qmailsmtpd_smtpd \ $qmailsmtpd_usercheck \ 2>&1 | /var/qmail/bin/splogger smtpds & pid=`expr $! - 1` echo $pid > $pidfile } qmailsmtpd_precmd() { if ! [ -e "${qmailsmtpd_tcpserver}" ]; then echo "sysutils/ucspi-tcp is required" >&2 return 1 fi if ! [ -e "${qmailsmtpd_cdb}" ]; then echo "TCP rules file '${qmailsmtpd_cdb}' is missing." >&2 return 1 fi $qmailsmtpd_tcprules $qmailsmtpd_cdb.cdb $qmailsmtpd_cdb.tmp < $qmailsmtpd_cdb \ || return 1 } run_rc_command "$1" 19、26、31、47、50、55行の色付け部分の変更と以下の1行追加だけなので、前項で作成したファイルをコピーして編集する方が速いかもしれません。 50行目の「/etc/ssl/mail/cert.pem」は「メールサーバ」の「証明書を使用する」の項で作成したものです。 セキュリティ対策で別のディレクトリに変えたり、ファイル名を変更している場合は適宜置き換えてください。(以下同様) 蛇足) 「name」を「qmailsmtpd-ssl」にしたかったのですが・・・。 -(ハイフン) が使えないので「qmailsmtpd_ssl」にしました。
vi /usr/local/etc/rc.d/qmail-smtpd
#!/bin/sh # $FreeBSD: head/mail/qmail/files/qmailsmtpd.in 400559 2015-10-30 23:07:16Z bdrewery $ # # PROVIDE: qmailsmtpd # REQUIRE: LOGIN cleanvar # KEYWORD: shutdown # # To use the checkpassword interface to qmail-smtpd, set # qmailsmtpd_checkpassword to the full path to the checkpassword program (e.g. # security/checkpassword or security checkpassword-pam). # # Note: tcpserver can be found in the sysutils/ucspi-tcp package. # # qmailsmtpd_checkpassword could be set to e.g. /usr/local/bin/checkpassword-pam . /etc/rc.subr name=qmailsmtpd rcvar=qmailsmtpd_enable load_rc_config $name : ${qmailsmtpd_tcpserver:=/usr/local/bin/tcpserver} : ${qmailsmtpd_tcprules:=/usr/local/bin/tcprules} : ${qmailsmtpd_pidfile:=/var/run/qmailsmtpd.pid} : ${qmailsmtpd_enable:=NO} : ${qmailsmtpd_cdb:=/etc/tcp/tcp.smtp} : ${qmailsmtpd_flags="-R -H -u 82 -g 81"} : ${qmailsmtpd_host:=0} : ${qmailsmtpd_port:=smtp} : ${qmailsmtpd_smtpd:=/var/qmail/bin/qmail-smtpd} : ${qmailsmtpd_fqdn:=`hostname`} : ${qmailsmtpd_checksubprogram:=/usr/bin/true} start_cmd=qmailsmtpd_start start_precmd=qmailsmtpd_precmd pidfile=${qmailsmtpd_pidfile} procname=${qmailsmtpd_tcpserver} qmailsmtpd_start() { if [ -n "$qmailsmtpd_checkpassword" ]; then qmailsmtpd_usercheck="$qmailsmtpd_fqdn $qmailsmtpd_checkpassword $qmailsmtpd_checksubprogram" fi echo "Starting qmailsmtpd." $qmailsmtpd_tcpserver -v \ -x $qmailsmtpd_cdb.cdb \ $qmailsmtpd_flags $qmailsmtpd_host \ $qmailsmtpd_port \ $qmailsmtpd_smtpd \ $qmailsmtpd_usercheck \ 2>&1 | /var/qmail/bin/splogger smtpd & pid=`expr $! - 1` echo $pid > $pidfile } qmailsmtpd_precmd() { if ! [ -e "${qmailsmtpd_tcpserver}" ]; then echo "sysutils/ucspi-tcp is required" >&2 return 1 fi if ! [ -e "${qmailsmtpd_cdb}" ]; then echo "TCP rules file '${qmailsmtpd_cdb}' is missing." >&2 return 1 fi $qmailsmtpd_tcprules $qmailsmtpd_cdb.cdb $qmailsmtpd_cdb.tmp < $qmailsmtpd_cdb \ || return 1 } run_rc_command "$1"
vi /usr/local/etc/rc.d/qmail-smtpd-ssl
#!/bin/sh # $FreeBSD: head/mail/qmail/files/qmailsmtpd.in 400559 2015-10-30 23:07:16Z bdrewery $ # # PROVIDE: qmailsmtpd # REQUIRE: LOGIN cleanvar # KEYWORD: shutdown # # To use the checkpassword interface to qmail-smtpd, set # qmailsmtpd_checkpassword to the full path to the checkpassword program (e.g. # security/checkpassword or security checkpassword-pam). # # Note: tcpserver can be found in the sysutils/ucspi-tcp package. # # qmailsmtpd_checkpassword could be set to e.g. /usr/local/bin/checkpassword-pam . /etc/rc.subr name=qmailsmtpd_ssl rcvar=qmailsmtpd_enable load_rc_config $name : ${qmailsmtpd_tcpserver:=/usr/local/bin/tcpserver} : ${qmailsmtpd_tcprules:=/usr/local/bin/tcprules} : ${qmailsmtpd_pidfile:=/var/run/qmailsmtpd-ssl.pid} : ${qmailsmtpd_enable:=NO} : ${qmailsmtpd_cdb:=/etc/tcp/tcp.smtp} : ${qmailsmtpd_flags="-R -H -u 82 -g 81"} : ${qmailsmtpd_host:=0} : ${qmailsmtpd_port:=smtps} : ${qmailsmtpd_smtpd:=/var/qmail/bin/qmail-smtpd} : ${qmailsmtpd_fqdn:=`hostname`} : ${qmailsmtpd_checksubprogram:=/usr/bin/true} start_cmd=qmailsmtpd_start start_precmd=qmailsmtpd_precmd pidfile=${qmailsmtpd_pidfile} procname=${qmailsmtpd_tcpserver} qmailsmtpd_start() { if [ -n "$qmailsmtpd_checkpassword" ]; then qmailsmtpd_usercheck="$qmailsmtpd_fqdn $qmailsmtpd_checkpassword $qmailsmtpd_checksubprogram" fi echo "Starting qmailsmtpd-ssl." $qmailsmtpd_tcpserver -v \ -s -n /etc/ssl/mail/cert.pem \ -x $qmailsmtpd_cdb.cdb \ $qmailsmtpd_flags $qmailsmtpd_host \ $qmailsmtpd_port \ $qmailsmtpd_smtpd \ $qmailsmtpd_usercheck \ 2>&1 | /var/qmail/bin/splogger smtpds & pid=`expr $! - 1` echo $pid > $pidfile } qmailsmtpd_precmd() { if ! [ -e "${qmailsmtpd_tcpserver}" ]; then echo "sysutils/ucspi-tcp is required" >&2 return 1 fi if ! [ -e "${qmailsmtpd_cdb}" ]; then echo "TCP rules file '${qmailsmtpd_cdb}' is missing." >&2 return 1 fi $qmailsmtpd_tcprules $qmailsmtpd_cdb.cdb $qmailsmtpd_cdb.tmp < $qmailsmtpd_cdb \ || return 1 } run_rc_command "$1"