一気にインストールする決めうちスクリプトです。
/usr/local/src/djb とかに install.sh などとしておき、
./install.sh install
もしくは
sh install.sh install
で実行です。
[追記 date="2011.07.13."]
CentOS6 (RHEL6ベース)の場合、インストール後に下記の記事の設定が必要です。
[サイト内の別記事] CentOS6にdaemontoolsをインストールするとそのままでは自動起動しない。
[/追記]
[追記 date="2011.09.09."]
sendmailラッパーのシンボリックリンクがsendmailインストール時に機能しなかったのを修正。
[/追記]
相当決めうちのスクリプトなので、中身をよくご確認のうえご利用ください。
※当然ですが、無保証です。
とりあえずインストールはうまくいけば動くはずですが、他の部分は未完成です。
#! /bin/sh
# =====================================================
# 設定
# =====================================================
export PATH=$PATH:/usr/local/bin
# CentOS 6 系の場合 1 に。
RHEL6=0
# -------------------------------------------------------------------
# DJB共通
# -------------------------------------------------------------------
# パッケージバージョン
PACK_NQ=netqmail-1.06
PACK_DT=daemontools-0.76
PACK_UT=ucspi-tcp-0.88
PACK_DD=djbdns-1.05
BASE_LOG_DIR=/var/log/multilog
# このスクリプトが ${BASE_DIR}直下にある前提で。
# BASE_DIR : パッケージ管理パス
pushd $(dirname $0) 2>&1 > /dev/null
BASE_DIR=$(pwd)
popd 2>&1 > /dev/null
# インストールログファイルのフルパス
INSTALL_LOG=${BASE_DIR}/install_logs/install_$(date +%Y%m%d_%H%M%S).log
# ログディレクトリが存在しない場合作成
[ ! -e `dirname ${INSTALL_LOG}` ] && mkdir -p `dirname ${INSTALL_LOG}`
# -------------------------------------------------------------------
# daemontools
# -------------------------------------------------------------------
DT_LOG_GENS=100
DT_LOG_SIZE=16777215
# -------------------------------------------------------------------
# djbdns
# -------------------------------------------------------------------
# DJBDNS(cache)インストール設定
DD_GRP=djbdns
DD_CACHE_USR=dnscache
DD_LOG_USR=dnslog
DD_HOME_DIR=/etc/dnscache
DD_LOG_DIR=${BASE_LOG_DIR}/dnscache
DD_SCR_RT_UPD=sh/update_root_servers.sh
# -------------------------------------------------------------------
# netqmail
# -------------------------------------------------------------------
# netqmail 用設定
NQ_ADD_PATCHES_DIR=${BASE_DIR}/src/netqmail-patches
NQ_SRC_DIR=${BASE_DIR}/src/${PACK_NQ}
# net-qmail other-patches パス
PATCHES=${NQ_SRC_DIR}/other-patches
# qmail インストールディレクトリ
QMAIL_DIR=/var/qmail
NQ_SVC_DIR=${QMAIL_DIR}/services
NQ_SMTP_CDB=${QMAIL_DIR}/services/tcprules/smtp.cdb
# =====================================================
# 共通スクリプト
# =====================================================
# ログセクションタイトル出力
log_title()
{
echo " ----------------------------------------------------------"
echo " $(date +%T) $1"
echo " ----------------------------------------------------------"
}
# =====================================================
# DJB共通スクリプト
# =====================================================
# DJBディレクトリ作成
# /doc -> ${BASE_DIR}/doc : ドキュメントファイル
# /command -> ${BASE_DIR}/command : コマンドへのシンボリックリンク
# /package -> ${BASE_DIR}/package : パッケージディレクトリへのシンボリックリンク
# ${BASE_DIR}/archive : ダウンロードパッケージの保管場所
# ${BASE_DIR}/src : パッケージの展開ディレクトリ
# archive, src は非標準
create_dirs()
{
# package ディレクトリ作成
[ ! -e ${BASE_DIR}/package ] && mkdir ${BASE_DIR}/package
[ ! -e /package ] && ln -s ${BASE_DIR}/package /package
# command ディレクトリ作成
[ ! -e ${BASE_DIR}/command ] && mkdir ${BASE_DIR}/command
[ ! -e /command ] && ln -s ${BASE_DIR}/command /command
# doc ディレクトリ作成
[ ! -e ${BASE_DIR}/doc ] && mkdir ${BASE_DIR}/doc
[ ! -e /doc ] && ln -s ${BASE_DIR}/doc /doc
# archive ディレクトリ作成
[ ! -e ${BASE_DIR}/archive ] && mkdir ${BASE_DIR}/archive
# src ディレクトリ作成
[ ! -e ${BASE_DIR}/src ] && mkdir ${BASE_DIR}/src
}
# =====================================================
# ダウンロードスクリプト
# =====================================================
# 各パッケージダウンロード
download_package()
{
pushd ${BASE_DIR}/archive 2>&1 > /dev/null
# ダウンロード
[ ! -e ${PACK_NQ}.tar.gz ] && wget http://qmail.org/${PACK_NQ}.tar.gz
[ ! -e ${PACK_DT}.tar.gz ] && wget http://tools.qmail.jp/daemontools/${PACK_DT}.tar.gz
[ ! -e ${PACK_UT}.tar.gz ] && wget http://tools.qmail.jp/ucspi-tcp/${PACK_UT}.tar.gz
[ ! -e ${PACK_DD}.tar.gz ] && wget http://cr.yp.to/djbdns/${PACK_DD}.tar.gz
[ ! -e doc.tar.gz -a ! -e djbdns_doc.tar.gz ] && wget http://cr.yp.to/djbdns/doc.tar.gz && mv doc.tar.gz djbdns_doc.tar.gz
popd 2>&1 > /dev/null
}
# 各パッケージ展開
extract_archive()
{
# net-qmail ucspi-tcp djbdns 展開
pushd ${BASE_DIR}/src 2>&1 > /dev/null
[ ! -e ${PACK_NQ} ] && tar zxvf ${BASE_DIR}/archive/${PACK_NQ}.tar.gz
[ ! -e ${PACK_UT} ] && tar zxvf ${BASE_DIR}/archive/${PACK_UT}.tar.gz
[ ! -e ${PACK_DD} ] && tar zxvf ${BASE_DIR}/archive/${PACK_DD}.tar.gz
popd 2>&1 > /dev/null
# daemontools 展開 → ./package 以下
pushd ${BASE_DIR}/package 2>&1 > /dev/null
[ ! -e admin/${PACK_DT} ] && tar zxvf ${BASE_DIR}/archive/${PACK_DT}.tar.gz
popd 2>&1 > /dev/null
# djbdns_doc 展開
pushd ${BASE_DIR} 2>&1 > /dev/null
tar zxvf archive/djbdns_doc.tar.gz
for i in packages commands cfunctions fileformats
do
sort -f /dev/null `find /doc/merge -name $i.html` > /doc/$i.new
mv /doc/$i.new /doc/$i.html
done
popd 2>&1 > /dev/null
}
# =====================================================
# インストールスクリプト
# =====================================================
# -------------------------------------------------------------------
# daemontools 関連
# -------------------------------------------------------------------
# daemontools インストール
daemontools_install()
{
if [ -d /service ]; then
echo "daemontools already installed. (skip)"
else
ln -s ${BASE_DIR}/package /package
pushd ${BASE_DIR}/package/admin/${PACK_DT} 2>&1 > /dev/null
patch -p1 < ${PATCHES}/daemontools-0.76.errno.patch
package/install
popd 2>&1 > /dev/null
# CentOS 6 対応 (SysVinit が upstart になったことに対応)
if [ ${RHEL6} eq 1 ]; then
# /etc/inittab コメントアウト
sed -e 's/\(SV:123456:respawn:\/command\/svscanboot\)/# \1/g' /etc/inittab > /etc/inittab
# /etc/init/svscan.conf 作成
cat << _EOT_ > /etc/init/svscan.conf
start on runlevel [12345]
respawn
exec /command/svscanboot
_EOT_
initctl reload-configuration
initctl start svscan
fi
fi
}
# サービスログrun ファイル作成
# 第1引数:ログユーザ名 第2引数:ログディレクトリ名
dt_log_run()
{
local LOGUSER=$1
local LOGDIR=$2
cat << _EOT_
#!/bin/sh
exec \\
setuidgid \\
${LOGUSER} \\
multilog \\
t \\
n${DT_LOG_GENS} \\
s${DT_LOG_SIZE} \\
${LOGDIR}
_EOT_
}
# -------------------------------------------------------------------
# ucspi-tcp 関連
# -------------------------------------------------------------------
# ucspi-tcp インストール
ucspi_tcp_install()
{
pushd ${BASE_DIR}/src/${PACK_UT} 2>&1 > /dev/null
patch -p1 < ${PATCHES}/ucspi-tcp-0.88.errno.patch
patch -p1 < ${PATCHES}/ucspi-tcp-0.88.a_record.patch
patch -p1 < ${PATCHES}/ucspi-tcp-0.88.nodefaultrbl.patch
make
make setup check
popd 2>&1 > /dev/null
}
# -------------------------------------------------------------------
# djbdns 関連
# -------------------------------------------------------------------
# ユーザ・グループ作成(ログディレクトリも作成)
dd_preset()
{
# DJBDNS用グループ作成
groupadd ${DD_GRP}
# DJBDNS DNSCACHE用/LOG用ユーザ作成
useradd \
-M \
-g ${DD_GRP} \
-G ${DD_GRP} \
-s /bin/false \
-c "djbdns dnscache user" \
${DD_CACHE_USR}
useradd \
-M \
-g ${DD_GRP} \
-G ${DD_GRP} \
-s /bin/false \
-c "djbdns log user" \
${DD_LOG_USR}
# ログディレクトリ作成
# DJBDNS ログ
[ ! -e ${DD_LOG_DIR} ] \
&& mkdir -p ${DD_LOG_DIR} \
&& chown -R ${DD_LOG_USR}.${DD_GRP} ${DD_LOG_DIR}
}
# スクリプト作成
dd_script()
{
case $1 in
"root_update" )
;;
esac
}
# ローカルDNSを見る必要のあるゾーン用の設定
dd_local_nameservers()
{
pushd ${DD_HOME_DIR}/root/servers 2>&1 > /dev/null
# 特定のドメイン(LANとか)を名前解決する際に使うDNSを別途指定する場合はこの辺に追記
# echo "192.168.100.35" > example.com
# echo "192.168.100.35" > example.net
popd 2>&1 > /dev/null
}
# djbdns(cache) インストール
dd_install_dnscache()
{
# ユーザ・グループ作成・ログディレクトリ作成
dd_preset
# パッチ、コンパイル、インストール
pushd ${BASE_DIR}/src/${PACK_DD} 2>&1 > /dev/null
patch -p1 < ${PATCHES}/djbdns-1.05.errno.patch
make
make setup check
popd 2>&1 > /dev/null
# サービスディレクトリ作成
dnscache-conf ${DD_CACHE_USR} ${DD_LOG_USR} ${DD_HOME_DIR}
# サービス自動起動停止
# touch ${DD_HOME_DIR}/down
# touch ${DD_HOME_DIR}/log/down
# ログローテーション設定変更(log/run)
dt_log_run ${DD_LOG_USR} ${DD_LOG_DIR} > ${DD_HOME_DIR}/log/run
# 管理スクリプトディレクトリ作成
mkdir -p ${DD_HOME_DIR}/sh
# 管理スクリプトディレクトリに root servers 更新スクリプト作成
cat << _EOT_ > ${DD_HOME_DIR}/${DD_SCR_RT_UPD}
#! /bin/sh
cd $(dirname ${DD_HOME_DIR}/${DD_SCR_RT_UPD})
wget http://www.internic.net/zones/named.root
grep " A " named.root |awk '{print \$4}' > ${DD_HOME_DIR}/root/servers/@
rm named.root
_EOT_
# 作成したスクリプトを実行
sh ${DD_HOME_DIR}/${DD_SCR_RT_UPD}
# ローカルIP範囲のDNS設定
# (DH用設定)
dd_local_nameservers
# サービス設定
ln -s ${DD_HOME_DIR} /service/dnscache
}
# -------------------------------------------------------------------
# netqmail 関連
# -------------------------------------------------------------------
# netqmail 用パッチダウンロード/適用
nq_download_netqmail_patches()
{
# パッチ用ディレクトリ作成
[ ! -e ${NQ_ADD_PATCHES_DIR} ] && mkdir -p ${NQ_ADD_PATCHES_DIR}
pushd ${NQ_ADD_PATCHES_DIR} 2>&1 > /dev/null
[ ! -e netqmail-maildir++.patch ] && wget http://www.shupp.org/patches/netqmail-maildir++.patch
[ ! -e qmail-date-localtime.patch ] && wget http://www.asahi-net.or.jp/~AA4T-NNGK/codes/qmail-date-localtime.patch
[ ! -e patch-qmail-1.03-rfc2821.diff ] && wget http://www.dt.e-technik.uni-dortmund.de/~ma/qmail/patch-qmail-1.03-rfc2821.diff
# ------------
# 追加のパッチがあればこの辺にダウンロードコマンドを追記
# ------------
popd 2>&1 > /dev/null
log_title "netqmail パッチ適用"
pushd ${NQ_SRC_DIR} 2>&1 > /dev/null
patch -p1 < ${NQ_ADD_PATCHES_DIR}/netqmail-maildir++.patch
patch -p1 < ${NQ_ADD_PATCHES_DIR}/qmail-date-localtime.patch
patch -p0 < ${NQ_ADD_PATCHES_DIR}/patch-qmail-1.03-rfc2821.diff
# ------------
# 追加のパッチがあればこの辺にpatch コマンドを追記
# ------------
popd 2>&1 > /dev/null
}
# netqmail 用ユーザ・グループ作成
nq_create_users_groups()
{
# qmail ディレクトリ作成
[ ! -e ${QMAIL_DIR} ] && mkdir -p ${QMAIL_DIR}
# ユーザ・グループ作成
groupadd nofiles
useradd -s /bin/false -g nofiles -d ${QMAIL_DIR}/alias alias
useradd -s /bin/false -g nofiles -d ${QMAIL_DIR} qmaild
useradd -s /bin/false -g nofiles -d ${QMAIL_DIR} qmaill
useradd -s /bin/false -g nofiles -d ${QMAIL_DIR} qmailp
groupadd qmail
useradd -s /bin/false -g qmail -d ${QMAIL_DIR} qmailq
useradd -s /bin/false -g qmail -d ${QMAIL_DIR} qmailr
useradd -s /bin/false -g qmail -d ${QMAIL_DIR} qmails
}
# netqmail コンパイル・インストール
nq_install()
{
pushd ${NQ_SRC_DIR} 2>&1 > /dev/null
make
make setup check
# config-fast実行
echo -n "このメールサーバのFQDNを入力してください。:"
read FQDN
./config-fast ${FQDN}
popd 2>&1 > /dev/null
}
# smtp.cdb 作成
nq_set_smtp_cdb()
{
# ディレクトリ作成
[ ! -e `dirname ${NQ_SMTP_CDB}` ] && mkdir -p `dirname ${NQ_SMTP_CDB}`
# smtp.tcp 作成
cat << _EOT_ > `dirname ${NQ_SMTP_CDB}`/smtp.tcp
127.:allow,RELAYCLIENT="",RBLSMTPD=""
:allow
_EOT_
tcprules ${NQ_SMTP_CDB} `dirname ${NQ_SMTP_CDB}`/smtp.tmp < `dirname ${NQ_SMTP_CDB}`/smtp.tcp
}
# netqmail サービス設定
nq_set_service()
{
# サービスディレクトリ作成
[ ! -e ${NQ_SVC_DIR}/qmail/log ] && mkdir -p ${NQ_SVC_DIR}/qmail/log
[ ! -e ${NQ_SVC_DIR}/smtpd/log ] && mkdir -p ${NQ_SVC_DIR}/smtpd/log
# qmail run ファイル作成
cat << _EOT_ > ${NQ_SVC_DIR}/qmail/run
#! /bin/sh
exec \\
env - PATH="/var/qmail/bin:/usr/local/bin:/usr/bin:/bin" \\
qmail-start ./Maildir/
_EOT_
# smtpd run ファイル作成
cat << _EOT_ > ${NQ_SVC_DIR}/smtpd/run
#! /bin/sh
PATH="/var/qmail/bin:/usr/local/bin:/bin:/usr/bin"
exec \\
tcpserver -HRv \\
-u \`id -u qmaild\` \\
-g \`id -g qmaild\` \\
-c 250 \\
-x ${NQ_SMTP_CDB} \\
0 \\
smtp \\
rblsmtpd \\
-r sbl.spamhaus.org \\
-r dnsbl.ahbl.org \\
${QMAIL_DIR}/bin/qmail-smtpd \\
2>&1
_EOT_
# smtp.cdb 作成
nq_set_smtp_cdb
# ログディレクトリ作成
[ ! -e ${BASE_LOG_DIR}/qmail ] && mkdir -p ${BASE_LOG_DIR}/qmail
[ ! -e ${BASE_LOG_DIR}/smtpd ] && mkdir -p ${BASE_LOG_DIR}/smtpd
chown -R qmaill.nofiles ${BASE_LOG_DIR}/qmail
chown -R qmaill.nofiles ${BASE_LOG_DIR}/smtpd
# qmail ログ run ファイル作成
dt_log_run qmaill ${BASE_LOG_DIR}/qmail > ${NQ_SVC_DIR}/qmail/log/run
# smtpd ログ run ファイル作成
dt_log_run qmaill ${BASE_LOG_DIR}/smtpd > ${NQ_SVC_DIR}/smtpd/log/run
# パーミッション
chmod +t ${NQ_SVC_DIR}/qmail/
chmod +x ${NQ_SVC_DIR}/qmail/run
chmod +x ${NQ_SVC_DIR}/qmail/log/run
chmod +t ${NQ_SVC_DIR}/smtpd/
chmod +x ${NQ_SVC_DIR}/smtpd/run
chmod +x ${NQ_SVC_DIR}/smtpd/log/run
echo -n "qmail/smtpdサービスを開始しますか?[ y/N ]:"
read TMP
if [ ! ${TMP} = "y" -a ! ${TMP} = "Y" ]; then
touch ${NQ_SVC_DIR}/qmail/down
touch ${NQ_SVC_DIR}/qmail/log/down
touch ${NQ_SVC_DIR}/smtpd/down
touch ${NQ_SVC_DIR}/smtpd/log/down
fi
ln -s ${NQ_SVC_DIR}/qmail /service/
ln -s ${NQ_SVC_DIR}/smtpd /service/
# sendmail ラッパー
# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail
# ln -s /var/qmail/bin/sendmail /usr/lib/sendmail
# 2011.09.09.変更
[ -e /usr/sbin/sendmail ] && mv /usr/sbin/sendmail /usr/sbin/sendmail.orig
[ -e /usr/lib/sendmail ] && mv /usr/lib/sendmail /usr/sbin/sendmail.orig
ln -sf /var/qmail/bin/sendmail /usr/sbin/sendmail
ln -sf /var/qmail/bin/sendmail /usr/lib/sendmail
}
# qmail/control 設定
set_qmail_control()
{
pushd ${QMAIL_DIR}/control 2>&1 > /dev/null
echo 255 > concurrencylocal
echo 255 > concurrencyremote
echo 259200 > queuelifetime
echo 120 > timeoutconnect
echo 600 > timeoutremote
popd 2>&1 > /dev/null
}
# netqmail インストール
netqmail_install()
{
# netqmail 用パッチダウンロード/適用
log_title "netqmail パッチダウンロード"
nq_download_netqmail_patches
# 最大同時配信数を255に
echo 255 > ${NQ_SRC_DIR}/conf-spawn
# qmailディレクトリ・ユーザ・グループ作成
log_title "qmail ディレクトリ・ユーザ・グループ作成"
nq_create_users_groups
# netqmail コンパイル・インストール
log_title "netqmail インストール"
nq_install
# qmail/control
log_title "qmail/control 設定"
set_qmail_control
# サービス設定
log_title "netqmail サービス設定"
nq_set_service
}
# =====================================================
# メインスクリプト
# =====================================================
# -------------------------------------------------------------------
# デバッグ用スクリプト
# -------------------------------------------------------------------
debug()
{
# echo "-----------------------"
# echo ${PACK_NQ}
# echo ${PACK_DT}
# echo ${PACK_UT}
# echo ${PACK_DD}
# echo "-----------------------"
# echo ${BASE_DIR}
# echo ${PATCHES}
# echo "-----------------------"
# echo ${DD_GRP}
# echo ${DD_CACHE_USR}
# echo ${DD_LOG_USR}
# echo ${DD_HOME_DIR}
# echo ${DD_LOG_DIR}
# echo ${DD_SCR_RT_UPD}
# echo ${DD_LOG_GENS}
# echo ${DD_LOG_SIZE}
#
# echo "-----------------------"
# log_title "djbdns インストール"
# dd_script "log_run"
#
# log_title "djbdns インストール"
# dd_script "root_update"
nq_set_service
}
# -------------------------------------------------------------------
# アンインストールスクリプト
# -------------------------------------------------------------------
uninstall()
{
rm -rf \
/service \
/command \
/doc \
/package \
${BASE_DIR}/command \
${BASE_DIR}/doc \
${BASE_DIR}/package \
${BASE_DIR}/archive \
${BASE_DIR}/src \
${DD_HOME_DIR}
ls -l /usr/local/bin \
| grep "/command" \
| awk '{ print "/usr/local/bin/"$9; }' \
| xargs rm -rf
userdel ${DD_CACHE_USR}
userdel ${DD_LOG_USR}
groupdel ${DD_GRP}
}
# -------------------------------------------------------------------
# インストールスクリプト
# -------------------------------------------------------------------
install(){
log_title "DJBディレクトリ作成"
create_dirs
log_title "ダウンロード"
download_package
log_title "パッケージ展開"
extract_archive
log_title "daemontools インストール"
daemontools_install
log_title "ucspi-tcp インストール"
ucspi_tcp_install
log_title "djbdns インストール"
dd_install_dnscache
echo -n "netqmailのインストールを実行しますか?[ y/N ]:"
read TMP
if [ ${TMP} = "y" -o ${TMP} = "Y" ]; then
log_title "netqmail インストール"
netqmail_install
fi
}
# -------------------------------------------------------------------
# メイン
# -------------------------------------------------------------------
case $1 in
"debug" )
debug ;;
"uninstall" )
uninstall ;;
"install" )
install 2>&1 |tee ${INSTALL_LOG} ;;
* )
echo "引数に install | uninstall | debug のいずれかを指定してください。"
esac
[Blog:技術系メモ] に新規投稿しました。 daemontools + ucspi-tcp + http://go.kaz.bz/52
@ma2shita あ、netqmailでいきそうで、インストール面倒なら、こちらもご参照ください http://ux.nu/vUj9RO
だいぶ前に作ったゲテ物スクリプトです。