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