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(long(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.
788 "Error performing exclusion: "
789 "s1: %s s2: %s other: %s" % (str(s1), str(s2), str(other))
796 # If we got here, there's a bug somewhere.
797 assert False, "Error performing exclusion: " "s1: %s s2: %s other: %s" % (
803 return sorted(ret_addrs, key=_BaseNet._get_networks_key)
805 def compare_networks(self, other):
806 """Compare two IP objects.
808 This is only concerned about the comparison of the integer
809 representation of the network addresses. This means that the
810 host bits aren't considered at all in this method. If you want
811 to compare host bits, you can easily enough do a
812 'HostA._ip < HostB._ip'
818 If the IP versions of self and other are the same, returns:
821 eg: IPv4('1.1.1.0/24') < IPv4('1.1.2.0/24')
822 IPv6('1080::200C:417A') < IPv6('1080::200B:417B')
824 eg: IPv4('1.1.1.1/24') == IPv4('1.1.1.2/24')
825 IPv6('1080::200C:417A/96') == IPv6('1080::200C:417B/96')
827 eg: IPv4('1.1.1.0/24') > IPv4('1.1.0.0/24')
828 IPv6('1080::1:200C:417A/112') >
829 IPv6('1080::0:200C:417A/112')
831 If the IP versions of self and other are different, returns:
833 -1 if self._version < other._version
834 eg: IPv4('10.0.0.1/24') < IPv6('::1/128')
835 1 if self._version > other._version
836 eg: IPv6('::1/128') > IPv4('255.255.255.0/24')
839 if self._version < other._version:
841 if self._version > other._version:
843 # self._version == other._version below here:
844 if self.network < other.network:
846 if self.network > other.network:
848 # self.network == other.network below here:
849 if self.netmask < other.netmask:
851 if self.netmask > other.netmask:
853 # self.network == other.network and self.netmask == other.netmask
856 def _get_networks_key(self):
857 """Network-only key function.
859 Returns an object that identifies this address' network and
860 netmask. This function is a suitable "key" argument for sorted()
864 return (self._version, self.network, self.netmask)
866 def _ip_int_from_prefix(self, prefixlen):
867 """Turn the prefix length into a bitwise netmask.
870 prefixlen: An integer, the prefix length.
876 return self._ALL_ONES ^ (self._ALL_ONES >> prefixlen)
878 def _prefix_from_ip_int(self, ip_int):
879 """Return prefix length from a bitwise netmask.
882 ip_int: An integer, the netmask in expanded bitwise format.
885 An integer, the prefix length.
888 NetmaskValueError: If the input is not a valid netmask.
891 prefixlen = self._max_prefixlen
898 if ip_int == (1 << prefixlen) - 1:
901 raise NetmaskValueError("Bit pattern does not match /1*0*/")
903 def _prefix_from_prefix_string(self, prefixlen_str):
904 """Turn a prefix length string into an integer.
907 prefixlen_str: A decimal string containing the prefix length.
910 The prefix length as an integer.
913 NetmaskValueError: If the input is malformed or out of range.
917 if not _BaseV4._DECIMAL_DIGITS.issuperset(prefixlen_str):
919 prefixlen = int(prefixlen_str)
920 if not (0 <= prefixlen <= self._max_prefixlen):
923 raise NetmaskValueError("%s is not a valid prefix length" % prefixlen_str)
926 def _prefix_from_ip_string(self, ip_str):
927 """Turn a netmask/hostmask string into a prefix length.
930 ip_str: A netmask or hostmask, formatted as an IP address.
933 The prefix length as an integer.
936 NetmaskValueError: If the input is not a netmask or hostmask.
939 # Parse the netmask/hostmask like an IP address.
941 ip_int = self._ip_int_from_string(ip_str)
942 except AddressValueError:
943 raise NetmaskValueError("%s is not a valid netmask" % ip_str)
945 # Try matching a netmask (this would be /1*0*/ as a bitwise regexp).
946 # Note that the two ambiguous cases (all-ones and all-zeroes) are
947 # treated as netmasks.
949 return self._prefix_from_ip_int(ip_int)
950 except NetmaskValueError:
953 # Invert the bits, and try matching a /0+1+/ hostmask instead.
954 ip_int ^= self._ALL_ONES
956 return self._prefix_from_ip_int(ip_int)
957 except NetmaskValueError:
958 raise NetmaskValueError("%s is not a valid netmask" % ip_str)
960 def iter_subnets(self, prefixlen_diff=1, new_prefix=None):
961 """The subnets which join to make the current subnet.
963 In the case that self contains only one IP
964 (self._prefixlen == 32 for IPv4 or self._prefixlen == 128
965 for IPv6), return a list with just ourself.
968 prefixlen_diff: An integer, the amount the prefix length
969 should be increased by. This should not be set if
970 new_prefix is also set.
971 new_prefix: The desired new prefix length. This must be a
972 larger number (smaller prefix) than the existing prefix.
973 This should not be set if prefixlen_diff is also set.
976 An iterator of IPv(4|6) objects.
979 ValueError: The prefixlen_diff is too small or too large.
981 prefixlen_diff and new_prefix are both set or new_prefix
982 is a smaller number than the current prefix (smaller
983 number means a larger network)
986 if self._prefixlen == self._max_prefixlen:
990 if new_prefix is not None:
991 if new_prefix < self._prefixlen:
992 raise ValueError("new prefix must be longer")
993 if prefixlen_diff != 1:
994 raise ValueError("cannot set prefixlen_diff and new_prefix")
995 prefixlen_diff = new_prefix - self._prefixlen
997 if prefixlen_diff < 0:
998 raise ValueError("prefix length diff must be > 0")
999 new_prefixlen = self._prefixlen + prefixlen_diff
1001 if new_prefixlen > self._max_prefixlen:
1003 "prefix length diff %d is invalid for netblock %s"
1004 % (new_prefixlen, str(self))
1008 "%s/%s" % (str(self.network), str(self._prefixlen + prefixlen_diff)),
1009 version=self._version,
1015 broadcast = current.broadcast
1016 if broadcast == self.broadcast:
1018 new_addr = IPAddress(int(broadcast) + 1, version=self._version)
1019 current = IPNetwork(
1020 "%s/%s" % (str(new_addr), str(new_prefixlen)), version=self._version
1026 """Return the network object with the host bits masked out."""
1028 "%s/%d" % (self.network, self._prefixlen), version=self._version
1031 def subnet(self, prefixlen_diff=1, new_prefix=None):
1032 """Return a list of subnets, rather than an iterator."""
1033 return list(self.iter_subnets(prefixlen_diff, new_prefix))
1035 def supernet(self, prefixlen_diff=1, new_prefix=None):
1036 """The supernet containing the current network.
1039 prefixlen_diff: An integer, the amount the prefix length of
1040 the network should be decreased by. For example, given a
1041 /24 network and a prefixlen_diff of 3, a supernet with a
1042 /21 netmask is returned.
1045 An IPv4 network object.
1048 ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have a
1049 negative prefix length.
1051 If prefixlen_diff and new_prefix are both set or new_prefix is a
1052 larger number than the current prefix (larger number means a
1056 if self._prefixlen == 0:
1059 if new_prefix is not None:
1060 if new_prefix > self._prefixlen:
1061 raise ValueError("new prefix must be shorter")
1062 if prefixlen_diff != 1:
1063 raise ValueError("cannot set prefixlen_diff and new_prefix")
1064 prefixlen_diff = self._prefixlen - new_prefix
1066 if self.prefixlen - prefixlen_diff < 0:
1068 "current prefixlen is %d, cannot have a prefixlen_diff of %d"
1069 % (self.prefixlen, prefixlen_diff)
1072 "%s/%s" % (str(self.network), str(self.prefixlen - prefixlen_diff)),
1073 version=self._version,
1076 # backwards compatibility
1079 AddressExclude = address_exclude
1080 CompareNetworks = compare_networks
1081 Contains = __contains__
1084 class _BaseV4(object):
1086 """Base IPv4 object.
1088 The following methods are used by IPv4 objects in both single IP
1089 addresses and networks.
1093 # Equivalent to 255.255.255.255 or 32 bits of 1's.
1094 _ALL_ONES = (2 ** IPV4LENGTH) - 1
1095 _DECIMAL_DIGITS = frozenset("0123456789")
1097 def __init__(self, address):
1099 self._max_prefixlen = IPV4LENGTH
1101 def _explode_shorthand_ip_string(self):
1104 def _ip_int_from_string(self, ip_str):
1105 """Turn the given IP string into an integer for comparison.
1108 ip_str: A string, the IP ip_str.
1111 The IP ip_str as an integer.
1114 AddressValueError: if ip_str isn't a valid IPv4 Address.
1117 octets = ip_str.split(".")
1118 if len(octets) != 4:
1119 raise AddressValueError(ip_str)
1124 packed_ip = (packed_ip << 8) | self._parse_octet(oc)
1126 raise AddressValueError(ip_str)
1129 def _parse_octet(self, octet_str):
1130 """Convert a decimal octet into an integer.
1133 octet_str: A string, the number to parse.
1136 The octet as an integer.
1139 ValueError: if the octet isn't strictly a decimal from [0..255].
1142 # Whitelist the characters, since int() allows a lot of bizarre stuff.
1143 if not self._DECIMAL_DIGITS.issuperset(octet_str):
1145 octet_int = int(octet_str, 10)
1146 # Disallow leading zeroes, because no clear standard exists on
1147 # whether these should be interpreted as decimal or octal.
1148 if octet_int > 255 or (octet_str[0] == "0" and len(octet_str) > 1):
1152 def _string_from_ip_int(self, ip_int):
1153 """Turns a 32-bit integer into dotted decimal notation.
1156 ip_int: An integer, the IP address.
1159 The IP address as a string in dotted decimal notation.
1164 octets.insert(0, str(ip_int & 0xFF))
1166 return ".".join(octets)
1169 def max_prefixlen(self):
1170 return self._max_prefixlen
1174 """The binary representation of this address."""
1175 return v4_int_to_packed(self._ip)
1179 return self._version
1182 def is_reserved(self):
1183 """Test if the address is otherwise IETF reserved.
1186 A boolean, True if the address is within the
1187 reserved IPv4 Network range.
1190 return self in IPv4Network("240.0.0.0/4")
1193 def is_private(self):
1194 """Test if this address is allocated for private networks.
1197 A boolean, True if the address is reserved per RFC 1918.
1201 self in IPv4Network("10.0.0.0/8")
1202 or self in IPv4Network("172.16.0.0/12")
1203 or self in IPv4Network("192.168.0.0/16")
1207 def is_multicast(self):
1208 """Test if the address is reserved for multicast use.
1211 A boolean, True if the address is multicast.
1212 See RFC 3171 for details.
1215 return self in IPv4Network("224.0.0.0/4")
1218 def is_unspecified(self):
1219 """Test if the address is unspecified.
1222 A boolean, True if this is the unspecified address as defined in
1226 return self in IPv4Network("0.0.0.0")
1229 def is_loopback(self):
1230 """Test if the address is a loopback address.
1233 A boolean, True if the address is a loopback per RFC 3330.
1236 return self in IPv4Network("127.0.0.0/8")
1239 def is_link_local(self):
1240 """Test if the address is reserved for link-local.
1243 A boolean, True if the address is link-local per RFC 3927.
1246 return self in IPv4Network("169.254.0.0/16")
1249 class IPv4Address(_BaseV4, _BaseIP):
1251 """Represent and manipulate single IPv4 Addresses."""
1253 def __init__(self, address):
1256 address: A string or integer representing the IP
1259 Additionally, an integer can be passed, so
1260 IPv4Address('192.168.1.1') == IPv4Address(3232235777).
1262 IPv4Address(int(IPv4Address('192.168.1.1'))) ==
1263 IPv4Address('192.168.1.1')
1266 AddressValueError: If ipaddr isn't a valid IPv4 address.
1269 _BaseV4.__init__(self, address)
1271 # Efficient constructor from integer.
1272 if isinstance(address, (int, long)):
1274 if address < 0 or address > self._ALL_ONES:
1275 raise AddressValueError(address)
1278 # Constructing from a packed address
1279 if isinstance(address, Bytes):
1281 (self._ip,) = struct.unpack("!I", address)
1282 except struct.error:
1283 raise AddressValueError(address) # Wrong length.
1286 # Assume input argument to be string or any object representation
1287 # which converts into a formatted IP string.
1288 addr_str = str(address)
1289 self._ip = self._ip_int_from_string(addr_str)
1292 class IPv4Network(_BaseV4, _BaseNet):
1294 """This class represents and manipulates 32-bit IPv4 networks.
1296 Attributes: [examples for IPv4Network('1.2.3.4/27')]
1298 .ip: IPv4Address('1.2.3.4')
1299 .network: IPv4Address('1.2.3.0')
1300 .hostmask: IPv4Address('0.0.0.31')
1301 .broadcast: IPv4Address('1.2.3.31')
1302 .netmask: IPv4Address('255.255.255.224')
1307 def __init__(self, address, strict=False):
1308 """Instantiate a new IPv4 network object.
1311 address: A string or integer representing the IP [& network].
1313 '192.168.1.1/255.255.255.0'
1314 '192.168.1.1/0.0.0.255'
1315 are all functionally the same in IPv4. Similarly,
1317 '192.168.1.1/255.255.255.255'
1319 are also functionaly equivalent. That is to say, failing to
1320 provide a subnetmask will create an object with a mask of /32.
1322 If the mask (portion after the / in the argument) is given in
1323 dotted quad form, it is treated as a netmask if it starts with a
1324 non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it
1325 starts with a zero field (e.g. 0.255.255.255 == /8), with the
1326 single exception of an all-zero mask which is treated as a
1327 netmask == /0. If no mask is given, a default of /32 is used.
1329 Additionally, an integer can be passed, so
1330 IPv4Network('192.168.1.1') == IPv4Network(3232235777).
1332 IPv4Network(int(IPv4Network('192.168.1.1'))) ==
1333 IPv4Network('192.168.1.1')
1335 strict: A boolean. If true, ensure that we have been passed
1336 A true network address, eg, 192.168.1.0/24 and not an
1337 IP address on a network, eg, 192.168.1.1/24.
1340 AddressValueError: If ipaddr isn't a valid IPv4 address.
1341 NetmaskValueError: If the netmask isn't valid for
1343 ValueError: If strict was True and a network address was not
1347 _BaseNet.__init__(self, address)
1348 _BaseV4.__init__(self, address)
1350 # Constructing from an integer or packed bytes.
1351 if isinstance(address, (int, long, Bytes)):
1352 self.ip = IPv4Address(address)
1353 self._ip = self.ip._ip
1354 self._prefixlen = self._max_prefixlen
1355 self.netmask = IPv4Address(self._ALL_ONES)
1358 # Assume input argument to be string or any object representation
1359 # which converts into a formatted IP prefix string.
1360 addr = str(address).split("/")
1363 raise AddressValueError(address)
1365 self._ip = self._ip_int_from_string(addr[0])
1366 self.ip = IPv4Address(self._ip)
1370 # Check for a netmask in prefix length form.
1371 self._prefixlen = self._prefix_from_prefix_string(addr[1])
1372 except NetmaskValueError:
1373 # Check for a netmask or hostmask in dotted-quad form.
1374 # This may raise NetmaskValueError.
1375 self._prefixlen = self._prefix_from_ip_string(addr[1])
1377 self._prefixlen = self._max_prefixlen
1379 self.netmask = IPv4Address(self._ip_int_from_prefix(self._prefixlen))
1382 if self.ip != self.network:
1383 raise ValueError("%s has host bits set" % self.ip)
1384 if self._prefixlen == (self._max_prefixlen - 1):
1385 self.iterhosts = self.__iter__
1387 # backwards compatibility
1388 def IsRFC1918(self):
1389 return self.is_private
1391 def IsMulticast(self):
1392 return self.is_multicast
1394 def IsLoopback(self):
1395 return self.is_loopback
1397 def IsLinkLocal(self):
1398 return self.is_link_local
1401 class _BaseV6(object):
1403 """Base IPv6 object.
1405 The following methods are used by IPv6 objects in both single IP
1406 addresses and networks.
1410 _ALL_ONES = (2 ** IPV6LENGTH) - 1
1412 _HEX_DIGITS = frozenset("0123456789ABCDEFabcdef")
1414 def __init__(self, address):
1416 self._max_prefixlen = IPV6LENGTH
1418 def _ip_int_from_string(self, ip_str):
1419 """Turn an IPv6 ip_str into an integer.
1422 ip_str: A string, the IPv6 ip_str.
1425 A long, the IPv6 ip_str.
1428 AddressValueError: if ip_str isn't a valid IPv6 Address.
1431 parts = ip_str.split(":")
1433 # An IPv6 address needs at least 2 colons (3 parts).
1435 raise AddressValueError(ip_str)
1437 # If the address has an IPv4-style suffix, convert it to hexadecimal.
1438 if "." in parts[-1]:
1439 ipv4_int = IPv4Address(parts.pop())._ip
1440 parts.append("%x" % ((ipv4_int >> 16) & 0xFFFF))
1441 parts.append("%x" % (ipv4_int & 0xFFFF))
1443 # An IPv6 address can't have more than 8 colons (9 parts).
1444 if len(parts) > self._HEXTET_COUNT + 1:
1445 raise AddressValueError(ip_str)
1447 # Disregarding the endpoints, find '::' with nothing in between.
1448 # This indicates that a run of zeroes has been skipped.
1450 (skip_index,) = [i for i in xrange(1, len(parts) - 1) if not parts[i]] or [
1454 # Can't have more than one '::'
1455 raise AddressValueError(ip_str)
1457 # parts_hi is the number of parts to copy from above/before the '::'
1458 # parts_lo is the number of parts to copy from below/after the '::'
1459 if skip_index is not None:
1460 # If we found a '::', then check if it also covers the endpoints.
1461 parts_hi = skip_index
1462 parts_lo = len(parts) - skip_index - 1
1466 raise AddressValueError(ip_str) # ^: requires ^::
1470 raise AddressValueError(ip_str) # :$ requires ::$
1471 parts_skipped = self._HEXTET_COUNT - (parts_hi + parts_lo)
1472 if parts_skipped < 1:
1473 raise AddressValueError(ip_str)
1475 # Otherwise, allocate the entire address to parts_hi. The endpoints
1476 # could still be empty, but _parse_hextet() will check for that.
1477 if len(parts) != self._HEXTET_COUNT:
1478 raise AddressValueError(ip_str)
1479 parts_hi = len(parts)
1484 # Now, parse the hextets into a 128-bit integer.
1486 for i in xrange(parts_hi):
1488 ip_int |= self._parse_hextet(parts[i])
1489 ip_int <<= 16 * parts_skipped
1490 for i in xrange(-parts_lo, 0):
1492 ip_int |= self._parse_hextet(parts[i])
1495 raise AddressValueError(ip_str)
1497 def _parse_hextet(self, hextet_str):
1498 """Convert an IPv6 hextet string into an integer.
1501 hextet_str: A string, the number to parse.
1504 The hextet as an integer.
1507 ValueError: if the input isn't strictly a hex number from [0..FFFF].
1510 # Whitelist the characters, since int() allows a lot of bizarre stuff.
1511 if not self._HEX_DIGITS.issuperset(hextet_str):
1513 if len(hextet_str) > 4:
1515 hextet_int = int(hextet_str, 16)
1516 if hextet_int > 0xFFFF:
1520 def _compress_hextets(self, hextets):
1521 """Compresses a list of hextets.
1523 Compresses a list of strings, replacing the longest continuous
1524 sequence of "0" in the list with "" and adding empty strings at
1525 the beginning or at the end of the string such that subsequently
1526 calling ":".join(hextets) will produce the compressed version of
1530 hextets: A list of strings, the hextets to compress.
1536 best_doublecolon_start = -1
1537 best_doublecolon_len = 0
1538 doublecolon_start = -1
1540 for index in range(len(hextets)):
1541 if hextets[index] == "0":
1542 doublecolon_len += 1
1543 if doublecolon_start == -1:
1544 # Start of a sequence of zeros.
1545 doublecolon_start = index
1546 if doublecolon_len > best_doublecolon_len:
1547 # This is the longest sequence of zeros so far.
1548 best_doublecolon_len = doublecolon_len
1549 best_doublecolon_start = doublecolon_start
1552 doublecolon_start = -1
1554 if best_doublecolon_len > 1:
1555 best_doublecolon_end = best_doublecolon_start + best_doublecolon_len
1556 # For zeros at the end of the address.
1557 if best_doublecolon_end == len(hextets):
1559 hextets[best_doublecolon_start:best_doublecolon_end] = [""]
1560 # For zeros at the beginning of the address.
1561 if best_doublecolon_start == 0:
1562 hextets = [""] + hextets
1566 def _string_from_ip_int(self, ip_int=None):
1567 """Turns a 128-bit integer into hexadecimal notation.
1570 ip_int: An integer, the IP address.
1573 A string, the hexadecimal representation of the address.
1576 ValueError: The address is bigger than 128 bits of all ones.
1579 if not ip_int and ip_int != 0:
1580 ip_int = int(self._ip)
1582 if ip_int > self._ALL_ONES:
1583 raise ValueError("IPv6 address is too large")
1585 hex_str = "%032x" % ip_int
1587 for x in range(0, 32, 4):
1588 hextets.append("%x" % int(hex_str[x : x + 4], 16))
1590 hextets = self._compress_hextets(hextets)
1591 return ":".join(hextets)
1593 def _explode_shorthand_ip_string(self):
1594 """Expand a shortened IPv6 address.
1597 ip_str: A string, the IPv6 address.
1600 A string, the expanded IPv6 address.
1603 if isinstance(self, _BaseNet):
1604 ip_str = str(self.ip)
1608 ip_int = self._ip_int_from_string(ip_str)
1610 for i in xrange(self._HEXTET_COUNT):
1611 parts.append("%04x" % (ip_int & 0xFFFF))
1614 if isinstance(self, _BaseNet):
1615 return "%s/%d" % (":".join(parts), self.prefixlen)
1616 return ":".join(parts)
1619 def max_prefixlen(self):
1620 return self._max_prefixlen
1624 """The binary representation of this address."""
1625 return v6_int_to_packed(self._ip)
1629 return self._version
1632 def is_multicast(self):
1633 """Test if the address is reserved for multicast use.
1636 A boolean, True if the address is a multicast address.
1637 See RFC 2373 2.7 for details.
1640 return self in IPv6Network("ff00::/8")
1643 def is_reserved(self):
1644 """Test if the address is otherwise IETF reserved.
1647 A boolean, True if the address is within one of the
1648 reserved IPv6 Network ranges.
1652 self in IPv6Network("::/8")
1653 or self in IPv6Network("100::/8")
1654 or self in IPv6Network("200::/7")
1655 or self in IPv6Network("400::/6")
1656 or self in IPv6Network("800::/5")
1657 or self in IPv6Network("1000::/4")
1658 or self in IPv6Network("4000::/3")
1659 or self in IPv6Network("6000::/3")
1660 or self in IPv6Network("8000::/3")
1661 or self in IPv6Network("A000::/3")
1662 or self in IPv6Network("C000::/3")
1663 or self in IPv6Network("E000::/4")
1664 or self in IPv6Network("F000::/5")
1665 or self in IPv6Network("F800::/6")
1666 or self in IPv6Network("FE00::/9")
1670 def is_unspecified(self):
1671 """Test if the address is unspecified.
1674 A boolean, True if this is the unspecified address as defined in
1678 return self._ip == 0 and getattr(self, "_prefixlen", 128) == 128
1681 def is_loopback(self):
1682 """Test if the address is a loopback address.
1685 A boolean, True if the address is a loopback address as defined in
1689 return self._ip == 1 and getattr(self, "_prefixlen", 128) == 128
1692 def is_link_local(self):
1693 """Test if the address is reserved for link-local.
1696 A boolean, True if the address is reserved per RFC 4291.
1699 return self in IPv6Network("fe80::/10")
1702 def is_site_local(self):
1703 """Test if the address is reserved for site-local.
1705 Note that the site-local address space has been deprecated by RFC 3879.
1706 Use is_private to test if this address is in the space of unique local
1707 addresses as defined by RFC 4193.
1710 A boolean, True if the address is reserved per RFC 3513 2.5.6.
1713 return self in IPv6Network("fec0::/10")
1716 def is_private(self):
1717 """Test if this address is allocated for private networks.
1720 A boolean, True if the address is reserved per RFC 4193.
1723 return self in IPv6Network("fc00::/7")
1726 def ipv4_mapped(self):
1727 """Return the IPv4 mapped address.
1730 If the IPv6 address is a v4 mapped address, return the
1731 IPv4 mapped address. Return None otherwise.
1734 if (self._ip >> 32) != 0xFFFF:
1736 return IPv4Address(self._ip & 0xFFFFFFFF)
1740 """Tuple of embedded teredo IPs.
1743 Tuple of the (server, client) IPs or None if the address
1744 doesn't appear to be a teredo address (doesn't start with
1748 if (self._ip >> 96) != 0x20010000:
1751 IPv4Address((self._ip >> 64) & 0xFFFFFFFF),
1752 IPv4Address(~self._ip & 0xFFFFFFFF),
1756 def sixtofour(self):
1757 """Return the IPv4 6to4 embedded address.
1760 The IPv4 6to4-embedded address if present or None if the
1761 address doesn't appear to contain a 6to4 embedded address.
1764 if (self._ip >> 112) != 0x2002:
1766 return IPv4Address((self._ip >> 80) & 0xFFFFFFFF)
1769 class IPv6Address(_BaseV6, _BaseIP):
1771 """Represent and manipulate single IPv6 Addresses.
1774 def __init__(self, address):
1775 """Instantiate a new IPv6 address object.
1778 address: A string or integer representing the IP
1780 Additionally, an integer can be passed, so
1781 IPv6Address('2001:4860::') ==
1782 IPv6Address(42541956101370907050197289607612071936L).
1784 IPv6Address(IPv6Address('2001:4860::')._ip) ==
1785 IPv6Address('2001:4860::')
1788 AddressValueError: If address isn't a valid IPv6 address.
1791 _BaseV6.__init__(self, address)
1793 # Efficient constructor from integer.
1794 if isinstance(address, (int, long)):
1796 if address < 0 or address > self._ALL_ONES:
1797 raise AddressValueError(address)
1800 # Constructing from a packed address
1801 if isinstance(address, Bytes):
1803 hi, lo = struct.unpack("!QQ", address)
1804 except struct.error:
1805 raise AddressValueError(address) # Wrong length.
1806 self._ip = (hi << 64) | lo
1809 # Assume input argument to be string or any object representation
1810 # which converts into a formatted IP string.
1811 addr_str = str(address)
1813 raise AddressValueError("")
1815 self._ip = self._ip_int_from_string(addr_str)
1818 class IPv6Network(_BaseV6, _BaseNet):
1820 """This class represents and manipulates 128-bit IPv6 networks.
1822 Attributes: [examples for IPv6('2001:658:22A:CAFE:200::1/64')]
1823 .ip: IPv6Address('2001:658:22a:cafe:200::1')
1824 .network: IPv6Address('2001:658:22a:cafe::')
1825 .hostmask: IPv6Address('::ffff:ffff:ffff:ffff')
1826 .broadcast: IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff')
1827 .netmask: IPv6Address('ffff:ffff:ffff:ffff::')
1832 def __init__(self, address, strict=False):
1833 """Instantiate a new IPv6 Network object.
1836 address: A string or integer representing the IPv6 network or the IP
1839 '2001:4860:0000:0000:0000:0000:0000:0000/128'
1841 are all functionally the same in IPv6. That is to say,
1842 failing to provide a subnetmask will create an object with
1845 Additionally, an integer can be passed, so
1846 IPv6Network('2001:4860::') ==
1847 IPv6Network(42541956101370907050197289607612071936L).
1849 IPv6Network(IPv6Network('2001:4860::')._ip) ==
1850 IPv6Network('2001:4860::')
1852 strict: A boolean. If true, ensure that we have been passed
1853 A true network address, eg, 192.168.1.0/24 and not an
1854 IP address on a network, eg, 192.168.1.1/24.
1857 AddressValueError: If address isn't a valid IPv6 address.
1858 NetmaskValueError: If the netmask isn't valid for
1860 ValueError: If strict was True and a network address was not
1864 _BaseNet.__init__(self, address)
1865 _BaseV6.__init__(self, address)
1867 # Constructing from an integer or packed bytes.
1868 if isinstance(address, (int, long, Bytes)):
1869 self.ip = IPv6Address(address)
1870 self._ip = self.ip._ip
1871 self._prefixlen = self._max_prefixlen
1872 self.netmask = IPv6Address(self._ALL_ONES)
1875 # Assume input argument to be string or any object representation
1876 # which converts into a formatted IP prefix string.
1877 addr = str(address).split("/")
1880 raise AddressValueError(address)
1882 self._ip = self._ip_int_from_string(addr[0])
1883 self.ip = IPv6Address(self._ip)
1886 # This may raise NetmaskValueError
1887 self._prefixlen = self._prefix_from_prefix_string(addr[1])
1889 self._prefixlen = self._max_prefixlen
1891 self.netmask = IPv6Address(self._ip_int_from_prefix(self._prefixlen))
1894 if self.ip != self.network:
1895 raise ValueError("%s has host bits set" % self.ip)
1896 if self._prefixlen == (self._max_prefixlen - 1):
1897 self.iterhosts = self.__iter__
1900 def with_netmask(self):
1901 return self.with_prefixlen