61 lines
1.9 KiB
Python
61 lines
1.9 KiB
Python
import re
|
|
import json
|
|
|
|
import etcd
|
|
|
|
from onedns.logger import log
|
|
|
|
RE_VALIDNAME = re.compile('[^\w\d.-]')
|
|
|
|
|
|
class SkyDNSClient(object):
|
|
def __init__(self, domain, etcd_kwargs={}):
|
|
self.domain = domain
|
|
self._reverse_domain_parts = domain.split('.')
|
|
self._reverse_domain_parts.reverse()
|
|
self._etcd = etcd.Client(**etcd_kwargs)
|
|
|
|
def _sanitize_name(self, name):
|
|
return RE_VALIDNAME.sub('', name).rstrip('.')
|
|
|
|
def _skydns_ns(self, parts):
|
|
return '/'.join(['skydns'] + parts)
|
|
|
|
def _get_forward_ns(self, hostname):
|
|
return self._skydns_ns(self._reverse_domain_parts + [hostname])
|
|
|
|
def _get_reverse_ns(self, ip):
|
|
ip_parts = ip.split('.')
|
|
return self._skydns_ns(['arpa/in-addr'] + ip_parts)
|
|
|
|
def add_forward(self, hostname, ip):
|
|
forward = self._get_forward_ns(hostname)
|
|
log.debug("adding forward: {path}".format(path=forward))
|
|
self._etcd.write(forward, json.dumps(dict(host=ip)))
|
|
|
|
def remove_forward(self, hostname):
|
|
forward = self._get_forward_ns(hostname)
|
|
log.debug("removing forward: {path}".format(path=forward))
|
|
self._etcd.delete(forward)
|
|
|
|
def add_reverse(self, ip, hostname):
|
|
reverse = self._get_reverse_ns(ip)
|
|
fqdn = '.'.join([hostname, self.domain])
|
|
log.debug("adding reverse: {path}".format(path=reverse))
|
|
self._etcd.write(reverse, json.dumps(dict(host=fqdn)))
|
|
|
|
def remove_reverse(self, ip):
|
|
reverse = self._get_reverse_ns(ip)
|
|
log.debug("removing reverse: {path}".format(path=reverse))
|
|
self._etcd.delete(reverse)
|
|
|
|
def add_host(self, hostname, ip):
|
|
hostname = self._sanitize_name(hostname)
|
|
self.add_forward(hostname, ip)
|
|
self.add_reverse(ip, hostname)
|
|
|
|
def remove_host(self, hostname, ip):
|
|
hostname = self._sanitize_name(hostname)
|
|
self.remove_forward(hostname)
|
|
self.remove_reverse(ip)
|