new style, first version (header, login, dashboard)
[myslice.git] / manifold / util / ipaddr.py
1 #!/usr/bin/python
2 #
3 # Copyright 2007 Google Inc.
4 #  Licensed to PSF under a Contributor Agreement.
5 #
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
9 #
10 #      http://www.apache.org/licenses/LICENSE-2.0
11 #
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15 # implied. See the License for the specific language governing
16 # permissions and limitations under the License.
17
18 """A fast, lightweight IPv4/IPv6 manipulation library in Python.
19
20 This library is used to create/poke/manipulate IPv4 and IPv6 addresses
21 and networks.
22
23 """
24
25 __version__ = '2.1.10'
26
27 import struct
28
29 IPV4LENGTH = 32
30 IPV6LENGTH = 128
31
32
33 class AddressValueError(ValueError):
34     """A Value Error related to the address."""
35
36
37 class NetmaskValueError(ValueError):
38     """A Value Error related to the netmask."""
39
40
41 def IPAddress(address, version=None):
42     """Take an IP string/int and return an object of the correct type.
43
44     Args:
45         address: A string or integer, the IP address.  Either IPv4 or
46           IPv6 addresses may be supplied; integers less than 2**32 will
47           be considered to be IPv4 by default.
48         version: An Integer, 4 or 6. If set, don't try to automatically
49           determine what the IP address type is. important for things
50           like IPAddress(1), which could be IPv4, '0.0.0.1',  or IPv6,
51           '::1'.
52
53     Returns:
54         An IPv4Address or IPv6Address object.
55
56     Raises:
57         ValueError: if the string passed isn't either a v4 or a v6
58           address.
59
60     """
61     if version:
62         if version == 4:
63             return IPv4Address(address)
64         elif version == 6:
65             return IPv6Address(address)
66
67     try:
68         return IPv4Address(address)
69     except (AddressValueError, NetmaskValueError):
70         pass
71
72     try:
73         return IPv6Address(address)
74     except (AddressValueError, NetmaskValueError):
75         pass
76
77     raise ValueError('%r does not appear to be an IPv4 or IPv6 address' %
78                      address)
79
80
81 def IPNetwork(address, version=None, strict=False):
82     """Take an IP string/int and return an object of the correct type.
83
84     Args:
85         address: A string or integer, the IP address.  Either IPv4 or
86           IPv6 addresses may be supplied; integers less than 2**32 will
87           be considered to be IPv4 by default.
88         version: An Integer, if set, don't try to automatically
89           determine what the IP address type is. important for things
90           like IPNetwork(1), which could be IPv4, '0.0.0.1/32', or IPv6,
91           '::1/128'.
92
93     Returns:
94         An IPv4Network or IPv6Network object.
95
96     Raises:
97         ValueError: if the string passed isn't either a v4 or a v6
98           address. Or if a strict network was requested and a strict
99           network wasn't given.
100
101     """
102     if version:
103         if version == 4:
104             return IPv4Network(address, strict)
105         elif version == 6:
106             return IPv6Network(address, strict)
107
108     try:
109         return IPv4Network(address, strict)
110     except (AddressValueError, NetmaskValueError):
111         pass
112
113     try:
114         return IPv6Network(address, strict)
115     except (AddressValueError, NetmaskValueError):
116         pass
117
118     raise ValueError('%r does not appear to be an IPv4 or IPv6 network' %
119                      address)
120
121
122 def v4_int_to_packed(address):
123     """The binary representation of this address.
124
125     Args:
126         address: An integer representation of an IPv4 IP address.
127
128     Returns:
129         The binary representation of this address.
130
131     Raises:
132         ValueError: If the integer is too large to be an IPv4 IP
133           address.
134     """
135     if address > _BaseV4._ALL_ONES:
136         raise ValueError('Address too large for IPv4')
137     return Bytes(struct.pack('!I', address))
138
139
140 def v6_int_to_packed(address):
141     """The binary representation of this address.
142
143     Args:
144         address: An integer representation of an IPv4 IP address.
145
146     Returns:
147         The binary representation of this address.
148     """
149     return Bytes(struct.pack('!QQ', address >> 64, address & (2**64 - 1)))
150
151
152 def _find_address_range(addresses):
153     """Find a sequence of addresses.
154
155     Args:
156         addresses: a list of IPv4 or IPv6 addresses.
157
158     Returns:
159         A tuple containing the first and last IP addresses in the sequence.
160
161     """
162     first = last = addresses[0]
163     for ip in addresses[1:]:
164         if ip._ip == last._ip + 1:
165             last = ip
166         else:
167             break
168     return (first, last)
169
170 def _get_prefix_length(number1, number2, bits):
171     """Get the number of leading bits that are same for two numbers.
172
173     Args:
174         number1: an integer.
175         number2: another integer.
176         bits: the maximum number of bits to compare.
177
178     Returns:
179         The number of leading bits that are the same for two numbers.
180
181     """
182     for i in range(bits):
183         if number1 >> i == number2 >> i:
184             return bits - i
185     return 0
186
187 def _count_righthand_zero_bits(number, bits):
188     """Count the number of zero bits on the right hand side.
189
190     Args:
191         number: an integer.
192         bits: maximum number of bits to count.
193
194     Returns:
195         The number of zero bits on the right hand side of the number.
196
197     """
198     if number == 0:
199         return bits
200     for i in range(bits):
201         if (number >> i) % 2:
202             return i
203
204 def summarize_address_range(first, last):
205     """Summarize a network range given the first and last IP addresses.
206
207     Example:
208         >>> summarize_address_range(IPv4Address('1.1.1.0'),
209             IPv4Address('1.1.1.130'))
210         [IPv4Network('1.1.1.0/25'), IPv4Network('1.1.1.128/31'),
211         IPv4Network('1.1.1.130/32')]
212
213     Args:
214         first: the first IPv4Address or IPv6Address in the range.
215         last: the last IPv4Address or IPv6Address in the range.
216
217     Returns:
218         The address range collapsed to a list of IPv4Network's or
219         IPv6Network's.
220
221     Raise:
222         TypeError:
223             If the first and last objects are not IP addresses.
224             If the first and last objects are not the same version.
225         ValueError:
226             If the last object is not greater than the first.
227             If the version is not 4 or 6.
228
229     """
230     if not (isinstance(first, _BaseIP) and isinstance(last, _BaseIP)):
231         raise TypeError('first and last must be IP addresses, not networks')
232     if first.version != last.version:
233         raise TypeError("%s and %s are not of the same version" % (
234                 str(first), str(last)))
235     if first > last:
236         raise ValueError('last IP address must be greater than first')
237
238     networks = []
239
240     if first.version == 4:
241         ip = IPv4Network
242     elif first.version == 6:
243         ip = IPv6Network
244     else:
245         raise ValueError('unknown IP version')
246
247     ip_bits = first._max_prefixlen
248     first_int = first._ip
249     last_int = last._ip
250     while first_int <= last_int:
251         nbits = _count_righthand_zero_bits(first_int, ip_bits)
252         current = None
253         while nbits >= 0:
254             addend = 2**nbits - 1
255             current = first_int + addend
256             nbits -= 1
257             if current <= last_int:
258                 break
259         prefix = _get_prefix_length(first_int, current, ip_bits)
260         net = ip('%s/%d' % (str(first), prefix))
261         networks.append(net)
262         if current == ip._ALL_ONES:
263             break
264         first_int = current + 1
265         first = IPAddress(first_int, version=first._version)
266     return networks
267
268 def _collapse_address_list_recursive(addresses):
269     """Loops through the addresses, collapsing concurrent netblocks.
270
271     Example:
272
273         ip1 = IPv4Network('1.1.0.0/24')
274         ip2 = IPv4Network('1.1.1.0/24')
275         ip3 = IPv4Network('1.1.2.0/24')
276         ip4 = IPv4Network('1.1.3.0/24')
277         ip5 = IPv4Network('1.1.4.0/24')
278         ip6 = IPv4Network('1.1.0.1/22')
279
280         _collapse_address_list_recursive([ip1, ip2, ip3, ip4, ip5, ip6]) ->
281           [IPv4Network('1.1.0.0/22'), IPv4Network('1.1.4.0/24')]
282
283         This shouldn't be called directly; it is called via
284           collapse_address_list([]).
285
286     Args:
287         addresses: A list of IPv4Network's or IPv6Network's
288
289     Returns:
290         A list of IPv4Network's or IPv6Network's depending on what we were
291         passed.
292
293     """
294     ret_array = []
295     optimized = False
296
297     for cur_addr in addresses:
298         if not ret_array:
299             ret_array.append(cur_addr)
300             continue
301         if cur_addr in ret_array[-1]:
302             optimized = True
303         elif cur_addr == ret_array[-1].supernet().subnet()[1]:
304             ret_array.append(ret_array.pop().supernet())
305             optimized = True
306         else:
307             ret_array.append(cur_addr)
308
309     if optimized:
310         return _collapse_address_list_recursive(ret_array)
311
312     return ret_array
313
314
315 def collapse_address_list(addresses):
316     """Collapse a list of IP objects.
317
318     Example:
319         collapse_address_list([IPv4('1.1.0.0/24'), IPv4('1.1.1.0/24')]) ->
320           [IPv4('1.1.0.0/23')]
321
322     Args:
323         addresses: A list of IPv4Network or IPv6Network objects.
324
325     Returns:
326         A list of IPv4Network or IPv6Network objects depending on what we
327         were passed.
328
329     Raises:
330         TypeError: If passed a list of mixed version objects.
331
332     """
333     i = 0
334     addrs = []
335     ips = []
336     nets = []
337
338     # split IP addresses and networks
339     for ip in addresses:
340         if isinstance(ip, _BaseIP):
341             if ips and ips[-1]._version != ip._version:
342                 raise TypeError("%s and %s are not of the same version" % (
343                         str(ip), str(ips[-1])))
344             ips.append(ip)
345         elif ip._prefixlen == ip._max_prefixlen:
346             if ips and ips[-1]._version != ip._version:
347                 raise TypeError("%s and %s are not of the same version" % (
348                         str(ip), str(ips[-1])))
349             ips.append(ip.ip)
350         else:
351             if nets and nets[-1]._version != ip._version:
352                 raise TypeError("%s and %s are not of the same version" % (
353                         str(ip), str(ips[-1])))
354             nets.append(ip)
355
356     # sort and dedup
357     ips = sorted(set(ips))
358     nets = sorted(set(nets))
359
360     while i < len(ips):
361         (first, last) = _find_address_range(ips[i:])
362         i = ips.index(last) + 1
363         addrs.extend(summarize_address_range(first, last))
364
365     return _collapse_address_list_recursive(sorted(
366         addrs + nets, key=_BaseNet._get_networks_key))
367
368 # backwards compatibility
369 CollapseAddrList = collapse_address_list
370
371 # We need to distinguish between the string and packed-bytes representations
372 # of an IP address.  For example, b'0::1' is the IPv4 address 48.58.58.49,
373 # while '0::1' is an IPv6 address.
374 #
375 # In Python 3, the native 'bytes' type already provides this functionality,
376 # so we use it directly.  For earlier implementations where bytes is not a
377 # distinct type, we create a subclass of str to serve as a tag.
378 #
379 # Usage example (Python 2):
380 #   ip = ipaddr.IPAddress(ipaddr.Bytes('xxxx'))
381 #
382 # Usage example (Python 3):
383 #   ip = ipaddr.IPAddress(b'xxxx')
384 try:
385     if bytes is str:
386         raise TypeError("bytes is not a distinct type")
387     Bytes = bytes
388 except (NameError, TypeError):
389     class Bytes(str):
390         def __repr__(self):
391             return 'Bytes(%s)' % str.__repr__(self)
392
393 def get_mixed_type_key(obj):
394     """Return a key suitable for sorting between networks and addresses.
395
396     Address and Network objects are not sortable by default; they're
397     fundamentally different so the expression
398
399         IPv4Address('1.1.1.1') <= IPv4Network('1.1.1.1/24')
400
401     doesn't make any sense.  There are some times however, where you may wish
402     to have ipaddr sort these for you anyway. If you need to do this, you
403     can use this function as the key= argument to sorted().
404
405     Args:
406       obj: either a Network or Address object.
407     Returns:
408       appropriate key.
409
410     """
411     if isinstance(obj, _BaseNet):
412         return obj._get_networks_key()
413     elif isinstance(obj, _BaseIP):
414         return obj._get_address_key()
415     return NotImplemented
416
417 class _IPAddrBase(object):
418
419     """The mother class."""
420
421     def __index__(self):
422         return self._ip
423
424     def __int__(self):
425         return self._ip
426
427     def __hex__(self):
428         return hex(self._ip)
429
430     @property
431     def exploded(self):
432         """Return the longhand version of the IP address as a string."""
433         return self._explode_shorthand_ip_string()
434
435     @property
436     def compressed(self):
437         """Return the shorthand version of the IP address as a string."""
438         return str(self)
439
440
441 class _BaseIP(_IPAddrBase):
442
443     """A generic IP object.
444
445     This IP class contains the version independent methods which are
446     used by single IP addresses.
447
448     """
449
450     def __eq__(self, other):
451         try:
452             return (self._ip == other._ip
453                     and self._version == other._version)
454         except AttributeError:
455             return NotImplemented
456
457     def __ne__(self, other):
458         eq = self.__eq__(other)
459         if eq is NotImplemented:
460             return NotImplemented
461         return not eq
462
463     def __le__(self, other):
464         gt = self.__gt__(other)
465         if gt is NotImplemented:
466             return NotImplemented
467         return not gt
468
469     def __ge__(self, other):
470         lt = self.__lt__(other)
471         if lt is NotImplemented:
472             return NotImplemented
473         return not lt
474
475     def __lt__(self, other):
476         if self._version != other._version:
477             raise TypeError('%s and %s are not of the same version' % (
478                     str(self), str(other)))
479         if not isinstance(other, _BaseIP):
480             raise TypeError('%s and %s are not of the same type' % (
481                     str(self), str(other)))
482         if self._ip != other._ip:
483             return self._ip < other._ip
484         return False
485
486     def __gt__(self, other):
487         if self._version != other._version:
488             raise TypeError('%s and %s are not of the same version' % (
489                     str(self), str(other)))
490         if not isinstance(other, _BaseIP):
491             raise TypeError('%s and %s are not of the same type' % (
492                     str(self), str(other)))
493         if self._ip != other._ip:
494             return self._ip > other._ip
495         return False
496
497     # Shorthand for Integer addition and subtraction. This is not
498     # meant to ever support addition/subtraction of addresses.
499     def __add__(self, other):
500         if not isinstance(other, int):
501             return NotImplemented
502         return IPAddress(int(self) + other, version=self._version)
503
504     def __sub__(self, other):
505         if not isinstance(other, int):
506             return NotImplemented
507         return IPAddress(int(self) - other, version=self._version)
508
509     def __repr__(self):
510         return '%s(%r)' % (self.__class__.__name__, str(self))
511
512     def __str__(self):
513         return  '%s' % self._string_from_ip_int(self._ip)
514
515     def __hash__(self):
516         return hash(hex(long(self._ip)))
517
518     def _get_address_key(self):
519         return (self._version, self)
520
521     @property
522     def version(self):
523         raise NotImplementedError('BaseIP has no version')
524
525
526 class _BaseNet(_IPAddrBase):
527
528     """A generic IP object.
529
530     This IP class contains the version independent methods which are
531     used by networks.
532
533     """
534
535     def __init__(self, address):
536         self._cache = {}
537
538     def __repr__(self):
539         return '%s(%r)' % (self.__class__.__name__, str(self))
540
541     def iterhosts(self):
542         """Generate Iterator over usable hosts in a network.
543
544            This is like __iter__ except it doesn't return the network
545            or broadcast addresses.
546
547         """
548         cur = int(self.network) + 1
549         bcast = int(self.broadcast) - 1
550         while cur <= bcast:
551             cur += 1
552             yield IPAddress(cur - 1, version=self._version)
553
554     def __iter__(self):
555         cur = int(self.network)
556         bcast = int(self.broadcast)
557         while cur <= bcast:
558             cur += 1
559             yield IPAddress(cur - 1, version=self._version)
560
561     def __getitem__(self, n):
562         network = int(self.network)
563         broadcast = int(self.broadcast)
564         if n >= 0:
565             if network + n > broadcast:
566                 raise IndexError
567             return IPAddress(network + n, version=self._version)
568         else:
569             n += 1
570             if broadcast + n < network:
571                 raise IndexError
572             return IPAddress(broadcast + n, version=self._version)
573
574     def __lt__(self, other):
575         if self._version != other._version:
576             raise TypeError('%s and %s are not of the same version' % (
577                     str(self), str(other)))
578         if not isinstance(other, _BaseNet):
579             raise TypeError('%s and %s are not of the same type' % (
580                     str(self), str(other)))
581         if self.network != other.network:
582             return self.network < other.network
583         if self.netmask != other.netmask:
584             return self.netmask < other.netmask
585         return False
586
587     def __gt__(self, other):
588         if self._version != other._version:
589             raise TypeError('%s and %s are not of the same version' % (
590                     str(self), str(other)))
591         if not isinstance(other, _BaseNet):
592             raise TypeError('%s and %s are not of the same type' % (
593                     str(self), str(other)))
594         if self.network != other.network:
595             return self.network > other.network
596         if self.netmask != other.netmask:
597             return self.netmask > other.netmask
598         return False
599
600     def __le__(self, other):
601         gt = self.__gt__(other)
602         if gt is NotImplemented:
603             return NotImplemented
604         return not gt
605
606     def __ge__(self, other):
607         lt = self.__lt__(other)
608         if lt is NotImplemented:
609             return NotImplemented
610         return not lt
611
612     def __eq__(self, other):
613         try:
614             return (self._version == other._version
615                     and self.network == other.network
616                     and int(self.netmask) == int(other.netmask))
617         except AttributeError:
618             if isinstance(other, _BaseIP):
619                 return (self._version == other._version
620                         and self._ip == other._ip)
621
622     def __ne__(self, other):
623         eq = self.__eq__(other)
624         if eq is NotImplemented:
625             return NotImplemented
626         return not eq
627
628     def __str__(self):
629         return  '%s/%s' % (str(self.ip),
630                            str(self._prefixlen))
631
632     def __hash__(self):
633         return hash(int(self.network) ^ int(self.netmask))
634
635     def __contains__(self, other):
636         # always false if one is v4 and the other is v6.
637         if self._version != other._version:
638           return False
639         # dealing with another network.
640         if isinstance(other, _BaseNet):
641             return (self.network <= other.network and
642                     self.broadcast >= other.broadcast)
643         # dealing with another address
644         else:
645             return (int(self.network) <= int(other._ip) <=
646                     int(self.broadcast))
647
648     def overlaps(self, other):
649         """Tell if self is partly contained in other."""
650         return self.network in other or self.broadcast in other or (
651             other.network in self or other.broadcast in self)
652
653     @property
654     def network(self):
655         x = self._cache.get('network')
656         if x is None:
657             x = IPAddress(self._ip & int(self.netmask), version=self._version)
658             self._cache['network'] = x
659         return x
660
661     @property
662     def broadcast(self):
663         x = self._cache.get('broadcast')
664         if x is None:
665             x = IPAddress(self._ip | int(self.hostmask), version=self._version)
666             self._cache['broadcast'] = x
667         return x
668
669     @property
670     def hostmask(self):
671         x = self._cache.get('hostmask')
672         if x is None:
673             x = IPAddress(int(self.netmask) ^ self._ALL_ONES,
674                           version=self._version)
675             self._cache['hostmask'] = x
676         return x
677
678     @property
679     def with_prefixlen(self):
680         return '%s/%d' % (str(self.ip), self._prefixlen)
681
682     @property
683     def with_netmask(self):
684         return '%s/%s' % (str(self.ip), str(self.netmask))
685
686     @property
687     def with_hostmask(self):
688         return '%s/%s' % (str(self.ip), str(self.hostmask))
689
690     @property
691     def numhosts(self):
692         """Number of hosts in the current subnet."""
693         return int(self.broadcast) - int(self.network) + 1
694
695     @property
696     def version(self):
697         raise NotImplementedError('BaseNet has no version')
698
699     @property
700     def prefixlen(self):
701         return self._prefixlen
702
703     def address_exclude(self, other):
704         """Remove an address from a larger block.
705
706         For example:
707
708             addr1 = IPNetwork('10.1.1.0/24')
709             addr2 = IPNetwork('10.1.1.0/26')
710             addr1.address_exclude(addr2) =
711                 [IPNetwork('10.1.1.64/26'), IPNetwork('10.1.1.128/25')]
712
713         or IPv6:
714
715             addr1 = IPNetwork('::1/32')
716             addr2 = IPNetwork('::1/128')
717             addr1.address_exclude(addr2) = [IPNetwork('::0/128'),
718                 IPNetwork('::2/127'),
719                 IPNetwork('::4/126'),
720                 IPNetwork('::8/125'),
721                 ...
722                 IPNetwork('0:0:8000::/33')]
723
724         Args:
725             other: An IPvXNetwork object of the same type.
726
727         Returns:
728             A sorted list of IPvXNetwork objects addresses which is self
729             minus other.
730
731         Raises:
732             TypeError: If self and other are of difffering address
733               versions, or if other is not a network object.
734             ValueError: If other is not completely contained by self.
735
736         """
737         if not self._version == other._version:
738             raise TypeError("%s and %s are not of the same version" % (
739                 str(self), str(other)))
740
741         if not isinstance(other, _BaseNet):
742             raise TypeError("%s is not a network object" % str(other))
743
744         if other not in self:
745             raise ValueError('%s not contained in %s' % (str(other),
746                                                          str(self)))
747         if other == self:
748             return []
749
750         ret_addrs = []
751
752         # Make sure we're comparing the network of other.
753         other = IPNetwork('%s/%s' % (str(other.network), str(other.prefixlen)),
754                    version=other._version)
755
756         s1, s2 = self.subnet()
757         while s1 != other and s2 != other:
758             if other in s1:
759                 ret_addrs.append(s2)
760                 s1, s2 = s1.subnet()
761             elif other in s2:
762                 ret_addrs.append(s1)
763                 s1, s2 = s2.subnet()
764             else:
765                 # If we got here, there's a bug somewhere.
766                 assert True == False, ('Error performing exclusion: '
767                                        's1: %s s2: %s other: %s' %
768                                        (str(s1), str(s2), str(other)))
769         if s1 == other:
770             ret_addrs.append(s2)
771         elif s2 == other:
772             ret_addrs.append(s1)
773         else:
774             # If we got here, there's a bug somewhere.
775             assert True == False, ('Error performing exclusion: '
776                                    's1: %s s2: %s other: %s' %
777                                    (str(s1), str(s2), str(other)))
778
779         return sorted(ret_addrs, key=_BaseNet._get_networks_key)
780
781     def compare_networks(self, other):
782         """Compare two IP objects.
783
784         This is only concerned about the comparison of the integer
785         representation of the network addresses.  This means that the
786         host bits aren't considered at all in this method.  If you want
787         to compare host bits, you can easily enough do a
788         'HostA._ip < HostB._ip'
789
790         Args:
791             other: An IP object.
792
793         Returns:
794             If the IP versions of self and other are the same, returns:
795
796             -1 if self < other:
797               eg: IPv4('1.1.1.0/24') < IPv4('1.1.2.0/24')
798               IPv6('1080::200C:417A') < IPv6('1080::200B:417B')
799             0 if self == other
800               eg: IPv4('1.1.1.1/24') == IPv4('1.1.1.2/24')
801               IPv6('1080::200C:417A/96') == IPv6('1080::200C:417B/96')
802             1 if self > other
803               eg: IPv4('1.1.1.0/24') > IPv4('1.1.0.0/24')
804               IPv6('1080::1:200C:417A/112') >
805               IPv6('1080::0:200C:417A/112')
806
807             If the IP versions of self and other are different, returns:
808
809             -1 if self._version < other._version
810               eg: IPv4('10.0.0.1/24') < IPv6('::1/128')
811             1 if self._version > other._version
812               eg: IPv6('::1/128') > IPv4('255.255.255.0/24')
813
814         """
815         if self._version < other._version:
816             return -1
817         if self._version > other._version:
818             return 1
819         # self._version == other._version below here:
820         if self.network < other.network:
821             return -1
822         if self.network > other.network:
823             return 1
824         # self.network == other.network below here:
825         if self.netmask < other.netmask:
826             return -1
827         if self.netmask > other.netmask:
828             return 1
829         # self.network == other.network and self.netmask == other.netmask
830         return 0
831
832     def _get_networks_key(self):
833         """Network-only key function.
834
835         Returns an object that identifies this address' network and
836         netmask. This function is a suitable "key" argument for sorted()
837         and list.sort().
838
839         """
840         return (self._version, self.network, self.netmask)
841
842     def _ip_int_from_prefix(self, prefixlen=None):
843         """Turn the prefix length netmask into a int for comparison.
844
845         Args:
846             prefixlen: An integer, the prefix length.
847
848         Returns:
849             An integer.
850
851         """
852         if not prefixlen and prefixlen != 0:
853             prefixlen = self._prefixlen
854         return self._ALL_ONES ^ (self._ALL_ONES >> prefixlen)
855
856     def _prefix_from_ip_int(self, ip_int, mask=32):
857         """Return prefix length from the decimal netmask.
858
859         Args:
860             ip_int: An integer, the IP address.
861             mask: The netmask.  Defaults to 32.
862
863         Returns:
864             An integer, the prefix length.
865
866         """
867         while mask:
868             if ip_int & 1 == 1:
869                 break
870             ip_int >>= 1
871             mask -= 1
872
873         return mask
874
875     def _ip_string_from_prefix(self, prefixlen=None):
876         """Turn a prefix length into a dotted decimal string.
877
878         Args:
879             prefixlen: An integer, the netmask prefix length.
880
881         Returns:
882             A string, the dotted decimal netmask string.
883
884         """
885         if not prefixlen:
886             prefixlen = self._prefixlen
887         return self._string_from_ip_int(self._ip_int_from_prefix(prefixlen))
888
889     def iter_subnets(self, prefixlen_diff=1, new_prefix=None):
890         """The subnets which join to make the current subnet.
891
892         In the case that self contains only one IP
893         (self._prefixlen == 32 for IPv4 or self._prefixlen == 128
894         for IPv6), return a list with just ourself.
895
896         Args:
897             prefixlen_diff: An integer, the amount the prefix length
898               should be increased by. This should not be set if
899               new_prefix is also set.
900             new_prefix: The desired new prefix length. This must be a
901               larger number (smaller prefix) than the existing prefix.
902               This should not be set if prefixlen_diff is also set.
903
904         Returns:
905             An iterator of IPv(4|6) objects.
906
907         Raises:
908             ValueError: The prefixlen_diff is too small or too large.
909                 OR
910             prefixlen_diff and new_prefix are both set or new_prefix
911               is a smaller number than the current prefix (smaller
912               number means a larger network)
913
914         """
915         if self._prefixlen == self._max_prefixlen:
916             yield self
917             return
918
919         if new_prefix is not None:
920             if new_prefix < self._prefixlen:
921                 raise ValueError('new prefix must be longer')
922             if prefixlen_diff != 1:
923                 raise ValueError('cannot set prefixlen_diff and new_prefix')
924             prefixlen_diff = new_prefix - self._prefixlen
925
926         if prefixlen_diff < 0:
927             raise ValueError('prefix length diff must be > 0')
928         new_prefixlen = self._prefixlen + prefixlen_diff
929
930         if not self._is_valid_netmask(str(new_prefixlen)):
931             raise ValueError(
932                 'prefix length diff %d is invalid for netblock %s' % (
933                     new_prefixlen, str(self)))
934
935         first = IPNetwork('%s/%s' % (str(self.network),
936                                      str(self._prefixlen + prefixlen_diff)),
937                          version=self._version)
938
939         yield first
940         current = first
941         while True:
942             broadcast = current.broadcast
943             if broadcast == self.broadcast:
944                 return
945             new_addr = IPAddress(int(broadcast) + 1, version=self._version)
946             current = IPNetwork('%s/%s' % (str(new_addr), str(new_prefixlen)),
947                                 version=self._version)
948
949             yield current
950
951     def masked(self):
952         """Return the network object with the host bits masked out."""
953         return IPNetwork('%s/%d' % (self.network, self._prefixlen),
954                          version=self._version)
955
956     def subnet(self, prefixlen_diff=1, new_prefix=None):
957         """Return a list of subnets, rather than an iterator."""
958         return list(self.iter_subnets(prefixlen_diff, new_prefix))
959
960     def supernet(self, prefixlen_diff=1, new_prefix=None):
961         """The supernet containing the current network.
962
963         Args:
964             prefixlen_diff: An integer, the amount the prefix length of
965               the network should be decreased by.  For example, given a
966               /24 network and a prefixlen_diff of 3, a supernet with a
967               /21 netmask is returned.
968
969         Returns:
970             An IPv4 network object.
971
972         Raises:
973             ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have a
974               negative prefix length.
975                 OR
976             If prefixlen_diff and new_prefix are both set or new_prefix is a
977               larger number than the current prefix (larger number means a
978               smaller network)
979
980         """
981         if self._prefixlen == 0:
982             return self
983
984         if new_prefix is not None:
985             if new_prefix > self._prefixlen:
986                 raise ValueError('new prefix must be shorter')
987             if prefixlen_diff != 1:
988                 raise ValueError('cannot set prefixlen_diff and new_prefix')
989             prefixlen_diff = self._prefixlen - new_prefix
990
991
992         if self.prefixlen - prefixlen_diff < 0:
993             raise ValueError(
994                 'current prefixlen is %d, cannot have a prefixlen_diff of %d' %
995                 (self.prefixlen, prefixlen_diff))
996         return IPNetwork('%s/%s' % (str(self.network),
997                                     str(self.prefixlen - prefixlen_diff)),
998                          version=self._version)
999
1000     # backwards compatibility
1001     Subnet = subnet
1002     Supernet = supernet
1003     AddressExclude = address_exclude
1004     CompareNetworks = compare_networks
1005     Contains = __contains__
1006
1007
1008 class _BaseV4(object):
1009
1010     """Base IPv4 object.
1011
1012     The following methods are used by IPv4 objects in both single IP
1013     addresses and networks.
1014
1015     """
1016
1017     # Equivalent to 255.255.255.255 or 32 bits of 1's.
1018     _ALL_ONES = (2**IPV4LENGTH) - 1
1019     _DECIMAL_DIGITS = frozenset('0123456789')
1020
1021     def __init__(self, address):
1022         self._version = 4
1023         self._max_prefixlen = IPV4LENGTH
1024
1025     def _explode_shorthand_ip_string(self):
1026         return str(self)
1027
1028     def _ip_int_from_string(self, ip_str):
1029         """Turn the given IP string into an integer for comparison.
1030
1031         Args:
1032             ip_str: A string, the IP ip_str.
1033
1034         Returns:
1035             The IP ip_str as an integer.
1036
1037         Raises:
1038             AddressValueError: if ip_str isn't a valid IPv4 Address.
1039
1040         """
1041         octets = ip_str.split('.')
1042         if len(octets) != 4:
1043             raise AddressValueError(ip_str)
1044
1045         packed_ip = 0
1046         for oc in octets:
1047             try:
1048                 packed_ip = (packed_ip << 8) | self._parse_octet(oc)
1049             except ValueError:
1050                 raise AddressValueError(ip_str)
1051         return packed_ip
1052
1053     def _parse_octet(self, octet_str):
1054         """Convert a decimal octet into an integer.
1055
1056         Args:
1057             octet_str: A string, the number to parse.
1058
1059         Returns:
1060             The octet as an integer.
1061
1062         Raises:
1063             ValueError: if the octet isn't strictly a decimal from [0..255].
1064
1065         """
1066         # Whitelist the characters, since int() allows a lot of bizarre stuff.
1067         if not self._DECIMAL_DIGITS.issuperset(octet_str):
1068             raise ValueError
1069         octet_int = int(octet_str, 10)
1070         # Disallow leading zeroes, because no clear standard exists on
1071         # whether these should be interpreted as decimal or octal.
1072         if octet_int > 255 or (octet_str[0] == '0' and len(octet_str) > 1):
1073             raise ValueError
1074         return octet_int
1075
1076     def _string_from_ip_int(self, ip_int):
1077         """Turns a 32-bit integer into dotted decimal notation.
1078
1079         Args:
1080             ip_int: An integer, the IP address.
1081
1082         Returns:
1083             The IP address as a string in dotted decimal notation.
1084
1085         """
1086         octets = []
1087         for _ in xrange(4):
1088             octets.insert(0, str(ip_int & 0xFF))
1089             ip_int >>= 8
1090         return '.'.join(octets)
1091
1092     @property
1093     def max_prefixlen(self):
1094         return self._max_prefixlen
1095
1096     @property
1097     def packed(self):
1098         """The binary representation of this address."""
1099         return v4_int_to_packed(self._ip)
1100
1101     @property
1102     def version(self):
1103         return self._version
1104
1105     @property
1106     def is_reserved(self):
1107        """Test if the address is otherwise IETF reserved.
1108
1109         Returns:
1110             A boolean, True if the address is within the
1111             reserved IPv4 Network range.
1112
1113        """
1114        return self in IPv4Network('240.0.0.0/4')
1115
1116     @property
1117     def is_private(self):
1118         """Test if this address is allocated for private networks.
1119
1120         Returns:
1121             A boolean, True if the address is reserved per RFC 1918.
1122
1123         """
1124         return (self in IPv4Network('10.0.0.0/8') or
1125                 self in IPv4Network('172.16.0.0/12') or
1126                 self in IPv4Network('192.168.0.0/16'))
1127
1128     @property
1129     def is_multicast(self):
1130         """Test if the address is reserved for multicast use.
1131
1132         Returns:
1133             A boolean, True if the address is multicast.
1134             See RFC 3171 for details.
1135
1136         """
1137         return self in IPv4Network('224.0.0.0/4')
1138
1139     @property
1140     def is_unspecified(self):
1141         """Test if the address is unspecified.
1142
1143         Returns:
1144             A boolean, True if this is the unspecified address as defined in
1145             RFC 5735 3.
1146
1147         """
1148         return self in IPv4Network('0.0.0.0')
1149
1150     @property
1151     def is_loopback(self):
1152         """Test if the address is a loopback address.
1153
1154         Returns:
1155             A boolean, True if the address is a loopback per RFC 3330.
1156
1157         """
1158         return self in IPv4Network('127.0.0.0/8')
1159
1160     @property
1161     def is_link_local(self):
1162         """Test if the address is reserved for link-local.
1163
1164         Returns:
1165             A boolean, True if the address is link-local per RFC 3927.
1166
1167         """
1168         return self in IPv4Network('169.254.0.0/16')
1169
1170
1171 class IPv4Address(_BaseV4, _BaseIP):
1172
1173     """Represent and manipulate single IPv4 Addresses."""
1174
1175     def __init__(self, address):
1176
1177         """
1178         Args:
1179             address: A string or integer representing the IP
1180               '192.168.1.1'
1181
1182               Additionally, an integer can be passed, so
1183               IPv4Address('192.168.1.1') == IPv4Address(3232235777).
1184               or, more generally
1185               IPv4Address(int(IPv4Address('192.168.1.1'))) ==
1186                 IPv4Address('192.168.1.1')
1187
1188         Raises:
1189             AddressValueError: If ipaddr isn't a valid IPv4 address.
1190
1191         """
1192         _BaseV4.__init__(self, address)
1193
1194         # Efficient constructor from integer.
1195         if isinstance(address, (int, long)):
1196             self._ip = address
1197             if address < 0 or address > self._ALL_ONES:
1198                 raise AddressValueError(address)
1199             return
1200
1201         # Constructing from a packed address
1202         if isinstance(address, Bytes):
1203             try:
1204                 self._ip, = struct.unpack('!I', address)
1205             except struct.error:
1206                 raise AddressValueError(address)  # Wrong length.
1207             return
1208
1209         # Assume input argument to be string or any object representation
1210         # which converts into a formatted IP string.
1211         addr_str = str(address)
1212         self._ip = self._ip_int_from_string(addr_str)
1213
1214
1215 class IPv4Network(_BaseV4, _BaseNet):
1216
1217     """This class represents and manipulates 32-bit IPv4 networks.
1218
1219     Attributes: [examples for IPv4Network('1.2.3.4/27')]
1220         ._ip: 16909060
1221         .ip: IPv4Address('1.2.3.4')
1222         .network: IPv4Address('1.2.3.0')
1223         .hostmask: IPv4Address('0.0.0.31')
1224         .broadcast: IPv4Address('1.2.3.31')
1225         .netmask: IPv4Address('255.255.255.224')
1226         .prefixlen: 27
1227
1228     """
1229
1230     # the valid octets for host and netmasks. only useful for IPv4.
1231     _valid_mask_octets = set((255, 254, 252, 248, 240, 224, 192, 128, 0))
1232
1233     def __init__(self, address, strict=False):
1234         """Instantiate a new IPv4 network object.
1235
1236         Args:
1237             address: A string or integer representing the IP [& network].
1238               '192.168.1.1/24'
1239               '192.168.1.1/255.255.255.0'
1240               '192.168.1.1/0.0.0.255'
1241               are all functionally the same in IPv4. Similarly,
1242               '192.168.1.1'
1243               '192.168.1.1/255.255.255.255'
1244               '192.168.1.1/32'
1245               are also functionaly equivalent. That is to say, failing to
1246               provide a subnetmask will create an object with a mask of /32.
1247
1248               If the mask (portion after the / in the argument) is given in
1249               dotted quad form, it is treated as a netmask if it starts with a
1250               non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it
1251               starts with a zero field (e.g. 0.255.255.255 == /8), with the
1252               single exception of an all-zero mask which is treated as a
1253               netmask == /0. If no mask is given, a default of /32 is used.
1254
1255               Additionally, an integer can be passed, so
1256               IPv4Network('192.168.1.1') == IPv4Network(3232235777).
1257               or, more generally
1258               IPv4Network(int(IPv4Network('192.168.1.1'))) ==
1259                 IPv4Network('192.168.1.1')
1260
1261             strict: A boolean. If true, ensure that we have been passed
1262               A true network address, eg, 192.168.1.0/24 and not an
1263               IP address on a network, eg, 192.168.1.1/24.
1264
1265         Raises:
1266             AddressValueError: If ipaddr isn't a valid IPv4 address.
1267             NetmaskValueError: If the netmask isn't valid for
1268               an IPv4 address.
1269             ValueError: If strict was True and a network address was not
1270               supplied.
1271
1272         """
1273         _BaseNet.__init__(self, address)
1274         _BaseV4.__init__(self, address)
1275
1276         # Constructing from an integer or packed bytes.
1277         if isinstance(address, (int, long, Bytes)):
1278             self.ip = IPv4Address(address)
1279             self._ip = self.ip._ip
1280             self._prefixlen = self._max_prefixlen
1281             self.netmask = IPv4Address(self._ALL_ONES)
1282             return
1283
1284         # Assume input argument to be string or any object representation
1285         # which converts into a formatted IP prefix string.
1286         addr = str(address).split('/')
1287
1288         if len(addr) > 2:
1289             raise AddressValueError(address)
1290
1291         self._ip = self._ip_int_from_string(addr[0])
1292         self.ip = IPv4Address(self._ip)
1293
1294         if len(addr) == 2:
1295             mask = addr[1].split('.')
1296             if len(mask) == 4:
1297                 # We have dotted decimal netmask.
1298                 if self._is_valid_netmask(addr[1]):
1299                     self.netmask = IPv4Address(self._ip_int_from_string(
1300                             addr[1]))
1301                 elif self._is_hostmask(addr[1]):
1302                     self.netmask = IPv4Address(
1303                         self._ip_int_from_string(addr[1]) ^ self._ALL_ONES)
1304                 else:
1305                     raise NetmaskValueError('%s is not a valid netmask'
1306                                                      % addr[1])
1307
1308                 self._prefixlen = self._prefix_from_ip_int(int(self.netmask))
1309             else:
1310                 # We have a netmask in prefix length form.
1311                 if not self._is_valid_netmask(addr[1]):
1312                     raise NetmaskValueError(addr[1])
1313                 self._prefixlen = int(addr[1])
1314                 self.netmask = IPv4Address(self._ip_int_from_prefix(
1315                     self._prefixlen))
1316         else:
1317             self._prefixlen = self._max_prefixlen
1318             self.netmask = IPv4Address(self._ip_int_from_prefix(
1319                 self._prefixlen))
1320         if strict:
1321             if self.ip != self.network:
1322                 raise ValueError('%s has host bits set' %
1323                                  self.ip)
1324         if self._prefixlen == (self._max_prefixlen - 1):
1325             self.iterhosts = self.__iter__
1326
1327     def _is_hostmask(self, ip_str):
1328         """Test if the IP string is a hostmask (rather than a netmask).
1329
1330         Args:
1331             ip_str: A string, the potential hostmask.
1332
1333         Returns:
1334             A boolean, True if the IP string is a hostmask.
1335
1336         """
1337         bits = ip_str.split('.')
1338         try:
1339             parts = [int(x) for x in bits if int(x) in self._valid_mask_octets]
1340         except ValueError:
1341             return False
1342         if len(parts) != len(bits):
1343             return False
1344         if parts[0] < parts[-1]:
1345             return True
1346         return False
1347
1348     def _is_valid_netmask(self, netmask):
1349         """Verify that the netmask is valid.
1350
1351         Args:
1352             netmask: A string, either a prefix or dotted decimal
1353               netmask.
1354
1355         Returns:
1356             A boolean, True if the prefix represents a valid IPv4
1357             netmask.
1358
1359         """
1360         mask = netmask.split('.')
1361         if len(mask) == 4:
1362             if [x for x in mask if int(x) not in self._valid_mask_octets]:
1363                 return False
1364             if [y for idx, y in enumerate(mask) if idx > 0 and
1365                 y > mask[idx - 1]]:
1366                 return False
1367             return True
1368         try:
1369             netmask = int(netmask)
1370         except ValueError:
1371             return False
1372         return 0 <= netmask <= self._max_prefixlen
1373
1374     # backwards compatibility
1375     IsRFC1918 = lambda self: self.is_private
1376     IsMulticast = lambda self: self.is_multicast
1377     IsLoopback = lambda self: self.is_loopback
1378     IsLinkLocal = lambda self: self.is_link_local
1379
1380
1381 class _BaseV6(object):
1382
1383     """Base IPv6 object.
1384
1385     The following methods are used by IPv6 objects in both single IP
1386     addresses and networks.
1387
1388     """
1389
1390     _ALL_ONES = (2**IPV6LENGTH) - 1
1391     _HEXTET_COUNT = 8
1392     _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef')
1393
1394     def __init__(self, address):
1395         self._version = 6
1396         self._max_prefixlen = IPV6LENGTH
1397
1398     def _ip_int_from_string(self, ip_str):
1399         """Turn an IPv6 ip_str into an integer.
1400
1401         Args:
1402             ip_str: A string, the IPv6 ip_str.
1403
1404         Returns:
1405             A long, the IPv6 ip_str.
1406
1407         Raises:
1408             AddressValueError: if ip_str isn't a valid IPv6 Address.
1409
1410         """
1411         parts = ip_str.split(':')
1412
1413         # An IPv6 address needs at least 2 colons (3 parts).
1414         if len(parts) < 3:
1415             raise AddressValueError(ip_str)
1416
1417         # If the address has an IPv4-style suffix, convert it to hexadecimal.
1418         if '.' in parts[-1]:
1419             ipv4_int = IPv4Address(parts.pop())._ip
1420             parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF))
1421             parts.append('%x' % (ipv4_int & 0xFFFF))
1422
1423         # An IPv6 address can't have more than 8 colons (9 parts).
1424         if len(parts) > self._HEXTET_COUNT + 1:
1425             raise AddressValueError(ip_str)
1426
1427         # Disregarding the endpoints, find '::' with nothing in between.
1428         # This indicates that a run of zeroes has been skipped.
1429         try:
1430             skip_index, = (
1431                 [i for i in xrange(1, len(parts) - 1) if not parts[i]] or
1432                 [None])
1433         except ValueError:
1434             # Can't have more than one '::'
1435             raise AddressValueError(ip_str)
1436
1437         # parts_hi is the number of parts to copy from above/before the '::'
1438         # parts_lo is the number of parts to copy from below/after the '::'
1439         if skip_index is not None:
1440             # If we found a '::', then check if it also covers the endpoints.
1441             parts_hi = skip_index
1442             parts_lo = len(parts) - skip_index - 1
1443             if not parts[0]:
1444                 parts_hi -= 1
1445                 if parts_hi:
1446                     raise AddressValueError(ip_str)  # ^: requires ^::
1447             if not parts[-1]:
1448                 parts_lo -= 1
1449                 if parts_lo:
1450                     raise AddressValueError(ip_str)  # :$ requires ::$
1451             parts_skipped = self._HEXTET_COUNT - (parts_hi + parts_lo)
1452             if parts_skipped < 1:
1453                 raise AddressValueError(ip_str)
1454         else:
1455             # Otherwise, allocate the entire address to parts_hi.  The endpoints
1456             # could still be empty, but _parse_hextet() will check for that.
1457             if len(parts) != self._HEXTET_COUNT:
1458                 raise AddressValueError(ip_str)
1459             parts_hi = len(parts)
1460             parts_lo = 0
1461             parts_skipped = 0
1462
1463         try:
1464             # Now, parse the hextets into a 128-bit integer.
1465             ip_int = 0L
1466             for i in xrange(parts_hi):
1467                 ip_int <<= 16
1468                 ip_int |= self._parse_hextet(parts[i])
1469             ip_int <<= 16 * parts_skipped
1470             for i in xrange(-parts_lo, 0):
1471                 ip_int <<= 16
1472                 ip_int |= self._parse_hextet(parts[i])
1473             return ip_int
1474         except ValueError:
1475             raise AddressValueError(ip_str)
1476
1477     def _parse_hextet(self, hextet_str):
1478         """Convert an IPv6 hextet string into an integer.
1479
1480         Args:
1481             hextet_str: A string, the number to parse.
1482
1483         Returns:
1484             The hextet as an integer.
1485
1486         Raises:
1487             ValueError: if the input isn't strictly a hex number from [0..FFFF].
1488
1489         """
1490         # Whitelist the characters, since int() allows a lot of bizarre stuff.
1491         if not self._HEX_DIGITS.issuperset(hextet_str):
1492             raise ValueError
1493         hextet_int = int(hextet_str, 16)
1494         if hextet_int > 0xFFFF:
1495             raise ValueError
1496         return hextet_int
1497
1498     def _compress_hextets(self, hextets):
1499         """Compresses a list of hextets.
1500
1501         Compresses a list of strings, replacing the longest continuous
1502         sequence of "0" in the list with "" and adding empty strings at
1503         the beginning or at the end of the string such that subsequently
1504         calling ":".join(hextets) will produce the compressed version of
1505         the IPv6 address.
1506
1507         Args:
1508             hextets: A list of strings, the hextets to compress.
1509
1510         Returns:
1511             A list of strings.
1512
1513         """
1514         best_doublecolon_start = -1
1515         best_doublecolon_len = 0
1516         doublecolon_start = -1
1517         doublecolon_len = 0
1518         for index in range(len(hextets)):
1519             if hextets[index] == '0':
1520                 doublecolon_len += 1
1521                 if doublecolon_start == -1:
1522                     # Start of a sequence of zeros.
1523                     doublecolon_start = index
1524                 if doublecolon_len > best_doublecolon_len:
1525                     # This is the longest sequence of zeros so far.
1526                     best_doublecolon_len = doublecolon_len
1527                     best_doublecolon_start = doublecolon_start
1528             else:
1529                 doublecolon_len = 0
1530                 doublecolon_start = -1
1531
1532         if best_doublecolon_len > 1:
1533             best_doublecolon_end = (best_doublecolon_start +
1534                                     best_doublecolon_len)
1535             # For zeros at the end of the address.
1536             if best_doublecolon_end == len(hextets):
1537                 hextets += ['']
1538             hextets[best_doublecolon_start:best_doublecolon_end] = ['']
1539             # For zeros at the beginning of the address.
1540             if best_doublecolon_start == 0:
1541                 hextets = [''] + hextets
1542
1543         return hextets
1544
1545     def _string_from_ip_int(self, ip_int=None):
1546         """Turns a 128-bit integer into hexadecimal notation.
1547
1548         Args:
1549             ip_int: An integer, the IP address.
1550
1551         Returns:
1552             A string, the hexadecimal representation of the address.
1553
1554         Raises:
1555             ValueError: The address is bigger than 128 bits of all ones.
1556
1557         """
1558         if not ip_int and ip_int != 0:
1559             ip_int = int(self._ip)
1560
1561         if ip_int > self._ALL_ONES:
1562             raise ValueError('IPv6 address is too large')
1563
1564         hex_str = '%032x' % ip_int
1565         hextets = []
1566         for x in range(0, 32, 4):
1567             hextets.append('%x' % int(hex_str[x:x+4], 16))
1568
1569         hextets = self._compress_hextets(hextets)
1570         return ':'.join(hextets)
1571
1572     def _explode_shorthand_ip_string(self):
1573         """Expand a shortened IPv6 address.
1574
1575         Args:
1576             ip_str: A string, the IPv6 address.
1577
1578         Returns:
1579             A string, the expanded IPv6 address.
1580
1581         """
1582         if isinstance(self, _BaseNet):
1583             ip_str = str(self.ip)
1584         else:
1585             ip_str = str(self)
1586
1587         ip_int = self._ip_int_from_string(ip_str)
1588         parts = []
1589         for i in xrange(self._HEXTET_COUNT):
1590             parts.append('%04x' % (ip_int & 0xFFFF))
1591             ip_int >>= 16
1592         parts.reverse()
1593         if isinstance(self, _BaseNet):
1594             return '%s/%d' % (':'.join(parts), self.prefixlen)
1595         return ':'.join(parts)
1596
1597     @property
1598     def max_prefixlen(self):
1599         return self._max_prefixlen
1600
1601     @property
1602     def packed(self):
1603         """The binary representation of this address."""
1604         return v6_int_to_packed(self._ip)
1605
1606     @property
1607     def version(self):
1608         return self._version
1609
1610     @property
1611     def is_multicast(self):
1612         """Test if the address is reserved for multicast use.
1613
1614         Returns:
1615             A boolean, True if the address is a multicast address.
1616             See RFC 2373 2.7 for details.
1617
1618         """
1619         return self in IPv6Network('ff00::/8')
1620
1621     @property
1622     def is_reserved(self):
1623         """Test if the address is otherwise IETF reserved.
1624
1625         Returns:
1626             A boolean, True if the address is within one of the
1627             reserved IPv6 Network ranges.
1628
1629         """
1630         return (self in IPv6Network('::/8') or
1631                 self in IPv6Network('100::/8') or
1632                 self in IPv6Network('200::/7') or
1633                 self in IPv6Network('400::/6') or
1634                 self in IPv6Network('800::/5') or
1635                 self in IPv6Network('1000::/4') or
1636                 self in IPv6Network('4000::/3') or
1637                 self in IPv6Network('6000::/3') or
1638                 self in IPv6Network('8000::/3') or
1639                 self in IPv6Network('A000::/3') or
1640                 self in IPv6Network('C000::/3') or
1641                 self in IPv6Network('E000::/4') or
1642                 self in IPv6Network('F000::/5') or
1643                 self in IPv6Network('F800::/6') or
1644                 self in IPv6Network('FE00::/9'))
1645
1646     @property
1647     def is_unspecified(self):
1648         """Test if the address is unspecified.
1649
1650         Returns:
1651             A boolean, True if this is the unspecified address as defined in
1652             RFC 2373 2.5.2.
1653
1654         """
1655         return self._ip == 0 and getattr(self, '_prefixlen', 128) == 128
1656
1657     @property
1658     def is_loopback(self):
1659         """Test if the address is a loopback address.
1660
1661         Returns:
1662             A boolean, True if the address is a loopback address as defined in
1663             RFC 2373 2.5.3.
1664
1665         """
1666         return self._ip == 1 and getattr(self, '_prefixlen', 128) == 128
1667
1668     @property
1669     def is_link_local(self):
1670         """Test if the address is reserved for link-local.
1671
1672         Returns:
1673             A boolean, True if the address is reserved per RFC 4291.
1674
1675         """
1676         return self in IPv6Network('fe80::/10')
1677
1678     @property
1679     def is_site_local(self):
1680         """Test if the address is reserved for site-local.
1681
1682         Note that the site-local address space has been deprecated by RFC 3879.
1683         Use is_private to test if this address is in the space of unique local
1684         addresses as defined by RFC 4193.
1685
1686         Returns:
1687             A boolean, True if the address is reserved per RFC 3513 2.5.6.
1688
1689         """
1690         return self in IPv6Network('fec0::/10')
1691
1692     @property
1693     def is_private(self):
1694         """Test if this address is allocated for private networks.
1695
1696         Returns:
1697             A boolean, True if the address is reserved per RFC 4193.
1698
1699         """
1700         return self in IPv6Network('fc00::/7')
1701
1702     @property
1703     def ipv4_mapped(self):
1704         """Return the IPv4 mapped address.
1705
1706         Returns:
1707             If the IPv6 address is a v4 mapped address, return the
1708             IPv4 mapped address. Return None otherwise.
1709
1710         """
1711         if (self._ip >> 32) != 0xFFFF:
1712             return None
1713         return IPv4Address(self._ip & 0xFFFFFFFF)
1714
1715     @property
1716     def teredo(self):
1717         """Tuple of embedded teredo IPs.
1718
1719         Returns:
1720             Tuple of the (server, client) IPs or None if the address
1721             doesn't appear to be a teredo address (doesn't start with
1722             2001::/32)
1723
1724         """
1725         if (self._ip >> 96) != 0x20010000:
1726             return None
1727         return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF),
1728                 IPv4Address(~self._ip & 0xFFFFFFFF))
1729
1730     @property
1731     def sixtofour(self):
1732         """Return the IPv4 6to4 embedded address.
1733
1734         Returns:
1735             The IPv4 6to4-embedded address if present or None if the
1736             address doesn't appear to contain a 6to4 embedded address.
1737
1738         """
1739         if (self._ip >> 112) != 0x2002:
1740             return None
1741         return IPv4Address((self._ip >> 80) & 0xFFFFFFFF)
1742
1743
1744 class IPv6Address(_BaseV6, _BaseIP):
1745
1746     """Represent and manipulate single IPv6 Addresses.
1747     """
1748
1749     def __init__(self, address):
1750         """Instantiate a new IPv6 address object.
1751
1752         Args:
1753             address: A string or integer representing the IP
1754
1755               Additionally, an integer can be passed, so
1756               IPv6Address('2001:4860::') ==
1757                 IPv6Address(42541956101370907050197289607612071936L).
1758               or, more generally
1759               IPv6Address(IPv6Address('2001:4860::')._ip) ==
1760                 IPv6Address('2001:4860::')
1761
1762         Raises:
1763             AddressValueError: If address isn't a valid IPv6 address.
1764
1765         """
1766         _BaseV6.__init__(self, address)
1767
1768         # Efficient constructor from integer.
1769         if isinstance(address, (int, long)):
1770             self._ip = address
1771             if address < 0 or address > self._ALL_ONES:
1772                 raise AddressValueError(address)
1773             return
1774
1775         # Constructing from a packed address
1776         if isinstance(address, Bytes):
1777             try:
1778                 hi, lo = struct.unpack('!QQ', address)
1779             except struct.error:
1780                 raise AddressValueError(address)  # Wrong length.
1781             self._ip = (hi << 64) | lo
1782             return
1783
1784         # Assume input argument to be string or any object representation
1785         # which converts into a formatted IP string.
1786         addr_str = str(address)
1787         if not addr_str:
1788             raise AddressValueError('')
1789
1790         self._ip = self._ip_int_from_string(addr_str)
1791
1792
1793 class IPv6Network(_BaseV6, _BaseNet):
1794
1795     """This class represents and manipulates 128-bit IPv6 networks.
1796
1797     Attributes: [examples for IPv6('2001:658:22A:CAFE:200::1/64')]
1798         .ip: IPv6Address('2001:658:22a:cafe:200::1')
1799         .network: IPv6Address('2001:658:22a:cafe::')
1800         .hostmask: IPv6Address('::ffff:ffff:ffff:ffff')
1801         .broadcast: IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff')
1802         .netmask: IPv6Address('ffff:ffff:ffff:ffff::')
1803         .prefixlen: 64
1804
1805     """
1806
1807
1808     def __init__(self, address, strict=False):
1809         """Instantiate a new IPv6 Network object.
1810
1811         Args:
1812             address: A string or integer representing the IPv6 network or the IP
1813               and prefix/netmask.
1814               '2001:4860::/128'
1815               '2001:4860:0000:0000:0000:0000:0000:0000/128'
1816               '2001:4860::'
1817               are all functionally the same in IPv6.  That is to say,
1818               failing to provide a subnetmask will create an object with
1819               a mask of /128.
1820
1821               Additionally, an integer can be passed, so
1822               IPv6Network('2001:4860::') ==
1823                 IPv6Network(42541956101370907050197289607612071936L).
1824               or, more generally
1825               IPv6Network(IPv6Network('2001:4860::')._ip) ==
1826                 IPv6Network('2001:4860::')
1827
1828             strict: A boolean. If true, ensure that we have been passed
1829               A true network address, eg, 192.168.1.0/24 and not an
1830               IP address on a network, eg, 192.168.1.1/24.
1831
1832         Raises:
1833             AddressValueError: If address isn't a valid IPv6 address.
1834             NetmaskValueError: If the netmask isn't valid for
1835               an IPv6 address.
1836             ValueError: If strict was True and a network address was not
1837               supplied.
1838
1839         """
1840         _BaseNet.__init__(self, address)
1841         _BaseV6.__init__(self, address)
1842
1843         # Constructing from an integer or packed bytes.
1844         if isinstance(address, (int, long, Bytes)):
1845             self.ip = IPv6Address(address)
1846             self._ip = self.ip._ip
1847             self._prefixlen = self._max_prefixlen
1848             self.netmask = IPv6Address(self._ALL_ONES)
1849             return
1850
1851         # Assume input argument to be string or any object representation
1852         # which converts into a formatted IP prefix string.
1853         addr = str(address).split('/')
1854
1855         if len(addr) > 2:
1856             raise AddressValueError(address)
1857
1858         self._ip = self._ip_int_from_string(addr[0])
1859         self.ip = IPv6Address(self._ip)
1860
1861         if len(addr) == 2:
1862             if self._is_valid_netmask(addr[1]):
1863                 self._prefixlen = int(addr[1])
1864             else:
1865                 raise NetmaskValueError(addr[1])
1866         else:
1867             self._prefixlen = self._max_prefixlen
1868
1869         self.netmask = IPv6Address(self._ip_int_from_prefix(self._prefixlen))
1870
1871         if strict:
1872             if self.ip != self.network:
1873                 raise ValueError('%s has host bits set' %
1874                                  self.ip)
1875         if self._prefixlen == (self._max_prefixlen - 1):
1876             self.iterhosts = self.__iter__
1877
1878     def _is_valid_netmask(self, prefixlen):
1879         """Verify that the netmask/prefixlen is valid.
1880
1881         Args:
1882             prefixlen: A string, the netmask in prefix length format.
1883
1884         Returns:
1885             A boolean, True if the prefix represents a valid IPv6
1886             netmask.
1887
1888         """
1889         try:
1890             prefixlen = int(prefixlen)
1891         except ValueError:
1892             return False
1893         return 0 <= prefixlen <= self._max_prefixlen
1894
1895     @property
1896     def with_netmask(self):
1897         return self.with_prefixlen