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