diff options
author | Marius Halden <marius.h@lden.org> | 2014-03-17 04:16:49 +0100 |
---|---|---|
committer | Marius Halden <marius.h@lden.org> | 2014-03-17 04:16:49 +0100 |
commit | 7c575aaa8e98a6aa7eda8d69e2b14d014ee91b09 (patch) | |
tree | 7bd082fd216e1577440cf1ea599467993c2fef36 /ddns/backend/dnsupdate.py | |
download | DDNS.py-7c575aaa8e98a6aa7eda8d69e2b14d014ee91b09.tar.gz DDNS.py-7c575aaa8e98a6aa7eda8d69e2b14d014ee91b09.tar.bz2 DDNS.py-7c575aaa8e98a6aa7eda8d69e2b14d014ee91b09.tar.xz |
Initial commit
Diffstat (limited to 'ddns/backend/dnsupdate.py')
-rw-r--r-- | ddns/backend/dnsupdate.py | 74 |
1 files changed, 74 insertions, 0 deletions
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']) + |