#!/bin/sh

# Watchdog for the primary name server.

REMOTE="gandi"
REMOTE_DIR="/var/powerdns/"
DIR="$REMOTE_DIR"

echo "directory: $DIR"

local_update() {
	echo "local update of domain $1"
	pdns_control bind-reload-now $1

	# In case the update cannot be done, it might be because the zone wasn't loaded at all.
	if [ $? -ne 0 ]; then
		pdns_control bind-add-zone $1 $DIR/$1
	fi
}

local_delete() {
	echo "TODO: local delete of domain $1"
}

remote_update() {
	echo "remote update on $REMOTE $REMOTE_DIR/$1"
	scp $DIR/$1 $REMOTE:$REMOTE_DIR
}

remote_delete() {
	echo "remote delete on $REMOTE $REMOTE_DIR/$1"
	ssh $REMOTE rm $REMOTE_DIR/$1
}

action() {
	event=$1
	file=$2

	echo $event | grep "MOVED_TO" >/dev/null
	if [ $? -eq 0 ]; then
		echo "$file has been modified"
		local_update $file
		remote_update $file
	fi

	echo $event | grep "DELETE" >/dev/null
	if [ $? -eq 0 ]; then
		echo "$file has been deleted"
		local_delete $file
		remote_delete $file
	fi
}

# NOTE: dnsmanagerd writes bind9 files in $DIR and with a suffix ".wip" then moves them
#       to remove the suffix. This way, the final file is expected to never be corrupted,
#       for example by copying it to the secondary DNS server while the zone not being
#       fully written to the file.
#
# Therefore, the different interesting actions we should monitor are:
# - moved_to: a zone file has been modified
# - delete: a domain has been removed
opts="-e moved_to -e delete -m"
echo "inotifywait ${opts} --format '%:e %f' $DIR"
inotifywait ${opts} --format '%:e %f' $DIR | while read FILE; do action $FILE ; done