예제 #1
0
파일: dns.py 프로젝트: carriercomm/dms
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
예제 #2
0
파일: dns.py 프로젝트: kenser/dms
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
예제 #3
0
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
예제 #4
0
    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
예제 #5
0
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
예제 #6
0
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()
예제 #7
0
 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 '.'.")