カテゴリ

DJB DJBDNS qmail / vpopmail

Send to Kindle

一気にインストールする決めうちスクリプトです。

/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

kaz. Suenaga / 末永 和史 にコメントする コメントをキャンセル

いただいたコメント
  1. [Blog:技術系メモ] に新規投稿しました。  daemontools + ucspi-tcp + http://go.kaz.bz/52

  2. @ma2shita あ、netqmailでいきそうで、インストール面倒なら、こちらもご参照ください http://ux.nu/vUj9RO
    だいぶ前に作ったゲテ物スクリプトです。