2014年2月15日土曜日

DNS named.root 更新確認スクリプト

#!/bin/bash
# DNSのnamed.rootファイルの更新確認スクリプト
# 最新版のnamed.rootファイルを取得し、差分を確認する。
# 更新履歴
# 2014.02.07 watari

# お約束
export LANG=C
## 実行ディレクトリ
#PRGDIR=/usr/local/bin
## 実行スクリプト名
PRGNAME=named_hint_check.sh
## named.rootの一時保存場所
TMPDIR=/tmp
## bindのconfigディレクトリ
BINDCONFDIR=[BINDのzoneファイルが設置してあるパス(/etc/bind など)]
## 確認対象ファイル
BINDFILE=[named.confで指定しているファイル名(named.ca など)]
## GETするサーバリスト
GETSRVARRAY=("ftp.internic.net" "ftp.rs.internic.net")
## GETするファイル名
GETFILENAME=named.root
## GETするディレクトリ名
GETDIRNAME=domain
## 宛先メールアドレス
MAILADDR=異常時のメール送信先(name@domain)
## ログ出力先
LOGFILE=/var/log/named_hint_check.log

# おまじない
## メール送信関数(${MAILADDR}宛)
## kw_sendmail "件名" "本文"
kw_sendmail() {
        echo -e "$2" | nkf -j | mail -a 'MIME-Version: 1.0' \
        -a 'Content-Type: text/palin;charset="iso-2022-jp"' \
        -s "$1" ${MAILADDR}
}

## ファイル取得関数
## kw_getfile "プロトコル" "サーバ"
kw_getfile() {
        wget -T 15 -t 1 ${1}://${2}/${GETDIRNAME}/${GETFILENAME} > /dev/null 2>&1
        if [ $? != 0 ]; then
                ### 失敗したが、確認のため再度GET
                wget -T 15 -t 1 ${1}://${2}/${GETDIRNAME}/${GETFILENAME} > /dev/null 2>&1
                if [ $? != 0 ]; then
                        return 1
                fi
        fi
}

## ログ記載関数
## kw_log "ログの内容"
kw_log() {
        echo "`date '+%b %d %T' ` `hostname` ${PRGNAME}: ${1}" >> ${LOGFILE}
}

## iptables設定関数
## kw_iptables "FQDN"
kw_iptables() {
        IPADDR="`/sbin/ifconfig eth0 | awk -F ":" '/inet addr/ { split($2,a," "); print a[1] }'`"
        sudo iptables -A OUTPUT -s ${IPADDR} -d ${1} -j ACCEPT
        IPNUM=`sudo iptables -L OUTPUT --line-numbers | tail -n 1 | awk '{ print $1 }'`
}

# お仕事開始
## 作業ディレクトリに移動
cd ${TMPDIR}

## named.root ダウンロード開始
kw_getfile "http" "${GETSRVARRAY[0]}"
if [ $? != 0 ]; then
        kw_iptables "${GETSRVARRAY[0]}"
        kw_getfile "ftp" "${GETSRVARRAY[0]}"
        if [ $? != 0 ]; then
                kw_log "{GETSERVARRAY[0]}: ${GETFILENAME} の取得に失敗しました。"
                kw_getfile "http" "${GETSRVARRAY[1]}"
                if [ $? != 0 ]; then
                        kw_iptables "${GETSRVARRAY[1]}"
                        kw_getfile "ftp" "${GETSRVARRAY[1]}"
                        if [ $? != 0 ]; then
                                ### ログに記載
                                kw_log "{GETSERVARRAY[0]}: ${GETFILENAME} の取得に失敗しました。"
                                ### メール送信
                                kw_sendmail "${GETFILENAME} diff check script NG!" "${GETFILENAME} のダウンロードに失敗しました。\n担当者は 確認して下さい。"
                                ### 異常終了
                                exit 1
                        else
                                PROTO="ftp"
                                GETSERVNAME="${GETSRVARRAY[1]}"
                                sudo iptables -D OUTPUT ${IPTNUM}
                        fi
                else
                        PROTO="http"
                        GETSERVNAME="${GETSRVARRAY[1]}"
                fi
        else
                PROTO="ftp"
                GETSERVNAME="${GETSRVARRAY[0]}"
                sudo iptables -D OUTPUT ${IPTNUM}
        fi
else
        PROTO="http"
        GETSERVNAME="${GETSRVARRAY[0]}"
fi

## 差分確認
diff ${TMPDIR}/${GETFILENAME} ${BINDCONFDIR}/${BINDFILE} > /dev/null 2>&1
if [ $? != 0 ]; then
        ### 取得ファイルのシリアルを確認
        GETSERIAL=`grep version ${TMPDIR}/${GETFILENAME} | awk '{ print $7 }'`
        NOWSERIAL=`grep version ${BINDCONFDIR}/${BINDFILE} | awk '{ print $7 }'`
        if [ ${GETSERIAL} -gt ${NOWSERIAL} ]; then
                ### ログに記載
                kw_log "${PROTO}://${GETSERVNAME}: ${GETFILENAME} が更新されているようです。${BINDFILE} を確認して下さい。"
                ### メール送信
                kw_sendmail "${GETFILENAME} diff check script NG!" "${BINDFILE} が更新されているようです。\n担当者は差分内容を確認して対応してください。\n${PROTO}://${GETSERVNAME}/${GETDIRNAME}/${GETFILENAME} が該当ファイルです。"
        else
                kw_log "${PROTO}://${GETSERVNAME}: ${GETFILENAME} の更新は必要ありません。"
        fi
else
        kw_log "${PROTO}://${GETSERVNAME}: ${GETFILENAME} の差分はありません。"
fi

## 一時ファイルを削除
rm ${TMPDIR}/${GETFILENAME}

exit 0

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

DNS named.root 更新確認スクリプト

#!/bin/bash # DNSのnamed.rootファイルの更新確認スクリプト # 最新版のnamed.rootファイルを取得し、差分を確認する。 # 更新履歴 # 2014.02.07 watari # お約束 export LANG=C ## 実行ディレクトリ #PR...