blob: 28b7b6159a62ef3e4fc15958cfcdf0bc25634c71 [file] [log] [blame]
xf.li86118912025-03-19 20:07:27 -07001# 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@functools.total_ordering
564class _BaseAddress(_IPAddressBase):
565
566 """A generic IP object.
567
568 This IP class contains the version independent methods which are
569 used by single IP addresses.
570 """
571
572 __slots__ = ()
573
574 def __int__(self):
575 return self._ip
576
577 def __eq__(self, other):
578 try:
579 return (self._ip == other._ip
580 and self._version == other._version)
581 except AttributeError:
582 return NotImplemented
583
584 def __lt__(self, other):
585 if not isinstance(other, _BaseAddress):
586 return NotImplemented
587 if self._version != other._version:
588 raise TypeError('%s and %s are not of the same version' % (
589 self, other))
590 if self._ip != other._ip:
591 return self._ip < other._ip
592 return False
593
594 # Shorthand for Integer addition and subtraction. This is not
595 # meant to ever support addition/subtraction of addresses.
596 def __add__(self, other):
597 if not isinstance(other, int):
598 return NotImplemented
599 return self.__class__(int(self) + other)
600
601 def __sub__(self, other):
602 if not isinstance(other, int):
603 return NotImplemented
604 return self.__class__(int(self) - other)
605
606 def __repr__(self):
607 return '%s(%r)' % (self.__class__.__name__, str(self))
608
609 def __str__(self):
610 return str(self._string_from_ip_int(self._ip))
611
612 def __hash__(self):
613 return hash(hex(int(self._ip)))
614
615 def _get_address_key(self):
616 return (self._version, self)
617
618 def __reduce__(self):
619 return self.__class__, (self._ip,)
620
621
622@functools.total_ordering
623class _BaseNetwork(_IPAddressBase):
624 """A generic IP network object.
625
626 This IP class contains the version independent methods which are
627 used by networks.
628 """
629
630 def __repr__(self):
631 return '%s(%r)' % (self.__class__.__name__, str(self))
632
633 def __str__(self):
634 return '%s/%d' % (self.network_address, self.prefixlen)
635
636 def hosts(self):
637 """Generate Iterator over usable hosts in a network.
638
639 This is like __iter__ except it doesn't return the network
640 or broadcast addresses.
641
642 """
643 network = int(self.network_address)
644 broadcast = int(self.broadcast_address)
645 for x in range(network + 1, broadcast):
646 yield self._address_class(x)
647
648 def __iter__(self):
649 network = int(self.network_address)
650 broadcast = int(self.broadcast_address)
651 for x in range(network, broadcast + 1):
652 yield self._address_class(x)
653
654 def __getitem__(self, n):
655 network = int(self.network_address)
656 broadcast = int(self.broadcast_address)
657 if n >= 0:
658 if network + n > broadcast:
659 raise IndexError('address out of range')
660 return self._address_class(network + n)
661 else:
662 n += 1
663 if broadcast + n < network:
664 raise IndexError('address out of range')
665 return self._address_class(broadcast + n)
666
667 def __lt__(self, other):
668 if not isinstance(other, _BaseNetwork):
669 return NotImplemented
670 if self._version != other._version:
671 raise TypeError('%s and %s are not of the same version' % (
672 self, other))
673 if self.network_address != other.network_address:
674 return self.network_address < other.network_address
675 if self.netmask != other.netmask:
676 return self.netmask < other.netmask
677 return False
678
679 def __eq__(self, other):
680 try:
681 return (self._version == other._version and
682 self.network_address == other.network_address and
683 int(self.netmask) == int(other.netmask))
684 except AttributeError:
685 return NotImplemented
686
687 def __hash__(self):
688 return hash(int(self.network_address) ^ int(self.netmask))
689
690 def __contains__(self, other):
691 # always false if one is v4 and the other is v6.
692 if self._version != other._version:
693 return False
694 # dealing with another network.
695 if isinstance(other, _BaseNetwork):
696 return False
697 # dealing with another address
698 else:
699 # address
700 return other._ip & self.netmask._ip == self.network_address._ip
701
702 def overlaps(self, other):
703 """Tell if self is partly contained in other."""
704 return self.network_address in other or (
705 self.broadcast_address in other or (
706 other.network_address in self or (
707 other.broadcast_address in self)))
708
709 @functools.cached_property
710 def broadcast_address(self):
711 return self._address_class(int(self.network_address) |
712 int(self.hostmask))
713
714 @functools.cached_property
715 def hostmask(self):
716 return self._address_class(int(self.netmask) ^ self._ALL_ONES)
717
718 @property
719 def with_prefixlen(self):
720 return '%s/%d' % (self.network_address, self._prefixlen)
721
722 @property
723 def with_netmask(self):
724 return '%s/%s' % (self.network_address, self.netmask)
725
726 @property
727 def with_hostmask(self):
728 return '%s/%s' % (self.network_address, self.hostmask)
729
730 @property
731 def num_addresses(self):
732 """Number of hosts in the current subnet."""
733 return int(self.broadcast_address) - int(self.network_address) + 1
734
735 @property
736 def _address_class(self):
737 # Returning bare address objects (rather than interfaces) allows for
738 # more consistent behaviour across the network address, broadcast
739 # address and individual host addresses.
740 msg = '%200s has no associated address class' % (type(self),)
741 raise NotImplementedError(msg)
742
743 @property
744 def prefixlen(self):
745 return self._prefixlen
746
747 def address_exclude(self, other):
748 """Remove an address from a larger block.
749
750 For example:
751
752 addr1 = ip_network('192.0.2.0/28')
753 addr2 = ip_network('192.0.2.1/32')
754 list(addr1.address_exclude(addr2)) =
755 [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'),
756 IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')]
757
758 or IPv6:
759
760 addr1 = ip_network('2001:db8::1/32')
761 addr2 = ip_network('2001:db8::1/128')
762 list(addr1.address_exclude(addr2)) =
763 [ip_network('2001:db8::1/128'),
764 ip_network('2001:db8::2/127'),
765 ip_network('2001:db8::4/126'),
766 ip_network('2001:db8::8/125'),
767 ...
768 ip_network('2001:db8:8000::/33')]
769
770 Args:
771 other: An IPv4Network or IPv6Network object of the same type.
772
773 Returns:
774 An iterator of the IPv(4|6)Network objects which is self
775 minus other.
776
777 Raises:
778 TypeError: If self and other are of differing address
779 versions, or if other is not a network object.
780 ValueError: If other is not completely contained by self.
781
782 """
783 if not self._version == other._version:
784 raise TypeError("%s and %s are not of the same version" % (
785 self, other))
786
787 if not isinstance(other, _BaseNetwork):
788 raise TypeError("%s is not a network object" % other)
789
790 if not other.subnet_of(self):
791 raise ValueError('%s not contained in %s' % (other, self))
792 if other == self:
793 return
794
795 # Make sure we're comparing the network of other.
796 other = other.__class__('%s/%s' % (other.network_address,
797 other.prefixlen))
798
799 s1, s2 = self.subnets()
800 while s1 != other and s2 != other:
801 if other.subnet_of(s1):
802 yield s2
803 s1, s2 = s1.subnets()
804 elif other.subnet_of(s2):
805 yield s1
806 s1, s2 = s2.subnets()
807 else:
808 # If we got here, there's a bug somewhere.
809 raise AssertionError('Error performing exclusion: '
810 's1: %s s2: %s other: %s' %
811 (s1, s2, other))
812 if s1 == other:
813 yield s2
814 elif s2 == other:
815 yield s1
816 else:
817 # If we got here, there's a bug somewhere.
818 raise AssertionError('Error performing exclusion: '
819 's1: %s s2: %s other: %s' %
820 (s1, s2, other))
821
822 def compare_networks(self, other):
823 """Compare two IP objects.
824
825 This is only concerned about the comparison of the integer
826 representation of the network addresses. This means that the
827 host bits aren't considered at all in this method. If you want
828 to compare host bits, you can easily enough do a
829 'HostA._ip < HostB._ip'
830
831 Args:
832 other: An IP object.
833
834 Returns:
835 If the IP versions of self and other are the same, returns:
836
837 -1 if self < other:
838 eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25')
839 IPv6Network('2001:db8::1000/124') <
840 IPv6Network('2001:db8::2000/124')
841 0 if self == other
842 eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24')
843 IPv6Network('2001:db8::1000/124') ==
844 IPv6Network('2001:db8::1000/124')
845 1 if self > other
846 eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25')
847 IPv6Network('2001:db8::2000/124') >
848 IPv6Network('2001:db8::1000/124')
849
850 Raises:
851 TypeError if the IP versions are different.
852
853 """
854 # does this need to raise a ValueError?
855 if self._version != other._version:
856 raise TypeError('%s and %s are not of the same type' % (
857 self, other))
858 # self._version == other._version below here:
859 if self.network_address < other.network_address:
860 return -1
861 if self.network_address > other.network_address:
862 return 1
863 # self.network_address == other.network_address below here:
864 if self.netmask < other.netmask:
865 return -1
866 if self.netmask > other.netmask:
867 return 1
868 return 0
869
870 def _get_networks_key(self):
871 """Network-only key function.
872
873 Returns an object that identifies this address' network and
874 netmask. This function is a suitable "key" argument for sorted()
875 and list.sort().
876
877 """
878 return (self._version, self.network_address, self.netmask)
879
880 def subnets(self, prefixlen_diff=1, new_prefix=None):
881 """The subnets which join to make the current subnet.
882
883 In the case that self contains only one IP
884 (self._prefixlen == 32 for IPv4 or self._prefixlen == 128
885 for IPv6), yield an iterator with just ourself.
886
887 Args:
888 prefixlen_diff: An integer, the amount the prefix length
889 should be increased by. This should not be set if
890 new_prefix is also set.
891 new_prefix: The desired new prefix length. This must be a
892 larger number (smaller prefix) than the existing prefix.
893 This should not be set if prefixlen_diff is also set.
894
895 Returns:
896 An iterator of IPv(4|6) objects.
897
898 Raises:
899 ValueError: The prefixlen_diff is too small or too large.
900 OR
901 prefixlen_diff and new_prefix are both set or new_prefix
902 is a smaller number than the current prefix (smaller
903 number means a larger network)
904
905 """
906 if self._prefixlen == self._max_prefixlen:
907 yield self
908 return
909
910 if new_prefix is not None:
911 if new_prefix < self._prefixlen:
912 raise ValueError('new prefix must be longer')
913 if prefixlen_diff != 1:
914 raise ValueError('cannot set prefixlen_diff and new_prefix')
915 prefixlen_diff = new_prefix - self._prefixlen
916
917 if prefixlen_diff < 0:
918 raise ValueError('prefix length diff must be > 0')
919 new_prefixlen = self._prefixlen + prefixlen_diff
920
921 if new_prefixlen > self._max_prefixlen:
922 raise ValueError(
923 'prefix length diff %d is invalid for netblock %s' % (
924 new_prefixlen, self))
925
926 start = int(self.network_address)
927 end = int(self.broadcast_address) + 1
928 step = (int(self.hostmask) + 1) >> prefixlen_diff
929 for new_addr in range(start, end, step):
930 current = self.__class__((new_addr, new_prefixlen))
931 yield current
932
933 def supernet(self, prefixlen_diff=1, new_prefix=None):
934 """The supernet containing the current network.
935
936 Args:
937 prefixlen_diff: An integer, the amount the prefix length of
938 the network should be decreased by. For example, given a
939 /24 network and a prefixlen_diff of 3, a supernet with a
940 /21 netmask is returned.
941
942 Returns:
943 An IPv4 network object.
944
945 Raises:
946 ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have
947 a negative prefix length.
948 OR
949 If prefixlen_diff and new_prefix are both set or new_prefix is a
950 larger number than the current prefix (larger number means a
951 smaller network)
952
953 """
954 if self._prefixlen == 0:
955 return self
956
957 if new_prefix is not None:
958 if new_prefix > self._prefixlen:
959 raise ValueError('new prefix must be shorter')
960 if prefixlen_diff != 1:
961 raise ValueError('cannot set prefixlen_diff and new_prefix')
962 prefixlen_diff = self._prefixlen - new_prefix
963
964 new_prefixlen = self.prefixlen - prefixlen_diff
965 if new_prefixlen < 0:
966 raise ValueError(
967 'current prefixlen is %d, cannot have a prefixlen_diff of %d' %
968 (self.prefixlen, prefixlen_diff))
969 return self.__class__((
970 int(self.network_address) & (int(self.netmask) << prefixlen_diff),
971 new_prefixlen
972 ))
973
974 @property
975 def is_multicast(self):
976 """Test if the address is reserved for multicast use.
977
978 Returns:
979 A boolean, True if the address is a multicast address.
980 See RFC 2373 2.7 for details.
981
982 """
983 return (self.network_address.is_multicast and
984 self.broadcast_address.is_multicast)
985
986 @staticmethod
987 def _is_subnet_of(a, b):
988 try:
989 # Always false if one is v4 and the other is v6.
990 if a._version != b._version:
991 raise TypeError(f"{a} and {b} are not of the same version")
992 return (b.network_address <= a.network_address and
993 b.broadcast_address >= a.broadcast_address)
994 except AttributeError:
995 raise TypeError(f"Unable to test subnet containment "
996 f"between {a} and {b}")
997
998 def subnet_of(self, other):
999 """Return True if this network is a subnet of other."""
1000 return self._is_subnet_of(self, other)
1001
1002 def supernet_of(self, other):
1003 """Return True if this network is a supernet of other."""
1004 return self._is_subnet_of(other, self)
1005
1006 @property
1007 def is_reserved(self):
1008 """Test if the address is otherwise IETF reserved.
1009
1010 Returns:
1011 A boolean, True if the address is within one of the
1012 reserved IPv6 Network ranges.
1013
1014 """
1015 return (self.network_address.is_reserved and
1016 self.broadcast_address.is_reserved)
1017
1018 @property
1019 def is_link_local(self):
1020 """Test if the address is reserved for link-local.
1021
1022 Returns:
1023 A boolean, True if the address is reserved per RFC 4291.
1024
1025 """
1026 return (self.network_address.is_link_local and
1027 self.broadcast_address.is_link_local)
1028
1029 @property
1030 def is_private(self):
1031 """Test if this address is allocated for private networks.
1032
1033 Returns:
1034 A boolean, True if the address is reserved per
1035 iana-ipv4-special-registry or iana-ipv6-special-registry.
1036
1037 """
1038 return (self.network_address.is_private and
1039 self.broadcast_address.is_private)
1040
1041 @property
1042 def is_global(self):
1043 """Test if this address is allocated for public networks.
1044
1045 Returns:
1046 A boolean, True if the address is not reserved per
1047 iana-ipv4-special-registry or iana-ipv6-special-registry.
1048
1049 """
1050 return not self.is_private
1051
1052 @property
1053 def is_unspecified(self):
1054 """Test if the address is unspecified.
1055
1056 Returns:
1057 A boolean, True if this is the unspecified address as defined in
1058 RFC 2373 2.5.2.
1059
1060 """
1061 return (self.network_address.is_unspecified and
1062 self.broadcast_address.is_unspecified)
1063
1064 @property
1065 def is_loopback(self):
1066 """Test if the address is a loopback address.
1067
1068 Returns:
1069 A boolean, True if the address is a loopback address as defined in
1070 RFC 2373 2.5.3.
1071
1072 """
1073 return (self.network_address.is_loopback and
1074 self.broadcast_address.is_loopback)
1075
1076
1077class _BaseV4:
1078
1079 """Base IPv4 object.
1080
1081 The following methods are used by IPv4 objects in both single IP
1082 addresses and networks.
1083
1084 """
1085
1086 __slots__ = ()
1087 _version = 4
1088 # Equivalent to 255.255.255.255 or 32 bits of 1's.
1089 _ALL_ONES = (2**IPV4LENGTH) - 1
1090
1091 _max_prefixlen = IPV4LENGTH
1092 # There are only a handful of valid v4 netmasks, so we cache them all
1093 # when constructed (see _make_netmask()).
1094 _netmask_cache = {}
1095
1096 def _explode_shorthand_ip_string(self):
1097 return str(self)
1098
1099 @classmethod
1100 def _make_netmask(cls, arg):
1101 """Make a (netmask, prefix_len) tuple from the given argument.
1102
1103 Argument can be:
1104 - an integer (the prefix length)
1105 - a string representing the prefix length (e.g. "24")
1106 - a string representing the prefix netmask (e.g. "255.255.255.0")
1107 """
1108 if arg not in cls._netmask_cache:
1109 if isinstance(arg, int):
1110 prefixlen = arg
1111 if not (0 <= prefixlen <= cls._max_prefixlen):
1112 cls._report_invalid_netmask(prefixlen)
1113 else:
1114 try:
1115 # Check for a netmask in prefix length form
1116 prefixlen = cls._prefix_from_prefix_string(arg)
1117 except NetmaskValueError:
1118 # Check for a netmask or hostmask in dotted-quad form.
1119 # This may raise NetmaskValueError.
1120 prefixlen = cls._prefix_from_ip_string(arg)
1121 netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen))
1122 cls._netmask_cache[arg] = netmask, prefixlen
1123 return cls._netmask_cache[arg]
1124
1125 @classmethod
1126 def _ip_int_from_string(cls, ip_str):
1127 """Turn the given IP string into an integer for comparison.
1128
1129 Args:
1130 ip_str: A string, the IP ip_str.
1131
1132 Returns:
1133 The IP ip_str as an integer.
1134
1135 Raises:
1136 AddressValueError: if ip_str isn't a valid IPv4 Address.
1137
1138 """
1139 if not ip_str:
1140 raise AddressValueError('Address cannot be empty')
1141
1142 octets = ip_str.split('.')
1143 if len(octets) != 4:
1144 raise AddressValueError("Expected 4 octets in %r" % ip_str)
1145
1146 try:
1147 return int.from_bytes(map(cls._parse_octet, octets), 'big')
1148 except ValueError as exc:
1149 raise AddressValueError("%s in %r" % (exc, ip_str)) from None
1150
1151 @classmethod
1152 def _parse_octet(cls, octet_str):
1153 """Convert a decimal octet into an integer.
1154
1155 Args:
1156 octet_str: A string, the number to parse.
1157
1158 Returns:
1159 The octet as an integer.
1160
1161 Raises:
1162 ValueError: if the octet isn't strictly a decimal from [0..255].
1163
1164 """
1165 if not octet_str:
1166 raise ValueError("Empty octet not permitted")
1167 # Whitelist the characters, since int() allows a lot of bizarre stuff.
1168 if not (octet_str.isascii() and octet_str.isdigit()):
1169 msg = "Only decimal digits permitted in %r"
1170 raise ValueError(msg % octet_str)
1171 # We do the length check second, since the invalid character error
1172 # is likely to be more informative for the user
1173 if len(octet_str) > 3:
1174 msg = "At most 3 characters permitted in %r"
1175 raise ValueError(msg % octet_str)
1176 # Convert to integer (we know digits are legal)
1177 octet_int = int(octet_str, 10)
1178 if octet_int > 255:
1179 raise ValueError("Octet %d (> 255) not permitted" % octet_int)
1180 return octet_int
1181
1182 @classmethod
1183 def _string_from_ip_int(cls, ip_int):
1184 """Turns a 32-bit integer into dotted decimal notation.
1185
1186 Args:
1187 ip_int: An integer, the IP address.
1188
1189 Returns:
1190 The IP address as a string in dotted decimal notation.
1191
1192 """
1193 return '.'.join(map(str, ip_int.to_bytes(4, 'big')))
1194
1195 def _reverse_pointer(self):
1196 """Return the reverse DNS pointer name for the IPv4 address.
1197
1198 This implements the method described in RFC1035 3.5.
1199
1200 """
1201 reverse_octets = str(self).split('.')[::-1]
1202 return '.'.join(reverse_octets) + '.in-addr.arpa'
1203
1204 @property
1205 def max_prefixlen(self):
1206 return self._max_prefixlen
1207
1208 @property
1209 def version(self):
1210 return self._version
1211
1212
1213class IPv4Address(_BaseV4, _BaseAddress):
1214
1215 """Represent and manipulate single IPv4 Addresses."""
1216
1217 __slots__ = ('_ip', '__weakref__')
1218
1219 def __init__(self, address):
1220
1221 """
1222 Args:
1223 address: A string or integer representing the IP
1224
1225 Additionally, an integer can be passed, so
1226 IPv4Address('192.0.2.1') == IPv4Address(3221225985).
1227 or, more generally
1228 IPv4Address(int(IPv4Address('192.0.2.1'))) ==
1229 IPv4Address('192.0.2.1')
1230
1231 Raises:
1232 AddressValueError: If ipaddress isn't a valid IPv4 address.
1233
1234 """
1235 # Efficient constructor from integer.
1236 if isinstance(address, int):
1237 self._check_int_address(address)
1238 self._ip = address
1239 return
1240
1241 # Constructing from a packed address
1242 if isinstance(address, bytes):
1243 self._check_packed_address(address, 4)
1244 self._ip = int.from_bytes(address, 'big')
1245 return
1246
1247 # Assume input argument to be string or any object representation
1248 # which converts into a formatted IP string.
1249 addr_str = str(address)
1250 if '/' in addr_str:
1251 raise AddressValueError("Unexpected '/' in %r" % address)
1252 self._ip = self._ip_int_from_string(addr_str)
1253
1254 @property
1255 def packed(self):
1256 """The binary representation of this address."""
1257 return v4_int_to_packed(self._ip)
1258
1259 @property
1260 def is_reserved(self):
1261 """Test if the address is otherwise IETF reserved.
1262
1263 Returns:
1264 A boolean, True if the address is within the
1265 reserved IPv4 Network range.
1266
1267 """
1268 return self in self._constants._reserved_network
1269
1270 @property
1271 @functools.lru_cache()
1272 def is_private(self):
1273 """Test if this address is allocated for private networks.
1274
1275 Returns:
1276 A boolean, True if the address is reserved per
1277 iana-ipv4-special-registry.
1278
1279 """
1280 return any(self in net for net in self._constants._private_networks)
1281
1282 @property
1283 @functools.lru_cache()
1284 def is_global(self):
1285 return self not in self._constants._public_network and not self.is_private
1286
1287 @property
1288 def is_multicast(self):
1289 """Test if the address is reserved for multicast use.
1290
1291 Returns:
1292 A boolean, True if the address is multicast.
1293 See RFC 3171 for details.
1294
1295 """
1296 return self in self._constants._multicast_network
1297
1298 @property
1299 def is_unspecified(self):
1300 """Test if the address is unspecified.
1301
1302 Returns:
1303 A boolean, True if this is the unspecified address as defined in
1304 RFC 5735 3.
1305
1306 """
1307 return self == self._constants._unspecified_address
1308
1309 @property
1310 def is_loopback(self):
1311 """Test if the address is a loopback address.
1312
1313 Returns:
1314 A boolean, True if the address is a loopback per RFC 3330.
1315
1316 """
1317 return self in self._constants._loopback_network
1318
1319 @property
1320 def is_link_local(self):
1321 """Test if the address is reserved for link-local.
1322
1323 Returns:
1324 A boolean, True if the address is link-local per RFC 3927.
1325
1326 """
1327 return self in self._constants._linklocal_network
1328
1329
1330class IPv4Interface(IPv4Address):
1331
1332 def __init__(self, address):
1333 addr, mask = self._split_addr_prefix(address)
1334
1335 IPv4Address.__init__(self, addr)
1336 self.network = IPv4Network((addr, mask), strict=False)
1337 self.netmask = self.network.netmask
1338 self._prefixlen = self.network._prefixlen
1339
1340 @functools.cached_property
1341 def hostmask(self):
1342 return self.network.hostmask
1343
1344 def __str__(self):
1345 return '%s/%d' % (self._string_from_ip_int(self._ip),
1346 self._prefixlen)
1347
1348 def __eq__(self, other):
1349 address_equal = IPv4Address.__eq__(self, other)
1350 if not address_equal or address_equal is NotImplemented:
1351 return address_equal
1352 try:
1353 return self.network == other.network
1354 except AttributeError:
1355 # An interface with an associated network is NOT the
1356 # same as an unassociated address. That's why the hash
1357 # takes the extra info into account.
1358 return False
1359
1360 def __lt__(self, other):
1361 address_less = IPv4Address.__lt__(self, other)
1362 if address_less is NotImplemented:
1363 return NotImplemented
1364 try:
1365 return (self.network < other.network or
1366 self.network == other.network and address_less)
1367 except AttributeError:
1368 # We *do* allow addresses and interfaces to be sorted. The
1369 # unassociated address is considered less than all interfaces.
1370 return False
1371
1372 def __hash__(self):
1373 return hash((self._ip, self._prefixlen, int(self.network.network_address)))
1374
1375 __reduce__ = _IPAddressBase.__reduce__
1376
1377 @property
1378 def ip(self):
1379 return IPv4Address(self._ip)
1380
1381 @property
1382 def with_prefixlen(self):
1383 return '%s/%s' % (self._string_from_ip_int(self._ip),
1384 self._prefixlen)
1385
1386 @property
1387 def with_netmask(self):
1388 return '%s/%s' % (self._string_from_ip_int(self._ip),
1389 self.netmask)
1390
1391 @property
1392 def with_hostmask(self):
1393 return '%s/%s' % (self._string_from_ip_int(self._ip),
1394 self.hostmask)
1395
1396
1397class IPv4Network(_BaseV4, _BaseNetwork):
1398
1399 """This class represents and manipulates 32-bit IPv4 network + addresses..
1400
1401 Attributes: [examples for IPv4Network('192.0.2.0/27')]
1402 .network_address: IPv4Address('192.0.2.0')
1403 .hostmask: IPv4Address('0.0.0.31')
1404 .broadcast_address: IPv4Address('192.0.2.32')
1405 .netmask: IPv4Address('255.255.255.224')
1406 .prefixlen: 27
1407
1408 """
1409 # Class to use when creating address objects
1410 _address_class = IPv4Address
1411
1412 def __init__(self, address, strict=True):
1413 """Instantiate a new IPv4 network object.
1414
1415 Args:
1416 address: A string or integer representing the IP [& network].
1417 '192.0.2.0/24'
1418 '192.0.2.0/255.255.255.0'
1419 '192.0.2.0/0.0.0.255'
1420 are all functionally the same in IPv4. Similarly,
1421 '192.0.2.1'
1422 '192.0.2.1/255.255.255.255'
1423 '192.0.2.1/32'
1424 are also functionally equivalent. That is to say, failing to
1425 provide a subnetmask will create an object with a mask of /32.
1426
1427 If the mask (portion after the / in the argument) is given in
1428 dotted quad form, it is treated as a netmask if it starts with a
1429 non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it
1430 starts with a zero field (e.g. 0.255.255.255 == /8), with the
1431 single exception of an all-zero mask which is treated as a
1432 netmask == /0. If no mask is given, a default of /32 is used.
1433
1434 Additionally, an integer can be passed, so
1435 IPv4Network('192.0.2.1') == IPv4Network(3221225985)
1436 or, more generally
1437 IPv4Interface(int(IPv4Interface('192.0.2.1'))) ==
1438 IPv4Interface('192.0.2.1')
1439
1440 Raises:
1441 AddressValueError: If ipaddress isn't a valid IPv4 address.
1442 NetmaskValueError: If the netmask isn't valid for
1443 an IPv4 address.
1444 ValueError: If strict is True and a network address is not
1445 supplied.
1446 """
1447 addr, mask = self._split_addr_prefix(address)
1448
1449 self.network_address = IPv4Address(addr)
1450 self.netmask, self._prefixlen = self._make_netmask(mask)
1451 packed = int(self.network_address)
1452 if packed & int(self.netmask) != packed:
1453 if strict:
1454 raise ValueError('%s has host bits set' % self)
1455 else:
1456 self.network_address = IPv4Address(packed &
1457 int(self.netmask))
1458
1459 if self._prefixlen == (self._max_prefixlen - 1):
1460 self.hosts = self.__iter__
1461 elif self._prefixlen == (self._max_prefixlen):
1462 self.hosts = lambda: [IPv4Address(addr)]
1463
1464 @property
1465 @functools.lru_cache()
1466 def is_global(self):
1467 """Test if this address is allocated for public networks.
1468
1469 Returns:
1470 A boolean, True if the address is not reserved per
1471 iana-ipv4-special-registry.
1472
1473 """
1474 return (not (self.network_address in IPv4Network('100.64.0.0/10') and
1475 self.broadcast_address in IPv4Network('100.64.0.0/10')) and
1476 not self.is_private)
1477
1478
1479class _IPv4Constants:
1480 _linklocal_network = IPv4Network('169.254.0.0/16')
1481
1482 _loopback_network = IPv4Network('127.0.0.0/8')
1483
1484 _multicast_network = IPv4Network('224.0.0.0/4')
1485
1486 _public_network = IPv4Network('100.64.0.0/10')
1487
1488 _private_networks = [
1489 IPv4Network('0.0.0.0/8'),
1490 IPv4Network('10.0.0.0/8'),
1491 IPv4Network('127.0.0.0/8'),
1492 IPv4Network('169.254.0.0/16'),
1493 IPv4Network('172.16.0.0/12'),
1494 IPv4Network('192.0.0.0/29'),
1495 IPv4Network('192.0.0.170/31'),
1496 IPv4Network('192.0.2.0/24'),
1497 IPv4Network('192.168.0.0/16'),
1498 IPv4Network('198.18.0.0/15'),
1499 IPv4Network('198.51.100.0/24'),
1500 IPv4Network('203.0.113.0/24'),
1501 IPv4Network('240.0.0.0/4'),
1502 IPv4Network('255.255.255.255/32'),
1503 ]
1504
1505 _reserved_network = IPv4Network('240.0.0.0/4')
1506
1507 _unspecified_address = IPv4Address('0.0.0.0')
1508
1509
1510IPv4Address._constants = _IPv4Constants
1511
1512
1513class _BaseV6:
1514
1515 """Base IPv6 object.
1516
1517 The following methods are used by IPv6 objects in both single IP
1518 addresses and networks.
1519
1520 """
1521
1522 __slots__ = ()
1523 _version = 6
1524 _ALL_ONES = (2**IPV6LENGTH) - 1
1525 _HEXTET_COUNT = 8
1526 _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef')
1527 _max_prefixlen = IPV6LENGTH
1528
1529 # There are only a bunch of valid v6 netmasks, so we cache them all
1530 # when constructed (see _make_netmask()).
1531 _netmask_cache = {}
1532
1533 @classmethod
1534 def _make_netmask(cls, arg):
1535 """Make a (netmask, prefix_len) tuple from the given argument.
1536
1537 Argument can be:
1538 - an integer (the prefix length)
1539 - a string representing the prefix length (e.g. "24")
1540 - a string representing the prefix netmask (e.g. "255.255.255.0")
1541 """
1542 if arg not in cls._netmask_cache:
1543 if isinstance(arg, int):
1544 prefixlen = arg
1545 if not (0 <= prefixlen <= cls._max_prefixlen):
1546 cls._report_invalid_netmask(prefixlen)
1547 else:
1548 prefixlen = cls._prefix_from_prefix_string(arg)
1549 netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen))
1550 cls._netmask_cache[arg] = netmask, prefixlen
1551 return cls._netmask_cache[arg]
1552
1553 @classmethod
1554 def _ip_int_from_string(cls, ip_str):
1555 """Turn an IPv6 ip_str into an integer.
1556
1557 Args:
1558 ip_str: A string, the IPv6 ip_str.
1559
1560 Returns:
1561 An int, the IPv6 address
1562
1563 Raises:
1564 AddressValueError: if ip_str isn't a valid IPv6 Address.
1565
1566 """
1567 if not ip_str:
1568 raise AddressValueError('Address cannot be empty')
1569
1570 parts = ip_str.split(':')
1571
1572 # An IPv6 address needs at least 2 colons (3 parts).
1573 _min_parts = 3
1574 if len(parts) < _min_parts:
1575 msg = "At least %d parts expected in %r" % (_min_parts, ip_str)
1576 raise AddressValueError(msg)
1577
1578 # If the address has an IPv4-style suffix, convert it to hexadecimal.
1579 if '.' in parts[-1]:
1580 try:
1581 ipv4_int = IPv4Address(parts.pop())._ip
1582 except AddressValueError as exc:
1583 raise AddressValueError("%s in %r" % (exc, ip_str)) from None
1584 parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF))
1585 parts.append('%x' % (ipv4_int & 0xFFFF))
1586
1587 # An IPv6 address can't have more than 8 colons (9 parts).
1588 # The extra colon comes from using the "::" notation for a single
1589 # leading or trailing zero part.
1590 _max_parts = cls._HEXTET_COUNT + 1
1591 if len(parts) > _max_parts:
1592 msg = "At most %d colons permitted in %r" % (_max_parts-1, ip_str)
1593 raise AddressValueError(msg)
1594
1595 # Disregarding the endpoints, find '::' with nothing in between.
1596 # This indicates that a run of zeroes has been skipped.
1597 skip_index = None
1598 for i in range(1, len(parts) - 1):
1599 if not parts[i]:
1600 if skip_index is not None:
1601 # Can't have more than one '::'
1602 msg = "At most one '::' permitted in %r" % ip_str
1603 raise AddressValueError(msg)
1604 skip_index = i
1605
1606 # parts_hi is the number of parts to copy from above/before the '::'
1607 # parts_lo is the number of parts to copy from below/after the '::'
1608 if skip_index is not None:
1609 # If we found a '::', then check if it also covers the endpoints.
1610 parts_hi = skip_index
1611 parts_lo = len(parts) - skip_index - 1
1612 if not parts[0]:
1613 parts_hi -= 1
1614 if parts_hi:
1615 msg = "Leading ':' only permitted as part of '::' in %r"
1616 raise AddressValueError(msg % ip_str) # ^: requires ^::
1617 if not parts[-1]:
1618 parts_lo -= 1
1619 if parts_lo:
1620 msg = "Trailing ':' only permitted as part of '::' in %r"
1621 raise AddressValueError(msg % ip_str) # :$ requires ::$
1622 parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo)
1623 if parts_skipped < 1:
1624 msg = "Expected at most %d other parts with '::' in %r"
1625 raise AddressValueError(msg % (cls._HEXTET_COUNT-1, ip_str))
1626 else:
1627 # Otherwise, allocate the entire address to parts_hi. The
1628 # endpoints could still be empty, but _parse_hextet() will check
1629 # for that.
1630 if len(parts) != cls._HEXTET_COUNT:
1631 msg = "Exactly %d parts expected without '::' in %r"
1632 raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str))
1633 if not parts[0]:
1634 msg = "Leading ':' only permitted as part of '::' in %r"
1635 raise AddressValueError(msg % ip_str) # ^: requires ^::
1636 if not parts[-1]:
1637 msg = "Trailing ':' only permitted as part of '::' in %r"
1638 raise AddressValueError(msg % ip_str) # :$ requires ::$
1639 parts_hi = len(parts)
1640 parts_lo = 0
1641 parts_skipped = 0
1642
1643 try:
1644 # Now, parse the hextets into a 128-bit integer.
1645 ip_int = 0
1646 for i in range(parts_hi):
1647 ip_int <<= 16
1648 ip_int |= cls._parse_hextet(parts[i])
1649 ip_int <<= 16 * parts_skipped
1650 for i in range(-parts_lo, 0):
1651 ip_int <<= 16
1652 ip_int |= cls._parse_hextet(parts[i])
1653 return ip_int
1654 except ValueError as exc:
1655 raise AddressValueError("%s in %r" % (exc, ip_str)) from None
1656
1657 @classmethod
1658 def _parse_hextet(cls, hextet_str):
1659 """Convert an IPv6 hextet string into an integer.
1660
1661 Args:
1662 hextet_str: A string, the number to parse.
1663
1664 Returns:
1665 The hextet as an integer.
1666
1667 Raises:
1668 ValueError: if the input isn't strictly a hex number from
1669 [0..FFFF].
1670
1671 """
1672 # Whitelist the characters, since int() allows a lot of bizarre stuff.
1673 if not cls._HEX_DIGITS.issuperset(hextet_str):
1674 raise ValueError("Only hex digits permitted in %r" % hextet_str)
1675 # We do the length check second, since the invalid character error
1676 # is likely to be more informative for the user
1677 if len(hextet_str) > 4:
1678 msg = "At most 4 characters permitted in %r"
1679 raise ValueError(msg % hextet_str)
1680 # Length check means we can skip checking the integer value
1681 return int(hextet_str, 16)
1682
1683 @classmethod
1684 def _compress_hextets(cls, hextets):
1685 """Compresses a list of hextets.
1686
1687 Compresses a list of strings, replacing the longest continuous
1688 sequence of "0" in the list with "" and adding empty strings at
1689 the beginning or at the end of the string such that subsequently
1690 calling ":".join(hextets) will produce the compressed version of
1691 the IPv6 address.
1692
1693 Args:
1694 hextets: A list of strings, the hextets to compress.
1695
1696 Returns:
1697 A list of strings.
1698
1699 """
1700 best_doublecolon_start = -1
1701 best_doublecolon_len = 0
1702 doublecolon_start = -1
1703 doublecolon_len = 0
1704 for index, hextet in enumerate(hextets):
1705 if hextet == '0':
1706 doublecolon_len += 1
1707 if doublecolon_start == -1:
1708 # Start of a sequence of zeros.
1709 doublecolon_start = index
1710 if doublecolon_len > best_doublecolon_len:
1711 # This is the longest sequence of zeros so far.
1712 best_doublecolon_len = doublecolon_len
1713 best_doublecolon_start = doublecolon_start
1714 else:
1715 doublecolon_len = 0
1716 doublecolon_start = -1
1717
1718 if best_doublecolon_len > 1:
1719 best_doublecolon_end = (best_doublecolon_start +
1720 best_doublecolon_len)
1721 # For zeros at the end of the address.
1722 if best_doublecolon_end == len(hextets):
1723 hextets += ['']
1724 hextets[best_doublecolon_start:best_doublecolon_end] = ['']
1725 # For zeros at the beginning of the address.
1726 if best_doublecolon_start == 0:
1727 hextets = [''] + hextets
1728
1729 return hextets
1730
1731 @classmethod
1732 def _string_from_ip_int(cls, ip_int=None):
1733 """Turns a 128-bit integer into hexadecimal notation.
1734
1735 Args:
1736 ip_int: An integer, the IP address.
1737
1738 Returns:
1739 A string, the hexadecimal representation of the address.
1740
1741 Raises:
1742 ValueError: The address is bigger than 128 bits of all ones.
1743
1744 """
1745 if ip_int is None:
1746 ip_int = int(cls._ip)
1747
1748 if ip_int > cls._ALL_ONES:
1749 raise ValueError('IPv6 address is too large')
1750
1751 hex_str = '%032x' % ip_int
1752 hextets = ['%x' % int(hex_str[x:x+4], 16) for x in range(0, 32, 4)]
1753
1754 hextets = cls._compress_hextets(hextets)
1755 return ':'.join(hextets)
1756
1757 def _explode_shorthand_ip_string(self):
1758 """Expand a shortened IPv6 address.
1759
1760 Args:
1761 ip_str: A string, the IPv6 address.
1762
1763 Returns:
1764 A string, the expanded IPv6 address.
1765
1766 """
1767 if isinstance(self, IPv6Network):
1768 ip_str = str(self.network_address)
1769 elif isinstance(self, IPv6Interface):
1770 ip_str = str(self.ip)
1771 else:
1772 ip_str = str(self)
1773
1774 ip_int = self._ip_int_from_string(ip_str)
1775 hex_str = '%032x' % ip_int
1776 parts = [hex_str[x:x+4] for x in range(0, 32, 4)]
1777 if isinstance(self, (_BaseNetwork, IPv6Interface)):
1778 return '%s/%d' % (':'.join(parts), self._prefixlen)
1779 return ':'.join(parts)
1780
1781 def _reverse_pointer(self):
1782 """Return the reverse DNS pointer name for the IPv6 address.
1783
1784 This implements the method described in RFC3596 2.5.
1785
1786 """
1787 reverse_chars = self.exploded[::-1].replace(':', '')
1788 return '.'.join(reverse_chars) + '.ip6.arpa'
1789
1790 @property
1791 def max_prefixlen(self):
1792 return self._max_prefixlen
1793
1794 @property
1795 def version(self):
1796 return self._version
1797
1798
1799class IPv6Address(_BaseV6, _BaseAddress):
1800
1801 """Represent and manipulate single IPv6 Addresses."""
1802
1803 __slots__ = ('_ip', '__weakref__')
1804
1805 def __init__(self, address):
1806 """Instantiate a new IPv6 address object.
1807
1808 Args:
1809 address: A string or integer representing the IP
1810
1811 Additionally, an integer can be passed, so
1812 IPv6Address('2001:db8::') ==
1813 IPv6Address(42540766411282592856903984951653826560)
1814 or, more generally
1815 IPv6Address(int(IPv6Address('2001:db8::'))) ==
1816 IPv6Address('2001:db8::')
1817
1818 Raises:
1819 AddressValueError: If address isn't a valid IPv6 address.
1820
1821 """
1822 # Efficient constructor from integer.
1823 if isinstance(address, int):
1824 self._check_int_address(address)
1825 self._ip = address
1826 return
1827
1828 # Constructing from a packed address
1829 if isinstance(address, bytes):
1830 self._check_packed_address(address, 16)
1831 self._ip = int.from_bytes(address, 'big')
1832 return
1833
1834 # Assume input argument to be string or any object representation
1835 # which converts into a formatted IP string.
1836 addr_str = str(address)
1837 if '/' in addr_str:
1838 raise AddressValueError("Unexpected '/' in %r" % address)
1839 self._ip = self._ip_int_from_string(addr_str)
1840
1841 @property
1842 def packed(self):
1843 """The binary representation of this address."""
1844 return v6_int_to_packed(self._ip)
1845
1846 @property
1847 def is_multicast(self):
1848 """Test if the address is reserved for multicast use.
1849
1850 Returns:
1851 A boolean, True if the address is a multicast address.
1852 See RFC 2373 2.7 for details.
1853
1854 """
1855 return self in self._constants._multicast_network
1856
1857 @property
1858 def is_reserved(self):
1859 """Test if the address is otherwise IETF reserved.
1860
1861 Returns:
1862 A boolean, True if the address is within one of the
1863 reserved IPv6 Network ranges.
1864
1865 """
1866 return any(self in x for x in self._constants._reserved_networks)
1867
1868 @property
1869 def is_link_local(self):
1870 """Test if the address is reserved for link-local.
1871
1872 Returns:
1873 A boolean, True if the address is reserved per RFC 4291.
1874
1875 """
1876 return self in self._constants._linklocal_network
1877
1878 @property
1879 def is_site_local(self):
1880 """Test if the address is reserved for site-local.
1881
1882 Note that the site-local address space has been deprecated by RFC 3879.
1883 Use is_private to test if this address is in the space of unique local
1884 addresses as defined by RFC 4193.
1885
1886 Returns:
1887 A boolean, True if the address is reserved per RFC 3513 2.5.6.
1888
1889 """
1890 return self in self._constants._sitelocal_network
1891
1892 @property
1893 @functools.lru_cache()
1894 def is_private(self):
1895 """Test if this address is allocated for private networks.
1896
1897 Returns:
1898 A boolean, True if the address is reserved per
1899 iana-ipv6-special-registry.
1900
1901 """
1902 return any(self in net for net in self._constants._private_networks)
1903
1904 @property
1905 def is_global(self):
1906 """Test if this address is allocated for public networks.
1907
1908 Returns:
1909 A boolean, true if the address is not reserved per
1910 iana-ipv6-special-registry.
1911
1912 """
1913 return not self.is_private
1914
1915 @property
1916 def is_unspecified(self):
1917 """Test if the address is unspecified.
1918
1919 Returns:
1920 A boolean, True if this is the unspecified address as defined in
1921 RFC 2373 2.5.2.
1922
1923 """
1924 return self._ip == 0
1925
1926 @property
1927 def is_loopback(self):
1928 """Test if the address is a loopback address.
1929
1930 Returns:
1931 A boolean, True if the address is a loopback address as defined in
1932 RFC 2373 2.5.3.
1933
1934 """
1935 return self._ip == 1
1936
1937 @property
1938 def ipv4_mapped(self):
1939 """Return the IPv4 mapped address.
1940
1941 Returns:
1942 If the IPv6 address is a v4 mapped address, return the
1943 IPv4 mapped address. Return None otherwise.
1944
1945 """
1946 if (self._ip >> 32) != 0xFFFF:
1947 return None
1948 return IPv4Address(self._ip & 0xFFFFFFFF)
1949
1950 @property
1951 def teredo(self):
1952 """Tuple of embedded teredo IPs.
1953
1954 Returns:
1955 Tuple of the (server, client) IPs or None if the address
1956 doesn't appear to be a teredo address (doesn't start with
1957 2001::/32)
1958
1959 """
1960 if (self._ip >> 96) != 0x20010000:
1961 return None
1962 return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF),
1963 IPv4Address(~self._ip & 0xFFFFFFFF))
1964
1965 @property
1966 def sixtofour(self):
1967 """Return the IPv4 6to4 embedded address.
1968
1969 Returns:
1970 The IPv4 6to4-embedded address if present or None if the
1971 address doesn't appear to contain a 6to4 embedded address.
1972
1973 """
1974 if (self._ip >> 112) != 0x2002:
1975 return None
1976 return IPv4Address((self._ip >> 80) & 0xFFFFFFFF)
1977
1978
1979class IPv6Interface(IPv6Address):
1980
1981 def __init__(self, address):
1982 addr, mask = self._split_addr_prefix(address)
1983
1984 IPv6Address.__init__(self, addr)
1985 self.network = IPv6Network((addr, mask), strict=False)
1986 self.netmask = self.network.netmask
1987 self._prefixlen = self.network._prefixlen
1988
1989 @functools.cached_property
1990 def hostmask(self):
1991 return self.network.hostmask
1992
1993 def __str__(self):
1994 return '%s/%d' % (self._string_from_ip_int(self._ip),
1995 self._prefixlen)
1996
1997 def __eq__(self, other):
1998 address_equal = IPv6Address.__eq__(self, other)
1999 if not address_equal or address_equal is NotImplemented:
2000 return address_equal
2001 try:
2002 return self.network == other.network
2003 except AttributeError:
2004 # An interface with an associated network is NOT the
2005 # same as an unassociated address. That's why the hash
2006 # takes the extra info into account.
2007 return False
2008
2009 def __lt__(self, other):
2010 address_less = IPv6Address.__lt__(self, other)
2011 if address_less is NotImplemented:
2012 return NotImplemented
2013 try:
2014 return (self.network < other.network or
2015 self.network == other.network and address_less)
2016 except AttributeError:
2017 # We *do* allow addresses and interfaces to be sorted. The
2018 # unassociated address is considered less than all interfaces.
2019 return False
2020
2021 def __hash__(self):
2022 return hash((self._ip, self._prefixlen, int(self.network.network_address)))
2023
2024 __reduce__ = _IPAddressBase.__reduce__
2025
2026 @property
2027 def ip(self):
2028 return IPv6Address(self._ip)
2029
2030 @property
2031 def with_prefixlen(self):
2032 return '%s/%s' % (self._string_from_ip_int(self._ip),
2033 self._prefixlen)
2034
2035 @property
2036 def with_netmask(self):
2037 return '%s/%s' % (self._string_from_ip_int(self._ip),
2038 self.netmask)
2039
2040 @property
2041 def with_hostmask(self):
2042 return '%s/%s' % (self._string_from_ip_int(self._ip),
2043 self.hostmask)
2044
2045 @property
2046 def is_unspecified(self):
2047 return self._ip == 0 and self.network.is_unspecified
2048
2049 @property
2050 def is_loopback(self):
2051 return self._ip == 1 and self.network.is_loopback
2052
2053
2054class IPv6Network(_BaseV6, _BaseNetwork):
2055
2056 """This class represents and manipulates 128-bit IPv6 networks.
2057
2058 Attributes: [examples for IPv6('2001:db8::1000/124')]
2059 .network_address: IPv6Address('2001:db8::1000')
2060 .hostmask: IPv6Address('::f')
2061 .broadcast_address: IPv6Address('2001:db8::100f')
2062 .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0')
2063 .prefixlen: 124
2064
2065 """
2066
2067 # Class to use when creating address objects
2068 _address_class = IPv6Address
2069
2070 def __init__(self, address, strict=True):
2071 """Instantiate a new IPv6 Network object.
2072
2073 Args:
2074 address: A string or integer representing the IPv6 network or the
2075 IP and prefix/netmask.
2076 '2001:db8::/128'
2077 '2001:db8:0000:0000:0000:0000:0000:0000/128'
2078 '2001:db8::'
2079 are all functionally the same in IPv6. That is to say,
2080 failing to provide a subnetmask will create an object with
2081 a mask of /128.
2082
2083 Additionally, an integer can be passed, so
2084 IPv6Network('2001:db8::') ==
2085 IPv6Network(42540766411282592856903984951653826560)
2086 or, more generally
2087 IPv6Network(int(IPv6Network('2001:db8::'))) ==
2088 IPv6Network('2001:db8::')
2089
2090 strict: A boolean. If true, ensure that we have been passed
2091 A true network address, eg, 2001:db8::1000/124 and not an
2092 IP address on a network, eg, 2001:db8::1/124.
2093
2094 Raises:
2095 AddressValueError: If address isn't a valid IPv6 address.
2096 NetmaskValueError: If the netmask isn't valid for
2097 an IPv6 address.
2098 ValueError: If strict was True and a network address was not
2099 supplied.
2100 """
2101 addr, mask = self._split_addr_prefix(address)
2102
2103 self.network_address = IPv6Address(addr)
2104 self.netmask, self._prefixlen = self._make_netmask(mask)
2105 packed = int(self.network_address)
2106 if packed & int(self.netmask) != packed:
2107 if strict:
2108 raise ValueError('%s has host bits set' % self)
2109 else:
2110 self.network_address = IPv6Address(packed &
2111 int(self.netmask))
2112
2113 if self._prefixlen == (self._max_prefixlen - 1):
2114 self.hosts = self.__iter__
2115 elif self._prefixlen == self._max_prefixlen:
2116 self.hosts = lambda: [IPv6Address(addr)]
2117
2118 def hosts(self):
2119 """Generate Iterator over usable hosts in a network.
2120
2121 This is like __iter__ except it doesn't return the
2122 Subnet-Router anycast address.
2123
2124 """
2125 network = int(self.network_address)
2126 broadcast = int(self.broadcast_address)
2127 for x in range(network + 1, broadcast + 1):
2128 yield self._address_class(x)
2129
2130 @property
2131 def is_site_local(self):
2132 """Test if the address is reserved for site-local.
2133
2134 Note that the site-local address space has been deprecated by RFC 3879.
2135 Use is_private to test if this address is in the space of unique local
2136 addresses as defined by RFC 4193.
2137
2138 Returns:
2139 A boolean, True if the address is reserved per RFC 3513 2.5.6.
2140
2141 """
2142 return (self.network_address.is_site_local and
2143 self.broadcast_address.is_site_local)
2144
2145
2146class _IPv6Constants:
2147
2148 _linklocal_network = IPv6Network('fe80::/10')
2149
2150 _multicast_network = IPv6Network('ff00::/8')
2151
2152 _private_networks = [
2153 IPv6Network('::1/128'),
2154 IPv6Network('::/128'),
2155 IPv6Network('::ffff:0:0/96'),
2156 IPv6Network('100::/64'),
2157 IPv6Network('2001::/23'),
2158 IPv6Network('2001:2::/48'),
2159 IPv6Network('2001:db8::/32'),
2160 IPv6Network('2001:10::/28'),
2161 IPv6Network('fc00::/7'),
2162 IPv6Network('fe80::/10'),
2163 ]
2164
2165 _reserved_networks = [
2166 IPv6Network('::/8'), IPv6Network('100::/8'),
2167 IPv6Network('200::/7'), IPv6Network('400::/6'),
2168 IPv6Network('800::/5'), IPv6Network('1000::/4'),
2169 IPv6Network('4000::/3'), IPv6Network('6000::/3'),
2170 IPv6Network('8000::/3'), IPv6Network('A000::/3'),
2171 IPv6Network('C000::/3'), IPv6Network('E000::/4'),
2172 IPv6Network('F000::/5'), IPv6Network('F800::/6'),
2173 IPv6Network('FE00::/9'),
2174 ]
2175
2176 _sitelocal_network = IPv6Network('fec0::/10')
2177
2178
2179IPv6Address._constants = _IPv6Constants