3 # Copyright 2007 Google Inc.
4 # Licensed to PSF under a Contributor Agreement.
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
10 # http://www.apache.org/licenses/LICENSE-2.0
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15 # implied. See the License for the specific language governing
16 # permissions and limitations under the License.
18 """A fast, lightweight IPv4/IPv6 manipulation library in Python.
20 This library is used to create/poke/manipulate IPv4 and IPv6 addresses
28 __version__ = "2.1.11"
35 class AddressValueError(ValueError):
36 """A Value Error related to the address."""
39 class NetmaskValueError(ValueError):
40 """A Value Error related to the netmask."""
43 def IPAddress(address, version=None):
44 """Take an IP string/int and return an object of the correct type.
47 address: A string or integer, the IP address. Either IPv4 or
48 IPv6 addresses may be supplied; integers less than 2**32 will
49 be considered to be IPv4 by default.
50 version: An Integer, 4 or 6. If set, don't try to automatically
51 determine what the IP address type is. important for things
52 like IPAddress(1), which could be IPv4, '0.0.0.1', or IPv6,
56 An IPv4Address or IPv6Address object.
59 ValueError: if the string passed isn't either a v4 or a v6
65 return IPv4Address(address)
67 return IPv6Address(address)
70 return IPv4Address(address)
71 except (AddressValueError, NetmaskValueError):
75 return IPv6Address(address)
76 except (AddressValueError, NetmaskValueError):
79 raise ValueError("%r does not appear to be an IPv4 or IPv6 address" % address)
82 def IPNetwork(address, version=None, strict=False):
83 """Take an IP string/int and return an object of the correct type.
86 address: A string or integer, the IP address. Either IPv4 or
87 IPv6 addresses may be supplied; integers less than 2**32 will
88 be considered to be IPv4 by default.
89 version: An Integer, if set, don't try to automatically
90 determine what the IP address type is. important for things
91 like IPNetwork(1), which could be IPv4, '0.0.0.1/32', or IPv6,
95 An IPv4Network or IPv6Network object.
98 ValueError: if the string passed isn't either a v4 or a v6
99 address. Or if a strict network was requested and a strict
100 network wasn't given.
105 return IPv4Network(address, strict)
107 return IPv6Network(address, strict)
110 return IPv4Network(address, strict)
111 except (AddressValueError, NetmaskValueError):
115 return IPv6Network(address, strict)
116 except (AddressValueError, NetmaskValueError):
119 raise ValueError("%r does not appear to be an IPv4 or IPv6 network" % address)
122 def v4_int_to_packed(address):
123 """The binary representation of this address.
126 address: An integer representation of an IPv4 IP address.
129 The binary representation of this address.
132 ValueError: If the integer is too large to be an IPv4 IP
135 if address > _BaseV4._ALL_ONES:
136 raise ValueError("Address too large for IPv4")
137 return Bytes(struct.pack("!I", address))
140 def v6_int_to_packed(address):
141 """The binary representation of this address.
144 address: An integer representation of an IPv6 IP address.
147 The binary representation of this address.
149 return Bytes(struct.pack("!QQ", address >> 64, address & (2**64 - 1)))
152 def _find_address_range(addresses):
153 """Find a sequence of addresses.
156 addresses: a list of IPv4 or IPv6 addresses.
159 A tuple containing the first and last IP addresses in the sequence.
162 first = last = addresses[0]
163 for ip in addresses[1:]:
164 if ip._ip == last._ip + 1:
171 def _get_prefix_length(number1, number2, bits):
172 """Get the number of leading bits that are same for two numbers.
176 number2: another integer.
177 bits: the maximum number of bits to compare.
180 The number of leading bits that are the same for two numbers.
183 for i in range(bits):
184 if number1 >> i == number2 >> i:
189 def _count_righthand_zero_bits(number, bits):
190 """Count the number of zero bits on the right hand side.
194 bits: maximum number of bits to count.
197 The number of zero bits on the right hand side of the number.
202 for i in range(bits):
203 if (number >> i) % 2:
207 def summarize_address_range(first, last):
208 """Summarize a network range given the first and last IP addresses.
211 >>> summarize_address_range(IPv4Address('1.1.1.0'),
212 IPv4Address('1.1.1.130'))
213 [IPv4Network('1.1.1.0/25'), IPv4Network('1.1.1.128/31'),
214 IPv4Network('1.1.1.130/32')]
217 first: the first IPv4Address or IPv6Address in the range.
218 last: the last IPv4Address or IPv6Address in the range.
221 The address range collapsed to a list of IPv4Network's or
226 If the first and last objects are not IP addresses.
227 If the first and last objects are not the same version.
229 If the last object is not greater than the first.
230 If the version is not 4 or 6.
233 if not (isinstance(first, _BaseIP) and isinstance(last, _BaseIP)):
234 raise TypeError("first and last must be IP addresses, not networks")
235 if first.version != last.version:
237 "%s and %s are not of the same version" % (str(first), str(last))
240 raise ValueError("last IP address must be greater than first")
244 if first.version == 4:
246 elif first.version == 6:
249 raise ValueError("unknown IP version")
251 ip_bits = first._max_prefixlen
252 first_int = first._ip
254 while first_int <= last_int:
255 nbits = _count_righthand_zero_bits(first_int, ip_bits)
258 addend = 2**nbits - 1
259 current = first_int + addend
261 if current <= last_int:
263 prefix = _get_prefix_length(first_int, current, ip_bits)
264 net = ip("%s/%d" % (str(first), prefix))
266 if current == ip._ALL_ONES:
268 first_int = current + 1
269 first = IPAddress(first_int, version=first._version)
273 def _collapse_address_list_recursive(addresses):
274 """Loops through the addresses, collapsing concurrent netblocks.
278 ip1 = IPv4Network('1.1.0.0/24')
279 ip2 = IPv4Network('1.1.1.0/24')
280 ip3 = IPv4Network('1.1.2.0/24')
281 ip4 = IPv4Network('1.1.3.0/24')
282 ip5 = IPv4Network('1.1.4.0/24')
283 ip6 = IPv4Network('1.1.0.1/22')
285 _collapse_address_list_recursive([ip1, ip2, ip3, ip4, ip5, ip6]) ->
286 [IPv4Network('1.1.0.0/22'), IPv4Network('1.1.4.0/24')]
288 This shouldn't be called directly; it is called via
289 collapse_address_list([]).
292 addresses: A list of IPv4Network's or IPv6Network's
295 A list of IPv4Network's or IPv6Network's depending on what we were
302 for cur_addr in addresses:
304 ret_array.append(cur_addr)
306 if cur_addr in ret_array[-1]:
308 elif cur_addr == ret_array[-1].supernet().subnet()[1]:
309 ret_array.append(ret_array.pop().supernet())
312 ret_array.append(cur_addr)
315 return _collapse_address_list_recursive(ret_array)
320 def collapse_address_list(addresses):
321 """Collapse a list of IP objects.
324 collapse_address_list([IPv4('1.1.0.0/24'), IPv4('1.1.1.0/24')]) ->
328 addresses: A list of IPv4Network or IPv6Network objects.
331 A list of IPv4Network or IPv6Network objects depending on what we
335 TypeError: If passed a list of mixed version objects.
343 # split IP addresses and networks
345 if isinstance(ip, _BaseIP):
346 if ips and ips[-1]._version != ip._version:
348 "%s and %s are not of the same version" % (str(ip), str(ips[-1]))
351 elif ip._prefixlen == ip._max_prefixlen:
352 if ips and ips[-1]._version != ip._version:
354 "%s and %s are not of the same version" % (str(ip), str(ips[-1]))
358 if nets and nets[-1]._version != ip._version:
360 "%s and %s are not of the same version" % (str(ip), str(nets[-1]))
365 ips = sorted(set(ips))
366 nets = sorted(set(nets))
369 (first, last) = _find_address_range(ips[i:])
370 i = ips.index(last) + 1
371 addrs.extend(summarize_address_range(first, last))
373 return _collapse_address_list_recursive(
374 sorted(addrs + nets, key=_BaseNet._get_networks_key)
378 # backwards compatibility
379 CollapseAddrList = collapse_address_list
381 # We need to distinguish between the string and packed-bytes representations
382 # of an IP address. For example, b'0::1' is the IPv4 address 48.58.58.49,
383 # while '0::1' is an IPv6 address.
385 # In Python 3, the native 'bytes' type already provides this functionality,
386 # so we use it directly. For earlier implementations where bytes is not a
387 # distinct type, we create a subclass of str to serve as a tag.
389 # Usage example (Python 2):
390 # ip = ipaddr.IPAddress(ipaddr.Bytes('xxxx'))
392 # Usage example (Python 3):
393 # ip = ipaddr.IPAddress(b'xxxx')
396 raise TypeError("bytes is not a distinct type")
398 except (NameError, TypeError):
402 return "Bytes(%s)" % str.__repr__(self)
405 def get_mixed_type_key(obj):
406 """Return a key suitable for sorting between networks and addresses.
408 Address and Network objects are not sortable by default; they're
409 fundamentally different so the expression
411 IPv4Address('1.1.1.1') <= IPv4Network('1.1.1.1/24')
413 doesn't make any sense. There are some times however, where you may wish
414 to have ipaddr sort these for you anyway. If you need to do this, you
415 can use this function as the key= argument to sorted().
418 obj: either a Network or Address object.
423 if isinstance(obj, _BaseNet):
424 return obj._get_networks_key()
425 elif isinstance(obj, _BaseIP):
426 return obj._get_address_key()
427 return NotImplemented
430 class _IPAddrBase(object):
432 """The mother class."""
445 """Return the longhand version of the IP address as a string."""
446 return self._explode_shorthand_ip_string()
449 def compressed(self):
450 """Return the shorthand version of the IP address as a string."""
454 class _BaseIP(_IPAddrBase):
456 """A generic IP object.
458 This IP class contains the version independent methods which are
459 used by single IP addresses.
463 def __eq__(self, other):
465 return self._ip == other._ip and self._version == other._version
466 except AttributeError:
467 return NotImplemented
469 def __ne__(self, other):
470 eq = self.__eq__(other)
471 if eq is NotImplemented:
472 return NotImplemented
475 def __le__(self, other):
476 gt = self.__gt__(other)
477 if gt is NotImplemented:
478 return NotImplemented
481 def __ge__(self, other):
482 lt = self.__lt__(other)
483 if lt is NotImplemented:
484 return NotImplemented
487 def __lt__(self, other):
488 if self._version != other._version:
490 "%s and %s are not of the same version" % (str(self), str(other))
492 if not isinstance(other, _BaseIP):
494 "%s and %s are not of the same type" % (str(self), str(other))
496 if self._ip != other._ip:
497 return self._ip < other._ip
500 def __gt__(self, other):
501 if self._version != other._version:
503 "%s and %s are not of the same version" % (str(self), str(other))
505 if not isinstance(other, _BaseIP):
507 "%s and %s are not of the same type" % (str(self), str(other))
509 if self._ip != other._ip:
510 return self._ip > other._ip
513 # Shorthand for Integer addition and subtraction. This is not
514 # meant to ever support addition/subtraction of addresses.
515 def __add__(self, other):
516 if not isinstance(other, int):
517 return NotImplemented
518 return IPAddress(int(self) + other, version=self._version)
520 def __sub__(self, other):
521 if not isinstance(other, int):
522 return NotImplemented
523 return IPAddress(int(self) - other, version=self._version)
526 return "%s(%r)" % (self.__class__.__name__, str(self))
529 return "%s" % self._string_from_ip_int(self._ip)
532 return hash(hex(int(self._ip)))
534 def _get_address_key(self):
535 return (self._version, self)
539 raise NotImplementedError("BaseIP has no version")
542 class _BaseNet(_IPAddrBase):
544 """A generic IP object.
546 This IP class contains the version independent methods which are
551 def __init__(self, address):
555 return "%s(%r)" % (self.__class__.__name__, str(self))
558 """Generate Iterator over usable hosts in a network.
560 This is like __iter__ except it doesn't return the network
561 or broadcast addresses.
564 cur = int(self.network) + 1
565 bcast = int(self.broadcast) - 1
568 yield IPAddress(cur - 1, version=self._version)
571 cur = int(self.network)
572 bcast = int(self.broadcast)
575 yield IPAddress(cur - 1, version=self._version)
577 def __getitem__(self, n):
578 network = int(self.network)
579 broadcast = int(self.broadcast)
581 if network + n > broadcast:
583 return IPAddress(network + n, version=self._version)
586 if broadcast + n < network:
588 return IPAddress(broadcast + n, version=self._version)
590 def __lt__(self, other):
591 if self._version != other._version:
593 "%s and %s are not of the same version" % (str(self), str(other))
595 if not isinstance(other, _BaseNet):
597 "%s and %s are not of the same type" % (str(self), str(other))
599 if self.network != other.network:
600 return self.network < other.network
601 if self.netmask != other.netmask:
602 return self.netmask < other.netmask
605 def __gt__(self, other):
606 if self._version != other._version:
608 "%s and %s are not of the same version" % (str(self), str(other))
610 if not isinstance(other, _BaseNet):
612 "%s and %s are not of the same type" % (str(self), str(other))
614 if self.network != other.network:
615 return self.network > other.network
616 if self.netmask != other.netmask:
617 return self.netmask > other.netmask
620 def __le__(self, other):
621 gt = self.__gt__(other)
622 if gt is NotImplemented:
623 return NotImplemented
626 def __ge__(self, other):
627 lt = self.__lt__(other)
628 if lt is NotImplemented:
629 return NotImplemented
632 def __eq__(self, other):
635 self._version == other._version
636 and self.network == other.network
637 and int(self.netmask) == int(other.netmask)
639 except AttributeError:
640 if isinstance(other, _BaseIP):
641 return self._version == other._version and self._ip == other._ip
643 def __ne__(self, other):
644 eq = self.__eq__(other)
645 if eq is NotImplemented:
646 return NotImplemented
650 return "%s/%s" % (str(self.ip), str(self._prefixlen))
653 return hash(int(self.network) ^ int(self.netmask))
655 def __contains__(self, other):
656 # always false if one is v4 and the other is v6.
657 if self._version != other._version:
659 # dealing with another network.
660 if isinstance(other, _BaseNet):
661 return self.network <= other.network and self.broadcast >= other.broadcast
662 # dealing with another address
664 return int(self.network) <= int(other._ip) <= int(self.broadcast)
666 def overlaps(self, other):
667 """Tell if self is partly contained in other."""
669 self.network in other
670 or self.broadcast in other
671 or (other.network in self or other.broadcast in self)
676 x = self._cache.get("network")
678 x = IPAddress(self._ip & int(self.netmask), version=self._version)
679 self._cache["network"] = x
684 x = self._cache.get("broadcast")
686 x = IPAddress(self._ip | int(self.hostmask), version=self._version)
687 self._cache["broadcast"] = x
692 x = self._cache.get("hostmask")
694 x = IPAddress(int(self.netmask) ^ self._ALL_ONES, version=self._version)
695 self._cache["hostmask"] = x
699 def with_prefixlen(self):
700 return "%s/%d" % (str(self.ip), self._prefixlen)
703 def with_netmask(self):
704 return "%s/%s" % (str(self.ip), str(self.netmask))
707 def with_hostmask(self):
708 return "%s/%s" % (str(self.ip), str(self.hostmask))
712 """Number of hosts in the current subnet."""
713 return int(self.broadcast) - int(self.network) + 1
717 raise NotImplementedError("BaseNet has no version")
721 return self._prefixlen
723 def address_exclude(self, other):
724 """Remove an address from a larger block.
728 addr1 = IPNetwork('10.1.1.0/24')
729 addr2 = IPNetwork('10.1.1.0/26')
730 addr1.address_exclude(addr2) =
731 [IPNetwork('10.1.1.64/26'), IPNetwork('10.1.1.128/25')]
735 addr1 = IPNetwork('::1/32')
736 addr2 = IPNetwork('::1/128')
737 addr1.address_exclude(addr2) = [IPNetwork('::0/128'),
738 IPNetwork('::2/127'),
739 IPNetwork('::4/126'),
740 IPNetwork('::8/125'),
742 IPNetwork('0:0:8000::/33')]
745 other: An IPvXNetwork object of the same type.
748 A sorted list of IPvXNetwork objects addresses which is self
752 TypeError: If self and other are of difffering address
753 versions, or if other is not a network object.
754 ValueError: If other is not completely contained by self.
757 if not self._version == other._version:
759 "%s and %s are not of the same version" % (str(self), str(other))
762 if not isinstance(other, _BaseNet):
763 raise TypeError("%s is not a network object" % str(other))
765 if other not in self:
766 raise ValueError("%s not contained in %s" % (str(other), str(self)))
772 # Make sure we're comparing the network of other.
774 "%s/%s" % (str(other.network), str(other.prefixlen)), version=other._version
777 s1, s2 = self.subnet()
778 while s1 != other and s2 != other:
786 # If we got here, there's a bug somewhere.
789 ), "Error performing exclusion: " "s1: %s s2: %s other: %s" % (
799 # If we got here, there's a bug somewhere.
800 assert False, "Error performing exclusion: " "s1: %s s2: %s other: %s" % (
806 return sorted(ret_addrs, key=_BaseNet._get_networks_key)
808 def compare_networks(self, other):
809 """Compare two IP objects.
811 This is only concerned about the comparison of the integer
812 representation of the network addresses. This means that the
813 host bits aren't considered at all in this method. If you want
814 to compare host bits, you can easily enough do a
815 'HostA._ip < HostB._ip'
821 If the IP versions of self and other are the same, returns:
824 eg: IPv4('1.1.1.0/24') < IPv4('1.1.2.0/24')
825 IPv6('1080::200C:417A') < IPv6('1080::200B:417B')
827 eg: IPv4('1.1.1.1/24') == IPv4('1.1.1.2/24')
828 IPv6('1080::200C:417A/96') == IPv6('1080::200C:417B/96')
830 eg: IPv4('1.1.1.0/24') > IPv4('1.1.0.0/24')
831 IPv6('1080::1:200C:417A/112') >
832 IPv6('1080::0:200C:417A/112')
834 If the IP versions of self and other are different, returns:
836 -1 if self._version < other._version
837 eg: IPv4('10.0.0.1/24') < IPv6('::1/128')
838 1 if self._version > other._version
839 eg: IPv6('::1/128') > IPv4('255.255.255.0/24')
842 if self._version < other._version:
844 if self._version > other._version:
846 # self._version == other._version below here:
847 if self.network < other.network:
849 if self.network > other.network:
851 # self.network == other.network below here:
852 if self.netmask < other.netmask:
854 if self.netmask > other.netmask:
856 # self.network == other.network and self.netmask == other.netmask
859 def _get_networks_key(self):
860 """Network-only key function.
862 Returns an object that identifies this address' network and
863 netmask. This function is a suitable "key" argument for sorted()
867 return (self._version, self.network, self.netmask)
869 def _ip_int_from_prefix(self, prefixlen):
870 """Turn the prefix length into a bitwise netmask.
873 prefixlen: An integer, the prefix length.
879 return self._ALL_ONES ^ (self._ALL_ONES >> prefixlen)
881 def _prefix_from_ip_int(self, ip_int):
882 """Return prefix length from a bitwise netmask.
885 ip_int: An integer, the netmask in expanded bitwise format.
888 An integer, the prefix length.
891 NetmaskValueError: If the input is not a valid netmask.
894 prefixlen = self._max_prefixlen
901 if ip_int == (1 << prefixlen) - 1:
904 raise NetmaskValueError("Bit pattern does not match /1*0*/")
906 def _prefix_from_prefix_string(self, prefixlen_str):
907 """Turn a prefix length string into an integer.
910 prefixlen_str: A decimal string containing the prefix length.
913 The prefix length as an integer.
916 NetmaskValueError: If the input is malformed or out of range.
920 if not _BaseV4._DECIMAL_DIGITS.issuperset(prefixlen_str):
922 prefixlen = int(prefixlen_str)
923 if not (0 <= prefixlen <= self._max_prefixlen):
926 raise NetmaskValueError("%s is not a valid prefix length" % prefixlen_str)
929 def _prefix_from_ip_string(self, ip_str):
930 """Turn a netmask/hostmask string into a prefix length.
933 ip_str: A netmask or hostmask, formatted as an IP address.
936 The prefix length as an integer.
939 NetmaskValueError: If the input is not a netmask or hostmask.
942 # Parse the netmask/hostmask like an IP address.
944 ip_int = self._ip_int_from_string(ip_str)
945 except AddressValueError:
946 raise NetmaskValueError("%s is not a valid netmask" % ip_str)
948 # Try matching a netmask (this would be /1*0*/ as a bitwise regexp).
949 # Note that the two ambiguous cases (all-ones and all-zeroes) are
950 # treated as netmasks.
952 return self._prefix_from_ip_int(ip_int)
953 except NetmaskValueError:
956 # Invert the bits, and try matching a /0+1+/ hostmask instead.
957 ip_int ^= self._ALL_ONES
959 return self._prefix_from_ip_int(ip_int)
960 except NetmaskValueError:
961 raise NetmaskValueError("%s is not a valid netmask" % ip_str)
963 def iter_subnets(self, prefixlen_diff=1, new_prefix=None):
964 """The subnets which join to make the current subnet.
966 In the case that self contains only one IP
967 (self._prefixlen == 32 for IPv4 or self._prefixlen == 128
968 for IPv6), return a list with just ourself.
971 prefixlen_diff: An integer, the amount the prefix length
972 should be increased by. This should not be set if
973 new_prefix is also set.
974 new_prefix: The desired new prefix length. This must be a
975 larger number (smaller prefix) than the existing prefix.
976 This should not be set if prefixlen_diff is also set.
979 An iterator of IPv(4|6) objects.
982 ValueError: The prefixlen_diff is too small or too large.
984 prefixlen_diff and new_prefix are both set or new_prefix
985 is a smaller number than the current prefix (smaller
986 number means a larger network)
989 if self._prefixlen == self._max_prefixlen:
993 if new_prefix is not None:
994 if new_prefix < self._prefixlen:
995 raise ValueError("new prefix must be longer")
996 if prefixlen_diff != 1:
997 raise ValueError("cannot set prefixlen_diff and new_prefix")
998 prefixlen_diff = new_prefix - self._prefixlen
1000 if prefixlen_diff < 0:
1001 raise ValueError("prefix length diff must be > 0")
1002 new_prefixlen = self._prefixlen + prefixlen_diff
1004 if new_prefixlen > self._max_prefixlen:
1006 "prefix length diff %d is invalid for netblock %s"
1007 % (new_prefixlen, str(self))
1011 "%s/%s" % (str(self.network), str(self._prefixlen + prefixlen_diff)),
1012 version=self._version,
1018 broadcast = current.broadcast
1019 if broadcast == self.broadcast:
1021 new_addr = IPAddress(int(broadcast) + 1, version=self._version)
1022 current = IPNetwork(
1023 "%s/%s" % (str(new_addr), str(new_prefixlen)), version=self._version
1029 """Return the network object with the host bits masked out."""
1031 "%s/%d" % (self.network, self._prefixlen), version=self._version
1034 def subnet(self, prefixlen_diff=1, new_prefix=None):
1035 """Return a list of subnets, rather than an iterator."""
1036 return list(self.iter_subnets(prefixlen_diff, new_prefix))
1038 def supernet(self, prefixlen_diff=1, new_prefix=None):
1039 """The supernet containing the current network.
1042 prefixlen_diff: An integer, the amount the prefix length of
1043 the network should be decreased by. For example, given a
1044 /24 network and a prefixlen_diff of 3, a supernet with a
1045 /21 netmask is returned.
1048 An IPv4 network object.
1051 ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have a
1052 negative prefix length.
1054 If prefixlen_diff and new_prefix are both set or new_prefix is a
1055 larger number than the current prefix (larger number means a
1059 if self._prefixlen == 0:
1062 if new_prefix is not None:
1063 if new_prefix > self._prefixlen:
1064 raise ValueError("new prefix must be shorter")
1065 if prefixlen_diff != 1:
1066 raise ValueError("cannot set prefixlen_diff and new_prefix")
1067 prefixlen_diff = self._prefixlen - new_prefix
1069 if self.prefixlen - prefixlen_diff < 0:
1071 "current prefixlen is %d, cannot have a prefixlen_diff of %d"
1072 % (self.prefixlen, prefixlen_diff)
1075 "%s/%s" % (str(self.network), str(self.prefixlen - prefixlen_diff)),
1076 version=self._version,
1079 # backwards compatibility
1082 AddressExclude = address_exclude
1083 CompareNetworks = compare_networks
1084 Contains = __contains__
1087 class _BaseV4(object):
1089 """Base IPv4 object.
1091 The following methods are used by IPv4 objects in both single IP
1092 addresses and networks.
1096 # Equivalent to 255.255.255.255 or 32 bits of 1's.
1097 _ALL_ONES = (2**IPV4LENGTH) - 1
1098 _DECIMAL_DIGITS = frozenset("0123456789")
1100 def __init__(self, address):
1102 self._max_prefixlen = IPV4LENGTH
1104 def _explode_shorthand_ip_string(self):
1107 def _ip_int_from_string(self, ip_str):
1108 """Turn the given IP string into an integer for comparison.
1111 ip_str: A string, the IP ip_str.
1114 The IP ip_str as an integer.
1117 AddressValueError: if ip_str isn't a valid IPv4 Address.
1120 octets = ip_str.split(".")
1121 if len(octets) != 4:
1122 raise AddressValueError(ip_str)
1127 packed_ip = (packed_ip << 8) | self._parse_octet(oc)
1129 raise AddressValueError(ip_str)
1132 def _parse_octet(self, octet_str):
1133 """Convert a decimal octet into an integer.
1136 octet_str: A string, the number to parse.
1139 The octet as an integer.
1142 ValueError: if the octet isn't strictly a decimal from [0..255].
1145 # Whitelist the characters, since int() allows a lot of bizarre stuff.
1146 if not self._DECIMAL_DIGITS.issuperset(octet_str):
1148 octet_int = int(octet_str, 10)
1149 # Disallow leading zeroes, because no clear standard exists on
1150 # whether these should be interpreted as decimal or octal.
1151 if octet_int > 255 or (octet_str[0] == "0" and len(octet_str) > 1):
1155 def _string_from_ip_int(self, ip_int):
1156 """Turns a 32-bit integer into dotted decimal notation.
1159 ip_int: An integer, the IP address.
1162 The IP address as a string in dotted decimal notation.
1167 octets.insert(0, str(ip_int & 0xFF))
1169 return ".".join(octets)
1172 def max_prefixlen(self):
1173 return self._max_prefixlen
1177 """The binary representation of this address."""
1178 return v4_int_to_packed(self._ip)
1182 return self._version
1185 def is_reserved(self):
1186 """Test if the address is otherwise IETF reserved.
1189 A boolean, True if the address is within the
1190 reserved IPv4 Network range.
1193 return self in IPv4Network("240.0.0.0/4")
1196 def is_private(self):
1197 """Test if this address is allocated for private networks.
1200 A boolean, True if the address is reserved per RFC 1918.
1204 self in IPv4Network("10.0.0.0/8")
1205 or self in IPv4Network("172.16.0.0/12")
1206 or self in IPv4Network("192.168.0.0/16")
1210 def is_multicast(self):
1211 """Test if the address is reserved for multicast use.
1214 A boolean, True if the address is multicast.
1215 See RFC 3171 for details.
1218 return self in IPv4Network("224.0.0.0/4")
1221 def is_unspecified(self):
1222 """Test if the address is unspecified.
1225 A boolean, True if this is the unspecified address as defined in
1229 return self in IPv4Network("0.0.0.0")
1232 def is_loopback(self):
1233 """Test if the address is a loopback address.
1236 A boolean, True if the address is a loopback per RFC 3330.
1239 return self in IPv4Network("127.0.0.0/8")
1242 def is_link_local(self):
1243 """Test if the address is reserved for link-local.
1246 A boolean, True if the address is link-local per RFC 3927.
1249 return self in IPv4Network("169.254.0.0/16")
1252 class IPv4Address(_BaseV4, _BaseIP):
1254 """Represent and manipulate single IPv4 Addresses."""
1256 def __init__(self, address):
1259 address: A string or integer representing the IP
1262 Additionally, an integer can be passed, so
1263 IPv4Address('192.168.1.1') == IPv4Address(3232235777).
1265 IPv4Address(int(IPv4Address('192.168.1.1'))) ==
1266 IPv4Address('192.168.1.1')
1269 AddressValueError: If ipaddr isn't a valid IPv4 address.
1272 _BaseV4.__init__(self, address)
1274 # Efficient constructor from integer.
1275 if isinstance(address, int):
1277 if address < 0 or address > self._ALL_ONES:
1278 raise AddressValueError(address)
1281 # Constructing from a packed address
1282 if isinstance(address, Bytes):
1284 (self._ip,) = struct.unpack("!I", address)
1285 except struct.error:
1286 raise AddressValueError(address) # Wrong length.
1289 # Assume input argument to be string or any object representation
1290 # which converts into a formatted IP string.
1291 addr_str = str(address)
1292 self._ip = self._ip_int_from_string(addr_str)
1295 class IPv4Network(_BaseV4, _BaseNet):
1297 """This class represents and manipulates 32-bit IPv4 networks.
1299 Attributes: [examples for IPv4Network('1.2.3.4/27')]
1301 .ip: IPv4Address('1.2.3.4')
1302 .network: IPv4Address('1.2.3.0')
1303 .hostmask: IPv4Address('0.0.0.31')
1304 .broadcast: IPv4Address('1.2.3.31')
1305 .netmask: IPv4Address('255.255.255.224')
1310 def __init__(self, address, strict=False):
1311 """Instantiate a new IPv4 network object.
1314 address: A string or integer representing the IP [& network].
1316 '192.168.1.1/255.255.255.0'
1317 '192.168.1.1/0.0.0.255'
1318 are all functionally the same in IPv4. Similarly,
1320 '192.168.1.1/255.255.255.255'
1322 are also functionaly equivalent. That is to say, failing to
1323 provide a subnetmask will create an object with a mask of /32.
1325 If the mask (portion after the / in the argument) is given in
1326 dotted quad form, it is treated as a netmask if it starts with a
1327 non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it
1328 starts with a zero field (e.g. 0.255.255.255 == /8), with the
1329 single exception of an all-zero mask which is treated as a
1330 netmask == /0. If no mask is given, a default of /32 is used.
1332 Additionally, an integer can be passed, so
1333 IPv4Network('192.168.1.1') == IPv4Network(3232235777).
1335 IPv4Network(int(IPv4Network('192.168.1.1'))) ==
1336 IPv4Network('192.168.1.1')
1338 strict: A boolean. If true, ensure that we have been passed
1339 A true network address, eg, 192.168.1.0/24 and not an
1340 IP address on a network, eg, 192.168.1.1/24.
1343 AddressValueError: If ipaddr isn't a valid IPv4 address.
1344 NetmaskValueError: If the netmask isn't valid for
1346 ValueError: If strict was True and a network address was not
1350 _BaseNet.__init__(self, address)
1351 _BaseV4.__init__(self, address)
1353 # Constructing from an integer or packed bytes.
1354 if isinstance(address, (int, Bytes)):
1355 self.ip = IPv4Address(address)
1356 self._ip = self.ip._ip
1357 self._prefixlen = self._max_prefixlen
1358 self.netmask = IPv4Address(self._ALL_ONES)
1361 # Assume input argument to be string or any object representation
1362 # which converts into a formatted IP prefix string.
1363 addr = str(address).split("/")
1366 raise AddressValueError(address)
1368 self._ip = self._ip_int_from_string(addr[0])
1369 self.ip = IPv4Address(self._ip)
1373 # Check for a netmask in prefix length form.
1374 self._prefixlen = self._prefix_from_prefix_string(addr[1])
1375 except NetmaskValueError:
1376 # Check for a netmask or hostmask in dotted-quad form.
1377 # This may raise NetmaskValueError.
1378 self._prefixlen = self._prefix_from_ip_string(addr[1])
1380 self._prefixlen = self._max_prefixlen
1382 self.netmask = IPv4Address(self._ip_int_from_prefix(self._prefixlen))
1385 if self.ip != self.network:
1386 raise ValueError("%s has host bits set" % self.ip)
1387 if self._prefixlen == (self._max_prefixlen - 1):
1388 self.iterhosts = self.__iter__
1390 # backwards compatibility
1391 def IsRFC1918(self):
1392 return self.is_private
1394 def IsMulticast(self):
1395 return self.is_multicast
1397 def IsLoopback(self):
1398 return self.is_loopback
1400 def IsLinkLocal(self):
1401 return self.is_link_local
1404 class _BaseV6(object):
1406 """Base IPv6 object.
1408 The following methods are used by IPv6 objects in both single IP
1409 addresses and networks.
1413 _ALL_ONES = (2**IPV6LENGTH) - 1
1415 _HEX_DIGITS = frozenset("0123456789ABCDEFabcdef")
1417 def __init__(self, address):
1419 self._max_prefixlen = IPV6LENGTH
1421 def _ip_int_from_string(self, ip_str):
1422 """Turn an IPv6 ip_str into an integer.
1425 ip_str: A string, the IPv6 ip_str.
1428 A long, the IPv6 ip_str.
1431 AddressValueError: if ip_str isn't a valid IPv6 Address.
1434 parts = ip_str.split(":")
1436 # An IPv6 address needs at least 2 colons (3 parts).
1438 raise AddressValueError(ip_str)
1440 # If the address has an IPv4-style suffix, convert it to hexadecimal.
1441 if "." in parts[-1]:
1442 ipv4_int = IPv4Address(parts.pop())._ip
1443 parts.append("%x" % ((ipv4_int >> 16) & 0xFFFF))
1444 parts.append("%x" % (ipv4_int & 0xFFFF))
1446 # An IPv6 address can't have more than 8 colons (9 parts).
1447 if len(parts) > self._HEXTET_COUNT + 1:
1448 raise AddressValueError(ip_str)
1450 # Disregarding the endpoints, find '::' with nothing in between.
1451 # This indicates that a run of zeroes has been skipped.
1453 (skip_index,) = [i for i in range(1, len(parts) - 1) if not parts[i]] or [
1457 # Can't have more than one '::'
1458 raise AddressValueError(ip_str)
1460 # parts_hi is the number of parts to copy from above/before the '::'
1461 # parts_lo is the number of parts to copy from below/after the '::'
1462 if skip_index is not None:
1463 # If we found a '::', then check if it also covers the endpoints.
1464 parts_hi = skip_index
1465 parts_lo = len(parts) - skip_index - 1
1469 raise AddressValueError(ip_str) # ^: requires ^::
1473 raise AddressValueError(ip_str) # :$ requires ::$
1474 parts_skipped = self._HEXTET_COUNT - (parts_hi + parts_lo)
1475 if parts_skipped < 1:
1476 raise AddressValueError(ip_str)
1478 # Otherwise, allocate the entire address to parts_hi. The endpoints
1479 # could still be empty, but _parse_hextet() will check for that.
1480 if len(parts) != self._HEXTET_COUNT:
1481 raise AddressValueError(ip_str)
1482 parts_hi = len(parts)
1487 # Now, parse the hextets into a 128-bit integer.
1489 for i in range(parts_hi):
1491 ip_int |= self._parse_hextet(parts[i])
1492 ip_int <<= 16 * parts_skipped
1493 for i in range(-parts_lo, 0):
1495 ip_int |= self._parse_hextet(parts[i])
1498 raise AddressValueError(ip_str)
1500 def _parse_hextet(self, hextet_str):
1501 """Convert an IPv6 hextet string into an integer.
1504 hextet_str: A string, the number to parse.
1507 The hextet as an integer.
1510 ValueError: if the input isn't strictly a hex number from [0..FFFF].
1513 # Whitelist the characters, since int() allows a lot of bizarre stuff.
1514 if not self._HEX_DIGITS.issuperset(hextet_str):
1516 if len(hextet_str) > 4:
1518 hextet_int = int(hextet_str, 16)
1519 if hextet_int > 0xFFFF:
1523 def _compress_hextets(self, hextets):
1524 """Compresses a list of hextets.
1526 Compresses a list of strings, replacing the longest continuous
1527 sequence of "0" in the list with "" and adding empty strings at
1528 the beginning or at the end of the string such that subsequently
1529 calling ":".join(hextets) will produce the compressed version of
1533 hextets: A list of strings, the hextets to compress.
1539 best_doublecolon_start = -1
1540 best_doublecolon_len = 0
1541 doublecolon_start = -1
1543 for index in range(len(hextets)):
1544 if hextets[index] == "0":
1545 doublecolon_len += 1
1546 if doublecolon_start == -1:
1547 # Start of a sequence of zeros.
1548 doublecolon_start = index
1549 if doublecolon_len > best_doublecolon_len:
1550 # This is the longest sequence of zeros so far.
1551 best_doublecolon_len = doublecolon_len
1552 best_doublecolon_start = doublecolon_start
1555 doublecolon_start = -1
1557 if best_doublecolon_len > 1:
1558 best_doublecolon_end = best_doublecolon_start + best_doublecolon_len
1559 # For zeros at the end of the address.
1560 if best_doublecolon_end == len(hextets):
1562 hextets[best_doublecolon_start:best_doublecolon_end] = [""]
1563 # For zeros at the beginning of the address.
1564 if best_doublecolon_start == 0:
1565 hextets = [""] + hextets
1569 def _string_from_ip_int(self, ip_int=None):
1570 """Turns a 128-bit integer into hexadecimal notation.
1573 ip_int: An integer, the IP address.
1576 A string, the hexadecimal representation of the address.
1579 ValueError: The address is bigger than 128 bits of all ones.
1582 if not ip_int and ip_int != 0:
1583 ip_int = int(self._ip)
1585 if ip_int > self._ALL_ONES:
1586 raise ValueError("IPv6 address is too large")
1588 hex_str = "%032x" % ip_int
1590 for x in range(0, 32, 4):
1591 hextets.append("%x" % int(hex_str[x : x + 4], 16))
1593 hextets = self._compress_hextets(hextets)
1594 return ":".join(hextets)
1596 def _explode_shorthand_ip_string(self):
1597 """Expand a shortened IPv6 address.
1600 ip_str: A string, the IPv6 address.
1603 A string, the expanded IPv6 address.
1606 if isinstance(self, _BaseNet):
1607 ip_str = str(self.ip)
1611 ip_int = self._ip_int_from_string(ip_str)
1613 for i in range(self._HEXTET_COUNT):
1614 parts.append("%04x" % (ip_int & 0xFFFF))
1617 if isinstance(self, _BaseNet):
1618 return "%s/%d" % (":".join(parts), self.prefixlen)
1619 return ":".join(parts)
1622 def max_prefixlen(self):
1623 return self._max_prefixlen
1627 """The binary representation of this address."""
1628 return v6_int_to_packed(self._ip)
1632 return self._version
1635 def is_multicast(self):
1636 """Test if the address is reserved for multicast use.
1639 A boolean, True if the address is a multicast address.
1640 See RFC 2373 2.7 for details.
1643 return self in IPv6Network("ff00::/8")
1646 def is_reserved(self):
1647 """Test if the address is otherwise IETF reserved.
1650 A boolean, True if the address is within one of the
1651 reserved IPv6 Network ranges.
1655 self in IPv6Network("::/8")
1656 or self in IPv6Network("100::/8")
1657 or self in IPv6Network("200::/7")
1658 or self in IPv6Network("400::/6")
1659 or self in IPv6Network("800::/5")
1660 or self in IPv6Network("1000::/4")
1661 or self in IPv6Network("4000::/3")
1662 or self in IPv6Network("6000::/3")
1663 or self in IPv6Network("8000::/3")
1664 or self in IPv6Network("A000::/3")
1665 or self in IPv6Network("C000::/3")
1666 or self in IPv6Network("E000::/4")
1667 or self in IPv6Network("F000::/5")
1668 or self in IPv6Network("F800::/6")
1669 or self in IPv6Network("FE00::/9")
1673 def is_unspecified(self):
1674 """Test if the address is unspecified.
1677 A boolean, True if this is the unspecified address as defined in
1681 return self._ip == 0 and getattr(self, "_prefixlen", 128) == 128
1684 def is_loopback(self):
1685 """Test if the address is a loopback address.
1688 A boolean, True if the address is a loopback address as defined in
1692 return self._ip == 1 and getattr(self, "_prefixlen", 128) == 128
1695 def is_link_local(self):
1696 """Test if the address is reserved for link-local.
1699 A boolean, True if the address is reserved per RFC 4291.
1702 return self in IPv6Network("fe80::/10")
1705 def is_site_local(self):
1706 """Test if the address is reserved for site-local.
1708 Note that the site-local address space has been deprecated by RFC 3879.
1709 Use is_private to test if this address is in the space of unique local
1710 addresses as defined by RFC 4193.
1713 A boolean, True if the address is reserved per RFC 3513 2.5.6.
1716 return self in IPv6Network("fec0::/10")
1719 def is_private(self):
1720 """Test if this address is allocated for private networks.
1723 A boolean, True if the address is reserved per RFC 4193.
1726 return self in IPv6Network("fc00::/7")
1729 def ipv4_mapped(self):
1730 """Return the IPv4 mapped address.
1733 If the IPv6 address is a v4 mapped address, return the
1734 IPv4 mapped address. Return None otherwise.
1737 if (self._ip >> 32) != 0xFFFF:
1739 return IPv4Address(self._ip & 0xFFFFFFFF)
1743 """Tuple of embedded teredo IPs.
1746 Tuple of the (server, client) IPs or None if the address
1747 doesn't appear to be a teredo address (doesn't start with
1751 if (self._ip >> 96) != 0x20010000:
1754 IPv4Address((self._ip >> 64) & 0xFFFFFFFF),
1755 IPv4Address(~self._ip & 0xFFFFFFFF),
1759 def sixtofour(self):
1760 """Return the IPv4 6to4 embedded address.
1763 The IPv4 6to4-embedded address if present or None if the
1764 address doesn't appear to contain a 6to4 embedded address.
1767 if (self._ip >> 112) != 0x2002:
1769 return IPv4Address((self._ip >> 80) & 0xFFFFFFFF)
1772 class IPv6Address(_BaseV6, _BaseIP):
1774 """Represent and manipulate single IPv6 Addresses."""
1776 def __init__(self, address):
1777 """Instantiate a new IPv6 address object.
1780 address: A string or integer representing the IP
1782 Additionally, an integer can be passed, so
1783 IPv6Address('2001:4860::') ==
1784 IPv6Address(42541956101370907050197289607612071936L).
1786 IPv6Address(IPv6Address('2001:4860::')._ip) ==
1787 IPv6Address('2001:4860::')
1790 AddressValueError: If address isn't a valid IPv6 address.
1793 _BaseV6.__init__(self, address)
1795 # Efficient constructor from integer.
1796 if isinstance(address, int):
1798 if address < 0 or address > self._ALL_ONES:
1799 raise AddressValueError(address)
1802 # Constructing from a packed address
1803 if isinstance(address, Bytes):
1805 hi, lo = struct.unpack("!QQ", address)
1806 except struct.error:
1807 raise AddressValueError(address) # Wrong length.
1808 self._ip = (hi << 64) | lo
1811 # Assume input argument to be string or any object representation
1812 # which converts into a formatted IP string.
1813 addr_str = str(address)
1815 raise AddressValueError("")
1817 self._ip = self._ip_int_from_string(addr_str)
1820 class IPv6Network(_BaseV6, _BaseNet):
1822 """This class represents and manipulates 128-bit IPv6 networks.
1824 Attributes: [examples for IPv6('2001:658:22A:CAFE:200::1/64')]
1825 .ip: IPv6Address('2001:658:22a:cafe:200::1')
1826 .network: IPv6Address('2001:658:22a:cafe::')
1827 .hostmask: IPv6Address('::ffff:ffff:ffff:ffff')
1828 .broadcast: IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff')
1829 .netmask: IPv6Address('ffff:ffff:ffff:ffff::')
1834 def __init__(self, address, strict=False):
1835 """Instantiate a new IPv6 Network object.
1838 address: A string or integer representing the IPv6 network or the IP
1841 '2001:4860:0000:0000:0000:0000:0000:0000/128'
1843 are all functionally the same in IPv6. That is to say,
1844 failing to provide a subnetmask will create an object with
1847 Additionally, an integer can be passed, so
1848 IPv6Network('2001:4860::') ==
1849 IPv6Network(42541956101370907050197289607612071936L).
1851 IPv6Network(IPv6Network('2001:4860::')._ip) ==
1852 IPv6Network('2001:4860::')
1854 strict: A boolean. If true, ensure that we have been passed
1855 A true network address, eg, 192.168.1.0/24 and not an
1856 IP address on a network, eg, 192.168.1.1/24.
1859 AddressValueError: If address isn't a valid IPv6 address.
1860 NetmaskValueError: If the netmask isn't valid for
1862 ValueError: If strict was True and a network address was not
1866 _BaseNet.__init__(self, address)
1867 _BaseV6.__init__(self, address)
1869 # Constructing from an integer or packed bytes.
1870 if isinstance(address, (int, Bytes)):
1871 self.ip = IPv6Address(address)
1872 self._ip = self.ip._ip
1873 self._prefixlen = self._max_prefixlen
1874 self.netmask = IPv6Address(self._ALL_ONES)
1877 # Assume input argument to be string or any object representation
1878 # which converts into a formatted IP prefix string.
1879 addr = str(address).split("/")
1882 raise AddressValueError(address)
1884 self._ip = self._ip_int_from_string(addr[0])
1885 self.ip = IPv6Address(self._ip)
1888 # This may raise NetmaskValueError
1889 self._prefixlen = self._prefix_from_prefix_string(addr[1])
1891 self._prefixlen = self._max_prefixlen
1893 self.netmask = IPv6Address(self._ip_int_from_prefix(self._prefixlen))
1896 if self.ip != self.network:
1897 raise ValueError("%s has host bits set" % self.ip)
1898 if self._prefixlen == (self._max_prefixlen - 1):
1899 self.iterhosts = self.__iter__
1902 def with_netmask(self):
1903 return self.with_prefixlen