blob: 77df0511e78abb5b5b350d906a990e30bcc779b8 [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')
Serhiy Storchakaba9ac5b2015-05-20 10:33:40 +0300138 except OverflowError:
Sandro Tosi876ecad2012-05-23 22:26:55 +0200139 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')
Serhiy Storchakaba9ac5b2015-05-20 10:33:40 +0300154 except OverflowError:
Sandro Tosi876ecad2012-05-23 22:26:55 +0200155 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):
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +0200167 """Find a sequence of sorted deduplicated 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
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +0200172 Yields:
173 A tuple containing the first and last IP addresses in the sequence.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000174
175 """
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +0200176 it = iter(addresses)
177 first = last = next(it)
178 for ip in it:
179 if ip._ip != last._ip + 1:
180 yield first, last
181 first = ip
182 last = ip
183 yield first, last
Nick Coghlandc9b2552012-05-20 21:01:57 +1000184
Sandro Tosib95c6342012-05-23 23:17:22 +0200185
Nick Coghlandc9b2552012-05-20 21:01:57 +1000186def _count_righthand_zero_bits(number, bits):
187 """Count the number of zero bits on the right hand side.
188
189 Args:
190 number: an integer.
191 bits: maximum number of bits to count.
192
193 Returns:
194 The number of zero bits on the right hand side of the number.
195
196 """
197 if number == 0:
198 return bits
Antoine Pitrou824db302014-05-15 20:21:48 +0200199 return min(bits, (~number & (number-1)).bit_length())
Nick Coghlandc9b2552012-05-20 21:01:57 +1000200
201
202def summarize_address_range(first, last):
203 """Summarize a network range given the first and last IP addresses.
204
205 Example:
Eli Bendersky948af232012-10-07 07:23:50 -0700206 >>> list(summarize_address_range(IPv4Address('192.0.2.0'),
207 ... IPv4Address('192.0.2.130')))
208 ... #doctest: +NORMALIZE_WHITESPACE
Nick Coghlandc9b2552012-05-20 21:01:57 +1000209 [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'),
Eli Bendersky948af232012-10-07 07:23:50 -0700210 IPv4Network('192.0.2.130/32')]
Nick Coghlandc9b2552012-05-20 21:01:57 +1000211
212 Args:
213 first: the first IPv4Address or IPv6Address in the range.
214 last: the last IPv4Address or IPv6Address in the range.
215
216 Returns:
217 An iterator of the summarized IPv(4|6) network objects.
218
219 Raise:
220 TypeError:
221 If the first and last objects are not IP addresses.
222 If the first and last objects are not the same version.
223 ValueError:
224 If the last object is not greater than the first.
Nick Coghlan51c30672012-05-27 00:25:58 +1000225 If the version of the first address is not 4 or 6.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000226
227 """
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200228 if (not (isinstance(first, _BaseAddress) and
229 isinstance(last, _BaseAddress))):
Nick Coghlandc9b2552012-05-20 21:01:57 +1000230 raise TypeError('first and last must be IP addresses, not networks')
231 if first.version != last.version:
232 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000233 first, last))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000234 if first > last:
235 raise ValueError('last IP address must be greater than first')
236
Nick Coghlandc9b2552012-05-20 21:01:57 +1000237 if first.version == 4:
238 ip = IPv4Network
239 elif first.version == 6:
240 ip = IPv6Network
241 else:
242 raise ValueError('unknown IP version')
243
244 ip_bits = first._max_prefixlen
245 first_int = first._ip
246 last_int = last._ip
247 while first_int <= last_int:
Nick Coghlan7319f692012-07-07 21:43:30 +1000248 nbits = min(_count_righthand_zero_bits(first_int, ip_bits),
249 (last_int - first_int + 1).bit_length() - 1)
Antoine Pitrou824db302014-05-15 20:21:48 +0200250 net = ip((first_int, ip_bits - nbits))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000251 yield net
Nick Coghlan7319f692012-07-07 21:43:30 +1000252 first_int += 1 << nbits
253 if first_int - 1 == ip._ALL_ONES:
Nick Coghlandc9b2552012-05-20 21:01:57 +1000254 break
Nick Coghlandc9b2552012-05-20 21:01:57 +1000255
Sandro Tosib95c6342012-05-23 23:17:22 +0200256
Antoine Pitrou1e71c532014-05-15 20:40:53 +0200257def _collapse_addresses_internal(addresses):
Nick Coghlandc9b2552012-05-20 21:01:57 +1000258 """Loops through the addresses, collapsing concurrent netblocks.
259
260 Example:
261
262 ip1 = IPv4Network('192.0.2.0/26')
263 ip2 = IPv4Network('192.0.2.64/26')
264 ip3 = IPv4Network('192.0.2.128/26')
265 ip4 = IPv4Network('192.0.2.192/26')
266
Antoine Pitrou1e71c532014-05-15 20:40:53 +0200267 _collapse_addresses_internal([ip1, ip2, ip3, ip4]) ->
Nick Coghlandc9b2552012-05-20 21:01:57 +1000268 [IPv4Network('192.0.2.0/24')]
269
270 This shouldn't be called directly; it is called via
271 collapse_addresses([]).
272
273 Args:
274 addresses: A list of IPv4Network's or IPv6Network's
275
276 Returns:
277 A list of IPv4Network's or IPv6Network's depending on what we were
278 passed.
279
280 """
Antoine Pitrou1e71c532014-05-15 20:40:53 +0200281 # First merge
282 to_merge = list(addresses)
283 subnets = {}
284 while to_merge:
285 net = to_merge.pop()
286 supernet = net.supernet()
287 existing = subnets.get(supernet)
288 if existing is None:
289 subnets[supernet] = net
290 elif existing != net:
291 # Merge consecutive subnets
292 del subnets[supernet]
293 to_merge.append(supernet)
294 # Then iterate over resulting networks, skipping subsumed subnets
295 last = None
296 for net in sorted(subnets.values()):
297 if last is not None:
298 # Since they are sorted, last.network_address <= net.network_address
299 # is a given.
300 if last.broadcast_address >= net.broadcast_address:
301 continue
302 yield net
303 last = net
Nick Coghlandc9b2552012-05-20 21:01:57 +1000304
305
306def collapse_addresses(addresses):
307 """Collapse a list of IP objects.
308
309 Example:
310 collapse_addresses([IPv4Network('192.0.2.0/25'),
311 IPv4Network('192.0.2.128/25')]) ->
312 [IPv4Network('192.0.2.0/24')]
313
314 Args:
315 addresses: An iterator of IPv4Network or IPv6Network objects.
316
317 Returns:
318 An iterator of the collapsed IPv(4|6)Network objects.
319
320 Raises:
321 TypeError: If passed a list of mixed version objects.
322
323 """
Nick Coghlandc9b2552012-05-20 21:01:57 +1000324 addrs = []
325 ips = []
326 nets = []
327
328 # split IP addresses and networks
329 for ip in addresses:
330 if isinstance(ip, _BaseAddress):
331 if ips and ips[-1]._version != ip._version:
332 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000333 ip, ips[-1]))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000334 ips.append(ip)
335 elif ip._prefixlen == ip._max_prefixlen:
336 if ips and ips[-1]._version != ip._version:
337 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000338 ip, ips[-1]))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000339 try:
340 ips.append(ip.ip)
341 except AttributeError:
342 ips.append(ip.network_address)
343 else:
344 if nets and nets[-1]._version != ip._version:
345 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000346 ip, nets[-1]))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000347 nets.append(ip)
348
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +0200349 # sort and dedup
350 ips = sorted(set(ips))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000351
Antoine Pitroue6f250e2015-01-18 16:22:47 +0100352 # find consecutive address ranges in the sorted sequence and summarize them
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +0200353 if ips:
354 for first, last in _find_address_range(ips):
355 addrs.extend(summarize_address_range(first, last))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000356
Antoine Pitrou1e71c532014-05-15 20:40:53 +0200357 return _collapse_addresses_internal(addrs + nets)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000358
359
360def get_mixed_type_key(obj):
361 """Return a key suitable for sorting between networks and addresses.
362
363 Address and Network objects are not sortable by default; they're
364 fundamentally different so the expression
365
366 IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')
367
368 doesn't make any sense. There are some times however, where you may wish
369 to have ipaddress sort these for you anyway. If you need to do this, you
370 can use this function as the key= argument to sorted().
371
372 Args:
373 obj: either a Network or Address object.
374 Returns:
375 appropriate key.
376
377 """
378 if isinstance(obj, _BaseNetwork):
379 return obj._get_networks_key()
380 elif isinstance(obj, _BaseAddress):
381 return obj._get_address_key()
382 return NotImplemented
383
384
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200385class _IPAddressBase:
Nick Coghlandc9b2552012-05-20 21:01:57 +1000386
387 """The mother class."""
388
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200389 __slots__ = ()
390
Nick Coghlandc9b2552012-05-20 21:01:57 +1000391 @property
392 def exploded(self):
393 """Return the longhand version of the IP address as a string."""
394 return self._explode_shorthand_ip_string()
395
396 @property
397 def compressed(self):
398 """Return the shorthand version of the IP address as a string."""
399 return str(self)
400
Nick Coghland9722652012-06-17 16:33:00 +1000401 @property
Eric V. Smithebdaaf42014-04-14 12:58:07 -0400402 def reverse_pointer(self):
403 """The name of the reverse DNS pointer for the IP address, e.g.:
404 >>> ipaddress.ip_address("127.0.0.1").reverse_pointer
405 '1.0.0.127.in-addr.arpa'
406 >>> ipaddress.ip_address("2001:db8::1").reverse_pointer
407 '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'
408
409 """
410 return self._reverse_pointer()
411
412 @property
Nick Coghland9722652012-06-17 16:33:00 +1000413 def version(self):
414 msg = '%200s has no version specified' % (type(self),)
415 raise NotImplementedError(msg)
416
Nick Coghlan297b1432012-07-08 17:11:04 +1000417 def _check_int_address(self, address):
418 if address < 0:
419 msg = "%d (< 0) is not permitted as an IPv%d address"
420 raise AddressValueError(msg % (address, self._version))
421 if address > self._ALL_ONES:
422 msg = "%d (>= 2**%d) is not permitted as an IPv%d address"
423 raise AddressValueError(msg % (address, self._max_prefixlen,
424 self._version))
425
426 def _check_packed_address(self, address, expected_len):
427 address_len = len(address)
428 if address_len != expected_len:
429 msg = "%r (len %d != %d) is not permitted as an IPv%d address"
430 raise AddressValueError(msg % (address, address_len,
431 expected_len, self._version))
432
Antoine Pitrou45aba182014-05-15 20:18:41 +0200433 @classmethod
434 def _ip_int_from_prefix(cls, prefixlen):
Nick Coghlan932346f2014-02-08 23:17:36 +1000435 """Turn the prefix length into a bitwise netmask
Nick Coghlandc9b2552012-05-20 21:01:57 +1000436
437 Args:
438 prefixlen: An integer, the prefix length.
439
440 Returns:
441 An integer.
442
443 """
Antoine Pitrou45aba182014-05-15 20:18:41 +0200444 return cls._ALL_ONES ^ (cls._ALL_ONES >> prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000445
Antoine Pitrou45aba182014-05-15 20:18:41 +0200446 @classmethod
447 def _prefix_from_ip_int(cls, ip_int):
Nick Coghlan932346f2014-02-08 23:17:36 +1000448 """Return prefix length from the bitwise netmask.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000449
450 Args:
Berker Peksagf23530f2014-10-19 18:04:38 +0300451 ip_int: An integer, the netmask in expanded bitwise format
Nick Coghlandc9b2552012-05-20 21:01:57 +1000452
453 Returns:
454 An integer, the prefix length.
455
Nick Coghlan932346f2014-02-08 23:17:36 +1000456 Raises:
457 ValueError: If the input intermingles zeroes & ones
Nick Coghlandc9b2552012-05-20 21:01:57 +1000458 """
Nick Coghlan932346f2014-02-08 23:17:36 +1000459 trailing_zeroes = _count_righthand_zero_bits(ip_int,
Antoine Pitrou45aba182014-05-15 20:18:41 +0200460 cls._max_prefixlen)
461 prefixlen = cls._max_prefixlen - trailing_zeroes
Nick Coghlan932346f2014-02-08 23:17:36 +1000462 leading_ones = ip_int >> trailing_zeroes
463 all_ones = (1 << prefixlen) - 1
464 if leading_ones != all_ones:
Antoine Pitrou45aba182014-05-15 20:18:41 +0200465 byteslen = cls._max_prefixlen // 8
Nick Coghlan932346f2014-02-08 23:17:36 +1000466 details = ip_int.to_bytes(byteslen, 'big')
467 msg = 'Netmask pattern %r mixes zeroes & ones'
468 raise ValueError(msg % details)
469 return prefixlen
Nick Coghlandc9b2552012-05-20 21:01:57 +1000470
Antoine Pitrou45aba182014-05-15 20:18:41 +0200471 @classmethod
472 def _report_invalid_netmask(cls, netmask_str):
Nick Coghlan932346f2014-02-08 23:17:36 +1000473 msg = '%r is not a valid netmask' % netmask_str
474 raise NetmaskValueError(msg) from None
475
Antoine Pitrou45aba182014-05-15 20:18:41 +0200476 @classmethod
477 def _prefix_from_prefix_string(cls, prefixlen_str):
Nick Coghlan932346f2014-02-08 23:17:36 +1000478 """Return prefix length from a numeric string
Nick Coghlandc9b2552012-05-20 21:01:57 +1000479
480 Args:
Nick Coghlan932346f2014-02-08 23:17:36 +1000481 prefixlen_str: The string to be converted
Nick Coghlandc9b2552012-05-20 21:01:57 +1000482
483 Returns:
Nick Coghlan932346f2014-02-08 23:17:36 +1000484 An integer, the prefix length.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000485
Nick Coghlan932346f2014-02-08 23:17:36 +1000486 Raises:
487 NetmaskValueError: If the input is not a valid netmask
Nick Coghlandc9b2552012-05-20 21:01:57 +1000488 """
Nick Coghlan932346f2014-02-08 23:17:36 +1000489 # int allows a leading +/- as well as surrounding whitespace,
490 # so we ensure that isn't the case
INADA Naoki58a10962018-02-23 20:02:41 +0900491 if not (prefixlen_str.isascii() and prefixlen_str.isdigit()):
Antoine Pitrou45aba182014-05-15 20:18:41 +0200492 cls._report_invalid_netmask(prefixlen_str)
Nick Coghlan932346f2014-02-08 23:17:36 +1000493 try:
494 prefixlen = int(prefixlen_str)
495 except ValueError:
Antoine Pitrou45aba182014-05-15 20:18:41 +0200496 cls._report_invalid_netmask(prefixlen_str)
497 if not (0 <= prefixlen <= cls._max_prefixlen):
498 cls._report_invalid_netmask(prefixlen_str)
Nick Coghlan932346f2014-02-08 23:17:36 +1000499 return prefixlen
500
Antoine Pitrou45aba182014-05-15 20:18:41 +0200501 @classmethod
502 def _prefix_from_ip_string(cls, ip_str):
Nick Coghlan932346f2014-02-08 23:17:36 +1000503 """Turn a netmask/hostmask string into a prefix length
504
505 Args:
506 ip_str: The netmask/hostmask to be converted
507
508 Returns:
509 An integer, the prefix length.
510
511 Raises:
512 NetmaskValueError: If the input is not a valid netmask/hostmask
513 """
514 # Parse the netmask/hostmask like an IP address.
515 try:
Antoine Pitrou45aba182014-05-15 20:18:41 +0200516 ip_int = cls._ip_int_from_string(ip_str)
Nick Coghlan932346f2014-02-08 23:17:36 +1000517 except AddressValueError:
Antoine Pitrou45aba182014-05-15 20:18:41 +0200518 cls._report_invalid_netmask(ip_str)
Nick Coghlan932346f2014-02-08 23:17:36 +1000519
520 # Try matching a netmask (this would be /1*0*/ as a bitwise regexp).
521 # Note that the two ambiguous cases (all-ones and all-zeroes) are
522 # treated as netmasks.
523 try:
Antoine Pitrou45aba182014-05-15 20:18:41 +0200524 return cls._prefix_from_ip_int(ip_int)
Nick Coghlan932346f2014-02-08 23:17:36 +1000525 except ValueError:
526 pass
527
528 # Invert the bits, and try matching a /0+1+/ hostmask instead.
Antoine Pitrou45aba182014-05-15 20:18:41 +0200529 ip_int ^= cls._ALL_ONES
Nick Coghlan932346f2014-02-08 23:17:36 +1000530 try:
Antoine Pitrou45aba182014-05-15 20:18:41 +0200531 return cls._prefix_from_ip_int(ip_int)
Nick Coghlan932346f2014-02-08 23:17:36 +1000532 except ValueError:
Antoine Pitrou45aba182014-05-15 20:18:41 +0200533 cls._report_invalid_netmask(ip_str)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000534
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200535 def __reduce__(self):
536 return self.__class__, (str(self),)
537
Nick Coghlan730f67f2012-08-05 22:02:18 +1000538
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200539@functools.total_ordering
Nick Coghlandc9b2552012-05-20 21:01:57 +1000540class _BaseAddress(_IPAddressBase):
541
542 """A generic IP object.
543
544 This IP class contains the version independent methods which are
545 used by single IP addresses.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000546 """
547
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200548 __slots__ = ()
549
Nick Coghlandc9b2552012-05-20 21:01:57 +1000550 def __int__(self):
551 return self._ip
552
Nick Coghlandc9b2552012-05-20 21:01:57 +1000553 def __eq__(self, other):
554 try:
555 return (self._ip == other._ip
556 and self._version == other._version)
557 except AttributeError:
558 return NotImplemented
559
Nick Coghlandc9b2552012-05-20 21:01:57 +1000560 def __lt__(self, other):
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200561 if not isinstance(other, _BaseAddress):
562 return NotImplemented
Nick Coghlandc9b2552012-05-20 21:01:57 +1000563 if self._version != other._version:
564 raise TypeError('%s and %s are not of the same version' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000565 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000566 if self._ip != other._ip:
567 return self._ip < other._ip
568 return False
569
Nick Coghlandc9b2552012-05-20 21:01:57 +1000570 # Shorthand for Integer addition and subtraction. This is not
571 # meant to ever support addition/subtraction of addresses.
572 def __add__(self, other):
573 if not isinstance(other, int):
574 return NotImplemented
Nick Coghlan51c30672012-05-27 00:25:58 +1000575 return self.__class__(int(self) + other)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000576
577 def __sub__(self, other):
578 if not isinstance(other, int):
579 return NotImplemented
Nick Coghlan51c30672012-05-27 00:25:58 +1000580 return self.__class__(int(self) - other)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000581
582 def __repr__(self):
583 return '%s(%r)' % (self.__class__.__name__, str(self))
584
585 def __str__(self):
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200586 return str(self._string_from_ip_int(self._ip))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000587
588 def __hash__(self):
589 return hash(hex(int(self._ip)))
590
591 def _get_address_key(self):
592 return (self._version, self)
593
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200594 def __reduce__(self):
595 return self.__class__, (self._ip,)
596
Nick Coghlandc9b2552012-05-20 21:01:57 +1000597
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200598@functools.total_ordering
Nick Coghlandc9b2552012-05-20 21:01:57 +1000599class _BaseNetwork(_IPAddressBase):
600
Nick Coghlan51c30672012-05-27 00:25:58 +1000601 """A generic IP network object.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000602
603 This IP class contains the version independent methods which are
604 used by networks.
605
606 """
Nick Coghlandc9b2552012-05-20 21:01:57 +1000607 def __init__(self, address):
608 self._cache = {}
609
Nick Coghlandc9b2552012-05-20 21:01:57 +1000610 def __repr__(self):
611 return '%s(%r)' % (self.__class__.__name__, str(self))
612
Hynek Schlawack454a74d2012-06-04 18:14:02 +0200613 def __str__(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000614 return '%s/%d' % (self.network_address, self.prefixlen)
Hynek Schlawack454a74d2012-06-04 18:14:02 +0200615
Nick Coghlandc9b2552012-05-20 21:01:57 +1000616 def hosts(self):
617 """Generate Iterator over usable hosts in a network.
618
Sandro Tosib95c6342012-05-23 23:17:22 +0200619 This is like __iter__ except it doesn't return the network
620 or broadcast addresses.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000621
622 """
Nick Coghlan7319f692012-07-07 21:43:30 +1000623 network = int(self.network_address)
624 broadcast = int(self.broadcast_address)
625 for x in range(network + 1, broadcast):
626 yield self._address_class(x)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000627
628 def __iter__(self):
Nick Coghlan7319f692012-07-07 21:43:30 +1000629 network = int(self.network_address)
630 broadcast = int(self.broadcast_address)
631 for x in range(network, broadcast + 1):
632 yield self._address_class(x)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000633
634 def __getitem__(self, n):
635 network = int(self.network_address)
636 broadcast = int(self.broadcast_address)
637 if n >= 0:
638 if network + n > broadcast:
Berker Peksag28dc1182016-06-11 22:30:05 +0300639 raise IndexError('address out of range')
Nick Coghlan51c30672012-05-27 00:25:58 +1000640 return self._address_class(network + n)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000641 else:
642 n += 1
643 if broadcast + n < network:
Berker Peksag28dc1182016-06-11 22:30:05 +0300644 raise IndexError('address out of range')
Nick Coghlan51c30672012-05-27 00:25:58 +1000645 return self._address_class(broadcast + n)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000646
647 def __lt__(self, other):
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200648 if not isinstance(other, _BaseNetwork):
649 return NotImplemented
Nick Coghlandc9b2552012-05-20 21:01:57 +1000650 if self._version != other._version:
651 raise TypeError('%s and %s are not of the same version' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000652 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000653 if self.network_address != other.network_address:
654 return self.network_address < other.network_address
655 if self.netmask != other.netmask:
656 return self.netmask < other.netmask
657 return False
658
Nick Coghlandc9b2552012-05-20 21:01:57 +1000659 def __eq__(self, other):
Nick Coghlan9a9c28c2012-07-07 23:05:59 +1000660 try:
661 return (self._version == other._version and
662 self.network_address == other.network_address and
663 int(self.netmask) == int(other.netmask))
664 except AttributeError:
665 return NotImplemented
Nick Coghlandc9b2552012-05-20 21:01:57 +1000666
Nick Coghlandc9b2552012-05-20 21:01:57 +1000667 def __hash__(self):
668 return hash(int(self.network_address) ^ int(self.netmask))
669
670 def __contains__(self, other):
671 # always false if one is v4 and the other is v6.
672 if self._version != other._version:
673 return False
674 # dealing with another network.
675 if isinstance(other, _BaseNetwork):
676 return False
677 # dealing with another address
678 else:
679 # address
680 return (int(self.network_address) <= int(other._ip) <=
681 int(self.broadcast_address))
682
683 def overlaps(self, other):
684 """Tell if self is partly contained in other."""
685 return self.network_address in other or (
686 self.broadcast_address in other or (
687 other.network_address in self or (
688 other.broadcast_address in self)))
689
690 @property
691 def broadcast_address(self):
692 x = self._cache.get('broadcast_address')
693 if x is None:
Nick Coghlan51c30672012-05-27 00:25:58 +1000694 x = self._address_class(int(self.network_address) |
695 int(self.hostmask))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000696 self._cache['broadcast_address'] = x
697 return x
698
699 @property
700 def hostmask(self):
701 x = self._cache.get('hostmask')
702 if x is None:
Nick Coghlan51c30672012-05-27 00:25:58 +1000703 x = self._address_class(int(self.netmask) ^ self._ALL_ONES)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000704 self._cache['hostmask'] = x
705 return x
706
707 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +1000708 def with_prefixlen(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000709 return '%s/%d' % (self.network_address, self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000710
711 @property
712 def with_netmask(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000713 return '%s/%s' % (self.network_address, self.netmask)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000714
715 @property
716 def with_hostmask(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000717 return '%s/%s' % (self.network_address, self.hostmask)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000718
719 @property
720 def num_addresses(self):
721 """Number of hosts in the current subnet."""
722 return int(self.broadcast_address) - int(self.network_address) + 1
723
724 @property
Nick Coghlan51c30672012-05-27 00:25:58 +1000725 def _address_class(self):
Nick Coghland9722652012-06-17 16:33:00 +1000726 # Returning bare address objects (rather than interfaces) allows for
727 # more consistent behaviour across the network address, broadcast
728 # address and individual host addresses.
729 msg = '%200s has no associated address class' % (type(self),)
730 raise NotImplementedError(msg)
Nick Coghlan51c30672012-05-27 00:25:58 +1000731
732 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +1000733 def prefixlen(self):
734 return self._prefixlen
735
736 def address_exclude(self, other):
737 """Remove an address from a larger block.
738
739 For example:
740
741 addr1 = ip_network('192.0.2.0/28')
742 addr2 = ip_network('192.0.2.1/32')
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +0200743 list(addr1.address_exclude(addr2)) =
Nick Coghlandc9b2552012-05-20 21:01:57 +1000744 [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'),
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +0200745 IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')]
Nick Coghlandc9b2552012-05-20 21:01:57 +1000746
747 or IPv6:
748
749 addr1 = ip_network('2001:db8::1/32')
750 addr2 = ip_network('2001:db8::1/128')
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +0200751 list(addr1.address_exclude(addr2)) =
Nick Coghlandc9b2552012-05-20 21:01:57 +1000752 [ip_network('2001:db8::1/128'),
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +0200753 ip_network('2001:db8::2/127'),
754 ip_network('2001:db8::4/126'),
755 ip_network('2001:db8::8/125'),
756 ...
757 ip_network('2001:db8:8000::/33')]
Nick Coghlandc9b2552012-05-20 21:01:57 +1000758
759 Args:
760 other: An IPv4Network or IPv6Network object of the same type.
761
762 Returns:
Ezio Melotti3f5db392013-01-27 06:20:14 +0200763 An iterator of the IPv(4|6)Network objects which is self
Nick Coghlandc9b2552012-05-20 21:01:57 +1000764 minus other.
765
766 Raises:
Ezio Melotti30b9d5d2013-08-17 15:50:46 +0300767 TypeError: If self and other are of differing address
Nick Coghlandc9b2552012-05-20 21:01:57 +1000768 versions, or if other is not a network object.
769 ValueError: If other is not completely contained by self.
770
771 """
772 if not self._version == other._version:
773 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000774 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000775
776 if not isinstance(other, _BaseNetwork):
Nick Coghlan912238e2012-07-07 13:34:50 +1000777 raise TypeError("%s is not a network object" % other)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000778
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400779 if not other.subnet_of(self):
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200780 raise ValueError('%s not contained in %s' % (other, self))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000781 if other == self:
Raymond Hettingerbb6c0aa2014-11-22 22:14:41 -0800782 return
Nick Coghlandc9b2552012-05-20 21:01:57 +1000783
Nick Coghlandc9b2552012-05-20 21:01:57 +1000784 # Make sure we're comparing the network of other.
Nick Coghlan912238e2012-07-07 13:34:50 +1000785 other = other.__class__('%s/%s' % (other.network_address,
786 other.prefixlen))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000787
788 s1, s2 = self.subnets()
789 while s1 != other and s2 != other:
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400790 if other.subnet_of(s1):
Nick Coghlandc9b2552012-05-20 21:01:57 +1000791 yield s2
792 s1, s2 = s1.subnets()
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400793 elif other.subnet_of(s2):
Nick Coghlandc9b2552012-05-20 21:01:57 +1000794 yield s1
795 s1, s2 = s2.subnets()
796 else:
797 # If we got here, there's a bug somewhere.
798 raise AssertionError('Error performing exclusion: '
799 's1: %s s2: %s other: %s' %
Nick Coghlan912238e2012-07-07 13:34:50 +1000800 (s1, s2, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000801 if s1 == other:
802 yield s2
803 elif s2 == other:
804 yield s1
805 else:
806 # If we got here, there's a bug somewhere.
807 raise AssertionError('Error performing exclusion: '
808 's1: %s s2: %s other: %s' %
Nick Coghlan912238e2012-07-07 13:34:50 +1000809 (s1, s2, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000810
811 def compare_networks(self, other):
812 """Compare two IP objects.
813
814 This is only concerned about the comparison of the integer
815 representation of the network addresses. This means that the
816 host bits aren't considered at all in this method. If you want
817 to compare host bits, you can easily enough do a
818 'HostA._ip < HostB._ip'
819
820 Args:
821 other: An IP object.
822
823 Returns:
824 If the IP versions of self and other are the same, returns:
825
826 -1 if self < other:
827 eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25')
828 IPv6Network('2001:db8::1000/124') <
829 IPv6Network('2001:db8::2000/124')
830 0 if self == other
831 eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24')
832 IPv6Network('2001:db8::1000/124') ==
833 IPv6Network('2001:db8::1000/124')
834 1 if self > other
835 eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25')
836 IPv6Network('2001:db8::2000/124') >
837 IPv6Network('2001:db8::1000/124')
838
839 Raises:
840 TypeError if the IP versions are different.
841
842 """
843 # does this need to raise a ValueError?
844 if self._version != other._version:
845 raise TypeError('%s and %s are not of the same type' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000846 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000847 # self._version == other._version below here:
848 if self.network_address < other.network_address:
849 return -1
850 if self.network_address > other.network_address:
851 return 1
852 # self.network_address == other.network_address below here:
853 if self.netmask < other.netmask:
854 return -1
855 if self.netmask > other.netmask:
856 return 1
857 return 0
858
859 def _get_networks_key(self):
860 """Network-only key function.
861
862 Returns an object that identifies this address' network and
863 netmask. This function is a suitable "key" argument for sorted()
864 and list.sort().
865
866 """
867 return (self._version, self.network_address, self.netmask)
868
869 def subnets(self, prefixlen_diff=1, new_prefix=None):
870 """The subnets which join to make the current subnet.
871
872 In the case that self contains only one IP
873 (self._prefixlen == 32 for IPv4 or self._prefixlen == 128
874 for IPv6), yield an iterator with just ourself.
875
876 Args:
877 prefixlen_diff: An integer, the amount the prefix length
878 should be increased by. This should not be set if
879 new_prefix is also set.
880 new_prefix: The desired new prefix length. This must be a
881 larger number (smaller prefix) than the existing prefix.
882 This should not be set if prefixlen_diff is also set.
883
884 Returns:
885 An iterator of IPv(4|6) objects.
886
887 Raises:
888 ValueError: The prefixlen_diff is too small or too large.
889 OR
890 prefixlen_diff and new_prefix are both set or new_prefix
891 is a smaller number than the current prefix (smaller
892 number means a larger network)
893
894 """
895 if self._prefixlen == self._max_prefixlen:
896 yield self
897 return
898
899 if new_prefix is not None:
900 if new_prefix < self._prefixlen:
901 raise ValueError('new prefix must be longer')
902 if prefixlen_diff != 1:
903 raise ValueError('cannot set prefixlen_diff and new_prefix')
904 prefixlen_diff = new_prefix - self._prefixlen
905
906 if prefixlen_diff < 0:
907 raise ValueError('prefix length diff must be > 0')
908 new_prefixlen = self._prefixlen + prefixlen_diff
909
Nick Coghlan932346f2014-02-08 23:17:36 +1000910 if new_prefixlen > self._max_prefixlen:
Nick Coghlandc9b2552012-05-20 21:01:57 +1000911 raise ValueError(
912 'prefix length diff %d is invalid for netblock %s' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000913 new_prefixlen, self))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000914
Antoine Pitrou824db302014-05-15 20:21:48 +0200915 start = int(self.network_address)
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +0200916 end = int(self.broadcast_address) + 1
Antoine Pitrou824db302014-05-15 20:21:48 +0200917 step = (int(self.hostmask) + 1) >> prefixlen_diff
918 for new_addr in range(start, end, step):
919 current = self.__class__((new_addr, new_prefixlen))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000920 yield current
921
Nick Coghlandc9b2552012-05-20 21:01:57 +1000922 def supernet(self, prefixlen_diff=1, new_prefix=None):
923 """The supernet containing the current network.
924
925 Args:
926 prefixlen_diff: An integer, the amount the prefix length of
927 the network should be decreased by. For example, given a
928 /24 network and a prefixlen_diff of 3, a supernet with a
929 /21 netmask is returned.
930
931 Returns:
932 An IPv4 network object.
933
934 Raises:
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200935 ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have
936 a negative prefix length.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000937 OR
938 If prefixlen_diff and new_prefix are both set or new_prefix is a
939 larger number than the current prefix (larger number means a
940 smaller network)
941
942 """
943 if self._prefixlen == 0:
944 return self
945
946 if new_prefix is not None:
947 if new_prefix > self._prefixlen:
948 raise ValueError('new prefix must be shorter')
949 if prefixlen_diff != 1:
950 raise ValueError('cannot set prefixlen_diff and new_prefix')
951 prefixlen_diff = self._prefixlen - new_prefix
952
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200953 new_prefixlen = self.prefixlen - prefixlen_diff
954 if new_prefixlen < 0:
Nick Coghlandc9b2552012-05-20 21:01:57 +1000955 raise ValueError(
956 'current prefixlen is %d, cannot have a prefixlen_diff of %d' %
957 (self.prefixlen, prefixlen_diff))
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200958 return self.__class__((
959 int(self.network_address) & (int(self.netmask) << prefixlen_diff),
960 new_prefixlen
961 ))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000962
Nick Coghlan730f67f2012-08-05 22:02:18 +1000963 @property
964 def is_multicast(self):
965 """Test if the address is reserved for multicast use.
966
967 Returns:
968 A boolean, True if the address is a multicast address.
969 See RFC 2373 2.7 for details.
970
971 """
972 return (self.network_address.is_multicast and
973 self.broadcast_address.is_multicast)
974
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400975 @staticmethod
976 def _is_subnet_of(a, b):
977 try:
978 # Always false if one is v4 and the other is v6.
979 if a._version != b._version:
980 raise TypeError(f"{a} and {b} are not of the same version")
981 return (b.network_address <= a.network_address and
982 b.broadcast_address >= a.broadcast_address)
983 except AttributeError:
984 raise TypeError(f"Unable to test subnet containment "
985 f"between {a} and {b}")
986
987 def subnet_of(self, other):
988 """Return True if this network is a subnet of other."""
989 return self._is_subnet_of(self, other)
990
991 def supernet_of(self, other):
992 """Return True if this network is a supernet of other."""
993 return self._is_subnet_of(other, self)
994
Nick Coghlan730f67f2012-08-05 22:02:18 +1000995 @property
996 def is_reserved(self):
997 """Test if the address is otherwise IETF reserved.
998
999 Returns:
1000 A boolean, True if the address is within one of the
1001 reserved IPv6 Network ranges.
1002
1003 """
1004 return (self.network_address.is_reserved and
1005 self.broadcast_address.is_reserved)
1006
1007 @property
1008 def is_link_local(self):
1009 """Test if the address is reserved for link-local.
1010
1011 Returns:
1012 A boolean, True if the address is reserved per RFC 4291.
1013
1014 """
1015 return (self.network_address.is_link_local and
1016 self.broadcast_address.is_link_local)
1017
1018 @property
1019 def is_private(self):
1020 """Test if this address is allocated for private networks.
1021
1022 Returns:
Peter Moody22c31762013-10-21 13:58:06 -07001023 A boolean, True if the address is reserved per
1024 iana-ipv4-special-registry or iana-ipv6-special-registry.
Nick Coghlan730f67f2012-08-05 22:02:18 +10001025
1026 """
1027 return (self.network_address.is_private and
1028 self.broadcast_address.is_private)
1029
1030 @property
Peter Moody22c31762013-10-21 13:58:06 -07001031 def is_global(self):
Peter Moodybe9c1b12013-10-22 12:36:21 -07001032 """Test if this address is allocated for public networks.
Peter Moody22c31762013-10-21 13:58:06 -07001033
1034 Returns:
1035 A boolean, True if the address is not reserved per
1036 iana-ipv4-special-registry or iana-ipv6-special-registry.
1037
1038 """
1039 return not self.is_private
1040
1041 @property
Nick Coghlan730f67f2012-08-05 22:02:18 +10001042 def is_unspecified(self):
1043 """Test if the address is unspecified.
1044
1045 Returns:
1046 A boolean, True if this is the unspecified address as defined in
1047 RFC 2373 2.5.2.
1048
1049 """
1050 return (self.network_address.is_unspecified and
1051 self.broadcast_address.is_unspecified)
1052
1053 @property
1054 def is_loopback(self):
1055 """Test if the address is a loopback address.
1056
1057 Returns:
1058 A boolean, True if the address is a loopback address as defined in
1059 RFC 2373 2.5.3.
1060
1061 """
1062 return (self.network_address.is_loopback and
1063 self.broadcast_address.is_loopback)
1064
Nick Coghlandc9b2552012-05-20 21:01:57 +10001065
Hynek Schlawackc4b78a32012-06-01 11:48:32 +02001066class _BaseV4:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001067
1068 """Base IPv4 object.
1069
1070 The following methods are used by IPv4 objects in both single IP
1071 addresses and networks.
1072
1073 """
1074
Serhiy Storchaka88f64f32015-03-07 20:08:34 +02001075 __slots__ = ()
1076 _version = 4
Nick Coghlandc9b2552012-05-20 21:01:57 +10001077 # Equivalent to 255.255.255.255 or 32 bits of 1's.
1078 _ALL_ONES = (2**IPV4LENGTH) - 1
Nick Coghlandc9b2552012-05-20 21:01:57 +10001079
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001080 # the valid octets for host and netmasks. only useful for IPv4.
Raymond Hettingerdf1b6992014-11-09 15:56:33 -08001081 _valid_mask_octets = frozenset({255, 254, 252, 248, 240, 224, 192, 128, 0})
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001082
Antoine Pitrou45aba182014-05-15 20:18:41 +02001083 _max_prefixlen = IPV4LENGTH
1084 # There are only a handful of valid v4 netmasks, so we cache them all
1085 # when constructed (see _make_netmask()).
1086 _netmask_cache = {}
1087
Nick Coghlandc9b2552012-05-20 21:01:57 +10001088 def _explode_shorthand_ip_string(self):
1089 return str(self)
1090
Antoine Pitrou45aba182014-05-15 20:18:41 +02001091 @classmethod
1092 def _make_netmask(cls, arg):
1093 """Make a (netmask, prefix_len) tuple from the given argument.
1094
1095 Argument can be:
1096 - an integer (the prefix length)
1097 - a string representing the prefix length (e.g. "24")
1098 - a string representing the prefix netmask (e.g. "255.255.255.0")
1099 """
1100 if arg not in cls._netmask_cache:
1101 if isinstance(arg, int):
1102 prefixlen = arg
1103 else:
1104 try:
1105 # Check for a netmask in prefix length form
1106 prefixlen = cls._prefix_from_prefix_string(arg)
1107 except NetmaskValueError:
1108 # Check for a netmask or hostmask in dotted-quad form.
1109 # This may raise NetmaskValueError.
1110 prefixlen = cls._prefix_from_ip_string(arg)
1111 netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen))
1112 cls._netmask_cache[arg] = netmask, prefixlen
1113 return cls._netmask_cache[arg]
1114
1115 @classmethod
1116 def _ip_int_from_string(cls, ip_str):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001117 """Turn the given IP string into an integer for comparison.
1118
1119 Args:
1120 ip_str: A string, the IP ip_str.
1121
1122 Returns:
1123 The IP ip_str as an integer.
1124
1125 Raises:
1126 AddressValueError: if ip_str isn't a valid IPv4 Address.
1127
1128 """
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001129 if not ip_str:
1130 raise AddressValueError('Address cannot be empty')
1131
Nick Coghlandc9b2552012-05-20 21:01:57 +10001132 octets = ip_str.split('.')
1133 if len(octets) != 4:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001134 raise AddressValueError("Expected 4 octets in %r" % ip_str)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001135
Nick Coghlan7319f692012-07-07 21:43:30 +10001136 try:
Antoine Pitrou45aba182014-05-15 20:18:41 +02001137 return int.from_bytes(map(cls._parse_octet, octets), 'big')
Nick Coghlan7319f692012-07-07 21:43:30 +10001138 except ValueError as exc:
1139 raise AddressValueError("%s in %r" % (exc, ip_str)) from None
Nick Coghlandc9b2552012-05-20 21:01:57 +10001140
Antoine Pitrou45aba182014-05-15 20:18:41 +02001141 @classmethod
1142 def _parse_octet(cls, octet_str):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001143 """Convert a decimal octet into an integer.
1144
1145 Args:
1146 octet_str: A string, the number to parse.
1147
1148 Returns:
1149 The octet as an integer.
1150
1151 Raises:
1152 ValueError: if the octet isn't strictly a decimal from [0..255].
1153
1154 """
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001155 if not octet_str:
1156 raise ValueError("Empty octet not permitted")
Nick Coghlandc9b2552012-05-20 21:01:57 +10001157 # Whitelist the characters, since int() allows a lot of bizarre stuff.
INADA Naoki58a10962018-02-23 20:02:41 +09001158 if not (octet_str.isascii() and octet_str.isdigit()):
Nick Coghlan07c4e332012-07-08 23:06:45 +10001159 msg = "Only decimal digits permitted in %r"
1160 raise ValueError(msg % octet_str)
1161 # We do the length check second, since the invalid character error
1162 # is likely to be more informative for the user
1163 if len(octet_str) > 3:
1164 msg = "At most 3 characters permitted in %r"
1165 raise ValueError(msg % octet_str)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001166 # Convert to integer (we know digits are legal)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001167 octet_int = int(octet_str, 10)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001168 # Any octets that look like they *might* be written in octal,
1169 # and which don't look exactly the same in both octal and
1170 # decimal are rejected as ambiguous
1171 if octet_int > 7 and octet_str[0] == '0':
Nick Coghlan07c4e332012-07-08 23:06:45 +10001172 msg = "Ambiguous (octal/decimal) value in %r not permitted"
1173 raise ValueError(msg % octet_str)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001174 if octet_int > 255:
Nick Coghlanb582ecc2012-07-07 22:15:22 +10001175 raise ValueError("Octet %d (> 255) not permitted" % octet_int)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001176 return octet_int
1177
Antoine Pitrou45aba182014-05-15 20:18:41 +02001178 @classmethod
1179 def _string_from_ip_int(cls, ip_int):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001180 """Turns a 32-bit integer into dotted decimal notation.
1181
1182 Args:
1183 ip_int: An integer, the IP address.
1184
1185 Returns:
1186 The IP address as a string in dotted decimal notation.
1187
1188 """
Nick Coghlan7319f692012-07-07 21:43:30 +10001189 return '.'.join(map(str, ip_int.to_bytes(4, 'big')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001190
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001191 def _is_valid_netmask(self, netmask):
1192 """Verify that the netmask is valid.
1193
1194 Args:
1195 netmask: A string, either a prefix or dotted decimal
1196 netmask.
1197
1198 Returns:
1199 A boolean, True if the prefix represents a valid IPv4
1200 netmask.
1201
1202 """
1203 mask = netmask.split('.')
1204 if len(mask) == 4:
Nick Coghlan7319f692012-07-07 21:43:30 +10001205 try:
1206 for x in mask:
1207 if int(x) not in self._valid_mask_octets:
1208 return False
1209 except ValueError:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001210 # Found something that isn't an integer or isn't valid
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001211 return False
Nick Coghlan7319f692012-07-07 21:43:30 +10001212 for idx, y in enumerate(mask):
1213 if idx > 0 and y > mask[idx - 1]:
1214 return False
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001215 return True
1216 try:
1217 netmask = int(netmask)
1218 except ValueError:
1219 return False
1220 return 0 <= netmask <= self._max_prefixlen
1221
1222 def _is_hostmask(self, ip_str):
1223 """Test if the IP string is a hostmask (rather than a netmask).
1224
1225 Args:
1226 ip_str: A string, the potential hostmask.
1227
1228 Returns:
1229 A boolean, True if the IP string is a hostmask.
1230
1231 """
1232 bits = ip_str.split('.')
1233 try:
Nick Coghlan7319f692012-07-07 21:43:30 +10001234 parts = [x for x in map(int, bits) if x in self._valid_mask_octets]
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001235 except ValueError:
1236 return False
1237 if len(parts) != len(bits):
1238 return False
1239 if parts[0] < parts[-1]:
1240 return True
1241 return False
1242
Eric V. Smithebdaaf42014-04-14 12:58:07 -04001243 def _reverse_pointer(self):
1244 """Return the reverse DNS pointer name for the IPv4 address.
1245
1246 This implements the method described in RFC1035 3.5.
1247
1248 """
1249 reverse_octets = str(self).split('.')[::-1]
1250 return '.'.join(reverse_octets) + '.in-addr.arpa'
1251
Nick Coghlandc9b2552012-05-20 21:01:57 +10001252 @property
1253 def max_prefixlen(self):
1254 return self._max_prefixlen
1255
1256 @property
1257 def version(self):
1258 return self._version
1259
Nick Coghlandc9b2552012-05-20 21:01:57 +10001260
1261class IPv4Address(_BaseV4, _BaseAddress):
1262
1263 """Represent and manipulate single IPv4 Addresses."""
1264
Serhiy Storchaka88f64f32015-03-07 20:08:34 +02001265 __slots__ = ('_ip', '__weakref__')
1266
Nick Coghlandc9b2552012-05-20 21:01:57 +10001267 def __init__(self, address):
1268
1269 """
1270 Args:
1271 address: A string or integer representing the IP
1272
1273 Additionally, an integer can be passed, so
1274 IPv4Address('192.0.2.1') == IPv4Address(3221225985).
1275 or, more generally
1276 IPv4Address(int(IPv4Address('192.0.2.1'))) ==
1277 IPv4Address('192.0.2.1')
1278
1279 Raises:
Sandro Tosib4386d32012-06-02 17:14:22 +02001280 AddressValueError: If ipaddress isn't a valid IPv4 address.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001281
1282 """
Nick Coghlandc9b2552012-05-20 21:01:57 +10001283 # Efficient constructor from integer.
1284 if isinstance(address, int):
Nick Coghlan297b1432012-07-08 17:11:04 +10001285 self._check_int_address(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001286 self._ip = address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001287 return
1288
1289 # Constructing from a packed address
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001290 if isinstance(address, bytes):
Nick Coghlan297b1432012-07-08 17:11:04 +10001291 self._check_packed_address(address, 4)
Nick Coghlandb7920b2012-08-20 10:19:12 +10001292 self._ip = int.from_bytes(address, 'big')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001293 return
1294
1295 # Assume input argument to be string or any object representation
1296 # which converts into a formatted IP string.
1297 addr_str = str(address)
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +02001298 if '/' in addr_str:
1299 raise AddressValueError("Unexpected '/' in %r" % address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001300 self._ip = self._ip_int_from_string(addr_str)
1301
1302 @property
1303 def packed(self):
1304 """The binary representation of this address."""
1305 return v4_int_to_packed(self._ip)
1306
Nick Coghlan730f67f2012-08-05 22:02:18 +10001307 @property
1308 def is_reserved(self):
1309 """Test if the address is otherwise IETF reserved.
1310
1311 Returns:
1312 A boolean, True if the address is within the
1313 reserved IPv4 Network range.
1314
1315 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001316 return self in self._constants._reserved_network
Nick Coghlan730f67f2012-08-05 22:02:18 +10001317
1318 @property
Peter Moodybe9c1b12013-10-22 12:36:21 -07001319 @functools.lru_cache()
Nick Coghlan730f67f2012-08-05 22:02:18 +10001320 def is_private(self):
1321 """Test if this address is allocated for private networks.
1322
1323 Returns:
Peter Moody22c31762013-10-21 13:58:06 -07001324 A boolean, True if the address is reserved per
1325 iana-ipv4-special-registry.
Nick Coghlan730f67f2012-08-05 22:02:18 +10001326
1327 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001328 return any(self in net for net in self._constants._private_networks)
Nick Coghlan730f67f2012-08-05 22:02:18 +10001329
1330 @property
Berker Peksag742192a2016-06-11 22:11:47 +03001331 @functools.lru_cache()
1332 def is_global(self):
1333 return self not in self._constants._public_network and not self.is_private
1334
1335 @property
Nick Coghlan730f67f2012-08-05 22:02:18 +10001336 def is_multicast(self):
1337 """Test if the address is reserved for multicast use.
1338
1339 Returns:
1340 A boolean, True if the address is multicast.
1341 See RFC 3171 for details.
1342
1343 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001344 return self in self._constants._multicast_network
Nick Coghlan730f67f2012-08-05 22:02:18 +10001345
1346 @property
1347 def is_unspecified(self):
1348 """Test if the address is unspecified.
1349
1350 Returns:
1351 A boolean, True if this is the unspecified address as defined in
1352 RFC 5735 3.
1353
1354 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001355 return self == self._constants._unspecified_address
Nick Coghlan730f67f2012-08-05 22:02:18 +10001356
1357 @property
1358 def is_loopback(self):
1359 """Test if the address is a loopback address.
1360
1361 Returns:
1362 A boolean, True if the address is a loopback per RFC 3330.
1363
1364 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001365 return self in self._constants._loopback_network
Nick Coghlan730f67f2012-08-05 22:02:18 +10001366
1367 @property
1368 def is_link_local(self):
1369 """Test if the address is reserved for link-local.
1370
1371 Returns:
1372 A boolean, True if the address is link-local per RFC 3927.
1373
1374 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001375 return self in self._constants._linklocal_network
Nick Coghlan730f67f2012-08-05 22:02:18 +10001376
Nick Coghlandc9b2552012-05-20 21:01:57 +10001377
1378class IPv4Interface(IPv4Address):
1379
Nick Coghlandc9b2552012-05-20 21:01:57 +10001380 def __init__(self, address):
1381 if isinstance(address, (bytes, int)):
1382 IPv4Address.__init__(self, address)
1383 self.network = IPv4Network(self._ip)
1384 self._prefixlen = self._max_prefixlen
1385 return
1386
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001387 if isinstance(address, tuple):
1388 IPv4Address.__init__(self, address[0])
1389 if len(address) > 1:
1390 self._prefixlen = int(address[1])
1391 else:
1392 self._prefixlen = self._max_prefixlen
1393
1394 self.network = IPv4Network(address, strict=False)
1395 self.netmask = self.network.netmask
1396 self.hostmask = self.network.hostmask
1397 return
1398
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001399 addr = _split_optional_netmask(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001400 IPv4Address.__init__(self, addr[0])
1401
1402 self.network = IPv4Network(address, strict=False)
1403 self._prefixlen = self.network._prefixlen
1404
1405 self.netmask = self.network.netmask
1406 self.hostmask = self.network.hostmask
1407
Nick Coghlandc9b2552012-05-20 21:01:57 +10001408 def __str__(self):
1409 return '%s/%d' % (self._string_from_ip_int(self._ip),
1410 self.network.prefixlen)
1411
1412 def __eq__(self, other):
Nick Coghlan3008ec02012-07-08 00:45:33 +10001413 address_equal = IPv4Address.__eq__(self, other)
1414 if not address_equal or address_equal is NotImplemented:
1415 return address_equal
Nick Coghlandc9b2552012-05-20 21:01:57 +10001416 try:
Nick Coghlan3008ec02012-07-08 00:45:33 +10001417 return self.network == other.network
Nick Coghlandc9b2552012-05-20 21:01:57 +10001418 except AttributeError:
Nick Coghlan3008ec02012-07-08 00:45:33 +10001419 # An interface with an associated network is NOT the
1420 # same as an unassociated address. That's why the hash
1421 # takes the extra info into account.
1422 return False
1423
1424 def __lt__(self, other):
1425 address_less = IPv4Address.__lt__(self, other)
1426 if address_less is NotImplemented:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001427 return NotImplemented
Nick Coghlan3008ec02012-07-08 00:45:33 +10001428 try:
s-sanjay7bd8d3e2017-03-31 23:09:53 -07001429 return (self.network < other.network or
1430 self.network == other.network and address_less)
Nick Coghlan3008ec02012-07-08 00:45:33 +10001431 except AttributeError:
1432 # We *do* allow addresses and interfaces to be sorted. The
1433 # unassociated address is considered less than all interfaces.
1434 return False
Nick Coghlandc9b2552012-05-20 21:01:57 +10001435
1436 def __hash__(self):
1437 return self._ip ^ self._prefixlen ^ int(self.network.network_address)
1438
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +02001439 __reduce__ = _IPAddressBase.__reduce__
1440
Nick Coghlandc9b2552012-05-20 21:01:57 +10001441 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +10001442 def ip(self):
1443 return IPv4Address(self._ip)
1444
1445 @property
1446 def with_prefixlen(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10001447 return '%s/%s' % (self._string_from_ip_int(self._ip),
1448 self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001449
1450 @property
1451 def with_netmask(self):
1452 return '%s/%s' % (self._string_from_ip_int(self._ip),
1453 self.netmask)
Hynek Schlawack072b1e12012-05-26 12:04:56 +02001454
Nick Coghlandc9b2552012-05-20 21:01:57 +10001455 @property
1456 def with_hostmask(self):
1457 return '%s/%s' % (self._string_from_ip_int(self._ip),
1458 self.hostmask)
1459
1460
1461class IPv4Network(_BaseV4, _BaseNetwork):
1462
1463 """This class represents and manipulates 32-bit IPv4 network + addresses..
1464
1465 Attributes: [examples for IPv4Network('192.0.2.0/27')]
1466 .network_address: IPv4Address('192.0.2.0')
1467 .hostmask: IPv4Address('0.0.0.31')
1468 .broadcast_address: IPv4Address('192.0.2.32')
1469 .netmask: IPv4Address('255.255.255.224')
1470 .prefixlen: 27
1471
1472 """
Nick Coghlan51c30672012-05-27 00:25:58 +10001473 # Class to use when creating address objects
Nick Coghlan51c30672012-05-27 00:25:58 +10001474 _address_class = IPv4Address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001475
Nick Coghlandc9b2552012-05-20 21:01:57 +10001476 def __init__(self, address, strict=True):
1477
1478 """Instantiate a new IPv4 network object.
1479
1480 Args:
1481 address: A string or integer representing the IP [& network].
1482 '192.0.2.0/24'
1483 '192.0.2.0/255.255.255.0'
1484 '192.0.0.2/0.0.0.255'
1485 are all functionally the same in IPv4. Similarly,
1486 '192.0.2.1'
1487 '192.0.2.1/255.255.255.255'
1488 '192.0.2.1/32'
Ezio Melotti30b9d5d2013-08-17 15:50:46 +03001489 are also functionally equivalent. That is to say, failing to
Nick Coghlandc9b2552012-05-20 21:01:57 +10001490 provide a subnetmask will create an object with a mask of /32.
1491
1492 If the mask (portion after the / in the argument) is given in
1493 dotted quad form, it is treated as a netmask if it starts with a
1494 non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it
1495 starts with a zero field (e.g. 0.255.255.255 == /8), with the
1496 single exception of an all-zero mask which is treated as a
1497 netmask == /0. If no mask is given, a default of /32 is used.
1498
1499 Additionally, an integer can be passed, so
1500 IPv4Network('192.0.2.1') == IPv4Network(3221225985)
1501 or, more generally
1502 IPv4Interface(int(IPv4Interface('192.0.2.1'))) ==
1503 IPv4Interface('192.0.2.1')
1504
1505 Raises:
Sandro Tosib4386d32012-06-02 17:14:22 +02001506 AddressValueError: If ipaddress isn't a valid IPv4 address.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001507 NetmaskValueError: If the netmask isn't valid for
1508 an IPv4 address.
Sandro Tosib4386d32012-06-02 17:14:22 +02001509 ValueError: If strict is True and a network address is not
Nick Coghlandc9b2552012-05-20 21:01:57 +10001510 supplied.
1511
1512 """
Nick Coghlandc9b2552012-05-20 21:01:57 +10001513 _BaseNetwork.__init__(self, address)
1514
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001515 # Constructing from a packed address or integer
1516 if isinstance(address, (int, bytes)):
Nick Coghlan297b1432012-07-08 17:11:04 +10001517 self.network_address = IPv4Address(address)
Antoine Pitrou45aba182014-05-15 20:18:41 +02001518 self.netmask, self._prefixlen = self._make_netmask(self._max_prefixlen)
1519 #fixme: address/network test here.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001520 return
1521
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001522 if isinstance(address, tuple):
1523 if len(address) > 1:
Antoine Pitrou45aba182014-05-15 20:18:41 +02001524 arg = address[1]
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001525 else:
Antoine Pitrou45aba182014-05-15 20:18:41 +02001526 # We weren't given an address[1]
1527 arg = self._max_prefixlen
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001528 self.network_address = IPv4Address(address[0])
Antoine Pitrou45aba182014-05-15 20:18:41 +02001529 self.netmask, self._prefixlen = self._make_netmask(arg)
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001530 packed = int(self.network_address)
1531 if packed & int(self.netmask) != packed:
1532 if strict:
1533 raise ValueError('%s has host bits set' % self)
1534 else:
1535 self.network_address = IPv4Address(packed &
1536 int(self.netmask))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001537 return
1538
1539 # Assume input argument to be string or any object representation
1540 # which converts into a formatted IP prefix string.
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001541 addr = _split_optional_netmask(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001542 self.network_address = IPv4Address(self._ip_int_from_string(addr[0]))
1543
Nick Coghlandc9b2552012-05-20 21:01:57 +10001544 if len(addr) == 2:
Antoine Pitrou45aba182014-05-15 20:18:41 +02001545 arg = addr[1]
Nick Coghlandc9b2552012-05-20 21:01:57 +10001546 else:
Antoine Pitrou45aba182014-05-15 20:18:41 +02001547 arg = self._max_prefixlen
1548 self.netmask, self._prefixlen = self._make_netmask(arg)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001549
1550 if strict:
1551 if (IPv4Address(int(self.network_address) & int(self.netmask)) !=
1552 self.network_address):
1553 raise ValueError('%s has host bits set' % self)
1554 self.network_address = IPv4Address(int(self.network_address) &
1555 int(self.netmask))
1556
1557 if self._prefixlen == (self._max_prefixlen - 1):
1558 self.hosts = self.__iter__
1559
Peter Moodye5019d52013-10-24 09:47:10 -07001560 @property
1561 @functools.lru_cache()
1562 def is_global(self):
1563 """Test if this address is allocated for public networks.
1564
1565 Returns:
1566 A boolean, True if the address is not reserved per
1567 iana-ipv4-special-registry.
1568
1569 """
1570 return (not (self.network_address in IPv4Network('100.64.0.0/10') and
1571 self.broadcast_address in IPv4Network('100.64.0.0/10')) and
1572 not self.is_private)
1573
1574
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001575class _IPv4Constants:
1576 _linklocal_network = IPv4Network('169.254.0.0/16')
Antoine Pitrouf573ce92014-05-23 23:12:24 +02001577
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001578 _loopback_network = IPv4Network('127.0.0.0/8')
Antoine Pitrouf573ce92014-05-23 23:12:24 +02001579
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001580 _multicast_network = IPv4Network('224.0.0.0/4')
Antoine Pitrouf573ce92014-05-23 23:12:24 +02001581
Berker Peksag742192a2016-06-11 22:11:47 +03001582 _public_network = IPv4Network('100.64.0.0/10')
1583
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001584 _private_networks = [
1585 IPv4Network('0.0.0.0/8'),
1586 IPv4Network('10.0.0.0/8'),
1587 IPv4Network('127.0.0.0/8'),
1588 IPv4Network('169.254.0.0/16'),
1589 IPv4Network('172.16.0.0/12'),
1590 IPv4Network('192.0.0.0/29'),
1591 IPv4Network('192.0.0.170/31'),
1592 IPv4Network('192.0.2.0/24'),
1593 IPv4Network('192.168.0.0/16'),
1594 IPv4Network('198.18.0.0/15'),
1595 IPv4Network('198.51.100.0/24'),
1596 IPv4Network('203.0.113.0/24'),
1597 IPv4Network('240.0.0.0/4'),
1598 IPv4Network('255.255.255.255/32'),
1599 ]
Antoine Pitrouf573ce92014-05-23 23:12:24 +02001600
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001601 _reserved_network = IPv4Network('240.0.0.0/4')
Antoine Pitrouf573ce92014-05-23 23:12:24 +02001602
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001603 _unspecified_address = IPv4Address('0.0.0.0')
1604
1605
1606IPv4Address._constants = _IPv4Constants
Antoine Pitrouf573ce92014-05-23 23:12:24 +02001607
Nick Coghlandc9b2552012-05-20 21:01:57 +10001608
Hynek Schlawackc4b78a32012-06-01 11:48:32 +02001609class _BaseV6:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001610
1611 """Base IPv6 object.
1612
1613 The following methods are used by IPv6 objects in both single IP
1614 addresses and networks.
1615
1616 """
1617
Serhiy Storchaka88f64f32015-03-07 20:08:34 +02001618 __slots__ = ()
1619 _version = 6
Nick Coghlandc9b2552012-05-20 21:01:57 +10001620 _ALL_ONES = (2**IPV6LENGTH) - 1
1621 _HEXTET_COUNT = 8
1622 _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef')
Antoine Pitrou45aba182014-05-15 20:18:41 +02001623 _max_prefixlen = IPV6LENGTH
1624
1625 # There are only a bunch of valid v6 netmasks, so we cache them all
1626 # when constructed (see _make_netmask()).
1627 _netmask_cache = {}
Nick Coghlandc9b2552012-05-20 21:01:57 +10001628
Antoine Pitrou45aba182014-05-15 20:18:41 +02001629 @classmethod
1630 def _make_netmask(cls, arg):
1631 """Make a (netmask, prefix_len) tuple from the given argument.
1632
1633 Argument can be:
1634 - an integer (the prefix length)
1635 - a string representing the prefix length (e.g. "24")
1636 - a string representing the prefix netmask (e.g. "255.255.255.0")
1637 """
1638 if arg not in cls._netmask_cache:
1639 if isinstance(arg, int):
1640 prefixlen = arg
1641 else:
1642 prefixlen = cls._prefix_from_prefix_string(arg)
1643 netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen))
1644 cls._netmask_cache[arg] = netmask, prefixlen
1645 return cls._netmask_cache[arg]
1646
1647 @classmethod
1648 def _ip_int_from_string(cls, ip_str):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001649 """Turn an IPv6 ip_str into an integer.
1650
1651 Args:
1652 ip_str: A string, the IPv6 ip_str.
1653
1654 Returns:
1655 An int, the IPv6 address
1656
1657 Raises:
1658 AddressValueError: if ip_str isn't a valid IPv6 Address.
1659
1660 """
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001661 if not ip_str:
1662 raise AddressValueError('Address cannot be empty')
1663
Nick Coghlandc9b2552012-05-20 21:01:57 +10001664 parts = ip_str.split(':')
1665
1666 # An IPv6 address needs at least 2 colons (3 parts).
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001667 _min_parts = 3
1668 if len(parts) < _min_parts:
1669 msg = "At least %d parts expected in %r" % (_min_parts, ip_str)
1670 raise AddressValueError(msg)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001671
1672 # If the address has an IPv4-style suffix, convert it to hexadecimal.
1673 if '.' in parts[-1]:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001674 try:
1675 ipv4_int = IPv4Address(parts.pop())._ip
1676 except AddressValueError as exc:
1677 raise AddressValueError("%s in %r" % (exc, ip_str)) from None
Nick Coghlandc9b2552012-05-20 21:01:57 +10001678 parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF))
1679 parts.append('%x' % (ipv4_int & 0xFFFF))
1680
1681 # An IPv6 address can't have more than 8 colons (9 parts).
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001682 # The extra colon comes from using the "::" notation for a single
1683 # leading or trailing zero part.
Antoine Pitrou45aba182014-05-15 20:18:41 +02001684 _max_parts = cls._HEXTET_COUNT + 1
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001685 if len(parts) > _max_parts:
1686 msg = "At most %d colons permitted in %r" % (_max_parts-1, ip_str)
1687 raise AddressValueError(msg)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001688
1689 # Disregarding the endpoints, find '::' with nothing in between.
1690 # This indicates that a run of zeroes has been skipped.
Nick Coghlan7319f692012-07-07 21:43:30 +10001691 skip_index = None
1692 for i in range(1, len(parts) - 1):
1693 if not parts[i]:
1694 if skip_index is not None:
1695 # Can't have more than one '::'
1696 msg = "At most one '::' permitted in %r" % ip_str
1697 raise AddressValueError(msg)
1698 skip_index = i
Nick Coghlandc9b2552012-05-20 21:01:57 +10001699
1700 # parts_hi is the number of parts to copy from above/before the '::'
1701 # parts_lo is the number of parts to copy from below/after the '::'
1702 if skip_index is not None:
1703 # If we found a '::', then check if it also covers the endpoints.
1704 parts_hi = skip_index
1705 parts_lo = len(parts) - skip_index - 1
1706 if not parts[0]:
1707 parts_hi -= 1
1708 if parts_hi:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001709 msg = "Leading ':' only permitted as part of '::' in %r"
1710 raise AddressValueError(msg % ip_str) # ^: requires ^::
Nick Coghlandc9b2552012-05-20 21:01:57 +10001711 if not parts[-1]:
1712 parts_lo -= 1
1713 if parts_lo:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001714 msg = "Trailing ':' only permitted as part of '::' in %r"
1715 raise AddressValueError(msg % ip_str) # :$ requires ::$
Antoine Pitrou45aba182014-05-15 20:18:41 +02001716 parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001717 if parts_skipped < 1:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001718 msg = "Expected at most %d other parts with '::' in %r"
Antoine Pitrou45aba182014-05-15 20:18:41 +02001719 raise AddressValueError(msg % (cls._HEXTET_COUNT-1, ip_str))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001720 else:
Hynek Schlawack072b1e12012-05-26 12:04:56 +02001721 # Otherwise, allocate the entire address to parts_hi. The
1722 # endpoints could still be empty, but _parse_hextet() will check
1723 # for that.
Antoine Pitrou45aba182014-05-15 20:18:41 +02001724 if len(parts) != cls._HEXTET_COUNT:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001725 msg = "Exactly %d parts expected without '::' in %r"
Antoine Pitrou45aba182014-05-15 20:18:41 +02001726 raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str))
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001727 if not parts[0]:
1728 msg = "Leading ':' only permitted as part of '::' in %r"
1729 raise AddressValueError(msg % ip_str) # ^: requires ^::
1730 if not parts[-1]:
1731 msg = "Trailing ':' only permitted as part of '::' in %r"
1732 raise AddressValueError(msg % ip_str) # :$ requires ::$
Nick Coghlandc9b2552012-05-20 21:01:57 +10001733 parts_hi = len(parts)
1734 parts_lo = 0
1735 parts_skipped = 0
1736
1737 try:
1738 # Now, parse the hextets into a 128-bit integer.
1739 ip_int = 0
1740 for i in range(parts_hi):
1741 ip_int <<= 16
Antoine Pitrou45aba182014-05-15 20:18:41 +02001742 ip_int |= cls._parse_hextet(parts[i])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001743 ip_int <<= 16 * parts_skipped
1744 for i in range(-parts_lo, 0):
1745 ip_int <<= 16
Antoine Pitrou45aba182014-05-15 20:18:41 +02001746 ip_int |= cls._parse_hextet(parts[i])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001747 return ip_int
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001748 except ValueError as exc:
1749 raise AddressValueError("%s in %r" % (exc, ip_str)) from None
Nick Coghlandc9b2552012-05-20 21:01:57 +10001750
Antoine Pitrou45aba182014-05-15 20:18:41 +02001751 @classmethod
1752 def _parse_hextet(cls, hextet_str):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001753 """Convert an IPv6 hextet string into an integer.
1754
1755 Args:
1756 hextet_str: A string, the number to parse.
1757
1758 Returns:
1759 The hextet as an integer.
1760
1761 Raises:
Hynek Schlawack072b1e12012-05-26 12:04:56 +02001762 ValueError: if the input isn't strictly a hex number from
1763 [0..FFFF].
Nick Coghlandc9b2552012-05-20 21:01:57 +10001764
1765 """
1766 # Whitelist the characters, since int() allows a lot of bizarre stuff.
Antoine Pitrou45aba182014-05-15 20:18:41 +02001767 if not cls._HEX_DIGITS.issuperset(hextet_str):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001768 raise ValueError("Only hex digits permitted in %r" % hextet_str)
Nick Coghlan07c4e332012-07-08 23:06:45 +10001769 # We do the length check second, since the invalid character error
1770 # is likely to be more informative for the user
Nick Coghlan3c2570c2012-07-07 01:13:55 +10001771 if len(hextet_str) > 4:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001772 msg = "At most 4 characters permitted in %r"
1773 raise ValueError(msg % hextet_str)
Nick Coghlan07c4e332012-07-08 23:06:45 +10001774 # Length check means we can skip checking the integer value
1775 return int(hextet_str, 16)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001776
Antoine Pitrou45aba182014-05-15 20:18:41 +02001777 @classmethod
1778 def _compress_hextets(cls, hextets):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001779 """Compresses a list of hextets.
1780
1781 Compresses a list of strings, replacing the longest continuous
1782 sequence of "0" in the list with "" and adding empty strings at
1783 the beginning or at the end of the string such that subsequently
1784 calling ":".join(hextets) will produce the compressed version of
1785 the IPv6 address.
1786
1787 Args:
1788 hextets: A list of strings, the hextets to compress.
1789
1790 Returns:
1791 A list of strings.
1792
1793 """
1794 best_doublecolon_start = -1
1795 best_doublecolon_len = 0
1796 doublecolon_start = -1
1797 doublecolon_len = 0
Nick Coghlandb7920b2012-08-20 10:19:12 +10001798 for index, hextet in enumerate(hextets):
1799 if hextet == '0':
Nick Coghlandc9b2552012-05-20 21:01:57 +10001800 doublecolon_len += 1
1801 if doublecolon_start == -1:
1802 # Start of a sequence of zeros.
1803 doublecolon_start = index
1804 if doublecolon_len > best_doublecolon_len:
1805 # This is the longest sequence of zeros so far.
1806 best_doublecolon_len = doublecolon_len
1807 best_doublecolon_start = doublecolon_start
1808 else:
1809 doublecolon_len = 0
1810 doublecolon_start = -1
1811
1812 if best_doublecolon_len > 1:
1813 best_doublecolon_end = (best_doublecolon_start +
1814 best_doublecolon_len)
1815 # For zeros at the end of the address.
1816 if best_doublecolon_end == len(hextets):
1817 hextets += ['']
1818 hextets[best_doublecolon_start:best_doublecolon_end] = ['']
1819 # For zeros at the beginning of the address.
1820 if best_doublecolon_start == 0:
1821 hextets = [''] + hextets
1822
1823 return hextets
1824
Antoine Pitrou45aba182014-05-15 20:18:41 +02001825 @classmethod
1826 def _string_from_ip_int(cls, ip_int=None):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001827 """Turns a 128-bit integer into hexadecimal notation.
1828
1829 Args:
1830 ip_int: An integer, the IP address.
1831
1832 Returns:
1833 A string, the hexadecimal representation of the address.
1834
1835 Raises:
1836 ValueError: The address is bigger than 128 bits of all ones.
1837
1838 """
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001839 if ip_int is None:
Antoine Pitrou45aba182014-05-15 20:18:41 +02001840 ip_int = int(cls._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001841
Antoine Pitrou45aba182014-05-15 20:18:41 +02001842 if ip_int > cls._ALL_ONES:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001843 raise ValueError('IPv6 address is too large')
1844
1845 hex_str = '%032x' % ip_int
Nick Coghlan7319f692012-07-07 21:43:30 +10001846 hextets = ['%x' % int(hex_str[x:x+4], 16) for x in range(0, 32, 4)]
Nick Coghlandc9b2552012-05-20 21:01:57 +10001847
Antoine Pitrou45aba182014-05-15 20:18:41 +02001848 hextets = cls._compress_hextets(hextets)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001849 return ':'.join(hextets)
1850
1851 def _explode_shorthand_ip_string(self):
1852 """Expand a shortened IPv6 address.
1853
1854 Args:
1855 ip_str: A string, the IPv6 address.
1856
1857 Returns:
1858 A string, the expanded IPv6 address.
1859
1860 """
1861 if isinstance(self, IPv6Network):
1862 ip_str = str(self.network_address)
1863 elif isinstance(self, IPv6Interface):
1864 ip_str = str(self.ip)
1865 else:
1866 ip_str = str(self)
1867
1868 ip_int = self._ip_int_from_string(ip_str)
Nick Coghlan7319f692012-07-07 21:43:30 +10001869 hex_str = '%032x' % ip_int
1870 parts = [hex_str[x:x+4] for x in range(0, 32, 4)]
Nick Coghlandc9b2552012-05-20 21:01:57 +10001871 if isinstance(self, (_BaseNetwork, IPv6Interface)):
Nick Coghlane3ded952012-08-05 22:45:22 +10001872 return '%s/%d' % (':'.join(parts), self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001873 return ':'.join(parts)
1874
Eric V. Smithebdaaf42014-04-14 12:58:07 -04001875 def _reverse_pointer(self):
1876 """Return the reverse DNS pointer name for the IPv6 address.
1877
1878 This implements the method described in RFC3596 2.5.
1879
1880 """
1881 reverse_chars = self.exploded[::-1].replace(':', '')
1882 return '.'.join(reverse_chars) + '.ip6.arpa'
1883
Nick Coghlandc9b2552012-05-20 21:01:57 +10001884 @property
1885 def max_prefixlen(self):
1886 return self._max_prefixlen
1887
1888 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +10001889 def version(self):
1890 return self._version
1891
Nick Coghlandc9b2552012-05-20 21:01:57 +10001892
1893class IPv6Address(_BaseV6, _BaseAddress):
1894
Sandro Tosib95c6342012-05-23 23:17:22 +02001895 """Represent and manipulate single IPv6 Addresses."""
Nick Coghlandc9b2552012-05-20 21:01:57 +10001896
Serhiy Storchaka88f64f32015-03-07 20:08:34 +02001897 __slots__ = ('_ip', '__weakref__')
1898
Nick Coghlandc9b2552012-05-20 21:01:57 +10001899 def __init__(self, address):
1900 """Instantiate a new IPv6 address object.
1901
1902 Args:
1903 address: A string or integer representing the IP
1904
1905 Additionally, an integer can be passed, so
1906 IPv6Address('2001:db8::') ==
1907 IPv6Address(42540766411282592856903984951653826560)
1908 or, more generally
1909 IPv6Address(int(IPv6Address('2001:db8::'))) ==
1910 IPv6Address('2001:db8::')
1911
1912 Raises:
1913 AddressValueError: If address isn't a valid IPv6 address.
1914
1915 """
Nick Coghlandc9b2552012-05-20 21:01:57 +10001916 # Efficient constructor from integer.
1917 if isinstance(address, int):
Nick Coghlan297b1432012-07-08 17:11:04 +10001918 self._check_int_address(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001919 self._ip = address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001920 return
1921
1922 # Constructing from a packed address
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001923 if isinstance(address, bytes):
Nick Coghlan297b1432012-07-08 17:11:04 +10001924 self._check_packed_address(address, 16)
Nick Coghlandb7920b2012-08-20 10:19:12 +10001925 self._ip = int.from_bytes(address, 'big')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001926 return
1927
1928 # Assume input argument to be string or any object representation
1929 # which converts into a formatted IP string.
1930 addr_str = str(address)
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +02001931 if '/' in addr_str:
1932 raise AddressValueError("Unexpected '/' in %r" % address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001933 self._ip = self._ip_int_from_string(addr_str)
1934
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001935 @property
1936 def packed(self):
1937 """The binary representation of this address."""
1938 return v6_int_to_packed(self._ip)
1939
Nick Coghlan730f67f2012-08-05 22:02:18 +10001940 @property
1941 def is_multicast(self):
1942 """Test if the address is reserved for multicast use.
1943
1944 Returns:
1945 A boolean, True if the address is a multicast address.
1946 See RFC 2373 2.7 for details.
1947
1948 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001949 return self in self._constants._multicast_network
Nick Coghlan730f67f2012-08-05 22:02:18 +10001950
1951 @property
1952 def is_reserved(self):
1953 """Test if the address is otherwise IETF reserved.
1954
1955 Returns:
1956 A boolean, True if the address is within one of the
1957 reserved IPv6 Network ranges.
1958
1959 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001960 return any(self in x for x in self._constants._reserved_networks)
Nick Coghlan730f67f2012-08-05 22:02:18 +10001961
1962 @property
1963 def is_link_local(self):
1964 """Test if the address is reserved for link-local.
1965
1966 Returns:
1967 A boolean, True if the address is reserved per RFC 4291.
1968
1969 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001970 return self in self._constants._linklocal_network
Nick Coghlan730f67f2012-08-05 22:02:18 +10001971
1972 @property
1973 def is_site_local(self):
1974 """Test if the address is reserved for site-local.
1975
1976 Note that the site-local address space has been deprecated by RFC 3879.
1977 Use is_private to test if this address is in the space of unique local
1978 addresses as defined by RFC 4193.
1979
1980 Returns:
1981 A boolean, True if the address is reserved per RFC 3513 2.5.6.
1982
1983 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001984 return self in self._constants._sitelocal_network
Nick Coghlan730f67f2012-08-05 22:02:18 +10001985
1986 @property
Peter Moodybe9c1b12013-10-22 12:36:21 -07001987 @functools.lru_cache()
Nick Coghlan730f67f2012-08-05 22:02:18 +10001988 def is_private(self):
1989 """Test if this address is allocated for private networks.
1990
1991 Returns:
Peter Moody22c31762013-10-21 13:58:06 -07001992 A boolean, True if the address is reserved per
1993 iana-ipv6-special-registry.
Nick Coghlan730f67f2012-08-05 22:02:18 +10001994
1995 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001996 return any(self in net for net in self._constants._private_networks)
Peter Moody22c31762013-10-21 13:58:06 -07001997
1998 @property
1999 def is_global(self):
2000 """Test if this address is allocated for public networks.
2001
2002 Returns:
2003 A boolean, true if the address is not reserved per
2004 iana-ipv6-special-registry.
2005
2006 """
2007 return not self.is_private
Nick Coghlan730f67f2012-08-05 22:02:18 +10002008
2009 @property
2010 def is_unspecified(self):
2011 """Test if the address is unspecified.
2012
2013 Returns:
2014 A boolean, True if this is the unspecified address as defined in
2015 RFC 2373 2.5.2.
2016
2017 """
2018 return self._ip == 0
2019
2020 @property
2021 def is_loopback(self):
2022 """Test if the address is a loopback address.
2023
2024 Returns:
2025 A boolean, True if the address is a loopback address as defined in
2026 RFC 2373 2.5.3.
2027
2028 """
2029 return self._ip == 1
2030
2031 @property
2032 def ipv4_mapped(self):
2033 """Return the IPv4 mapped address.
2034
2035 Returns:
2036 If the IPv6 address is a v4 mapped address, return the
2037 IPv4 mapped address. Return None otherwise.
2038
2039 """
2040 if (self._ip >> 32) != 0xFFFF:
2041 return None
2042 return IPv4Address(self._ip & 0xFFFFFFFF)
2043
2044 @property
2045 def teredo(self):
2046 """Tuple of embedded teredo IPs.
2047
2048 Returns:
2049 Tuple of the (server, client) IPs or None if the address
2050 doesn't appear to be a teredo address (doesn't start with
2051 2001::/32)
2052
2053 """
2054 if (self._ip >> 96) != 0x20010000:
2055 return None
2056 return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF),
2057 IPv4Address(~self._ip & 0xFFFFFFFF))
2058
2059 @property
2060 def sixtofour(self):
2061 """Return the IPv4 6to4 embedded address.
2062
2063 Returns:
2064 The IPv4 6to4-embedded address if present or None if the
2065 address doesn't appear to contain a 6to4 embedded address.
2066
2067 """
2068 if (self._ip >> 112) != 0x2002:
2069 return None
2070 return IPv4Address((self._ip >> 80) & 0xFFFFFFFF)
2071
Nick Coghlandc9b2552012-05-20 21:01:57 +10002072
2073class IPv6Interface(IPv6Address):
2074
2075 def __init__(self, address):
2076 if isinstance(address, (bytes, int)):
2077 IPv6Address.__init__(self, address)
2078 self.network = IPv6Network(self._ip)
2079 self._prefixlen = self._max_prefixlen
2080 return
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02002081 if isinstance(address, tuple):
2082 IPv6Address.__init__(self, address[0])
2083 if len(address) > 1:
2084 self._prefixlen = int(address[1])
2085 else:
2086 self._prefixlen = self._max_prefixlen
2087 self.network = IPv6Network(address, strict=False)
2088 self.netmask = self.network.netmask
2089 self.hostmask = self.network.hostmask
2090 return
Nick Coghlandc9b2552012-05-20 21:01:57 +10002091
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10002092 addr = _split_optional_netmask(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002093 IPv6Address.__init__(self, addr[0])
2094 self.network = IPv6Network(address, strict=False)
2095 self.netmask = self.network.netmask
2096 self._prefixlen = self.network._prefixlen
2097 self.hostmask = self.network.hostmask
2098
Nick Coghlandc9b2552012-05-20 21:01:57 +10002099 def __str__(self):
2100 return '%s/%d' % (self._string_from_ip_int(self._ip),
2101 self.network.prefixlen)
2102
2103 def __eq__(self, other):
Nick Coghlan3008ec02012-07-08 00:45:33 +10002104 address_equal = IPv6Address.__eq__(self, other)
2105 if not address_equal or address_equal is NotImplemented:
2106 return address_equal
Nick Coghlandc9b2552012-05-20 21:01:57 +10002107 try:
Nick Coghlan3008ec02012-07-08 00:45:33 +10002108 return self.network == other.network
Nick Coghlandc9b2552012-05-20 21:01:57 +10002109 except AttributeError:
Nick Coghlan3008ec02012-07-08 00:45:33 +10002110 # An interface with an associated network is NOT the
2111 # same as an unassociated address. That's why the hash
2112 # takes the extra info into account.
2113 return False
2114
2115 def __lt__(self, other):
2116 address_less = IPv6Address.__lt__(self, other)
2117 if address_less is NotImplemented:
Nick Coghlandc9b2552012-05-20 21:01:57 +10002118 return NotImplemented
Nick Coghlan3008ec02012-07-08 00:45:33 +10002119 try:
s-sanjay7bd8d3e2017-03-31 23:09:53 -07002120 return (self.network < other.network or
2121 self.network == other.network and address_less)
Nick Coghlan3008ec02012-07-08 00:45:33 +10002122 except AttributeError:
2123 # We *do* allow addresses and interfaces to be sorted. The
2124 # unassociated address is considered less than all interfaces.
2125 return False
Nick Coghlandc9b2552012-05-20 21:01:57 +10002126
2127 def __hash__(self):
2128 return self._ip ^ self._prefixlen ^ int(self.network.network_address)
2129
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +02002130 __reduce__ = _IPAddressBase.__reduce__
2131
Nick Coghlandc9b2552012-05-20 21:01:57 +10002132 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +10002133 def ip(self):
2134 return IPv6Address(self._ip)
2135
2136 @property
2137 def with_prefixlen(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10002138 return '%s/%s' % (self._string_from_ip_int(self._ip),
2139 self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002140
2141 @property
2142 def with_netmask(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10002143 return '%s/%s' % (self._string_from_ip_int(self._ip),
2144 self.netmask)
Hynek Schlawack072b1e12012-05-26 12:04:56 +02002145
Nick Coghlandc9b2552012-05-20 21:01:57 +10002146 @property
2147 def with_hostmask(self):
2148 return '%s/%s' % (self._string_from_ip_int(self._ip),
2149 self.hostmask)
2150
Nick Coghlan730f67f2012-08-05 22:02:18 +10002151 @property
2152 def is_unspecified(self):
2153 return self._ip == 0 and self.network.is_unspecified
2154
2155 @property
2156 def is_loopback(self):
2157 return self._ip == 1 and self.network.is_loopback
2158
Nick Coghlandc9b2552012-05-20 21:01:57 +10002159
2160class IPv6Network(_BaseV6, _BaseNetwork):
2161
2162 """This class represents and manipulates 128-bit IPv6 networks.
2163
2164 Attributes: [examples for IPv6('2001:db8::1000/124')]
2165 .network_address: IPv6Address('2001:db8::1000')
2166 .hostmask: IPv6Address('::f')
2167 .broadcast_address: IPv6Address('2001:db8::100f')
2168 .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0')
2169 .prefixlen: 124
2170
2171 """
2172
Nick Coghlan51c30672012-05-27 00:25:58 +10002173 # Class to use when creating address objects
Nick Coghlan51c30672012-05-27 00:25:58 +10002174 _address_class = IPv6Address
2175
Nick Coghlandc9b2552012-05-20 21:01:57 +10002176 def __init__(self, address, strict=True):
2177 """Instantiate a new IPv6 Network object.
2178
2179 Args:
Hynek Schlawack072b1e12012-05-26 12:04:56 +02002180 address: A string or integer representing the IPv6 network or the
2181 IP and prefix/netmask.
Nick Coghlandc9b2552012-05-20 21:01:57 +10002182 '2001:db8::/128'
2183 '2001:db8:0000:0000:0000:0000:0000:0000/128'
2184 '2001:db8::'
2185 are all functionally the same in IPv6. That is to say,
2186 failing to provide a subnetmask will create an object with
2187 a mask of /128.
2188
2189 Additionally, an integer can be passed, so
2190 IPv6Network('2001:db8::') ==
2191 IPv6Network(42540766411282592856903984951653826560)
2192 or, more generally
2193 IPv6Network(int(IPv6Network('2001:db8::'))) ==
2194 IPv6Network('2001:db8::')
2195
2196 strict: A boolean. If true, ensure that we have been passed
2197 A true network address, eg, 2001:db8::1000/124 and not an
2198 IP address on a network, eg, 2001:db8::1/124.
2199
2200 Raises:
2201 AddressValueError: If address isn't a valid IPv6 address.
2202 NetmaskValueError: If the netmask isn't valid for
2203 an IPv6 address.
2204 ValueError: If strict was True and a network address was not
2205 supplied.
2206
2207 """
Nick Coghlandc9b2552012-05-20 21:01:57 +10002208 _BaseNetwork.__init__(self, address)
2209
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02002210 # Efficient constructor from integer or packed address
2211 if isinstance(address, (bytes, int)):
Nick Coghlandc9b2552012-05-20 21:01:57 +10002212 self.network_address = IPv6Address(address)
Antoine Pitrou45aba182014-05-15 20:18:41 +02002213 self.netmask, self._prefixlen = self._make_netmask(self._max_prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002214 return
2215
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02002216 if isinstance(address, tuple):
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02002217 if len(address) > 1:
Antoine Pitrou45aba182014-05-15 20:18:41 +02002218 arg = address[1]
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02002219 else:
Antoine Pitrou45aba182014-05-15 20:18:41 +02002220 arg = self._max_prefixlen
2221 self.netmask, self._prefixlen = self._make_netmask(arg)
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02002222 self.network_address = IPv6Address(address[0])
2223 packed = int(self.network_address)
2224 if packed & int(self.netmask) != packed:
2225 if strict:
2226 raise ValueError('%s has host bits set' % self)
2227 else:
2228 self.network_address = IPv6Address(packed &
2229 int(self.netmask))
Hynek Schlawacked36b2e2012-06-08 15:21:21 +02002230 return
Nick Coghlandc9b2552012-05-20 21:01:57 +10002231
2232 # Assume input argument to be string or any object representation
2233 # which converts into a formatted IP prefix string.
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10002234 addr = _split_optional_netmask(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002235
2236 self.network_address = IPv6Address(self._ip_int_from_string(addr[0]))
2237
2238 if len(addr) == 2:
Antoine Pitrou45aba182014-05-15 20:18:41 +02002239 arg = addr[1]
Nick Coghlandc9b2552012-05-20 21:01:57 +10002240 else:
Antoine Pitrou45aba182014-05-15 20:18:41 +02002241 arg = self._max_prefixlen
2242 self.netmask, self._prefixlen = self._make_netmask(arg)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002243
Nick Coghlandc9b2552012-05-20 21:01:57 +10002244 if strict:
2245 if (IPv6Address(int(self.network_address) & int(self.netmask)) !=
2246 self.network_address):
Nick Coghlan912238e2012-07-07 13:34:50 +10002247 raise ValueError('%s has host bits set' % self)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002248 self.network_address = IPv6Address(int(self.network_address) &
2249 int(self.netmask))
2250
2251 if self._prefixlen == (self._max_prefixlen - 1):
2252 self.hosts = self.__iter__
2253
Peter Moody1243c7d2014-03-11 09:55:46 -07002254 def hosts(self):
2255 """Generate Iterator over usable hosts in a network.
2256
2257 This is like __iter__ except it doesn't return the
2258 Subnet-Router anycast address.
2259
2260 """
2261 network = int(self.network_address)
2262 broadcast = int(self.broadcast_address)
2263 for x in range(network + 1, broadcast + 1):
2264 yield self._address_class(x)
2265
Nick Coghlan730f67f2012-08-05 22:02:18 +10002266 @property
2267 def is_site_local(self):
2268 """Test if the address is reserved for site-local.
2269
2270 Note that the site-local address space has been deprecated by RFC 3879.
2271 Use is_private to test if this address is in the space of unique local
2272 addresses as defined by RFC 4193.
2273
2274 Returns:
2275 A boolean, True if the address is reserved per RFC 3513 2.5.6.
2276
2277 """
2278 return (self.network_address.is_site_local and
2279 self.broadcast_address.is_site_local)
Antoine Pitrouf573ce92014-05-23 23:12:24 +02002280
2281
Antoine Pitroub19e75d2014-05-24 00:32:29 +02002282class _IPv6Constants:
Antoine Pitrouf573ce92014-05-23 23:12:24 +02002283
Antoine Pitroub19e75d2014-05-24 00:32:29 +02002284 _linklocal_network = IPv6Network('fe80::/10')
Antoine Pitrouf573ce92014-05-23 23:12:24 +02002285
Antoine Pitroub19e75d2014-05-24 00:32:29 +02002286 _multicast_network = IPv6Network('ff00::/8')
2287
2288 _private_networks = [
2289 IPv6Network('::1/128'),
2290 IPv6Network('::/128'),
2291 IPv6Network('::ffff:0:0/96'),
2292 IPv6Network('100::/64'),
2293 IPv6Network('2001::/23'),
2294 IPv6Network('2001:2::/48'),
2295 IPv6Network('2001:db8::/32'),
2296 IPv6Network('2001:10::/28'),
2297 IPv6Network('fc00::/7'),
2298 IPv6Network('fe80::/10'),
2299 ]
2300
2301 _reserved_networks = [
2302 IPv6Network('::/8'), IPv6Network('100::/8'),
2303 IPv6Network('200::/7'), IPv6Network('400::/6'),
2304 IPv6Network('800::/5'), IPv6Network('1000::/4'),
2305 IPv6Network('4000::/3'), IPv6Network('6000::/3'),
2306 IPv6Network('8000::/3'), IPv6Network('A000::/3'),
2307 IPv6Network('C000::/3'), IPv6Network('E000::/4'),
2308 IPv6Network('F000::/5'), IPv6Network('F800::/6'),
2309 IPv6Network('FE00::/9'),
Antoine Pitrouf573ce92014-05-23 23:12:24 +02002310 ]
2311
Antoine Pitroub19e75d2014-05-24 00:32:29 +02002312 _sitelocal_network = IPv6Network('fec0::/10')
Antoine Pitrouf573ce92014-05-23 23:12:24 +02002313
Antoine Pitroub19e75d2014-05-24 00:32:29 +02002314
2315IPv6Address._constants = _IPv6Constants