aboutsummaryrefslogtreecommitdiffstats
path: root/ddns/backend
diff options
context:
space:
mode:
authorMarius Halden <marius.h@lden.org>2014-03-17 04:16:49 +0100
committerMarius Halden <marius.h@lden.org>2014-03-17 04:16:49 +0100
commit7c575aaa8e98a6aa7eda8d69e2b14d014ee91b09 (patch)
tree7bd082fd216e1577440cf1ea599467993c2fef36 /ddns/backend
downloadDDNS.py-7c575aaa8e98a6aa7eda8d69e2b14d014ee91b09.tar.gz
DDNS.py-7c575aaa8e98a6aa7eda8d69e2b14d014ee91b09.tar.bz2
DDNS.py-7c575aaa8e98a6aa7eda8d69e2b14d014ee91b09.tar.xz
Initial commit
Diffstat (limited to 'ddns/backend')
-rw-r--r--ddns/backend/__init__.py0
-rw-r--r--ddns/backend/dnsupdate.py74
2 files changed, 74 insertions, 0 deletions
diff --git a/ddns/backend/__init__.py b/ddns/backend/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ddns/backend/__init__.py
diff --git a/ddns/backend/dnsupdate.py b/ddns/backend/dnsupdate.py
new file mode 100644
index 0000000..cd1dee2
--- /dev/null
+++ b/ddns/backend/dnsupdate.py
@@ -0,0 +1,74 @@
+import dns.query
+import dns.tsig
+import dns.tsigkeyring
+import dns.update
+import dns.resolver
+import ddns.cfg_parser
+
+zone_cfg = None
+keyring = None
+
+def resolve(domain, rtype='A'):
+ return dns.resolver.query(domain, rtype)
+
+def check_ip(domain, ip, rtype='A'):
+ ans = resolve(domain.encode('ascii'), rtype)
+
+ if not ans:
+ return False
+
+ for rdata in ans:
+ if rdata == ip.strNormal(0):
+ return True
+ return False
+
+def get_zone(name):
+ for zone in zone_cfg:
+ if zone['name'] == name:
+ return zone
+ return None
+
+def gen_keyring(dnskeys):
+ global keyring
+
+ keys = {}
+ for key in dnskeys:
+ keys[key['name']] = key['key']
+
+ keyring = dns.tsigkeyring.from_text(keys)
+
+def get_hash_method(hash_name):
+ if hash_name == 'HMAC-MD5':
+ return dns.tsig.HMAC_MD5
+ if hash_name == 'HMAC-SHA1':
+ return dns.tsig.HMAC_SHA1
+ if hash_name == 'HMAC-SHA224':
+ return dns.tsig.HMAC_SHA224
+ if hash_name == 'HMAC-SHA256':
+ return dns.tsig.HMAC_SHA256
+ if hash_name == 'HMAC-SHA384':
+ return dns.tsig.HMAC_384
+ if hash_name == 'HMAC-SHA512':
+ return dns.tsig.HMAC_512
+ return dns.tsig.default_algorithm
+
+def update_dns(zone, hostname, ip, ttl=300):
+ zone = get_zone(zone)
+ dns_srv = zone['ns']
+
+ update = dns.update.Update(zone['name'], keyring=keyring, \
+ keyname=zone['key']['name'], \
+ keyalgorithm=get_hash_method(zone['key']['algorithm']))
+
+ if ip.version() == 6:
+ rtype = 'AAAA'
+ else:
+ rtype = 'A'
+
+# if not check_ip(hostname+'.'+zone['name'], ip, rtype):
+ update.replace(hostname.encode('ascii'), ttl, rtype, ip.strNormal(0))
+ res = dns.query.tcp(update, dns_srv)
+
+zone_cfg = ddns.cfg_parser.cfg['zones']
+keyring = gen_keyring(ddns.cfg_parser.cfg['dnskeys'])
+