blob: 54df39ae5622019bd14504731f3c866f3d27ed24 [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 Coghlan3008ec02012-07-08 00:45:33 +100014import functools
Hynek Schlawack91c5a342012-06-05 11:55:58 +020015
Nick Coghlandc9b2552012-05-20 21:01:57 +100016IPV4LENGTH = 32
17IPV6LENGTH = 128
18
Nick Coghlandc9b2552012-05-20 21:01:57 +100019class AddressValueError(ValueError):
20 """A Value Error related to the address."""
21
22
23class NetmaskValueError(ValueError):
24 """A Value Error related to the netmask."""
25
26
Nick Coghlan51c30672012-05-27 00:25:58 +100027def ip_address(address):
Nick Coghlandc9b2552012-05-20 21:01:57 +100028 """Take an IP string/int and return an object of the correct type.
29
30 Args:
31 address: A string or integer, the IP address. Either IPv4 or
32 IPv6 addresses may be supplied; integers less than 2**32 will
33 be considered to be IPv4 by default.
Nick Coghlandc9b2552012-05-20 21:01:57 +100034
35 Returns:
36 An IPv4Address or IPv6Address object.
37
38 Raises:
Sandro Tosi876ecad2012-05-23 22:26:55 +020039 ValueError: if the *address* passed isn't either a v4 or a v6
Nick Coghlan51c30672012-05-27 00:25:58 +100040 address
Nick Coghlandc9b2552012-05-20 21:01:57 +100041
42 """
Nick Coghlandc9b2552012-05-20 21:01:57 +100043 try:
44 return IPv4Address(address)
45 except (AddressValueError, NetmaskValueError):
46 pass
47
48 try:
49 return IPv6Address(address)
50 except (AddressValueError, NetmaskValueError):
51 pass
52
53 raise ValueError('%r does not appear to be an IPv4 or IPv6 address' %
54 address)
55
56
Nick Coghlan51c30672012-05-27 00:25:58 +100057def ip_network(address, strict=True):
Nick Coghlandc9b2552012-05-20 21:01:57 +100058 """Take an IP string/int and return an object of the correct type.
59
60 Args:
61 address: A string or integer, the IP network. Either IPv4 or
62 IPv6 networks may be supplied; integers less than 2**32 will
63 be considered to be IPv4 by default.
Nick Coghlandc9b2552012-05-20 21:01:57 +100064
65 Returns:
66 An IPv4Network or IPv6Network object.
67
68 Raises:
69 ValueError: if the string passed isn't either a v4 or a v6
Nick Coghlan51c30672012-05-27 00:25:58 +100070 address. Or if the network has host bits set.
Nick Coghlandc9b2552012-05-20 21:01:57 +100071
72 """
Nick Coghlandc9b2552012-05-20 21:01:57 +100073 try:
74 return IPv4Network(address, strict)
75 except (AddressValueError, NetmaskValueError):
76 pass
77
78 try:
79 return IPv6Network(address, strict)
80 except (AddressValueError, NetmaskValueError):
81 pass
82
83 raise ValueError('%r does not appear to be an IPv4 or IPv6 network' %
84 address)
85
86
Nick Coghlan51c30672012-05-27 00:25:58 +100087def ip_interface(address):
Nick Coghlandc9b2552012-05-20 21:01:57 +100088 """Take an IP string/int and return an object of the correct type.
89
90 Args:
91 address: A string or integer, the IP address. Either IPv4 or
92 IPv6 addresses may be supplied; integers less than 2**32 will
93 be considered to be IPv4 by default.
Nick Coghlandc9b2552012-05-20 21:01:57 +100094
95 Returns:
Sandro Tosi876ecad2012-05-23 22:26:55 +020096 An IPv4Interface or IPv6Interface object.
Nick Coghlandc9b2552012-05-20 21:01:57 +100097
98 Raises:
99 ValueError: if the string passed isn't either a v4 or a v6
Nick Coghlan51c30672012-05-27 00:25:58 +1000100 address.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000101
102 Notes:
103 The IPv?Interface classes describe an Address on a particular
104 Network, so they're basically a combination of both the Address
105 and Network classes.
Sandro Tosib95c6342012-05-23 23:17:22 +0200106
Nick Coghlandc9b2552012-05-20 21:01:57 +1000107 """
Nick Coghlandc9b2552012-05-20 21:01:57 +1000108 try:
109 return IPv4Interface(address)
110 except (AddressValueError, NetmaskValueError):
111 pass
112
113 try:
114 return IPv6Interface(address)
115 except (AddressValueError, NetmaskValueError):
116 pass
117
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000118 raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' %
Nick Coghlandc9b2552012-05-20 21:01:57 +1000119 address)
120
121
122def v4_int_to_packed(address):
Sandro Tosi876ecad2012-05-23 22:26:55 +0200123 """Represent an address as 4 packed bytes in network (big-endian) order.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000124
125 Args:
126 address: An integer representation of an IPv4 IP address.
127
128 Returns:
Sandro Tosi876ecad2012-05-23 22:26:55 +0200129 The integer address packed as 4 bytes in network (big-endian) order.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000130
131 Raises:
Sandro Tosi876ecad2012-05-23 22:26:55 +0200132 ValueError: If the integer is negative or too large to be an
133 IPv4 IP address.
Sandro Tosib95c6342012-05-23 23:17:22 +0200134
Nick Coghlandc9b2552012-05-20 21:01:57 +1000135 """
Sandro Tosi876ecad2012-05-23 22:26:55 +0200136 try:
Nick Coghlandb7920b2012-08-20 10:19:12 +1000137 return address.to_bytes(4, 'big')
Sandro Tosi876ecad2012-05-23 22:26:55 +0200138 except:
139 raise ValueError("Address negative or too large for IPv4")
Nick Coghlandc9b2552012-05-20 21:01:57 +1000140
141
142def v6_int_to_packed(address):
Sandro Tosi876ecad2012-05-23 22:26:55 +0200143 """Represent an address as 16 packed bytes in network (big-endian) order.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000144
145 Args:
Sandro Tosib4386d32012-06-02 17:14:22 +0200146 address: An integer representation of an IPv6 IP address.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000147
148 Returns:
Sandro Tosi876ecad2012-05-23 22:26:55 +0200149 The integer address packed as 16 bytes in network (big-endian) order.
Sandro Tosib95c6342012-05-23 23:17:22 +0200150
Nick Coghlandc9b2552012-05-20 21:01:57 +1000151 """
Sandro Tosi876ecad2012-05-23 22:26:55 +0200152 try:
Nick Coghlandb7920b2012-08-20 10:19:12 +1000153 return address.to_bytes(16, 'big')
Sandro Tosi876ecad2012-05-23 22:26:55 +0200154 except:
155 raise ValueError("Address negative or too large for IPv6")
Nick Coghlandc9b2552012-05-20 21:01:57 +1000156
157
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000158def _split_optional_netmask(address):
159 """Helper to split the netmask and raise AddressValueError if needed"""
160 addr = str(address).split('/')
161 if len(addr) > 2:
162 raise AddressValueError("Only one '/' permitted in %r" % address)
163 return addr
164
Nick Coghlan297b1432012-07-08 17:11:04 +1000165
Nick Coghlandc9b2552012-05-20 21:01:57 +1000166def _find_address_range(addresses):
Sandro Tosi876ecad2012-05-23 22:26:55 +0200167 """Find a sequence of IPv#Address.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000168
169 Args:
Sandro Tosi876ecad2012-05-23 22:26:55 +0200170 addresses: a list of IPv#Address objects.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000171
172 Returns:
173 A tuple containing the first and last IP addresses in the sequence.
174
175 """
176 first = last = addresses[0]
177 for ip in addresses[1:]:
178 if ip._ip == last._ip + 1:
179 last = ip
180 else:
181 break
182 return (first, last)
183
Sandro Tosib95c6342012-05-23 23:17:22 +0200184
Nick Coghlandc9b2552012-05-20 21:01:57 +1000185def _count_righthand_zero_bits(number, bits):
186 """Count the number of zero bits on the right hand side.
187
188 Args:
189 number: an integer.
190 bits: maximum number of bits to count.
191
192 Returns:
193 The number of zero bits on the right hand side of the number.
194
195 """
196 if number == 0:
197 return bits
198 for i in range(bits):
Nick Coghlan7319f692012-07-07 21:43:30 +1000199 if (number >> i) & 1:
Nick Coghlandc9b2552012-05-20 21:01:57 +1000200 return i
Nick Coghlan7319f692012-07-07 21:43:30 +1000201 # All bits of interest were zero, even if there are more in the number
202 return bits
Nick Coghlandc9b2552012-05-20 21:01:57 +1000203
204
205def summarize_address_range(first, last):
206 """Summarize a network range given the first and last IP addresses.
207
208 Example:
Eli Bendersky948af232012-10-07 07:23:50 -0700209 >>> list(summarize_address_range(IPv4Address('192.0.2.0'),
210 ... IPv4Address('192.0.2.130')))
211 ... #doctest: +NORMALIZE_WHITESPACE
Nick Coghlandc9b2552012-05-20 21:01:57 +1000212 [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'),
Eli Bendersky948af232012-10-07 07:23:50 -0700213 IPv4Network('192.0.2.130/32')]
Nick Coghlandc9b2552012-05-20 21:01:57 +1000214
215 Args:
216 first: the first IPv4Address or IPv6Address in the range.
217 last: the last IPv4Address or IPv6Address in the range.
218
219 Returns:
220 An iterator of the summarized IPv(4|6) network objects.
221
222 Raise:
223 TypeError:
224 If the first and last objects are not IP addresses.
225 If the first and last objects are not the same version.
226 ValueError:
227 If the last object is not greater than the first.
Nick Coghlan51c30672012-05-27 00:25:58 +1000228 If the version of the first address is not 4 or 6.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000229
230 """
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200231 if (not (isinstance(first, _BaseAddress) and
232 isinstance(last, _BaseAddress))):
Nick Coghlandc9b2552012-05-20 21:01:57 +1000233 raise TypeError('first and last must be IP addresses, not networks')
234 if first.version != last.version:
235 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000236 first, last))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000237 if first > last:
238 raise ValueError('last IP address must be greater than first')
239
Nick Coghlandc9b2552012-05-20 21:01:57 +1000240 if first.version == 4:
241 ip = IPv4Network
242 elif first.version == 6:
243 ip = IPv6Network
244 else:
245 raise ValueError('unknown IP version')
246
247 ip_bits = first._max_prefixlen
248 first_int = first._ip
249 last_int = last._ip
250 while first_int <= last_int:
Nick Coghlan7319f692012-07-07 21:43:30 +1000251 nbits = min(_count_righthand_zero_bits(first_int, ip_bits),
252 (last_int - first_int + 1).bit_length() - 1)
253 net = ip('%s/%d' % (first, ip_bits - nbits))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000254 yield net
Nick Coghlan7319f692012-07-07 21:43:30 +1000255 first_int += 1 << nbits
256 if first_int - 1 == ip._ALL_ONES:
Nick Coghlandc9b2552012-05-20 21:01:57 +1000257 break
Nick Coghlan51c30672012-05-27 00:25:58 +1000258 first = first.__class__(first_int)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000259
Sandro Tosib95c6342012-05-23 23:17:22 +0200260
Nick Coghlandc9b2552012-05-20 21:01:57 +1000261def _collapse_addresses_recursive(addresses):
262 """Loops through the addresses, collapsing concurrent netblocks.
263
264 Example:
265
266 ip1 = IPv4Network('192.0.2.0/26')
267 ip2 = IPv4Network('192.0.2.64/26')
268 ip3 = IPv4Network('192.0.2.128/26')
269 ip4 = IPv4Network('192.0.2.192/26')
270
271 _collapse_addresses_recursive([ip1, ip2, ip3, ip4]) ->
272 [IPv4Network('192.0.2.0/24')]
273
274 This shouldn't be called directly; it is called via
275 collapse_addresses([]).
276
277 Args:
278 addresses: A list of IPv4Network's or IPv6Network's
279
280 Returns:
281 A list of IPv4Network's or IPv6Network's depending on what we were
282 passed.
283
284 """
Nick Coghlan7319f692012-07-07 21:43:30 +1000285 while True:
286 last_addr = None
287 ret_array = []
288 optimized = False
Nick Coghlandc9b2552012-05-20 21:01:57 +1000289
Nick Coghlan7319f692012-07-07 21:43:30 +1000290 for cur_addr in addresses:
291 if not ret_array:
292 last_addr = cur_addr
293 ret_array.append(cur_addr)
294 elif (cur_addr.network_address >= last_addr.network_address and
295 cur_addr.broadcast_address <= last_addr.broadcast_address):
296 optimized = True
297 elif cur_addr == list(last_addr.supernet().subnets())[1]:
298 ret_array[-1] = last_addr = last_addr.supernet()
299 optimized = True
300 else:
301 last_addr = cur_addr
302 ret_array.append(cur_addr)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000303
Nick Coghlan7319f692012-07-07 21:43:30 +1000304 addresses = ret_array
305 if not optimized:
306 return addresses
Nick Coghlandc9b2552012-05-20 21:01:57 +1000307
308
309def collapse_addresses(addresses):
310 """Collapse a list of IP objects.
311
312 Example:
313 collapse_addresses([IPv4Network('192.0.2.0/25'),
314 IPv4Network('192.0.2.128/25')]) ->
315 [IPv4Network('192.0.2.0/24')]
316
317 Args:
318 addresses: An iterator of IPv4Network or IPv6Network objects.
319
320 Returns:
321 An iterator of the collapsed IPv(4|6)Network objects.
322
323 Raises:
324 TypeError: If passed a list of mixed version objects.
325
326 """
327 i = 0
328 addrs = []
329 ips = []
330 nets = []
331
332 # split IP addresses and networks
333 for ip in addresses:
334 if isinstance(ip, _BaseAddress):
335 if ips and ips[-1]._version != ip._version:
336 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000337 ip, ips[-1]))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000338 ips.append(ip)
339 elif ip._prefixlen == ip._max_prefixlen:
340 if ips and ips[-1]._version != ip._version:
341 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000342 ip, ips[-1]))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000343 try:
344 ips.append(ip.ip)
345 except AttributeError:
346 ips.append(ip.network_address)
347 else:
348 if nets and nets[-1]._version != ip._version:
349 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000350 ip, nets[-1]))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000351 nets.append(ip)
352
353 # sort and dedup
354 ips = sorted(set(ips))
355 nets = sorted(set(nets))
356
357 while i < len(ips):
358 (first, last) = _find_address_range(ips[i:])
359 i = ips.index(last) + 1
360 addrs.extend(summarize_address_range(first, last))
361
362 return iter(_collapse_addresses_recursive(sorted(
363 addrs + nets, key=_BaseNetwork._get_networks_key)))
364
365
366def get_mixed_type_key(obj):
367 """Return a key suitable for sorting between networks and addresses.
368
369 Address and Network objects are not sortable by default; they're
370 fundamentally different so the expression
371
372 IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')
373
374 doesn't make any sense. There are some times however, where you may wish
375 to have ipaddress sort these for you anyway. If you need to do this, you
376 can use this function as the key= argument to sorted().
377
378 Args:
379 obj: either a Network or Address object.
380 Returns:
381 appropriate key.
382
383 """
384 if isinstance(obj, _BaseNetwork):
385 return obj._get_networks_key()
386 elif isinstance(obj, _BaseAddress):
387 return obj._get_address_key()
388 return NotImplemented
389
390
Nick Coghlan3008ec02012-07-08 00:45:33 +1000391class _TotalOrderingMixin:
392 # Helper that derives the other comparison operations from
393 # __lt__ and __eq__
Nick Coghlan297b1432012-07-08 17:11:04 +1000394 # We avoid functools.total_ordering because it doesn't handle
395 # NotImplemented correctly yet (http://bugs.python.org/issue10042)
Nick Coghlan3008ec02012-07-08 00:45:33 +1000396 def __eq__(self, other):
397 raise NotImplementedError
398 def __ne__(self, other):
399 equal = self.__eq__(other)
400 if equal is NotImplemented:
401 return NotImplemented
402 return not equal
403 def __lt__(self, other):
404 raise NotImplementedError
405 def __le__(self, other):
406 less = self.__lt__(other)
407 if less is NotImplemented or not less:
408 return self.__eq__(other)
409 return less
410 def __gt__(self, other):
411 less = self.__lt__(other)
412 if less is NotImplemented:
413 return NotImplemented
414 equal = self.__eq__(other)
415 if equal is NotImplemented:
416 return NotImplemented
417 return not (less or equal)
418 def __ge__(self, other):
419 less = self.__lt__(other)
420 if less is NotImplemented:
421 return NotImplemented
422 return not less
423
424class _IPAddressBase(_TotalOrderingMixin):
Nick Coghlandc9b2552012-05-20 21:01:57 +1000425
426 """The mother class."""
427
428 @property
429 def exploded(self):
430 """Return the longhand version of the IP address as a string."""
431 return self._explode_shorthand_ip_string()
432
433 @property
434 def compressed(self):
435 """Return the shorthand version of the IP address as a string."""
436 return str(self)
437
Nick Coghland9722652012-06-17 16:33:00 +1000438 @property
439 def version(self):
440 msg = '%200s has no version specified' % (type(self),)
441 raise NotImplementedError(msg)
442
Nick Coghlan297b1432012-07-08 17:11:04 +1000443 def _check_int_address(self, address):
444 if address < 0:
445 msg = "%d (< 0) is not permitted as an IPv%d address"
446 raise AddressValueError(msg % (address, self._version))
447 if address > self._ALL_ONES:
448 msg = "%d (>= 2**%d) is not permitted as an IPv%d address"
449 raise AddressValueError(msg % (address, self._max_prefixlen,
450 self._version))
451
452 def _check_packed_address(self, address, expected_len):
453 address_len = len(address)
454 if address_len != expected_len:
455 msg = "%r (len %d != %d) is not permitted as an IPv%d address"
456 raise AddressValueError(msg % (address, address_len,
457 expected_len, self._version))
458
Nick Coghlan932346f2014-02-08 23:17:36 +1000459 def _ip_int_from_prefix(self, prefixlen):
460 """Turn the prefix length into a bitwise netmask
Nick Coghlandc9b2552012-05-20 21:01:57 +1000461
462 Args:
463 prefixlen: An integer, the prefix length.
464
465 Returns:
466 An integer.
467
468 """
Nick Coghlandc9b2552012-05-20 21:01:57 +1000469 return self._ALL_ONES ^ (self._ALL_ONES >> prefixlen)
470
Nick Coghlan932346f2014-02-08 23:17:36 +1000471 def _prefix_from_ip_int(self, ip_int):
472 """Return prefix length from the bitwise netmask.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000473
474 Args:
Nick Coghlan932346f2014-02-08 23:17:36 +1000475 ip_int: An integer, the netmask in axpanded bitwise format
Nick Coghlandc9b2552012-05-20 21:01:57 +1000476
477 Returns:
478 An integer, the prefix length.
479
Nick Coghlan932346f2014-02-08 23:17:36 +1000480 Raises:
481 ValueError: If the input intermingles zeroes & ones
Nick Coghlandc9b2552012-05-20 21:01:57 +1000482 """
Nick Coghlan932346f2014-02-08 23:17:36 +1000483 trailing_zeroes = _count_righthand_zero_bits(ip_int,
484 self._max_prefixlen)
485 prefixlen = self._max_prefixlen - trailing_zeroes
486 leading_ones = ip_int >> trailing_zeroes
487 all_ones = (1 << prefixlen) - 1
488 if leading_ones != all_ones:
489 byteslen = self._max_prefixlen // 8
490 details = ip_int.to_bytes(byteslen, 'big')
491 msg = 'Netmask pattern %r mixes zeroes & ones'
492 raise ValueError(msg % details)
493 return prefixlen
Nick Coghlandc9b2552012-05-20 21:01:57 +1000494
Nick Coghlan932346f2014-02-08 23:17:36 +1000495 def _report_invalid_netmask(self, netmask_str):
496 msg = '%r is not a valid netmask' % netmask_str
497 raise NetmaskValueError(msg) from None
498
499 def _prefix_from_prefix_string(self, prefixlen_str):
500 """Return prefix length from a numeric string
Nick Coghlandc9b2552012-05-20 21:01:57 +1000501
502 Args:
Nick Coghlan932346f2014-02-08 23:17:36 +1000503 prefixlen_str: The string to be converted
Nick Coghlandc9b2552012-05-20 21:01:57 +1000504
505 Returns:
Nick Coghlan932346f2014-02-08 23:17:36 +1000506 An integer, the prefix length.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000507
Nick Coghlan932346f2014-02-08 23:17:36 +1000508 Raises:
509 NetmaskValueError: If the input is not a valid netmask
Nick Coghlandc9b2552012-05-20 21:01:57 +1000510 """
Nick Coghlan932346f2014-02-08 23:17:36 +1000511 # int allows a leading +/- as well as surrounding whitespace,
512 # so we ensure that isn't the case
513 if not _BaseV4._DECIMAL_DIGITS.issuperset(prefixlen_str):
514 self._report_invalid_netmask(prefixlen_str)
515 try:
516 prefixlen = int(prefixlen_str)
517 except ValueError:
518 self._report_invalid_netmask(prefixlen_str)
519 if not (0 <= prefixlen <= self._max_prefixlen):
520 self._report_invalid_netmask(prefixlen_str)
521 return prefixlen
522
523 def _prefix_from_ip_string(self, ip_str):
524 """Turn a netmask/hostmask string into a prefix length
525
526 Args:
527 ip_str: The netmask/hostmask to be converted
528
529 Returns:
530 An integer, the prefix length.
531
532 Raises:
533 NetmaskValueError: If the input is not a valid netmask/hostmask
534 """
535 # Parse the netmask/hostmask like an IP address.
536 try:
537 ip_int = self._ip_int_from_string(ip_str)
538 except AddressValueError:
539 self._report_invalid_netmask(ip_str)
540
541 # Try matching a netmask (this would be /1*0*/ as a bitwise regexp).
542 # Note that the two ambiguous cases (all-ones and all-zeroes) are
543 # treated as netmasks.
544 try:
545 return self._prefix_from_ip_int(ip_int)
546 except ValueError:
547 pass
548
549 # Invert the bits, and try matching a /0+1+/ hostmask instead.
550 ip_int ^= self._ALL_ONES
551 try:
552 return self._prefix_from_ip_int(ip_int)
553 except ValueError:
554 self._report_invalid_netmask(ip_str)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000555
Nick Coghlan730f67f2012-08-05 22:02:18 +1000556
Nick Coghlandc9b2552012-05-20 21:01:57 +1000557class _BaseAddress(_IPAddressBase):
558
559 """A generic IP object.
560
561 This IP class contains the version independent methods which are
562 used by single IP addresses.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000563 """
564
565 def __init__(self, address):
566 if (not isinstance(address, bytes)
567 and '/' in str(address)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000568 raise AddressValueError("Unexpected '/' in %r" % address)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000569
Nick Coghlandc9b2552012-05-20 21:01:57 +1000570 def __int__(self):
571 return self._ip
572
Nick Coghlandc9b2552012-05-20 21:01:57 +1000573 def __eq__(self, other):
574 try:
575 return (self._ip == other._ip
576 and self._version == other._version)
577 except AttributeError:
578 return NotImplemented
579
Nick Coghlandc9b2552012-05-20 21:01:57 +1000580 def __lt__(self, other):
581 if self._version != other._version:
582 raise TypeError('%s and %s are not of the same version' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000583 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000584 if not isinstance(other, _BaseAddress):
585 raise TypeError('%s and %s are not of the same type' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000586 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000587 if self._ip != other._ip:
588 return self._ip < other._ip
589 return False
590
Nick Coghlandc9b2552012-05-20 21:01:57 +1000591 # Shorthand for Integer addition and subtraction. This is not
592 # meant to ever support addition/subtraction of addresses.
593 def __add__(self, other):
594 if not isinstance(other, int):
595 return NotImplemented
Nick Coghlan51c30672012-05-27 00:25:58 +1000596 return self.__class__(int(self) + other)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000597
598 def __sub__(self, other):
599 if not isinstance(other, int):
600 return NotImplemented
Nick Coghlan51c30672012-05-27 00:25:58 +1000601 return self.__class__(int(self) - other)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000602
603 def __repr__(self):
604 return '%s(%r)' % (self.__class__.__name__, str(self))
605
606 def __str__(self):
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200607 return str(self._string_from_ip_int(self._ip))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000608
609 def __hash__(self):
610 return hash(hex(int(self._ip)))
611
612 def _get_address_key(self):
613 return (self._version, self)
614
Nick Coghlandc9b2552012-05-20 21:01:57 +1000615
616class _BaseNetwork(_IPAddressBase):
617
Nick Coghlan51c30672012-05-27 00:25:58 +1000618 """A generic IP network object.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000619
620 This IP class contains the version independent methods which are
621 used by networks.
622
623 """
Nick Coghlandc9b2552012-05-20 21:01:57 +1000624 def __init__(self, address):
625 self._cache = {}
626
Nick Coghlandc9b2552012-05-20 21:01:57 +1000627 def __repr__(self):
628 return '%s(%r)' % (self.__class__.__name__, str(self))
629
Hynek Schlawack454a74d2012-06-04 18:14:02 +0200630 def __str__(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000631 return '%s/%d' % (self.network_address, self.prefixlen)
Hynek Schlawack454a74d2012-06-04 18:14:02 +0200632
Nick Coghlandc9b2552012-05-20 21:01:57 +1000633 def hosts(self):
634 """Generate Iterator over usable hosts in a network.
635
Sandro Tosib95c6342012-05-23 23:17:22 +0200636 This is like __iter__ except it doesn't return the network
637 or broadcast addresses.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000638
639 """
Nick Coghlan7319f692012-07-07 21:43:30 +1000640 network = int(self.network_address)
641 broadcast = int(self.broadcast_address)
642 for x in range(network + 1, broadcast):
643 yield self._address_class(x)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000644
645 def __iter__(self):
Nick Coghlan7319f692012-07-07 21:43:30 +1000646 network = int(self.network_address)
647 broadcast = int(self.broadcast_address)
648 for x in range(network, broadcast + 1):
649 yield self._address_class(x)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000650
651 def __getitem__(self, n):
652 network = int(self.network_address)
653 broadcast = int(self.broadcast_address)
654 if n >= 0:
655 if network + n > broadcast:
656 raise IndexError
Nick Coghlan51c30672012-05-27 00:25:58 +1000657 return self._address_class(network + n)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000658 else:
659 n += 1
660 if broadcast + n < network:
661 raise IndexError
Nick Coghlan51c30672012-05-27 00:25:58 +1000662 return self._address_class(broadcast + n)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000663
664 def __lt__(self, other):
665 if self._version != other._version:
666 raise TypeError('%s and %s are not of the same version' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000667 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000668 if not isinstance(other, _BaseNetwork):
669 raise TypeError('%s and %s are not of the same type' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000670 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000671 if self.network_address != other.network_address:
672 return self.network_address < other.network_address
673 if self.netmask != other.netmask:
674 return self.netmask < other.netmask
675 return False
676
Nick Coghlandc9b2552012-05-20 21:01:57 +1000677 def __eq__(self, other):
Nick Coghlan9a9c28c2012-07-07 23:05:59 +1000678 try:
679 return (self._version == other._version and
680 self.network_address == other.network_address and
681 int(self.netmask) == int(other.netmask))
682 except AttributeError:
683 return NotImplemented
Nick Coghlandc9b2552012-05-20 21:01:57 +1000684
Nick Coghlandc9b2552012-05-20 21:01:57 +1000685 def __hash__(self):
686 return hash(int(self.network_address) ^ int(self.netmask))
687
688 def __contains__(self, other):
689 # always false if one is v4 and the other is v6.
690 if self._version != other._version:
691 return False
692 # dealing with another network.
693 if isinstance(other, _BaseNetwork):
694 return False
695 # dealing with another address
696 else:
697 # address
698 return (int(self.network_address) <= int(other._ip) <=
699 int(self.broadcast_address))
700
701 def overlaps(self, other):
702 """Tell if self is partly contained in other."""
703 return self.network_address in other or (
704 self.broadcast_address in other or (
705 other.network_address in self or (
706 other.broadcast_address in self)))
707
708 @property
709 def broadcast_address(self):
710 x = self._cache.get('broadcast_address')
711 if x is None:
Nick Coghlan51c30672012-05-27 00:25:58 +1000712 x = self._address_class(int(self.network_address) |
713 int(self.hostmask))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000714 self._cache['broadcast_address'] = x
715 return x
716
717 @property
718 def hostmask(self):
719 x = self._cache.get('hostmask')
720 if x is None:
Nick Coghlan51c30672012-05-27 00:25:58 +1000721 x = self._address_class(int(self.netmask) ^ self._ALL_ONES)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000722 self._cache['hostmask'] = x
723 return x
724
725 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +1000726 def with_prefixlen(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000727 return '%s/%d' % (self.network_address, self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000728
729 @property
730 def with_netmask(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000731 return '%s/%s' % (self.network_address, self.netmask)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000732
733 @property
734 def with_hostmask(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000735 return '%s/%s' % (self.network_address, self.hostmask)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000736
737 @property
738 def num_addresses(self):
739 """Number of hosts in the current subnet."""
740 return int(self.broadcast_address) - int(self.network_address) + 1
741
742 @property
Nick Coghlan51c30672012-05-27 00:25:58 +1000743 def _address_class(self):
Nick Coghland9722652012-06-17 16:33:00 +1000744 # Returning bare address objects (rather than interfaces) allows for
745 # more consistent behaviour across the network address, broadcast
746 # address and individual host addresses.
747 msg = '%200s has no associated address class' % (type(self),)
748 raise NotImplementedError(msg)
Nick Coghlan51c30672012-05-27 00:25:58 +1000749
750 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +1000751 def prefixlen(self):
752 return self._prefixlen
753
754 def address_exclude(self, other):
755 """Remove an address from a larger block.
756
757 For example:
758
759 addr1 = ip_network('192.0.2.0/28')
760 addr2 = ip_network('192.0.2.1/32')
761 addr1.address_exclude(addr2) =
762 [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'),
763 IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')]
764
765 or IPv6:
766
767 addr1 = ip_network('2001:db8::1/32')
768 addr2 = ip_network('2001:db8::1/128')
769 addr1.address_exclude(addr2) =
770 [ip_network('2001:db8::1/128'),
771 ip_network('2001:db8::2/127'),
772 ip_network('2001:db8::4/126'),
773 ip_network('2001:db8::8/125'),
774 ...
775 ip_network('2001:db8:8000::/33')]
776
777 Args:
778 other: An IPv4Network or IPv6Network object of the same type.
779
780 Returns:
Ezio Melotti3f5db392013-01-27 06:20:14 +0200781 An iterator of the IPv(4|6)Network objects which is self
Nick Coghlandc9b2552012-05-20 21:01:57 +1000782 minus other.
783
784 Raises:
Ezio Melotti30b9d5d2013-08-17 15:50:46 +0300785 TypeError: If self and other are of differing address
Nick Coghlandc9b2552012-05-20 21:01:57 +1000786 versions, or if other is not a network object.
787 ValueError: If other is not completely contained by self.
788
789 """
790 if not self._version == other._version:
791 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000792 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000793
794 if not isinstance(other, _BaseNetwork):
Nick Coghlan912238e2012-07-07 13:34:50 +1000795 raise TypeError("%s is not a network object" % other)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000796
797 if not (other.network_address >= self.network_address and
798 other.broadcast_address <= self.broadcast_address):
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200799 raise ValueError('%s not contained in %s' % (other, self))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000800 if other == self:
801 raise StopIteration
802
Nick Coghlandc9b2552012-05-20 21:01:57 +1000803 # Make sure we're comparing the network of other.
Nick Coghlan912238e2012-07-07 13:34:50 +1000804 other = other.__class__('%s/%s' % (other.network_address,
805 other.prefixlen))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000806
807 s1, s2 = self.subnets()
808 while s1 != other and s2 != other:
809 if (other.network_address >= s1.network_address and
810 other.broadcast_address <= s1.broadcast_address):
811 yield s2
812 s1, s2 = s1.subnets()
813 elif (other.network_address >= s2.network_address and
814 other.broadcast_address <= s2.broadcast_address):
815 yield s1
816 s1, s2 = s2.subnets()
817 else:
818 # If we got here, there's a bug somewhere.
819 raise AssertionError('Error performing exclusion: '
820 's1: %s s2: %s other: %s' %
Nick Coghlan912238e2012-07-07 13:34:50 +1000821 (s1, s2, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000822 if s1 == other:
823 yield s2
824 elif s2 == other:
825 yield s1
826 else:
827 # If we got here, there's a bug somewhere.
828 raise AssertionError('Error performing exclusion: '
829 's1: %s s2: %s other: %s' %
Nick Coghlan912238e2012-07-07 13:34:50 +1000830 (s1, s2, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000831
832 def compare_networks(self, other):
833 """Compare two IP objects.
834
835 This is only concerned about the comparison of the integer
836 representation of the network addresses. This means that the
837 host bits aren't considered at all in this method. If you want
838 to compare host bits, you can easily enough do a
839 'HostA._ip < HostB._ip'
840
841 Args:
842 other: An IP object.
843
844 Returns:
845 If the IP versions of self and other are the same, returns:
846
847 -1 if self < other:
848 eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25')
849 IPv6Network('2001:db8::1000/124') <
850 IPv6Network('2001:db8::2000/124')
851 0 if self == other
852 eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24')
853 IPv6Network('2001:db8::1000/124') ==
854 IPv6Network('2001:db8::1000/124')
855 1 if self > other
856 eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25')
857 IPv6Network('2001:db8::2000/124') >
858 IPv6Network('2001:db8::1000/124')
859
860 Raises:
861 TypeError if the IP versions are different.
862
863 """
864 # does this need to raise a ValueError?
865 if self._version != other._version:
866 raise TypeError('%s and %s are not of the same type' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000867 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000868 # self._version == other._version below here:
869 if self.network_address < other.network_address:
870 return -1
871 if self.network_address > other.network_address:
872 return 1
873 # self.network_address == other.network_address below here:
874 if self.netmask < other.netmask:
875 return -1
876 if self.netmask > other.netmask:
877 return 1
878 return 0
879
880 def _get_networks_key(self):
881 """Network-only key function.
882
883 Returns an object that identifies this address' network and
884 netmask. This function is a suitable "key" argument for sorted()
885 and list.sort().
886
887 """
888 return (self._version, self.network_address, self.netmask)
889
890 def subnets(self, prefixlen_diff=1, new_prefix=None):
891 """The subnets which join to make the current subnet.
892
893 In the case that self contains only one IP
894 (self._prefixlen == 32 for IPv4 or self._prefixlen == 128
895 for IPv6), yield an iterator with just ourself.
896
897 Args:
898 prefixlen_diff: An integer, the amount the prefix length
899 should be increased by. This should not be set if
900 new_prefix is also set.
901 new_prefix: The desired new prefix length. This must be a
902 larger number (smaller prefix) than the existing prefix.
903 This should not be set if prefixlen_diff is also set.
904
905 Returns:
906 An iterator of IPv(4|6) objects.
907
908 Raises:
909 ValueError: The prefixlen_diff is too small or too large.
910 OR
911 prefixlen_diff and new_prefix are both set or new_prefix
912 is a smaller number than the current prefix (smaller
913 number means a larger network)
914
915 """
916 if self._prefixlen == self._max_prefixlen:
917 yield self
918 return
919
920 if new_prefix is not None:
921 if new_prefix < self._prefixlen:
922 raise ValueError('new prefix must be longer')
923 if prefixlen_diff != 1:
924 raise ValueError('cannot set prefixlen_diff and new_prefix')
925 prefixlen_diff = new_prefix - self._prefixlen
926
927 if prefixlen_diff < 0:
928 raise ValueError('prefix length diff must be > 0')
929 new_prefixlen = self._prefixlen + prefixlen_diff
930
Nick Coghlan932346f2014-02-08 23:17:36 +1000931 if new_prefixlen > self._max_prefixlen:
Nick Coghlandc9b2552012-05-20 21:01:57 +1000932 raise ValueError(
933 'prefix length diff %d is invalid for netblock %s' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000934 new_prefixlen, self))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000935
Nick Coghlan51c30672012-05-27 00:25:58 +1000936 first = self.__class__('%s/%s' %
Nick Coghlan912238e2012-07-07 13:34:50 +1000937 (self.network_address,
938 self._prefixlen + prefixlen_diff))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000939
940 yield first
941 current = first
942 while True:
943 broadcast = current.broadcast_address
944 if broadcast == self.broadcast_address:
945 return
Nick Coghlan51c30672012-05-27 00:25:58 +1000946 new_addr = self._address_class(int(broadcast) + 1)
Nick Coghlan912238e2012-07-07 13:34:50 +1000947 current = self.__class__('%s/%s' % (new_addr,
948 new_prefixlen))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000949
950 yield current
951
Nick Coghlandc9b2552012-05-20 21:01:57 +1000952 def supernet(self, prefixlen_diff=1, new_prefix=None):
953 """The supernet containing the current network.
954
955 Args:
956 prefixlen_diff: An integer, the amount the prefix length of
957 the network should be decreased by. For example, given a
958 /24 network and a prefixlen_diff of 3, a supernet with a
959 /21 netmask is returned.
960
961 Returns:
962 An IPv4 network object.
963
964 Raises:
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200965 ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have
966 a negative prefix length.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000967 OR
968 If prefixlen_diff and new_prefix are both set or new_prefix is a
969 larger number than the current prefix (larger number means a
970 smaller network)
971
972 """
973 if self._prefixlen == 0:
974 return self
975
976 if new_prefix is not None:
977 if new_prefix > self._prefixlen:
978 raise ValueError('new prefix must be shorter')
979 if prefixlen_diff != 1:
980 raise ValueError('cannot set prefixlen_diff and new_prefix')
981 prefixlen_diff = self._prefixlen - new_prefix
982
Nick Coghlandc9b2552012-05-20 21:01:57 +1000983 if self.prefixlen - prefixlen_diff < 0:
984 raise ValueError(
985 'current prefixlen is %d, cannot have a prefixlen_diff of %d' %
986 (self.prefixlen, prefixlen_diff))
987 # TODO (pmoody): optimize this.
Nick Coghlan912238e2012-07-07 13:34:50 +1000988 t = self.__class__('%s/%d' % (self.network_address,
Nick Coghlan51c30672012-05-27 00:25:58 +1000989 self.prefixlen - prefixlen_diff),
990 strict=False)
Nick Coghlan912238e2012-07-07 13:34:50 +1000991 return t.__class__('%s/%d' % (t.network_address, t.prefixlen))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000992
Nick Coghlan730f67f2012-08-05 22:02:18 +1000993 @property
994 def is_multicast(self):
995 """Test if the address is reserved for multicast use.
996
997 Returns:
998 A boolean, True if the address is a multicast address.
999 See RFC 2373 2.7 for details.
1000
1001 """
1002 return (self.network_address.is_multicast and
1003 self.broadcast_address.is_multicast)
1004
1005 @property
1006 def is_reserved(self):
1007 """Test if the address is otherwise IETF reserved.
1008
1009 Returns:
1010 A boolean, True if the address is within one of the
1011 reserved IPv6 Network ranges.
1012
1013 """
1014 return (self.network_address.is_reserved and
1015 self.broadcast_address.is_reserved)
1016
1017 @property
1018 def is_link_local(self):
1019 """Test if the address is reserved for link-local.
1020
1021 Returns:
1022 A boolean, True if the address is reserved per RFC 4291.
1023
1024 """
1025 return (self.network_address.is_link_local and
1026 self.broadcast_address.is_link_local)
1027
1028 @property
1029 def is_private(self):
1030 """Test if this address is allocated for private networks.
1031
1032 Returns:
Peter Moody22c31762013-10-21 13:58:06 -07001033 A boolean, True if the address is reserved per
1034 iana-ipv4-special-registry or iana-ipv6-special-registry.
Nick Coghlan730f67f2012-08-05 22:02:18 +10001035
1036 """
1037 return (self.network_address.is_private and
1038 self.broadcast_address.is_private)
1039
1040 @property
Peter Moody22c31762013-10-21 13:58:06 -07001041 def is_global(self):
Peter Moodybe9c1b12013-10-22 12:36:21 -07001042 """Test if this address is allocated for public networks.
Peter Moody22c31762013-10-21 13:58:06 -07001043
1044 Returns:
1045 A boolean, True if the address is not reserved per
1046 iana-ipv4-special-registry or iana-ipv6-special-registry.
1047
1048 """
1049 return not self.is_private
1050
1051 @property
Nick Coghlan730f67f2012-08-05 22:02:18 +10001052 def is_unspecified(self):
1053 """Test if the address is unspecified.
1054
1055 Returns:
1056 A boolean, True if this is the unspecified address as defined in
1057 RFC 2373 2.5.2.
1058
1059 """
1060 return (self.network_address.is_unspecified and
1061 self.broadcast_address.is_unspecified)
1062
1063 @property
1064 def is_loopback(self):
1065 """Test if the address is a loopback address.
1066
1067 Returns:
1068 A boolean, True if the address is a loopback address as defined in
1069 RFC 2373 2.5.3.
1070
1071 """
1072 return (self.network_address.is_loopback and
1073 self.broadcast_address.is_loopback)
1074
Nick Coghlandc9b2552012-05-20 21:01:57 +10001075
Hynek Schlawackc4b78a32012-06-01 11:48:32 +02001076class _BaseV4:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001077
1078 """Base IPv4 object.
1079
1080 The following methods are used by IPv4 objects in both single IP
1081 addresses and networks.
1082
1083 """
1084
1085 # Equivalent to 255.255.255.255 or 32 bits of 1's.
1086 _ALL_ONES = (2**IPV4LENGTH) - 1
1087 _DECIMAL_DIGITS = frozenset('0123456789')
1088
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001089 # the valid octets for host and netmasks. only useful for IPv4.
Nick Coghlan7319f692012-07-07 21:43:30 +10001090 _valid_mask_octets = frozenset((255, 254, 252, 248, 240, 224, 192, 128, 0))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001091
Nick Coghlandc9b2552012-05-20 21:01:57 +10001092 def __init__(self, address):
1093 self._version = 4
1094 self._max_prefixlen = IPV4LENGTH
1095
1096 def _explode_shorthand_ip_string(self):
1097 return str(self)
1098
1099 def _ip_int_from_string(self, ip_str):
1100 """Turn the given IP string into an integer for comparison.
1101
1102 Args:
1103 ip_str: A string, the IP ip_str.
1104
1105 Returns:
1106 The IP ip_str as an integer.
1107
1108 Raises:
1109 AddressValueError: if ip_str isn't a valid IPv4 Address.
1110
1111 """
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001112 if not ip_str:
1113 raise AddressValueError('Address cannot be empty')
1114
Nick Coghlandc9b2552012-05-20 21:01:57 +10001115 octets = ip_str.split('.')
1116 if len(octets) != 4:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001117 raise AddressValueError("Expected 4 octets in %r" % ip_str)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001118
Nick Coghlan7319f692012-07-07 21:43:30 +10001119 try:
1120 return int.from_bytes(map(self._parse_octet, octets), 'big')
1121 except ValueError as exc:
1122 raise AddressValueError("%s in %r" % (exc, ip_str)) from None
Nick Coghlandc9b2552012-05-20 21:01:57 +10001123
1124 def _parse_octet(self, octet_str):
1125 """Convert a decimal octet into an integer.
1126
1127 Args:
1128 octet_str: A string, the number to parse.
1129
1130 Returns:
1131 The octet as an integer.
1132
1133 Raises:
1134 ValueError: if the octet isn't strictly a decimal from [0..255].
1135
1136 """
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001137 if not octet_str:
1138 raise ValueError("Empty octet not permitted")
Nick Coghlandc9b2552012-05-20 21:01:57 +10001139 # Whitelist the characters, since int() allows a lot of bizarre stuff.
1140 if not self._DECIMAL_DIGITS.issuperset(octet_str):
Nick Coghlan07c4e332012-07-08 23:06:45 +10001141 msg = "Only decimal digits permitted in %r"
1142 raise ValueError(msg % octet_str)
1143 # We do the length check second, since the invalid character error
1144 # is likely to be more informative for the user
1145 if len(octet_str) > 3:
1146 msg = "At most 3 characters permitted in %r"
1147 raise ValueError(msg % octet_str)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001148 # Convert to integer (we know digits are legal)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001149 octet_int = int(octet_str, 10)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001150 # Any octets that look like they *might* be written in octal,
1151 # and which don't look exactly the same in both octal and
1152 # decimal are rejected as ambiguous
1153 if octet_int > 7 and octet_str[0] == '0':
Nick Coghlan07c4e332012-07-08 23:06:45 +10001154 msg = "Ambiguous (octal/decimal) value in %r not permitted"
1155 raise ValueError(msg % octet_str)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001156 if octet_int > 255:
Nick Coghlanb582ecc2012-07-07 22:15:22 +10001157 raise ValueError("Octet %d (> 255) not permitted" % octet_int)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001158 return octet_int
1159
1160 def _string_from_ip_int(self, ip_int):
1161 """Turns a 32-bit integer into dotted decimal notation.
1162
1163 Args:
1164 ip_int: An integer, the IP address.
1165
1166 Returns:
1167 The IP address as a string in dotted decimal notation.
1168
1169 """
Nick Coghlan7319f692012-07-07 21:43:30 +10001170 return '.'.join(map(str, ip_int.to_bytes(4, 'big')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001171
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001172 def _is_valid_netmask(self, netmask):
1173 """Verify that the netmask is valid.
1174
1175 Args:
1176 netmask: A string, either a prefix or dotted decimal
1177 netmask.
1178
1179 Returns:
1180 A boolean, True if the prefix represents a valid IPv4
1181 netmask.
1182
1183 """
1184 mask = netmask.split('.')
1185 if len(mask) == 4:
Nick Coghlan7319f692012-07-07 21:43:30 +10001186 try:
1187 for x in mask:
1188 if int(x) not in self._valid_mask_octets:
1189 return False
1190 except ValueError:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001191 # Found something that isn't an integer or isn't valid
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001192 return False
Nick Coghlan7319f692012-07-07 21:43:30 +10001193 for idx, y in enumerate(mask):
1194 if idx > 0 and y > mask[idx - 1]:
1195 return False
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001196 return True
1197 try:
1198 netmask = int(netmask)
1199 except ValueError:
1200 return False
1201 return 0 <= netmask <= self._max_prefixlen
1202
1203 def _is_hostmask(self, ip_str):
1204 """Test if the IP string is a hostmask (rather than a netmask).
1205
1206 Args:
1207 ip_str: A string, the potential hostmask.
1208
1209 Returns:
1210 A boolean, True if the IP string is a hostmask.
1211
1212 """
1213 bits = ip_str.split('.')
1214 try:
Nick Coghlan7319f692012-07-07 21:43:30 +10001215 parts = [x for x in map(int, bits) if x in self._valid_mask_octets]
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001216 except ValueError:
1217 return False
1218 if len(parts) != len(bits):
1219 return False
1220 if parts[0] < parts[-1]:
1221 return True
1222 return False
1223
Nick Coghlandc9b2552012-05-20 21:01:57 +10001224 @property
1225 def max_prefixlen(self):
1226 return self._max_prefixlen
1227
1228 @property
1229 def version(self):
1230 return self._version
1231
Nick Coghlandc9b2552012-05-20 21:01:57 +10001232
1233class IPv4Address(_BaseV4, _BaseAddress):
1234
1235 """Represent and manipulate single IPv4 Addresses."""
1236
1237 def __init__(self, address):
1238
1239 """
1240 Args:
1241 address: A string or integer representing the IP
1242
1243 Additionally, an integer can be passed, so
1244 IPv4Address('192.0.2.1') == IPv4Address(3221225985).
1245 or, more generally
1246 IPv4Address(int(IPv4Address('192.0.2.1'))) ==
1247 IPv4Address('192.0.2.1')
1248
1249 Raises:
Sandro Tosib4386d32012-06-02 17:14:22 +02001250 AddressValueError: If ipaddress isn't a valid IPv4 address.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001251
1252 """
1253 _BaseAddress.__init__(self, address)
1254 _BaseV4.__init__(self, address)
1255
1256 # Efficient constructor from integer.
1257 if isinstance(address, int):
Nick Coghlan297b1432012-07-08 17:11:04 +10001258 self._check_int_address(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001259 self._ip = address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001260 return
1261
1262 # Constructing from a packed address
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001263 if isinstance(address, bytes):
Nick Coghlan297b1432012-07-08 17:11:04 +10001264 self._check_packed_address(address, 4)
Nick Coghlandb7920b2012-08-20 10:19:12 +10001265 self._ip = int.from_bytes(address, 'big')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001266 return
1267
1268 # Assume input argument to be string or any object representation
1269 # which converts into a formatted IP string.
1270 addr_str = str(address)
1271 self._ip = self._ip_int_from_string(addr_str)
1272
1273 @property
1274 def packed(self):
1275 """The binary representation of this address."""
1276 return v4_int_to_packed(self._ip)
1277
Nick Coghlan730f67f2012-08-05 22:02:18 +10001278 @property
1279 def is_reserved(self):
1280 """Test if the address is otherwise IETF reserved.
1281
1282 Returns:
1283 A boolean, True if the address is within the
1284 reserved IPv4 Network range.
1285
1286 """
1287 reserved_network = IPv4Network('240.0.0.0/4')
1288 return self in reserved_network
1289
1290 @property
Peter Moodybe9c1b12013-10-22 12:36:21 -07001291 @functools.lru_cache()
Nick Coghlan730f67f2012-08-05 22:02:18 +10001292 def is_private(self):
1293 """Test if this address is allocated for private networks.
1294
1295 Returns:
Peter Moody22c31762013-10-21 13:58:06 -07001296 A boolean, True if the address is reserved per
1297 iana-ipv4-special-registry.
Nick Coghlan730f67f2012-08-05 22:02:18 +10001298
1299 """
Peter Moody22c31762013-10-21 13:58:06 -07001300 return (self in IPv4Network('0.0.0.0/8') or
1301 self in IPv4Network('10.0.0.0/8') or
Peter Moody22c31762013-10-21 13:58:06 -07001302 self in IPv4Network('127.0.0.0/8') or
1303 self in IPv4Network('169.254.0.0/16') or
1304 self in IPv4Network('172.16.0.0/12') or
1305 self in IPv4Network('192.0.0.0/29') or
1306 self in IPv4Network('192.0.0.170/31') or
1307 self in IPv4Network('192.0.2.0/24') or
1308 self in IPv4Network('192.168.0.0/16') or
1309 self in IPv4Network('198.18.0.0/15') or
1310 self in IPv4Network('198.51.100.0/24') or
1311 self in IPv4Network('203.0.113.0/24') or
1312 self in IPv4Network('240.0.0.0/4') or
1313 self in IPv4Network('255.255.255.255/32'))
1314
Nick Coghlan730f67f2012-08-05 22:02:18 +10001315
1316 @property
1317 def is_multicast(self):
1318 """Test if the address is reserved for multicast use.
1319
1320 Returns:
1321 A boolean, True if the address is multicast.
1322 See RFC 3171 for details.
1323
1324 """
1325 multicast_network = IPv4Network('224.0.0.0/4')
1326 return self in multicast_network
1327
1328 @property
1329 def is_unspecified(self):
1330 """Test if the address is unspecified.
1331
1332 Returns:
1333 A boolean, True if this is the unspecified address as defined in
1334 RFC 5735 3.
1335
1336 """
1337 unspecified_address = IPv4Address('0.0.0.0')
1338 return self == unspecified_address
1339
1340 @property
1341 def is_loopback(self):
1342 """Test if the address is a loopback address.
1343
1344 Returns:
1345 A boolean, True if the address is a loopback per RFC 3330.
1346
1347 """
1348 loopback_network = IPv4Network('127.0.0.0/8')
1349 return self in loopback_network
1350
1351 @property
1352 def is_link_local(self):
1353 """Test if the address is reserved for link-local.
1354
1355 Returns:
1356 A boolean, True if the address is link-local per RFC 3927.
1357
1358 """
1359 linklocal_network = IPv4Network('169.254.0.0/16')
1360 return self in linklocal_network
1361
Nick Coghlandc9b2552012-05-20 21:01:57 +10001362
1363class IPv4Interface(IPv4Address):
1364
Nick Coghlandc9b2552012-05-20 21:01:57 +10001365 def __init__(self, address):
1366 if isinstance(address, (bytes, int)):
1367 IPv4Address.__init__(self, address)
1368 self.network = IPv4Network(self._ip)
1369 self._prefixlen = self._max_prefixlen
1370 return
1371
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001372 addr = _split_optional_netmask(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001373 IPv4Address.__init__(self, addr[0])
1374
1375 self.network = IPv4Network(address, strict=False)
1376 self._prefixlen = self.network._prefixlen
1377
1378 self.netmask = self.network.netmask
1379 self.hostmask = self.network.hostmask
1380
Nick Coghlandc9b2552012-05-20 21:01:57 +10001381 def __str__(self):
1382 return '%s/%d' % (self._string_from_ip_int(self._ip),
1383 self.network.prefixlen)
1384
1385 def __eq__(self, other):
Nick Coghlan3008ec02012-07-08 00:45:33 +10001386 address_equal = IPv4Address.__eq__(self, other)
1387 if not address_equal or address_equal is NotImplemented:
1388 return address_equal
Nick Coghlandc9b2552012-05-20 21:01:57 +10001389 try:
Nick Coghlan3008ec02012-07-08 00:45:33 +10001390 return self.network == other.network
Nick Coghlandc9b2552012-05-20 21:01:57 +10001391 except AttributeError:
Nick Coghlan3008ec02012-07-08 00:45:33 +10001392 # An interface with an associated network is NOT the
1393 # same as an unassociated address. That's why the hash
1394 # takes the extra info into account.
1395 return False
1396
1397 def __lt__(self, other):
1398 address_less = IPv4Address.__lt__(self, other)
1399 if address_less is NotImplemented:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001400 return NotImplemented
Nick Coghlan3008ec02012-07-08 00:45:33 +10001401 try:
1402 return self.network < other.network
1403 except AttributeError:
1404 # We *do* allow addresses and interfaces to be sorted. The
1405 # unassociated address is considered less than all interfaces.
1406 return False
Nick Coghlandc9b2552012-05-20 21:01:57 +10001407
1408 def __hash__(self):
1409 return self._ip ^ self._prefixlen ^ int(self.network.network_address)
1410
Nick Coghlandc9b2552012-05-20 21:01:57 +10001411 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +10001412 def ip(self):
1413 return IPv4Address(self._ip)
1414
1415 @property
1416 def with_prefixlen(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10001417 return '%s/%s' % (self._string_from_ip_int(self._ip),
1418 self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001419
1420 @property
1421 def with_netmask(self):
1422 return '%s/%s' % (self._string_from_ip_int(self._ip),
1423 self.netmask)
Hynek Schlawack072b1e12012-05-26 12:04:56 +02001424
Nick Coghlandc9b2552012-05-20 21:01:57 +10001425 @property
1426 def with_hostmask(self):
1427 return '%s/%s' % (self._string_from_ip_int(self._ip),
1428 self.hostmask)
1429
1430
1431class IPv4Network(_BaseV4, _BaseNetwork):
1432
1433 """This class represents and manipulates 32-bit IPv4 network + addresses..
1434
1435 Attributes: [examples for IPv4Network('192.0.2.0/27')]
1436 .network_address: IPv4Address('192.0.2.0')
1437 .hostmask: IPv4Address('0.0.0.31')
1438 .broadcast_address: IPv4Address('192.0.2.32')
1439 .netmask: IPv4Address('255.255.255.224')
1440 .prefixlen: 27
1441
1442 """
Nick Coghlan51c30672012-05-27 00:25:58 +10001443 # Class to use when creating address objects
Nick Coghlan51c30672012-05-27 00:25:58 +10001444 _address_class = IPv4Address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001445
Nick Coghlandc9b2552012-05-20 21:01:57 +10001446 def __init__(self, address, strict=True):
1447
1448 """Instantiate a new IPv4 network object.
1449
1450 Args:
1451 address: A string or integer representing the IP [& network].
1452 '192.0.2.0/24'
1453 '192.0.2.0/255.255.255.0'
1454 '192.0.0.2/0.0.0.255'
1455 are all functionally the same in IPv4. Similarly,
1456 '192.0.2.1'
1457 '192.0.2.1/255.255.255.255'
1458 '192.0.2.1/32'
Ezio Melotti30b9d5d2013-08-17 15:50:46 +03001459 are also functionally equivalent. That is to say, failing to
Nick Coghlandc9b2552012-05-20 21:01:57 +10001460 provide a subnetmask will create an object with a mask of /32.
1461
1462 If the mask (portion after the / in the argument) is given in
1463 dotted quad form, it is treated as a netmask if it starts with a
1464 non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it
1465 starts with a zero field (e.g. 0.255.255.255 == /8), with the
1466 single exception of an all-zero mask which is treated as a
1467 netmask == /0. If no mask is given, a default of /32 is used.
1468
1469 Additionally, an integer can be passed, so
1470 IPv4Network('192.0.2.1') == IPv4Network(3221225985)
1471 or, more generally
1472 IPv4Interface(int(IPv4Interface('192.0.2.1'))) ==
1473 IPv4Interface('192.0.2.1')
1474
1475 Raises:
Sandro Tosib4386d32012-06-02 17:14:22 +02001476 AddressValueError: If ipaddress isn't a valid IPv4 address.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001477 NetmaskValueError: If the netmask isn't valid for
1478 an IPv4 address.
Sandro Tosib4386d32012-06-02 17:14:22 +02001479 ValueError: If strict is True and a network address is not
Nick Coghlandc9b2552012-05-20 21:01:57 +10001480 supplied.
1481
1482 """
1483
1484 _BaseV4.__init__(self, address)
1485 _BaseNetwork.__init__(self, address)
1486
1487 # Constructing from a packed address
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001488 if isinstance(address, bytes):
Nick Coghlan297b1432012-07-08 17:11:04 +10001489 self.network_address = IPv4Address(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001490 self._prefixlen = self._max_prefixlen
1491 self.netmask = IPv4Address(self._ALL_ONES)
1492 #fixme: address/network test here
1493 return
1494
1495 # Efficient constructor from integer.
1496 if isinstance(address, int):
Nick Coghlan297b1432012-07-08 17:11:04 +10001497 self.network_address = IPv4Address(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001498 self._prefixlen = self._max_prefixlen
1499 self.netmask = IPv4Address(self._ALL_ONES)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001500 #fixme: address/network test here.
1501 return
1502
1503 # Assume input argument to be string or any object representation
1504 # which converts into a formatted IP prefix string.
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001505 addr = _split_optional_netmask(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001506 self.network_address = IPv4Address(self._ip_int_from_string(addr[0]))
1507
Nick Coghlandc9b2552012-05-20 21:01:57 +10001508 if len(addr) == 2:
Nick Coghlan932346f2014-02-08 23:17:36 +10001509 try:
1510 # Check for a netmask in prefix length form
1511 self._prefixlen = self._prefix_from_prefix_string(addr[1])
1512 except NetmaskValueError:
1513 # Check for a netmask or hostmask in dotted-quad form.
1514 # This may raise NetmaskValueError.
1515 self._prefixlen = self._prefix_from_ip_string(addr[1])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001516 else:
1517 self._prefixlen = self._max_prefixlen
Nick Coghlan932346f2014-02-08 23:17:36 +10001518 self.netmask = IPv4Address(self._ip_int_from_prefix(self._prefixlen))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001519
1520 if strict:
1521 if (IPv4Address(int(self.network_address) & int(self.netmask)) !=
1522 self.network_address):
1523 raise ValueError('%s has host bits set' % self)
1524 self.network_address = IPv4Address(int(self.network_address) &
1525 int(self.netmask))
1526
1527 if self._prefixlen == (self._max_prefixlen - 1):
1528 self.hosts = self.__iter__
1529
Peter Moodye5019d52013-10-24 09:47:10 -07001530 @property
1531 @functools.lru_cache()
1532 def is_global(self):
1533 """Test if this address is allocated for public networks.
1534
1535 Returns:
1536 A boolean, True if the address is not reserved per
1537 iana-ipv4-special-registry.
1538
1539 """
1540 return (not (self.network_address in IPv4Network('100.64.0.0/10') and
1541 self.broadcast_address in IPv4Network('100.64.0.0/10')) and
1542 not self.is_private)
1543
1544
Nick Coghlandc9b2552012-05-20 21:01:57 +10001545
Hynek Schlawackc4b78a32012-06-01 11:48:32 +02001546class _BaseV6:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001547
1548 """Base IPv6 object.
1549
1550 The following methods are used by IPv6 objects in both single IP
1551 addresses and networks.
1552
1553 """
1554
1555 _ALL_ONES = (2**IPV6LENGTH) - 1
1556 _HEXTET_COUNT = 8
1557 _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef')
1558
1559 def __init__(self, address):
1560 self._version = 6
1561 self._max_prefixlen = IPV6LENGTH
1562
1563 def _ip_int_from_string(self, ip_str):
1564 """Turn an IPv6 ip_str into an integer.
1565
1566 Args:
1567 ip_str: A string, the IPv6 ip_str.
1568
1569 Returns:
1570 An int, the IPv6 address
1571
1572 Raises:
1573 AddressValueError: if ip_str isn't a valid IPv6 Address.
1574
1575 """
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001576 if not ip_str:
1577 raise AddressValueError('Address cannot be empty')
1578
Nick Coghlandc9b2552012-05-20 21:01:57 +10001579 parts = ip_str.split(':')
1580
1581 # An IPv6 address needs at least 2 colons (3 parts).
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001582 _min_parts = 3
1583 if len(parts) < _min_parts:
1584 msg = "At least %d parts expected in %r" % (_min_parts, ip_str)
1585 raise AddressValueError(msg)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001586
1587 # If the address has an IPv4-style suffix, convert it to hexadecimal.
1588 if '.' in parts[-1]:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001589 try:
1590 ipv4_int = IPv4Address(parts.pop())._ip
1591 except AddressValueError as exc:
1592 raise AddressValueError("%s in %r" % (exc, ip_str)) from None
Nick Coghlandc9b2552012-05-20 21:01:57 +10001593 parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF))
1594 parts.append('%x' % (ipv4_int & 0xFFFF))
1595
1596 # An IPv6 address can't have more than 8 colons (9 parts).
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001597 # The extra colon comes from using the "::" notation for a single
1598 # leading or trailing zero part.
1599 _max_parts = self._HEXTET_COUNT + 1
1600 if len(parts) > _max_parts:
1601 msg = "At most %d colons permitted in %r" % (_max_parts-1, ip_str)
1602 raise AddressValueError(msg)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001603
1604 # Disregarding the endpoints, find '::' with nothing in between.
1605 # This indicates that a run of zeroes has been skipped.
Nick Coghlan7319f692012-07-07 21:43:30 +10001606 skip_index = None
1607 for i in range(1, len(parts) - 1):
1608 if not parts[i]:
1609 if skip_index is not None:
1610 # Can't have more than one '::'
1611 msg = "At most one '::' permitted in %r" % ip_str
1612 raise AddressValueError(msg)
1613 skip_index = i
Nick Coghlandc9b2552012-05-20 21:01:57 +10001614
1615 # parts_hi is the number of parts to copy from above/before the '::'
1616 # parts_lo is the number of parts to copy from below/after the '::'
1617 if skip_index is not None:
1618 # If we found a '::', then check if it also covers the endpoints.
1619 parts_hi = skip_index
1620 parts_lo = len(parts) - skip_index - 1
1621 if not parts[0]:
1622 parts_hi -= 1
1623 if parts_hi:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001624 msg = "Leading ':' only permitted as part of '::' in %r"
1625 raise AddressValueError(msg % ip_str) # ^: requires ^::
Nick Coghlandc9b2552012-05-20 21:01:57 +10001626 if not parts[-1]:
1627 parts_lo -= 1
1628 if parts_lo:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001629 msg = "Trailing ':' only permitted as part of '::' in %r"
1630 raise AddressValueError(msg % ip_str) # :$ requires ::$
Nick Coghlandc9b2552012-05-20 21:01:57 +10001631 parts_skipped = self._HEXTET_COUNT - (parts_hi + parts_lo)
1632 if parts_skipped < 1:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001633 msg = "Expected at most %d other parts with '::' in %r"
1634 raise AddressValueError(msg % (self._HEXTET_COUNT-1, ip_str))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001635 else:
Hynek Schlawack072b1e12012-05-26 12:04:56 +02001636 # Otherwise, allocate the entire address to parts_hi. The
1637 # endpoints could still be empty, but _parse_hextet() will check
1638 # for that.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001639 if len(parts) != self._HEXTET_COUNT:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001640 msg = "Exactly %d parts expected without '::' in %r"
1641 raise AddressValueError(msg % (self._HEXTET_COUNT, ip_str))
1642 if not parts[0]:
1643 msg = "Leading ':' only permitted as part of '::' in %r"
1644 raise AddressValueError(msg % ip_str) # ^: requires ^::
1645 if not parts[-1]:
1646 msg = "Trailing ':' only permitted as part of '::' in %r"
1647 raise AddressValueError(msg % ip_str) # :$ requires ::$
Nick Coghlandc9b2552012-05-20 21:01:57 +10001648 parts_hi = len(parts)
1649 parts_lo = 0
1650 parts_skipped = 0
1651
1652 try:
1653 # Now, parse the hextets into a 128-bit integer.
1654 ip_int = 0
1655 for i in range(parts_hi):
1656 ip_int <<= 16
1657 ip_int |= self._parse_hextet(parts[i])
1658 ip_int <<= 16 * parts_skipped
1659 for i in range(-parts_lo, 0):
1660 ip_int <<= 16
1661 ip_int |= self._parse_hextet(parts[i])
1662 return ip_int
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001663 except ValueError as exc:
1664 raise AddressValueError("%s in %r" % (exc, ip_str)) from None
Nick Coghlandc9b2552012-05-20 21:01:57 +10001665
1666 def _parse_hextet(self, hextet_str):
1667 """Convert an IPv6 hextet string into an integer.
1668
1669 Args:
1670 hextet_str: A string, the number to parse.
1671
1672 Returns:
1673 The hextet as an integer.
1674
1675 Raises:
Hynek Schlawack072b1e12012-05-26 12:04:56 +02001676 ValueError: if the input isn't strictly a hex number from
1677 [0..FFFF].
Nick Coghlandc9b2552012-05-20 21:01:57 +10001678
1679 """
1680 # Whitelist the characters, since int() allows a lot of bizarre stuff.
1681 if not self._HEX_DIGITS.issuperset(hextet_str):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001682 raise ValueError("Only hex digits permitted in %r" % hextet_str)
Nick Coghlan07c4e332012-07-08 23:06:45 +10001683 # We do the length check second, since the invalid character error
1684 # is likely to be more informative for the user
Nick Coghlan3c2570c2012-07-07 01:13:55 +10001685 if len(hextet_str) > 4:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001686 msg = "At most 4 characters permitted in %r"
1687 raise ValueError(msg % hextet_str)
Nick Coghlan07c4e332012-07-08 23:06:45 +10001688 # Length check means we can skip checking the integer value
1689 return int(hextet_str, 16)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001690
1691 def _compress_hextets(self, hextets):
1692 """Compresses a list of hextets.
1693
1694 Compresses a list of strings, replacing the longest continuous
1695 sequence of "0" in the list with "" and adding empty strings at
1696 the beginning or at the end of the string such that subsequently
1697 calling ":".join(hextets) will produce the compressed version of
1698 the IPv6 address.
1699
1700 Args:
1701 hextets: A list of strings, the hextets to compress.
1702
1703 Returns:
1704 A list of strings.
1705
1706 """
1707 best_doublecolon_start = -1
1708 best_doublecolon_len = 0
1709 doublecolon_start = -1
1710 doublecolon_len = 0
Nick Coghlandb7920b2012-08-20 10:19:12 +10001711 for index, hextet in enumerate(hextets):
1712 if hextet == '0':
Nick Coghlandc9b2552012-05-20 21:01:57 +10001713 doublecolon_len += 1
1714 if doublecolon_start == -1:
1715 # Start of a sequence of zeros.
1716 doublecolon_start = index
1717 if doublecolon_len > best_doublecolon_len:
1718 # This is the longest sequence of zeros so far.
1719 best_doublecolon_len = doublecolon_len
1720 best_doublecolon_start = doublecolon_start
1721 else:
1722 doublecolon_len = 0
1723 doublecolon_start = -1
1724
1725 if best_doublecolon_len > 1:
1726 best_doublecolon_end = (best_doublecolon_start +
1727 best_doublecolon_len)
1728 # For zeros at the end of the address.
1729 if best_doublecolon_end == len(hextets):
1730 hextets += ['']
1731 hextets[best_doublecolon_start:best_doublecolon_end] = ['']
1732 # For zeros at the beginning of the address.
1733 if best_doublecolon_start == 0:
1734 hextets = [''] + hextets
1735
1736 return hextets
1737
1738 def _string_from_ip_int(self, ip_int=None):
1739 """Turns a 128-bit integer into hexadecimal notation.
1740
1741 Args:
1742 ip_int: An integer, the IP address.
1743
1744 Returns:
1745 A string, the hexadecimal representation of the address.
1746
1747 Raises:
1748 ValueError: The address is bigger than 128 bits of all ones.
1749
1750 """
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001751 if ip_int is None:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001752 ip_int = int(self._ip)
1753
1754 if ip_int > self._ALL_ONES:
1755 raise ValueError('IPv6 address is too large')
1756
1757 hex_str = '%032x' % ip_int
Nick Coghlan7319f692012-07-07 21:43:30 +10001758 hextets = ['%x' % int(hex_str[x:x+4], 16) for x in range(0, 32, 4)]
Nick Coghlandc9b2552012-05-20 21:01:57 +10001759
1760 hextets = self._compress_hextets(hextets)
1761 return ':'.join(hextets)
1762
1763 def _explode_shorthand_ip_string(self):
1764 """Expand a shortened IPv6 address.
1765
1766 Args:
1767 ip_str: A string, the IPv6 address.
1768
1769 Returns:
1770 A string, the expanded IPv6 address.
1771
1772 """
1773 if isinstance(self, IPv6Network):
1774 ip_str = str(self.network_address)
1775 elif isinstance(self, IPv6Interface):
1776 ip_str = str(self.ip)
1777 else:
1778 ip_str = str(self)
1779
1780 ip_int = self._ip_int_from_string(ip_str)
Nick Coghlan7319f692012-07-07 21:43:30 +10001781 hex_str = '%032x' % ip_int
1782 parts = [hex_str[x:x+4] for x in range(0, 32, 4)]
Nick Coghlandc9b2552012-05-20 21:01:57 +10001783 if isinstance(self, (_BaseNetwork, IPv6Interface)):
Nick Coghlane3ded952012-08-05 22:45:22 +10001784 return '%s/%d' % (':'.join(parts), self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001785 return ':'.join(parts)
1786
1787 @property
1788 def max_prefixlen(self):
1789 return self._max_prefixlen
1790
1791 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +10001792 def version(self):
1793 return self._version
1794
Nick Coghlandc9b2552012-05-20 21:01:57 +10001795
1796class IPv6Address(_BaseV6, _BaseAddress):
1797
Sandro Tosib95c6342012-05-23 23:17:22 +02001798 """Represent and manipulate single IPv6 Addresses."""
Nick Coghlandc9b2552012-05-20 21:01:57 +10001799
1800 def __init__(self, address):
1801 """Instantiate a new IPv6 address object.
1802
1803 Args:
1804 address: A string or integer representing the IP
1805
1806 Additionally, an integer can be passed, so
1807 IPv6Address('2001:db8::') ==
1808 IPv6Address(42540766411282592856903984951653826560)
1809 or, more generally
1810 IPv6Address(int(IPv6Address('2001:db8::'))) ==
1811 IPv6Address('2001:db8::')
1812
1813 Raises:
1814 AddressValueError: If address isn't a valid IPv6 address.
1815
1816 """
1817 _BaseAddress.__init__(self, address)
1818 _BaseV6.__init__(self, address)
1819
1820 # Efficient constructor from integer.
1821 if isinstance(address, int):
Nick Coghlan297b1432012-07-08 17:11:04 +10001822 self._check_int_address(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001823 self._ip = address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001824 return
1825
1826 # Constructing from a packed address
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001827 if isinstance(address, bytes):
Nick Coghlan297b1432012-07-08 17:11:04 +10001828 self._check_packed_address(address, 16)
Nick Coghlandb7920b2012-08-20 10:19:12 +10001829 self._ip = int.from_bytes(address, 'big')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001830 return
1831
1832 # Assume input argument to be string or any object representation
1833 # which converts into a formatted IP string.
1834 addr_str = str(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001835 self._ip = self._ip_int_from_string(addr_str)
1836
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001837 @property
1838 def packed(self):
1839 """The binary representation of this address."""
1840 return v6_int_to_packed(self._ip)
1841
Nick Coghlan730f67f2012-08-05 22:02:18 +10001842 @property
1843 def is_multicast(self):
1844 """Test if the address is reserved for multicast use.
1845
1846 Returns:
1847 A boolean, True if the address is a multicast address.
1848 See RFC 2373 2.7 for details.
1849
1850 """
1851 multicast_network = IPv6Network('ff00::/8')
1852 return self in multicast_network
1853
1854 @property
1855 def is_reserved(self):
1856 """Test if the address is otherwise IETF reserved.
1857
1858 Returns:
1859 A boolean, True if the address is within one of the
1860 reserved IPv6 Network ranges.
1861
1862 """
1863 reserved_networks = [IPv6Network('::/8'), IPv6Network('100::/8'),
1864 IPv6Network('200::/7'), IPv6Network('400::/6'),
1865 IPv6Network('800::/5'), IPv6Network('1000::/4'),
1866 IPv6Network('4000::/3'), IPv6Network('6000::/3'),
1867 IPv6Network('8000::/3'), IPv6Network('A000::/3'),
1868 IPv6Network('C000::/3'), IPv6Network('E000::/4'),
1869 IPv6Network('F000::/5'), IPv6Network('F800::/6'),
1870 IPv6Network('FE00::/9')]
1871
1872 return any(self in x for x in reserved_networks)
1873
1874 @property
1875 def is_link_local(self):
1876 """Test if the address is reserved for link-local.
1877
1878 Returns:
1879 A boolean, True if the address is reserved per RFC 4291.
1880
1881 """
1882 linklocal_network = IPv6Network('fe80::/10')
1883 return self in linklocal_network
1884
1885 @property
1886 def is_site_local(self):
1887 """Test if the address is reserved for site-local.
1888
1889 Note that the site-local address space has been deprecated by RFC 3879.
1890 Use is_private to test if this address is in the space of unique local
1891 addresses as defined by RFC 4193.
1892
1893 Returns:
1894 A boolean, True if the address is reserved per RFC 3513 2.5.6.
1895
1896 """
1897 sitelocal_network = IPv6Network('fec0::/10')
1898 return self in sitelocal_network
1899
1900 @property
Peter Moodybe9c1b12013-10-22 12:36:21 -07001901 @functools.lru_cache()
Nick Coghlan730f67f2012-08-05 22:02:18 +10001902 def is_private(self):
1903 """Test if this address is allocated for private networks.
1904
1905 Returns:
Peter Moody22c31762013-10-21 13:58:06 -07001906 A boolean, True if the address is reserved per
1907 iana-ipv6-special-registry.
Nick Coghlan730f67f2012-08-05 22:02:18 +10001908
1909 """
Peter Moody22c31762013-10-21 13:58:06 -07001910 return (self in IPv6Network('::1/128') or
1911 self in IPv6Network('::/128') or
1912 self in IPv6Network('::ffff:0:0/96') or
1913 self in IPv6Network('100::/64') or
1914 self in IPv6Network('2001::/23') or
1915 self in IPv6Network('2001:2::/48') or
1916 self in IPv6Network('2001:db8::/32') or
1917 self in IPv6Network('2001:10::/28') or
1918 self in IPv6Network('fc00::/7') or
1919 self in IPv6Network('fe80::/10'))
1920
1921 @property
1922 def is_global(self):
1923 """Test if this address is allocated for public networks.
1924
1925 Returns:
1926 A boolean, true if the address is not reserved per
1927 iana-ipv6-special-registry.
1928
1929 """
1930 return not self.is_private
Nick Coghlan730f67f2012-08-05 22:02:18 +10001931
1932 @property
1933 def is_unspecified(self):
1934 """Test if the address is unspecified.
1935
1936 Returns:
1937 A boolean, True if this is the unspecified address as defined in
1938 RFC 2373 2.5.2.
1939
1940 """
1941 return self._ip == 0
1942
1943 @property
1944 def is_loopback(self):
1945 """Test if the address is a loopback address.
1946
1947 Returns:
1948 A boolean, True if the address is a loopback address as defined in
1949 RFC 2373 2.5.3.
1950
1951 """
1952 return self._ip == 1
1953
1954 @property
1955 def ipv4_mapped(self):
1956 """Return the IPv4 mapped address.
1957
1958 Returns:
1959 If the IPv6 address is a v4 mapped address, return the
1960 IPv4 mapped address. Return None otherwise.
1961
1962 """
1963 if (self._ip >> 32) != 0xFFFF:
1964 return None
1965 return IPv4Address(self._ip & 0xFFFFFFFF)
1966
1967 @property
1968 def teredo(self):
1969 """Tuple of embedded teredo IPs.
1970
1971 Returns:
1972 Tuple of the (server, client) IPs or None if the address
1973 doesn't appear to be a teredo address (doesn't start with
1974 2001::/32)
1975
1976 """
1977 if (self._ip >> 96) != 0x20010000:
1978 return None
1979 return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF),
1980 IPv4Address(~self._ip & 0xFFFFFFFF))
1981
1982 @property
1983 def sixtofour(self):
1984 """Return the IPv4 6to4 embedded address.
1985
1986 Returns:
1987 The IPv4 6to4-embedded address if present or None if the
1988 address doesn't appear to contain a 6to4 embedded address.
1989
1990 """
1991 if (self._ip >> 112) != 0x2002:
1992 return None
1993 return IPv4Address((self._ip >> 80) & 0xFFFFFFFF)
1994
Nick Coghlandc9b2552012-05-20 21:01:57 +10001995
1996class IPv6Interface(IPv6Address):
1997
1998 def __init__(self, address):
1999 if isinstance(address, (bytes, int)):
2000 IPv6Address.__init__(self, address)
2001 self.network = IPv6Network(self._ip)
2002 self._prefixlen = self._max_prefixlen
2003 return
2004
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10002005 addr = _split_optional_netmask(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002006 IPv6Address.__init__(self, addr[0])
2007 self.network = IPv6Network(address, strict=False)
2008 self.netmask = self.network.netmask
2009 self._prefixlen = self.network._prefixlen
2010 self.hostmask = self.network.hostmask
2011
Nick Coghlandc9b2552012-05-20 21:01:57 +10002012 def __str__(self):
2013 return '%s/%d' % (self._string_from_ip_int(self._ip),
2014 self.network.prefixlen)
2015
2016 def __eq__(self, other):
Nick Coghlan3008ec02012-07-08 00:45:33 +10002017 address_equal = IPv6Address.__eq__(self, other)
2018 if not address_equal or address_equal is NotImplemented:
2019 return address_equal
Nick Coghlandc9b2552012-05-20 21:01:57 +10002020 try:
Nick Coghlan3008ec02012-07-08 00:45:33 +10002021 return self.network == other.network
Nick Coghlandc9b2552012-05-20 21:01:57 +10002022 except AttributeError:
Nick Coghlan3008ec02012-07-08 00:45:33 +10002023 # An interface with an associated network is NOT the
2024 # same as an unassociated address. That's why the hash
2025 # takes the extra info into account.
2026 return False
2027
2028 def __lt__(self, other):
2029 address_less = IPv6Address.__lt__(self, other)
2030 if address_less is NotImplemented:
Nick Coghlandc9b2552012-05-20 21:01:57 +10002031 return NotImplemented
Nick Coghlan3008ec02012-07-08 00:45:33 +10002032 try:
2033 return self.network < other.network
2034 except AttributeError:
2035 # We *do* allow addresses and interfaces to be sorted. The
2036 # unassociated address is considered less than all interfaces.
2037 return False
Nick Coghlandc9b2552012-05-20 21:01:57 +10002038
2039 def __hash__(self):
2040 return self._ip ^ self._prefixlen ^ int(self.network.network_address)
2041
2042 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +10002043 def ip(self):
2044 return IPv6Address(self._ip)
2045
2046 @property
2047 def with_prefixlen(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10002048 return '%s/%s' % (self._string_from_ip_int(self._ip),
2049 self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002050
2051 @property
2052 def with_netmask(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10002053 return '%s/%s' % (self._string_from_ip_int(self._ip),
2054 self.netmask)
Hynek Schlawack072b1e12012-05-26 12:04:56 +02002055
Nick Coghlandc9b2552012-05-20 21:01:57 +10002056 @property
2057 def with_hostmask(self):
2058 return '%s/%s' % (self._string_from_ip_int(self._ip),
2059 self.hostmask)
2060
Nick Coghlan730f67f2012-08-05 22:02:18 +10002061 @property
2062 def is_unspecified(self):
2063 return self._ip == 0 and self.network.is_unspecified
2064
2065 @property
2066 def is_loopback(self):
2067 return self._ip == 1 and self.network.is_loopback
2068
Nick Coghlandc9b2552012-05-20 21:01:57 +10002069
2070class IPv6Network(_BaseV6, _BaseNetwork):
2071
2072 """This class represents and manipulates 128-bit IPv6 networks.
2073
2074 Attributes: [examples for IPv6('2001:db8::1000/124')]
2075 .network_address: IPv6Address('2001:db8::1000')
2076 .hostmask: IPv6Address('::f')
2077 .broadcast_address: IPv6Address('2001:db8::100f')
2078 .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0')
2079 .prefixlen: 124
2080
2081 """
2082
Nick Coghlan51c30672012-05-27 00:25:58 +10002083 # Class to use when creating address objects
Nick Coghlan51c30672012-05-27 00:25:58 +10002084 _address_class = IPv6Address
2085
Nick Coghlandc9b2552012-05-20 21:01:57 +10002086 def __init__(self, address, strict=True):
2087 """Instantiate a new IPv6 Network object.
2088
2089 Args:
Hynek Schlawack072b1e12012-05-26 12:04:56 +02002090 address: A string or integer representing the IPv6 network or the
2091 IP and prefix/netmask.
Nick Coghlandc9b2552012-05-20 21:01:57 +10002092 '2001:db8::/128'
2093 '2001:db8:0000:0000:0000:0000:0000:0000/128'
2094 '2001:db8::'
2095 are all functionally the same in IPv6. That is to say,
2096 failing to provide a subnetmask will create an object with
2097 a mask of /128.
2098
2099 Additionally, an integer can be passed, so
2100 IPv6Network('2001:db8::') ==
2101 IPv6Network(42540766411282592856903984951653826560)
2102 or, more generally
2103 IPv6Network(int(IPv6Network('2001:db8::'))) ==
2104 IPv6Network('2001:db8::')
2105
2106 strict: A boolean. If true, ensure that we have been passed
2107 A true network address, eg, 2001:db8::1000/124 and not an
2108 IP address on a network, eg, 2001:db8::1/124.
2109
2110 Raises:
2111 AddressValueError: If address isn't a valid IPv6 address.
2112 NetmaskValueError: If the netmask isn't valid for
2113 an IPv6 address.
2114 ValueError: If strict was True and a network address was not
2115 supplied.
2116
2117 """
2118 _BaseV6.__init__(self, address)
2119 _BaseNetwork.__init__(self, address)
2120
2121 # Efficient constructor from integer.
2122 if isinstance(address, int):
Nick Coghlandc9b2552012-05-20 21:01:57 +10002123 self.network_address = IPv6Address(address)
2124 self._prefixlen = self._max_prefixlen
2125 self.netmask = IPv6Address(self._ALL_ONES)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002126 return
2127
2128 # Constructing from a packed address
Nick Coghlan5cf896f2012-07-07 01:43:31 +10002129 if isinstance(address, bytes):
Nick Coghlan297b1432012-07-08 17:11:04 +10002130 self.network_address = IPv6Address(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002131 self._prefixlen = self._max_prefixlen
2132 self.netmask = IPv6Address(self._ALL_ONES)
Hynek Schlawacked36b2e2012-06-08 15:21:21 +02002133 return
Nick Coghlandc9b2552012-05-20 21:01:57 +10002134
2135 # Assume input argument to be string or any object representation
2136 # which converts into a formatted IP prefix string.
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10002137 addr = _split_optional_netmask(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002138
2139 self.network_address = IPv6Address(self._ip_int_from_string(addr[0]))
2140
2141 if len(addr) == 2:
Nick Coghlan932346f2014-02-08 23:17:36 +10002142 # This may raise NetmaskValueError
2143 self._prefixlen = self._prefix_from_prefix_string(addr[1])
Nick Coghlandc9b2552012-05-20 21:01:57 +10002144 else:
2145 self._prefixlen = self._max_prefixlen
2146
2147 self.netmask = IPv6Address(self._ip_int_from_prefix(self._prefixlen))
2148 if strict:
2149 if (IPv6Address(int(self.network_address) & int(self.netmask)) !=
2150 self.network_address):
Nick Coghlan912238e2012-07-07 13:34:50 +10002151 raise ValueError('%s has host bits set' % self)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002152 self.network_address = IPv6Address(int(self.network_address) &
2153 int(self.netmask))
2154
2155 if self._prefixlen == (self._max_prefixlen - 1):
2156 self.hosts = self.__iter__
2157
Peter Moody1243c7d2014-03-11 09:55:46 -07002158 def hosts(self):
2159 """Generate Iterator over usable hosts in a network.
2160
2161 This is like __iter__ except it doesn't return the
2162 Subnet-Router anycast address.
2163
2164 """
2165 network = int(self.network_address)
2166 broadcast = int(self.broadcast_address)
2167 for x in range(network + 1, broadcast + 1):
2168 yield self._address_class(x)
2169
Nick Coghlan730f67f2012-08-05 22:02:18 +10002170 @property
2171 def is_site_local(self):
2172 """Test if the address is reserved for site-local.
2173
2174 Note that the site-local address space has been deprecated by RFC 3879.
2175 Use is_private to test if this address is in the space of unique local
2176 addresses as defined by RFC 4193.
2177
2178 Returns:
2179 A boolean, True if the address is reserved per RFC 3513 2.5.6.
2180
2181 """
2182 return (self.network_address.is_site_local and
2183 self.broadcast_address.is_site_local)