blob: bec504c4cd3f7559368bb1549d019fc7de8c1be9 [file] [log] [blame]
Nick Coghlandc9b2552012-05-20 21:01:57 +10001# Copyright 2007 Google Inc.
2# Licensed to PSF under a Contributor Agreement.
Nick Coghlandc9b2552012-05-20 21:01:57 +10003
4"""A fast, lightweight IPv4/IPv6 manipulation library in Python.
5
6This library is used to create/poke/manipulate IPv4 and IPv6 addresses
7and networks.
8
9"""
10
11__version__ = '1.0'
12
Hynek Schlawack91c5a342012-06-05 11:55:58 +020013
Nick Coghlandc9b2552012-05-20 21:01:57 +100014import struct
15
Hynek Schlawack91c5a342012-06-05 11:55:58 +020016
Nick Coghlandc9b2552012-05-20 21:01:57 +100017IPV4LENGTH = 32
18IPV6LENGTH = 128
19
20
21class AddressValueError(ValueError):
22 """A Value Error related to the address."""
23
24
25class NetmaskValueError(ValueError):
26 """A Value Error related to the netmask."""
27
28
Nick Coghlan51c30672012-05-27 00:25:58 +100029def ip_address(address):
Nick Coghlandc9b2552012-05-20 21:01:57 +100030 """Take an IP string/int and return an object of the correct type.
31
32 Args:
33 address: A string or integer, the IP address. Either IPv4 or
34 IPv6 addresses may be supplied; integers less than 2**32 will
35 be considered to be IPv4 by default.
Nick Coghlandc9b2552012-05-20 21:01:57 +100036
37 Returns:
38 An IPv4Address or IPv6Address object.
39
40 Raises:
Sandro Tosi876ecad2012-05-23 22:26:55 +020041 ValueError: if the *address* passed isn't either a v4 or a v6
Nick Coghlan51c30672012-05-27 00:25:58 +100042 address
Nick Coghlandc9b2552012-05-20 21:01:57 +100043
44 """
Nick Coghlandc9b2552012-05-20 21:01:57 +100045 try:
46 return IPv4Address(address)
47 except (AddressValueError, NetmaskValueError):
48 pass
49
50 try:
51 return IPv6Address(address)
52 except (AddressValueError, NetmaskValueError):
53 pass
54
55 raise ValueError('%r does not appear to be an IPv4 or IPv6 address' %
56 address)
57
58
Nick Coghlan51c30672012-05-27 00:25:58 +100059def ip_network(address, strict=True):
Nick Coghlandc9b2552012-05-20 21:01:57 +100060 """Take an IP string/int and return an object of the correct type.
61
62 Args:
63 address: A string or integer, the IP network. Either IPv4 or
64 IPv6 networks may be supplied; integers less than 2**32 will
65 be considered to be IPv4 by default.
Nick Coghlandc9b2552012-05-20 21:01:57 +100066
67 Returns:
68 An IPv4Network or IPv6Network object.
69
70 Raises:
71 ValueError: if the string passed isn't either a v4 or a v6
Nick Coghlan51c30672012-05-27 00:25:58 +100072 address. Or if the network has host bits set.
Nick Coghlandc9b2552012-05-20 21:01:57 +100073
74 """
Nick Coghlandc9b2552012-05-20 21:01:57 +100075 try:
76 return IPv4Network(address, strict)
77 except (AddressValueError, NetmaskValueError):
78 pass
79
80 try:
81 return IPv6Network(address, strict)
82 except (AddressValueError, NetmaskValueError):
83 pass
84
85 raise ValueError('%r does not appear to be an IPv4 or IPv6 network' %
86 address)
87
88
Nick Coghlan51c30672012-05-27 00:25:58 +100089def ip_interface(address):
Nick Coghlandc9b2552012-05-20 21:01:57 +100090 """Take an IP string/int and return an object of the correct type.
91
92 Args:
93 address: A string or integer, the IP address. Either IPv4 or
94 IPv6 addresses may be supplied; integers less than 2**32 will
95 be considered to be IPv4 by default.
Nick Coghlandc9b2552012-05-20 21:01:57 +100096
97 Returns:
Sandro Tosi876ecad2012-05-23 22:26:55 +020098 An IPv4Interface or IPv6Interface object.
Nick Coghlandc9b2552012-05-20 21:01:57 +100099
100 Raises:
101 ValueError: if the string passed isn't either a v4 or a v6
Nick Coghlan51c30672012-05-27 00:25:58 +1000102 address.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000103
104 Notes:
105 The IPv?Interface classes describe an Address on a particular
106 Network, so they're basically a combination of both the Address
107 and Network classes.
Sandro Tosib95c6342012-05-23 23:17:22 +0200108
Nick Coghlandc9b2552012-05-20 21:01:57 +1000109 """
Nick Coghlandc9b2552012-05-20 21:01:57 +1000110 try:
111 return IPv4Interface(address)
112 except (AddressValueError, NetmaskValueError):
113 pass
114
115 try:
116 return IPv6Interface(address)
117 except (AddressValueError, NetmaskValueError):
118 pass
119
120 raise ValueError('%r does not appear to be an IPv4 or IPv6 network' %
121 address)
122
123
124def v4_int_to_packed(address):
Sandro Tosi876ecad2012-05-23 22:26:55 +0200125 """Represent an address as 4 packed bytes in network (big-endian) order.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000126
127 Args:
128 address: An integer representation of an IPv4 IP address.
129
130 Returns:
Sandro Tosi876ecad2012-05-23 22:26:55 +0200131 The integer address packed as 4 bytes in network (big-endian) order.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000132
133 Raises:
Sandro Tosi876ecad2012-05-23 22:26:55 +0200134 ValueError: If the integer is negative or too large to be an
135 IPv4 IP address.
Sandro Tosib95c6342012-05-23 23:17:22 +0200136
Nick Coghlandc9b2552012-05-20 21:01:57 +1000137 """
Sandro Tosi876ecad2012-05-23 22:26:55 +0200138 try:
139 return struct.pack('!I', address)
140 except:
141 raise ValueError("Address negative or too large for IPv4")
Nick Coghlandc9b2552012-05-20 21:01:57 +1000142
143
144def v6_int_to_packed(address):
Sandro Tosi876ecad2012-05-23 22:26:55 +0200145 """Represent an address as 16 packed bytes in network (big-endian) order.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000146
147 Args:
Sandro Tosib4386d32012-06-02 17:14:22 +0200148 address: An integer representation of an IPv6 IP address.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000149
150 Returns:
Sandro Tosi876ecad2012-05-23 22:26:55 +0200151 The integer address packed as 16 bytes in network (big-endian) order.
Sandro Tosib95c6342012-05-23 23:17:22 +0200152
Nick Coghlandc9b2552012-05-20 21:01:57 +1000153 """
Sandro Tosi876ecad2012-05-23 22:26:55 +0200154 try:
155 return struct.pack('!QQ', address >> 64, address & (2**64 - 1))
156 except:
157 raise ValueError("Address negative or too large for IPv6")
Nick Coghlandc9b2552012-05-20 21:01:57 +1000158
159
160def _find_address_range(addresses):
Sandro Tosi876ecad2012-05-23 22:26:55 +0200161 """Find a sequence of IPv#Address.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000162
163 Args:
Sandro Tosi876ecad2012-05-23 22:26:55 +0200164 addresses: a list of IPv#Address objects.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000165
166 Returns:
167 A tuple containing the first and last IP addresses in the sequence.
168
169 """
170 first = last = addresses[0]
171 for ip in addresses[1:]:
172 if ip._ip == last._ip + 1:
173 last = ip
174 else:
175 break
176 return (first, last)
177
Sandro Tosib95c6342012-05-23 23:17:22 +0200178
Nick Coghlandc9b2552012-05-20 21:01:57 +1000179def _get_prefix_length(number1, number2, bits):
180 """Get the number of leading bits that are same for two numbers.
181
182 Args:
183 number1: an integer.
184 number2: another integer.
185 bits: the maximum number of bits to compare.
186
187 Returns:
188 The number of leading bits that are the same for two numbers.
189
190 """
191 for i in range(bits):
192 if number1 >> i == number2 >> i:
193 return bits - i
194 return 0
195
Sandro Tosib95c6342012-05-23 23:17:22 +0200196
Nick Coghlandc9b2552012-05-20 21:01:57 +1000197def _count_righthand_zero_bits(number, bits):
198 """Count the number of zero bits on the right hand side.
199
200 Args:
201 number: an integer.
202 bits: maximum number of bits to count.
203
204 Returns:
205 The number of zero bits on the right hand side of the number.
206
207 """
208 if number == 0:
209 return bits
210 for i in range(bits):
211 if (number >> i) % 2:
212 return i
213
214
215def summarize_address_range(first, last):
216 """Summarize a network range given the first and last IP addresses.
217
218 Example:
219 >>> summarize_address_range(IPv4Address('192.0.2.0'),
220 IPv4Address('192.0.2.130'))
221 [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'),
222 IPv4Network('192.0.2.130/32')]
223
224 Args:
225 first: the first IPv4Address or IPv6Address in the range.
226 last: the last IPv4Address or IPv6Address in the range.
227
228 Returns:
229 An iterator of the summarized IPv(4|6) network objects.
230
231 Raise:
232 TypeError:
233 If the first and last objects are not IP addresses.
234 If the first and last objects are not the same version.
235 ValueError:
236 If the last object is not greater than the first.
Nick Coghlan51c30672012-05-27 00:25:58 +1000237 If the version of the first address is not 4 or 6.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000238
239 """
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200240 if (not (isinstance(first, _BaseAddress) and
241 isinstance(last, _BaseAddress))):
Nick Coghlandc9b2552012-05-20 21:01:57 +1000242 raise TypeError('first and last must be IP addresses, not networks')
243 if first.version != last.version:
244 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000245 first, last))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000246 if first > last:
247 raise ValueError('last IP address must be greater than first')
248
Nick Coghlandc9b2552012-05-20 21:01:57 +1000249 if first.version == 4:
250 ip = IPv4Network
251 elif first.version == 6:
252 ip = IPv6Network
253 else:
254 raise ValueError('unknown IP version')
255
256 ip_bits = first._max_prefixlen
257 first_int = first._ip
258 last_int = last._ip
259 while first_int <= last_int:
260 nbits = _count_righthand_zero_bits(first_int, ip_bits)
261 current = None
262 while nbits >= 0:
263 addend = 2**nbits - 1
264 current = first_int + addend
265 nbits -= 1
266 if current <= last_int:
267 break
268 prefix = _get_prefix_length(first_int, current, ip_bits)
Nick Coghlan912238e2012-07-07 13:34:50 +1000269 net = ip('%s/%d' % (first, prefix))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000270 yield net
Nick Coghlandc9b2552012-05-20 21:01:57 +1000271 if current == ip._ALL_ONES:
272 break
273 first_int = current + 1
Nick Coghlan51c30672012-05-27 00:25:58 +1000274 first = first.__class__(first_int)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000275
Sandro Tosib95c6342012-05-23 23:17:22 +0200276
Nick Coghlandc9b2552012-05-20 21:01:57 +1000277def _collapse_addresses_recursive(addresses):
278 """Loops through the addresses, collapsing concurrent netblocks.
279
280 Example:
281
282 ip1 = IPv4Network('192.0.2.0/26')
283 ip2 = IPv4Network('192.0.2.64/26')
284 ip3 = IPv4Network('192.0.2.128/26')
285 ip4 = IPv4Network('192.0.2.192/26')
286
287 _collapse_addresses_recursive([ip1, ip2, ip3, ip4]) ->
288 [IPv4Network('192.0.2.0/24')]
289
290 This shouldn't be called directly; it is called via
291 collapse_addresses([]).
292
293 Args:
294 addresses: A list of IPv4Network's or IPv6Network's
295
296 Returns:
297 A list of IPv4Network's or IPv6Network's depending on what we were
298 passed.
299
300 """
301 ret_array = []
302 optimized = False
303
304 for cur_addr in addresses:
305 if not ret_array:
306 ret_array.append(cur_addr)
307 continue
308 if (cur_addr.network_address >= ret_array[-1].network_address and
309 cur_addr.broadcast_address <= ret_array[-1].broadcast_address):
310 optimized = True
311 elif cur_addr == list(ret_array[-1].supernet().subnets())[1]:
312 ret_array.append(ret_array.pop().supernet())
313 optimized = True
314 else:
315 ret_array.append(cur_addr)
316
317 if optimized:
318 return _collapse_addresses_recursive(ret_array)
319
320 return ret_array
321
322
323def collapse_addresses(addresses):
324 """Collapse a list of IP objects.
325
326 Example:
327 collapse_addresses([IPv4Network('192.0.2.0/25'),
328 IPv4Network('192.0.2.128/25')]) ->
329 [IPv4Network('192.0.2.0/24')]
330
331 Args:
332 addresses: An iterator of IPv4Network or IPv6Network objects.
333
334 Returns:
335 An iterator of the collapsed IPv(4|6)Network objects.
336
337 Raises:
338 TypeError: If passed a list of mixed version objects.
339
340 """
341 i = 0
342 addrs = []
343 ips = []
344 nets = []
345
346 # split IP addresses and networks
347 for ip in addresses:
348 if isinstance(ip, _BaseAddress):
349 if ips and ips[-1]._version != ip._version:
350 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000351 ip, ips[-1]))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000352 ips.append(ip)
353 elif ip._prefixlen == ip._max_prefixlen:
354 if ips and ips[-1]._version != ip._version:
355 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000356 ip, ips[-1]))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000357 try:
358 ips.append(ip.ip)
359 except AttributeError:
360 ips.append(ip.network_address)
361 else:
362 if nets and nets[-1]._version != ip._version:
363 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000364 ip, nets[-1]))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000365 nets.append(ip)
366
367 # sort and dedup
368 ips = sorted(set(ips))
369 nets = sorted(set(nets))
370
371 while i < len(ips):
372 (first, last) = _find_address_range(ips[i:])
373 i = ips.index(last) + 1
374 addrs.extend(summarize_address_range(first, last))
375
376 return iter(_collapse_addresses_recursive(sorted(
377 addrs + nets, key=_BaseNetwork._get_networks_key)))
378
379
380def get_mixed_type_key(obj):
381 """Return a key suitable for sorting between networks and addresses.
382
383 Address and Network objects are not sortable by default; they're
384 fundamentally different so the expression
385
386 IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')
387
388 doesn't make any sense. There are some times however, where you may wish
389 to have ipaddress sort these for you anyway. If you need to do this, you
390 can use this function as the key= argument to sorted().
391
392 Args:
393 obj: either a Network or Address object.
394 Returns:
395 appropriate key.
396
397 """
398 if isinstance(obj, _BaseNetwork):
399 return obj._get_networks_key()
400 elif isinstance(obj, _BaseAddress):
401 return obj._get_address_key()
402 return NotImplemented
403
404
Hynek Schlawackc4b78a32012-06-01 11:48:32 +0200405class _IPAddressBase:
Nick Coghlandc9b2552012-05-20 21:01:57 +1000406
407 """The mother class."""
408
409 @property
410 def exploded(self):
411 """Return the longhand version of the IP address as a string."""
412 return self._explode_shorthand_ip_string()
413
414 @property
415 def compressed(self):
416 """Return the shorthand version of the IP address as a string."""
417 return str(self)
418
Nick Coghland9722652012-06-17 16:33:00 +1000419 @property
420 def version(self):
421 msg = '%200s has no version specified' % (type(self),)
422 raise NotImplementedError(msg)
423
Nick Coghlandc9b2552012-05-20 21:01:57 +1000424 def _ip_int_from_prefix(self, prefixlen=None):
425 """Turn the prefix length netmask into a int for comparison.
426
427 Args:
428 prefixlen: An integer, the prefix length.
429
430 Returns:
431 An integer.
432
433 """
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200434 if prefixlen is None:
Nick Coghlandc9b2552012-05-20 21:01:57 +1000435 prefixlen = self._prefixlen
436 return self._ALL_ONES ^ (self._ALL_ONES >> prefixlen)
437
438 def _prefix_from_ip_int(self, ip_int, mask=32):
439 """Return prefix length from the decimal netmask.
440
441 Args:
442 ip_int: An integer, the IP address.
443 mask: The netmask. Defaults to 32.
444
445 Returns:
446 An integer, the prefix length.
447
448 """
449 while mask:
450 if ip_int & 1 == 1:
451 break
452 ip_int >>= 1
453 mask -= 1
454
455 return mask
456
457 def _ip_string_from_prefix(self, prefixlen=None):
458 """Turn a prefix length into a dotted decimal string.
459
460 Args:
461 prefixlen: An integer, the netmask prefix length.
462
463 Returns:
464 A string, the dotted decimal netmask string.
465
466 """
467 if not prefixlen:
468 prefixlen = self._prefixlen
469 return self._string_from_ip_int(self._ip_int_from_prefix(prefixlen))
470
471
472class _BaseAddress(_IPAddressBase):
473
474 """A generic IP object.
475
476 This IP class contains the version independent methods which are
477 used by single IP addresses.
478
479 """
480
481 def __init__(self, address):
482 if (not isinstance(address, bytes)
483 and '/' in str(address)):
484 raise AddressValueError(address)
485
486 def __index__(self):
487 return self._ip
488
489 def __int__(self):
490 return self._ip
491
Nick Coghlandc9b2552012-05-20 21:01:57 +1000492 def __eq__(self, other):
493 try:
494 return (self._ip == other._ip
495 and self._version == other._version)
496 except AttributeError:
497 return NotImplemented
498
499 def __ne__(self, other):
500 eq = self.__eq__(other)
501 if eq is NotImplemented:
502 return NotImplemented
503 return not eq
504
505 def __le__(self, other):
506 gt = self.__gt__(other)
507 if gt is NotImplemented:
508 return NotImplemented
509 return not gt
510
511 def __ge__(self, other):
512 lt = self.__lt__(other)
513 if lt is NotImplemented:
514 return NotImplemented
515 return not lt
516
517 def __lt__(self, other):
518 if self._version != other._version:
519 raise TypeError('%s and %s are not of the same version' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000520 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000521 if not isinstance(other, _BaseAddress):
522 raise TypeError('%s and %s are not of the same type' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000523 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000524 if self._ip != other._ip:
525 return self._ip < other._ip
526 return False
527
528 def __gt__(self, other):
529 if self._version != other._version:
530 raise TypeError('%s and %s are not of the same version' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000531 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000532 if not isinstance(other, _BaseAddress):
533 raise TypeError('%s and %s are not of the same type' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000534 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000535 if self._ip != other._ip:
536 return self._ip > other._ip
537 return False
538
539 # Shorthand for Integer addition and subtraction. This is not
540 # meant to ever support addition/subtraction of addresses.
541 def __add__(self, other):
542 if not isinstance(other, int):
543 return NotImplemented
Nick Coghlan51c30672012-05-27 00:25:58 +1000544 return self.__class__(int(self) + other)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000545
546 def __sub__(self, other):
547 if not isinstance(other, int):
548 return NotImplemented
Nick Coghlan51c30672012-05-27 00:25:58 +1000549 return self.__class__(int(self) - other)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000550
551 def __repr__(self):
552 return '%s(%r)' % (self.__class__.__name__, str(self))
553
554 def __str__(self):
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200555 return str(self._string_from_ip_int(self._ip))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000556
557 def __hash__(self):
558 return hash(hex(int(self._ip)))
559
560 def _get_address_key(self):
561 return (self._version, self)
562
Nick Coghlandc9b2552012-05-20 21:01:57 +1000563
564class _BaseNetwork(_IPAddressBase):
565
Nick Coghlan51c30672012-05-27 00:25:58 +1000566 """A generic IP network object.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000567
568 This IP class contains the version independent methods which are
569 used by networks.
570
571 """
Nick Coghlandc9b2552012-05-20 21:01:57 +1000572 def __init__(self, address):
573 self._cache = {}
574
575 def __index__(self):
576 return int(self.network_address) ^ self.prefixlen
577
578 def __int__(self):
579 return int(self.network_address)
580
581 def __repr__(self):
582 return '%s(%r)' % (self.__class__.__name__, str(self))
583
Hynek Schlawack454a74d2012-06-04 18:14:02 +0200584 def __str__(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000585 return '%s/%d' % (self.network_address, self.prefixlen)
Hynek Schlawack454a74d2012-06-04 18:14:02 +0200586
Nick Coghlandc9b2552012-05-20 21:01:57 +1000587 def hosts(self):
588 """Generate Iterator over usable hosts in a network.
589
Sandro Tosib95c6342012-05-23 23:17:22 +0200590 This is like __iter__ except it doesn't return the network
591 or broadcast addresses.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000592
593 """
594 cur = int(self.network_address) + 1
595 bcast = int(self.broadcast_address) - 1
596 while cur <= bcast:
597 cur += 1
Nick Coghlan51c30672012-05-27 00:25:58 +1000598 yield self._address_class(cur - 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000599
600 def __iter__(self):
601 cur = int(self.network_address)
602 bcast = int(self.broadcast_address)
603 while cur <= bcast:
604 cur += 1
Nick Coghlan51c30672012-05-27 00:25:58 +1000605 yield self._address_class(cur - 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000606
607 def __getitem__(self, n):
608 network = int(self.network_address)
609 broadcast = int(self.broadcast_address)
610 if n >= 0:
611 if network + n > broadcast:
612 raise IndexError
Nick Coghlan51c30672012-05-27 00:25:58 +1000613 return self._address_class(network + n)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000614 else:
615 n += 1
616 if broadcast + n < network:
617 raise IndexError
Nick Coghlan51c30672012-05-27 00:25:58 +1000618 return self._address_class(broadcast + n)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000619
620 def __lt__(self, other):
621 if self._version != other._version:
622 raise TypeError('%s and %s are not of the same version' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000623 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000624 if not isinstance(other, _BaseNetwork):
625 raise TypeError('%s and %s are not of the same type' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000626 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000627 if self.network_address != other.network_address:
628 return self.network_address < other.network_address
629 if self.netmask != other.netmask:
630 return self.netmask < other.netmask
631 return False
632
633 def __gt__(self, other):
634 if self._version != other._version:
635 raise TypeError('%s and %s are not of the same version' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000636 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000637 if not isinstance(other, _BaseNetwork):
638 raise TypeError('%s and %s are not of the same type' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000639 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000640 if self.network_address != other.network_address:
641 return self.network_address > other.network_address
642 if self.netmask != other.netmask:
643 return self.netmask > other.netmask
644 return False
645
646 def __le__(self, other):
647 gt = self.__gt__(other)
648 if gt is NotImplemented:
649 return NotImplemented
650 return not gt
651
652 def __ge__(self, other):
653 lt = self.__lt__(other)
654 if lt is NotImplemented:
655 return NotImplemented
656 return not lt
657
658 def __eq__(self, other):
659 if not isinstance(other, _BaseNetwork):
660 raise TypeError('%s and %s are not of the same type' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000661 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000662 return (self._version == other._version and
663 self.network_address == other.network_address and
664 int(self.netmask) == int(other.netmask))
665
666 def __ne__(self, other):
667 eq = self.__eq__(other)
668 if eq is NotImplemented:
669 return NotImplemented
670 return not eq
671
Nick Coghlandc9b2552012-05-20 21:01:57 +1000672 def __hash__(self):
673 return hash(int(self.network_address) ^ int(self.netmask))
674
675 def __contains__(self, other):
676 # always false if one is v4 and the other is v6.
677 if self._version != other._version:
678 return False
679 # dealing with another network.
680 if isinstance(other, _BaseNetwork):
681 return False
682 # dealing with another address
683 else:
684 # address
685 return (int(self.network_address) <= int(other._ip) <=
686 int(self.broadcast_address))
687
688 def overlaps(self, other):
689 """Tell if self is partly contained in other."""
690 return self.network_address in other or (
691 self.broadcast_address in other or (
692 other.network_address in self or (
693 other.broadcast_address in self)))
694
695 @property
696 def broadcast_address(self):
697 x = self._cache.get('broadcast_address')
698 if x is None:
Nick Coghlan51c30672012-05-27 00:25:58 +1000699 x = self._address_class(int(self.network_address) |
700 int(self.hostmask))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000701 self._cache['broadcast_address'] = x
702 return x
703
704 @property
705 def hostmask(self):
706 x = self._cache.get('hostmask')
707 if x is None:
Nick Coghlan51c30672012-05-27 00:25:58 +1000708 x = self._address_class(int(self.netmask) ^ self._ALL_ONES)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000709 self._cache['hostmask'] = x
710 return x
711
712 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +1000713 def with_prefixlen(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000714 return '%s/%d' % (self.network_address, self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000715
716 @property
717 def with_netmask(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000718 return '%s/%s' % (self.network_address, self.netmask)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000719
720 @property
721 def with_hostmask(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000722 return '%s/%s' % (self.network_address, self.hostmask)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000723
724 @property
725 def num_addresses(self):
726 """Number of hosts in the current subnet."""
727 return int(self.broadcast_address) - int(self.network_address) + 1
728
729 @property
Nick Coghlan51c30672012-05-27 00:25:58 +1000730 def _address_class(self):
Nick Coghland9722652012-06-17 16:33:00 +1000731 # Returning bare address objects (rather than interfaces) allows for
732 # more consistent behaviour across the network address, broadcast
733 # address and individual host addresses.
734 msg = '%200s has no associated address class' % (type(self),)
735 raise NotImplementedError(msg)
Nick Coghlan51c30672012-05-27 00:25:58 +1000736
737 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +1000738 def prefixlen(self):
739 return self._prefixlen
740
741 def address_exclude(self, other):
742 """Remove an address from a larger block.
743
744 For example:
745
746 addr1 = ip_network('192.0.2.0/28')
747 addr2 = ip_network('192.0.2.1/32')
748 addr1.address_exclude(addr2) =
749 [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'),
750 IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')]
751
752 or IPv6:
753
754 addr1 = ip_network('2001:db8::1/32')
755 addr2 = ip_network('2001:db8::1/128')
756 addr1.address_exclude(addr2) =
757 [ip_network('2001:db8::1/128'),
758 ip_network('2001:db8::2/127'),
759 ip_network('2001:db8::4/126'),
760 ip_network('2001:db8::8/125'),
761 ...
762 ip_network('2001:db8:8000::/33')]
763
764 Args:
765 other: An IPv4Network or IPv6Network object of the same type.
766
767 Returns:
768 An iterator of the the IPv(4|6)Network objects which is self
769 minus other.
770
771 Raises:
772 TypeError: If self and other are of difffering address
773 versions, or if other is not a network object.
774 ValueError: If other is not completely contained by self.
775
776 """
777 if not self._version == other._version:
778 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000779 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000780
781 if not isinstance(other, _BaseNetwork):
Nick Coghlan912238e2012-07-07 13:34:50 +1000782 raise TypeError("%s is not a network object" % other)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000783
784 if not (other.network_address >= self.network_address and
785 other.broadcast_address <= self.broadcast_address):
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200786 raise ValueError('%s not contained in %s' % (other, self))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000787 if other == self:
788 raise StopIteration
789
Nick Coghlandc9b2552012-05-20 21:01:57 +1000790 # Make sure we're comparing the network of other.
Nick Coghlan912238e2012-07-07 13:34:50 +1000791 other = other.__class__('%s/%s' % (other.network_address,
792 other.prefixlen))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000793
794 s1, s2 = self.subnets()
795 while s1 != other and s2 != other:
796 if (other.network_address >= s1.network_address and
797 other.broadcast_address <= s1.broadcast_address):
798 yield s2
799 s1, s2 = s1.subnets()
800 elif (other.network_address >= s2.network_address and
801 other.broadcast_address <= s2.broadcast_address):
802 yield s1
803 s1, s2 = s2.subnets()
804 else:
805 # If we got here, there's a bug somewhere.
806 raise AssertionError('Error performing exclusion: '
807 's1: %s s2: %s other: %s' %
Nick Coghlan912238e2012-07-07 13:34:50 +1000808 (s1, s2, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000809 if s1 == other:
810 yield s2
811 elif s2 == other:
812 yield s1
813 else:
814 # If we got here, there's a bug somewhere.
815 raise AssertionError('Error performing exclusion: '
816 's1: %s s2: %s other: %s' %
Nick Coghlan912238e2012-07-07 13:34:50 +1000817 (s1, s2, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000818
819 def compare_networks(self, other):
820 """Compare two IP objects.
821
822 This is only concerned about the comparison of the integer
823 representation of the network addresses. This means that the
824 host bits aren't considered at all in this method. If you want
825 to compare host bits, you can easily enough do a
826 'HostA._ip < HostB._ip'
827
828 Args:
829 other: An IP object.
830
831 Returns:
832 If the IP versions of self and other are the same, returns:
833
834 -1 if self < other:
835 eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25')
836 IPv6Network('2001:db8::1000/124') <
837 IPv6Network('2001:db8::2000/124')
838 0 if self == other
839 eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24')
840 IPv6Network('2001:db8::1000/124') ==
841 IPv6Network('2001:db8::1000/124')
842 1 if self > other
843 eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25')
844 IPv6Network('2001:db8::2000/124') >
845 IPv6Network('2001:db8::1000/124')
846
847 Raises:
848 TypeError if the IP versions are different.
849
850 """
851 # does this need to raise a ValueError?
852 if self._version != other._version:
853 raise TypeError('%s and %s are not of the same type' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000854 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000855 # self._version == other._version below here:
856 if self.network_address < other.network_address:
857 return -1
858 if self.network_address > other.network_address:
859 return 1
860 # self.network_address == other.network_address below here:
861 if self.netmask < other.netmask:
862 return -1
863 if self.netmask > other.netmask:
864 return 1
865 return 0
866
867 def _get_networks_key(self):
868 """Network-only key function.
869
870 Returns an object that identifies this address' network and
871 netmask. This function is a suitable "key" argument for sorted()
872 and list.sort().
873
874 """
875 return (self._version, self.network_address, self.netmask)
876
877 def subnets(self, prefixlen_diff=1, new_prefix=None):
878 """The subnets which join to make the current subnet.
879
880 In the case that self contains only one IP
881 (self._prefixlen == 32 for IPv4 or self._prefixlen == 128
882 for IPv6), yield an iterator with just ourself.
883
884 Args:
885 prefixlen_diff: An integer, the amount the prefix length
886 should be increased by. This should not be set if
887 new_prefix is also set.
888 new_prefix: The desired new prefix length. This must be a
889 larger number (smaller prefix) than the existing prefix.
890 This should not be set if prefixlen_diff is also set.
891
892 Returns:
893 An iterator of IPv(4|6) objects.
894
895 Raises:
896 ValueError: The prefixlen_diff is too small or too large.
897 OR
898 prefixlen_diff and new_prefix are both set or new_prefix
899 is a smaller number than the current prefix (smaller
900 number means a larger network)
901
902 """
903 if self._prefixlen == self._max_prefixlen:
904 yield self
905 return
906
907 if new_prefix is not None:
908 if new_prefix < self._prefixlen:
909 raise ValueError('new prefix must be longer')
910 if prefixlen_diff != 1:
911 raise ValueError('cannot set prefixlen_diff and new_prefix')
912 prefixlen_diff = new_prefix - self._prefixlen
913
914 if prefixlen_diff < 0:
915 raise ValueError('prefix length diff must be > 0')
916 new_prefixlen = self._prefixlen + prefixlen_diff
917
918 if not self._is_valid_netmask(str(new_prefixlen)):
919 raise ValueError(
920 'prefix length diff %d is invalid for netblock %s' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000921 new_prefixlen, self))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000922
Nick Coghlan51c30672012-05-27 00:25:58 +1000923 first = self.__class__('%s/%s' %
Nick Coghlan912238e2012-07-07 13:34:50 +1000924 (self.network_address,
925 self._prefixlen + prefixlen_diff))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000926
927 yield first
928 current = first
929 while True:
930 broadcast = current.broadcast_address
931 if broadcast == self.broadcast_address:
932 return
Nick Coghlan51c30672012-05-27 00:25:58 +1000933 new_addr = self._address_class(int(broadcast) + 1)
Nick Coghlan912238e2012-07-07 13:34:50 +1000934 current = self.__class__('%s/%s' % (new_addr,
935 new_prefixlen))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000936
937 yield current
938
Nick Coghlandc9b2552012-05-20 21:01:57 +1000939 def supernet(self, prefixlen_diff=1, new_prefix=None):
940 """The supernet containing the current network.
941
942 Args:
943 prefixlen_diff: An integer, the amount the prefix length of
944 the network should be decreased by. For example, given a
945 /24 network and a prefixlen_diff of 3, a supernet with a
946 /21 netmask is returned.
947
948 Returns:
949 An IPv4 network object.
950
951 Raises:
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200952 ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have
953 a negative prefix length.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000954 OR
955 If prefixlen_diff and new_prefix are both set or new_prefix is a
956 larger number than the current prefix (larger number means a
957 smaller network)
958
959 """
960 if self._prefixlen == 0:
961 return self
962
963 if new_prefix is not None:
964 if new_prefix > self._prefixlen:
965 raise ValueError('new prefix must be shorter')
966 if prefixlen_diff != 1:
967 raise ValueError('cannot set prefixlen_diff and new_prefix')
968 prefixlen_diff = self._prefixlen - new_prefix
969
Nick Coghlandc9b2552012-05-20 21:01:57 +1000970 if self.prefixlen - prefixlen_diff < 0:
971 raise ValueError(
972 'current prefixlen is %d, cannot have a prefixlen_diff of %d' %
973 (self.prefixlen, prefixlen_diff))
974 # TODO (pmoody): optimize this.
Nick Coghlan912238e2012-07-07 13:34:50 +1000975 t = self.__class__('%s/%d' % (self.network_address,
Nick Coghlan51c30672012-05-27 00:25:58 +1000976 self.prefixlen - prefixlen_diff),
977 strict=False)
Nick Coghlan912238e2012-07-07 13:34:50 +1000978 return t.__class__('%s/%d' % (t.network_address, t.prefixlen))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000979
980
Hynek Schlawackc4b78a32012-06-01 11:48:32 +0200981class _BaseV4:
Nick Coghlandc9b2552012-05-20 21:01:57 +1000982
983 """Base IPv4 object.
984
985 The following methods are used by IPv4 objects in both single IP
986 addresses and networks.
987
988 """
989
990 # Equivalent to 255.255.255.255 or 32 bits of 1's.
991 _ALL_ONES = (2**IPV4LENGTH) - 1
992 _DECIMAL_DIGITS = frozenset('0123456789')
993
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200994 # the valid octets for host and netmasks. only useful for IPv4.
995 _valid_mask_octets = set((255, 254, 252, 248, 240, 224, 192, 128, 0))
996
Nick Coghlandc9b2552012-05-20 21:01:57 +1000997 def __init__(self, address):
998 self._version = 4
999 self._max_prefixlen = IPV4LENGTH
1000
1001 def _explode_shorthand_ip_string(self):
1002 return str(self)
1003
1004 def _ip_int_from_string(self, ip_str):
1005 """Turn the given IP string into an integer for comparison.
1006
1007 Args:
1008 ip_str: A string, the IP ip_str.
1009
1010 Returns:
1011 The IP ip_str as an integer.
1012
1013 Raises:
1014 AddressValueError: if ip_str isn't a valid IPv4 Address.
1015
1016 """
1017 octets = ip_str.split('.')
1018 if len(octets) != 4:
1019 raise AddressValueError(ip_str)
1020
1021 packed_ip = 0
1022 for oc in octets:
1023 try:
1024 packed_ip = (packed_ip << 8) | self._parse_octet(oc)
1025 except ValueError:
Nick Coghlan3c2570c2012-07-07 01:13:55 +10001026 raise AddressValueError(ip_str) from None
Nick Coghlandc9b2552012-05-20 21:01:57 +10001027 return packed_ip
1028
1029 def _parse_octet(self, octet_str):
1030 """Convert a decimal octet into an integer.
1031
1032 Args:
1033 octet_str: A string, the number to parse.
1034
1035 Returns:
1036 The octet as an integer.
1037
1038 Raises:
1039 ValueError: if the octet isn't strictly a decimal from [0..255].
1040
1041 """
1042 # Whitelist the characters, since int() allows a lot of bizarre stuff.
Nick Coghlan3c2570c2012-07-07 01:13:55 +10001043 # Higher level wrappers convert these to more informative errors
Nick Coghlandc9b2552012-05-20 21:01:57 +10001044 if not self._DECIMAL_DIGITS.issuperset(octet_str):
1045 raise ValueError
1046 octet_int = int(octet_str, 10)
1047 # Disallow leading zeroes, because no clear standard exists on
1048 # whether these should be interpreted as decimal or octal.
1049 if octet_int > 255 or (octet_str[0] == '0' and len(octet_str) > 1):
1050 raise ValueError
1051 return octet_int
1052
1053 def _string_from_ip_int(self, ip_int):
1054 """Turns a 32-bit integer into dotted decimal notation.
1055
1056 Args:
1057 ip_int: An integer, the IP address.
1058
1059 Returns:
1060 The IP address as a string in dotted decimal notation.
1061
1062 """
1063 octets = []
1064 for _ in range(4):
1065 octets.insert(0, str(ip_int & 0xFF))
1066 ip_int >>= 8
1067 return '.'.join(octets)
1068
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001069 def _is_valid_netmask(self, netmask):
1070 """Verify that the netmask is valid.
1071
1072 Args:
1073 netmask: A string, either a prefix or dotted decimal
1074 netmask.
1075
1076 Returns:
1077 A boolean, True if the prefix represents a valid IPv4
1078 netmask.
1079
1080 """
1081 mask = netmask.split('.')
1082 if len(mask) == 4:
1083 if [x for x in mask if int(x) not in self._valid_mask_octets]:
1084 return False
1085 if [y for idx, y in enumerate(mask) if idx > 0 and
1086 y > mask[idx - 1]]:
1087 return False
1088 return True
1089 try:
1090 netmask = int(netmask)
1091 except ValueError:
1092 return False
1093 return 0 <= netmask <= self._max_prefixlen
1094
1095 def _is_hostmask(self, ip_str):
1096 """Test if the IP string is a hostmask (rather than a netmask).
1097
1098 Args:
1099 ip_str: A string, the potential hostmask.
1100
1101 Returns:
1102 A boolean, True if the IP string is a hostmask.
1103
1104 """
1105 bits = ip_str.split('.')
1106 try:
1107 parts = [int(x) for x in bits if int(x) in self._valid_mask_octets]
1108 except ValueError:
1109 return False
1110 if len(parts) != len(bits):
1111 return False
1112 if parts[0] < parts[-1]:
1113 return True
1114 return False
1115
Nick Coghlandc9b2552012-05-20 21:01:57 +10001116 @property
1117 def max_prefixlen(self):
1118 return self._max_prefixlen
1119
1120 @property
1121 def version(self):
1122 return self._version
1123
1124 @property
1125 def is_reserved(self):
1126 """Test if the address is otherwise IETF reserved.
1127
1128 Returns:
1129 A boolean, True if the address is within the
1130 reserved IPv4 Network range.
1131
1132 """
1133 reserved_network = IPv4Network('240.0.0.0/4')
1134 if isinstance(self, _BaseAddress):
1135 return self in reserved_network
1136 return (self.network_address in reserved_network and
1137 self.broadcast_address in reserved_network)
1138
1139 @property
1140 def is_private(self):
1141 """Test if this address is allocated for private networks.
1142
1143 Returns:
1144 A boolean, True if the address is reserved per RFC 1918.
1145
1146 """
1147 private_10 = IPv4Network('10.0.0.0/8')
1148 private_172 = IPv4Network('172.16.0.0/12')
1149 private_192 = IPv4Network('192.168.0.0/16')
1150 if isinstance(self, _BaseAddress):
1151 return (self in private_10 or self in private_172 or
1152 self in private_192)
1153 else:
1154 return ((self.network_address in private_10 and
1155 self.broadcast_address in private_10) or
1156 (self.network_address in private_172 and
1157 self.broadcast_address in private_172) or
1158 (self.network_address in private_192 and
1159 self.broadcast_address in private_192))
1160
1161 @property
1162 def is_multicast(self):
1163 """Test if the address is reserved for multicast use.
1164
1165 Returns:
1166 A boolean, True if the address is multicast.
1167 See RFC 3171 for details.
1168
1169 """
1170 multicast_network = IPv4Network('224.0.0.0/4')
1171 if isinstance(self, _BaseAddress):
1172 return self in IPv4Network('224.0.0.0/4')
1173 return (self.network_address in multicast_network and
1174 self.broadcast_address in multicast_network)
1175
1176 @property
1177 def is_unspecified(self):
1178 """Test if the address is unspecified.
1179
1180 Returns:
1181 A boolean, True if this is the unspecified address as defined in
1182 RFC 5735 3.
1183
1184 """
1185 unspecified_address = IPv4Address('0.0.0.0')
1186 if isinstance(self, _BaseAddress):
Hynek Schlawackbcd30442012-06-04 14:19:39 +02001187 return self == unspecified_address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001188 return (self.network_address == self.broadcast_address ==
1189 unspecified_address)
1190
1191 @property
1192 def is_loopback(self):
1193 """Test if the address is a loopback address.
1194
1195 Returns:
1196 A boolean, True if the address is a loopback per RFC 3330.
1197
1198 """
1199 loopback_address = IPv4Network('127.0.0.0/8')
1200 if isinstance(self, _BaseAddress):
1201 return self in loopback_address
1202
1203 return (self.network_address in loopback_address and
1204 self.broadcast_address in loopback_address)
1205
1206 @property
1207 def is_link_local(self):
1208 """Test if the address is reserved for link-local.
1209
1210 Returns:
1211 A boolean, True if the address is link-local per RFC 3927.
1212
1213 """
1214 linklocal_network = IPv4Network('169.254.0.0/16')
1215 if isinstance(self, _BaseAddress):
1216 return self in linklocal_network
1217 return (self.network_address in linklocal_network and
1218 self.broadcast_address in linklocal_network)
1219
1220
1221class IPv4Address(_BaseV4, _BaseAddress):
1222
1223 """Represent and manipulate single IPv4 Addresses."""
1224
1225 def __init__(self, address):
1226
1227 """
1228 Args:
1229 address: A string or integer representing the IP
1230
1231 Additionally, an integer can be passed, so
1232 IPv4Address('192.0.2.1') == IPv4Address(3221225985).
1233 or, more generally
1234 IPv4Address(int(IPv4Address('192.0.2.1'))) ==
1235 IPv4Address('192.0.2.1')
1236
1237 Raises:
Sandro Tosib4386d32012-06-02 17:14:22 +02001238 AddressValueError: If ipaddress isn't a valid IPv4 address.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001239
1240 """
1241 _BaseAddress.__init__(self, address)
1242 _BaseV4.__init__(self, address)
1243
1244 # Efficient constructor from integer.
1245 if isinstance(address, int):
1246 self._ip = address
1247 if address < 0 or address > self._ALL_ONES:
1248 raise AddressValueError(address)
1249 return
1250
1251 # Constructing from a packed address
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001252 if isinstance(address, bytes):
1253 if len(address) != 4:
1254 raise AddressValueError(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001255 self._ip = struct.unpack('!I', address)[0]
1256 return
1257
1258 # Assume input argument to be string or any object representation
1259 # which converts into a formatted IP string.
1260 addr_str = str(address)
1261 self._ip = self._ip_int_from_string(addr_str)
1262
1263 @property
1264 def packed(self):
1265 """The binary representation of this address."""
1266 return v4_int_to_packed(self._ip)
1267
1268
1269class IPv4Interface(IPv4Address):
1270
Nick Coghlandc9b2552012-05-20 21:01:57 +10001271 def __init__(self, address):
1272 if isinstance(address, (bytes, int)):
1273 IPv4Address.__init__(self, address)
1274 self.network = IPv4Network(self._ip)
1275 self._prefixlen = self._max_prefixlen
1276 return
1277
1278 addr = str(address).split('/')
1279 if len(addr) > 2:
1280 raise AddressValueError(address)
1281 IPv4Address.__init__(self, addr[0])
1282
1283 self.network = IPv4Network(address, strict=False)
1284 self._prefixlen = self.network._prefixlen
1285
1286 self.netmask = self.network.netmask
1287 self.hostmask = self.network.hostmask
1288
Nick Coghlandc9b2552012-05-20 21:01:57 +10001289 def __str__(self):
1290 return '%s/%d' % (self._string_from_ip_int(self._ip),
1291 self.network.prefixlen)
1292
1293 def __eq__(self, other):
1294 try:
1295 return (IPv4Address.__eq__(self, other) and
1296 self.network == other.network)
1297 except AttributeError:
1298 return NotImplemented
1299
1300 def __hash__(self):
1301 return self._ip ^ self._prefixlen ^ int(self.network.network_address)
1302
Nick Coghlandc9b2552012-05-20 21:01:57 +10001303 @property
1304 def prefixlen(self):
1305 return self._prefixlen
1306
1307 @property
1308 def ip(self):
1309 return IPv4Address(self._ip)
1310
1311 @property
1312 def with_prefixlen(self):
1313 return self
1314
1315 @property
1316 def with_netmask(self):
1317 return '%s/%s' % (self._string_from_ip_int(self._ip),
1318 self.netmask)
Hynek Schlawack072b1e12012-05-26 12:04:56 +02001319
Nick Coghlandc9b2552012-05-20 21:01:57 +10001320 @property
1321 def with_hostmask(self):
1322 return '%s/%s' % (self._string_from_ip_int(self._ip),
1323 self.hostmask)
1324
1325
1326class IPv4Network(_BaseV4, _BaseNetwork):
1327
1328 """This class represents and manipulates 32-bit IPv4 network + addresses..
1329
1330 Attributes: [examples for IPv4Network('192.0.2.0/27')]
1331 .network_address: IPv4Address('192.0.2.0')
1332 .hostmask: IPv4Address('0.0.0.31')
1333 .broadcast_address: IPv4Address('192.0.2.32')
1334 .netmask: IPv4Address('255.255.255.224')
1335 .prefixlen: 27
1336
1337 """
Nick Coghlan51c30672012-05-27 00:25:58 +10001338 # Class to use when creating address objects
Nick Coghlan51c30672012-05-27 00:25:58 +10001339 _address_class = IPv4Address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001340
Nick Coghlandc9b2552012-05-20 21:01:57 +10001341 def __init__(self, address, strict=True):
1342
1343 """Instantiate a new IPv4 network object.
1344
1345 Args:
1346 address: A string or integer representing the IP [& network].
1347 '192.0.2.0/24'
1348 '192.0.2.0/255.255.255.0'
1349 '192.0.0.2/0.0.0.255'
1350 are all functionally the same in IPv4. Similarly,
1351 '192.0.2.1'
1352 '192.0.2.1/255.255.255.255'
1353 '192.0.2.1/32'
1354 are also functionaly equivalent. That is to say, failing to
1355 provide a subnetmask will create an object with a mask of /32.
1356
1357 If the mask (portion after the / in the argument) is given in
1358 dotted quad form, it is treated as a netmask if it starts with a
1359 non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it
1360 starts with a zero field (e.g. 0.255.255.255 == /8), with the
1361 single exception of an all-zero mask which is treated as a
1362 netmask == /0. If no mask is given, a default of /32 is used.
1363
1364 Additionally, an integer can be passed, so
1365 IPv4Network('192.0.2.1') == IPv4Network(3221225985)
1366 or, more generally
1367 IPv4Interface(int(IPv4Interface('192.0.2.1'))) ==
1368 IPv4Interface('192.0.2.1')
1369
1370 Raises:
Sandro Tosib4386d32012-06-02 17:14:22 +02001371 AddressValueError: If ipaddress isn't a valid IPv4 address.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001372 NetmaskValueError: If the netmask isn't valid for
1373 an IPv4 address.
Sandro Tosib4386d32012-06-02 17:14:22 +02001374 ValueError: If strict is True and a network address is not
Nick Coghlandc9b2552012-05-20 21:01:57 +10001375 supplied.
1376
1377 """
1378
1379 _BaseV4.__init__(self, address)
1380 _BaseNetwork.__init__(self, address)
1381
1382 # Constructing from a packed address
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001383 if isinstance(address, bytes):
1384 if len(address) != 4:
1385 raise AddressValueError(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001386 self.network_address = IPv4Address(
1387 struct.unpack('!I', address)[0])
1388 self._prefixlen = self._max_prefixlen
1389 self.netmask = IPv4Address(self._ALL_ONES)
1390 #fixme: address/network test here
1391 return
1392
1393 # Efficient constructor from integer.
1394 if isinstance(address, int):
1395 self._prefixlen = self._max_prefixlen
1396 self.netmask = IPv4Address(self._ALL_ONES)
1397 if address < 0 or address > self._ALL_ONES:
1398 raise AddressValueError(address)
1399 self.network_address = IPv4Address(address)
1400 #fixme: address/network test here.
1401 return
1402
1403 # Assume input argument to be string or any object representation
1404 # which converts into a formatted IP prefix string.
1405 addr = str(address).split('/')
1406 self.network_address = IPv4Address(self._ip_int_from_string(addr[0]))
1407
1408 if len(addr) > 2:
1409 raise AddressValueError(address)
1410
1411 if len(addr) == 2:
1412 mask = addr[1].split('.')
1413
1414 if len(mask) == 4:
1415 # We have dotted decimal netmask.
1416 if self._is_valid_netmask(addr[1]):
1417 self.netmask = IPv4Address(self._ip_int_from_string(
1418 addr[1]))
1419 elif self._is_hostmask(addr[1]):
1420 self.netmask = IPv4Address(
1421 self._ip_int_from_string(addr[1]) ^ self._ALL_ONES)
1422 else:
1423 raise NetmaskValueError('%s is not a valid netmask'
1424 % addr[1])
1425
1426 self._prefixlen = self._prefix_from_ip_int(int(self.netmask))
1427 else:
1428 # We have a netmask in prefix length form.
1429 if not self._is_valid_netmask(addr[1]):
1430 raise NetmaskValueError(addr[1])
1431 self._prefixlen = int(addr[1])
1432 self.netmask = IPv4Address(self._ip_int_from_prefix(
1433 self._prefixlen))
1434 else:
1435 self._prefixlen = self._max_prefixlen
1436 self.netmask = IPv4Address(self._ip_int_from_prefix(
1437 self._prefixlen))
1438
1439 if strict:
1440 if (IPv4Address(int(self.network_address) & int(self.netmask)) !=
1441 self.network_address):
1442 raise ValueError('%s has host bits set' % self)
1443 self.network_address = IPv4Address(int(self.network_address) &
1444 int(self.netmask))
1445
1446 if self._prefixlen == (self._max_prefixlen - 1):
1447 self.hosts = self.__iter__
1448
Nick Coghlandc9b2552012-05-20 21:01:57 +10001449
Hynek Schlawackc4b78a32012-06-01 11:48:32 +02001450class _BaseV6:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001451
1452 """Base IPv6 object.
1453
1454 The following methods are used by IPv6 objects in both single IP
1455 addresses and networks.
1456
1457 """
1458
1459 _ALL_ONES = (2**IPV6LENGTH) - 1
1460 _HEXTET_COUNT = 8
1461 _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef')
1462
1463 def __init__(self, address):
1464 self._version = 6
1465 self._max_prefixlen = IPV6LENGTH
1466
1467 def _ip_int_from_string(self, ip_str):
1468 """Turn an IPv6 ip_str into an integer.
1469
1470 Args:
1471 ip_str: A string, the IPv6 ip_str.
1472
1473 Returns:
1474 An int, the IPv6 address
1475
1476 Raises:
1477 AddressValueError: if ip_str isn't a valid IPv6 Address.
1478
1479 """
1480 parts = ip_str.split(':')
1481
1482 # An IPv6 address needs at least 2 colons (3 parts).
1483 if len(parts) < 3:
1484 raise AddressValueError(ip_str)
1485
1486 # If the address has an IPv4-style suffix, convert it to hexadecimal.
1487 if '.' in parts[-1]:
1488 ipv4_int = IPv4Address(parts.pop())._ip
1489 parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF))
1490 parts.append('%x' % (ipv4_int & 0xFFFF))
1491
1492 # An IPv6 address can't have more than 8 colons (9 parts).
1493 if len(parts) > self._HEXTET_COUNT + 1:
1494 raise AddressValueError(ip_str)
1495
1496 # Disregarding the endpoints, find '::' with nothing in between.
1497 # This indicates that a run of zeroes has been skipped.
1498 try:
1499 skip_index, = (
1500 [i for i in range(1, len(parts) - 1) if not parts[i]] or
1501 [None])
1502 except ValueError:
1503 # Can't have more than one '::'
Nick Coghlan3c2570c2012-07-07 01:13:55 +10001504 raise AddressValueError(ip_str) from None
Nick Coghlandc9b2552012-05-20 21:01:57 +10001505
1506 # parts_hi is the number of parts to copy from above/before the '::'
1507 # parts_lo is the number of parts to copy from below/after the '::'
1508 if skip_index is not None:
1509 # If we found a '::', then check if it also covers the endpoints.
1510 parts_hi = skip_index
1511 parts_lo = len(parts) - skip_index - 1
1512 if not parts[0]:
1513 parts_hi -= 1
1514 if parts_hi:
1515 raise AddressValueError(ip_str) # ^: requires ^::
1516 if not parts[-1]:
1517 parts_lo -= 1
1518 if parts_lo:
1519 raise AddressValueError(ip_str) # :$ requires ::$
1520 parts_skipped = self._HEXTET_COUNT - (parts_hi + parts_lo)
1521 if parts_skipped < 1:
1522 raise AddressValueError(ip_str)
1523 else:
Hynek Schlawack072b1e12012-05-26 12:04:56 +02001524 # Otherwise, allocate the entire address to parts_hi. The
1525 # endpoints could still be empty, but _parse_hextet() will check
1526 # for that.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001527 if len(parts) != self._HEXTET_COUNT:
1528 raise AddressValueError(ip_str)
1529 parts_hi = len(parts)
1530 parts_lo = 0
1531 parts_skipped = 0
1532
1533 try:
1534 # Now, parse the hextets into a 128-bit integer.
1535 ip_int = 0
1536 for i in range(parts_hi):
1537 ip_int <<= 16
1538 ip_int |= self._parse_hextet(parts[i])
1539 ip_int <<= 16 * parts_skipped
1540 for i in range(-parts_lo, 0):
1541 ip_int <<= 16
1542 ip_int |= self._parse_hextet(parts[i])
1543 return ip_int
1544 except ValueError:
Nick Coghlan3c2570c2012-07-07 01:13:55 +10001545 raise AddressValueError(ip_str) from None
Nick Coghlandc9b2552012-05-20 21:01:57 +10001546
1547 def _parse_hextet(self, hextet_str):
1548 """Convert an IPv6 hextet string into an integer.
1549
1550 Args:
1551 hextet_str: A string, the number to parse.
1552
1553 Returns:
1554 The hextet as an integer.
1555
1556 Raises:
Hynek Schlawack072b1e12012-05-26 12:04:56 +02001557 ValueError: if the input isn't strictly a hex number from
1558 [0..FFFF].
Nick Coghlandc9b2552012-05-20 21:01:57 +10001559
1560 """
1561 # Whitelist the characters, since int() allows a lot of bizarre stuff.
Nick Coghlan3c2570c2012-07-07 01:13:55 +10001562 # Higher level wrappers convert these to more informative errors
Nick Coghlandc9b2552012-05-20 21:01:57 +10001563 if not self._HEX_DIGITS.issuperset(hextet_str):
1564 raise ValueError
Nick Coghlan3c2570c2012-07-07 01:13:55 +10001565 if len(hextet_str) > 4:
1566 raise ValueError
Nick Coghlandc9b2552012-05-20 21:01:57 +10001567 hextet_int = int(hextet_str, 16)
1568 if hextet_int > 0xFFFF:
1569 raise ValueError
1570 return hextet_int
1571
1572 def _compress_hextets(self, hextets):
1573 """Compresses a list of hextets.
1574
1575 Compresses a list of strings, replacing the longest continuous
1576 sequence of "0" in the list with "" and adding empty strings at
1577 the beginning or at the end of the string such that subsequently
1578 calling ":".join(hextets) will produce the compressed version of
1579 the IPv6 address.
1580
1581 Args:
1582 hextets: A list of strings, the hextets to compress.
1583
1584 Returns:
1585 A list of strings.
1586
1587 """
1588 best_doublecolon_start = -1
1589 best_doublecolon_len = 0
1590 doublecolon_start = -1
1591 doublecolon_len = 0
1592 for index in range(len(hextets)):
1593 if hextets[index] == '0':
1594 doublecolon_len += 1
1595 if doublecolon_start == -1:
1596 # Start of a sequence of zeros.
1597 doublecolon_start = index
1598 if doublecolon_len > best_doublecolon_len:
1599 # This is the longest sequence of zeros so far.
1600 best_doublecolon_len = doublecolon_len
1601 best_doublecolon_start = doublecolon_start
1602 else:
1603 doublecolon_len = 0
1604 doublecolon_start = -1
1605
1606 if best_doublecolon_len > 1:
1607 best_doublecolon_end = (best_doublecolon_start +
1608 best_doublecolon_len)
1609 # For zeros at the end of the address.
1610 if best_doublecolon_end == len(hextets):
1611 hextets += ['']
1612 hextets[best_doublecolon_start:best_doublecolon_end] = ['']
1613 # For zeros at the beginning of the address.
1614 if best_doublecolon_start == 0:
1615 hextets = [''] + hextets
1616
1617 return hextets
1618
1619 def _string_from_ip_int(self, ip_int=None):
1620 """Turns a 128-bit integer into hexadecimal notation.
1621
1622 Args:
1623 ip_int: An integer, the IP address.
1624
1625 Returns:
1626 A string, the hexadecimal representation of the address.
1627
1628 Raises:
1629 ValueError: The address is bigger than 128 bits of all ones.
1630
1631 """
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001632 if ip_int is None:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001633 ip_int = int(self._ip)
1634
1635 if ip_int > self._ALL_ONES:
1636 raise ValueError('IPv6 address is too large')
1637
1638 hex_str = '%032x' % ip_int
1639 hextets = []
1640 for x in range(0, 32, 4):
1641 hextets.append('%x' % int(hex_str[x:x+4], 16))
1642
1643 hextets = self._compress_hextets(hextets)
1644 return ':'.join(hextets)
1645
1646 def _explode_shorthand_ip_string(self):
1647 """Expand a shortened IPv6 address.
1648
1649 Args:
1650 ip_str: A string, the IPv6 address.
1651
1652 Returns:
1653 A string, the expanded IPv6 address.
1654
1655 """
1656 if isinstance(self, IPv6Network):
1657 ip_str = str(self.network_address)
1658 elif isinstance(self, IPv6Interface):
1659 ip_str = str(self.ip)
1660 else:
1661 ip_str = str(self)
1662
1663 ip_int = self._ip_int_from_string(ip_str)
1664 parts = []
1665 for i in range(self._HEXTET_COUNT):
1666 parts.append('%04x' % (ip_int & 0xFFFF))
1667 ip_int >>= 16
1668 parts.reverse()
1669 if isinstance(self, (_BaseNetwork, IPv6Interface)):
1670 return '%s/%d' % (':'.join(parts), self.prefixlen)
1671 return ':'.join(parts)
1672
1673 @property
1674 def max_prefixlen(self):
1675 return self._max_prefixlen
1676
1677 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +10001678 def version(self):
1679 return self._version
1680
1681 @property
1682 def is_multicast(self):
1683 """Test if the address is reserved for multicast use.
1684
1685 Returns:
1686 A boolean, True if the address is a multicast address.
1687 See RFC 2373 2.7 for details.
1688
1689 """
1690 multicast_network = IPv6Network('ff00::/8')
1691 if isinstance(self, _BaseAddress):
1692 return self in multicast_network
1693 return (self.network_address in multicast_network and
1694 self.broadcast_address in multicast_network)
1695
1696 @property
1697 def is_reserved(self):
1698 """Test if the address is otherwise IETF reserved.
1699
1700 Returns:
1701 A boolean, True if the address is within one of the
1702 reserved IPv6 Network ranges.
1703
1704 """
1705 reserved_networks = [IPv6Network('::/8'), IPv6Network('100::/8'),
1706 IPv6Network('200::/7'), IPv6Network('400::/6'),
1707 IPv6Network('800::/5'), IPv6Network('1000::/4'),
1708 IPv6Network('4000::/3'), IPv6Network('6000::/3'),
1709 IPv6Network('8000::/3'), IPv6Network('A000::/3'),
1710 IPv6Network('C000::/3'), IPv6Network('E000::/4'),
1711 IPv6Network('F000::/5'), IPv6Network('F800::/6'),
1712 IPv6Network('FE00::/9')]
1713
1714 if isinstance(self, _BaseAddress):
1715 return len([x for x in reserved_networks if self in x]) > 0
1716 return len([x for x in reserved_networks if self.network_address in x
1717 and self.broadcast_address in x]) > 0
1718
1719 @property
1720 def is_link_local(self):
1721 """Test if the address is reserved for link-local.
1722
1723 Returns:
1724 A boolean, True if the address is reserved per RFC 4291.
1725
1726 """
1727 linklocal_network = IPv6Network('fe80::/10')
1728 if isinstance(self, _BaseAddress):
1729 return self in linklocal_network
1730 return (self.network_address in linklocal_network and
1731 self.broadcast_address in linklocal_network)
1732
1733 @property
1734 def is_site_local(self):
1735 """Test if the address is reserved for site-local.
1736
1737 Note that the site-local address space has been deprecated by RFC 3879.
1738 Use is_private to test if this address is in the space of unique local
1739 addresses as defined by RFC 4193.
1740
1741 Returns:
1742 A boolean, True if the address is reserved per RFC 3513 2.5.6.
1743
1744 """
1745 sitelocal_network = IPv6Network('fec0::/10')
1746 if isinstance(self, _BaseAddress):
1747 return self in sitelocal_network
1748 return (self.network_address in sitelocal_network and
1749 self.broadcast_address in sitelocal_network)
1750
1751 @property
1752 def is_private(self):
1753 """Test if this address is allocated for private networks.
1754
1755 Returns:
1756 A boolean, True if the address is reserved per RFC 4193.
1757
1758 """
1759 private_network = IPv6Network('fc00::/7')
1760 if isinstance(self, _BaseAddress):
1761 return self in private_network
1762 return (self.network_address in private_network and
1763 self.broadcast_address in private_network)
1764
Nick Coghlandc9b2552012-05-20 21:01:57 +10001765 @property
1766 def ipv4_mapped(self):
1767 """Return the IPv4 mapped address.
1768
1769 Returns:
1770 If the IPv6 address is a v4 mapped address, return the
1771 IPv4 mapped address. Return None otherwise.
1772
1773 """
1774 if (self._ip >> 32) != 0xFFFF:
1775 return None
1776 return IPv4Address(self._ip & 0xFFFFFFFF)
1777
1778 @property
1779 def teredo(self):
1780 """Tuple of embedded teredo IPs.
1781
1782 Returns:
1783 Tuple of the (server, client) IPs or None if the address
1784 doesn't appear to be a teredo address (doesn't start with
1785 2001::/32)
1786
1787 """
1788 if (self._ip >> 96) != 0x20010000:
1789 return None
1790 return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF),
1791 IPv4Address(~self._ip & 0xFFFFFFFF))
1792
1793 @property
1794 def sixtofour(self):
1795 """Return the IPv4 6to4 embedded address.
1796
1797 Returns:
1798 The IPv4 6to4-embedded address if present or None if the
1799 address doesn't appear to contain a 6to4 embedded address.
1800
1801 """
1802 if (self._ip >> 112) != 0x2002:
1803 return None
1804 return IPv4Address((self._ip >> 80) & 0xFFFFFFFF)
1805
1806 @property
1807 def is_unspecified(self):
1808 """Test if the address is unspecified.
1809
1810 Returns:
1811 A boolean, True if this is the unspecified address as defined in
1812 RFC 2373 2.5.2.
1813
1814 """
1815 if isinstance(self, (IPv6Network, IPv6Interface)):
1816 return int(self.network_address) == 0 and getattr(
1817 self, '_prefixlen', 128) == 128
1818 return self._ip == 0
1819
1820 @property
1821 def is_loopback(self):
1822 """Test if the address is a loopback address.
1823
1824 Returns:
1825 A boolean, True if the address is a loopback address as defined in
1826 RFC 2373 2.5.3.
1827
1828 """
1829 if isinstance(self, IPv6Network):
Nick Coghlan2c589102012-05-27 01:03:25 +10001830 return int(self) == 1 and getattr(
Nick Coghlandc9b2552012-05-20 21:01:57 +10001831 self, '_prefixlen', 128) == 128
1832 elif isinstance(self, IPv6Interface):
1833 return int(self.network.network_address) == 1 and getattr(
1834 self, '_prefixlen', 128) == 128
1835 return self._ip == 1
1836
1837
1838class IPv6Address(_BaseV6, _BaseAddress):
1839
Sandro Tosib95c6342012-05-23 23:17:22 +02001840 """Represent and manipulate single IPv6 Addresses."""
Nick Coghlandc9b2552012-05-20 21:01:57 +10001841
1842 def __init__(self, address):
1843 """Instantiate a new IPv6 address object.
1844
1845 Args:
1846 address: A string or integer representing the IP
1847
1848 Additionally, an integer can be passed, so
1849 IPv6Address('2001:db8::') ==
1850 IPv6Address(42540766411282592856903984951653826560)
1851 or, more generally
1852 IPv6Address(int(IPv6Address('2001:db8::'))) ==
1853 IPv6Address('2001:db8::')
1854
1855 Raises:
1856 AddressValueError: If address isn't a valid IPv6 address.
1857
1858 """
1859 _BaseAddress.__init__(self, address)
1860 _BaseV6.__init__(self, address)
1861
1862 # Efficient constructor from integer.
1863 if isinstance(address, int):
1864 self._ip = address
1865 if address < 0 or address > self._ALL_ONES:
1866 raise AddressValueError(address)
1867 return
1868
1869 # Constructing from a packed address
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001870 if isinstance(address, bytes):
1871 if len(address) != 16:
1872 raise AddressValueError(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001873 tmp = struct.unpack('!QQ', address)
1874 self._ip = (tmp[0] << 64) | tmp[1]
1875 return
1876
1877 # Assume input argument to be string or any object representation
1878 # which converts into a formatted IP string.
1879 addr_str = str(address)
1880 if not addr_str:
1881 raise AddressValueError('')
1882
1883 self._ip = self._ip_int_from_string(addr_str)
1884
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001885 @property
1886 def packed(self):
1887 """The binary representation of this address."""
1888 return v6_int_to_packed(self._ip)
1889
Nick Coghlandc9b2552012-05-20 21:01:57 +10001890
1891class IPv6Interface(IPv6Address):
1892
1893 def __init__(self, address):
1894 if isinstance(address, (bytes, int)):
1895 IPv6Address.__init__(self, address)
1896 self.network = IPv6Network(self._ip)
1897 self._prefixlen = self._max_prefixlen
1898 return
1899
1900 addr = str(address).split('/')
1901 IPv6Address.__init__(self, addr[0])
1902 self.network = IPv6Network(address, strict=False)
1903 self.netmask = self.network.netmask
1904 self._prefixlen = self.network._prefixlen
1905 self.hostmask = self.network.hostmask
1906
Nick Coghlandc9b2552012-05-20 21:01:57 +10001907 def __str__(self):
1908 return '%s/%d' % (self._string_from_ip_int(self._ip),
1909 self.network.prefixlen)
1910
1911 def __eq__(self, other):
1912 try:
1913 return (IPv6Address.__eq__(self, other) and
1914 self.network == other.network)
1915 except AttributeError:
1916 return NotImplemented
1917
1918 def __hash__(self):
1919 return self._ip ^ self._prefixlen ^ int(self.network.network_address)
1920
1921 @property
1922 def prefixlen(self):
1923 return self._prefixlen
Hynek Schlawack072b1e12012-05-26 12:04:56 +02001924
Nick Coghlandc9b2552012-05-20 21:01:57 +10001925 @property
1926 def ip(self):
1927 return IPv6Address(self._ip)
1928
1929 @property
1930 def with_prefixlen(self):
1931 return self
1932
1933 @property
1934 def with_netmask(self):
1935 return self.with_prefixlen
Hynek Schlawack072b1e12012-05-26 12:04:56 +02001936
Nick Coghlandc9b2552012-05-20 21:01:57 +10001937 @property
1938 def with_hostmask(self):
1939 return '%s/%s' % (self._string_from_ip_int(self._ip),
1940 self.hostmask)
1941
1942
1943class IPv6Network(_BaseV6, _BaseNetwork):
1944
1945 """This class represents and manipulates 128-bit IPv6 networks.
1946
1947 Attributes: [examples for IPv6('2001:db8::1000/124')]
1948 .network_address: IPv6Address('2001:db8::1000')
1949 .hostmask: IPv6Address('::f')
1950 .broadcast_address: IPv6Address('2001:db8::100f')
1951 .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0')
1952 .prefixlen: 124
1953
1954 """
1955
Nick Coghlan51c30672012-05-27 00:25:58 +10001956 # Class to use when creating address objects
Nick Coghlan51c30672012-05-27 00:25:58 +10001957 _address_class = IPv6Address
1958
Nick Coghlandc9b2552012-05-20 21:01:57 +10001959 def __init__(self, address, strict=True):
1960 """Instantiate a new IPv6 Network object.
1961
1962 Args:
Hynek Schlawack072b1e12012-05-26 12:04:56 +02001963 address: A string or integer representing the IPv6 network or the
1964 IP and prefix/netmask.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001965 '2001:db8::/128'
1966 '2001:db8:0000:0000:0000:0000:0000:0000/128'
1967 '2001:db8::'
1968 are all functionally the same in IPv6. That is to say,
1969 failing to provide a subnetmask will create an object with
1970 a mask of /128.
1971
1972 Additionally, an integer can be passed, so
1973 IPv6Network('2001:db8::') ==
1974 IPv6Network(42540766411282592856903984951653826560)
1975 or, more generally
1976 IPv6Network(int(IPv6Network('2001:db8::'))) ==
1977 IPv6Network('2001:db8::')
1978
1979 strict: A boolean. If true, ensure that we have been passed
1980 A true network address, eg, 2001:db8::1000/124 and not an
1981 IP address on a network, eg, 2001:db8::1/124.
1982
1983 Raises:
1984 AddressValueError: If address isn't a valid IPv6 address.
1985 NetmaskValueError: If the netmask isn't valid for
1986 an IPv6 address.
1987 ValueError: If strict was True and a network address was not
1988 supplied.
1989
1990 """
1991 _BaseV6.__init__(self, address)
1992 _BaseNetwork.__init__(self, address)
1993
1994 # Efficient constructor from integer.
1995 if isinstance(address, int):
1996 if address < 0 or address > self._ALL_ONES:
1997 raise AddressValueError(address)
1998 self.network_address = IPv6Address(address)
1999 self._prefixlen = self._max_prefixlen
2000 self.netmask = IPv6Address(self._ALL_ONES)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002001 return
2002
2003 # Constructing from a packed address
Nick Coghlan5cf896f2012-07-07 01:43:31 +10002004 if isinstance(address, bytes):
2005 if len(address) != 16:
2006 raise AddressValueError(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002007 tmp = struct.unpack('!QQ', address)
2008 self.network_address = IPv6Address((tmp[0] << 64) | tmp[1])
2009 self._prefixlen = self._max_prefixlen
2010 self.netmask = IPv6Address(self._ALL_ONES)
Hynek Schlawacked36b2e2012-06-08 15:21:21 +02002011 return
Nick Coghlandc9b2552012-05-20 21:01:57 +10002012
2013 # Assume input argument to be string or any object representation
2014 # which converts into a formatted IP prefix string.
2015 addr = str(address).split('/')
2016
2017 if len(addr) > 2:
2018 raise AddressValueError(address)
2019
2020 self.network_address = IPv6Address(self._ip_int_from_string(addr[0]))
2021
2022 if len(addr) == 2:
2023 if self._is_valid_netmask(addr[1]):
2024 self._prefixlen = int(addr[1])
2025 else:
2026 raise NetmaskValueError(addr[1])
2027 else:
2028 self._prefixlen = self._max_prefixlen
2029
2030 self.netmask = IPv6Address(self._ip_int_from_prefix(self._prefixlen))
2031 if strict:
2032 if (IPv6Address(int(self.network_address) & int(self.netmask)) !=
2033 self.network_address):
Nick Coghlan912238e2012-07-07 13:34:50 +10002034 raise ValueError('%s has host bits set' % self)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002035 self.network_address = IPv6Address(int(self.network_address) &
2036 int(self.netmask))
2037
2038 if self._prefixlen == (self._max_prefixlen - 1):
2039 self.hosts = self.__iter__
2040
Nick Coghlandc9b2552012-05-20 21:01:57 +10002041 def _is_valid_netmask(self, prefixlen):
2042 """Verify that the netmask/prefixlen is valid.
2043
2044 Args:
2045 prefixlen: A string, the netmask in prefix length format.
2046
2047 Returns:
2048 A boolean, True if the prefix represents a valid IPv6
2049 netmask.
2050
2051 """
2052 try:
2053 prefixlen = int(prefixlen)
2054 except ValueError:
2055 return False
2056 return 0 <= prefixlen <= self._max_prefixlen