# Configuration
PASSWORD = 'hygCithOrs5'
-ZONE = '.dyn.colgarra.priv.at'
DEBUG = False
class OfflineInvalid(DynDnsError):
returncode = 'badparam' # not documented at dyn.com
+class NsupdateError(DynDnsError):
+ returncode = 'nohost'
+
fields = cgi.FieldStorage()
# strip zone
hostname = hostname.strip()
- if hostname.endswith(ZONE):
- hostname = hostname[:-len(ZONE)]
# check offline
if offline is None or offline.lower() == 'no':
# check IP address
if not offline:
if myip is None:
- raise MyipMissing()
+ # try HTTP_X_FORWARDED_FOR
+ myip = os.environ.get('HTTP_X_FORWARDED_FOR')
+ if not myip: # empty string if not present
+ # try REMOTE_ADDR
+ myip = os.environ.get('REMOTE_ADDR')
+ if not myip: # empty string if not present
+ raise MyipMissing()
+ if not myip is None:
try:
- ip = ipaddr.IPAddress(myip) # throws an exception if the IP address is not valid
+ ipaddr.IPAddress(myip) # throws an exception if the IP address is not valid
except ValueError:
raise MyipInvalid()
- if isinstance(ip, ipaddr.IPv4Address):
- iptype = 'A'
- elif isinstance(ip, ipaddr.IPv6Address):
- iptype = 'AAAA'
- else:
- raise MyipInvalid() # should never happen
# update bind
+ call_params = ['sudo', 'nsupdate_dyndns']
if offline:
- call(['sudo', '/usr/local/bin/nsupdate_dyndns', '--delete', hostname])
- else:
- call(['sudo', '/usr/local/bin/nsupdate_dyndns', '--ip', myip, hostname])
+ call_params.append('--delete')
+ if myip is not None:
+ call_params.extend(['--ip', myip])
+ call_params.append(hostname)
+ retcode = call(call_params)
+ if retcode != 0:
+ raise NsupdateError()
# return success
print "Content-Type: text/html"