blob: 3e6f9e499c32bc2c93273545dec1a7ebcb088e42 [file] [log] [blame]
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001# Copyright 2007 Google Inc.
2# Licensed to PSF under a Contributor Agreement.
3
4"""A fast, lightweight IPv4/IPv6 manipulation library in Python.
5
6This library is used to create/poke/manipulate IPv4 and IPv6 addresses
7and networks.
8
9"""
10
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +020011from __future__ import unicode_literals
12
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +010013
Philipp Hagemeister3d0d7622015-07-13 04:43:05 +020014import itertools
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +020015import struct
16
Philipp Hagemeisterd8aef062019-10-18 03:30:15 +020017__version__ = '1.0.23'
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +020018
19# Compatibility functions
20_compat_int_types = (int,)
21try:
22 _compat_int_types = (int, long)
23except NameError:
24 pass
25try:
26 _compat_str = unicode
27except NameError:
28 _compat_str = str
29 assert bytes != str
30if b'\0'[0] == 0: # Python 3 semantics
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +020031 def _compat_bytes_to_byte_vals(byt):
32 return byt
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +020033else:
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +020034 def _compat_bytes_to_byte_vals(byt):
35 return [struct.unpack(b'!B', b)[0] for b in byt]
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +020036try:
37 _compat_int_from_byte_vals = int.from_bytes
38except AttributeError:
39 def _compat_int_from_byte_vals(bytvals, endianess):
40 assert endianess == 'big'
41 res = 0
42 for bv in bytvals:
43 assert isinstance(bv, _compat_int_types)
44 res = (res << 8) + bv
45 return res
46
47
48def _compat_to_bytes(intval, length, endianess):
49 assert isinstance(intval, _compat_int_types)
50 assert endianess == 'big'
51 if length == 4:
52 if intval < 0 or intval >= 2 ** 32:
53 raise struct.error("integer out of range for 'I' format code")
54 return struct.pack(b'!I', intval)
55 elif length == 16:
56 if intval < 0 or intval >= 2 ** 128:
57 raise struct.error("integer out of range for 'QQ' format code")
58 return struct.pack(b'!QQ', intval >> 64, intval & 0xffffffffffffffff)
59 else:
60 raise NotImplementedError()
Philipp Hagemeistercb3f8402017-01-11 13:28:55 +010061
62
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +020063if hasattr(int, 'bit_length'):
64 # Not int.bit_length , since that won't work in 2.7 where long exists
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +020065 def _compat_bit_length(i):
66 return i.bit_length()
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +020067else:
Philipp Hagemeister3d0d7622015-07-13 04:43:05 +020068 def _compat_bit_length(i):
69 for res in itertools.count():
70 if i >> res == 0:
71 return res
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +020072
73
74def _compat_range(start, end, step=1):
75 assert step > 0
76 i = start
77 while i < end:
78 yield i
79 i += step
80
81
82class _TotalOrderingMixin(object):
Philipp Hagemeisterc0de8122015-07-13 05:40:41 +020083 __slots__ = ()
84
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +020085 # Helper that derives the other comparison operations from
86 # __lt__ and __eq__
87 # We avoid functools.total_ordering because it doesn't handle
88 # NotImplemented correctly yet (http://bugs.python.org/issue10042)
89 def __eq__(self, other):
90 raise NotImplementedError
91
92 def __ne__(self, other):
93 equal = self.__eq__(other)
94 if equal is NotImplemented:
95 return NotImplemented
96 return not equal
97
98 def __lt__(self, other):
99 raise NotImplementedError
100
101 def __le__(self, other):
102 less = self.__lt__(other)
103 if less is NotImplemented or not less:
104 return self.__eq__(other)
105 return less
106
107 def __gt__(self, other):
108 less = self.__lt__(other)
109 if less is NotImplemented:
110 return NotImplemented
111 equal = self.__eq__(other)
112 if equal is NotImplemented:
113 return NotImplemented
114 return not (less or equal)
115
116 def __ge__(self, other):
117 less = self.__lt__(other)
118 if less is NotImplemented:
119 return NotImplemented
120 return not less
121
122
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100123IPV4LENGTH = 32
124IPV6LENGTH = 128
125
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +0200126
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100127class AddressValueError(ValueError):
128 """A Value Error related to the address."""
129
130
131class NetmaskValueError(ValueError):
132 """A Value Error related to the netmask."""
133
134
135def ip_address(address):
136 """Take an IP string/int and return an object of the correct type.
137
138 Args:
139 address: A string or integer, the IP address. Either IPv4 or
140 IPv6 addresses may be supplied; integers less than 2**32 will
141 be considered to be IPv4 by default.
142
143 Returns:
144 An IPv4Address or IPv6Address object.
145
146 Raises:
147 ValueError: if the *address* passed isn't either a v4 or a v6
148 address
149
150 """
151 try:
152 return IPv4Address(address)
153 except (AddressValueError, NetmaskValueError):
154 pass
155
156 try:
157 return IPv6Address(address)
158 except (AddressValueError, NetmaskValueError):
159 pass
160
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200161 if isinstance(address, bytes):
162 raise AddressValueError(
163 '%r does not appear to be an IPv4 or IPv6 address. '
164 'Did you pass in a bytes (str in Python 2) instead of'
165 ' a unicode object?' % address)
166
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100167 raise ValueError('%r does not appear to be an IPv4 or IPv6 address' %
168 address)
169
170
171def ip_network(address, strict=True):
172 """Take an IP string/int and return an object of the correct type.
173
174 Args:
175 address: A string or integer, the IP network. Either IPv4 or
176 IPv6 networks may be supplied; integers less than 2**32 will
177 be considered to be IPv4 by default.
178
179 Returns:
180 An IPv4Network or IPv6Network object.
181
182 Raises:
183 ValueError: if the string passed isn't either a v4 or a v6
184 address. Or if the network has host bits set.
185
186 """
187 try:
188 return IPv4Network(address, strict)
189 except (AddressValueError, NetmaskValueError):
190 pass
191
192 try:
193 return IPv6Network(address, strict)
194 except (AddressValueError, NetmaskValueError):
195 pass
196
Philipp Hagemeister1cc2f8d2015-11-11 20:58:14 +0100197 if isinstance(address, bytes):
198 raise AddressValueError(
199 '%r does not appear to be an IPv4 or IPv6 network. '
200 'Did you pass in a bytes (str in Python 2) instead of'
201 ' a unicode object?' % address)
202
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100203 raise ValueError('%r does not appear to be an IPv4 or IPv6 network' %
204 address)
205
206
207def ip_interface(address):
208 """Take an IP string/int and return an object of the correct type.
209
210 Args:
211 address: A string or integer, the IP address. Either IPv4 or
212 IPv6 addresses may be supplied; integers less than 2**32 will
213 be considered to be IPv4 by default.
214
215 Returns:
216 An IPv4Interface or IPv6Interface object.
217
218 Raises:
219 ValueError: if the string passed isn't either a v4 or a v6
220 address.
221
222 Notes:
223 The IPv?Interface classes describe an Address on a particular
224 Network, so they're basically a combination of both the Address
225 and Network classes.
226
227 """
228 try:
229 return IPv4Interface(address)
230 except (AddressValueError, NetmaskValueError):
231 pass
232
233 try:
234 return IPv6Interface(address)
235 except (AddressValueError, NetmaskValueError):
236 pass
237
238 raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' %
239 address)
240
241
242def v4_int_to_packed(address):
243 """Represent an address as 4 packed bytes in network (big-endian) order.
244
245 Args:
246 address: An integer representation of an IPv4 IP address.
247
248 Returns:
249 The integer address packed as 4 bytes in network (big-endian) order.
250
251 Raises:
252 ValueError: If the integer is negative or too large to be an
253 IPv4 IP address.
254
255 """
256 try:
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200257 return _compat_to_bytes(address, 4, 'big')
258 except (struct.error, OverflowError):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100259 raise ValueError("Address negative or too large for IPv4")
260
261
262def v6_int_to_packed(address):
263 """Represent an address as 16 packed bytes in network (big-endian) order.
264
265 Args:
266 address: An integer representation of an IPv6 IP address.
267
268 Returns:
269 The integer address packed as 16 bytes in network (big-endian) order.
270
271 """
272 try:
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200273 return _compat_to_bytes(address, 16, 'big')
274 except (struct.error, OverflowError):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100275 raise ValueError("Address negative or too large for IPv6")
276
277
278def _split_optional_netmask(address):
279 """Helper to split the netmask and raise AddressValueError if needed"""
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200280 addr = _compat_str(address).split('/')
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100281 if len(addr) > 2:
282 raise AddressValueError("Only one '/' permitted in %r" % address)
283 return addr
284
285
286def _find_address_range(addresses):
Philipp Hagemeister23961622015-07-12 21:45:42 +0200287 """Find a sequence of sorted deduplicated IPv#Address.
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100288
289 Args:
290 addresses: a list of IPv#Address objects.
291
Philipp Hagemeister23961622015-07-12 21:45:42 +0200292 Yields:
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100293 A tuple containing the first and last IP addresses in the sequence.
294
295 """
Philipp Hagemeister23961622015-07-12 21:45:42 +0200296 it = iter(addresses)
297 first = last = next(it)
298 for ip in it:
299 if ip._ip != last._ip + 1:
300 yield first, last
301 first = ip
302 last = ip
303 yield first, last
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100304
305
306def _count_righthand_zero_bits(number, bits):
307 """Count the number of zero bits on the right hand side.
308
309 Args:
310 number: an integer.
311 bits: maximum number of bits to count.
312
313 Returns:
314 The number of zero bits on the right hand side of the number.
315
316 """
317 if number == 0:
318 return bits
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +0200319 return min(bits, _compat_bit_length(~number & (number - 1)))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100320
321
322def summarize_address_range(first, last):
323 """Summarize a network range given the first and last IP addresses.
324
325 Example:
326 >>> list(summarize_address_range(IPv4Address('192.0.2.0'),
327 ... IPv4Address('192.0.2.130')))
328 ... #doctest: +NORMALIZE_WHITESPACE
329 [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'),
330 IPv4Network('192.0.2.130/32')]
331
332 Args:
333 first: the first IPv4Address or IPv6Address in the range.
334 last: the last IPv4Address or IPv6Address in the range.
335
336 Returns:
337 An iterator of the summarized IPv(4|6) network objects.
338
339 Raise:
340 TypeError:
341 If the first and last objects are not IP addresses.
342 If the first and last objects are not the same version.
343 ValueError:
344 If the last object is not greater than the first.
345 If the version of the first address is not 4 or 6.
346
347 """
348 if (not (isinstance(first, _BaseAddress) and
349 isinstance(last, _BaseAddress))):
350 raise TypeError('first and last must be IP addresses, not networks')
351 if first.version != last.version:
Philipp Hagemeister23961622015-07-12 21:45:42 +0200352 raise TypeError("%s and %s are not of the same version" % (
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +0200353 first, last))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100354 if first > last:
355 raise ValueError('last IP address must be greater than first')
356
357 if first.version == 4:
358 ip = IPv4Network
359 elif first.version == 6:
360 ip = IPv6Network
361 else:
362 raise ValueError('unknown IP version')
363
364 ip_bits = first._max_prefixlen
365 first_int = first._ip
366 last_int = last._ip
367 while first_int <= last_int:
368 nbits = min(_count_righthand_zero_bits(first_int, ip_bits),
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200369 _compat_bit_length(last_int - first_int + 1) - 1)
Philipp Hagemeister23961622015-07-12 21:45:42 +0200370 net = ip((first_int, ip_bits - nbits))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100371 yield net
372 first_int += 1 << nbits
373 if first_int - 1 == ip._ALL_ONES:
374 break
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100375
376
Philipp Hagemeister23961622015-07-12 21:45:42 +0200377def _collapse_addresses_internal(addresses):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100378 """Loops through the addresses, collapsing concurrent netblocks.
379
380 Example:
381
382 ip1 = IPv4Network('192.0.2.0/26')
383 ip2 = IPv4Network('192.0.2.64/26')
384 ip3 = IPv4Network('192.0.2.128/26')
385 ip4 = IPv4Network('192.0.2.192/26')
386
Philipp Hagemeister23961622015-07-12 21:45:42 +0200387 _collapse_addresses_internal([ip1, ip2, ip3, ip4]) ->
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100388 [IPv4Network('192.0.2.0/24')]
389
390 This shouldn't be called directly; it is called via
391 collapse_addresses([]).
392
393 Args:
394 addresses: A list of IPv4Network's or IPv6Network's
395
396 Returns:
397 A list of IPv4Network's or IPv6Network's depending on what we were
398 passed.
399
400 """
Philipp Hagemeister23961622015-07-12 21:45:42 +0200401 # First merge
402 to_merge = list(addresses)
403 subnets = {}
404 while to_merge:
405 net = to_merge.pop()
406 supernet = net.supernet()
407 existing = subnets.get(supernet)
408 if existing is None:
409 subnets[supernet] = net
410 elif existing != net:
411 # Merge consecutive subnets
412 del subnets[supernet]
413 to_merge.append(supernet)
414 # Then iterate over resulting networks, skipping subsumed subnets
415 last = None
416 for net in sorted(subnets.values()):
417 if last is not None:
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +0200418 # Since they are sorted,
419 # last.network_address <= net.network_address is a given.
Philipp Hagemeister23961622015-07-12 21:45:42 +0200420 if last.broadcast_address >= net.broadcast_address:
421 continue
422 yield net
423 last = net
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100424
425
426def collapse_addresses(addresses):
427 """Collapse a list of IP objects.
428
429 Example:
430 collapse_addresses([IPv4Network('192.0.2.0/25'),
431 IPv4Network('192.0.2.128/25')]) ->
432 [IPv4Network('192.0.2.0/24')]
433
434 Args:
435 addresses: An iterator of IPv4Network or IPv6Network objects.
436
437 Returns:
438 An iterator of the collapsed IPv(4|6)Network objects.
439
440 Raises:
441 TypeError: If passed a list of mixed version objects.
442
443 """
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100444 addrs = []
445 ips = []
446 nets = []
447
448 # split IP addresses and networks
449 for ip in addresses:
450 if isinstance(ip, _BaseAddress):
451 if ips and ips[-1]._version != ip._version:
452 raise TypeError("%s and %s are not of the same version" % (
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +0200453 ip, ips[-1]))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100454 ips.append(ip)
455 elif ip._prefixlen == ip._max_prefixlen:
456 if ips and ips[-1]._version != ip._version:
457 raise TypeError("%s and %s are not of the same version" % (
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +0200458 ip, ips[-1]))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100459 try:
460 ips.append(ip.ip)
461 except AttributeError:
462 ips.append(ip.network_address)
463 else:
464 if nets and nets[-1]._version != ip._version:
465 raise TypeError("%s and %s are not of the same version" % (
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +0200466 ip, nets[-1]))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100467 nets.append(ip)
468
469 # sort and dedup
470 ips = sorted(set(ips))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100471
Philipp Hagemeister23961622015-07-12 21:45:42 +0200472 # find consecutive address ranges in the sorted sequence and summarize them
473 if ips:
474 for first, last in _find_address_range(ips):
475 addrs.extend(summarize_address_range(first, last))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100476
Philipp Hagemeister23961622015-07-12 21:45:42 +0200477 return _collapse_addresses_internal(addrs + nets)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100478
479
480def get_mixed_type_key(obj):
481 """Return a key suitable for sorting between networks and addresses.
482
483 Address and Network objects are not sortable by default; they're
484 fundamentally different so the expression
485
486 IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')
487
488 doesn't make any sense. There are some times however, where you may wish
489 to have ipaddress sort these for you anyway. If you need to do this, you
490 can use this function as the key= argument to sorted().
491
492 Args:
493 obj: either a Network or Address object.
494 Returns:
495 appropriate key.
496
497 """
498 if isinstance(obj, _BaseNetwork):
499 return obj._get_networks_key()
500 elif isinstance(obj, _BaseAddress):
501 return obj._get_address_key()
502 return NotImplemented
503
504
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200505class _IPAddressBase(_TotalOrderingMixin):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100506
507 """The mother class."""
508
Philipp Hagemeister23961622015-07-12 21:45:42 +0200509 __slots__ = ()
510
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100511 @property
512 def exploded(self):
513 """Return the longhand version of the IP address as a string."""
514 return self._explode_shorthand_ip_string()
515
516 @property
517 def compressed(self):
518 """Return the shorthand version of the IP address as a string."""
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200519 return _compat_str(self)
Philipp Hagemeister23961622015-07-12 21:45:42 +0200520
521 @property
522 def reverse_pointer(self):
523 """The name of the reverse DNS pointer for the IP address, e.g.:
524 >>> ipaddress.ip_address("127.0.0.1").reverse_pointer
525 '1.0.0.127.in-addr.arpa'
526 >>> ipaddress.ip_address("2001:db8::1").reverse_pointer
527 '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa'
528
529 """
530 return self._reverse_pointer()
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100531
532 @property
533 def version(self):
534 msg = '%200s has no version specified' % (type(self),)
535 raise NotImplementedError(msg)
536
537 def _check_int_address(self, address):
538 if address < 0:
539 msg = "%d (< 0) is not permitted as an IPv%d address"
540 raise AddressValueError(msg % (address, self._version))
541 if address > self._ALL_ONES:
542 msg = "%d (>= 2**%d) is not permitted as an IPv%d address"
543 raise AddressValueError(msg % (address, self._max_prefixlen,
544 self._version))
545
546 def _check_packed_address(self, address, expected_len):
547 address_len = len(address)
548 if address_len != expected_len:
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200549 msg = (
550 '%r (len %d != %d) is not permitted as an IPv%d address. '
551 'Did you pass in a bytes (str in Python 2) instead of'
Philipp Hagemeistercb3f8402017-01-11 13:28:55 +0100552 ' a unicode object?')
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100553 raise AddressValueError(msg % (address, address_len,
554 expected_len, self._version))
555
Philipp Hagemeister23961622015-07-12 21:45:42 +0200556 @classmethod
557 def _ip_int_from_prefix(cls, prefixlen):
558 """Turn the prefix length into a bitwise netmask
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100559
560 Args:
561 prefixlen: An integer, the prefix length.
562
563 Returns:
564 An integer.
565
566 """
Philipp Hagemeister23961622015-07-12 21:45:42 +0200567 return cls._ALL_ONES ^ (cls._ALL_ONES >> prefixlen)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100568
Philipp Hagemeister23961622015-07-12 21:45:42 +0200569 @classmethod
570 def _prefix_from_ip_int(cls, ip_int):
571 """Return prefix length from the bitwise netmask.
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100572
573 Args:
Philipp Hagemeister23961622015-07-12 21:45:42 +0200574 ip_int: An integer, the netmask in expanded bitwise format
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100575
576 Returns:
577 An integer, the prefix length.
578
Philipp Hagemeister23961622015-07-12 21:45:42 +0200579 Raises:
580 ValueError: If the input intermingles zeroes & ones
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100581 """
Philipp Hagemeister23961622015-07-12 21:45:42 +0200582 trailing_zeroes = _count_righthand_zero_bits(ip_int,
583 cls._max_prefixlen)
584 prefixlen = cls._max_prefixlen - trailing_zeroes
585 leading_ones = ip_int >> trailing_zeroes
586 all_ones = (1 << prefixlen) - 1
587 if leading_ones != all_ones:
588 byteslen = cls._max_prefixlen // 8
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200589 details = _compat_to_bytes(ip_int, byteslen, 'big')
Philipp Hagemeister23961622015-07-12 21:45:42 +0200590 msg = 'Netmask pattern %r mixes zeroes & ones'
591 raise ValueError(msg % details)
592 return prefixlen
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100593
Philipp Hagemeister23961622015-07-12 21:45:42 +0200594 @classmethod
595 def _report_invalid_netmask(cls, netmask_str):
596 msg = '%r is not a valid netmask' % netmask_str
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200597 raise NetmaskValueError(msg)
Philipp Hagemeister23961622015-07-12 21:45:42 +0200598
599 @classmethod
600 def _prefix_from_prefix_string(cls, prefixlen_str):
601 """Return prefix length from a numeric string
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100602
603 Args:
Philipp Hagemeister23961622015-07-12 21:45:42 +0200604 prefixlen_str: The string to be converted
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100605
606 Returns:
Philipp Hagemeister23961622015-07-12 21:45:42 +0200607 An integer, the prefix length.
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100608
Philipp Hagemeister23961622015-07-12 21:45:42 +0200609 Raises:
610 NetmaskValueError: If the input is not a valid netmask
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100611 """
Philipp Hagemeister23961622015-07-12 21:45:42 +0200612 # int allows a leading +/- as well as surrounding whitespace,
613 # so we ensure that isn't the case
614 if not _BaseV4._DECIMAL_DIGITS.issuperset(prefixlen_str):
615 cls._report_invalid_netmask(prefixlen_str)
616 try:
617 prefixlen = int(prefixlen_str)
618 except ValueError:
619 cls._report_invalid_netmask(prefixlen_str)
620 if not (0 <= prefixlen <= cls._max_prefixlen):
621 cls._report_invalid_netmask(prefixlen_str)
622 return prefixlen
623
624 @classmethod
625 def _prefix_from_ip_string(cls, ip_str):
626 """Turn a netmask/hostmask string into a prefix length
627
628 Args:
629 ip_str: The netmask/hostmask to be converted
630
631 Returns:
632 An integer, the prefix length.
633
634 Raises:
635 NetmaskValueError: If the input is not a valid netmask/hostmask
636 """
637 # Parse the netmask/hostmask like an IP address.
638 try:
639 ip_int = cls._ip_int_from_string(ip_str)
640 except AddressValueError:
641 cls._report_invalid_netmask(ip_str)
642
643 # Try matching a netmask (this would be /1*0*/ as a bitwise regexp).
644 # Note that the two ambiguous cases (all-ones and all-zeroes) are
645 # treated as netmasks.
646 try:
647 return cls._prefix_from_ip_int(ip_int)
648 except ValueError:
649 pass
650
651 # Invert the bits, and try matching a /0+1+/ hostmask instead.
652 ip_int ^= cls._ALL_ONES
653 try:
654 return cls._prefix_from_ip_int(ip_int)
655 except ValueError:
656 cls._report_invalid_netmask(ip_str)
657
658 def __reduce__(self):
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200659 return self.__class__, (_compat_str(self),)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100660
661
662class _BaseAddress(_IPAddressBase):
663
664 """A generic IP object.
665
666 This IP class contains the version independent methods which are
667 used by single IP addresses.
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100668 """
669
Philipp Hagemeister23961622015-07-12 21:45:42 +0200670 __slots__ = ()
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100671
672 def __int__(self):
673 return self._ip
674
675 def __eq__(self, other):
676 try:
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +0200677 return (self._ip == other._ip and
678 self._version == other._version)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100679 except AttributeError:
680 return NotImplemented
681
682 def __lt__(self, other):
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200683 if not isinstance(other, _IPAddressBase):
Philipp Hagemeister23961622015-07-12 21:45:42 +0200684 return NotImplemented
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200685 if not isinstance(other, _BaseAddress):
686 raise TypeError('%s and %s are not of the same type' % (
687 self, other))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100688 if self._version != other._version:
689 raise TypeError('%s and %s are not of the same version' % (
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200690 self, other))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100691 if self._ip != other._ip:
692 return self._ip < other._ip
693 return False
694
695 # Shorthand for Integer addition and subtraction. This is not
696 # meant to ever support addition/subtraction of addresses.
697 def __add__(self, other):
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200698 if not isinstance(other, _compat_int_types):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100699 return NotImplemented
700 return self.__class__(int(self) + other)
701
702 def __sub__(self, other):
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200703 if not isinstance(other, _compat_int_types):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100704 return NotImplemented
705 return self.__class__(int(self) - other)
706
707 def __repr__(self):
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200708 return '%s(%r)' % (self.__class__.__name__, _compat_str(self))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100709
710 def __str__(self):
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200711 return _compat_str(self._string_from_ip_int(self._ip))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100712
713 def __hash__(self):
714 return hash(hex(int(self._ip)))
715
716 def _get_address_key(self):
717 return (self._version, self)
718
Philipp Hagemeister23961622015-07-12 21:45:42 +0200719 def __reduce__(self):
720 return self.__class__, (self._ip,)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100721
Philipp Hagemeister23961622015-07-12 21:45:42 +0200722
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100723class _BaseNetwork(_IPAddressBase):
724
725 """A generic IP network object.
726
727 This IP class contains the version independent methods which are
728 used by networks.
729
730 """
731 def __init__(self, address):
732 self._cache = {}
733
734 def __repr__(self):
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200735 return '%s(%r)' % (self.__class__.__name__, _compat_str(self))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100736
737 def __str__(self):
738 return '%s/%d' % (self.network_address, self.prefixlen)
739
740 def hosts(self):
741 """Generate Iterator over usable hosts in a network.
742
743 This is like __iter__ except it doesn't return the network
744 or broadcast addresses.
745
746 """
747 network = int(self.network_address)
748 broadcast = int(self.broadcast_address)
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200749 for x in _compat_range(network + 1, broadcast):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100750 yield self._address_class(x)
751
752 def __iter__(self):
753 network = int(self.network_address)
754 broadcast = int(self.broadcast_address)
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200755 for x in _compat_range(network, broadcast + 1):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100756 yield self._address_class(x)
757
758 def __getitem__(self, n):
759 network = int(self.network_address)
760 broadcast = int(self.broadcast_address)
761 if n >= 0:
762 if network + n > broadcast:
Philipp Hagemeisterea9945d2016-09-09 12:09:16 +0200763 raise IndexError('address out of range')
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100764 return self._address_class(network + n)
765 else:
766 n += 1
767 if broadcast + n < network:
Philipp Hagemeisterea9945d2016-09-09 12:09:16 +0200768 raise IndexError('address out of range')
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100769 return self._address_class(broadcast + n)
770
771 def __lt__(self, other):
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200772 if not isinstance(other, _IPAddressBase):
Philipp Hagemeister23961622015-07-12 21:45:42 +0200773 return NotImplemented
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +0200774 if not isinstance(other, _BaseNetwork):
775 raise TypeError('%s and %s are not of the same type' % (
776 self, other))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100777 if self._version != other._version:
778 raise TypeError('%s and %s are not of the same version' % (
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +0200779 self, other))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100780 if self.network_address != other.network_address:
781 return self.network_address < other.network_address
782 if self.netmask != other.netmask:
783 return self.netmask < other.netmask
784 return False
785
786 def __eq__(self, other):
787 try:
788 return (self._version == other._version and
789 self.network_address == other.network_address and
790 int(self.netmask) == int(other.netmask))
791 except AttributeError:
792 return NotImplemented
793
794 def __hash__(self):
795 return hash(int(self.network_address) ^ int(self.netmask))
796
797 def __contains__(self, other):
798 # always false if one is v4 and the other is v6.
799 if self._version != other._version:
800 return False
801 # dealing with another network.
802 if isinstance(other, _BaseNetwork):
803 return False
804 # dealing with another address
805 else:
806 # address
807 return (int(self.network_address) <= int(other._ip) <=
808 int(self.broadcast_address))
809
810 def overlaps(self, other):
811 """Tell if self is partly contained in other."""
812 return self.network_address in other or (
813 self.broadcast_address in other or (
814 other.network_address in self or (
815 other.broadcast_address in self)))
816
817 @property
818 def broadcast_address(self):
819 x = self._cache.get('broadcast_address')
820 if x is None:
821 x = self._address_class(int(self.network_address) |
822 int(self.hostmask))
823 self._cache['broadcast_address'] = x
824 return x
825
826 @property
827 def hostmask(self):
828 x = self._cache.get('hostmask')
829 if x is None:
830 x = self._address_class(int(self.netmask) ^ self._ALL_ONES)
831 self._cache['hostmask'] = x
832 return x
833
834 @property
835 def with_prefixlen(self):
836 return '%s/%d' % (self.network_address, self._prefixlen)
837
838 @property
839 def with_netmask(self):
840 return '%s/%s' % (self.network_address, self.netmask)
841
842 @property
843 def with_hostmask(self):
844 return '%s/%s' % (self.network_address, self.hostmask)
845
846 @property
847 def num_addresses(self):
848 """Number of hosts in the current subnet."""
849 return int(self.broadcast_address) - int(self.network_address) + 1
850
851 @property
852 def _address_class(self):
853 # Returning bare address objects (rather than interfaces) allows for
854 # more consistent behaviour across the network address, broadcast
855 # address and individual host addresses.
856 msg = '%200s has no associated address class' % (type(self),)
857 raise NotImplementedError(msg)
858
859 @property
860 def prefixlen(self):
861 return self._prefixlen
862
863 def address_exclude(self, other):
864 """Remove an address from a larger block.
865
866 For example:
867
868 addr1 = ip_network('192.0.2.0/28')
869 addr2 = ip_network('192.0.2.1/32')
Philipp Hagemeisterea9945d2016-09-09 12:09:16 +0200870 list(addr1.address_exclude(addr2)) =
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100871 [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'),
Philipp Hagemeisterea9945d2016-09-09 12:09:16 +0200872 IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')]
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100873
874 or IPv6:
875
876 addr1 = ip_network('2001:db8::1/32')
877 addr2 = ip_network('2001:db8::1/128')
Philipp Hagemeisterea9945d2016-09-09 12:09:16 +0200878 list(addr1.address_exclude(addr2)) =
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100879 [ip_network('2001:db8::1/128'),
Philipp Hagemeisterea9945d2016-09-09 12:09:16 +0200880 ip_network('2001:db8::2/127'),
881 ip_network('2001:db8::4/126'),
882 ip_network('2001:db8::8/125'),
883 ...
884 ip_network('2001:db8:8000::/33')]
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100885
886 Args:
887 other: An IPv4Network or IPv6Network object of the same type.
888
889 Returns:
890 An iterator of the IPv(4|6)Network objects which is self
891 minus other.
892
893 Raises:
Philipp Hagemeister23961622015-07-12 21:45:42 +0200894 TypeError: If self and other are of differing address
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100895 versions, or if other is not a network object.
896 ValueError: If other is not completely contained by self.
897
898 """
899 if not self._version == other._version:
900 raise TypeError("%s and %s are not of the same version" % (
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +0200901 self, other))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100902
903 if not isinstance(other, _BaseNetwork):
904 raise TypeError("%s is not a network object" % other)
905
Philipp Hagemeistercaa41922015-07-13 04:57:55 +0200906 if not other.subnet_of(self):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100907 raise ValueError('%s not contained in %s' % (other, self))
908 if other == self:
Philipp Hagemeister23961622015-07-12 21:45:42 +0200909 return
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100910
911 # Make sure we're comparing the network of other.
912 other = other.__class__('%s/%s' % (other.network_address,
913 other.prefixlen))
914
915 s1, s2 = self.subnets()
916 while s1 != other and s2 != other:
Philipp Hagemeistercaa41922015-07-13 04:57:55 +0200917 if other.subnet_of(s1):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100918 yield s2
919 s1, s2 = s1.subnets()
Philipp Hagemeistercaa41922015-07-13 04:57:55 +0200920 elif other.subnet_of(s2):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100921 yield s1
922 s1, s2 = s2.subnets()
923 else:
924 # If we got here, there's a bug somewhere.
925 raise AssertionError('Error performing exclusion: '
926 's1: %s s2: %s other: %s' %
927 (s1, s2, other))
928 if s1 == other:
929 yield s2
930 elif s2 == other:
931 yield s1
932 else:
933 # If we got here, there's a bug somewhere.
934 raise AssertionError('Error performing exclusion: '
935 's1: %s s2: %s other: %s' %
936 (s1, s2, other))
937
938 def compare_networks(self, other):
939 """Compare two IP objects.
940
941 This is only concerned about the comparison of the integer
942 representation of the network addresses. This means that the
943 host bits aren't considered at all in this method. If you want
944 to compare host bits, you can easily enough do a
945 'HostA._ip < HostB._ip'
946
947 Args:
948 other: An IP object.
949
950 Returns:
951 If the IP versions of self and other are the same, returns:
952
953 -1 if self < other:
954 eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25')
955 IPv6Network('2001:db8::1000/124') <
956 IPv6Network('2001:db8::2000/124')
957 0 if self == other
958 eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24')
959 IPv6Network('2001:db8::1000/124') ==
960 IPv6Network('2001:db8::1000/124')
961 1 if self > other
962 eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25')
963 IPv6Network('2001:db8::2000/124') >
964 IPv6Network('2001:db8::1000/124')
965
966 Raises:
967 TypeError if the IP versions are different.
968
969 """
970 # does this need to raise a ValueError?
971 if self._version != other._version:
972 raise TypeError('%s and %s are not of the same type' % (
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +0200973 self, other))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +0100974 # self._version == other._version below here:
975 if self.network_address < other.network_address:
976 return -1
977 if self.network_address > other.network_address:
978 return 1
979 # self.network_address == other.network_address below here:
980 if self.netmask < other.netmask:
981 return -1
982 if self.netmask > other.netmask:
983 return 1
984 return 0
985
986 def _get_networks_key(self):
987 """Network-only key function.
988
989 Returns an object that identifies this address' network and
990 netmask. This function is a suitable "key" argument for sorted()
991 and list.sort().
992
993 """
994 return (self._version, self.network_address, self.netmask)
995
996 def subnets(self, prefixlen_diff=1, new_prefix=None):
997 """The subnets which join to make the current subnet.
998
999 In the case that self contains only one IP
1000 (self._prefixlen == 32 for IPv4 or self._prefixlen == 128
1001 for IPv6), yield an iterator with just ourself.
1002
1003 Args:
1004 prefixlen_diff: An integer, the amount the prefix length
1005 should be increased by. This should not be set if
1006 new_prefix is also set.
1007 new_prefix: The desired new prefix length. This must be a
1008 larger number (smaller prefix) than the existing prefix.
1009 This should not be set if prefixlen_diff is also set.
1010
1011 Returns:
1012 An iterator of IPv(4|6) objects.
1013
1014 Raises:
1015 ValueError: The prefixlen_diff is too small or too large.
1016 OR
1017 prefixlen_diff and new_prefix are both set or new_prefix
1018 is a smaller number than the current prefix (smaller
1019 number means a larger network)
1020
1021 """
1022 if self._prefixlen == self._max_prefixlen:
1023 yield self
1024 return
1025
1026 if new_prefix is not None:
1027 if new_prefix < self._prefixlen:
1028 raise ValueError('new prefix must be longer')
1029 if prefixlen_diff != 1:
1030 raise ValueError('cannot set prefixlen_diff and new_prefix')
1031 prefixlen_diff = new_prefix - self._prefixlen
1032
1033 if prefixlen_diff < 0:
1034 raise ValueError('prefix length diff must be > 0')
1035 new_prefixlen = self._prefixlen + prefixlen_diff
1036
Philipp Hagemeister23961622015-07-12 21:45:42 +02001037 if new_prefixlen > self._max_prefixlen:
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001038 raise ValueError(
1039 'prefix length diff %d is invalid for netblock %s' % (
1040 new_prefixlen, self))
1041
Philipp Hagemeister23961622015-07-12 21:45:42 +02001042 start = int(self.network_address)
Philipp Hagemeisterea9945d2016-09-09 12:09:16 +02001043 end = int(self.broadcast_address) + 1
Philipp Hagemeister23961622015-07-12 21:45:42 +02001044 step = (int(self.hostmask) + 1) >> prefixlen_diff
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02001045 for new_addr in _compat_range(start, end, step):
Philipp Hagemeister23961622015-07-12 21:45:42 +02001046 current = self.__class__((new_addr, new_prefixlen))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001047 yield current
1048
1049 def supernet(self, prefixlen_diff=1, new_prefix=None):
1050 """The supernet containing the current network.
1051
1052 Args:
1053 prefixlen_diff: An integer, the amount the prefix length of
1054 the network should be decreased by. For example, given a
1055 /24 network and a prefixlen_diff of 3, a supernet with a
1056 /21 netmask is returned.
1057
1058 Returns:
1059 An IPv4 network object.
1060
1061 Raises:
1062 ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have
1063 a negative prefix length.
1064 OR
1065 If prefixlen_diff and new_prefix are both set or new_prefix is a
1066 larger number than the current prefix (larger number means a
1067 smaller network)
1068
1069 """
1070 if self._prefixlen == 0:
1071 return self
1072
1073 if new_prefix is not None:
1074 if new_prefix > self._prefixlen:
1075 raise ValueError('new prefix must be shorter')
1076 if prefixlen_diff != 1:
1077 raise ValueError('cannot set prefixlen_diff and new_prefix')
1078 prefixlen_diff = self._prefixlen - new_prefix
1079
Philipp Hagemeister23961622015-07-12 21:45:42 +02001080 new_prefixlen = self.prefixlen - prefixlen_diff
1081 if new_prefixlen < 0:
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001082 raise ValueError(
1083 'current prefixlen is %d, cannot have a prefixlen_diff of %d' %
1084 (self.prefixlen, prefixlen_diff))
Philipp Hagemeister23961622015-07-12 21:45:42 +02001085 return self.__class__((
1086 int(self.network_address) & (int(self.netmask) << prefixlen_diff),
Philipp Hagemeistercb3f8402017-01-11 13:28:55 +01001087 new_prefixlen))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001088
1089 @property
1090 def is_multicast(self):
1091 """Test if the address is reserved for multicast use.
1092
1093 Returns:
1094 A boolean, True if the address is a multicast address.
1095 See RFC 2373 2.7 for details.
1096
1097 """
1098 return (self.network_address.is_multicast and
1099 self.broadcast_address.is_multicast)
1100
Philipp Hagemeisterd17c2de2017-12-16 10:13:51 +01001101 @staticmethod
1102 def _is_subnet_of(a, b):
1103 try:
1104 # Always false if one is v4 and the other is v6.
1105 if a._version != b._version:
Philipp Hagemeister0a241132019-10-18 02:44:42 +02001106 raise TypeError(
1107 "%s and %s are not of the same version" % (a, b))
Philipp Hagemeisterd17c2de2017-12-16 10:13:51 +01001108 return (b.network_address <= a.network_address and
1109 b.broadcast_address >= a.broadcast_address)
1110 except AttributeError:
Philipp Hagemeister6d0ace02017-12-16 21:16:38 +01001111 raise TypeError("Unable to test subnet containment "
1112 "between %s and %s" % (a, b))
Philipp Hagemeisterd17c2de2017-12-16 10:13:51 +01001113
Philipp Hagemeistercaa41922015-07-13 04:57:55 +02001114 def subnet_of(self, other):
Philipp Hagemeisterd17c2de2017-12-16 10:13:51 +01001115 """Return True if this network is a subnet of other."""
1116 return self._is_subnet_of(self, other)
Philipp Hagemeistercaa41922015-07-13 04:57:55 +02001117
1118 def supernet_of(self, other):
Philipp Hagemeisterd17c2de2017-12-16 10:13:51 +01001119 """Return True if this network is a supernet of other."""
1120 return self._is_subnet_of(other, self)
Philipp Hagemeistercaa41922015-07-13 04:57:55 +02001121
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001122 @property
1123 def is_reserved(self):
1124 """Test if the address is otherwise IETF reserved.
1125
1126 Returns:
1127 A boolean, True if the address is within one of the
1128 reserved IPv6 Network ranges.
1129
1130 """
1131 return (self.network_address.is_reserved and
1132 self.broadcast_address.is_reserved)
1133
1134 @property
1135 def is_link_local(self):
1136 """Test if the address is reserved for link-local.
1137
1138 Returns:
1139 A boolean, True if the address is reserved per RFC 4291.
1140
1141 """
1142 return (self.network_address.is_link_local and
1143 self.broadcast_address.is_link_local)
1144
1145 @property
1146 def is_private(self):
1147 """Test if this address is allocated for private networks.
1148
1149 Returns:
Philipp Hagemeister23961622015-07-12 21:45:42 +02001150 A boolean, True if the address is reserved per
1151 iana-ipv4-special-registry or iana-ipv6-special-registry.
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001152
1153 """
1154 return (self.network_address.is_private and
1155 self.broadcast_address.is_private)
1156
1157 @property
Philipp Hagemeister23961622015-07-12 21:45:42 +02001158 def is_global(self):
1159 """Test if this address is allocated for public networks.
1160
1161 Returns:
1162 A boolean, True if the address is not reserved per
1163 iana-ipv4-special-registry or iana-ipv6-special-registry.
1164
1165 """
1166 return not self.is_private
1167
1168 @property
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001169 def is_unspecified(self):
1170 """Test if the address is unspecified.
1171
1172 Returns:
1173 A boolean, True if this is the unspecified address as defined in
1174 RFC 2373 2.5.2.
1175
1176 """
1177 return (self.network_address.is_unspecified and
1178 self.broadcast_address.is_unspecified)
1179
1180 @property
1181 def is_loopback(self):
1182 """Test if the address is a loopback address.
1183
1184 Returns:
1185 A boolean, True if the address is a loopback address as defined in
1186 RFC 2373 2.5.3.
1187
1188 """
1189 return (self.network_address.is_loopback and
1190 self.broadcast_address.is_loopback)
1191
1192
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02001193class _BaseV4(object):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001194
1195 """Base IPv4 object.
1196
1197 The following methods are used by IPv4 objects in both single IP
1198 addresses and networks.
1199
1200 """
1201
Philipp Hagemeister23961622015-07-12 21:45:42 +02001202 __slots__ = ()
1203 _version = 4
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001204 # Equivalent to 255.255.255.255 or 32 bits of 1's.
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +02001205 _ALL_ONES = (2 ** IPV4LENGTH) - 1
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001206 _DECIMAL_DIGITS = frozenset('0123456789')
1207
1208 # the valid octets for host and netmasks. only useful for IPv4.
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02001209 _valid_mask_octets = frozenset([255, 254, 252, 248, 240, 224, 192, 128, 0])
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001210
Philipp Hagemeister23961622015-07-12 21:45:42 +02001211 _max_prefixlen = IPV4LENGTH
1212 # There are only a handful of valid v4 netmasks, so we cache them all
1213 # when constructed (see _make_netmask()).
1214 _netmask_cache = {}
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001215
1216 def _explode_shorthand_ip_string(self):
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02001217 return _compat_str(self)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001218
Philipp Hagemeister23961622015-07-12 21:45:42 +02001219 @classmethod
1220 def _make_netmask(cls, arg):
1221 """Make a (netmask, prefix_len) tuple from the given argument.
1222
1223 Argument can be:
1224 - an integer (the prefix length)
1225 - a string representing the prefix length (e.g. "24")
1226 - a string representing the prefix netmask (e.g. "255.255.255.0")
1227 """
1228 if arg not in cls._netmask_cache:
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02001229 if isinstance(arg, _compat_int_types):
Philipp Hagemeister23961622015-07-12 21:45:42 +02001230 prefixlen = arg
1231 else:
1232 try:
1233 # Check for a netmask in prefix length form
1234 prefixlen = cls._prefix_from_prefix_string(arg)
1235 except NetmaskValueError:
1236 # Check for a netmask or hostmask in dotted-quad form.
1237 # This may raise NetmaskValueError.
1238 prefixlen = cls._prefix_from_ip_string(arg)
1239 netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen))
1240 cls._netmask_cache[arg] = netmask, prefixlen
1241 return cls._netmask_cache[arg]
1242
1243 @classmethod
1244 def _ip_int_from_string(cls, ip_str):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001245 """Turn the given IP string into an integer for comparison.
1246
1247 Args:
1248 ip_str: A string, the IP ip_str.
1249
1250 Returns:
1251 The IP ip_str as an integer.
1252
1253 Raises:
1254 AddressValueError: if ip_str isn't a valid IPv4 Address.
1255
1256 """
1257 if not ip_str:
1258 raise AddressValueError('Address cannot be empty')
1259
1260 octets = ip_str.split('.')
1261 if len(octets) != 4:
1262 raise AddressValueError("Expected 4 octets in %r" % ip_str)
1263
1264 try:
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +02001265 return _compat_int_from_byte_vals(
1266 map(cls._parse_octet, octets), 'big')
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001267 except ValueError as exc:
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02001268 raise AddressValueError("%s in %r" % (exc, ip_str))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001269
Philipp Hagemeister23961622015-07-12 21:45:42 +02001270 @classmethod
1271 def _parse_octet(cls, octet_str):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001272 """Convert a decimal octet into an integer.
1273
1274 Args:
1275 octet_str: A string, the number to parse.
1276
1277 Returns:
1278 The octet as an integer.
1279
1280 Raises:
1281 ValueError: if the octet isn't strictly a decimal from [0..255].
1282
1283 """
1284 if not octet_str:
1285 raise ValueError("Empty octet not permitted")
1286 # Whitelist the characters, since int() allows a lot of bizarre stuff.
Philipp Hagemeister23961622015-07-12 21:45:42 +02001287 if not cls._DECIMAL_DIGITS.issuperset(octet_str):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001288 msg = "Only decimal digits permitted in %r"
1289 raise ValueError(msg % octet_str)
1290 # We do the length check second, since the invalid character error
1291 # is likely to be more informative for the user
1292 if len(octet_str) > 3:
1293 msg = "At most 3 characters permitted in %r"
1294 raise ValueError(msg % octet_str)
1295 # Convert to integer (we know digits are legal)
1296 octet_int = int(octet_str, 10)
1297 # Any octets that look like they *might* be written in octal,
1298 # and which don't look exactly the same in both octal and
1299 # decimal are rejected as ambiguous
1300 if octet_int > 7 and octet_str[0] == '0':
1301 msg = "Ambiguous (octal/decimal) value in %r not permitted"
1302 raise ValueError(msg % octet_str)
1303 if octet_int > 255:
1304 raise ValueError("Octet %d (> 255) not permitted" % octet_int)
1305 return octet_int
1306
Philipp Hagemeister23961622015-07-12 21:45:42 +02001307 @classmethod
1308 def _string_from_ip_int(cls, ip_int):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001309 """Turns a 32-bit integer into dotted decimal notation.
1310
1311 Args:
1312 ip_int: An integer, the IP address.
1313
1314 Returns:
1315 The IP address as a string in dotted decimal notation.
1316
1317 """
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02001318 return '.'.join(_compat_str(struct.unpack(b'!B', b)[0]
1319 if isinstance(b, bytes)
1320 else b)
1321 for b in _compat_to_bytes(ip_int, 4, 'big'))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001322
1323 def _is_hostmask(self, ip_str):
1324 """Test if the IP string is a hostmask (rather than a netmask).
1325
1326 Args:
1327 ip_str: A string, the potential hostmask.
1328
1329 Returns:
1330 A boolean, True if the IP string is a hostmask.
1331
1332 """
1333 bits = ip_str.split('.')
1334 try:
1335 parts = [x for x in map(int, bits) if x in self._valid_mask_octets]
1336 except ValueError:
1337 return False
1338 if len(parts) != len(bits):
1339 return False
1340 if parts[0] < parts[-1]:
1341 return True
1342 return False
1343
Philipp Hagemeister23961622015-07-12 21:45:42 +02001344 def _reverse_pointer(self):
1345 """Return the reverse DNS pointer name for the IPv4 address.
1346
1347 This implements the method described in RFC1035 3.5.
1348
1349 """
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02001350 reverse_octets = _compat_str(self).split('.')[::-1]
Philipp Hagemeister23961622015-07-12 21:45:42 +02001351 return '.'.join(reverse_octets) + '.in-addr.arpa'
1352
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001353 @property
1354 def max_prefixlen(self):
1355 return self._max_prefixlen
1356
1357 @property
1358 def version(self):
1359 return self._version
1360
1361
1362class IPv4Address(_BaseV4, _BaseAddress):
1363
1364 """Represent and manipulate single IPv4 Addresses."""
1365
Philipp Hagemeister23961622015-07-12 21:45:42 +02001366 __slots__ = ('_ip', '__weakref__')
1367
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001368 def __init__(self, address):
1369
1370 """
1371 Args:
1372 address: A string or integer representing the IP
1373
1374 Additionally, an integer can be passed, so
1375 IPv4Address('192.0.2.1') == IPv4Address(3221225985).
1376 or, more generally
1377 IPv4Address(int(IPv4Address('192.0.2.1'))) ==
1378 IPv4Address('192.0.2.1')
1379
1380 Raises:
1381 AddressValueError: If ipaddress isn't a valid IPv4 address.
1382
1383 """
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001384 # Efficient constructor from integer.
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02001385 if isinstance(address, _compat_int_types):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001386 self._check_int_address(address)
1387 self._ip = address
1388 return
1389
1390 # Constructing from a packed address
1391 if isinstance(address, bytes):
1392 self._check_packed_address(address, 4)
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02001393 bvs = _compat_bytes_to_byte_vals(address)
1394 self._ip = _compat_int_from_byte_vals(bvs, 'big')
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001395 return
1396
1397 # Assume input argument to be string or any object representation
1398 # which converts into a formatted IP string.
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02001399 addr_str = _compat_str(address)
Philipp Hagemeister23961622015-07-12 21:45:42 +02001400 if '/' in addr_str:
1401 raise AddressValueError("Unexpected '/' in %r" % address)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001402 self._ip = self._ip_int_from_string(addr_str)
1403
1404 @property
1405 def packed(self):
1406 """The binary representation of this address."""
1407 return v4_int_to_packed(self._ip)
1408
1409 @property
1410 def is_reserved(self):
1411 """Test if the address is otherwise IETF reserved.
1412
1413 Returns:
1414 A boolean, True if the address is within the
1415 reserved IPv4 Network range.
1416
1417 """
Philipp Hagemeister23961622015-07-12 21:45:42 +02001418 return self in self._constants._reserved_network
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001419
1420 @property
1421 def is_private(self):
1422 """Test if this address is allocated for private networks.
1423
1424 Returns:
Philipp Hagemeister23961622015-07-12 21:45:42 +02001425 A boolean, True if the address is reserved per
1426 iana-ipv4-special-registry.
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001427
1428 """
Philipp Hagemeister23961622015-07-12 21:45:42 +02001429 return any(self in net for net in self._constants._private_networks)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001430
1431 @property
Philipp Hagemeisterea9945d2016-09-09 12:09:16 +02001432 def is_global(self):
Philipp Hagemeistercf7f1782016-09-09 12:29:34 +02001433 return (
1434 self not in self._constants._public_network and
1435 not self.is_private)
Philipp Hagemeisterea9945d2016-09-09 12:09:16 +02001436
1437 @property
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001438 def is_multicast(self):
1439 """Test if the address is reserved for multicast use.
1440
1441 Returns:
1442 A boolean, True if the address is multicast.
1443 See RFC 3171 for details.
1444
1445 """
Philipp Hagemeister23961622015-07-12 21:45:42 +02001446 return self in self._constants._multicast_network
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001447
1448 @property
1449 def is_unspecified(self):
1450 """Test if the address is unspecified.
1451
1452 Returns:
1453 A boolean, True if this is the unspecified address as defined in
1454 RFC 5735 3.
1455
1456 """
Philipp Hagemeister23961622015-07-12 21:45:42 +02001457 return self == self._constants._unspecified_address
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001458
1459 @property
1460 def is_loopback(self):
1461 """Test if the address is a loopback address.
1462
1463 Returns:
1464 A boolean, True if the address is a loopback per RFC 3330.
1465
1466 """
Philipp Hagemeister23961622015-07-12 21:45:42 +02001467 return self in self._constants._loopback_network
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001468
1469 @property
1470 def is_link_local(self):
1471 """Test if the address is reserved for link-local.
1472
1473 Returns:
1474 A boolean, True if the address is link-local per RFC 3927.
1475
1476 """
Philipp Hagemeister23961622015-07-12 21:45:42 +02001477 return self in self._constants._linklocal_network
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001478
1479
1480class IPv4Interface(IPv4Address):
1481
1482 def __init__(self, address):
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02001483 if isinstance(address, (bytes, _compat_int_types)):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001484 IPv4Address.__init__(self, address)
1485 self.network = IPv4Network(self._ip)
1486 self._prefixlen = self._max_prefixlen
1487 return
1488
Philipp Hagemeister23961622015-07-12 21:45:42 +02001489 if isinstance(address, tuple):
1490 IPv4Address.__init__(self, address[0])
1491 if len(address) > 1:
1492 self._prefixlen = int(address[1])
1493 else:
1494 self._prefixlen = self._max_prefixlen
1495
1496 self.network = IPv4Network(address, strict=False)
1497 self.netmask = self.network.netmask
1498 self.hostmask = self.network.hostmask
1499 return
1500
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001501 addr = _split_optional_netmask(address)
1502 IPv4Address.__init__(self, addr[0])
1503
1504 self.network = IPv4Network(address, strict=False)
1505 self._prefixlen = self.network._prefixlen
1506
1507 self.netmask = self.network.netmask
1508 self.hostmask = self.network.hostmask
1509
1510 def __str__(self):
1511 return '%s/%d' % (self._string_from_ip_int(self._ip),
1512 self.network.prefixlen)
1513
1514 def __eq__(self, other):
1515 address_equal = IPv4Address.__eq__(self, other)
1516 if not address_equal or address_equal is NotImplemented:
1517 return address_equal
1518 try:
1519 return self.network == other.network
1520 except AttributeError:
1521 # An interface with an associated network is NOT the
1522 # same as an unassociated address. That's why the hash
1523 # takes the extra info into account.
1524 return False
1525
1526 def __lt__(self, other):
1527 address_less = IPv4Address.__lt__(self, other)
1528 if address_less is NotImplemented:
1529 return NotImplemented
1530 try:
Philipp Hagemeisterd17c2de2017-12-16 10:13:51 +01001531 return (self.network < other.network or
1532 self.network == other.network and address_less)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001533 except AttributeError:
1534 # We *do* allow addresses and interfaces to be sorted. The
1535 # unassociated address is considered less than all interfaces.
1536 return False
1537
1538 def __hash__(self):
1539 return self._ip ^ self._prefixlen ^ int(self.network.network_address)
1540
Philipp Hagemeister23961622015-07-12 21:45:42 +02001541 __reduce__ = _IPAddressBase.__reduce__
1542
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001543 @property
1544 def ip(self):
1545 return IPv4Address(self._ip)
1546
1547 @property
1548 def with_prefixlen(self):
1549 return '%s/%s' % (self._string_from_ip_int(self._ip),
1550 self._prefixlen)
1551
1552 @property
1553 def with_netmask(self):
1554 return '%s/%s' % (self._string_from_ip_int(self._ip),
1555 self.netmask)
1556
1557 @property
1558 def with_hostmask(self):
1559 return '%s/%s' % (self._string_from_ip_int(self._ip),
1560 self.hostmask)
1561
1562
1563class IPv4Network(_BaseV4, _BaseNetwork):
1564
1565 """This class represents and manipulates 32-bit IPv4 network + addresses..
1566
1567 Attributes: [examples for IPv4Network('192.0.2.0/27')]
1568 .network_address: IPv4Address('192.0.2.0')
1569 .hostmask: IPv4Address('0.0.0.31')
1570 .broadcast_address: IPv4Address('192.0.2.32')
1571 .netmask: IPv4Address('255.255.255.224')
1572 .prefixlen: 27
1573
1574 """
1575 # Class to use when creating address objects
1576 _address_class = IPv4Address
1577
1578 def __init__(self, address, strict=True):
1579
1580 """Instantiate a new IPv4 network object.
1581
1582 Args:
1583 address: A string or integer representing the IP [& network].
1584 '192.0.2.0/24'
1585 '192.0.2.0/255.255.255.0'
1586 '192.0.0.2/0.0.0.255'
1587 are all functionally the same in IPv4. Similarly,
1588 '192.0.2.1'
1589 '192.0.2.1/255.255.255.255'
1590 '192.0.2.1/32'
Philipp Hagemeister23961622015-07-12 21:45:42 +02001591 are also functionally equivalent. That is to say, failing to
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001592 provide a subnetmask will create an object with a mask of /32.
1593
1594 If the mask (portion after the / in the argument) is given in
1595 dotted quad form, it is treated as a netmask if it starts with a
1596 non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it
1597 starts with a zero field (e.g. 0.255.255.255 == /8), with the
1598 single exception of an all-zero mask which is treated as a
1599 netmask == /0. If no mask is given, a default of /32 is used.
1600
1601 Additionally, an integer can be passed, so
1602 IPv4Network('192.0.2.1') == IPv4Network(3221225985)
1603 or, more generally
1604 IPv4Interface(int(IPv4Interface('192.0.2.1'))) ==
1605 IPv4Interface('192.0.2.1')
1606
1607 Raises:
1608 AddressValueError: If ipaddress isn't a valid IPv4 address.
1609 NetmaskValueError: If the netmask isn't valid for
1610 an IPv4 address.
1611 ValueError: If strict is True and a network address is not
1612 supplied.
1613
1614 """
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001615 _BaseNetwork.__init__(self, address)
1616
Philipp Hagemeister23961622015-07-12 21:45:42 +02001617 # Constructing from a packed address or integer
Gabi Davar03281ac2015-07-15 20:40:37 +03001618 if isinstance(address, (_compat_int_types, bytes)):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001619 self.network_address = IPv4Address(address)
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +02001620 self.netmask, self._prefixlen = self._make_netmask(
1621 self._max_prefixlen)
1622 # fixme: address/network test here.
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001623 return
1624
Philipp Hagemeister23961622015-07-12 21:45:42 +02001625 if isinstance(address, tuple):
1626 if len(address) > 1:
1627 arg = address[1]
1628 else:
1629 # We weren't given an address[1]
1630 arg = self._max_prefixlen
1631 self.network_address = IPv4Address(address[0])
1632 self.netmask, self._prefixlen = self._make_netmask(arg)
1633 packed = int(self.network_address)
1634 if packed & int(self.netmask) != packed:
1635 if strict:
1636 raise ValueError('%s has host bits set' % self)
1637 else:
1638 self.network_address = IPv4Address(packed &
1639 int(self.netmask))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001640 return
1641
1642 # Assume input argument to be string or any object representation
1643 # which converts into a formatted IP prefix string.
1644 addr = _split_optional_netmask(address)
1645 self.network_address = IPv4Address(self._ip_int_from_string(addr[0]))
1646
1647 if len(addr) == 2:
Philipp Hagemeister23961622015-07-12 21:45:42 +02001648 arg = addr[1]
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001649 else:
Philipp Hagemeister23961622015-07-12 21:45:42 +02001650 arg = self._max_prefixlen
1651 self.netmask, self._prefixlen = self._make_netmask(arg)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001652
1653 if strict:
1654 if (IPv4Address(int(self.network_address) & int(self.netmask)) !=
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +02001655 self.network_address):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001656 raise ValueError('%s has host bits set' % self)
1657 self.network_address = IPv4Address(int(self.network_address) &
1658 int(self.netmask))
1659
1660 if self._prefixlen == (self._max_prefixlen - 1):
1661 self.hosts = self.__iter__
1662
Philipp Hagemeister23961622015-07-12 21:45:42 +02001663 @property
Philipp Hagemeister23961622015-07-12 21:45:42 +02001664 def is_global(self):
1665 """Test if this address is allocated for public networks.
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001666
Philipp Hagemeister23961622015-07-12 21:45:42 +02001667 Returns:
1668 A boolean, True if the address is not reserved per
1669 iana-ipv4-special-registry.
1670
1671 """
1672 return (not (self.network_address in IPv4Network('100.64.0.0/10') and
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +02001673 self.broadcast_address in IPv4Network('100.64.0.0/10')) and
Philipp Hagemeister23961622015-07-12 21:45:42 +02001674 not self.is_private)
1675
1676
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02001677class _IPv4Constants(object):
1678
Philipp Hagemeister23961622015-07-12 21:45:42 +02001679 _linklocal_network = IPv4Network('169.254.0.0/16')
1680
1681 _loopback_network = IPv4Network('127.0.0.0/8')
1682
1683 _multicast_network = IPv4Network('224.0.0.0/4')
1684
Philipp Hagemeisterea9945d2016-09-09 12:09:16 +02001685 _public_network = IPv4Network('100.64.0.0/10')
1686
Philipp Hagemeister23961622015-07-12 21:45:42 +02001687 _private_networks = [
1688 IPv4Network('0.0.0.0/8'),
1689 IPv4Network('10.0.0.0/8'),
1690 IPv4Network('127.0.0.0/8'),
1691 IPv4Network('169.254.0.0/16'),
1692 IPv4Network('172.16.0.0/12'),
1693 IPv4Network('192.0.0.0/29'),
1694 IPv4Network('192.0.0.170/31'),
1695 IPv4Network('192.0.2.0/24'),
1696 IPv4Network('192.168.0.0/16'),
1697 IPv4Network('198.18.0.0/15'),
1698 IPv4Network('198.51.100.0/24'),
1699 IPv4Network('203.0.113.0/24'),
1700 IPv4Network('240.0.0.0/4'),
1701 IPv4Network('255.255.255.255/32'),
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +02001702 ]
Philipp Hagemeister23961622015-07-12 21:45:42 +02001703
1704 _reserved_network = IPv4Network('240.0.0.0/4')
1705
1706 _unspecified_address = IPv4Address('0.0.0.0')
1707
1708
1709IPv4Address._constants = _IPv4Constants
1710
1711
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02001712class _BaseV6(object):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001713
1714 """Base IPv6 object.
1715
1716 The following methods are used by IPv6 objects in both single IP
1717 addresses and networks.
1718
1719 """
1720
Philipp Hagemeister23961622015-07-12 21:45:42 +02001721 __slots__ = ()
1722 _version = 6
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +02001723 _ALL_ONES = (2 ** IPV6LENGTH) - 1
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001724 _HEXTET_COUNT = 8
1725 _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef')
Philipp Hagemeister23961622015-07-12 21:45:42 +02001726 _max_prefixlen = IPV6LENGTH
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001727
Philipp Hagemeister23961622015-07-12 21:45:42 +02001728 # There are only a bunch of valid v6 netmasks, so we cache them all
1729 # when constructed (see _make_netmask()).
1730 _netmask_cache = {}
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001731
Philipp Hagemeister23961622015-07-12 21:45:42 +02001732 @classmethod
1733 def _make_netmask(cls, arg):
1734 """Make a (netmask, prefix_len) tuple from the given argument.
1735
1736 Argument can be:
1737 - an integer (the prefix length)
1738 - a string representing the prefix length (e.g. "24")
1739 - a string representing the prefix netmask (e.g. "255.255.255.0")
1740 """
1741 if arg not in cls._netmask_cache:
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02001742 if isinstance(arg, _compat_int_types):
Philipp Hagemeister23961622015-07-12 21:45:42 +02001743 prefixlen = arg
1744 else:
1745 prefixlen = cls._prefix_from_prefix_string(arg)
1746 netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen))
1747 cls._netmask_cache[arg] = netmask, prefixlen
1748 return cls._netmask_cache[arg]
1749
1750 @classmethod
1751 def _ip_int_from_string(cls, ip_str):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001752 """Turn an IPv6 ip_str into an integer.
1753
1754 Args:
1755 ip_str: A string, the IPv6 ip_str.
1756
1757 Returns:
1758 An int, the IPv6 address
1759
1760 Raises:
1761 AddressValueError: if ip_str isn't a valid IPv6 Address.
1762
1763 """
1764 if not ip_str:
1765 raise AddressValueError('Address cannot be empty')
1766
1767 parts = ip_str.split(':')
1768
1769 # An IPv6 address needs at least 2 colons (3 parts).
1770 _min_parts = 3
1771 if len(parts) < _min_parts:
1772 msg = "At least %d parts expected in %r" % (_min_parts, ip_str)
1773 raise AddressValueError(msg)
1774
1775 # If the address has an IPv4-style suffix, convert it to hexadecimal.
1776 if '.' in parts[-1]:
1777 try:
1778 ipv4_int = IPv4Address(parts.pop())._ip
1779 except AddressValueError as exc:
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02001780 raise AddressValueError("%s in %r" % (exc, ip_str))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001781 parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF))
1782 parts.append('%x' % (ipv4_int & 0xFFFF))
1783
1784 # An IPv6 address can't have more than 8 colons (9 parts).
1785 # The extra colon comes from using the "::" notation for a single
1786 # leading or trailing zero part.
Philipp Hagemeister23961622015-07-12 21:45:42 +02001787 _max_parts = cls._HEXTET_COUNT + 1
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001788 if len(parts) > _max_parts:
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +02001789 msg = "At most %d colons permitted in %r" % (
1790 _max_parts - 1, ip_str)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001791 raise AddressValueError(msg)
1792
1793 # Disregarding the endpoints, find '::' with nothing in between.
1794 # This indicates that a run of zeroes has been skipped.
1795 skip_index = None
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02001796 for i in _compat_range(1, len(parts) - 1):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001797 if not parts[i]:
1798 if skip_index is not None:
1799 # Can't have more than one '::'
1800 msg = "At most one '::' permitted in %r" % ip_str
1801 raise AddressValueError(msg)
1802 skip_index = i
1803
1804 # parts_hi is the number of parts to copy from above/before the '::'
1805 # parts_lo is the number of parts to copy from below/after the '::'
1806 if skip_index is not None:
1807 # If we found a '::', then check if it also covers the endpoints.
1808 parts_hi = skip_index
1809 parts_lo = len(parts) - skip_index - 1
1810 if not parts[0]:
1811 parts_hi -= 1
1812 if parts_hi:
1813 msg = "Leading ':' only permitted as part of '::' in %r"
1814 raise AddressValueError(msg % ip_str) # ^: requires ^::
1815 if not parts[-1]:
1816 parts_lo -= 1
1817 if parts_lo:
1818 msg = "Trailing ':' only permitted as part of '::' in %r"
1819 raise AddressValueError(msg % ip_str) # :$ requires ::$
Philipp Hagemeister23961622015-07-12 21:45:42 +02001820 parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001821 if parts_skipped < 1:
1822 msg = "Expected at most %d other parts with '::' in %r"
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +02001823 raise AddressValueError(msg % (cls._HEXTET_COUNT - 1, ip_str))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001824 else:
1825 # Otherwise, allocate the entire address to parts_hi. The
1826 # endpoints could still be empty, but _parse_hextet() will check
1827 # for that.
Philipp Hagemeister23961622015-07-12 21:45:42 +02001828 if len(parts) != cls._HEXTET_COUNT:
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001829 msg = "Exactly %d parts expected without '::' in %r"
Philipp Hagemeister23961622015-07-12 21:45:42 +02001830 raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001831 if not parts[0]:
1832 msg = "Leading ':' only permitted as part of '::' in %r"
1833 raise AddressValueError(msg % ip_str) # ^: requires ^::
1834 if not parts[-1]:
1835 msg = "Trailing ':' only permitted as part of '::' in %r"
1836 raise AddressValueError(msg % ip_str) # :$ requires ::$
1837 parts_hi = len(parts)
1838 parts_lo = 0
1839 parts_skipped = 0
1840
1841 try:
1842 # Now, parse the hextets into a 128-bit integer.
1843 ip_int = 0
1844 for i in range(parts_hi):
1845 ip_int <<= 16
Philipp Hagemeister23961622015-07-12 21:45:42 +02001846 ip_int |= cls._parse_hextet(parts[i])
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001847 ip_int <<= 16 * parts_skipped
1848 for i in range(-parts_lo, 0):
1849 ip_int <<= 16
Philipp Hagemeister23961622015-07-12 21:45:42 +02001850 ip_int |= cls._parse_hextet(parts[i])
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001851 return ip_int
1852 except ValueError as exc:
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02001853 raise AddressValueError("%s in %r" % (exc, ip_str))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001854
Philipp Hagemeister23961622015-07-12 21:45:42 +02001855 @classmethod
1856 def _parse_hextet(cls, hextet_str):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001857 """Convert an IPv6 hextet string into an integer.
1858
1859 Args:
1860 hextet_str: A string, the number to parse.
1861
1862 Returns:
1863 The hextet as an integer.
1864
1865 Raises:
1866 ValueError: if the input isn't strictly a hex number from
1867 [0..FFFF].
1868
1869 """
1870 # Whitelist the characters, since int() allows a lot of bizarre stuff.
Philipp Hagemeister23961622015-07-12 21:45:42 +02001871 if not cls._HEX_DIGITS.issuperset(hextet_str):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001872 raise ValueError("Only hex digits permitted in %r" % hextet_str)
1873 # We do the length check second, since the invalid character error
1874 # is likely to be more informative for the user
1875 if len(hextet_str) > 4:
1876 msg = "At most 4 characters permitted in %r"
1877 raise ValueError(msg % hextet_str)
1878 # Length check means we can skip checking the integer value
1879 return int(hextet_str, 16)
1880
Philipp Hagemeister23961622015-07-12 21:45:42 +02001881 @classmethod
1882 def _compress_hextets(cls, hextets):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001883 """Compresses a list of hextets.
1884
1885 Compresses a list of strings, replacing the longest continuous
1886 sequence of "0" in the list with "" and adding empty strings at
1887 the beginning or at the end of the string such that subsequently
1888 calling ":".join(hextets) will produce the compressed version of
1889 the IPv6 address.
1890
1891 Args:
1892 hextets: A list of strings, the hextets to compress.
1893
1894 Returns:
1895 A list of strings.
1896
1897 """
1898 best_doublecolon_start = -1
1899 best_doublecolon_len = 0
1900 doublecolon_start = -1
1901 doublecolon_len = 0
1902 for index, hextet in enumerate(hextets):
1903 if hextet == '0':
1904 doublecolon_len += 1
1905 if doublecolon_start == -1:
1906 # Start of a sequence of zeros.
1907 doublecolon_start = index
1908 if doublecolon_len > best_doublecolon_len:
1909 # This is the longest sequence of zeros so far.
1910 best_doublecolon_len = doublecolon_len
1911 best_doublecolon_start = doublecolon_start
1912 else:
1913 doublecolon_len = 0
1914 doublecolon_start = -1
1915
1916 if best_doublecolon_len > 1:
1917 best_doublecolon_end = (best_doublecolon_start +
1918 best_doublecolon_len)
1919 # For zeros at the end of the address.
1920 if best_doublecolon_end == len(hextets):
1921 hextets += ['']
1922 hextets[best_doublecolon_start:best_doublecolon_end] = ['']
1923 # For zeros at the beginning of the address.
1924 if best_doublecolon_start == 0:
1925 hextets = [''] + hextets
1926
1927 return hextets
1928
Philipp Hagemeister23961622015-07-12 21:45:42 +02001929 @classmethod
1930 def _string_from_ip_int(cls, ip_int=None):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001931 """Turns a 128-bit integer into hexadecimal notation.
1932
1933 Args:
1934 ip_int: An integer, the IP address.
1935
1936 Returns:
1937 A string, the hexadecimal representation of the address.
1938
1939 Raises:
1940 ValueError: The address is bigger than 128 bits of all ones.
1941
1942 """
1943 if ip_int is None:
Philipp Hagemeister23961622015-07-12 21:45:42 +02001944 ip_int = int(cls._ip)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001945
Philipp Hagemeister23961622015-07-12 21:45:42 +02001946 if ip_int > cls._ALL_ONES:
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001947 raise ValueError('IPv6 address is too large')
1948
1949 hex_str = '%032x' % ip_int
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +02001950 hextets = ['%x' % int(hex_str[x:x + 4], 16) for x in range(0, 32, 4)]
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001951
Philipp Hagemeister23961622015-07-12 21:45:42 +02001952 hextets = cls._compress_hextets(hextets)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001953 return ':'.join(hextets)
1954
1955 def _explode_shorthand_ip_string(self):
1956 """Expand a shortened IPv6 address.
1957
1958 Args:
1959 ip_str: A string, the IPv6 address.
1960
1961 Returns:
1962 A string, the expanded IPv6 address.
1963
1964 """
1965 if isinstance(self, IPv6Network):
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02001966 ip_str = _compat_str(self.network_address)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001967 elif isinstance(self, IPv6Interface):
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02001968 ip_str = _compat_str(self.ip)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001969 else:
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02001970 ip_str = _compat_str(self)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001971
1972 ip_int = self._ip_int_from_string(ip_str)
1973 hex_str = '%032x' % ip_int
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +02001974 parts = [hex_str[x:x + 4] for x in range(0, 32, 4)]
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001975 if isinstance(self, (_BaseNetwork, IPv6Interface)):
1976 return '%s/%d' % (':'.join(parts), self._prefixlen)
1977 return ':'.join(parts)
1978
Philipp Hagemeister23961622015-07-12 21:45:42 +02001979 def _reverse_pointer(self):
1980 """Return the reverse DNS pointer name for the IPv6 address.
1981
1982 This implements the method described in RFC3596 2.5.
1983
1984 """
1985 reverse_chars = self.exploded[::-1].replace(':', '')
1986 return '.'.join(reverse_chars) + '.ip6.arpa'
1987
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01001988 @property
1989 def max_prefixlen(self):
1990 return self._max_prefixlen
1991
1992 @property
1993 def version(self):
1994 return self._version
1995
1996
1997class IPv6Address(_BaseV6, _BaseAddress):
1998
1999 """Represent and manipulate single IPv6 Addresses."""
2000
Philipp Hagemeister23961622015-07-12 21:45:42 +02002001 __slots__ = ('_ip', '__weakref__')
2002
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002003 def __init__(self, address):
2004 """Instantiate a new IPv6 address object.
2005
2006 Args:
2007 address: A string or integer representing the IP
2008
2009 Additionally, an integer can be passed, so
2010 IPv6Address('2001:db8::') ==
2011 IPv6Address(42540766411282592856903984951653826560)
2012 or, more generally
2013 IPv6Address(int(IPv6Address('2001:db8::'))) ==
2014 IPv6Address('2001:db8::')
2015
2016 Raises:
2017 AddressValueError: If address isn't a valid IPv6 address.
2018
2019 """
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002020 # Efficient constructor from integer.
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02002021 if isinstance(address, _compat_int_types):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002022 self._check_int_address(address)
2023 self._ip = address
2024 return
2025
2026 # Constructing from a packed address
2027 if isinstance(address, bytes):
2028 self._check_packed_address(address, 16)
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02002029 bvs = _compat_bytes_to_byte_vals(address)
2030 self._ip = _compat_int_from_byte_vals(bvs, 'big')
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002031 return
2032
2033 # Assume input argument to be string or any object representation
2034 # which converts into a formatted IP string.
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02002035 addr_str = _compat_str(address)
Philipp Hagemeister23961622015-07-12 21:45:42 +02002036 if '/' in addr_str:
2037 raise AddressValueError("Unexpected '/' in %r" % address)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002038 self._ip = self._ip_int_from_string(addr_str)
2039
2040 @property
2041 def packed(self):
2042 """The binary representation of this address."""
2043 return v6_int_to_packed(self._ip)
2044
2045 @property
2046 def is_multicast(self):
2047 """Test if the address is reserved for multicast use.
2048
2049 Returns:
2050 A boolean, True if the address is a multicast address.
2051 See RFC 2373 2.7 for details.
2052
2053 """
Philipp Hagemeister23961622015-07-12 21:45:42 +02002054 return self in self._constants._multicast_network
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002055
2056 @property
2057 def is_reserved(self):
2058 """Test if the address is otherwise IETF reserved.
2059
2060 Returns:
2061 A boolean, True if the address is within one of the
2062 reserved IPv6 Network ranges.
2063
2064 """
Philipp Hagemeister23961622015-07-12 21:45:42 +02002065 return any(self in x for x in self._constants._reserved_networks)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002066
2067 @property
2068 def is_link_local(self):
2069 """Test if the address is reserved for link-local.
2070
2071 Returns:
2072 A boolean, True if the address is reserved per RFC 4291.
2073
2074 """
Philipp Hagemeister23961622015-07-12 21:45:42 +02002075 return self in self._constants._linklocal_network
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002076
2077 @property
2078 def is_site_local(self):
2079 """Test if the address is reserved for site-local.
2080
2081 Note that the site-local address space has been deprecated by RFC 3879.
2082 Use is_private to test if this address is in the space of unique local
2083 addresses as defined by RFC 4193.
2084
2085 Returns:
2086 A boolean, True if the address is reserved per RFC 3513 2.5.6.
2087
2088 """
Philipp Hagemeister23961622015-07-12 21:45:42 +02002089 return self in self._constants._sitelocal_network
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002090
2091 @property
2092 def is_private(self):
2093 """Test if this address is allocated for private networks.
2094
2095 Returns:
Philipp Hagemeister23961622015-07-12 21:45:42 +02002096 A boolean, True if the address is reserved per
2097 iana-ipv6-special-registry.
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002098
2099 """
Philipp Hagemeister23961622015-07-12 21:45:42 +02002100 return any(self in net for net in self._constants._private_networks)
2101
2102 @property
2103 def is_global(self):
2104 """Test if this address is allocated for public networks.
2105
2106 Returns:
2107 A boolean, true if the address is not reserved per
2108 iana-ipv6-special-registry.
2109
2110 """
2111 return not self.is_private
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002112
2113 @property
2114 def is_unspecified(self):
2115 """Test if the address is unspecified.
2116
2117 Returns:
2118 A boolean, True if this is the unspecified address as defined in
2119 RFC 2373 2.5.2.
2120
2121 """
2122 return self._ip == 0
2123
2124 @property
2125 def is_loopback(self):
2126 """Test if the address is a loopback address.
2127
2128 Returns:
2129 A boolean, True if the address is a loopback address as defined in
2130 RFC 2373 2.5.3.
2131
2132 """
2133 return self._ip == 1
2134
2135 @property
2136 def ipv4_mapped(self):
2137 """Return the IPv4 mapped address.
2138
2139 Returns:
2140 If the IPv6 address is a v4 mapped address, return the
2141 IPv4 mapped address. Return None otherwise.
2142
2143 """
2144 if (self._ip >> 32) != 0xFFFF:
2145 return None
2146 return IPv4Address(self._ip & 0xFFFFFFFF)
2147
2148 @property
2149 def teredo(self):
2150 """Tuple of embedded teredo IPs.
2151
2152 Returns:
2153 Tuple of the (server, client) IPs or None if the address
2154 doesn't appear to be a teredo address (doesn't start with
2155 2001::/32)
2156
2157 """
2158 if (self._ip >> 96) != 0x20010000:
2159 return None
2160 return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF),
2161 IPv4Address(~self._ip & 0xFFFFFFFF))
2162
2163 @property
2164 def sixtofour(self):
2165 """Return the IPv4 6to4 embedded address.
2166
2167 Returns:
2168 The IPv4 6to4-embedded address if present or None if the
2169 address doesn't appear to contain a 6to4 embedded address.
2170
2171 """
2172 if (self._ip >> 112) != 0x2002:
2173 return None
2174 return IPv4Address((self._ip >> 80) & 0xFFFFFFFF)
2175
2176
2177class IPv6Interface(IPv6Address):
2178
2179 def __init__(self, address):
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02002180 if isinstance(address, (bytes, _compat_int_types)):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002181 IPv6Address.__init__(self, address)
2182 self.network = IPv6Network(self._ip)
2183 self._prefixlen = self._max_prefixlen
2184 return
Philipp Hagemeister23961622015-07-12 21:45:42 +02002185 if isinstance(address, tuple):
2186 IPv6Address.__init__(self, address[0])
2187 if len(address) > 1:
2188 self._prefixlen = int(address[1])
2189 else:
2190 self._prefixlen = self._max_prefixlen
2191 self.network = IPv6Network(address, strict=False)
2192 self.netmask = self.network.netmask
2193 self.hostmask = self.network.hostmask
2194 return
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002195
2196 addr = _split_optional_netmask(address)
2197 IPv6Address.__init__(self, addr[0])
2198 self.network = IPv6Network(address, strict=False)
2199 self.netmask = self.network.netmask
2200 self._prefixlen = self.network._prefixlen
2201 self.hostmask = self.network.hostmask
2202
2203 def __str__(self):
2204 return '%s/%d' % (self._string_from_ip_int(self._ip),
2205 self.network.prefixlen)
2206
2207 def __eq__(self, other):
2208 address_equal = IPv6Address.__eq__(self, other)
2209 if not address_equal or address_equal is NotImplemented:
2210 return address_equal
2211 try:
2212 return self.network == other.network
2213 except AttributeError:
2214 # An interface with an associated network is NOT the
2215 # same as an unassociated address. That's why the hash
2216 # takes the extra info into account.
2217 return False
2218
2219 def __lt__(self, other):
2220 address_less = IPv6Address.__lt__(self, other)
2221 if address_less is NotImplemented:
2222 return NotImplemented
2223 try:
Philipp Hagemeisterd17c2de2017-12-16 10:13:51 +01002224 return (self.network < other.network or
2225 self.network == other.network and address_less)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002226 except AttributeError:
2227 # We *do* allow addresses and interfaces to be sorted. The
2228 # unassociated address is considered less than all interfaces.
2229 return False
2230
2231 def __hash__(self):
2232 return self._ip ^ self._prefixlen ^ int(self.network.network_address)
2233
Philipp Hagemeister23961622015-07-12 21:45:42 +02002234 __reduce__ = _IPAddressBase.__reduce__
2235
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002236 @property
2237 def ip(self):
2238 return IPv6Address(self._ip)
2239
2240 @property
2241 def with_prefixlen(self):
2242 return '%s/%s' % (self._string_from_ip_int(self._ip),
2243 self._prefixlen)
2244
2245 @property
2246 def with_netmask(self):
2247 return '%s/%s' % (self._string_from_ip_int(self._ip),
2248 self.netmask)
2249
2250 @property
2251 def with_hostmask(self):
2252 return '%s/%s' % (self._string_from_ip_int(self._ip),
2253 self.hostmask)
2254
2255 @property
2256 def is_unspecified(self):
2257 return self._ip == 0 and self.network.is_unspecified
2258
2259 @property
2260 def is_loopback(self):
2261 return self._ip == 1 and self.network.is_loopback
2262
2263
2264class IPv6Network(_BaseV6, _BaseNetwork):
2265
2266 """This class represents and manipulates 128-bit IPv6 networks.
2267
2268 Attributes: [examples for IPv6('2001:db8::1000/124')]
2269 .network_address: IPv6Address('2001:db8::1000')
2270 .hostmask: IPv6Address('::f')
2271 .broadcast_address: IPv6Address('2001:db8::100f')
2272 .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0')
2273 .prefixlen: 124
2274
2275 """
2276
2277 # Class to use when creating address objects
2278 _address_class = IPv6Address
2279
2280 def __init__(self, address, strict=True):
2281 """Instantiate a new IPv6 Network object.
2282
2283 Args:
2284 address: A string or integer representing the IPv6 network or the
2285 IP and prefix/netmask.
2286 '2001:db8::/128'
2287 '2001:db8:0000:0000:0000:0000:0000:0000/128'
2288 '2001:db8::'
2289 are all functionally the same in IPv6. That is to say,
2290 failing to provide a subnetmask will create an object with
2291 a mask of /128.
2292
2293 Additionally, an integer can be passed, so
2294 IPv6Network('2001:db8::') ==
2295 IPv6Network(42540766411282592856903984951653826560)
2296 or, more generally
2297 IPv6Network(int(IPv6Network('2001:db8::'))) ==
2298 IPv6Network('2001:db8::')
2299
2300 strict: A boolean. If true, ensure that we have been passed
2301 A true network address, eg, 2001:db8::1000/124 and not an
2302 IP address on a network, eg, 2001:db8::1/124.
2303
2304 Raises:
2305 AddressValueError: If address isn't a valid IPv6 address.
2306 NetmaskValueError: If the netmask isn't valid for
2307 an IPv6 address.
2308 ValueError: If strict was True and a network address was not
2309 supplied.
2310
2311 """
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002312 _BaseNetwork.__init__(self, address)
2313
Philipp Hagemeister23961622015-07-12 21:45:42 +02002314 # Efficient constructor from integer or packed address
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02002315 if isinstance(address, (bytes, _compat_int_types)):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002316 self.network_address = IPv6Address(address)
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +02002317 self.netmask, self._prefixlen = self._make_netmask(
2318 self._max_prefixlen)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002319 return
2320
Philipp Hagemeister23961622015-07-12 21:45:42 +02002321 if isinstance(address, tuple):
2322 if len(address) > 1:
2323 arg = address[1]
2324 else:
2325 arg = self._max_prefixlen
2326 self.netmask, self._prefixlen = self._make_netmask(arg)
2327 self.network_address = IPv6Address(address[0])
2328 packed = int(self.network_address)
2329 if packed & int(self.netmask) != packed:
2330 if strict:
2331 raise ValueError('%s has host bits set' % self)
2332 else:
2333 self.network_address = IPv6Address(packed &
2334 int(self.netmask))
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002335 return
2336
2337 # Assume input argument to be string or any object representation
2338 # which converts into a formatted IP prefix string.
2339 addr = _split_optional_netmask(address)
2340
2341 self.network_address = IPv6Address(self._ip_int_from_string(addr[0]))
2342
2343 if len(addr) == 2:
Philipp Hagemeister23961622015-07-12 21:45:42 +02002344 arg = addr[1]
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002345 else:
Philipp Hagemeister23961622015-07-12 21:45:42 +02002346 arg = self._max_prefixlen
2347 self.netmask, self._prefixlen = self._make_netmask(arg)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002348
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002349 if strict:
2350 if (IPv6Address(int(self.network_address) & int(self.netmask)) !=
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +02002351 self.network_address):
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002352 raise ValueError('%s has host bits set' % self)
2353 self.network_address = IPv6Address(int(self.network_address) &
2354 int(self.netmask))
2355
2356 if self._prefixlen == (self._max_prefixlen - 1):
2357 self.hosts = self.__iter__
2358
Philipp Hagemeister23961622015-07-12 21:45:42 +02002359 def hosts(self):
2360 """Generate Iterator over usable hosts in a network.
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002361
Philipp Hagemeister23961622015-07-12 21:45:42 +02002362 This is like __iter__ except it doesn't return the
2363 Subnet-Router anycast address.
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002364
2365 """
Philipp Hagemeister23961622015-07-12 21:45:42 +02002366 network = int(self.network_address)
2367 broadcast = int(self.broadcast_address)
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02002368 for x in _compat_range(network + 1, broadcast + 1):
Philipp Hagemeister23961622015-07-12 21:45:42 +02002369 yield self._address_class(x)
Philipp Hagemeister6b5716b2013-02-03 21:48:28 +01002370
2371 @property
2372 def is_site_local(self):
2373 """Test if the address is reserved for site-local.
2374
2375 Note that the site-local address space has been deprecated by RFC 3879.
2376 Use is_private to test if this address is in the space of unique local
2377 addresses as defined by RFC 4193.
2378
2379 Returns:
2380 A boolean, True if the address is reserved per RFC 3513 2.5.6.
2381
2382 """
2383 return (self.network_address.is_site_local and
2384 self.broadcast_address.is_site_local)
Philipp Hagemeister23961622015-07-12 21:45:42 +02002385
2386
Philipp Hagemeisterdf6c08e2015-07-13 04:09:45 +02002387class _IPv6Constants(object):
Philipp Hagemeister23961622015-07-12 21:45:42 +02002388
2389 _linklocal_network = IPv6Network('fe80::/10')
2390
2391 _multicast_network = IPv6Network('ff00::/8')
2392
2393 _private_networks = [
2394 IPv6Network('::1/128'),
2395 IPv6Network('::/128'),
2396 IPv6Network('::ffff:0:0/96'),
2397 IPv6Network('100::/64'),
2398 IPv6Network('2001::/23'),
2399 IPv6Network('2001:2::/48'),
2400 IPv6Network('2001:db8::/32'),
2401 IPv6Network('2001:10::/28'),
2402 IPv6Network('fc00::/7'),
2403 IPv6Network('fe80::/10'),
Philipp Hagemeisterdc80ec62015-07-13 12:34:48 +02002404 ]
Philipp Hagemeister23961622015-07-12 21:45:42 +02002405
2406 _reserved_networks = [
2407 IPv6Network('::/8'), IPv6Network('100::/8'),
2408 IPv6Network('200::/7'), IPv6Network('400::/6'),
2409 IPv6Network('800::/5'), IPv6Network('1000::/4'),
2410 IPv6Network('4000::/3'), IPv6Network('6000::/3'),
2411 IPv6Network('8000::/3'), IPv6Network('A000::/3'),
2412 IPv6Network('C000::/3'), IPv6Network('E000::/4'),
2413 IPv6Network('F000::/5'), IPv6Network('F800::/6'),
2414 IPv6Network('FE00::/9'),
2415 ]
2416
2417 _sitelocal_network = IPv6Network('fec0::/10')
2418
2419
2420IPv6Address._constants = _IPv6Constants