aboutsummaryrefslogtreecommitdiffstats
path: root/ddns/backend/dnsupdate.py
blob: b64cefd4ed91c335a4c51414eee173d3f4005ce7 (plain)
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)