blob: bc662c415b2a49f0f4066b1fd6e76d59934c9129 [file] [log] [blame]
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001# 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
11__version__ = '1.0'
12
13
14import functools
15
16IPV4LENGTH = 32
17IPV6LENGTH = 128
18
19class AddressValueError(ValueError):
20 """A Value Error related to the address."""
21
22
23class NetmaskValueError(ValueError):
24 """A Value Error related to the netmask."""
25
26
27def ip_address(address):
28 """Take an IP string/int and return an object of the correct type.
29
30 Args:
31 address: A string or integer, the IP address. Either IPv4 or
32 IPv6 addresses may be supplied; integers less than 2**32 will
33 be considered to be IPv4 by default.
34
35 Returns:
36 An IPv4Address or IPv6Address object.
37
38 Raises:
39 ValueError: if the *address* passed isn't either a v4 or a v6
40 address
41
42 """
43 try:
44 return IPv4Address(address)
45 except (AddressValueError, NetmaskValueError):
46 pass
47
48 try:
49 return IPv6Address(address)
50 except (AddressValueError, NetmaskValueError):
51 pass
52
53 raise ValueError('%r does not appear to be an IPv4 or IPv6 address' %
54 address)
55
56
57def ip_network(address, strict=True):
58 """Take an IP string/int and return an object of the correct type.
59
60 Args:
61 address: A string or integer, the IP network. Either IPv4 or
62 IPv6 networks may be supplied; integers less than 2**32 will
63 be considered to be IPv4 by default.
64
65 Returns:
66 An IPv4Network or IPv6Network object.
67
68 Raises:
69 ValueError: if the string passed isn't either a v4 or a v6
70 address. Or if the network has host bits set.
71
72 """
73 try:
74 return IPv4Network(address, strict)
75 except (AddressValueError, NetmaskValueError):
76 pass
77
78 try:
79 return IPv6Network(address, strict)
80 except (AddressValueError, NetmaskValueError):
81 pass
82
83 raise ValueError('%r does not appear to be an IPv4 or IPv6 network' %
84 address)
85
86
87def ip_interface(address):
88 """Take an IP string/int and return an object of the correct type.
89
90 Args:
91 address: A string or integer, the IP address. Either IPv4 or
92 IPv6 addresses may be supplied; integers less than 2**32 will
93 be considered to be IPv4 by default.
94
95 Returns:
96 An IPv4Interface or IPv6Interface object.
97
98 Raises:
99 ValueError: if the string passed isn't either a v4 or a v6
100 address.
101
102 Notes:
103 The IPv?Interface classes describe an Address on a particular
104 Network, so they're basically a combination of both the Address
105 and Network classes.
106
107 """
108 try:
109 return IPv4Interface(address)
110 except (AddressValueError, NetmaskValueError):
111 pass
112
113 try:
114 return IPv6Interface(address)
115 except (AddressValueError, NetmaskValueError):
116 pass
117
118 raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' %
119 address)
120
121
122def v4_int_to_packed(address):
123 """Represent an address as 4 packed bytes in network (big-endian) order.
124
125 Args:
126 address: An integer representation of an IPv4 IP address.
127
128 Returns:
129 The integer address packed as 4 bytes in network (big-endian) order.
130
131 Raises:
132 ValueError: If the integer is negative or too large to be an
133 IPv4 IP address.
134
135 """
136 try:
137 return address.to_bytes(4, 'big')
138 except OverflowError:
139 raise ValueError("Address negative or too large for IPv4")
140
141
142def v6_int_to_packed(address):
143 """Represent an address as 16 packed bytes in network (big-endian) order.
144
145 Args:
146 address: An integer representation of an IPv6 IP address.
147
148 Returns:
149 The integer address packed as 16 bytes in network (big-endian) order.
150
151 """
152 try:
153 return address.to_bytes(16, 'big')
154 except OverflowError:
155 raise ValueError("Address negative or too large for IPv6")
156
157
158def _split_optional_netmask(address):
159 """Helper to split the netmask and raise AddressValueError if needed"""
160 addr = str(address).split('/')
161 if len(addr) > 2:
162 raise AddressValueError("Only one '/' permitted in %r" % address)
163 return addr
164
165
166def _find_address_range(addresses):
167 """Find a sequence of sorted deduplicated IPv#Address.
168
169 Args:
170 addresses: a list of IPv#Address objects.
171
172 Yields:
173 A tuple containing the first and last IP addresses in the sequence.
174
175 """
176 it = iter(addresses)
177 first = last = next(it)
178 for ip in it:
179 if ip._ip != last._ip + 1:
180 yield first, last
181 first = ip
182 last = ip
183 yield first, last
184
185
186def _count_righthand_zero_bits(number, bits):
187 """Count the number of zero bits on the right hand side.
188
189 Args:
190 number: an integer.
191 bits: maximum number of bits to count.
192
193 Returns:
194 The number of zero bits on the right hand side of the number.
195
196 """
197 if number == 0:
198 return bits
199 return min(bits, (~number & (number-1)).bit_length())
200
201
202def summarize_address_range(first, last):
203 """Summarize a network range given the first and last IP addresses.
204
205 Example:
206 >>> list(summarize_address_range(IPv4Address('192.0.2.0'),
207 ... IPv4Address('192.0.2.130')))
208 ... #doctest: +NORMALIZE_WHITESPACE
209 [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'),
210 IPv4Network('192.0.2.130/32')]
211
212 Args:
213 first: the first IPv4Address or IPv6Address in the range.
214 last: the last IPv4Address or IPv6Address in the range.
215
216 Returns:
217 An iterator of the summarized IPv(4|6) network objects.
218
219 Raise:
220 TypeError:
221 If the first and last objects are not IP addresses.
222 If the first and last objects are not the same version.
223 ValueError:
224 If the last object is not greater than the first.
225 If the version of the first address is not 4 or 6.
226
227 """
228 if (not (isinstance(first, _BaseAddress) and
229 isinstance(last, _BaseAddress))):
230 raise TypeError('first and last must be IP addresses, not networks')
231 if first.version != last.version:
232 raise TypeError("%s and %s are not of the same version" % (
233 first, last))
234 if first > last:
235 raise ValueError('last IP address must be greater than first')
236
237 if first.version == 4:
238 ip = IPv4Network
239 elif first.version == 6:
240 ip = IPv6Network
241 else:
242 raise ValueError('unknown IP version')
243
244 ip_bits = first._max_prefixlen
245 first_int = first._ip
246 last_int = last._ip
247 while first_int <= last_int:
248 nbits = min(_count_righthand_zero_bits(first_int, ip_bits),
249 (last_int - first_int + 1).bit_length() - 1)
250 net = ip((first_int, ip_bits - nbits))
251 yield net
252 first_int += 1 << nbits
253 if first_int - 1 == ip._ALL_ONES:
254 break
255
256
257def _collapse_addresses_internal(addresses):
258 """Loops through the addresses, collapsing concurrent netblocks.
259
260 Example:
261
262 ip1 = IPv4Network('192.0.2.0/26')
263 ip2 = IPv4Network('192.0.2.64/26')
264 ip3 = IPv4Network('192.0.2.128/26')
265 ip4 = IPv4Network('192.0.2.192/26')
266
267 _collapse_addresses_internal([ip1, ip2, ip3, ip4]) ->
268 [IPv4Network('192.0.2.0/24')]
269
270 This shouldn't be called directly; it is called via
271 collapse_addresses([]).
272
273 Args:
274 addresses: A list of IPv4Network's or IPv6Network's
275
276 Returns:
277 A list of IPv4Network's or IPv6Network's depending on what we were
278 passed.
279
280 """
281 # First merge
282 to_merge = list(addresses)
283 subnets = {}
284 while to_merge:
285 net = to_merge.pop()
286 supernet = net.supernet()
287 existing = subnets.get(supernet)
288 if existing is None:
289 subnets[supernet] = net
290 elif existing != net:
291 # Merge consecutive subnets
292 del subnets[supernet]
293 to_merge.append(supernet)
294 # Then iterate over resulting networks, skipping subsumed subnets
295 last = None
296 for net in sorted(subnets.values()):
297 if last is not None:
298 # Since they are sorted, last.network_address <= net.network_address
299 # is a given.
300 if last.broadcast_address >= net.broadcast_address:
301 continue
302 yield net
303 last = net
304
305
306def collapse_addresses(addresses):
307 """Collapse a list of IP objects.
308
309 Example:
310 collapse_addresses([IPv4Network('192.0.2.0/25'),
311 IPv4Network('192.0.2.128/25')]) ->
312 [IPv4Network('192.0.2.0/24')]
313
314 Args:
315 addresses: An iterator of IPv4Network or IPv6Network objects.
316
317 Returns:
318 An iterator of the collapsed IPv(4|6)Network objects.
319
320 Raises:
321 TypeError: If passed a list of mixed version objects.
322
323 """
324 addrs = []
325 ips = []
326 nets = []
327
328 # split IP addresses and networks
329 for ip in addresses:
330 if isinstance(ip, _BaseAddress):
331 if ips and ips[-1]._version != ip._version:
332 raise TypeError("%s and %s are not of the same version" % (
333 ip, ips[-1]))
334 ips.append(ip)
335 elif ip._prefixlen == ip._max_prefixlen:
336 if ips and ips[-1]._version != ip._version:
337 raise TypeError("%s and %s are not of the same version" % (
338 ip, ips[-1]))
339 try:
340 ips.append(ip.ip)
341 except AttributeError:
342 ips.append(ip.network_address)
343 else:
344 if nets and nets[-1]._version != ip._version:
345 raise TypeError("%s and %s are not of the same version" % (
346 ip, nets[-1]))
347 nets.append(ip)
348
349 # sort and dedup
350 ips = sorted(set(ips))
351
352 # find consecutive address ranges in the sorted sequence and summarize them
353 if ips:
354 for first, last in _find_address_range(ips):
355 addrs.extend(summarize_address_range(first, last))
356
357 return _collapse_addresses_internal(addrs + nets)
358
359
360def get_mixed_type_key(obj):
361 """Return a key suitable for sorting between networks and addresses.
362
363 Address and Network objects are not sortable by default; they're
364 fundamentally different so the expression
365
366 IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')
367
368 doesn't make any sense. There are some times however, where you may wish
369 to have ipaddress sort these for you anyway. If you need to do this, you
370 can use this function as the key= argument to sorted().
371
372 Args:
373 obj: either a Network or Address object.
374 Returns:
375 appropriate key.
376
377 """
378 if isinstance(obj, _BaseNetwork):
379 return obj._get_networks_key()
380 elif isinstance(obj, _BaseAddress):
381 return obj._get_address_key()
382 return NotImplemented
383
384
385class _IPAddressBase:
386
387 """The mother class."""
388
389 __slots__ = ()
390
391 @property
392 def exploded(self):
393 """Return the longhand version of the IP address as a string."""
394 return self._explode_shorthand_ip_string()
395
396 @property
397 def compressed(self):
398 """Return the shorthand version of the IP address as a string."""
399 return str(self)
400
401 @property
402 def reverse_pointer(self):
403 """The name of the reverse DNS pointer for the IP address, e.g.:
404 >>> ipaddress.ip_address("127.0.0.1").reverse_pointer
405 '1.0.0.127.in-addr.arpa'
406 >>> ipaddress.ip_address("2001:db8::1").reverse_pointer
407 '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'
408
409 """
410 return self._reverse_pointer()
411
412 @property
413 def version(self):
414 msg = '%200s has no version specified' % (type(self),)
415 raise NotImplementedError(msg)
416
417 def _check_int_address(self, address):
418 if address < 0:
419 msg = "%d (< 0) is not permitted as an IPv%d address"
420 raise AddressValueError(msg % (address, self._version))
421 if address > self._ALL_ONES:
422 msg = "%d (>= 2**%d) is not permitted as an IPv%d address"
423 raise AddressValueError(msg % (address, self._max_prefixlen,
424 self._version))
425
426 def _check_packed_address(self, address, expected_len):
427 address_len = len(address)
428 if address_len != expected_len:
429 msg = "%r (len %d != %d) is not permitted as an IPv%d address"
430 raise AddressValueError(msg % (address, address_len,
431 expected_len, self._version))
432
433 @classmethod
434 def _ip_int_from_prefix(cls, prefixlen):
435 """Turn the prefix length into a bitwise netmask
436
437 Args:
438 prefixlen: An integer, the prefix length.
439
440 Returns:
441 An integer.
442
443 """
444 return cls._ALL_ONES ^ (cls._ALL_ONES >> prefixlen)
445
446 @classmethod
447 def _prefix_from_ip_int(cls, ip_int):
448 """Return prefix length from the bitwise netmask.
449
450 Args:
451 ip_int: An integer, the netmask in expanded bitwise format
452
453 Returns:
454 An integer, the prefix length.
455
456 Raises:
457 ValueError: If the input intermingles zeroes & ones
458 """
459 trailing_zeroes = _count_righthand_zero_bits(ip_int,
460 cls._max_prefixlen)
461 prefixlen = cls._max_prefixlen - trailing_zeroes
462 leading_ones = ip_int >> trailing_zeroes
463 all_ones = (1 << prefixlen) - 1
464 if leading_ones != all_ones:
465 byteslen = cls._max_prefixlen // 8
466 details = ip_int.to_bytes(byteslen, 'big')
467 msg = 'Netmask pattern %r mixes zeroes & ones'
468 raise ValueError(msg % details)
469 return prefixlen
470
471 @classmethod
472 def _report_invalid_netmask(cls, netmask_str):
473 msg = '%r is not a valid netmask' % netmask_str
474 raise NetmaskValueError(msg) from None
475
476 @classmethod
477 def _prefix_from_prefix_string(cls, prefixlen_str):
478 """Return prefix length from a numeric string
479
480 Args:
481 prefixlen_str: The string to be converted
482
483 Returns:
484 An integer, the prefix length.
485
486 Raises:
487 NetmaskValueError: If the input is not a valid netmask
488 """
489 # int allows a leading +/- as well as surrounding whitespace,
490 # so we ensure that isn't the case
491 if not (prefixlen_str.isascii() and prefixlen_str.isdigit()):
492 cls._report_invalid_netmask(prefixlen_str)
493 try:
494 prefixlen = int(prefixlen_str)
495 except ValueError:
496 cls._report_invalid_netmask(prefixlen_str)
497 if not (0 <= prefixlen <= cls._max_prefixlen):
498 cls._report_invalid_netmask(prefixlen_str)
499 return prefixlen
500
501 @classmethod
502 def _prefix_from_ip_string(cls, ip_str):
503 """Turn a netmask/hostmask string into a prefix length
504
505 Args:
506 ip_str: The netmask/hostmask to be converted
507
508 Returns:
509 An integer, the prefix length.
510
511 Raises:
512 NetmaskValueError: If the input is not a valid netmask/hostmask
513 """
514 # Parse the netmask/hostmask like an IP address.
515 try:
516 ip_int = cls._ip_int_from_string(ip_str)
517 except AddressValueError:
518 cls._report_invalid_netmask(ip_str)
519
520 # Try matching a netmask (this would be /1*0*/ as a bitwise regexp).
521 # Note that the two ambiguous cases (all-ones and all-zeroes) are
522 # treated as netmasks.
523 try:
524 return cls._prefix_from_ip_int(ip_int)
525 except ValueError:
526 pass
527
528 # Invert the bits, and try matching a /0+1+/ hostmask instead.
529 ip_int ^= cls._ALL_ONES
530 try:
531 return cls._prefix_from_ip_int(ip_int)
532 except ValueError:
533 cls._report_invalid_netmask(ip_str)
534
535 @classmethod
536 def _split_addr_prefix(cls, address):
537 """Helper function to parse address of Network/Interface.
538
539 Arg:
540 address: Argument of Network/Interface.
541
542 Returns:
543 (addr, prefix) tuple.
544 """
545 # a packed address or integer
546 if isinstance(address, (bytes, int)):
547 return address, cls._max_prefixlen
548
549 if not isinstance(address, tuple):
550 # Assume input argument to be string or any object representation
551 # which converts into a formatted IP prefix string.
552 address = _split_optional_netmask(address)
553
554 # Constructing from a tuple (addr, [mask])
555 if len(address) > 1:
556 return address
557 return address[0], cls._max_prefixlen
558
559 def __reduce__(self):
560 return self.__class__, (str(self),)
561
562
563_address_fmt_re = None
564
565@functools.total_ordering
566class _BaseAddress(_IPAddressBase):
567
568 """A generic IP object.
569
570 This IP class contains the version independent methods which are
571 used by single IP addresses.
572 """
573
574 __slots__ = ()
575
576 def __int__(self):
577 return self._ip
578
579 def __eq__(self, other):
580 try:
581 return (self._ip == other._ip
582 and self._version == other._version)
583 except AttributeError:
584 return NotImplemented
585
586 def __lt__(self, other):
587 if not isinstance(other, _BaseAddress):
588 return NotImplemented
589 if self._version != other._version:
590 raise TypeError('%s and %s are not of the same version' % (
591 self, other))
592 if self._ip != other._ip:
593 return self._ip < other._ip
594 return False
595
596 # Shorthand for Integer addition and subtraction. This is not
597 # meant to ever support addition/subtraction of addresses.
598 def __add__(self, other):
599 if not isinstance(other, int):
600 return NotImplemented
601 return self.__class__(int(self) + other)
602
603 def __sub__(self, other):
604 if not isinstance(other, int):
605 return NotImplemented
606 return self.__class__(int(self) - other)
607
608 def __repr__(self):
609 return '%s(%r)' % (self.__class__.__name__, str(self))
610
611 def __str__(self):
612 return str(self._string_from_ip_int(self._ip))
613
614 def __hash__(self):
615 return hash(hex(int(self._ip)))
616
617 def _get_address_key(self):
618 return (self._version, self)
619
620 def __reduce__(self):
621 return self.__class__, (self._ip,)
622
623 def __format__(self, fmt):
624 """Returns an IP address as a formatted string.
625
626 Supported presentation types are:
627 's': returns the IP address as a string (default)
628 'b': converts to binary and returns a zero-padded string
629 'X' or 'x': converts to upper- or lower-case hex and returns a zero-padded string
630 'n': the same as 'b' for IPv4 and 'x' for IPv6
631
632 For binary and hex presentation types, the alternate form specifier
633 '#' and the grouping option '_' are supported.
634 """
635
636 # Support string formatting
637 if not fmt or fmt[-1] == 's':
638 return format(str(self), fmt)
639
640 # From here on down, support for 'bnXx'
641 global _address_fmt_re
642 if _address_fmt_re is None:
643 import re
644 _address_fmt_re = re.compile('(#?)(_?)([xbnX])')
645
646 m = _address_fmt_re.fullmatch(fmt)
647 if not m:
648 return super().__format__(fmt)
649
650 alternate, grouping, fmt_base = m.groups()
651
652 # Set some defaults
653 if fmt_base == 'n':
654 if self._version == 4:
655 fmt_base = 'b' # Binary is default for ipv4
656 else:
657 fmt_base = 'x' # Hex is default for ipv6
658
659 if fmt_base == 'b':
660 padlen = self._max_prefixlen
661 else:
662 padlen = self._max_prefixlen // 4
663
664 if grouping:
665 padlen += padlen // 4 - 1
666
667 if alternate:
668 padlen += 2 # 0b or 0x
669
670 return format(int(self), f'{alternate}0{padlen}{grouping}{fmt_base}')
671
672
673@functools.total_ordering
674class _BaseNetwork(_IPAddressBase):
675 """A generic IP network object.
676
677 This IP class contains the version independent methods which are
678 used by networks.
679 """
680
681 def __repr__(self):
682 return '%s(%r)' % (self.__class__.__name__, str(self))
683
684 def __str__(self):
685 return '%s/%d' % (self.network_address, self.prefixlen)
686
687 def hosts(self):
688 """Generate Iterator over usable hosts in a network.
689
690 This is like __iter__ except it doesn't return the network
691 or broadcast addresses.
692
693 """
694 network = int(self.network_address)
695 broadcast = int(self.broadcast_address)
696 for x in range(network + 1, broadcast):
697 yield self._address_class(x)
698
699 def __iter__(self):
700 network = int(self.network_address)
701 broadcast = int(self.broadcast_address)
702 for x in range(network, broadcast + 1):
703 yield self._address_class(x)
704
705 def __getitem__(self, n):
706 network = int(self.network_address)
707 broadcast = int(self.broadcast_address)
708 if n >= 0:
709 if network + n > broadcast:
710 raise IndexError('address out of range')
711 return self._address_class(network + n)
712 else:
713 n += 1
714 if broadcast + n < network:
715 raise IndexError('address out of range')
716 return self._address_class(broadcast + n)
717
718 def __lt__(self, other):
719 if not isinstance(other, _BaseNetwork):
720 return NotImplemented
721 if self._version != other._version:
722 raise TypeError('%s and %s are not of the same version' % (
723 self, other))
724 if self.network_address != other.network_address:
725 return self.network_address < other.network_address
726 if self.netmask != other.netmask:
727 return self.netmask < other.netmask
728 return False
729
730 def __eq__(self, other):
731 try:
732 return (self._version == other._version and
733 self.network_address == other.network_address and
734 int(self.netmask) == int(other.netmask))
735 except AttributeError:
736 return NotImplemented
737
738 def __hash__(self):
739 return hash(int(self.network_address) ^ int(self.netmask))
740
741 def __contains__(self, other):
742 # always false if one is v4 and the other is v6.
743 if self._version != other._version:
744 return False
745 # dealing with another network.
746 if isinstance(other, _BaseNetwork):
747 return False
748 # dealing with another address
749 else:
750 # address
751 return other._ip & self.netmask._ip == self.network_address._ip
752
753 def overlaps(self, other):
754 """Tell if self is partly contained in other."""
755 return self.network_address in other or (
756 self.broadcast_address in other or (
757 other.network_address in self or (
758 other.broadcast_address in self)))
759
760 @functools.cached_property
761 def broadcast_address(self):
762 return self._address_class(int(self.network_address) |
763 int(self.hostmask))
764
765 @functools.cached_property
766 def hostmask(self):
767 return self._address_class(int(self.netmask) ^ self._ALL_ONES)
768
769 @property
770 def with_prefixlen(self):
771 return '%s/%d' % (self.network_address, self._prefixlen)
772
773 @property
774 def with_netmask(self):
775 return '%s/%s' % (self.network_address, self.netmask)
776
777 @property
778 def with_hostmask(self):
779 return '%s/%s' % (self.network_address, self.hostmask)
780
781 @property
782 def num_addresses(self):
783 """Number of hosts in the current subnet."""
784 return int(self.broadcast_address) - int(self.network_address) + 1
785
786 @property
787 def _address_class(self):
788 # Returning bare address objects (rather than interfaces) allows for
789 # more consistent behaviour across the network address, broadcast
790 # address and individual host addresses.
791 msg = '%200s has no associated address class' % (type(self),)
792 raise NotImplementedError(msg)
793
794 @property
795 def prefixlen(self):
796 return self._prefixlen
797
798 def address_exclude(self, other):
799 """Remove an address from a larger block.
800
801 For example:
802
803 addr1 = ip_network('192.0.2.0/28')
804 addr2 = ip_network('192.0.2.1/32')
805 list(addr1.address_exclude(addr2)) =
806 [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'),
807 IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')]
808
809 or IPv6:
810
811 addr1 = ip_network('2001:db8::1/32')
812 addr2 = ip_network('2001:db8::1/128')
813 list(addr1.address_exclude(addr2)) =
814 [ip_network('2001:db8::1/128'),
815 ip_network('2001:db8::2/127'),
816 ip_network('2001:db8::4/126'),
817 ip_network('2001:db8::8/125'),
818 ...
819 ip_network('2001:db8:8000::/33')]
820
821 Args:
822 other: An IPv4Network or IPv6Network object of the same type.
823
824 Returns:
825 An iterator of the IPv(4|6)Network objects which is self
826 minus other.
827
828 Raises:
829 TypeError: If self and other are of differing address
830 versions, or if other is not a network object.
831 ValueError: If other is not completely contained by self.
832
833 """
834 if not self._version == other._version:
835 raise TypeError("%s and %s are not of the same version" % (
836 self, other))
837
838 if not isinstance(other, _BaseNetwork):
839 raise TypeError("%s is not a network object" % other)
840
841 if not other.subnet_of(self):
842 raise ValueError('%s not contained in %s' % (other, self))
843 if other == self:
844 return
845
846 # Make sure we're comparing the network of other.
847 other = other.__class__('%s/%s' % (other.network_address,
848 other.prefixlen))
849
850 s1, s2 = self.subnets()
851 while s1 != other and s2 != other:
852 if other.subnet_of(s1):
853 yield s2
854 s1, s2 = s1.subnets()
855 elif other.subnet_of(s2):
856 yield s1
857 s1, s2 = s2.subnets()
858 else:
859 # If we got here, there's a bug somewhere.
860 raise AssertionError('Error performing exclusion: '
861 's1: %s s2: %s other: %s' %
862 (s1, s2, other))
863 if s1 == other:
864 yield s2
865 elif s2 == other:
866 yield s1
867 else:
868 # If we got here, there's a bug somewhere.
869 raise AssertionError('Error performing exclusion: '
870 's1: %s s2: %s other: %s' %
871 (s1, s2, other))
872
873 def compare_networks(self, other):
874 """Compare two IP objects.
875
876 This is only concerned about the comparison of the integer
877 representation of the network addresses. This means that the
878 host bits aren't considered at all in this method. If you want
879 to compare host bits, you can easily enough do a
880 'HostA._ip < HostB._ip'
881
882 Args:
883 other: An IP object.
884
885 Returns:
886 If the IP versions of self and other are the same, returns:
887
888 -1 if self < other:
889 eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25')
890 IPv6Network('2001:db8::1000/124') <
891 IPv6Network('2001:db8::2000/124')
892 0 if self == other
893 eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24')
894 IPv6Network('2001:db8::1000/124') ==
895 IPv6Network('2001:db8::1000/124')
896 1 if self > other
897 eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25')
898 IPv6Network('2001:db8::2000/124') >
899 IPv6Network('2001:db8::1000/124')
900
901 Raises:
902 TypeError if the IP versions are different.
903
904 """
905 # does this need to raise a ValueError?
906 if self._version != other._version:
907 raise TypeError('%s and %s are not of the same type' % (
908 self, other))
909 # self._version == other._version below here:
910 if self.network_address < other.network_address:
911 return -1
912 if self.network_address > other.network_address:
913 return 1
914 # self.network_address == other.network_address below here:
915 if self.netmask < other.netmask:
916 return -1
917 if self.netmask > other.netmask:
918 return 1
919 return 0
920
921 def _get_networks_key(self):
922 """Network-only key function.
923
924 Returns an object that identifies this address' network and
925 netmask. This function is a suitable "key" argument for sorted()
926 and list.sort().
927
928 """
929 return (self._version, self.network_address, self.netmask)
930
931 def subnets(self, prefixlen_diff=1, new_prefix=None):
932 """The subnets which join to make the current subnet.
933
934 In the case that self contains only one IP
935 (self._prefixlen == 32 for IPv4 or self._prefixlen == 128
936 for IPv6), yield an iterator with just ourself.
937
938 Args:
939 prefixlen_diff: An integer, the amount the prefix length
940 should be increased by. This should not be set if
941 new_prefix is also set.
942 new_prefix: The desired new prefix length. This must be a
943 larger number (smaller prefix) than the existing prefix.
944 This should not be set if prefixlen_diff is also set.
945
946 Returns:
947 An iterator of IPv(4|6) objects.
948
949 Raises:
950 ValueError: The prefixlen_diff is too small or too large.
951 OR
952 prefixlen_diff and new_prefix are both set or new_prefix
953 is a smaller number than the current prefix (smaller
954 number means a larger network)
955
956 """
957 if self._prefixlen == self._max_prefixlen:
958 yield self
959 return
960
961 if new_prefix is not None:
962 if new_prefix < self._prefixlen:
963 raise ValueError('new prefix must be longer')
964 if prefixlen_diff != 1:
965 raise ValueError('cannot set prefixlen_diff and new_prefix')
966 prefixlen_diff = new_prefix - self._prefixlen
967
968 if prefixlen_diff < 0:
969 raise ValueError('prefix length diff must be > 0')
970 new_prefixlen = self._prefixlen + prefixlen_diff
971
972 if new_prefixlen > self._max_prefixlen:
973 raise ValueError(
974 'prefix length diff %d is invalid for netblock %s' % (
975 new_prefixlen, self))
976
977 start = int(self.network_address)
978 end = int(self.broadcast_address) + 1
979 step = (int(self.hostmask) + 1) >> prefixlen_diff
980 for new_addr in range(start, end, step):
981 current = self.__class__((new_addr, new_prefixlen))
982 yield current
983
984 def supernet(self, prefixlen_diff=1, new_prefix=None):
985 """The supernet containing the current network.
986
987 Args:
988 prefixlen_diff: An integer, the amount the prefix length of
989 the network should be decreased by. For example, given a
990 /24 network and a prefixlen_diff of 3, a supernet with a
991 /21 netmask is returned.
992
993 Returns:
994 An IPv4 network object.
995
996 Raises:
997 ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have
998 a negative prefix length.
999 OR
1000 If prefixlen_diff and new_prefix are both set or new_prefix is a
1001 larger number than the current prefix (larger number means a
1002 smaller network)
1003
1004 """
1005 if self._prefixlen == 0:
1006 return self
1007
1008 if new_prefix is not None:
1009 if new_prefix > self._prefixlen:
1010 raise ValueError('new prefix must be shorter')
1011 if prefixlen_diff != 1:
1012 raise ValueError('cannot set prefixlen_diff and new_prefix')
1013 prefixlen_diff = self._prefixlen - new_prefix
1014
1015 new_prefixlen = self.prefixlen - prefixlen_diff
1016 if new_prefixlen < 0:
1017 raise ValueError(
1018 'current prefixlen is %d, cannot have a prefixlen_diff of %d' %
1019 (self.prefixlen, prefixlen_diff))
1020 return self.__class__((
1021 int(self.network_address) & (int(self.netmask) << prefixlen_diff),
1022 new_prefixlen
1023 ))
1024
1025 @property
1026 def is_multicast(self):
1027 """Test if the address is reserved for multicast use.
1028
1029 Returns:
1030 A boolean, True if the address is a multicast address.
1031 See RFC 2373 2.7 for details.
1032
1033 """
1034 return (self.network_address.is_multicast and
1035 self.broadcast_address.is_multicast)
1036
1037 @staticmethod
1038 def _is_subnet_of(a, b):
1039 try:
1040 # Always false if one is v4 and the other is v6.
1041 if a._version != b._version:
1042 raise TypeError(f"{a} and {b} are not of the same version")
1043 return (b.network_address <= a.network_address and
1044 b.broadcast_address >= a.broadcast_address)
1045 except AttributeError:
1046 raise TypeError(f"Unable to test subnet containment "
1047 f"between {a} and {b}")
1048
1049 def subnet_of(self, other):
1050 """Return True if this network is a subnet of other."""
1051 return self._is_subnet_of(self, other)
1052
1053 def supernet_of(self, other):
1054 """Return True if this network is a supernet of other."""
1055 return self._is_subnet_of(other, self)
1056
1057 @property
1058 def is_reserved(self):
1059 """Test if the address is otherwise IETF reserved.
1060
1061 Returns:
1062 A boolean, True if the address is within one of the
1063 reserved IPv6 Network ranges.
1064
1065 """
1066 return (self.network_address.is_reserved and
1067 self.broadcast_address.is_reserved)
1068
1069 @property
1070 def is_link_local(self):
1071 """Test if the address is reserved for link-local.
1072
1073 Returns:
1074 A boolean, True if the address is reserved per RFC 4291.
1075
1076 """
1077 return (self.network_address.is_link_local and
1078 self.broadcast_address.is_link_local)
1079
1080 @property
1081 def is_private(self):
1082 """Test if this address is allocated for private networks.
1083
1084 Returns:
1085 A boolean, True if the address is reserved per
1086 iana-ipv4-special-registry or iana-ipv6-special-registry.
1087
1088 """
1089 return (self.network_address.is_private and
1090 self.broadcast_address.is_private)
1091
1092 @property
1093 def is_global(self):
1094 """Test if this address is allocated for public networks.
1095
1096 Returns:
1097 A boolean, True if the address is not reserved per
1098 iana-ipv4-special-registry or iana-ipv6-special-registry.
1099
1100 """
1101 return not self.is_private
1102
1103 @property
1104 def is_unspecified(self):
1105 """Test if the address is unspecified.
1106
1107 Returns:
1108 A boolean, True if this is the unspecified address as defined in
1109 RFC 2373 2.5.2.
1110
1111 """
1112 return (self.network_address.is_unspecified and
1113 self.broadcast_address.is_unspecified)
1114
1115 @property
1116 def is_loopback(self):
1117 """Test if the address is a loopback address.
1118
1119 Returns:
1120 A boolean, True if the address is a loopback address as defined in
1121 RFC 2373 2.5.3.
1122
1123 """
1124 return (self.network_address.is_loopback and
1125 self.broadcast_address.is_loopback)
1126
1127class _BaseV4:
1128
1129 """Base IPv4 object.
1130
1131 The following methods are used by IPv4 objects in both single IP
1132 addresses and networks.
1133
1134 """
1135
1136 __slots__ = ()
1137 _version = 4
1138 # Equivalent to 255.255.255.255 or 32 bits of 1's.
1139 _ALL_ONES = (2**IPV4LENGTH) - 1
1140
1141 _max_prefixlen = IPV4LENGTH
1142 # There are only a handful of valid v4 netmasks, so we cache them all
1143 # when constructed (see _make_netmask()).
1144 _netmask_cache = {}
1145
1146 def _explode_shorthand_ip_string(self):
1147 return str(self)
1148
1149 @classmethod
1150 def _make_netmask(cls, arg):
1151 """Make a (netmask, prefix_len) tuple from the given argument.
1152
1153 Argument can be:
1154 - an integer (the prefix length)
1155 - a string representing the prefix length (e.g. "24")
1156 - a string representing the prefix netmask (e.g. "255.255.255.0")
1157 """
1158 if arg not in cls._netmask_cache:
1159 if isinstance(arg, int):
1160 prefixlen = arg
1161 if not (0 <= prefixlen <= cls._max_prefixlen):
1162 cls._report_invalid_netmask(prefixlen)
1163 else:
1164 try:
1165 # Check for a netmask in prefix length form
1166 prefixlen = cls._prefix_from_prefix_string(arg)
1167 except NetmaskValueError:
1168 # Check for a netmask or hostmask in dotted-quad form.
1169 # This may raise NetmaskValueError.
1170 prefixlen = cls._prefix_from_ip_string(arg)
1171 netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen))
1172 cls._netmask_cache[arg] = netmask, prefixlen
1173 return cls._netmask_cache[arg]
1174
1175 @classmethod
1176 def _ip_int_from_string(cls, ip_str):
1177 """Turn the given IP string into an integer for comparison.
1178
1179 Args:
1180 ip_str: A string, the IP ip_str.
1181
1182 Returns:
1183 The IP ip_str as an integer.
1184
1185 Raises:
1186 AddressValueError: if ip_str isn't a valid IPv4 Address.
1187
1188 """
1189 if not ip_str:
1190 raise AddressValueError('Address cannot be empty')
1191
1192 octets = ip_str.split('.')
1193 if len(octets) != 4:
1194 raise AddressValueError("Expected 4 octets in %r" % ip_str)
1195
1196 try:
1197 return int.from_bytes(map(cls._parse_octet, octets), 'big')
1198 except ValueError as exc:
1199 raise AddressValueError("%s in %r" % (exc, ip_str)) from None
1200
1201 @classmethod
1202 def _parse_octet(cls, octet_str):
1203 """Convert a decimal octet into an integer.
1204
1205 Args:
1206 octet_str: A string, the number to parse.
1207
1208 Returns:
1209 The octet as an integer.
1210
1211 Raises:
1212 ValueError: if the octet isn't strictly a decimal from [0..255].
1213
1214 """
1215 if not octet_str:
1216 raise ValueError("Empty octet not permitted")
1217 # Whitelist the characters, since int() allows a lot of bizarre stuff.
1218 if not (octet_str.isascii() and octet_str.isdigit()):
1219 msg = "Only decimal digits permitted in %r"
1220 raise ValueError(msg % octet_str)
1221 # We do the length check second, since the invalid character error
1222 # is likely to be more informative for the user
1223 if len(octet_str) > 3:
1224 msg = "At most 3 characters permitted in %r"
1225 raise ValueError(msg % octet_str)
1226 # Convert to integer (we know digits are legal)
1227 octet_int = int(octet_str, 10)
1228 if octet_int > 255:
1229 raise ValueError("Octet %d (> 255) not permitted" % octet_int)
1230 return octet_int
1231
1232 @classmethod
1233 def _string_from_ip_int(cls, ip_int):
1234 """Turns a 32-bit integer into dotted decimal notation.
1235
1236 Args:
1237 ip_int: An integer, the IP address.
1238
1239 Returns:
1240 The IP address as a string in dotted decimal notation.
1241
1242 """
1243 return '.'.join(map(str, ip_int.to_bytes(4, 'big')))
1244
1245 def _reverse_pointer(self):
1246 """Return the reverse DNS pointer name for the IPv4 address.
1247
1248 This implements the method described in RFC1035 3.5.
1249
1250 """
1251 reverse_octets = str(self).split('.')[::-1]
1252 return '.'.join(reverse_octets) + '.in-addr.arpa'
1253
1254 @property
1255 def max_prefixlen(self):
1256 return self._max_prefixlen
1257
1258 @property
1259 def version(self):
1260 return self._version
1261
1262
1263class IPv4Address(_BaseV4, _BaseAddress):
1264
1265 """Represent and manipulate single IPv4 Addresses."""
1266
1267 __slots__ = ('_ip', '__weakref__')
1268
1269 def __init__(self, address):
1270
1271 """
1272 Args:
1273 address: A string or integer representing the IP
1274
1275 Additionally, an integer can be passed, so
1276 IPv4Address('192.0.2.1') == IPv4Address(3221225985).
1277 or, more generally
1278 IPv4Address(int(IPv4Address('192.0.2.1'))) ==
1279 IPv4Address('192.0.2.1')
1280
1281 Raises:
1282 AddressValueError: If ipaddress isn't a valid IPv4 address.
1283
1284 """
1285 # Efficient constructor from integer.
1286 if isinstance(address, int):
1287 self._check_int_address(address)
1288 self._ip = address
1289 return
1290
1291 # Constructing from a packed address
1292 if isinstance(address, bytes):
1293 self._check_packed_address(address, 4)
1294 self._ip = int.from_bytes(address, 'big')
1295 return
1296
1297 # Assume input argument to be string or any object representation
1298 # which converts into a formatted IP string.
1299 addr_str = str(address)
1300 if '/' in addr_str:
1301 raise AddressValueError("Unexpected '/' in %r" % address)
1302 self._ip = self._ip_int_from_string(addr_str)
1303
1304 @property
1305 def packed(self):
1306 """The binary representation of this address."""
1307 return v4_int_to_packed(self._ip)
1308
1309 @property
1310 def is_reserved(self):
1311 """Test if the address is otherwise IETF reserved.
1312
1313 Returns:
1314 A boolean, True if the address is within the
1315 reserved IPv4 Network range.
1316
1317 """
1318 return self in self._constants._reserved_network
1319
1320 @property
1321 @functools.lru_cache()
1322 def is_private(self):
1323 """Test if this address is allocated for private networks.
1324
1325 Returns:
1326 A boolean, True if the address is reserved per
1327 iana-ipv4-special-registry.
1328
1329 """
1330 return any(self in net for net in self._constants._private_networks)
1331
1332 @property
1333 @functools.lru_cache()
1334 def is_global(self):
1335 return self not in self._constants._public_network and not self.is_private
1336
1337 @property
1338 def is_multicast(self):
1339 """Test if the address is reserved for multicast use.
1340
1341 Returns:
1342 A boolean, True if the address is multicast.
1343 See RFC 3171 for details.
1344
1345 """
1346 return self in self._constants._multicast_network
1347
1348 @property
1349 def is_unspecified(self):
1350 """Test if the address is unspecified.
1351
1352 Returns:
1353 A boolean, True if this is the unspecified address as defined in
1354 RFC 5735 3.
1355
1356 """
1357 return self == self._constants._unspecified_address
1358
1359 @property
1360 def is_loopback(self):
1361 """Test if the address is a loopback address.
1362
1363 Returns:
1364 A boolean, True if the address is a loopback per RFC 3330.
1365
1366 """
1367 return self in self._constants._loopback_network
1368
1369 @property
1370 def is_link_local(self):
1371 """Test if the address is reserved for link-local.
1372
1373 Returns:
1374 A boolean, True if the address is link-local per RFC 3927.
1375
1376 """
1377 return self in self._constants._linklocal_network
1378
1379
1380class IPv4Interface(IPv4Address):
1381
1382 def __init__(self, address):
1383 addr, mask = self._split_addr_prefix(address)
1384
1385 IPv4Address.__init__(self, addr)
1386 self.network = IPv4Network((addr, mask), strict=False)
1387 self.netmask = self.network.netmask
1388 self._prefixlen = self.network._prefixlen
1389
1390 @functools.cached_property
1391 def hostmask(self):
1392 return self.network.hostmask
1393
1394 def __str__(self):
1395 return '%s/%d' % (self._string_from_ip_int(self._ip),
1396 self._prefixlen)
1397
1398 def __eq__(self, other):
1399 address_equal = IPv4Address.__eq__(self, other)
1400 if address_equal is NotImplemented or not address_equal:
1401 return address_equal
1402 try:
1403 return self.network == other.network
1404 except AttributeError:
1405 # An interface with an associated network is NOT the
1406 # same as an unassociated address. That's why the hash
1407 # takes the extra info into account.
1408 return False
1409
1410 def __lt__(self, other):
1411 address_less = IPv4Address.__lt__(self, other)
1412 if address_less is NotImplemented:
1413 return NotImplemented
1414 try:
1415 return (self.network < other.network or
1416 self.network == other.network and address_less)
1417 except AttributeError:
1418 # We *do* allow addresses and interfaces to be sorted. The
1419 # unassociated address is considered less than all interfaces.
1420 return False
1421
1422 def __hash__(self):
1423 return hash((self._ip, self._prefixlen, int(self.network.network_address)))
1424
1425 __reduce__ = _IPAddressBase.__reduce__
1426
1427 @property
1428 def ip(self):
1429 return IPv4Address(self._ip)
1430
1431 @property
1432 def with_prefixlen(self):
1433 return '%s/%s' % (self._string_from_ip_int(self._ip),
1434 self._prefixlen)
1435
1436 @property
1437 def with_netmask(self):
1438 return '%s/%s' % (self._string_from_ip_int(self._ip),
1439 self.netmask)
1440
1441 @property
1442 def with_hostmask(self):
1443 return '%s/%s' % (self._string_from_ip_int(self._ip),
1444 self.hostmask)
1445
1446
1447class IPv4Network(_BaseV4, _BaseNetwork):
1448
1449 """This class represents and manipulates 32-bit IPv4 network + addresses..
1450
1451 Attributes: [examples for IPv4Network('192.0.2.0/27')]
1452 .network_address: IPv4Address('192.0.2.0')
1453 .hostmask: IPv4Address('0.0.0.31')
1454 .broadcast_address: IPv4Address('192.0.2.32')
1455 .netmask: IPv4Address('255.255.255.224')
1456 .prefixlen: 27
1457
1458 """
1459 # Class to use when creating address objects
1460 _address_class = IPv4Address
1461
1462 def __init__(self, address, strict=True):
1463 """Instantiate a new IPv4 network object.
1464
1465 Args:
1466 address: A string or integer representing the IP [& network].
1467 '192.0.2.0/24'
1468 '192.0.2.0/255.255.255.0'
1469 '192.0.2.0/0.0.0.255'
1470 are all functionally the same in IPv4. Similarly,
1471 '192.0.2.1'
1472 '192.0.2.1/255.255.255.255'
1473 '192.0.2.1/32'
1474 are also functionally equivalent. That is to say, failing to
1475 provide a subnetmask will create an object with a mask of /32.
1476
1477 If the mask (portion after the / in the argument) is given in
1478 dotted quad form, it is treated as a netmask if it starts with a
1479 non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it
1480 starts with a zero field (e.g. 0.255.255.255 == /8), with the
1481 single exception of an all-zero mask which is treated as a
1482 netmask == /0. If no mask is given, a default of /32 is used.
1483
1484 Additionally, an integer can be passed, so
1485 IPv4Network('192.0.2.1') == IPv4Network(3221225985)
1486 or, more generally
1487 IPv4Interface(int(IPv4Interface('192.0.2.1'))) ==
1488 IPv4Interface('192.0.2.1')
1489
1490 Raises:
1491 AddressValueError: If ipaddress isn't a valid IPv4 address.
1492 NetmaskValueError: If the netmask isn't valid for
1493 an IPv4 address.
1494 ValueError: If strict is True and a network address is not
1495 supplied.
1496 """
1497 addr, mask = self._split_addr_prefix(address)
1498
1499 self.network_address = IPv4Address(addr)
1500 self.netmask, self._prefixlen = self._make_netmask(mask)
1501 packed = int(self.network_address)
1502 if packed & int(self.netmask) != packed:
1503 if strict:
1504 raise ValueError('%s has host bits set' % self)
1505 else:
1506 self.network_address = IPv4Address(packed &
1507 int(self.netmask))
1508
1509 if self._prefixlen == (self._max_prefixlen - 1):
1510 self.hosts = self.__iter__
1511 elif self._prefixlen == (self._max_prefixlen):
1512 self.hosts = lambda: [IPv4Address(addr)]
1513
1514 @property
1515 @functools.lru_cache()
1516 def is_global(self):
1517 """Test if this address is allocated for public networks.
1518
1519 Returns:
1520 A boolean, True if the address is not reserved per
1521 iana-ipv4-special-registry.
1522
1523 """
1524 return (not (self.network_address in IPv4Network('100.64.0.0/10') and
1525 self.broadcast_address in IPv4Network('100.64.0.0/10')) and
1526 not self.is_private)
1527
1528
1529class _IPv4Constants:
1530 _linklocal_network = IPv4Network('169.254.0.0/16')
1531
1532 _loopback_network = IPv4Network('127.0.0.0/8')
1533
1534 _multicast_network = IPv4Network('224.0.0.0/4')
1535
1536 _public_network = IPv4Network('100.64.0.0/10')
1537
1538 _private_networks = [
1539 IPv4Network('0.0.0.0/8'),
1540 IPv4Network('10.0.0.0/8'),
1541 IPv4Network('127.0.0.0/8'),
1542 IPv4Network('169.254.0.0/16'),
1543 IPv4Network('172.16.0.0/12'),
1544 IPv4Network('192.0.0.0/29'),
1545 IPv4Network('192.0.0.170/31'),
1546 IPv4Network('192.0.2.0/24'),
1547 IPv4Network('192.168.0.0/16'),
1548 IPv4Network('198.18.0.0/15'),
1549 IPv4Network('198.51.100.0/24'),
1550 IPv4Network('203.0.113.0/24'),
1551 IPv4Network('240.0.0.0/4'),
1552 IPv4Network('255.255.255.255/32'),
1553 ]
1554
1555 _reserved_network = IPv4Network('240.0.0.0/4')
1556
1557 _unspecified_address = IPv4Address('0.0.0.0')
1558
1559
1560IPv4Address._constants = _IPv4Constants
1561
1562
1563class _BaseV6:
1564
1565 """Base IPv6 object.
1566
1567 The following methods are used by IPv6 objects in both single IP
1568 addresses and networks.
1569
1570 """
1571
1572 __slots__ = ()
1573 _version = 6
1574 _ALL_ONES = (2**IPV6LENGTH) - 1
1575 _HEXTET_COUNT = 8
1576 _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef')
1577 _max_prefixlen = IPV6LENGTH
1578
1579 # There are only a bunch of valid v6 netmasks, so we cache them all
1580 # when constructed (see _make_netmask()).
1581 _netmask_cache = {}
1582
1583 @classmethod
1584 def _make_netmask(cls, arg):
1585 """Make a (netmask, prefix_len) tuple from the given argument.
1586
1587 Argument can be:
1588 - an integer (the prefix length)
1589 - a string representing the prefix length (e.g. "24")
1590 - a string representing the prefix netmask (e.g. "255.255.255.0")
1591 """
1592 if arg not in cls._netmask_cache:
1593 if isinstance(arg, int):
1594 prefixlen = arg
1595 if not (0 <= prefixlen <= cls._max_prefixlen):
1596 cls._report_invalid_netmask(prefixlen)
1597 else:
1598 prefixlen = cls._prefix_from_prefix_string(arg)
1599 netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen))
1600 cls._netmask_cache[arg] = netmask, prefixlen
1601 return cls._netmask_cache[arg]
1602
1603 @classmethod
1604 def _ip_int_from_string(cls, ip_str):
1605 """Turn an IPv6 ip_str into an integer.
1606
1607 Args:
1608 ip_str: A string, the IPv6 ip_str.
1609
1610 Returns:
1611 An int, the IPv6 address
1612
1613 Raises:
1614 AddressValueError: if ip_str isn't a valid IPv6 Address.
1615
1616 """
1617 if not ip_str:
1618 raise AddressValueError('Address cannot be empty')
1619
1620 parts = ip_str.split(':')
1621
1622 # An IPv6 address needs at least 2 colons (3 parts).
1623 _min_parts = 3
1624 if len(parts) < _min_parts:
1625 msg = "At least %d parts expected in %r" % (_min_parts, ip_str)
1626 raise AddressValueError(msg)
1627
1628 # If the address has an IPv4-style suffix, convert it to hexadecimal.
1629 if '.' in parts[-1]:
1630 try:
1631 ipv4_int = IPv4Address(parts.pop())._ip
1632 except AddressValueError as exc:
1633 raise AddressValueError("%s in %r" % (exc, ip_str)) from None
1634 parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF))
1635 parts.append('%x' % (ipv4_int & 0xFFFF))
1636
1637 # An IPv6 address can't have more than 8 colons (9 parts).
1638 # The extra colon comes from using the "::" notation for a single
1639 # leading or trailing zero part.
1640 _max_parts = cls._HEXTET_COUNT + 1
1641 if len(parts) > _max_parts:
1642 msg = "At most %d colons permitted in %r" % (_max_parts-1, ip_str)
1643 raise AddressValueError(msg)
1644
1645 # Disregarding the endpoints, find '::' with nothing in between.
1646 # This indicates that a run of zeroes has been skipped.
1647 skip_index = None
1648 for i in range(1, len(parts) - 1):
1649 if not parts[i]:
1650 if skip_index is not None:
1651 # Can't have more than one '::'
1652 msg = "At most one '::' permitted in %r" % ip_str
1653 raise AddressValueError(msg)
1654 skip_index = i
1655
1656 # parts_hi is the number of parts to copy from above/before the '::'
1657 # parts_lo is the number of parts to copy from below/after the '::'
1658 if skip_index is not None:
1659 # If we found a '::', then check if it also covers the endpoints.
1660 parts_hi = skip_index
1661 parts_lo = len(parts) - skip_index - 1
1662 if not parts[0]:
1663 parts_hi -= 1
1664 if parts_hi:
1665 msg = "Leading ':' only permitted as part of '::' in %r"
1666 raise AddressValueError(msg % ip_str) # ^: requires ^::
1667 if not parts[-1]:
1668 parts_lo -= 1
1669 if parts_lo:
1670 msg = "Trailing ':' only permitted as part of '::' in %r"
1671 raise AddressValueError(msg % ip_str) # :$ requires ::$
1672 parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo)
1673 if parts_skipped < 1:
1674 msg = "Expected at most %d other parts with '::' in %r"
1675 raise AddressValueError(msg % (cls._HEXTET_COUNT-1, ip_str))
1676 else:
1677 # Otherwise, allocate the entire address to parts_hi. The
1678 # endpoints could still be empty, but _parse_hextet() will check
1679 # for that.
1680 if len(parts) != cls._HEXTET_COUNT:
1681 msg = "Exactly %d parts expected without '::' in %r"
1682 raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str))
1683 if not parts[0]:
1684 msg = "Leading ':' only permitted as part of '::' in %r"
1685 raise AddressValueError(msg % ip_str) # ^: requires ^::
1686 if not parts[-1]:
1687 msg = "Trailing ':' only permitted as part of '::' in %r"
1688 raise AddressValueError(msg % ip_str) # :$ requires ::$
1689 parts_hi = len(parts)
1690 parts_lo = 0
1691 parts_skipped = 0
1692
1693 try:
1694 # Now, parse the hextets into a 128-bit integer.
1695 ip_int = 0
1696 for i in range(parts_hi):
1697 ip_int <<= 16
1698 ip_int |= cls._parse_hextet(parts[i])
1699 ip_int <<= 16 * parts_skipped
1700 for i in range(-parts_lo, 0):
1701 ip_int <<= 16
1702 ip_int |= cls._parse_hextet(parts[i])
1703 return ip_int
1704 except ValueError as exc:
1705 raise AddressValueError("%s in %r" % (exc, ip_str)) from None
1706
1707 @classmethod
1708 def _parse_hextet(cls, hextet_str):
1709 """Convert an IPv6 hextet string into an integer.
1710
1711 Args:
1712 hextet_str: A string, the number to parse.
1713
1714 Returns:
1715 The hextet as an integer.
1716
1717 Raises:
1718 ValueError: if the input isn't strictly a hex number from
1719 [0..FFFF].
1720
1721 """
1722 # Whitelist the characters, since int() allows a lot of bizarre stuff.
1723 if not cls._HEX_DIGITS.issuperset(hextet_str):
1724 raise ValueError("Only hex digits permitted in %r" % hextet_str)
1725 # We do the length check second, since the invalid character error
1726 # is likely to be more informative for the user
1727 if len(hextet_str) > 4:
1728 msg = "At most 4 characters permitted in %r"
1729 raise ValueError(msg % hextet_str)
1730 # Length check means we can skip checking the integer value
1731 return int(hextet_str, 16)
1732
1733 @classmethod
1734 def _compress_hextets(cls, hextets):
1735 """Compresses a list of hextets.
1736
1737 Compresses a list of strings, replacing the longest continuous
1738 sequence of "0" in the list with "" and adding empty strings at
1739 the beginning or at the end of the string such that subsequently
1740 calling ":".join(hextets) will produce the compressed version of
1741 the IPv6 address.
1742
1743 Args:
1744 hextets: A list of strings, the hextets to compress.
1745
1746 Returns:
1747 A list of strings.
1748
1749 """
1750 best_doublecolon_start = -1
1751 best_doublecolon_len = 0
1752 doublecolon_start = -1
1753 doublecolon_len = 0
1754 for index, hextet in enumerate(hextets):
1755 if hextet == '0':
1756 doublecolon_len += 1
1757 if doublecolon_start == -1:
1758 # Start of a sequence of zeros.
1759 doublecolon_start = index
1760 if doublecolon_len > best_doublecolon_len:
1761 # This is the longest sequence of zeros so far.
1762 best_doublecolon_len = doublecolon_len
1763 best_doublecolon_start = doublecolon_start
1764 else:
1765 doublecolon_len = 0
1766 doublecolon_start = -1
1767
1768 if best_doublecolon_len > 1:
1769 best_doublecolon_end = (best_doublecolon_start +
1770 best_doublecolon_len)
1771 # For zeros at the end of the address.
1772 if best_doublecolon_end == len(hextets):
1773 hextets += ['']
1774 hextets[best_doublecolon_start:best_doublecolon_end] = ['']
1775 # For zeros at the beginning of the address.
1776 if best_doublecolon_start == 0:
1777 hextets = [''] + hextets
1778
1779 return hextets
1780
1781 @classmethod
1782 def _string_from_ip_int(cls, ip_int=None):
1783 """Turns a 128-bit integer into hexadecimal notation.
1784
1785 Args:
1786 ip_int: An integer, the IP address.
1787
1788 Returns:
1789 A string, the hexadecimal representation of the address.
1790
1791 Raises:
1792 ValueError: The address is bigger than 128 bits of all ones.
1793
1794 """
1795 if ip_int is None:
1796 ip_int = int(cls._ip)
1797
1798 if ip_int > cls._ALL_ONES:
1799 raise ValueError('IPv6 address is too large')
1800
1801 hex_str = '%032x' % ip_int
1802 hextets = ['%x' % int(hex_str[x:x+4], 16) for x in range(0, 32, 4)]
1803
1804 hextets = cls._compress_hextets(hextets)
1805 return ':'.join(hextets)
1806
1807 def _explode_shorthand_ip_string(self):
1808 """Expand a shortened IPv6 address.
1809
1810 Args:
1811 ip_str: A string, the IPv6 address.
1812
1813 Returns:
1814 A string, the expanded IPv6 address.
1815
1816 """
1817 if isinstance(self, IPv6Network):
1818 ip_str = str(self.network_address)
1819 elif isinstance(self, IPv6Interface):
1820 ip_str = str(self.ip)
1821 else:
1822 ip_str = str(self)
1823
1824 ip_int = self._ip_int_from_string(ip_str)
1825 hex_str = '%032x' % ip_int
1826 parts = [hex_str[x:x+4] for x in range(0, 32, 4)]
1827 if isinstance(self, (_BaseNetwork, IPv6Interface)):
1828 return '%s/%d' % (':'.join(parts), self._prefixlen)
1829 return ':'.join(parts)
1830
1831 def _reverse_pointer(self):
1832 """Return the reverse DNS pointer name for the IPv6 address.
1833
1834 This implements the method described in RFC3596 2.5.
1835
1836 """
1837 reverse_chars = self.exploded[::-1].replace(':', '')
1838 return '.'.join(reverse_chars) + '.ip6.arpa'
1839
1840 @staticmethod
1841 def _split_scope_id(ip_str):
1842 """Helper function to parse IPv6 string address with scope id.
1843
1844 See RFC 4007 for details.
1845
1846 Args:
1847 ip_str: A string, the IPv6 address.
1848
1849 Returns:
1850 (addr, scope_id) tuple.
1851
1852 """
1853 addr, sep, scope_id = ip_str.partition('%')
1854 if not sep:
1855 scope_id = None
1856 elif not scope_id or '%' in scope_id:
1857 raise AddressValueError('Invalid IPv6 address: "%r"' % ip_str)
1858 return addr, scope_id
1859
1860 @property
1861 def max_prefixlen(self):
1862 return self._max_prefixlen
1863
1864 @property
1865 def version(self):
1866 return self._version
1867
1868
1869class IPv6Address(_BaseV6, _BaseAddress):
1870
1871 """Represent and manipulate single IPv6 Addresses."""
1872
1873 __slots__ = ('_ip', '_scope_id', '__weakref__')
1874
1875 def __init__(self, address):
1876 """Instantiate a new IPv6 address object.
1877
1878 Args:
1879 address: A string or integer representing the IP
1880
1881 Additionally, an integer can be passed, so
1882 IPv6Address('2001:db8::') ==
1883 IPv6Address(42540766411282592856903984951653826560)
1884 or, more generally
1885 IPv6Address(int(IPv6Address('2001:db8::'))) ==
1886 IPv6Address('2001:db8::')
1887
1888 Raises:
1889 AddressValueError: If address isn't a valid IPv6 address.
1890
1891 """
1892 # Efficient constructor from integer.
1893 if isinstance(address, int):
1894 self._check_int_address(address)
1895 self._ip = address
1896 self._scope_id = None
1897 return
1898
1899 # Constructing from a packed address
1900 if isinstance(address, bytes):
1901 self._check_packed_address(address, 16)
1902 self._ip = int.from_bytes(address, 'big')
1903 self._scope_id = None
1904 return
1905
1906 # Assume input argument to be string or any object representation
1907 # which converts into a formatted IP string.
1908 addr_str = str(address)
1909 if '/' in addr_str:
1910 raise AddressValueError("Unexpected '/' in %r" % address)
1911 addr_str, self._scope_id = self._split_scope_id(addr_str)
1912
1913 self._ip = self._ip_int_from_string(addr_str)
1914
1915 def __str__(self):
1916 ip_str = super().__str__()
1917 return ip_str + '%' + self._scope_id if self._scope_id else ip_str
1918
1919 def __hash__(self):
1920 return hash((self._ip, self._scope_id))
1921
1922 def __eq__(self, other):
1923 address_equal = super().__eq__(other)
1924 if address_equal is NotImplemented:
1925 return NotImplemented
1926 if not address_equal:
1927 return False
1928 return self._scope_id == getattr(other, '_scope_id', None)
1929
1930 @property
1931 def scope_id(self):
1932 """Identifier of a particular zone of the address's scope.
1933
1934 See RFC 4007 for details.
1935
1936 Returns:
1937 A string identifying the zone of the address if specified, else None.
1938
1939 """
1940 return self._scope_id
1941
1942 @property
1943 def packed(self):
1944 """The binary representation of this address."""
1945 return v6_int_to_packed(self._ip)
1946
1947 @property
1948 def is_multicast(self):
1949 """Test if the address is reserved for multicast use.
1950
1951 Returns:
1952 A boolean, True if the address is a multicast address.
1953 See RFC 2373 2.7 for details.
1954
1955 """
1956 return self in self._constants._multicast_network
1957
1958 @property
1959 def is_reserved(self):
1960 """Test if the address is otherwise IETF reserved.
1961
1962 Returns:
1963 A boolean, True if the address is within one of the
1964 reserved IPv6 Network ranges.
1965
1966 """
1967 return any(self in x for x in self._constants._reserved_networks)
1968
1969 @property
1970 def is_link_local(self):
1971 """Test if the address is reserved for link-local.
1972
1973 Returns:
1974 A boolean, True if the address is reserved per RFC 4291.
1975
1976 """
1977 return self in self._constants._linklocal_network
1978
1979 @property
1980 def is_site_local(self):
1981 """Test if the address is reserved for site-local.
1982
1983 Note that the site-local address space has been deprecated by RFC 3879.
1984 Use is_private to test if this address is in the space of unique local
1985 addresses as defined by RFC 4193.
1986
1987 Returns:
1988 A boolean, True if the address is reserved per RFC 3513 2.5.6.
1989
1990 """
1991 return self in self._constants._sitelocal_network
1992
1993 @property
1994 @functools.lru_cache()
1995 def is_private(self):
1996 """Test if this address is allocated for private networks.
1997
1998 Returns:
1999 A boolean, True if the address is reserved per
2000 iana-ipv6-special-registry.
2001
2002 """
2003 return any(self in net for net in self._constants._private_networks)
2004
2005 @property
2006 def is_global(self):
2007 """Test if this address is allocated for public networks.
2008
2009 Returns:
2010 A boolean, true if the address is not reserved per
2011 iana-ipv6-special-registry.
2012
2013 """
2014 return not self.is_private
2015
2016 @property
2017 def is_unspecified(self):
2018 """Test if the address is unspecified.
2019
2020 Returns:
2021 A boolean, True if this is the unspecified address as defined in
2022 RFC 2373 2.5.2.
2023
2024 """
2025 return self._ip == 0
2026
2027 @property
2028 def is_loopback(self):
2029 """Test if the address is a loopback address.
2030
2031 Returns:
2032 A boolean, True if the address is a loopback address as defined in
2033 RFC 2373 2.5.3.
2034
2035 """
2036 return self._ip == 1
2037
2038 @property
2039 def ipv4_mapped(self):
2040 """Return the IPv4 mapped address.
2041
2042 Returns:
2043 If the IPv6 address is a v4 mapped address, return the
2044 IPv4 mapped address. Return None otherwise.
2045
2046 """
2047 if (self._ip >> 32) != 0xFFFF:
2048 return None
2049 return IPv4Address(self._ip & 0xFFFFFFFF)
2050
2051 @property
2052 def teredo(self):
2053 """Tuple of embedded teredo IPs.
2054
2055 Returns:
2056 Tuple of the (server, client) IPs or None if the address
2057 doesn't appear to be a teredo address (doesn't start with
2058 2001::/32)
2059
2060 """
2061 if (self._ip >> 96) != 0x20010000:
2062 return None
2063 return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF),
2064 IPv4Address(~self._ip & 0xFFFFFFFF))
2065
2066 @property
2067 def sixtofour(self):
2068 """Return the IPv4 6to4 embedded address.
2069
2070 Returns:
2071 The IPv4 6to4-embedded address if present or None if the
2072 address doesn't appear to contain a 6to4 embedded address.
2073
2074 """
2075 if (self._ip >> 112) != 0x2002:
2076 return None
2077 return IPv4Address((self._ip >> 80) & 0xFFFFFFFF)
2078
2079
2080class IPv6Interface(IPv6Address):
2081
2082 def __init__(self, address):
2083 addr, mask = self._split_addr_prefix(address)
2084
2085 IPv6Address.__init__(self, addr)
2086 self.network = IPv6Network((addr, mask), strict=False)
2087 self.netmask = self.network.netmask
2088 self._prefixlen = self.network._prefixlen
2089
2090 @functools.cached_property
2091 def hostmask(self):
2092 return self.network.hostmask
2093
2094 def __str__(self):
2095 return '%s/%d' % (super().__str__(),
2096 self._prefixlen)
2097
2098 def __eq__(self, other):
2099 address_equal = IPv6Address.__eq__(self, other)
2100 if address_equal is NotImplemented or not address_equal:
2101 return address_equal
2102 try:
2103 return self.network == other.network
2104 except AttributeError:
2105 # An interface with an associated network is NOT the
2106 # same as an unassociated address. That's why the hash
2107 # takes the extra info into account.
2108 return False
2109
2110 def __lt__(self, other):
2111 address_less = IPv6Address.__lt__(self, other)
2112 if address_less is NotImplemented:
2113 return address_less
2114 try:
2115 return (self.network < other.network or
2116 self.network == other.network and address_less)
2117 except AttributeError:
2118 # We *do* allow addresses and interfaces to be sorted. The
2119 # unassociated address is considered less than all interfaces.
2120 return False
2121
2122 def __hash__(self):
2123 return hash((self._ip, self._prefixlen, int(self.network.network_address)))
2124
2125 __reduce__ = _IPAddressBase.__reduce__
2126
2127 @property
2128 def ip(self):
2129 return IPv6Address(self._ip)
2130
2131 @property
2132 def with_prefixlen(self):
2133 return '%s/%s' % (self._string_from_ip_int(self._ip),
2134 self._prefixlen)
2135
2136 @property
2137 def with_netmask(self):
2138 return '%s/%s' % (self._string_from_ip_int(self._ip),
2139 self.netmask)
2140
2141 @property
2142 def with_hostmask(self):
2143 return '%s/%s' % (self._string_from_ip_int(self._ip),
2144 self.hostmask)
2145
2146 @property
2147 def is_unspecified(self):
2148 return self._ip == 0 and self.network.is_unspecified
2149
2150 @property
2151 def is_loopback(self):
2152 return self._ip == 1 and self.network.is_loopback
2153
2154
2155class IPv6Network(_BaseV6, _BaseNetwork):
2156
2157 """This class represents and manipulates 128-bit IPv6 networks.
2158
2159 Attributes: [examples for IPv6('2001:db8::1000/124')]
2160 .network_address: IPv6Address('2001:db8::1000')
2161 .hostmask: IPv6Address('::f')
2162 .broadcast_address: IPv6Address('2001:db8::100f')
2163 .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0')
2164 .prefixlen: 124
2165
2166 """
2167
2168 # Class to use when creating address objects
2169 _address_class = IPv6Address
2170
2171 def __init__(self, address, strict=True):
2172 """Instantiate a new IPv6 Network object.
2173
2174 Args:
2175 address: A string or integer representing the IPv6 network or the
2176 IP and prefix/netmask.
2177 '2001:db8::/128'
2178 '2001:db8:0000:0000:0000:0000:0000:0000/128'
2179 '2001:db8::'
2180 are all functionally the same in IPv6. That is to say,
2181 failing to provide a subnetmask will create an object with
2182 a mask of /128.
2183
2184 Additionally, an integer can be passed, so
2185 IPv6Network('2001:db8::') ==
2186 IPv6Network(42540766411282592856903984951653826560)
2187 or, more generally
2188 IPv6Network(int(IPv6Network('2001:db8::'))) ==
2189 IPv6Network('2001:db8::')
2190
2191 strict: A boolean. If true, ensure that we have been passed
2192 A true network address, eg, 2001:db8::1000/124 and not an
2193 IP address on a network, eg, 2001:db8::1/124.
2194
2195 Raises:
2196 AddressValueError: If address isn't a valid IPv6 address.
2197 NetmaskValueError: If the netmask isn't valid for
2198 an IPv6 address.
2199 ValueError: If strict was True and a network address was not
2200 supplied.
2201 """
2202 addr, mask = self._split_addr_prefix(address)
2203
2204 self.network_address = IPv6Address(addr)
2205 self.netmask, self._prefixlen = self._make_netmask(mask)
2206 packed = int(self.network_address)
2207 if packed & int(self.netmask) != packed:
2208 if strict:
2209 raise ValueError('%s has host bits set' % self)
2210 else:
2211 self.network_address = IPv6Address(packed &
2212 int(self.netmask))
2213
2214 if self._prefixlen == (self._max_prefixlen - 1):
2215 self.hosts = self.__iter__
2216 elif self._prefixlen == self._max_prefixlen:
2217 self.hosts = lambda: [IPv6Address(addr)]
2218
2219 def hosts(self):
2220 """Generate Iterator over usable hosts in a network.
2221
2222 This is like __iter__ except it doesn't return the
2223 Subnet-Router anycast address.
2224
2225 """
2226 network = int(self.network_address)
2227 broadcast = int(self.broadcast_address)
2228 for x in range(network + 1, broadcast + 1):
2229 yield self._address_class(x)
2230
2231 @property
2232 def is_site_local(self):
2233 """Test if the address is reserved for site-local.
2234
2235 Note that the site-local address space has been deprecated by RFC 3879.
2236 Use is_private to test if this address is in the space of unique local
2237 addresses as defined by RFC 4193.
2238
2239 Returns:
2240 A boolean, True if the address is reserved per RFC 3513 2.5.6.
2241
2242 """
2243 return (self.network_address.is_site_local and
2244 self.broadcast_address.is_site_local)
2245
2246
2247class _IPv6Constants:
2248
2249 _linklocal_network = IPv6Network('fe80::/10')
2250
2251 _multicast_network = IPv6Network('ff00::/8')
2252
2253 _private_networks = [
2254 IPv6Network('::1/128'),
2255 IPv6Network('::/128'),
2256 IPv6Network('::ffff:0:0/96'),
2257 IPv6Network('100::/64'),
2258 IPv6Network('2001::/23'),
2259 IPv6Network('2001:2::/48'),
2260 IPv6Network('2001:db8::/32'),
2261 IPv6Network('2001:10::/28'),
2262 IPv6Network('fc00::/7'),
2263 IPv6Network('fe80::/10'),
2264 ]
2265
2266 _reserved_networks = [
2267 IPv6Network('::/8'), IPv6Network('100::/8'),
2268 IPv6Network('200::/7'), IPv6Network('400::/6'),
2269 IPv6Network('800::/5'), IPv6Network('1000::/4'),
2270 IPv6Network('4000::/3'), IPv6Network('6000::/3'),
2271 IPv6Network('8000::/3'), IPv6Network('A000::/3'),
2272 IPv6Network('C000::/3'), IPv6Network('E000::/4'),
2273 IPv6Network('F000::/5'), IPv6Network('F800::/6'),
2274 IPv6Network('FE00::/9'),
2275 ]
2276
2277 _sitelocal_network = IPv6Network('fec0::/10')
2278
2279
2280IPv6Address._constants = _IPv6Constants