PDNS Clean-up script

Een aantal weken geleden zijn we begonnen met het vervangen van de BIND slave servers, door PowerDNS (MySQL backend) slave servers. Wij hebben hier gekozen voor PowerDNS omdat PowerDNS een optie heeft om supermasters te configureren.

In BIND-BIND configuraties dienen de zone files op zowel de master als de slave aangemaakt te worden. In een BIND-PowerDNS (met supermaster) configuratie, hoeven de zones alleen op de master aangemaakt te worden. De slave neemt deze zones automatisch over van de supermaster.

Dit is natuurlijk een groot voordeel t.o.v. een BIND-BIND configuratie, echter brengt het gebruik van supermasters ook een nadeel met zich mee. Wat gebeurd er als een zone word verwijderd van de master? Wordt deze zone dan ook automatisch verwijderd van de slave?

Helaas is het antwoord hierop: Nee… deze zones zullen handmatig moeten worden verwijderd van de slaves. Met een paar zones is dit nog te doen, met 1000 zones wordt dit een onmogelijke taak. Hier is dus een geautomatiseerd script nodig om deze verwijderde zones van de slaves te halen. Na lang en uitgebreid zoeken heb ik hier geen scripts voor kunnen vinden en uiteindelijk besloten om zelf een script te schrijven.

Het gaat hier om een Bash script. Het script draait op de slave servers (kan worden ingezet als cronjob) en gebruikt de output van Dig om te controleren of het domein (zone) nog actief is. Vervolgens kan de zone via MySQL verwijderd worden.

#!/bin/bash
# Dependencies:
# bind-utils
# mysql-client
#### Config ################################

DBUSER="pdns"
DBPASS="****"

#### End of Config #########################

MYSQL="mysql -u $DBUSER -p$DBPASS --skip-column-name --silent -e"

check() {
AUTH=`dig @$1 $2 | grep "status" | awk -F , '{print $2}' | awk -F ': ' '{print $2}'`
if [ $AUTH = "REFUSED" ] || [ $AUTH = "NXDOMAIN" ]; then
echo "$1 $2: Server not AUTH or SERVfail - removing zone..."
DOMAIN_ID=`$MYSQL "USE pdns; SELECT id FROM domains WHERE name='$2' AND type='SLAVE' AND master='$1' LIMIT 1;"`
$MYSQL "USE pdns; DELETE FROM records WHERE domain_id='$DOMAIN_ID';"
$MYSQL "USE pdns; DELETE FROM domains WHERE id='$DOMAIN_ID';"
fi
}

MASTERS=(`$MYSQL "USE pdns; SELECT DISTINCT ip FROM supermasters;"`)
for m in "${MASTERS[@]}"; do
NAMES=(`$MYSQL "USE pdns; SELECT name FROM domains WHERE type = 'SLAVE' AND master = '${m}';"`)
for d in "${NAMES[@]}"; do
check ${m} ${d}
done
done

 

0 Comments

Leave A Reply

You must be logged in to post a comment.