#!/usr/bin/env python """ ddns.py Simple wrapper class for the nsupdate commmand 3 methods: domainExists(domain): returns true if domain exists addDomain(domain, *args): add string in nsupdate format delDomain(domain, *args): delete domain in nsupdate format examples: ddns.py add host.domain A 192.168.1.1 ddns.py del host.domain A 192.168.1.1 Basically, just the same format as nsupdate except you don't have to specify the timeout on the command line and you can shorten delete to del. """ """ config variables """ server = '127.0.0.1' nscmd = "/usr/bin/nsupdate" keyfile = "/path/to/key" timeout = 36000 """ imports """ import os, sys, dns.resolver """ code """ class nsupdate: def __init__(self, config): self.config = config self.command = "%s -v -k %s" % (self.config['nscmd'], self.config['keyfile']) self.batch = [] self.batch.append("server %s" % self.config['server']) def domainExists(self, domain): try: answer = dns.resolver.query(domain, 'a') except dns.resolver.NXDOMAIN: return 0 else: return 1 def addDomain(self, domain, *args): parts = domain.split('.') zone = '.'.join(parts[1:]) self.batch.append("zone %s" % zone) self.batch.append("update add %s %s IN %s" % (domain, self.config['timeout'], args[0])) self.batch.append("send") self.commit() def delDomain(self, domain, *args): parts = domain.split('.') zone = '.'.join(parts[1:]) self.batch.append("zone %s" % zone) self.batch.append("update delete %s %s IN %s" % (domain, self.config['timeout'], args[0])) self.batch.append("send") self.commit() def commit(self): opipe = os.popen(self.command, 'w') for b in self.batch: print b opipe.write("%s\n" % b) opipe.close() if __name__ == "__main__": if len(sys.argv) < 5: print "\nSyntax: ddns.py [add|del] nsupdate string\n" else: config = {} config['nscmd'] = nscmd config['server'] = server config['keyfile'] = keyfile config['timeout'] = timeout NS = nsupdate(config) if sys.argv[1] == 'add': if not NS.domainExists(sys.argv[2]): NS.addDomain(sys.argv[2], ' '.join(sys.argv[3:])) elif sys.argv[1] == 'del': if NS.domainExists(sys.argv[2]): NS.delDomain(sys.argv[2], ' '.join(sys.argv[3:])) else: print "\nSyntax: ddns.py [add|del] nsupdate string\n"