1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
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 get_key(name):
for key in cfg['dnskeys']:
if key['name'] == name:
return key
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)
|