Linode Dynamic DNS Ash Script

After my post last night regarding a bash script to update Linode's DNS Manager, opello from #linode on OFTC provided some sed commands to parse the JSON output. Using his commands, I made another version of the script.  I've tested this on my router running the Tomato firmware (which runs BusyBox).

I found that the wget command built into the version of BusyBox does not support HTTP POST. It also does not support https urls, only http. This means your Linode API key would be transmitted in clear text, which probably isn't a good thing.

Another solution that was suggested was to simply wget a CGI script running on your webserver, which could update the Linode DNS Manager using perl or python over secure channels. That would reduce the complexity on the home router side and allow you to use the developed Linode API libraries.

Therefor, I wouldn't recommend using this unless you are able to send the requests over ssl channels. I am glad to have a slightly better understanding of sed. I'll probably modify the original bash script to use that as well.

#!/bin/ash
#
# Script to update Linode's DNS Manager for a given name.
#

# Things you need to change.
APIKEY=$(cat /home/root/linode-apikey)
LASTIP="/tmp/lastip"
DOMAIN="domain.com"
SOAEMAIL="hostmaster@domain.com"
STATUS="1"
RRTYPE="A"
RRNAME="home"
IFACE="vlan1"

# Shouldn't need to change anything below here.

WGET="wget -qO - http://api.linode.com/api/?api_key=$APIKEY"
NEWIP=$(ifconfig $IFACE | head -n2 | tail -n1 | cut -d: -f2 | cut -d' ' -f1)
test -e $LASTIP && OLDIP=$(cat $LASTIP) || OLDIP=""

if [ x"$OLDIP" = x"$NEWIP" ]; then
  logger "No IP address change detected. Keeping $NEWIP"
else
   DOMAINID=$($WGET"&action=domainList" | 
        sed -nr "s#.*"DOMAIN":"$DOMAIN","DOMAINID":([0-9]+),.*#1#p")
   RESOURCEID=$($WGET"&action=domainResourceList&DomainID=$DOMAINID" | 
        sed -nr "s#.*"RESOURCEID":([0-9]+),"DOMAINID":$DOMAINID,"TYPE":"$RRTYPE","NAME":"$RRNAME".*#1#p")
   $WGET"&action=domainResourceSave&ResourceID=$RESOURCEID&DomainID=$DOMAINID&Name=$RRNAME&Type=$RRTYPE&Target=$NEWIP"; echo
   $WGET"&action=domainSave&DomainID=$DOMAINID&Domain=$DOMAIN&Type=master&Status=$STATUS&SOA_Email=$SOAEMAIL"; echo
   echo $NEWIP > $LASTIP
   logger "Updated IP address to $NEWIP"
fi

Tags: , , , , , ,

One Response to “Linode Dynamic DNS Ash Script”

  1. C.Lee Taylor Says:

    This script looks awesome, but I am not able to get the sed parsing correctly.
    The sed code for DomainID, is not selecting just the ID for the domain.

    I was able to find - http://www.cnysupport.com/index.php/linode-dynamic-dns-ddns-update-script - But it would be nicer to have this pulled from Linode and not added in the config.

    You not up to updating your sed code?

    Thanks
    Mailed
    LeeT

Leave a Reply


css.php