ゾーンファイルのシリアル値更新忘れ防止策

ゾーンファイルのリソースレコードを変更したとき、うっかりシリアル値の変更を忘れてしまうことがよくあります。
これではセカンダリにゾーン転送されません。

というわけで、更新忘れを防止するスクリプトを作ってみました。

特定の文字列を unix time に置き換えるだけのもの。
既にいろんな人が作ってそうなスクリプトです。

事前準備

ゾーンファイルが格納されているディレクトリを /etc/nsd/zones とします。

# cp -a /etc/nsd/zones /etc/nsd/edit

として、/etc/nsd/edit を編集用ディレクトリとします。

そして、/etc/nsd/edit 以下すべてのゾーンファイルのシリアル値を、以下のように編集します。
シリアル値に当たる部分を、_SERIAL_ に書き換えます。

$TTL 3600
@ IN SOA dns1.example.com. hostmaster.example.com. (
              _SERIAL_     ;Serial
              3600         ;Refresh
              600          ;Retry
              604800       ;Expire
              3600 )       ;negcache

スクリプト作成

updateserial.sh

#!/bin/sh
#
# 20110908
# update serial
#
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/sbin:/usr/sbin
export PATH


#
# error
#
if [ $# = 0 ]; then
  echo "usage:"
  echo "${0} [file ...]"
  exit 1
fi


#
# define
#
DIR_ZONES=/etc/nsd/zones
COMMENT=_SERIAL_
SERIAL=`date +%s`


#
# process
#
while [ "${1}x" != "x" ]; do
  if [ -f "${1}" ]; then
    sed -e "s/${COMMENT}/${SERIAL}/" ${1} > ${DIR_ZONES}/${1} && \
    echo "updated        : ${1}"
  else
    echo "file not found : ${1}"
  fi

  shift 1
done

パスの通ったところに置いておきます。

# ln -s updateserial.sh /usr/local/bin

使い方

編集したゾーンファイルを引数に指定します。複数指定しても OK です。

# cd /etc/nsd/edit
# updateserial.sh example.com

最後に

そもそも、このスクリプトを実行し忘れたら意味ないな、と思いました。
でも、シリアル値を手動で書き換える作業自体めんどくさいので、よしとしましょう。