====== Do It Yourself Dyn Dns ======
Dyndns does not propose its free service anymore. This is sad, because my verizon fios connection has a bad tendency to change its IP more often that I'd like. So I scripted a couple of cron jobs and worked around the problem with an automated root dns update.
linuxwall.info DNS servers run on bind. Which mean we control the zone with a zone file on the root dns. That root DNS can be updated manually, or, as I'm going to show, with a couple of sed commands.
===== - Get the IP to the root DNS =====
Step 1 is to have the server discover its new IP, and push it to the root DNS server. This is very simple to do in bash:
#!/usr/bin/env bash
cp /root/currentip.txt /root/lastip.txt
curl -s -o /root/currentip.txt http://ip.cow.org
if [ "$(md5sum /root/currentip.txt|awk '{print $1}')" != "$(md5sum /root/lastip.txt|awk '{print $1}')" ]
then
echo "$(hostname) IP has changed. old=$(cat /root/lastip.txt); new=$(cat /root/currentip.txt)"
scp /root/currentip.txt dnsupdater@rootdns.linuxwall.info:ips/$(hostname).current
fi
Get the new IP, and SCP it to the dns server.
===== - Update the Root DNS =====
Step 2 is a bit more tricky, because we need to parse the zone file with sed. Nothing tremendously difficult, but it's sed so be careful.
#!/usr/bin/env bash
MAILTO=notification@linuxwall.info
somehostip=$(cat /home/dnsupdater/ips/somehost.current)
if [ "$(grep -E "^somehost[[:space:]]+1h[[:space:]]+IN[[:space:]]+A[[:space:]]+$somehostip" /etc/bind/linuxwall.info.db)" = "" ]
then
echo "replacing somehost IP with new one"
TMP=$(mktemp)
sed -r "s|somehost\t\t1h\tIN\tA\t(\b[0-9]{1,3}\.){3}[0-9]{1,3}\b|somehost\t\t1h\tIN\tA\t$somehostip|" /etc/bind/linuxwall.info.db > $TMP
sed -ri "s|\t[0-9]{10};numero de serie de la zone. Format : YYYYMMDDnn|\t$(date +%Y%m%d%H);numero de serie de la zone. Format : YYYYMMDDnn|" $TMP
diff /etc/bind/linuxwall.info.db $TMP
cp /etc/bind/linuxwall.info.db{,.bkp$(date +%Y%m%d%H)}
cp $TMP /etc/bind/linuxwall.info.db
service bind9 restart
fi
===== - Reload the slaves =====
Step 3 is really straighforward, simply run rndc reload on all the slaves.
#!/usr/bin/env bash
/usr/sbin/rndc reload linuxwall.info 2>&1 1>/dev/null
Step 4: Profit! with a beer.