blob: b54e136ee996aa91474298a7a2493d6fa7b70dc2 [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
Antoine Pitrou824db302014-05-15 20:21:48 +0200198 return min(bits, (~number & (number-1)).bit_length())
Nick Coghlandc9b2552012-05-20 21:01:57 +1000199
200
201def summarize_address_range(first, last):
202 """Summarize a network range given the first and last IP addresses.
203
204 Example:
Eli Bendersky948af232012-10-07 07:23:50 -0700205 >>> list(summarize_address_range(IPv4Address('192.0.2.0'),
206 ... IPv4Address('192.0.2.130')))
207 ... #doctest: +NORMALIZE_WHITESPACE
Nick Coghlandc9b2552012-05-20 21:01:57 +1000208 [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'),
Eli Bendersky948af232012-10-07 07:23:50 -0700209 IPv4Network('192.0.2.130/32')]
Nick Coghlandc9b2552012-05-20 21:01:57 +1000210
211 Args:
212 first: the first IPv4Address or IPv6Address in the range.
213 last: the last IPv4Address or IPv6Address in the range.
214
215 Returns:
216 An iterator of the summarized IPv(4|6) network objects.
217
218 Raise:
219 TypeError:
220 If the first and last objects are not IP addresses.
221 If the first and last objects are not the same version.
222 ValueError:
223 If the last object is not greater than the first.
Nick Coghlan51c30672012-05-27 00:25:58 +1000224 If the version of the first address is not 4 or 6.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000225
226 """
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200227 if (not (isinstance(first, _BaseAddress) and
228 isinstance(last, _BaseAddress))):
Nick Coghlandc9b2552012-05-20 21:01:57 +1000229 raise TypeError('first and last must be IP addresses, not networks')
230 if first.version != last.version:
231 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000232 first, last))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000233 if first > last:
234 raise ValueError('last IP address must be greater than first')
235
Nick Coghlandc9b2552012-05-20 21:01:57 +1000236 if first.version == 4:
237 ip = IPv4Network
238 elif first.version == 6:
239 ip = IPv6Network
240 else:
241 raise ValueError('unknown IP version')
242
243 ip_bits = first._max_prefixlen
244 first_int = first._ip
245 last_int = last._ip
246 while first_int <= last_int:
Nick Coghlan7319f692012-07-07 21:43:30 +1000247 nbits = min(_count_righthand_zero_bits(first_int, ip_bits),
248 (last_int - first_int + 1).bit_length() - 1)
Antoine Pitrou824db302014-05-15 20:21:48 +0200249 net = ip((first_int, ip_bits - nbits))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000250 yield net
Nick Coghlan7319f692012-07-07 21:43:30 +1000251 first_int += 1 << nbits
252 if first_int - 1 == ip._ALL_ONES:
Nick Coghlandc9b2552012-05-20 21:01:57 +1000253 break
Nick Coghlandc9b2552012-05-20 21:01:57 +1000254
Sandro Tosib95c6342012-05-23 23:17:22 +0200255
Nick Coghlandc9b2552012-05-20 21:01:57 +1000256def _collapse_addresses_recursive(addresses):
257 """Loops through the addresses, collapsing concurrent netblocks.
258
259 Example:
260
261 ip1 = IPv4Network('192.0.2.0/26')
262 ip2 = IPv4Network('192.0.2.64/26')
263 ip3 = IPv4Network('192.0.2.128/26')
264 ip4 = IPv4Network('192.0.2.192/26')
265
266 _collapse_addresses_recursive([ip1, ip2, ip3, ip4]) ->
267 [IPv4Network('192.0.2.0/24')]
268
269 This shouldn't be called directly; it is called via
270 collapse_addresses([]).
271
272 Args:
273 addresses: A list of IPv4Network's or IPv6Network's
274
275 Returns:
276 A list of IPv4Network's or IPv6Network's depending on what we were
277 passed.
278
279 """
Nick Coghlan7319f692012-07-07 21:43:30 +1000280 while True:
281 last_addr = None
282 ret_array = []
283 optimized = False
Nick Coghlandc9b2552012-05-20 21:01:57 +1000284
Nick Coghlan7319f692012-07-07 21:43:30 +1000285 for cur_addr in addresses:
286 if not ret_array:
287 last_addr = cur_addr
288 ret_array.append(cur_addr)
289 elif (cur_addr.network_address >= last_addr.network_address and
290 cur_addr.broadcast_address <= last_addr.broadcast_address):
291 optimized = True
292 elif cur_addr == list(last_addr.supernet().subnets())[1]:
293 ret_array[-1] = last_addr = last_addr.supernet()
294 optimized = True
295 else:
296 last_addr = cur_addr
297 ret_array.append(cur_addr)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000298
Nick Coghlan7319f692012-07-07 21:43:30 +1000299 addresses = ret_array
300 if not optimized:
301 return addresses
Nick Coghlandc9b2552012-05-20 21:01:57 +1000302
303
304def collapse_addresses(addresses):
305 """Collapse a list of IP objects.
306
307 Example:
308 collapse_addresses([IPv4Network('192.0.2.0/25'),
309 IPv4Network('192.0.2.128/25')]) ->
310 [IPv4Network('192.0.2.0/24')]
311
312 Args:
313 addresses: An iterator of IPv4Network or IPv6Network objects.
314
315 Returns:
316 An iterator of the collapsed IPv(4|6)Network objects.
317
318 Raises:
319 TypeError: If passed a list of mixed version objects.
320
321 """
322 i = 0
323 addrs = []
324 ips = []
325 nets = []
326
327 # split IP addresses and networks
328 for ip in addresses:
329 if isinstance(ip, _BaseAddress):
330 if ips and ips[-1]._version != ip._version:
331 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000332 ip, ips[-1]))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000333 ips.append(ip)
334 elif ip._prefixlen == ip._max_prefixlen:
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 try:
339 ips.append(ip.ip)
340 except AttributeError:
341 ips.append(ip.network_address)
342 else:
343 if nets and nets[-1]._version != ip._version:
344 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000345 ip, nets[-1]))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000346 nets.append(ip)
347
348 # sort and dedup
349 ips = sorted(set(ips))
350 nets = sorted(set(nets))
351
352 while i < len(ips):
353 (first, last) = _find_address_range(ips[i:])
354 i = ips.index(last) + 1
355 addrs.extend(summarize_address_range(first, last))
356
357 return iter(_collapse_addresses_recursive(sorted(
358 addrs + nets, key=_BaseNetwork._get_networks_key)))
359
360
361def get_mixed_type_key(obj):
362 """Return a key suitable for sorting between networks and addresses.
363
364 Address and Network objects are not sortable by default; they're
365 fundamentally different so the expression
366
367 IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')
368
369 doesn't make any sense. There are some times however, where you may wish
370 to have ipaddress sort these for you anyway. If you need to do this, you
371 can use this function as the key= argument to sorted().
372
373 Args:
374 obj: either a Network or Address object.
375 Returns:
376 appropriate key.
377
378 """
379 if isinstance(obj, _BaseNetwork):
380 return obj._get_networks_key()
381 elif isinstance(obj, _BaseAddress):
382 return obj._get_address_key()
383 return NotImplemented
384
385
Nick Coghlan3008ec02012-07-08 00:45:33 +1000386class _TotalOrderingMixin:
387 # Helper that derives the other comparison operations from
388 # __lt__ and __eq__
Nick Coghlan297b1432012-07-08 17:11:04 +1000389 # We avoid functools.total_ordering because it doesn't handle
390 # NotImplemented correctly yet (http://bugs.python.org/issue10042)
Nick Coghlan3008ec02012-07-08 00:45:33 +1000391 def __eq__(self, other):
392 raise NotImplementedError
393 def __ne__(self, other):
394 equal = self.__eq__(other)
395 if equal is NotImplemented:
396 return NotImplemented
397 return not equal
398 def __lt__(self, other):
399 raise NotImplementedError
400 def __le__(self, other):
401 less = self.__lt__(other)
402 if less is NotImplemented or not less:
403 return self.__eq__(other)
404 return less
405 def __gt__(self, other):
406 less = self.__lt__(other)
407 if less is NotImplemented:
408 return NotImplemented
409 equal = self.__eq__(other)
410 if equal is NotImplemented:
411 return NotImplemented
412 return not (less or equal)
413 def __ge__(self, other):
414 less = self.__lt__(other)
415 if less is NotImplemented:
416 return NotImplemented
417 return not less
418
419class _IPAddressBase(_TotalOrderingMixin):
Nick Coghlandc9b2552012-05-20 21:01:57 +1000420
421 """The mother class."""
422
423 @property
424 def exploded(self):
425 """Return the longhand version of the IP address as a string."""
426 return self._explode_shorthand_ip_string()
427
428 @property
429 def compressed(self):
430 """Return the shorthand version of the IP address as a string."""
431 return str(self)
432
Nick Coghland9722652012-06-17 16:33:00 +1000433 @property
Eric V. Smithebdaaf42014-04-14 12:58:07 -0400434 def reverse_pointer(self):
435 """The name of the reverse DNS pointer for the IP address, e.g.:
436 >>> ipaddress.ip_address("127.0.0.1").reverse_pointer
437 '1.0.0.127.in-addr.arpa'
438 >>> ipaddress.ip_address("2001:db8::1").reverse_pointer
439 '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa'
440
441 """
442 return self._reverse_pointer()
443
444 @property
Nick Coghland9722652012-06-17 16:33:00 +1000445 def version(self):
446 msg = '%200s has no version specified' % (type(self),)
447 raise NotImplementedError(msg)
448
Nick Coghlan297b1432012-07-08 17:11:04 +1000449 def _check_int_address(self, address):
450 if address < 0:
451 msg = "%d (< 0) is not permitted as an IPv%d address"
452 raise AddressValueError(msg % (address, self._version))
453 if address > self._ALL_ONES:
454 msg = "%d (>= 2**%d) is not permitted as an IPv%d address"
455 raise AddressValueError(msg % (address, self._max_prefixlen,
456 self._version))
457
458 def _check_packed_address(self, address, expected_len):
459 address_len = len(address)
460 if address_len != expected_len:
461 msg = "%r (len %d != %d) is not permitted as an IPv%d address"
462 raise AddressValueError(msg % (address, address_len,
463 expected_len, self._version))
464
Antoine Pitrou45aba182014-05-15 20:18:41 +0200465 @classmethod
466 def _ip_int_from_prefix(cls, prefixlen):
Nick Coghlan932346f2014-02-08 23:17:36 +1000467 """Turn the prefix length into a bitwise netmask
Nick Coghlandc9b2552012-05-20 21:01:57 +1000468
469 Args:
470 prefixlen: An integer, the prefix length.
471
472 Returns:
473 An integer.
474
475 """
Antoine Pitrou45aba182014-05-15 20:18:41 +0200476 return cls._ALL_ONES ^ (cls._ALL_ONES >> prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000477
Antoine Pitrou45aba182014-05-15 20:18:41 +0200478 @classmethod
479 def _prefix_from_ip_int(cls, ip_int):
Nick Coghlan932346f2014-02-08 23:17:36 +1000480 """Return prefix length from the bitwise netmask.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000481
482 Args:
Nick Coghlan932346f2014-02-08 23:17:36 +1000483 ip_int: An integer, the netmask in axpanded bitwise format
Nick Coghlandc9b2552012-05-20 21:01:57 +1000484
485 Returns:
486 An integer, the prefix length.
487
Nick Coghlan932346f2014-02-08 23:17:36 +1000488 Raises:
489 ValueError: If the input intermingles zeroes & ones
Nick Coghlandc9b2552012-05-20 21:01:57 +1000490 """
Nick Coghlan932346f2014-02-08 23:17:36 +1000491 trailing_zeroes = _count_righthand_zero_bits(ip_int,
Antoine Pitrou45aba182014-05-15 20:18:41 +0200492 cls._max_prefixlen)
493 prefixlen = cls._max_prefixlen - trailing_zeroes
Nick Coghlan932346f2014-02-08 23:17:36 +1000494 leading_ones = ip_int >> trailing_zeroes
495 all_ones = (1 << prefixlen) - 1
496 if leading_ones != all_ones:
Antoine Pitrou45aba182014-05-15 20:18:41 +0200497 byteslen = cls._max_prefixlen // 8
Nick Coghlan932346f2014-02-08 23:17:36 +1000498 details = ip_int.to_bytes(byteslen, 'big')
499 msg = 'Netmask pattern %r mixes zeroes & ones'
500 raise ValueError(msg % details)
501 return prefixlen
Nick Coghlandc9b2552012-05-20 21:01:57 +1000502
Antoine Pitrou45aba182014-05-15 20:18:41 +0200503 @classmethod
504 def _report_invalid_netmask(cls, netmask_str):
Nick Coghlan932346f2014-02-08 23:17:36 +1000505 msg = '%r is not a valid netmask' % netmask_str
506 raise NetmaskValueError(msg) from None
507
Antoine Pitrou45aba182014-05-15 20:18:41 +0200508 @classmethod
509 def _prefix_from_prefix_string(cls, prefixlen_str):
Nick Coghlan932346f2014-02-08 23:17:36 +1000510 """Return prefix length from a numeric string
Nick Coghlandc9b2552012-05-20 21:01:57 +1000511
512 Args:
Nick Coghlan932346f2014-02-08 23:17:36 +1000513 prefixlen_str: The string to be converted
Nick Coghlandc9b2552012-05-20 21:01:57 +1000514
515 Returns:
Nick Coghlan932346f2014-02-08 23:17:36 +1000516 An integer, the prefix length.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000517
Nick Coghlan932346f2014-02-08 23:17:36 +1000518 Raises:
519 NetmaskValueError: If the input is not a valid netmask
Nick Coghlandc9b2552012-05-20 21:01:57 +1000520 """
Nick Coghlan932346f2014-02-08 23:17:36 +1000521 # int allows a leading +/- as well as surrounding whitespace,
522 # so we ensure that isn't the case
523 if not _BaseV4._DECIMAL_DIGITS.issuperset(prefixlen_str):
Antoine Pitrou45aba182014-05-15 20:18:41 +0200524 cls._report_invalid_netmask(prefixlen_str)
Nick Coghlan932346f2014-02-08 23:17:36 +1000525 try:
526 prefixlen = int(prefixlen_str)
527 except ValueError:
Antoine Pitrou45aba182014-05-15 20:18:41 +0200528 cls._report_invalid_netmask(prefixlen_str)
529 if not (0 <= prefixlen <= cls._max_prefixlen):
530 cls._report_invalid_netmask(prefixlen_str)
Nick Coghlan932346f2014-02-08 23:17:36 +1000531 return prefixlen
532
Antoine Pitrou45aba182014-05-15 20:18:41 +0200533 @classmethod
534 def _prefix_from_ip_string(cls, ip_str):
Nick Coghlan932346f2014-02-08 23:17:36 +1000535 """Turn a netmask/hostmask string into a prefix length
536
537 Args:
538 ip_str: The netmask/hostmask to be converted
539
540 Returns:
541 An integer, the prefix length.
542
543 Raises:
544 NetmaskValueError: If the input is not a valid netmask/hostmask
545 """
546 # Parse the netmask/hostmask like an IP address.
547 try:
Antoine Pitrou45aba182014-05-15 20:18:41 +0200548 ip_int = cls._ip_int_from_string(ip_str)
Nick Coghlan932346f2014-02-08 23:17:36 +1000549 except AddressValueError:
Antoine Pitrou45aba182014-05-15 20:18:41 +0200550 cls._report_invalid_netmask(ip_str)
Nick Coghlan932346f2014-02-08 23:17:36 +1000551
552 # Try matching a netmask (this would be /1*0*/ as a bitwise regexp).
553 # Note that the two ambiguous cases (all-ones and all-zeroes) are
554 # treated as netmasks.
555 try:
Antoine Pitrou45aba182014-05-15 20:18:41 +0200556 return cls._prefix_from_ip_int(ip_int)
Nick Coghlan932346f2014-02-08 23:17:36 +1000557 except ValueError:
558 pass
559
560 # Invert the bits, and try matching a /0+1+/ hostmask instead.
Antoine Pitrou45aba182014-05-15 20:18:41 +0200561 ip_int ^= cls._ALL_ONES
Nick Coghlan932346f2014-02-08 23:17:36 +1000562 try:
Antoine Pitrou45aba182014-05-15 20:18:41 +0200563 return cls._prefix_from_ip_int(ip_int)
Nick Coghlan932346f2014-02-08 23:17:36 +1000564 except ValueError:
Antoine Pitrou45aba182014-05-15 20:18:41 +0200565 cls._report_invalid_netmask(ip_str)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000566
Nick Coghlan730f67f2012-08-05 22:02:18 +1000567
Nick Coghlandc9b2552012-05-20 21:01:57 +1000568class _BaseAddress(_IPAddressBase):
569
570 """A generic IP object.
571
572 This IP class contains the version independent methods which are
573 used by single IP addresses.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000574 """
575
576 def __init__(self, address):
577 if (not isinstance(address, bytes)
578 and '/' in str(address)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000579 raise AddressValueError("Unexpected '/' in %r" % address)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000580
Nick Coghlandc9b2552012-05-20 21:01:57 +1000581 def __int__(self):
582 return self._ip
583
Nick Coghlandc9b2552012-05-20 21:01:57 +1000584 def __eq__(self, other):
585 try:
586 return (self._ip == other._ip
587 and self._version == other._version)
588 except AttributeError:
589 return NotImplemented
590
Nick Coghlandc9b2552012-05-20 21:01:57 +1000591 def __lt__(self, other):
592 if self._version != other._version:
593 raise TypeError('%s and %s are not of the same version' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000594 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000595 if not isinstance(other, _BaseAddress):
596 raise TypeError('%s and %s are not of the same type' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000597 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000598 if self._ip != other._ip:
599 return self._ip < other._ip
600 return False
601
Nick Coghlandc9b2552012-05-20 21:01:57 +1000602 # Shorthand for Integer addition and subtraction. This is not
603 # meant to ever support addition/subtraction of addresses.
604 def __add__(self, other):
605 if not isinstance(other, int):
606 return NotImplemented
Nick Coghlan51c30672012-05-27 00:25:58 +1000607 return self.__class__(int(self) + other)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000608
609 def __sub__(self, other):
610 if not isinstance(other, int):
611 return NotImplemented
Nick Coghlan51c30672012-05-27 00:25:58 +1000612 return self.__class__(int(self) - other)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000613
614 def __repr__(self):
615 return '%s(%r)' % (self.__class__.__name__, str(self))
616
617 def __str__(self):
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200618 return str(self._string_from_ip_int(self._ip))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000619
620 def __hash__(self):
621 return hash(hex(int(self._ip)))
622
623 def _get_address_key(self):
624 return (self._version, self)
625
Nick Coghlandc9b2552012-05-20 21:01:57 +1000626
627class _BaseNetwork(_IPAddressBase):
628
Nick Coghlan51c30672012-05-27 00:25:58 +1000629 """A generic IP network object.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000630
631 This IP class contains the version independent methods which are
632 used by networks.
633
634 """
Nick Coghlandc9b2552012-05-20 21:01:57 +1000635 def __init__(self, address):
636 self._cache = {}
637
Nick Coghlandc9b2552012-05-20 21:01:57 +1000638 def __repr__(self):
639 return '%s(%r)' % (self.__class__.__name__, str(self))
640
Hynek Schlawack454a74d2012-06-04 18:14:02 +0200641 def __str__(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000642 return '%s/%d' % (self.network_address, self.prefixlen)
Hynek Schlawack454a74d2012-06-04 18:14:02 +0200643
Nick Coghlandc9b2552012-05-20 21:01:57 +1000644 def hosts(self):
645 """Generate Iterator over usable hosts in a network.
646
Sandro Tosib95c6342012-05-23 23:17:22 +0200647 This is like __iter__ except it doesn't return the network
648 or broadcast addresses.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000649
650 """
Nick Coghlan7319f692012-07-07 21:43:30 +1000651 network = int(self.network_address)
652 broadcast = int(self.broadcast_address)
653 for x in range(network + 1, broadcast):
654 yield self._address_class(x)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000655
656 def __iter__(self):
Nick Coghlan7319f692012-07-07 21:43:30 +1000657 network = int(self.network_address)
658 broadcast = int(self.broadcast_address)
659 for x in range(network, broadcast + 1):
660 yield self._address_class(x)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000661
662 def __getitem__(self, n):
663 network = int(self.network_address)
664 broadcast = int(self.broadcast_address)
665 if n >= 0:
666 if network + n > broadcast:
667 raise IndexError
Nick Coghlan51c30672012-05-27 00:25:58 +1000668 return self._address_class(network + n)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000669 else:
670 n += 1
671 if broadcast + n < network:
672 raise IndexError
Nick Coghlan51c30672012-05-27 00:25:58 +1000673 return self._address_class(broadcast + n)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000674
675 def __lt__(self, other):
676 if self._version != other._version:
677 raise TypeError('%s and %s are not of the same version' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000678 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000679 if not isinstance(other, _BaseNetwork):
680 raise TypeError('%s and %s are not of the same type' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000681 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000682 if self.network_address != other.network_address:
683 return self.network_address < other.network_address
684 if self.netmask != other.netmask:
685 return self.netmask < other.netmask
686 return False
687
Nick Coghlandc9b2552012-05-20 21:01:57 +1000688 def __eq__(self, other):
Nick Coghlan9a9c28c2012-07-07 23:05:59 +1000689 try:
690 return (self._version == other._version and
691 self.network_address == other.network_address and
692 int(self.netmask) == int(other.netmask))
693 except AttributeError:
694 return NotImplemented
Nick Coghlandc9b2552012-05-20 21:01:57 +1000695
Nick Coghlandc9b2552012-05-20 21:01:57 +1000696 def __hash__(self):
697 return hash(int(self.network_address) ^ int(self.netmask))
698
699 def __contains__(self, other):
700 # always false if one is v4 and the other is v6.
701 if self._version != other._version:
702 return False
703 # dealing with another network.
704 if isinstance(other, _BaseNetwork):
705 return False
706 # dealing with another address
707 else:
708 # address
709 return (int(self.network_address) <= int(other._ip) <=
710 int(self.broadcast_address))
711
712 def overlaps(self, other):
713 """Tell if self is partly contained in other."""
714 return self.network_address in other or (
715 self.broadcast_address in other or (
716 other.network_address in self or (
717 other.broadcast_address in self)))
718
719 @property
720 def broadcast_address(self):
721 x = self._cache.get('broadcast_address')
722 if x is None:
Nick Coghlan51c30672012-05-27 00:25:58 +1000723 x = self._address_class(int(self.network_address) |
724 int(self.hostmask))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000725 self._cache['broadcast_address'] = x
726 return x
727
728 @property
729 def hostmask(self):
730 x = self._cache.get('hostmask')
731 if x is None:
Nick Coghlan51c30672012-05-27 00:25:58 +1000732 x = self._address_class(int(self.netmask) ^ self._ALL_ONES)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000733 self._cache['hostmask'] = x
734 return x
735
736 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +1000737 def with_prefixlen(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000738 return '%s/%d' % (self.network_address, self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000739
740 @property
741 def with_netmask(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000742 return '%s/%s' % (self.network_address, self.netmask)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000743
744 @property
745 def with_hostmask(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000746 return '%s/%s' % (self.network_address, self.hostmask)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000747
748 @property
749 def num_addresses(self):
750 """Number of hosts in the current subnet."""
751 return int(self.broadcast_address) - int(self.network_address) + 1
752
753 @property
Nick Coghlan51c30672012-05-27 00:25:58 +1000754 def _address_class(self):
Nick Coghland9722652012-06-17 16:33:00 +1000755 # Returning bare address objects (rather than interfaces) allows for
756 # more consistent behaviour across the network address, broadcast
757 # address and individual host addresses.
758 msg = '%200s has no associated address class' % (type(self),)
759 raise NotImplementedError(msg)
Nick Coghlan51c30672012-05-27 00:25:58 +1000760
761 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +1000762 def prefixlen(self):
763 return self._prefixlen
764
765 def address_exclude(self, other):
766 """Remove an address from a larger block.
767
768 For example:
769
770 addr1 = ip_network('192.0.2.0/28')
771 addr2 = ip_network('192.0.2.1/32')
772 addr1.address_exclude(addr2) =
773 [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'),
774 IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')]
775
776 or IPv6:
777
778 addr1 = ip_network('2001:db8::1/32')
779 addr2 = ip_network('2001:db8::1/128')
780 addr1.address_exclude(addr2) =
781 [ip_network('2001:db8::1/128'),
782 ip_network('2001:db8::2/127'),
783 ip_network('2001:db8::4/126'),
784 ip_network('2001:db8::8/125'),
785 ...
786 ip_network('2001:db8:8000::/33')]
787
788 Args:
789 other: An IPv4Network or IPv6Network object of the same type.
790
791 Returns:
Ezio Melotti3f5db392013-01-27 06:20:14 +0200792 An iterator of the IPv(4|6)Network objects which is self
Nick Coghlandc9b2552012-05-20 21:01:57 +1000793 minus other.
794
795 Raises:
Ezio Melotti30b9d5d2013-08-17 15:50:46 +0300796 TypeError: If self and other are of differing address
Nick Coghlandc9b2552012-05-20 21:01:57 +1000797 versions, or if other is not a network object.
798 ValueError: If other is not completely contained by self.
799
800 """
801 if not self._version == other._version:
802 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000803 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000804
805 if not isinstance(other, _BaseNetwork):
Nick Coghlan912238e2012-07-07 13:34:50 +1000806 raise TypeError("%s is not a network object" % other)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000807
808 if not (other.network_address >= self.network_address and
809 other.broadcast_address <= self.broadcast_address):
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200810 raise ValueError('%s not contained in %s' % (other, self))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000811 if other == self:
812 raise StopIteration
813
Nick Coghlandc9b2552012-05-20 21:01:57 +1000814 # Make sure we're comparing the network of other.
Nick Coghlan912238e2012-07-07 13:34:50 +1000815 other = other.__class__('%s/%s' % (other.network_address,
816 other.prefixlen))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000817
818 s1, s2 = self.subnets()
819 while s1 != other and s2 != other:
820 if (other.network_address >= s1.network_address and
821 other.broadcast_address <= s1.broadcast_address):
822 yield s2
823 s1, s2 = s1.subnets()
824 elif (other.network_address >= s2.network_address and
825 other.broadcast_address <= s2.broadcast_address):
826 yield s1
827 s1, s2 = s2.subnets()
828 else:
829 # If we got here, there's a bug somewhere.
830 raise AssertionError('Error performing exclusion: '
831 's1: %s s2: %s other: %s' %
Nick Coghlan912238e2012-07-07 13:34:50 +1000832 (s1, s2, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000833 if s1 == other:
834 yield s2
835 elif s2 == other:
836 yield s1
837 else:
838 # If we got here, there's a bug somewhere.
839 raise AssertionError('Error performing exclusion: '
840 's1: %s s2: %s other: %s' %
Nick Coghlan912238e2012-07-07 13:34:50 +1000841 (s1, s2, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000842
843 def compare_networks(self, other):
844 """Compare two IP objects.
845
846 This is only concerned about the comparison of the integer
847 representation of the network addresses. This means that the
848 host bits aren't considered at all in this method. If you want
849 to compare host bits, you can easily enough do a
850 'HostA._ip < HostB._ip'
851
852 Args:
853 other: An IP object.
854
855 Returns:
856 If the IP versions of self and other are the same, returns:
857
858 -1 if self < other:
859 eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25')
860 IPv6Network('2001:db8::1000/124') <
861 IPv6Network('2001:db8::2000/124')
862 0 if self == other
863 eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24')
864 IPv6Network('2001:db8::1000/124') ==
865 IPv6Network('2001:db8::1000/124')
866 1 if self > other
867 eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25')
868 IPv6Network('2001:db8::2000/124') >
869 IPv6Network('2001:db8::1000/124')
870
871 Raises:
872 TypeError if the IP versions are different.
873
874 """
875 # does this need to raise a ValueError?
876 if self._version != other._version:
877 raise TypeError('%s and %s are not of the same type' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000878 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000879 # self._version == other._version below here:
880 if self.network_address < other.network_address:
881 return -1
882 if self.network_address > other.network_address:
883 return 1
884 # self.network_address == other.network_address below here:
885 if self.netmask < other.netmask:
886 return -1
887 if self.netmask > other.netmask:
888 return 1
889 return 0
890
891 def _get_networks_key(self):
892 """Network-only key function.
893
894 Returns an object that identifies this address' network and
895 netmask. This function is a suitable "key" argument for sorted()
896 and list.sort().
897
898 """
899 return (self._version, self.network_address, self.netmask)
900
901 def subnets(self, prefixlen_diff=1, new_prefix=None):
902 """The subnets which join to make the current subnet.
903
904 In the case that self contains only one IP
905 (self._prefixlen == 32 for IPv4 or self._prefixlen == 128
906 for IPv6), yield an iterator with just ourself.
907
908 Args:
909 prefixlen_diff: An integer, the amount the prefix length
910 should be increased by. This should not be set if
911 new_prefix is also set.
912 new_prefix: The desired new prefix length. This must be a
913 larger number (smaller prefix) than the existing prefix.
914 This should not be set if prefixlen_diff is also set.
915
916 Returns:
917 An iterator of IPv(4|6) objects.
918
919 Raises:
920 ValueError: The prefixlen_diff is too small or too large.
921 OR
922 prefixlen_diff and new_prefix are both set or new_prefix
923 is a smaller number than the current prefix (smaller
924 number means a larger network)
925
926 """
927 if self._prefixlen == self._max_prefixlen:
928 yield self
929 return
930
931 if new_prefix is not None:
932 if new_prefix < self._prefixlen:
933 raise ValueError('new prefix must be longer')
934 if prefixlen_diff != 1:
935 raise ValueError('cannot set prefixlen_diff and new_prefix')
936 prefixlen_diff = new_prefix - self._prefixlen
937
938 if prefixlen_diff < 0:
939 raise ValueError('prefix length diff must be > 0')
940 new_prefixlen = self._prefixlen + prefixlen_diff
941
Nick Coghlan932346f2014-02-08 23:17:36 +1000942 if new_prefixlen > self._max_prefixlen:
Nick Coghlandc9b2552012-05-20 21:01:57 +1000943 raise ValueError(
944 'prefix length diff %d is invalid for netblock %s' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000945 new_prefixlen, self))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000946
Antoine Pitrou824db302014-05-15 20:21:48 +0200947 start = int(self.network_address)
948 end = int(self.broadcast_address)
949 step = (int(self.hostmask) + 1) >> prefixlen_diff
950 for new_addr in range(start, end, step):
951 current = self.__class__((new_addr, new_prefixlen))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000952 yield current
953
Nick Coghlandc9b2552012-05-20 21:01:57 +1000954 def supernet(self, prefixlen_diff=1, new_prefix=None):
955 """The supernet containing the current network.
956
957 Args:
958 prefixlen_diff: An integer, the amount the prefix length of
959 the network should be decreased by. For example, given a
960 /24 network and a prefixlen_diff of 3, a supernet with a
961 /21 netmask is returned.
962
963 Returns:
964 An IPv4 network object.
965
966 Raises:
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200967 ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have
968 a negative prefix length.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000969 OR
970 If prefixlen_diff and new_prefix are both set or new_prefix is a
971 larger number than the current prefix (larger number means a
972 smaller network)
973
974 """
975 if self._prefixlen == 0:
976 return self
977
978 if new_prefix is not None:
979 if new_prefix > self._prefixlen:
980 raise ValueError('new prefix must be shorter')
981 if prefixlen_diff != 1:
982 raise ValueError('cannot set prefixlen_diff and new_prefix')
983 prefixlen_diff = self._prefixlen - new_prefix
984
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200985 new_prefixlen = self.prefixlen - prefixlen_diff
986 if new_prefixlen < 0:
Nick Coghlandc9b2552012-05-20 21:01:57 +1000987 raise ValueError(
988 'current prefixlen is %d, cannot have a prefixlen_diff of %d' %
989 (self.prefixlen, prefixlen_diff))
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200990 return self.__class__((
991 int(self.network_address) & (int(self.netmask) << prefixlen_diff),
992 new_prefixlen
993 ))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000994
Nick Coghlan730f67f2012-08-05 22:02:18 +1000995 @property
996 def is_multicast(self):
997 """Test if the address is reserved for multicast use.
998
999 Returns:
1000 A boolean, True if the address is a multicast address.
1001 See RFC 2373 2.7 for details.
1002
1003 """
1004 return (self.network_address.is_multicast and
1005 self.broadcast_address.is_multicast)
1006
1007 @property
1008 def is_reserved(self):
1009 """Test if the address is otherwise IETF reserved.
1010
1011 Returns:
1012 A boolean, True if the address is within one of the
1013 reserved IPv6 Network ranges.
1014
1015 """
1016 return (self.network_address.is_reserved and
1017 self.broadcast_address.is_reserved)
1018
1019 @property
1020 def is_link_local(self):
1021 """Test if the address is reserved for link-local.
1022
1023 Returns:
1024 A boolean, True if the address is reserved per RFC 4291.
1025
1026 """
1027 return (self.network_address.is_link_local and
1028 self.broadcast_address.is_link_local)
1029
1030 @property
1031 def is_private(self):
1032 """Test if this address is allocated for private networks.
1033
1034 Returns:
Peter Moody22c31762013-10-21 13:58:06 -07001035 A boolean, True if the address is reserved per
1036 iana-ipv4-special-registry or iana-ipv6-special-registry.
Nick Coghlan730f67f2012-08-05 22:02:18 +10001037
1038 """
1039 return (self.network_address.is_private and
1040 self.broadcast_address.is_private)
1041
1042 @property
Peter Moody22c31762013-10-21 13:58:06 -07001043 def is_global(self):
Peter Moodybe9c1b12013-10-22 12:36:21 -07001044 """Test if this address is allocated for public networks.
Peter Moody22c31762013-10-21 13:58:06 -07001045
1046 Returns:
1047 A boolean, True if the address is not reserved per
1048 iana-ipv4-special-registry or iana-ipv6-special-registry.
1049
1050 """
1051 return not self.is_private
1052
1053 @property
Nick Coghlan730f67f2012-08-05 22:02:18 +10001054 def is_unspecified(self):
1055 """Test if the address is unspecified.
1056
1057 Returns:
1058 A boolean, True if this is the unspecified address as defined in
1059 RFC 2373 2.5.2.
1060
1061 """
1062 return (self.network_address.is_unspecified and
1063 self.broadcast_address.is_unspecified)
1064
1065 @property
1066 def is_loopback(self):
1067 """Test if the address is a loopback address.
1068
1069 Returns:
1070 A boolean, True if the address is a loopback address as defined in
1071 RFC 2373 2.5.3.
1072
1073 """
1074 return (self.network_address.is_loopback and
1075 self.broadcast_address.is_loopback)
1076
Nick Coghlandc9b2552012-05-20 21:01:57 +10001077
Hynek Schlawackc4b78a32012-06-01 11:48:32 +02001078class _BaseV4:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001079
1080 """Base IPv4 object.
1081
1082 The following methods are used by IPv4 objects in both single IP
1083 addresses and networks.
1084
1085 """
1086
1087 # Equivalent to 255.255.255.255 or 32 bits of 1's.
1088 _ALL_ONES = (2**IPV4LENGTH) - 1
1089 _DECIMAL_DIGITS = frozenset('0123456789')
1090
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001091 # the valid octets for host and netmasks. only useful for IPv4.
Nick Coghlan7319f692012-07-07 21:43:30 +10001092 _valid_mask_octets = frozenset((255, 254, 252, 248, 240, 224, 192, 128, 0))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001093
Antoine Pitrou45aba182014-05-15 20:18:41 +02001094 _max_prefixlen = IPV4LENGTH
1095 # There are only a handful of valid v4 netmasks, so we cache them all
1096 # when constructed (see _make_netmask()).
1097 _netmask_cache = {}
1098
Nick Coghlandc9b2552012-05-20 21:01:57 +10001099 def __init__(self, address):
1100 self._version = 4
Nick Coghlandc9b2552012-05-20 21:01:57 +10001101
1102 def _explode_shorthand_ip_string(self):
1103 return str(self)
1104
Antoine Pitrou45aba182014-05-15 20:18:41 +02001105 @classmethod
1106 def _make_netmask(cls, arg):
1107 """Make a (netmask, prefix_len) tuple from the given argument.
1108
1109 Argument can be:
1110 - an integer (the prefix length)
1111 - a string representing the prefix length (e.g. "24")
1112 - a string representing the prefix netmask (e.g. "255.255.255.0")
1113 """
1114 if arg not in cls._netmask_cache:
1115 if isinstance(arg, int):
1116 prefixlen = arg
1117 else:
1118 try:
1119 # Check for a netmask in prefix length form
1120 prefixlen = cls._prefix_from_prefix_string(arg)
1121 except NetmaskValueError:
1122 # Check for a netmask or hostmask in dotted-quad form.
1123 # This may raise NetmaskValueError.
1124 prefixlen = cls._prefix_from_ip_string(arg)
1125 netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen))
1126 cls._netmask_cache[arg] = netmask, prefixlen
1127 return cls._netmask_cache[arg]
1128
1129 @classmethod
1130 def _ip_int_from_string(cls, ip_str):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001131 """Turn the given IP string into an integer for comparison.
1132
1133 Args:
1134 ip_str: A string, the IP ip_str.
1135
1136 Returns:
1137 The IP ip_str as an integer.
1138
1139 Raises:
1140 AddressValueError: if ip_str isn't a valid IPv4 Address.
1141
1142 """
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001143 if not ip_str:
1144 raise AddressValueError('Address cannot be empty')
1145
Nick Coghlandc9b2552012-05-20 21:01:57 +10001146 octets = ip_str.split('.')
1147 if len(octets) != 4:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001148 raise AddressValueError("Expected 4 octets in %r" % ip_str)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001149
Nick Coghlan7319f692012-07-07 21:43:30 +10001150 try:
Antoine Pitrou45aba182014-05-15 20:18:41 +02001151 return int.from_bytes(map(cls._parse_octet, octets), 'big')
Nick Coghlan7319f692012-07-07 21:43:30 +10001152 except ValueError as exc:
1153 raise AddressValueError("%s in %r" % (exc, ip_str)) from None
Nick Coghlandc9b2552012-05-20 21:01:57 +10001154
Antoine Pitrou45aba182014-05-15 20:18:41 +02001155 @classmethod
1156 def _parse_octet(cls, octet_str):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001157 """Convert a decimal octet into an integer.
1158
1159 Args:
1160 octet_str: A string, the number to parse.
1161
1162 Returns:
1163 The octet as an integer.
1164
1165 Raises:
1166 ValueError: if the octet isn't strictly a decimal from [0..255].
1167
1168 """
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001169 if not octet_str:
1170 raise ValueError("Empty octet not permitted")
Nick Coghlandc9b2552012-05-20 21:01:57 +10001171 # Whitelist the characters, since int() allows a lot of bizarre stuff.
Antoine Pitrou45aba182014-05-15 20:18:41 +02001172 if not cls._DECIMAL_DIGITS.issuperset(octet_str):
Nick Coghlan07c4e332012-07-08 23:06:45 +10001173 msg = "Only decimal digits permitted in %r"
1174 raise ValueError(msg % octet_str)
1175 # We do the length check second, since the invalid character error
1176 # is likely to be more informative for the user
1177 if len(octet_str) > 3:
1178 msg = "At most 3 characters permitted in %r"
1179 raise ValueError(msg % octet_str)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001180 # Convert to integer (we know digits are legal)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001181 octet_int = int(octet_str, 10)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001182 # Any octets that look like they *might* be written in octal,
1183 # and which don't look exactly the same in both octal and
1184 # decimal are rejected as ambiguous
1185 if octet_int > 7 and octet_str[0] == '0':
Nick Coghlan07c4e332012-07-08 23:06:45 +10001186 msg = "Ambiguous (octal/decimal) value in %r not permitted"
1187 raise ValueError(msg % octet_str)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001188 if octet_int > 255:
Nick Coghlanb582ecc2012-07-07 22:15:22 +10001189 raise ValueError("Octet %d (> 255) not permitted" % octet_int)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001190 return octet_int
1191
Antoine Pitrou45aba182014-05-15 20:18:41 +02001192 @classmethod
1193 def _string_from_ip_int(cls, ip_int):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001194 """Turns a 32-bit integer into dotted decimal notation.
1195
1196 Args:
1197 ip_int: An integer, the IP address.
1198
1199 Returns:
1200 The IP address as a string in dotted decimal notation.
1201
1202 """
Nick Coghlan7319f692012-07-07 21:43:30 +10001203 return '.'.join(map(str, ip_int.to_bytes(4, 'big')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001204
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001205 def _is_valid_netmask(self, netmask):
1206 """Verify that the netmask is valid.
1207
1208 Args:
1209 netmask: A string, either a prefix or dotted decimal
1210 netmask.
1211
1212 Returns:
1213 A boolean, True if the prefix represents a valid IPv4
1214 netmask.
1215
1216 """
1217 mask = netmask.split('.')
1218 if len(mask) == 4:
Nick Coghlan7319f692012-07-07 21:43:30 +10001219 try:
1220 for x in mask:
1221 if int(x) not in self._valid_mask_octets:
1222 return False
1223 except ValueError:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001224 # Found something that isn't an integer or isn't valid
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001225 return False
Nick Coghlan7319f692012-07-07 21:43:30 +10001226 for idx, y in enumerate(mask):
1227 if idx > 0 and y > mask[idx - 1]:
1228 return False
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001229 return True
1230 try:
1231 netmask = int(netmask)
1232 except ValueError:
1233 return False
1234 return 0 <= netmask <= self._max_prefixlen
1235
1236 def _is_hostmask(self, ip_str):
1237 """Test if the IP string is a hostmask (rather than a netmask).
1238
1239 Args:
1240 ip_str: A string, the potential hostmask.
1241
1242 Returns:
1243 A boolean, True if the IP string is a hostmask.
1244
1245 """
1246 bits = ip_str.split('.')
1247 try:
Nick Coghlan7319f692012-07-07 21:43:30 +10001248 parts = [x for x in map(int, bits) if x in self._valid_mask_octets]
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001249 except ValueError:
1250 return False
1251 if len(parts) != len(bits):
1252 return False
1253 if parts[0] < parts[-1]:
1254 return True
1255 return False
1256
Eric V. Smithebdaaf42014-04-14 12:58:07 -04001257 def _reverse_pointer(self):
1258 """Return the reverse DNS pointer name for the IPv4 address.
1259
1260 This implements the method described in RFC1035 3.5.
1261
1262 """
1263 reverse_octets = str(self).split('.')[::-1]
1264 return '.'.join(reverse_octets) + '.in-addr.arpa'
1265
Nick Coghlandc9b2552012-05-20 21:01:57 +10001266 @property
1267 def max_prefixlen(self):
1268 return self._max_prefixlen
1269
1270 @property
1271 def version(self):
1272 return self._version
1273
Nick Coghlandc9b2552012-05-20 21:01:57 +10001274
1275class IPv4Address(_BaseV4, _BaseAddress):
1276
1277 """Represent and manipulate single IPv4 Addresses."""
1278
1279 def __init__(self, address):
1280
1281 """
1282 Args:
1283 address: A string or integer representing the IP
1284
1285 Additionally, an integer can be passed, so
1286 IPv4Address('192.0.2.1') == IPv4Address(3221225985).
1287 or, more generally
1288 IPv4Address(int(IPv4Address('192.0.2.1'))) ==
1289 IPv4Address('192.0.2.1')
1290
1291 Raises:
Sandro Tosib4386d32012-06-02 17:14:22 +02001292 AddressValueError: If ipaddress isn't a valid IPv4 address.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001293
1294 """
1295 _BaseAddress.__init__(self, address)
1296 _BaseV4.__init__(self, address)
1297
1298 # Efficient constructor from integer.
1299 if isinstance(address, int):
Nick Coghlan297b1432012-07-08 17:11:04 +10001300 self._check_int_address(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001301 self._ip = address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001302 return
1303
1304 # Constructing from a packed address
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001305 if isinstance(address, bytes):
Nick Coghlan297b1432012-07-08 17:11:04 +10001306 self._check_packed_address(address, 4)
Nick Coghlandb7920b2012-08-20 10:19:12 +10001307 self._ip = int.from_bytes(address, 'big')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001308 return
1309
1310 # Assume input argument to be string or any object representation
1311 # which converts into a formatted IP string.
1312 addr_str = str(address)
1313 self._ip = self._ip_int_from_string(addr_str)
1314
1315 @property
1316 def packed(self):
1317 """The binary representation of this address."""
1318 return v4_int_to_packed(self._ip)
1319
Nick Coghlan730f67f2012-08-05 22:02:18 +10001320 @property
1321 def is_reserved(self):
1322 """Test if the address is otherwise IETF reserved.
1323
1324 Returns:
1325 A boolean, True if the address is within the
1326 reserved IPv4 Network range.
1327
1328 """
1329 reserved_network = IPv4Network('240.0.0.0/4')
1330 return self in reserved_network
1331
1332 @property
Peter Moodybe9c1b12013-10-22 12:36:21 -07001333 @functools.lru_cache()
Nick Coghlan730f67f2012-08-05 22:02:18 +10001334 def is_private(self):
1335 """Test if this address is allocated for private networks.
1336
1337 Returns:
Peter Moody22c31762013-10-21 13:58:06 -07001338 A boolean, True if the address is reserved per
1339 iana-ipv4-special-registry.
Nick Coghlan730f67f2012-08-05 22:02:18 +10001340
1341 """
Peter Moody22c31762013-10-21 13:58:06 -07001342 return (self in IPv4Network('0.0.0.0/8') or
1343 self in IPv4Network('10.0.0.0/8') or
Peter Moody22c31762013-10-21 13:58:06 -07001344 self in IPv4Network('127.0.0.0/8') or
1345 self in IPv4Network('169.254.0.0/16') or
1346 self in IPv4Network('172.16.0.0/12') or
1347 self in IPv4Network('192.0.0.0/29') or
1348 self in IPv4Network('192.0.0.170/31') or
1349 self in IPv4Network('192.0.2.0/24') or
1350 self in IPv4Network('192.168.0.0/16') or
1351 self in IPv4Network('198.18.0.0/15') or
1352 self in IPv4Network('198.51.100.0/24') or
1353 self in IPv4Network('203.0.113.0/24') or
1354 self in IPv4Network('240.0.0.0/4') or
1355 self in IPv4Network('255.255.255.255/32'))
1356
Nick Coghlan730f67f2012-08-05 22:02:18 +10001357
1358 @property
1359 def is_multicast(self):
1360 """Test if the address is reserved for multicast use.
1361
1362 Returns:
1363 A boolean, True if the address is multicast.
1364 See RFC 3171 for details.
1365
1366 """
1367 multicast_network = IPv4Network('224.0.0.0/4')
1368 return self in multicast_network
1369
1370 @property
1371 def is_unspecified(self):
1372 """Test if the address is unspecified.
1373
1374 Returns:
1375 A boolean, True if this is the unspecified address as defined in
1376 RFC 5735 3.
1377
1378 """
1379 unspecified_address = IPv4Address('0.0.0.0')
1380 return self == unspecified_address
1381
1382 @property
1383 def is_loopback(self):
1384 """Test if the address is a loopback address.
1385
1386 Returns:
1387 A boolean, True if the address is a loopback per RFC 3330.
1388
1389 """
1390 loopback_network = IPv4Network('127.0.0.0/8')
1391 return self in loopback_network
1392
1393 @property
1394 def is_link_local(self):
1395 """Test if the address is reserved for link-local.
1396
1397 Returns:
1398 A boolean, True if the address is link-local per RFC 3927.
1399
1400 """
1401 linklocal_network = IPv4Network('169.254.0.0/16')
1402 return self in linklocal_network
1403
Nick Coghlandc9b2552012-05-20 21:01:57 +10001404
1405class IPv4Interface(IPv4Address):
1406
Nick Coghlandc9b2552012-05-20 21:01:57 +10001407 def __init__(self, address):
1408 if isinstance(address, (bytes, int)):
1409 IPv4Address.__init__(self, address)
1410 self.network = IPv4Network(self._ip)
1411 self._prefixlen = self._max_prefixlen
1412 return
1413
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001414 if isinstance(address, tuple):
1415 IPv4Address.__init__(self, address[0])
1416 if len(address) > 1:
1417 self._prefixlen = int(address[1])
1418 else:
1419 self._prefixlen = self._max_prefixlen
1420
1421 self.network = IPv4Network(address, strict=False)
1422 self.netmask = self.network.netmask
1423 self.hostmask = self.network.hostmask
1424 return
1425
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001426 addr = _split_optional_netmask(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001427 IPv4Address.__init__(self, addr[0])
1428
1429 self.network = IPv4Network(address, strict=False)
1430 self._prefixlen = self.network._prefixlen
1431
1432 self.netmask = self.network.netmask
1433 self.hostmask = self.network.hostmask
1434
Nick Coghlandc9b2552012-05-20 21:01:57 +10001435 def __str__(self):
1436 return '%s/%d' % (self._string_from_ip_int(self._ip),
1437 self.network.prefixlen)
1438
1439 def __eq__(self, other):
Nick Coghlan3008ec02012-07-08 00:45:33 +10001440 address_equal = IPv4Address.__eq__(self, other)
1441 if not address_equal or address_equal is NotImplemented:
1442 return address_equal
Nick Coghlandc9b2552012-05-20 21:01:57 +10001443 try:
Nick Coghlan3008ec02012-07-08 00:45:33 +10001444 return self.network == other.network
Nick Coghlandc9b2552012-05-20 21:01:57 +10001445 except AttributeError:
Nick Coghlan3008ec02012-07-08 00:45:33 +10001446 # An interface with an associated network is NOT the
1447 # same as an unassociated address. That's why the hash
1448 # takes the extra info into account.
1449 return False
1450
1451 def __lt__(self, other):
1452 address_less = IPv4Address.__lt__(self, other)
1453 if address_less is NotImplemented:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001454 return NotImplemented
Nick Coghlan3008ec02012-07-08 00:45:33 +10001455 try:
1456 return self.network < other.network
1457 except AttributeError:
1458 # We *do* allow addresses and interfaces to be sorted. The
1459 # unassociated address is considered less than all interfaces.
1460 return False
Nick Coghlandc9b2552012-05-20 21:01:57 +10001461
1462 def __hash__(self):
1463 return self._ip ^ self._prefixlen ^ int(self.network.network_address)
1464
Nick Coghlandc9b2552012-05-20 21:01:57 +10001465 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +10001466 def ip(self):
1467 return IPv4Address(self._ip)
1468
1469 @property
1470 def with_prefixlen(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10001471 return '%s/%s' % (self._string_from_ip_int(self._ip),
1472 self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001473
1474 @property
1475 def with_netmask(self):
1476 return '%s/%s' % (self._string_from_ip_int(self._ip),
1477 self.netmask)
Hynek Schlawack072b1e12012-05-26 12:04:56 +02001478
Nick Coghlandc9b2552012-05-20 21:01:57 +10001479 @property
1480 def with_hostmask(self):
1481 return '%s/%s' % (self._string_from_ip_int(self._ip),
1482 self.hostmask)
1483
1484
1485class IPv4Network(_BaseV4, _BaseNetwork):
1486
1487 """This class represents and manipulates 32-bit IPv4 network + addresses..
1488
1489 Attributes: [examples for IPv4Network('192.0.2.0/27')]
1490 .network_address: IPv4Address('192.0.2.0')
1491 .hostmask: IPv4Address('0.0.0.31')
1492 .broadcast_address: IPv4Address('192.0.2.32')
1493 .netmask: IPv4Address('255.255.255.224')
1494 .prefixlen: 27
1495
1496 """
Nick Coghlan51c30672012-05-27 00:25:58 +10001497 # Class to use when creating address objects
Nick Coghlan51c30672012-05-27 00:25:58 +10001498 _address_class = IPv4Address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001499
Nick Coghlandc9b2552012-05-20 21:01:57 +10001500 def __init__(self, address, strict=True):
1501
1502 """Instantiate a new IPv4 network object.
1503
1504 Args:
1505 address: A string or integer representing the IP [& network].
1506 '192.0.2.0/24'
1507 '192.0.2.0/255.255.255.0'
1508 '192.0.0.2/0.0.0.255'
1509 are all functionally the same in IPv4. Similarly,
1510 '192.0.2.1'
1511 '192.0.2.1/255.255.255.255'
1512 '192.0.2.1/32'
Ezio Melotti30b9d5d2013-08-17 15:50:46 +03001513 are also functionally equivalent. That is to say, failing to
Nick Coghlandc9b2552012-05-20 21:01:57 +10001514 provide a subnetmask will create an object with a mask of /32.
1515
1516 If the mask (portion after the / in the argument) is given in
1517 dotted quad form, it is treated as a netmask if it starts with a
1518 non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it
1519 starts with a zero field (e.g. 0.255.255.255 == /8), with the
1520 single exception of an all-zero mask which is treated as a
1521 netmask == /0. If no mask is given, a default of /32 is used.
1522
1523 Additionally, an integer can be passed, so
1524 IPv4Network('192.0.2.1') == IPv4Network(3221225985)
1525 or, more generally
1526 IPv4Interface(int(IPv4Interface('192.0.2.1'))) ==
1527 IPv4Interface('192.0.2.1')
1528
1529 Raises:
Sandro Tosib4386d32012-06-02 17:14:22 +02001530 AddressValueError: If ipaddress isn't a valid IPv4 address.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001531 NetmaskValueError: If the netmask isn't valid for
1532 an IPv4 address.
Sandro Tosib4386d32012-06-02 17:14:22 +02001533 ValueError: If strict is True and a network address is not
Nick Coghlandc9b2552012-05-20 21:01:57 +10001534 supplied.
1535
1536 """
1537
1538 _BaseV4.__init__(self, address)
1539 _BaseNetwork.__init__(self, address)
1540
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001541 # Constructing from a packed address or integer
1542 if isinstance(address, (int, bytes)):
Nick Coghlan297b1432012-07-08 17:11:04 +10001543 self.network_address = IPv4Address(address)
Antoine Pitrou45aba182014-05-15 20:18:41 +02001544 self.netmask, self._prefixlen = self._make_netmask(self._max_prefixlen)
1545 #fixme: address/network test here.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001546 return
1547
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001548 if isinstance(address, tuple):
1549 if len(address) > 1:
Antoine Pitrou45aba182014-05-15 20:18:41 +02001550 arg = address[1]
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001551 else:
Antoine Pitrou45aba182014-05-15 20:18:41 +02001552 # We weren't given an address[1]
1553 arg = self._max_prefixlen
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001554 self.network_address = IPv4Address(address[0])
Antoine Pitrou45aba182014-05-15 20:18:41 +02001555 self.netmask, self._prefixlen = self._make_netmask(arg)
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001556 packed = int(self.network_address)
1557 if packed & int(self.netmask) != packed:
1558 if strict:
1559 raise ValueError('%s has host bits set' % self)
1560 else:
1561 self.network_address = IPv4Address(packed &
1562 int(self.netmask))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001563 return
1564
1565 # Assume input argument to be string or any object representation
1566 # which converts into a formatted IP prefix string.
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001567 addr = _split_optional_netmask(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001568 self.network_address = IPv4Address(self._ip_int_from_string(addr[0]))
1569
Nick Coghlandc9b2552012-05-20 21:01:57 +10001570 if len(addr) == 2:
Antoine Pitrou45aba182014-05-15 20:18:41 +02001571 arg = addr[1]
Nick Coghlandc9b2552012-05-20 21:01:57 +10001572 else:
Antoine Pitrou45aba182014-05-15 20:18:41 +02001573 arg = self._max_prefixlen
1574 self.netmask, self._prefixlen = self._make_netmask(arg)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001575
1576 if strict:
1577 if (IPv4Address(int(self.network_address) & int(self.netmask)) !=
1578 self.network_address):
1579 raise ValueError('%s has host bits set' % self)
1580 self.network_address = IPv4Address(int(self.network_address) &
1581 int(self.netmask))
1582
1583 if self._prefixlen == (self._max_prefixlen - 1):
1584 self.hosts = self.__iter__
1585
Peter Moodye5019d52013-10-24 09:47:10 -07001586 @property
1587 @functools.lru_cache()
1588 def is_global(self):
1589 """Test if this address is allocated for public networks.
1590
1591 Returns:
1592 A boolean, True if the address is not reserved per
1593 iana-ipv4-special-registry.
1594
1595 """
1596 return (not (self.network_address in IPv4Network('100.64.0.0/10') and
1597 self.broadcast_address in IPv4Network('100.64.0.0/10')) and
1598 not self.is_private)
1599
1600
Nick Coghlandc9b2552012-05-20 21:01:57 +10001601
Hynek Schlawackc4b78a32012-06-01 11:48:32 +02001602class _BaseV6:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001603
1604 """Base IPv6 object.
1605
1606 The following methods are used by IPv6 objects in both single IP
1607 addresses and networks.
1608
1609 """
1610
1611 _ALL_ONES = (2**IPV6LENGTH) - 1
1612 _HEXTET_COUNT = 8
1613 _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef')
Antoine Pitrou45aba182014-05-15 20:18:41 +02001614 _max_prefixlen = IPV6LENGTH
1615
1616 # There are only a bunch of valid v6 netmasks, so we cache them all
1617 # when constructed (see _make_netmask()).
1618 _netmask_cache = {}
Nick Coghlandc9b2552012-05-20 21:01:57 +10001619
1620 def __init__(self, address):
1621 self._version = 6
Nick Coghlandc9b2552012-05-20 21:01:57 +10001622
Antoine Pitrou45aba182014-05-15 20:18:41 +02001623 @classmethod
1624 def _make_netmask(cls, arg):
1625 """Make a (netmask, prefix_len) tuple from the given argument.
1626
1627 Argument can be:
1628 - an integer (the prefix length)
1629 - a string representing the prefix length (e.g. "24")
1630 - a string representing the prefix netmask (e.g. "255.255.255.0")
1631 """
1632 if arg not in cls._netmask_cache:
1633 if isinstance(arg, int):
1634 prefixlen = arg
1635 else:
1636 prefixlen = cls._prefix_from_prefix_string(arg)
1637 netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen))
1638 cls._netmask_cache[arg] = netmask, prefixlen
1639 return cls._netmask_cache[arg]
1640
1641 @classmethod
1642 def _ip_int_from_string(cls, ip_str):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001643 """Turn an IPv6 ip_str into an integer.
1644
1645 Args:
1646 ip_str: A string, the IPv6 ip_str.
1647
1648 Returns:
1649 An int, the IPv6 address
1650
1651 Raises:
1652 AddressValueError: if ip_str isn't a valid IPv6 Address.
1653
1654 """
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001655 if not ip_str:
1656 raise AddressValueError('Address cannot be empty')
1657
Nick Coghlandc9b2552012-05-20 21:01:57 +10001658 parts = ip_str.split(':')
1659
1660 # An IPv6 address needs at least 2 colons (3 parts).
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001661 _min_parts = 3
1662 if len(parts) < _min_parts:
1663 msg = "At least %d parts expected in %r" % (_min_parts, ip_str)
1664 raise AddressValueError(msg)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001665
1666 # If the address has an IPv4-style suffix, convert it to hexadecimal.
1667 if '.' in parts[-1]:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001668 try:
1669 ipv4_int = IPv4Address(parts.pop())._ip
1670 except AddressValueError as exc:
1671 raise AddressValueError("%s in %r" % (exc, ip_str)) from None
Nick Coghlandc9b2552012-05-20 21:01:57 +10001672 parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF))
1673 parts.append('%x' % (ipv4_int & 0xFFFF))
1674
1675 # An IPv6 address can't have more than 8 colons (9 parts).
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001676 # The extra colon comes from using the "::" notation for a single
1677 # leading or trailing zero part.
Antoine Pitrou45aba182014-05-15 20:18:41 +02001678 _max_parts = cls._HEXTET_COUNT + 1
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001679 if len(parts) > _max_parts:
1680 msg = "At most %d colons permitted in %r" % (_max_parts-1, ip_str)
1681 raise AddressValueError(msg)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001682
1683 # Disregarding the endpoints, find '::' with nothing in between.
1684 # This indicates that a run of zeroes has been skipped.
Nick Coghlan7319f692012-07-07 21:43:30 +10001685 skip_index = None
1686 for i in range(1, len(parts) - 1):
1687 if not parts[i]:
1688 if skip_index is not None:
1689 # Can't have more than one '::'
1690 msg = "At most one '::' permitted in %r" % ip_str
1691 raise AddressValueError(msg)
1692 skip_index = i
Nick Coghlandc9b2552012-05-20 21:01:57 +10001693
1694 # parts_hi is the number of parts to copy from above/before the '::'
1695 # parts_lo is the number of parts to copy from below/after the '::'
1696 if skip_index is not None:
1697 # If we found a '::', then check if it also covers the endpoints.
1698 parts_hi = skip_index
1699 parts_lo = len(parts) - skip_index - 1
1700 if not parts[0]:
1701 parts_hi -= 1
1702 if parts_hi:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001703 msg = "Leading ':' only permitted as part of '::' in %r"
1704 raise AddressValueError(msg % ip_str) # ^: requires ^::
Nick Coghlandc9b2552012-05-20 21:01:57 +10001705 if not parts[-1]:
1706 parts_lo -= 1
1707 if parts_lo:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001708 msg = "Trailing ':' only permitted as part of '::' in %r"
1709 raise AddressValueError(msg % ip_str) # :$ requires ::$
Antoine Pitrou45aba182014-05-15 20:18:41 +02001710 parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001711 if parts_skipped < 1:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001712 msg = "Expected at most %d other parts with '::' in %r"
Antoine Pitrou45aba182014-05-15 20:18:41 +02001713 raise AddressValueError(msg % (cls._HEXTET_COUNT-1, ip_str))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001714 else:
Hynek Schlawack072b1e12012-05-26 12:04:56 +02001715 # Otherwise, allocate the entire address to parts_hi. The
1716 # endpoints could still be empty, but _parse_hextet() will check
1717 # for that.
Antoine Pitrou45aba182014-05-15 20:18:41 +02001718 if len(parts) != cls._HEXTET_COUNT:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001719 msg = "Exactly %d parts expected without '::' in %r"
Antoine Pitrou45aba182014-05-15 20:18:41 +02001720 raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str))
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001721 if not parts[0]:
1722 msg = "Leading ':' only permitted as part of '::' in %r"
1723 raise AddressValueError(msg % ip_str) # ^: requires ^::
1724 if not parts[-1]:
1725 msg = "Trailing ':' only permitted as part of '::' in %r"
1726 raise AddressValueError(msg % ip_str) # :$ requires ::$
Nick Coghlandc9b2552012-05-20 21:01:57 +10001727 parts_hi = len(parts)
1728 parts_lo = 0
1729 parts_skipped = 0
1730
1731 try:
1732 # Now, parse the hextets into a 128-bit integer.
1733 ip_int = 0
1734 for i in range(parts_hi):
1735 ip_int <<= 16
Antoine Pitrou45aba182014-05-15 20:18:41 +02001736 ip_int |= cls._parse_hextet(parts[i])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001737 ip_int <<= 16 * parts_skipped
1738 for i in range(-parts_lo, 0):
1739 ip_int <<= 16
Antoine Pitrou45aba182014-05-15 20:18:41 +02001740 ip_int |= cls._parse_hextet(parts[i])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001741 return ip_int
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001742 except ValueError as exc:
1743 raise AddressValueError("%s in %r" % (exc, ip_str)) from None
Nick Coghlandc9b2552012-05-20 21:01:57 +10001744
Antoine Pitrou45aba182014-05-15 20:18:41 +02001745 @classmethod
1746 def _parse_hextet(cls, hextet_str):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001747 """Convert an IPv6 hextet string into an integer.
1748
1749 Args:
1750 hextet_str: A string, the number to parse.
1751
1752 Returns:
1753 The hextet as an integer.
1754
1755 Raises:
Hynek Schlawack072b1e12012-05-26 12:04:56 +02001756 ValueError: if the input isn't strictly a hex number from
1757 [0..FFFF].
Nick Coghlandc9b2552012-05-20 21:01:57 +10001758
1759 """
1760 # Whitelist the characters, since int() allows a lot of bizarre stuff.
Antoine Pitrou45aba182014-05-15 20:18:41 +02001761 if not cls._HEX_DIGITS.issuperset(hextet_str):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001762 raise ValueError("Only hex digits permitted in %r" % hextet_str)
Nick Coghlan07c4e332012-07-08 23:06:45 +10001763 # We do the length check second, since the invalid character error
1764 # is likely to be more informative for the user
Nick Coghlan3c2570c2012-07-07 01:13:55 +10001765 if len(hextet_str) > 4:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001766 msg = "At most 4 characters permitted in %r"
1767 raise ValueError(msg % hextet_str)
Nick Coghlan07c4e332012-07-08 23:06:45 +10001768 # Length check means we can skip checking the integer value
1769 return int(hextet_str, 16)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001770
Antoine Pitrou45aba182014-05-15 20:18:41 +02001771 @classmethod
1772 def _compress_hextets(cls, hextets):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001773 """Compresses a list of hextets.
1774
1775 Compresses a list of strings, replacing the longest continuous
1776 sequence of "0" in the list with "" and adding empty strings at
1777 the beginning or at the end of the string such that subsequently
1778 calling ":".join(hextets) will produce the compressed version of
1779 the IPv6 address.
1780
1781 Args:
1782 hextets: A list of strings, the hextets to compress.
1783
1784 Returns:
1785 A list of strings.
1786
1787 """
1788 best_doublecolon_start = -1
1789 best_doublecolon_len = 0
1790 doublecolon_start = -1
1791 doublecolon_len = 0
Nick Coghlandb7920b2012-08-20 10:19:12 +10001792 for index, hextet in enumerate(hextets):
1793 if hextet == '0':
Nick Coghlandc9b2552012-05-20 21:01:57 +10001794 doublecolon_len += 1
1795 if doublecolon_start == -1:
1796 # Start of a sequence of zeros.
1797 doublecolon_start = index
1798 if doublecolon_len > best_doublecolon_len:
1799 # This is the longest sequence of zeros so far.
1800 best_doublecolon_len = doublecolon_len
1801 best_doublecolon_start = doublecolon_start
1802 else:
1803 doublecolon_len = 0
1804 doublecolon_start = -1
1805
1806 if best_doublecolon_len > 1:
1807 best_doublecolon_end = (best_doublecolon_start +
1808 best_doublecolon_len)
1809 # For zeros at the end of the address.
1810 if best_doublecolon_end == len(hextets):
1811 hextets += ['']
1812 hextets[best_doublecolon_start:best_doublecolon_end] = ['']
1813 # For zeros at the beginning of the address.
1814 if best_doublecolon_start == 0:
1815 hextets = [''] + hextets
1816
1817 return hextets
1818
Antoine Pitrou45aba182014-05-15 20:18:41 +02001819 @classmethod
1820 def _string_from_ip_int(cls, ip_int=None):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001821 """Turns a 128-bit integer into hexadecimal notation.
1822
1823 Args:
1824 ip_int: An integer, the IP address.
1825
1826 Returns:
1827 A string, the hexadecimal representation of the address.
1828
1829 Raises:
1830 ValueError: The address is bigger than 128 bits of all ones.
1831
1832 """
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001833 if ip_int is None:
Antoine Pitrou45aba182014-05-15 20:18:41 +02001834 ip_int = int(cls._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001835
Antoine Pitrou45aba182014-05-15 20:18:41 +02001836 if ip_int > cls._ALL_ONES:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001837 raise ValueError('IPv6 address is too large')
1838
1839 hex_str = '%032x' % ip_int
Nick Coghlan7319f692012-07-07 21:43:30 +10001840 hextets = ['%x' % int(hex_str[x:x+4], 16) for x in range(0, 32, 4)]
Nick Coghlandc9b2552012-05-20 21:01:57 +10001841
Antoine Pitrou45aba182014-05-15 20:18:41 +02001842 hextets = cls._compress_hextets(hextets)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001843 return ':'.join(hextets)
1844
1845 def _explode_shorthand_ip_string(self):
1846 """Expand a shortened IPv6 address.
1847
1848 Args:
1849 ip_str: A string, the IPv6 address.
1850
1851 Returns:
1852 A string, the expanded IPv6 address.
1853
1854 """
1855 if isinstance(self, IPv6Network):
1856 ip_str = str(self.network_address)
1857 elif isinstance(self, IPv6Interface):
1858 ip_str = str(self.ip)
1859 else:
1860 ip_str = str(self)
1861
1862 ip_int = self._ip_int_from_string(ip_str)
Nick Coghlan7319f692012-07-07 21:43:30 +10001863 hex_str = '%032x' % ip_int
1864 parts = [hex_str[x:x+4] for x in range(0, 32, 4)]
Nick Coghlandc9b2552012-05-20 21:01:57 +10001865 if isinstance(self, (_BaseNetwork, IPv6Interface)):
Nick Coghlane3ded952012-08-05 22:45:22 +10001866 return '%s/%d' % (':'.join(parts), self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001867 return ':'.join(parts)
1868
Eric V. Smithebdaaf42014-04-14 12:58:07 -04001869 def _reverse_pointer(self):
1870 """Return the reverse DNS pointer name for the IPv6 address.
1871
1872 This implements the method described in RFC3596 2.5.
1873
1874 """
1875 reverse_chars = self.exploded[::-1].replace(':', '')
1876 return '.'.join(reverse_chars) + '.ip6.arpa'
1877
Nick Coghlandc9b2552012-05-20 21:01:57 +10001878 @property
1879 def max_prefixlen(self):
1880 return self._max_prefixlen
1881
1882 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +10001883 def version(self):
1884 return self._version
1885
Nick Coghlandc9b2552012-05-20 21:01:57 +10001886
1887class IPv6Address(_BaseV6, _BaseAddress):
1888
Sandro Tosib95c6342012-05-23 23:17:22 +02001889 """Represent and manipulate single IPv6 Addresses."""
Nick Coghlandc9b2552012-05-20 21:01:57 +10001890
1891 def __init__(self, address):
1892 """Instantiate a new IPv6 address object.
1893
1894 Args:
1895 address: A string or integer representing the IP
1896
1897 Additionally, an integer can be passed, so
1898 IPv6Address('2001:db8::') ==
1899 IPv6Address(42540766411282592856903984951653826560)
1900 or, more generally
1901 IPv6Address(int(IPv6Address('2001:db8::'))) ==
1902 IPv6Address('2001:db8::')
1903
1904 Raises:
1905 AddressValueError: If address isn't a valid IPv6 address.
1906
1907 """
1908 _BaseAddress.__init__(self, address)
1909 _BaseV6.__init__(self, address)
1910
1911 # Efficient constructor from integer.
1912 if isinstance(address, int):
Nick Coghlan297b1432012-07-08 17:11:04 +10001913 self._check_int_address(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001914 self._ip = address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001915 return
1916
1917 # Constructing from a packed address
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001918 if isinstance(address, bytes):
Nick Coghlan297b1432012-07-08 17:11:04 +10001919 self._check_packed_address(address, 16)
Nick Coghlandb7920b2012-08-20 10:19:12 +10001920 self._ip = int.from_bytes(address, 'big')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001921 return
1922
1923 # Assume input argument to be string or any object representation
1924 # which converts into a formatted IP string.
1925 addr_str = str(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001926 self._ip = self._ip_int_from_string(addr_str)
1927
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001928 @property
1929 def packed(self):
1930 """The binary representation of this address."""
1931 return v6_int_to_packed(self._ip)
1932
Nick Coghlan730f67f2012-08-05 22:02:18 +10001933 @property
1934 def is_multicast(self):
1935 """Test if the address is reserved for multicast use.
1936
1937 Returns:
1938 A boolean, True if the address is a multicast address.
1939 See RFC 2373 2.7 for details.
1940
1941 """
1942 multicast_network = IPv6Network('ff00::/8')
1943 return self in multicast_network
1944
1945 @property
1946 def is_reserved(self):
1947 """Test if the address is otherwise IETF reserved.
1948
1949 Returns:
1950 A boolean, True if the address is within one of the
1951 reserved IPv6 Network ranges.
1952
1953 """
1954 reserved_networks = [IPv6Network('::/8'), IPv6Network('100::/8'),
1955 IPv6Network('200::/7'), IPv6Network('400::/6'),
1956 IPv6Network('800::/5'), IPv6Network('1000::/4'),
1957 IPv6Network('4000::/3'), IPv6Network('6000::/3'),
1958 IPv6Network('8000::/3'), IPv6Network('A000::/3'),
1959 IPv6Network('C000::/3'), IPv6Network('E000::/4'),
1960 IPv6Network('F000::/5'), IPv6Network('F800::/6'),
1961 IPv6Network('FE00::/9')]
1962
1963 return any(self in x for x in reserved_networks)
1964
1965 @property
1966 def is_link_local(self):
1967 """Test if the address is reserved for link-local.
1968
1969 Returns:
1970 A boolean, True if the address is reserved per RFC 4291.
1971
1972 """
1973 linklocal_network = IPv6Network('fe80::/10')
1974 return self in linklocal_network
1975
1976 @property
1977 def is_site_local(self):
1978 """Test if the address is reserved for site-local.
1979
1980 Note that the site-local address space has been deprecated by RFC 3879.
1981 Use is_private to test if this address is in the space of unique local
1982 addresses as defined by RFC 4193.
1983
1984 Returns:
1985 A boolean, True if the address is reserved per RFC 3513 2.5.6.
1986
1987 """
1988 sitelocal_network = IPv6Network('fec0::/10')
1989 return self in sitelocal_network
1990
1991 @property
Peter Moodybe9c1b12013-10-22 12:36:21 -07001992 @functools.lru_cache()
Nick Coghlan730f67f2012-08-05 22:02:18 +10001993 def is_private(self):
1994 """Test if this address is allocated for private networks.
1995
1996 Returns:
Peter Moody22c31762013-10-21 13:58:06 -07001997 A boolean, True if the address is reserved per
1998 iana-ipv6-special-registry.
Nick Coghlan730f67f2012-08-05 22:02:18 +10001999
2000 """
Peter Moody22c31762013-10-21 13:58:06 -07002001 return (self in IPv6Network('::1/128') or
2002 self in IPv6Network('::/128') or
2003 self in IPv6Network('::ffff:0:0/96') or
2004 self in IPv6Network('100::/64') or
2005 self in IPv6Network('2001::/23') or
2006 self in IPv6Network('2001:2::/48') or
2007 self in IPv6Network('2001:db8::/32') or
2008 self in IPv6Network('2001:10::/28') or
2009 self in IPv6Network('fc00::/7') or
2010 self in IPv6Network('fe80::/10'))
2011
2012 @property
2013 def is_global(self):
2014 """Test if this address is allocated for public networks.
2015
2016 Returns:
2017 A boolean, true if the address is not reserved per
2018 iana-ipv6-special-registry.
2019
2020 """
2021 return not self.is_private
Nick Coghlan730f67f2012-08-05 22:02:18 +10002022
2023 @property
2024 def is_unspecified(self):
2025 """Test if the address is unspecified.
2026
2027 Returns:
2028 A boolean, True if this is the unspecified address as defined in
2029 RFC 2373 2.5.2.
2030
2031 """
2032 return self._ip == 0
2033
2034 @property
2035 def is_loopback(self):
2036 """Test if the address is a loopback address.
2037
2038 Returns:
2039 A boolean, True if the address is a loopback address as defined in
2040 RFC 2373 2.5.3.
2041
2042 """
2043 return self._ip == 1
2044
2045 @property
2046 def ipv4_mapped(self):
2047 """Return the IPv4 mapped address.
2048
2049 Returns:
2050 If the IPv6 address is a v4 mapped address, return the
2051 IPv4 mapped address. Return None otherwise.
2052
2053 """
2054 if (self._ip >> 32) != 0xFFFF:
2055 return None
2056 return IPv4Address(self._ip & 0xFFFFFFFF)
2057
2058 @property
2059 def teredo(self):
2060 """Tuple of embedded teredo IPs.
2061
2062 Returns:
2063 Tuple of the (server, client) IPs or None if the address
2064 doesn't appear to be a teredo address (doesn't start with
2065 2001::/32)
2066
2067 """
2068 if (self._ip >> 96) != 0x20010000:
2069 return None
2070 return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF),
2071 IPv4Address(~self._ip & 0xFFFFFFFF))
2072
2073 @property
2074 def sixtofour(self):
2075 """Return the IPv4 6to4 embedded address.
2076
2077 Returns:
2078 The IPv4 6to4-embedded address if present or None if the
2079 address doesn't appear to contain a 6to4 embedded address.
2080
2081 """
2082 if (self._ip >> 112) != 0x2002:
2083 return None
2084 return IPv4Address((self._ip >> 80) & 0xFFFFFFFF)
2085
Nick Coghlandc9b2552012-05-20 21:01:57 +10002086
2087class IPv6Interface(IPv6Address):
2088
2089 def __init__(self, address):
2090 if isinstance(address, (bytes, int)):
2091 IPv6Address.__init__(self, address)
2092 self.network = IPv6Network(self._ip)
2093 self._prefixlen = self._max_prefixlen
2094 return
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02002095 if isinstance(address, tuple):
2096 IPv6Address.__init__(self, address[0])
2097 if len(address) > 1:
2098 self._prefixlen = int(address[1])
2099 else:
2100 self._prefixlen = self._max_prefixlen
2101 self.network = IPv6Network(address, strict=False)
2102 self.netmask = self.network.netmask
2103 self.hostmask = self.network.hostmask
2104 return
Nick Coghlandc9b2552012-05-20 21:01:57 +10002105
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10002106 addr = _split_optional_netmask(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002107 IPv6Address.__init__(self, addr[0])
2108 self.network = IPv6Network(address, strict=False)
2109 self.netmask = self.network.netmask
2110 self._prefixlen = self.network._prefixlen
2111 self.hostmask = self.network.hostmask
2112
Nick Coghlandc9b2552012-05-20 21:01:57 +10002113 def __str__(self):
2114 return '%s/%d' % (self._string_from_ip_int(self._ip),
2115 self.network.prefixlen)
2116
2117 def __eq__(self, other):
Nick Coghlan3008ec02012-07-08 00:45:33 +10002118 address_equal = IPv6Address.__eq__(self, other)
2119 if not address_equal or address_equal is NotImplemented:
2120 return address_equal
Nick Coghlandc9b2552012-05-20 21:01:57 +10002121 try:
Nick Coghlan3008ec02012-07-08 00:45:33 +10002122 return self.network == other.network
Nick Coghlandc9b2552012-05-20 21:01:57 +10002123 except AttributeError:
Nick Coghlan3008ec02012-07-08 00:45:33 +10002124 # An interface with an associated network is NOT the
2125 # same as an unassociated address. That's why the hash
2126 # takes the extra info into account.
2127 return False
2128
2129 def __lt__(self, other):
2130 address_less = IPv6Address.__lt__(self, other)
2131 if address_less is NotImplemented:
Nick Coghlandc9b2552012-05-20 21:01:57 +10002132 return NotImplemented
Nick Coghlan3008ec02012-07-08 00:45:33 +10002133 try:
2134 return self.network < other.network
2135 except AttributeError:
2136 # We *do* allow addresses and interfaces to be sorted. The
2137 # unassociated address is considered less than all interfaces.
2138 return False
Nick Coghlandc9b2552012-05-20 21:01:57 +10002139
2140 def __hash__(self):
2141 return self._ip ^ self._prefixlen ^ int(self.network.network_address)
2142
2143 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +10002144 def ip(self):
2145 return IPv6Address(self._ip)
2146
2147 @property
2148 def with_prefixlen(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10002149 return '%s/%s' % (self._string_from_ip_int(self._ip),
2150 self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002151
2152 @property
2153 def with_netmask(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10002154 return '%s/%s' % (self._string_from_ip_int(self._ip),
2155 self.netmask)
Hynek Schlawack072b1e12012-05-26 12:04:56 +02002156
Nick Coghlandc9b2552012-05-20 21:01:57 +10002157 @property
2158 def with_hostmask(self):
2159 return '%s/%s' % (self._string_from_ip_int(self._ip),
2160 self.hostmask)
2161
Nick Coghlan730f67f2012-08-05 22:02:18 +10002162 @property
2163 def is_unspecified(self):
2164 return self._ip == 0 and self.network.is_unspecified
2165
2166 @property
2167 def is_loopback(self):
2168 return self._ip == 1 and self.network.is_loopback
2169
Nick Coghlandc9b2552012-05-20 21:01:57 +10002170
2171class IPv6Network(_BaseV6, _BaseNetwork):
2172
2173 """This class represents and manipulates 128-bit IPv6 networks.
2174
2175 Attributes: [examples for IPv6('2001:db8::1000/124')]
2176 .network_address: IPv6Address('2001:db8::1000')
2177 .hostmask: IPv6Address('::f')
2178 .broadcast_address: IPv6Address('2001:db8::100f')
2179 .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0')
2180 .prefixlen: 124
2181
2182 """
2183
Nick Coghlan51c30672012-05-27 00:25:58 +10002184 # Class to use when creating address objects
Nick Coghlan51c30672012-05-27 00:25:58 +10002185 _address_class = IPv6Address
2186
Nick Coghlandc9b2552012-05-20 21:01:57 +10002187 def __init__(self, address, strict=True):
2188 """Instantiate a new IPv6 Network object.
2189
2190 Args:
Hynek Schlawack072b1e12012-05-26 12:04:56 +02002191 address: A string or integer representing the IPv6 network or the
2192 IP and prefix/netmask.
Nick Coghlandc9b2552012-05-20 21:01:57 +10002193 '2001:db8::/128'
2194 '2001:db8:0000:0000:0000:0000:0000:0000/128'
2195 '2001:db8::'
2196 are all functionally the same in IPv6. That is to say,
2197 failing to provide a subnetmask will create an object with
2198 a mask of /128.
2199
2200 Additionally, an integer can be passed, so
2201 IPv6Network('2001:db8::') ==
2202 IPv6Network(42540766411282592856903984951653826560)
2203 or, more generally
2204 IPv6Network(int(IPv6Network('2001:db8::'))) ==
2205 IPv6Network('2001:db8::')
2206
2207 strict: A boolean. If true, ensure that we have been passed
2208 A true network address, eg, 2001:db8::1000/124 and not an
2209 IP address on a network, eg, 2001:db8::1/124.
2210
2211 Raises:
2212 AddressValueError: If address isn't a valid IPv6 address.
2213 NetmaskValueError: If the netmask isn't valid for
2214 an IPv6 address.
2215 ValueError: If strict was True and a network address was not
2216 supplied.
2217
2218 """
2219 _BaseV6.__init__(self, address)
2220 _BaseNetwork.__init__(self, address)
2221
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02002222 # Efficient constructor from integer or packed address
2223 if isinstance(address, (bytes, int)):
Nick Coghlandc9b2552012-05-20 21:01:57 +10002224 self.network_address = IPv6Address(address)
Antoine Pitrou45aba182014-05-15 20:18:41 +02002225 self.netmask, self._prefixlen = self._make_netmask(self._max_prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002226 return
2227
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02002228 if isinstance(address, tuple):
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02002229 if len(address) > 1:
Antoine Pitrou45aba182014-05-15 20:18:41 +02002230 arg = address[1]
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02002231 else:
Antoine Pitrou45aba182014-05-15 20:18:41 +02002232 arg = self._max_prefixlen
2233 self.netmask, self._prefixlen = self._make_netmask(arg)
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02002234 self.network_address = IPv6Address(address[0])
2235 packed = int(self.network_address)
2236 if packed & int(self.netmask) != packed:
2237 if strict:
2238 raise ValueError('%s has host bits set' % self)
2239 else:
2240 self.network_address = IPv6Address(packed &
2241 int(self.netmask))
Hynek Schlawacked36b2e2012-06-08 15:21:21 +02002242 return
Nick Coghlandc9b2552012-05-20 21:01:57 +10002243
2244 # Assume input argument to be string or any object representation
2245 # which converts into a formatted IP prefix string.
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10002246 addr = _split_optional_netmask(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002247
2248 self.network_address = IPv6Address(self._ip_int_from_string(addr[0]))
2249
2250 if len(addr) == 2:
Antoine Pitrou45aba182014-05-15 20:18:41 +02002251 arg = addr[1]
Nick Coghlandc9b2552012-05-20 21:01:57 +10002252 else:
Antoine Pitrou45aba182014-05-15 20:18:41 +02002253 arg = self._max_prefixlen
2254 self.netmask, self._prefixlen = self._make_netmask(arg)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002255
Nick Coghlandc9b2552012-05-20 21:01:57 +10002256 if strict:
2257 if (IPv6Address(int(self.network_address) & int(self.netmask)) !=
2258 self.network_address):
Nick Coghlan912238e2012-07-07 13:34:50 +10002259 raise ValueError('%s has host bits set' % self)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002260 self.network_address = IPv6Address(int(self.network_address) &
2261 int(self.netmask))
2262
2263 if self._prefixlen == (self._max_prefixlen - 1):
2264 self.hosts = self.__iter__
2265
Peter Moody1243c7d2014-03-11 09:55:46 -07002266 def hosts(self):
2267 """Generate Iterator over usable hosts in a network.
2268
2269 This is like __iter__ except it doesn't return the
2270 Subnet-Router anycast address.
2271
2272 """
2273 network = int(self.network_address)
2274 broadcast = int(self.broadcast_address)
2275 for x in range(network + 1, broadcast + 1):
2276 yield self._address_class(x)
2277
Nick Coghlan730f67f2012-08-05 22:02:18 +10002278 @property
2279 def is_site_local(self):
2280 """Test if the address is reserved for site-local.
2281
2282 Note that the site-local address space has been deprecated by RFC 3879.
2283 Use is_private to test if this address is in the space of unique local
2284 addresses as defined by RFC 4193.
2285
2286 Returns:
2287 A boolean, True if the address is reserved per RFC 3513 2.5.6.
2288
2289 """
2290 return (self.network_address.is_site_local and
2291 self.broadcast_address.is_site_local)