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