diff --git a/helper_scripts/pdns-slave-zone-cleanup.sh b/helper_scripts/pdns-slave-zone-cleanup.sh new file mode 100755 index 0000000000000000000000000000000000000000..0e64a50432a231335f5a71f04b00ed54a9246faa --- /dev/null +++ b/helper_scripts/pdns-slave-zone-cleanup.sh @@ -0,0 +1,57 @@ +#!/bin/bash +#### Config ################################ + +DBHOST="localhost" +DBUSER="powerdns" +DBPASS="password" +DATABASE="powerdns" + +DEBUG="no" + +#### End of Config ######################### + +REQUIRED_COMMANDS=" +mysql +host +grep +awk +tail +" + +# print debug messages to STDERR +function debug { + if [ "${DEBUG}" == "yes" ] ; then + echo "DEBUG: $@" >&2 + fi +} + +for CMD in ${REQUIRED_COMMANDS} ; do + CMDNAME=`echo ${CMD} | awk '{print toupper($1) }' | sed -e s@"-"@""@g` + export $(eval "echo ${CMDNAME}")=`which ${CMD} 2>/dev/null` + if [ -z "${!CMDNAME}" ] ; then + debug "Command: ${CMD} not found!" + exit 1 + else + debug "Found command $(echo $CMDNAME) in ${!CMDNAME}" + fi +done + +MYSQLCMD="${MYSQL} -h ${DBHOST} -u ${DBUSER} -p${DBPASS} --skip-column-name --silent -e" + +check() { + AUTH=`${HOST} -t SOA ${2} ${1} | ${TAIL} -n1 | ${GREP} "has no SOA record"` + if [ "${AUTH}" == "${2} has no SOA record" ]; then + debug "Server ${1} has no SOA for ${2} - removing zone..." + DOMAIN_ID=`${MYSQLCMD} "USE ${DATABASE}; SELECT id FROM domains WHERE name='${2}' AND type='SLAVE' AND master='${1}' LIMIT 1;"` + ${MYSQLCMD} "USE ${DATABASE}; DELETE FROM records WHERE domain_id='${DOMAIN_ID}';" + ${MYSQLCMD} "USE ${DATABASE}; DELETE FROM domains WHERE id='${DOMAIN_ID}';" + fi +} + +MASTERS=(`${MYSQLCMD} "USE ${DATABASE}; SELECT DISTINCT ip FROM supermasters;"`) +for m in "${MASTERS[@]}"; do + NAMES=(`${MYSQLCMD} "USE ${DATABASE}; SELECT name FROM domains WHERE type = 'SLAVE' AND master = '${m}';"`) + for d in "${NAMES[@]}"; do + check ${m} ${d} + done +done