author | Tero Marttila <terom@paivola.fi> |
Tue, 10 Mar 2015 00:26:31 +0200 | |
changeset 740 | 74352351d6f5 |
parent 499 | 51bab9649e77 |
permissions | -rw-r--r-- |
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 |