#!/bin/sh
# Synchronize a dns server with alternc's remote server : 
# the configuration files contains definitions for remote masters.

CONFDIR=/etc/slavedns
CACHEDIR=/var/cache/slavedns
BINDDIR=/etc/bind/slavedns
BINDINCLUDE=/etc/bind/slavedns.conf
WGETRC=${HOME}/.wgetrc

#NAMED9=/usr/pkg/etc/rc.d/named9 # BIND9 on NetBSD
#NAMED8=/etc/rc.d/named # BIND8 on NetBSD/FreeBSD/OpenBSD
#NAMED8=/etc/init.d/named # BIND8 on some Linux
#NAMED9=/etc/init.d/named9 # BIND9 on some Linux
NAMED8=/etc/init.d/bind # BIND8 on other Linux
NAMED9=/etc/init.d/bind9 # BIND9 on other Linux

TIMEOUT=5
NAMED="${NAMED8} ${NAMED9}"

CreateBindConf() {
    CFILE="$1"
    rm -f ${BINDDIR}/${CFILE}
    while read domain
    do
      cat >> ${BINDDIR}/${CFILE}.$$ <<EOF
zone "$domain" {
    type slave;
    allow-query { any; };
    file "$domain";
    masters { ${MASTERIP}; };
};
EOF
    done < ${CACHEDIR}/${CFILE}
    mv ${BINDDIR}/${CFILE}.$$ ${BINDDIR}/${CFILE}
    INCLUDE_STR="include \"${BINDDIR}/${CFILE}\";"

    grep -q "${INCLUDE_STR}" ${BINDINCLUDE} || echo ${INCLUDE_STR} >>${BINDINCLUDE}
}

SetWgetPass() {
    USER="$1"
    PASS="$2"
    if [ -e ${WGETRC} ]; then
        mv ${WGETRC} ${WGETRC}.$$
    fi
    touch ${WGETRC}
    chmod og-r ${WGETRC}
    cat >> ${WGETRC} <<EOF
http_user = ${USER}
http_passwd = ${PASS}
EOF
}

ResetWgetConf() {
    mv -f ${WGETRC}.$$ ${WGETRC} 2>/dev/null || rm -f ${WGETRC}
}

# Main procedure : parse each config file and download the raw slave list.
# if something changed in a list, call CreateBindConf $i 

cd $CONFDIR

RELOAD=""

for conf in `ls | grep -v slavedns.conf | grep -v '~$' `
do
  # HOST LOGIN PASSWORD MASTERIP
  HOST=""
  MASTERIP=""
  LOGIN=""
  PASSWORD=""
  SSL=""
  . ./${conf}
  if [ -z "$HOST" -o -z "$LOGIN" -o -z "$PASSWORD" -o -z "$MASTERIP" ]
  then
      echo "error in the config file '${conf}'" >&2
  else
      if [ "$SSL" ] 
      then
	  PROTOCOL="https"
      else
	  PROTOCOL="http"
      fi
      touch ${CACHEDIR}/${conf}
      rm -f ${CACHEDIR}/${conf}.temp
      SetWgetPass ${LOGIN} ${PASSWORD}
      wget ${PROTOCOL}://${HOST}/admin/domlist.php -O ${CACHEDIR}/${conf}.temp -t 1 -T ${TIMEOUT} 2>/dev/null
      ResetWgetConf
      if [ -s "${CACHEDIR}/${conf}.temp" ]
      then
          # If the slave file has changed, synchronize it.
	  if  [ "$1" != "-f" ] && diff ${CACHEDIR}/${conf}.temp ${CACHEDIR}/${conf} -q &>/dev/null
	  then
	      echo "no change found for '${conf}'"
	  else
	      echo "change detected for '${conf}', applying"
	      mv -f ${CACHEDIR}/${conf}.temp ${CACHEDIR}/${conf}
	      # Now parse the slave file and send it to /etc/bind/slavedns
	      CreateBindConf ${conf} 
	      RELOAD="YES"
	  fi
      else
	  echo "error: downloaded file for '${conf}' has zero size" >&2
      fi
  fi
done	 # Main loop on config files

if [ "$RELOAD" ]
then
    for script in $NAMED
    do
      if [ -x ${script} ]
      then
          ${script} reload
      fi
    done
fi
