github.com/whamcloud/lemur@v0.0.0-20190827193804-4655df8a52af/packaging/ci/lambda/GitPullS3/ipaddress.py (about)

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