import dns.query import dns.tsig import dns.tsigkeyring import dns.update import dns.resolver import ddns.cfg_parser 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 ddns.cfg_parser.cfg.get('zones'): 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): if not keyring or keyring == None: gen_keyring(ddns.cfg_parser.cfg.get('dnskeys')) 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)