def network_from_zone_name(name): """ Form a network from a zone name. TODO: Finish and test this. IPv6 mask code not complete! Partly inspired by dnspython dns.reverse.from_address() """ if name.endswith('.in-addr.arpa.'): rev_str = name[:name.rfind('.in-addr.arpa.')] addr_list = rev_str.split('.') addr_list.reverse() mask = len(addr_list) * 8 if mask not in (0, 8, 16, 24, 32): return None if len(addr_list): addr_str = '.'.join(addr_list) # Check address and make pretty try: addr_str = inet_ntop(AF_INET, inet_pton(AF_INET, addr_str)) except socket_error: return None else: addr_str = '0' return "%s/%s" % (addr_str, mask) elif name.endswith('.ip6.arpa.'): rev_str = name[:name.rfind('.ip6.arpa.')] addr_list = rev_str.split('.') addr_list.reverse() mask = len(addr_list) * 4 if mask not in range(0, 65, 4): return None # Start here l = len(addr_list) bytes_2 = [] i = 0 while i < l: bytes_2.append(''.join([x for x in addr_list[i:i+4]])) i += 4 addr_str = ':'.join(bytes_2) # Check address and make pretty try: addr_str = inet_ntop(AF_INET6, inet_pton(AF_INET6, addr_str)) except socket_error: return None return addr_str # Nothing can be done here! return None
def network_from_zone_name(name): """ Form a network from a zone name. TODO: Finish and test this. IPv6 mask code not complete! Partly inspired by dnspython dns.reverse.from_address() """ if name.endswith('.in-addr.arpa.'): rev_str = name[:name.rfind('.in-addr.arpa.')] addr_list = rev_str.split('.') addr_list.reverse() mask = len(addr_list) * 8 if mask not in (0, 8, 16, 24, 32): return None if len(addr_list): addr_str = '.'.join(addr_list) # Check address and make pretty try: addr_str = inet_ntop(AF_INET, inet_pton(AF_INET, addr_str)) except socket_error: return None else: addr_str = '0' return "%s/%s" % (addr_str, mask) elif name.endswith('.ip6.arpa.'): rev_str = name[:name.rfind('.ip6.arpa.')] addr_list = rev_str.split('.') addr_list.reverse() mask = len(addr_list) * 4 if mask not in range(0, 65, 4): return None # Start here l = len(addr_list) bytes_2 = [] i = 0 while i < l: bytes_2.append(''.join([x for x in addr_list[i:i + 4]])) i += 4 addr_str = ':'.join(bytes_2) # Check address and make pretty try: addr_str = inet_ntop(AF_INET6, inet_pton(AF_INET6, addr_str)) except socket_error: return None return addr_str # Nothing can be done here! return None
def addREV(ipaddress, ttl, name): reversedomain = dns.reversename.from_address(str(ipaddress)) reversedomain = str(reversedomain).rstrip('.') log.debug('[addREV] - reversedomain %s' % reversedomain) authdomain = getrevzone_auth(str(reversedomain)).rstrip('.') log.debug('[addREV] - authdomain %s' % authdomain) label = stripptr(authdomain, reversedomain) log.debug('[addREV] - label %s' % label) name = name if name.endswith("."): return else: name = name + '.' log.debug('[addREV] - name %s' % name) check4TSIG = TSIGSecured(authdomain) if check4TSIG.isSecure(authdomain): key = str(check4TSIG.TSIG(authdomain)) keyname = authdomain.replace(".", "_") keyring = dns.tsigkeyring.from_text({keyname: key}) update = dns.update.Update(authdomain, keyring=keyring) else: update = dns.update.Update(authdomain) update.replace(label, monitor_ttl, dns.rdatatype.PTR, name) response = dns.query.tcp(update, monitor_nameserver) return response
def get_rrname(self, rrname): """Formats the rrname using the options passed to the service Args: rrname (str): A string template for rendering the rrname to be requested """ name = rrname.format(**self.opts) if not name.endswith("."): name = "{}.".format(name) return name
def adjust_node_name(origin1, origin2, name): if name == '@': fqdn = str(origin1) elif name.endswith('.'): fqdn = name else: fqdn = name + '.' + str(origin1) fqdn = fqdn.rstrip('.') name2 = re.sub('\.?' + re.escape(str(origin2).rstrip('.')) + '$', '', fqdn) if name2.endswith(str(origin1).rstrip('.')): raise InvalidNodeComparison('%s (%s) => (%s)' % (fqdn, origin1, origin2)) if name2 == '': return '@' else: return name2
def adjust_node_name(origin1, origin2, name): if name == '@': fqdn = str(origin1) elif name.endswith('.'): fqdn = name else: fqdn = name + '.' + str(origin1) fqdn = fqdn.rstrip('.') name2 = re.sub('\.?' + re.escape(str(origin2).rstrip('.')) + '$', '', fqdn) if name2.endswith(str(origin1).rstrip('.')): raise InvalidNodeComparison('%s (%s) => (%s)' % (fqdn, origin1, origin2)) if name2 == '': return '@' else: return name2.lower()
def validate_initial_name(): if not name: return if isinstance(bind_file, StringIO): input_thing = 'StringIO object' elif file_name: input_thing = file_name else: input_thing = ('FD %s' % str(bind_file.fileno())) try: thing = dns.name.from_text(name) except Exception as exc: raise BadInitialZoneName(input_thing, name, str(exc)) if not is_inet_hostname(name): raise BadInitialZoneName(input_thing, name, None) if not name.endswith('.'): raise BadInitialZoneName(input_thing, name, "must end with '.'.")