pvl/dns/reverse.py
author Tero Marttila <terom@paivola.fi>
Tue, 10 Mar 2015 00:26:31 +0200
changeset 740 74352351d6f5
parent 499 51bab9649e77
permissions -rw-r--r--
replace ipaddr with ipaddress
740
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
     1
import ipaddress
456
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     2
import math
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     3
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     4
def reverse_ipv4 (ip) :
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     5
    """
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     6
        Return in-addr.arpa reverse for given IPv4 prefix.
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     7
    """
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     8
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     9
    # parse
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    10
    octets = tuple(int(part) for part in ip.split('.'))
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    11
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    12
    for octet in octets :
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    13
        assert 0 <= octet <= 255
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    14
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    15
    return '.'.join([str(octet) for octet in reversed(octets)] + ['in-addr', 'arpa'])
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    16
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    17
def reverse_ipv6 (ip6) :
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    18
    """
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    19
        Return ip6.arpa reverse for given IPv6 prefix.
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    20
    """
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    21
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    22
    # XXX: this is broken for fd80::1?
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    23
    parts = [int(part, 16) for part in ip6.split(':')]
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    24
    parts = ['{0:04x}'.format(part) for part in parts]
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    25
    parts = ''.join(parts)
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    26
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    27
    return '.'.join(tuple(reversed(parts)) + ( 'ip6', 'arpa'))
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    28
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    29
def reverse_label (prefix, address) :
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    30
    """
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    31
        Determine the correct label for the given IP address within the reverse zone for the given prefix.
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    32
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    33
        This includes all suffix octets (partially) covered by the prefix.
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    34
    """
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    35
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    36
    assert prefix.version == address.version
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    37
    assert address in prefix
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    38
    
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    39
    hostbits = prefix.max_prefixlen - prefix.prefixlen
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    40
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    41
    if prefix.version == 4 :
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    42
        # pack into octets
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    43
        octets = [ord(x) for x in address.packed]
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    44
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    45
        # take the suffix
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    46
        octets = octets[-int(math.ceil(hostbits / 8.0)):]
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    47
        
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    48
        # reverse in decimal
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    49
        return '.'.join(reversed(["{0:d}".format(x) for x in octets]))
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    50
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    51
    elif prefix.version == 6 :
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    52
        # pack into nibbles
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    53
        nibbles = [((ord(x) >> 4) & 0xf, ord(x) & 0xf) for x in address.packed]
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    54
        nibbles = [nibble for nibblepair in nibbles for nibble in nibblepair]
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    55
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    56
        # take the suffix
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    57
        nibbles = nibbles[-(hostbits / 4):]
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    58
        
740
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
    59
        # reveurse in hex
456
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    60
        return '.'.join(reversed(["{0:x}".format(x) for x in nibbles]))
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    61
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    62
    else :
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    63
        raise ValueError("unsupported address version: %s" % (prefix, ))
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    64
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    65
def _split_ipv6_parts (prefix) :
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    66
    """
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    67
        Split a partial IPv6 address into hexadecimal nibbles
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    68
    """
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    69
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    70
    if prefix.endswith('::'):
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    71
        prefix = prefix[:-2]
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    72
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    73
    for hextet in prefix.split(':') :
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    74
        for nibble in hextet.rjust(4, '0') :
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    75
            yield nibble
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    76
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    77
def _build_ipv6_parts (parts) :
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    78
    """
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    79
        Group an iterable of hexadecimal nibbles into hextets.
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    80
    """
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    81
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    82
    for i in xrange(0, len(parts), 4) :
740
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
    83
        yield u''.join(parts[i:i+4])
456
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    84
    
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    85
    # suffix ::
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    86
    if len(parts) < 32 :
740
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
    87
        yield u''
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
    88
        yield u''
456
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    89
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    90
def parse_prefix (prefix) :
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    91
    """
740
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
    92
        Return an ipaddress.IPNetwork from given filesystem-compatbile IPv4/IPv6 prefix-ish variant.
499
51bab9649e77 pvl.dns.parse_prefix: fixup doc
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    93
51bab9649e77 pvl.dns.parse_prefix: fixup doc
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    94
        Supports partial IPv4 prefixes on octet boundaries.
51bab9649e77 pvl.dns.parse_prefix: fixup doc
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    95
        Supports partial IPv6 prefixes on nibble boundaries.
51bab9649e77 pvl.dns.parse_prefix: fixup doc
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    96
        Supports IPv4 prefxies using "-" as the prefix separator in place of "/".
456
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    97
740
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
    98
        >>> print parse_prefix('127.0.0.0/8')
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
    99
        127.0.0.0/8
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   100
        >>> print parse_prefix('192.0.2.128/26')
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   101
        192.0.2.128/26
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   102
        >>> print parse_prefix('192.0.2.128-26')
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   103
        192.0.2.128/26
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   104
        >>> print parse_prefix('127.')
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   105
        127.0.0.0/8
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   106
        >>> print parse_prefix('10')
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   107
        10.0.0.0/8
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   108
        >>> print parse_prefix('192.168')
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   109
        192.168.0.0/16
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   110
        >>> print parse_prefix('fe80::')
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   111
        fe80::/16
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   112
        >>> print parse_prefix('2001:db8::')
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   113
        2001:db8::/32
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   114
        >>> print parse_prefix('2001:db8:1:2')
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   115
        2001:db8:1:2::/64
456
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   116
    """
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   117
740
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   118
    prefix = unicode(prefix)
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   119
456
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   120
    if '/' in prefix :
740
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   121
        return ipaddress.ip_network(prefix)
456
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   122
    
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   123
    elif '-' in prefix :
740
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   124
        return ipaddress.ip_network(prefix.replace('-', '/'))
456
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   125
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   126
    elif '.' in prefix or prefix.isdigit() :
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   127
        parts = prefix.rstrip('.').split('.')
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   128
        prefixlen = len(parts) * 8
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   129
        
740
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   130
        return ipaddress.IPv4Network(u'{prefix}/{prefixlen}'.format(
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   131
            prefix      = u'.'.join(parts + [u'0' for i in xrange(4 - len(parts))]),
456
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   132
            prefixlen   = prefixlen,
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   133
        ))
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   134
   
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   135
    elif ':' in prefix :
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   136
        parts = list(_split_ipv6_parts(prefix))
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   137
        prefixlen = len(parts) * 4
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   138
740
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   139
        return ipaddress.IPv6Network(u'{prefix}/{prefixlen}'.format(
74352351d6f5 replace ipaddr with ipaddress
Tero Marttila <terom@paivola.fi>
parents: 499
diff changeset
   140
            prefix      = u':'.join(_build_ipv6_parts(parts)),
456
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   141
            prefixlen   = prefixlen,
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   142
        ))
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   143
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   144
    else :
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   145
        raise ValueError("Unrecognized IP prefix string: %s" % (prefix, ))
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   146