blob: af7aedfa6e51a153d3ef82a9af4b907ac2d3aeff [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
Inada Naoki6fa84bd2019-04-16 08:32:28 +0900535 @classmethod
536 def _split_addr_prefix(cls, address):
537 """Helper function to parse address of Network/Interface.
538
539 Arg:
540 address: Argument of Network/Interface.
541
542 Returns:
543 (addr, prefix) tuple.
544 """
545 # a packed address or integer
546 if isinstance(address, (bytes, int)):
547 return address, cls._max_prefixlen
548
549 if not isinstance(address, tuple):
550 # Assume input argument to be string or any object representation
551 # which converts into a formatted IP prefix string.
552 address = _split_optional_netmask(address)
553
554 # Constructing from a tuple (addr, [mask])
555 if len(address) > 1:
556 return address
557 return address[0], cls._max_prefixlen
558
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200559 def __reduce__(self):
560 return self.__class__, (str(self),)
561
Nick Coghlan730f67f2012-08-05 22:02:18 +1000562
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300563_address_fmt_re = None
564
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200565@functools.total_ordering
Nick Coghlandc9b2552012-05-20 21:01:57 +1000566class _BaseAddress(_IPAddressBase):
567
568 """A generic IP object.
569
570 This IP class contains the version independent methods which are
571 used by single IP addresses.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000572 """
573
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200574 __slots__ = ()
575
Nick Coghlandc9b2552012-05-20 21:01:57 +1000576 def __int__(self):
577 return self._ip
578
Nick Coghlandc9b2552012-05-20 21:01:57 +1000579 def __eq__(self, other):
580 try:
581 return (self._ip == other._ip
582 and self._version == other._version)
583 except AttributeError:
584 return NotImplemented
585
Nick Coghlandc9b2552012-05-20 21:01:57 +1000586 def __lt__(self, other):
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200587 if not isinstance(other, _BaseAddress):
588 return NotImplemented
Nick Coghlandc9b2552012-05-20 21:01:57 +1000589 if self._version != other._version:
590 raise TypeError('%s and %s are not of the same version' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000591 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000592 if self._ip != other._ip:
593 return self._ip < other._ip
594 return False
595
Nick Coghlandc9b2552012-05-20 21:01:57 +1000596 # Shorthand for Integer addition and subtraction. This is not
597 # meant to ever support addition/subtraction of addresses.
598 def __add__(self, other):
599 if not isinstance(other, int):
600 return NotImplemented
Nick Coghlan51c30672012-05-27 00:25:58 +1000601 return self.__class__(int(self) + other)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000602
603 def __sub__(self, other):
604 if not isinstance(other, int):
605 return NotImplemented
Nick Coghlan51c30672012-05-27 00:25:58 +1000606 return self.__class__(int(self) - other)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000607
608 def __repr__(self):
609 return '%s(%r)' % (self.__class__.__name__, str(self))
610
611 def __str__(self):
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200612 return str(self._string_from_ip_int(self._ip))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000613
614 def __hash__(self):
615 return hash(hex(int(self._ip)))
616
617 def _get_address_key(self):
618 return (self._version, self)
619
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200620 def __reduce__(self):
621 return self.__class__, (self._ip,)
622
ewosbornef9c95a42019-09-12 05:03:31 -0400623 def __format__(self, fmt):
624 """Returns an IP address as a formatted string.
625
626 Supported presentation types are:
627 's': returns the IP address as a string (default)
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300628 'b': converts to binary and returns a zero-padded string
ewosbornef9c95a42019-09-12 05:03:31 -0400629 'X' or 'x': converts to upper- or lower-case hex and returns a zero-padded string
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300630 'n': the same as 'b' for IPv4 and 'x' for IPv6
ewosbornef9c95a42019-09-12 05:03:31 -0400631
632 For binary and hex presentation types, the alternate form specifier
633 '#' and the grouping option '_' are supported.
634 """
635
ewosbornef9c95a42019-09-12 05:03:31 -0400636 # Support string formatting
637 if not fmt or fmt[-1] == 's':
ewosbornef9c95a42019-09-12 05:03:31 -0400638 return format(str(self), fmt)
639
640 # From here on down, support for 'bnXx'
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300641 global _address_fmt_re
642 if _address_fmt_re is None:
643 import re
644 _address_fmt_re = re.compile('(#?)(_?)([xbnX])')
ewosbornef9c95a42019-09-12 05:03:31 -0400645
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300646 m = _address_fmt_re.fullmatch(fmt)
ewosbornef9c95a42019-09-12 05:03:31 -0400647 if not m:
648 return super().__format__(fmt)
649
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300650 alternate, grouping, fmt_base = m.groups()
ewosbornef9c95a42019-09-12 05:03:31 -0400651
652 # Set some defaults
653 if fmt_base == 'n':
654 if self._version == 4:
655 fmt_base = 'b' # Binary is default for ipv4
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300656 else:
ewosbornef9c95a42019-09-12 05:03:31 -0400657 fmt_base = 'x' # Hex is default for ipv6
658
ewosbornef9c95a42019-09-12 05:03:31 -0400659 if fmt_base == 'b':
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300660 padlen = self._max_prefixlen
661 else:
662 padlen = self._max_prefixlen // 4
ewosbornef9c95a42019-09-12 05:03:31 -0400663
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300664 if grouping:
665 padlen += padlen // 4 - 1
ewosbornef9c95a42019-09-12 05:03:31 -0400666
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300667 if alternate:
668 padlen += 2 # 0b or 0x
ewosbornef9c95a42019-09-12 05:03:31 -0400669
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300670 return format(int(self), f'{alternate}0{padlen}{grouping}{fmt_base}')
ewosbornef9c95a42019-09-12 05:03:31 -0400671
Nick Coghlandc9b2552012-05-20 21:01:57 +1000672
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200673@functools.total_ordering
Nick Coghlandc9b2552012-05-20 21:01:57 +1000674class _BaseNetwork(_IPAddressBase):
Nick Coghlan51c30672012-05-27 00:25:58 +1000675 """A generic IP network object.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000676
677 This IP class contains the version independent methods which are
678 used by networks.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000679 """
Nick Coghlandc9b2552012-05-20 21:01:57 +1000680
Nick Coghlandc9b2552012-05-20 21:01:57 +1000681 def __repr__(self):
682 return '%s(%r)' % (self.__class__.__name__, str(self))
683
Hynek Schlawack454a74d2012-06-04 18:14:02 +0200684 def __str__(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000685 return '%s/%d' % (self.network_address, self.prefixlen)
Hynek Schlawack454a74d2012-06-04 18:14:02 +0200686
Nick Coghlandc9b2552012-05-20 21:01:57 +1000687 def hosts(self):
688 """Generate Iterator over usable hosts in a network.
689
Sandro Tosib95c6342012-05-23 23:17:22 +0200690 This is like __iter__ except it doesn't return the network
691 or broadcast addresses.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000692
693 """
Nick Coghlan7319f692012-07-07 21:43:30 +1000694 network = int(self.network_address)
695 broadcast = int(self.broadcast_address)
696 for x in range(network + 1, broadcast):
697 yield self._address_class(x)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000698
699 def __iter__(self):
Nick Coghlan7319f692012-07-07 21:43:30 +1000700 network = int(self.network_address)
701 broadcast = int(self.broadcast_address)
702 for x in range(network, broadcast + 1):
703 yield self._address_class(x)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000704
705 def __getitem__(self, n):
706 network = int(self.network_address)
707 broadcast = int(self.broadcast_address)
708 if n >= 0:
709 if network + n > broadcast:
Berker Peksag28dc1182016-06-11 22:30:05 +0300710 raise IndexError('address out of range')
Nick Coghlan51c30672012-05-27 00:25:58 +1000711 return self._address_class(network + n)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000712 else:
713 n += 1
714 if broadcast + n < network:
Berker Peksag28dc1182016-06-11 22:30:05 +0300715 raise IndexError('address out of range')
Nick Coghlan51c30672012-05-27 00:25:58 +1000716 return self._address_class(broadcast + n)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000717
718 def __lt__(self, other):
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200719 if not isinstance(other, _BaseNetwork):
720 return NotImplemented
Nick Coghlandc9b2552012-05-20 21:01:57 +1000721 if self._version != other._version:
722 raise TypeError('%s and %s are not of the same version' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000723 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000724 if self.network_address != other.network_address:
725 return self.network_address < other.network_address
726 if self.netmask != other.netmask:
727 return self.netmask < other.netmask
728 return False
729
Nick Coghlandc9b2552012-05-20 21:01:57 +1000730 def __eq__(self, other):
Nick Coghlan9a9c28c2012-07-07 23:05:59 +1000731 try:
732 return (self._version == other._version and
733 self.network_address == other.network_address and
734 int(self.netmask) == int(other.netmask))
735 except AttributeError:
736 return NotImplemented
Nick Coghlandc9b2552012-05-20 21:01:57 +1000737
Nick Coghlandc9b2552012-05-20 21:01:57 +1000738 def __hash__(self):
739 return hash(int(self.network_address) ^ int(self.netmask))
740
741 def __contains__(self, other):
742 # always false if one is v4 and the other is v6.
743 if self._version != other._version:
744 return False
745 # dealing with another network.
746 if isinstance(other, _BaseNetwork):
747 return False
748 # dealing with another address
749 else:
750 # address
gescheit3bbcc922019-04-30 10:54:30 +0300751 return other._ip & self.netmask._ip == self.network_address._ip
Nick Coghlandc9b2552012-05-20 21:01:57 +1000752
753 def overlaps(self, other):
754 """Tell if self is partly contained in other."""
755 return self.network_address in other or (
756 self.broadcast_address in other or (
757 other.network_address in self or (
758 other.broadcast_address in self)))
759
Inada Naoki2430d532019-04-15 16:01:00 +0900760 @functools.cached_property
Nick Coghlandc9b2552012-05-20 21:01:57 +1000761 def broadcast_address(self):
Inada Naoki2430d532019-04-15 16:01:00 +0900762 return self._address_class(int(self.network_address) |
763 int(self.hostmask))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000764
Inada Naoki2430d532019-04-15 16:01:00 +0900765 @functools.cached_property
Nick Coghlandc9b2552012-05-20 21:01:57 +1000766 def hostmask(self):
Inada Naoki2430d532019-04-15 16:01:00 +0900767 return self._address_class(int(self.netmask) ^ self._ALL_ONES)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000768
769 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +1000770 def with_prefixlen(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000771 return '%s/%d' % (self.network_address, self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000772
773 @property
774 def with_netmask(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000775 return '%s/%s' % (self.network_address, self.netmask)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000776
777 @property
778 def with_hostmask(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000779 return '%s/%s' % (self.network_address, self.hostmask)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000780
781 @property
782 def num_addresses(self):
783 """Number of hosts in the current subnet."""
784 return int(self.broadcast_address) - int(self.network_address) + 1
785
786 @property
Nick Coghlan51c30672012-05-27 00:25:58 +1000787 def _address_class(self):
Nick Coghland9722652012-06-17 16:33:00 +1000788 # Returning bare address objects (rather than interfaces) allows for
789 # more consistent behaviour across the network address, broadcast
790 # address and individual host addresses.
791 msg = '%200s has no associated address class' % (type(self),)
792 raise NotImplementedError(msg)
Nick Coghlan51c30672012-05-27 00:25:58 +1000793
794 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +1000795 def prefixlen(self):
796 return self._prefixlen
797
798 def address_exclude(self, other):
799 """Remove an address from a larger block.
800
801 For example:
802
803 addr1 = ip_network('192.0.2.0/28')
804 addr2 = ip_network('192.0.2.1/32')
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +0200805 list(addr1.address_exclude(addr2)) =
Nick Coghlandc9b2552012-05-20 21:01:57 +1000806 [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'),
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +0200807 IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')]
Nick Coghlandc9b2552012-05-20 21:01:57 +1000808
809 or IPv6:
810
811 addr1 = ip_network('2001:db8::1/32')
812 addr2 = ip_network('2001:db8::1/128')
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +0200813 list(addr1.address_exclude(addr2)) =
Nick Coghlandc9b2552012-05-20 21:01:57 +1000814 [ip_network('2001:db8::1/128'),
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +0200815 ip_network('2001:db8::2/127'),
816 ip_network('2001:db8::4/126'),
817 ip_network('2001:db8::8/125'),
818 ...
819 ip_network('2001:db8:8000::/33')]
Nick Coghlandc9b2552012-05-20 21:01:57 +1000820
821 Args:
822 other: An IPv4Network or IPv6Network object of the same type.
823
824 Returns:
Ezio Melotti3f5db392013-01-27 06:20:14 +0200825 An iterator of the IPv(4|6)Network objects which is self
Nick Coghlandc9b2552012-05-20 21:01:57 +1000826 minus other.
827
828 Raises:
Ezio Melotti30b9d5d2013-08-17 15:50:46 +0300829 TypeError: If self and other are of differing address
Nick Coghlandc9b2552012-05-20 21:01:57 +1000830 versions, or if other is not a network object.
831 ValueError: If other is not completely contained by self.
832
833 """
834 if not self._version == other._version:
835 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000836 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000837
838 if not isinstance(other, _BaseNetwork):
Nick Coghlan912238e2012-07-07 13:34:50 +1000839 raise TypeError("%s is not a network object" % other)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000840
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400841 if not other.subnet_of(self):
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200842 raise ValueError('%s not contained in %s' % (other, self))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000843 if other == self:
Raymond Hettingerbb6c0aa2014-11-22 22:14:41 -0800844 return
Nick Coghlandc9b2552012-05-20 21:01:57 +1000845
Nick Coghlandc9b2552012-05-20 21:01:57 +1000846 # Make sure we're comparing the network of other.
Nick Coghlan912238e2012-07-07 13:34:50 +1000847 other = other.__class__('%s/%s' % (other.network_address,
848 other.prefixlen))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000849
850 s1, s2 = self.subnets()
851 while s1 != other and s2 != other:
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400852 if other.subnet_of(s1):
Nick Coghlandc9b2552012-05-20 21:01:57 +1000853 yield s2
854 s1, s2 = s1.subnets()
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400855 elif other.subnet_of(s2):
Nick Coghlandc9b2552012-05-20 21:01:57 +1000856 yield s1
857 s1, s2 = s2.subnets()
858 else:
859 # If we got here, there's a bug somewhere.
860 raise AssertionError('Error performing exclusion: '
861 's1: %s s2: %s other: %s' %
Nick Coghlan912238e2012-07-07 13:34:50 +1000862 (s1, s2, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000863 if s1 == other:
864 yield s2
865 elif s2 == other:
866 yield s1
867 else:
868 # If we got here, there's a bug somewhere.
869 raise AssertionError('Error performing exclusion: '
870 's1: %s s2: %s other: %s' %
Nick Coghlan912238e2012-07-07 13:34:50 +1000871 (s1, s2, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000872
873 def compare_networks(self, other):
874 """Compare two IP objects.
875
876 This is only concerned about the comparison of the integer
877 representation of the network addresses. This means that the
878 host bits aren't considered at all in this method. If you want
879 to compare host bits, you can easily enough do a
880 'HostA._ip < HostB._ip'
881
882 Args:
883 other: An IP object.
884
885 Returns:
886 If the IP versions of self and other are the same, returns:
887
888 -1 if self < other:
889 eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25')
890 IPv6Network('2001:db8::1000/124') <
891 IPv6Network('2001:db8::2000/124')
892 0 if self == other
893 eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24')
894 IPv6Network('2001:db8::1000/124') ==
895 IPv6Network('2001:db8::1000/124')
896 1 if self > other
897 eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25')
898 IPv6Network('2001:db8::2000/124') >
899 IPv6Network('2001:db8::1000/124')
900
901 Raises:
902 TypeError if the IP versions are different.
903
904 """
905 # does this need to raise a ValueError?
906 if self._version != other._version:
907 raise TypeError('%s and %s are not of the same type' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000908 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000909 # self._version == other._version below here:
910 if self.network_address < other.network_address:
911 return -1
912 if self.network_address > other.network_address:
913 return 1
914 # self.network_address == other.network_address below here:
915 if self.netmask < other.netmask:
916 return -1
917 if self.netmask > other.netmask:
918 return 1
919 return 0
920
921 def _get_networks_key(self):
922 """Network-only key function.
923
924 Returns an object that identifies this address' network and
925 netmask. This function is a suitable "key" argument for sorted()
926 and list.sort().
927
928 """
929 return (self._version, self.network_address, self.netmask)
930
931 def subnets(self, prefixlen_diff=1, new_prefix=None):
932 """The subnets which join to make the current subnet.
933
934 In the case that self contains only one IP
935 (self._prefixlen == 32 for IPv4 or self._prefixlen == 128
936 for IPv6), yield an iterator with just ourself.
937
938 Args:
939 prefixlen_diff: An integer, the amount the prefix length
940 should be increased by. This should not be set if
941 new_prefix is also set.
942 new_prefix: The desired new prefix length. This must be a
943 larger number (smaller prefix) than the existing prefix.
944 This should not be set if prefixlen_diff is also set.
945
946 Returns:
947 An iterator of IPv(4|6) objects.
948
949 Raises:
950 ValueError: The prefixlen_diff is too small or too large.
951 OR
952 prefixlen_diff and new_prefix are both set or new_prefix
953 is a smaller number than the current prefix (smaller
954 number means a larger network)
955
956 """
957 if self._prefixlen == self._max_prefixlen:
958 yield self
959 return
960
961 if new_prefix is not None:
962 if new_prefix < self._prefixlen:
963 raise ValueError('new prefix must be longer')
964 if prefixlen_diff != 1:
965 raise ValueError('cannot set prefixlen_diff and new_prefix')
966 prefixlen_diff = new_prefix - self._prefixlen
967
968 if prefixlen_diff < 0:
969 raise ValueError('prefix length diff must be > 0')
970 new_prefixlen = self._prefixlen + prefixlen_diff
971
Nick Coghlan932346f2014-02-08 23:17:36 +1000972 if new_prefixlen > self._max_prefixlen:
Nick Coghlandc9b2552012-05-20 21:01:57 +1000973 raise ValueError(
974 'prefix length diff %d is invalid for netblock %s' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000975 new_prefixlen, self))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000976
Antoine Pitrou824db302014-05-15 20:21:48 +0200977 start = int(self.network_address)
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +0200978 end = int(self.broadcast_address) + 1
Antoine Pitrou824db302014-05-15 20:21:48 +0200979 step = (int(self.hostmask) + 1) >> prefixlen_diff
980 for new_addr in range(start, end, step):
981 current = self.__class__((new_addr, new_prefixlen))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000982 yield current
983
Nick Coghlandc9b2552012-05-20 21:01:57 +1000984 def supernet(self, prefixlen_diff=1, new_prefix=None):
985 """The supernet containing the current network.
986
987 Args:
988 prefixlen_diff: An integer, the amount the prefix length of
989 the network should be decreased by. For example, given a
990 /24 network and a prefixlen_diff of 3, a supernet with a
991 /21 netmask is returned.
992
993 Returns:
994 An IPv4 network object.
995
996 Raises:
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200997 ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have
998 a negative prefix length.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000999 OR
1000 If prefixlen_diff and new_prefix are both set or new_prefix is a
1001 larger number than the current prefix (larger number means a
1002 smaller network)
1003
1004 """
1005 if self._prefixlen == 0:
1006 return self
1007
1008 if new_prefix is not None:
1009 if new_prefix > self._prefixlen:
1010 raise ValueError('new prefix must be shorter')
1011 if prefixlen_diff != 1:
1012 raise ValueError('cannot set prefixlen_diff and new_prefix')
1013 prefixlen_diff = self._prefixlen - new_prefix
1014
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001015 new_prefixlen = self.prefixlen - prefixlen_diff
1016 if new_prefixlen < 0:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001017 raise ValueError(
1018 'current prefixlen is %d, cannot have a prefixlen_diff of %d' %
1019 (self.prefixlen, prefixlen_diff))
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001020 return self.__class__((
1021 int(self.network_address) & (int(self.netmask) << prefixlen_diff),
1022 new_prefixlen
1023 ))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001024
Nick Coghlan730f67f2012-08-05 22:02:18 +10001025 @property
1026 def is_multicast(self):
1027 """Test if the address is reserved for multicast use.
1028
1029 Returns:
1030 A boolean, True if the address is a multicast address.
1031 See RFC 2373 2.7 for details.
1032
1033 """
1034 return (self.network_address.is_multicast and
1035 self.broadcast_address.is_multicast)
1036
Cheryl Sabella91dc64b2017-10-22 17:39:49 -04001037 @staticmethod
1038 def _is_subnet_of(a, b):
1039 try:
1040 # Always false if one is v4 and the other is v6.
1041 if a._version != b._version:
1042 raise TypeError(f"{a} and {b} are not of the same version")
1043 return (b.network_address <= a.network_address and
1044 b.broadcast_address >= a.broadcast_address)
1045 except AttributeError:
1046 raise TypeError(f"Unable to test subnet containment "
1047 f"between {a} and {b}")
1048
1049 def subnet_of(self, other):
1050 """Return True if this network is a subnet of other."""
1051 return self._is_subnet_of(self, other)
1052
1053 def supernet_of(self, other):
1054 """Return True if this network is a supernet of other."""
1055 return self._is_subnet_of(other, self)
1056
Nick Coghlan730f67f2012-08-05 22:02:18 +10001057 @property
1058 def is_reserved(self):
1059 """Test if the address is otherwise IETF reserved.
1060
1061 Returns:
1062 A boolean, True if the address is within one of the
1063 reserved IPv6 Network ranges.
1064
1065 """
1066 return (self.network_address.is_reserved and
1067 self.broadcast_address.is_reserved)
1068
1069 @property
1070 def is_link_local(self):
1071 """Test if the address is reserved for link-local.
1072
1073 Returns:
1074 A boolean, True if the address is reserved per RFC 4291.
1075
1076 """
1077 return (self.network_address.is_link_local and
1078 self.broadcast_address.is_link_local)
1079
1080 @property
1081 def is_private(self):
1082 """Test if this address is allocated for private networks.
1083
1084 Returns:
Peter Moody22c31762013-10-21 13:58:06 -07001085 A boolean, True if the address is reserved per
1086 iana-ipv4-special-registry or iana-ipv6-special-registry.
Nick Coghlan730f67f2012-08-05 22:02:18 +10001087
1088 """
1089 return (self.network_address.is_private and
1090 self.broadcast_address.is_private)
1091
1092 @property
Peter Moody22c31762013-10-21 13:58:06 -07001093 def is_global(self):
Peter Moodybe9c1b12013-10-22 12:36:21 -07001094 """Test if this address is allocated for public networks.
Peter Moody22c31762013-10-21 13:58:06 -07001095
1096 Returns:
1097 A boolean, True if the address is not reserved per
1098 iana-ipv4-special-registry or iana-ipv6-special-registry.
1099
1100 """
1101 return not self.is_private
1102
1103 @property
Nick Coghlan730f67f2012-08-05 22:02:18 +10001104 def is_unspecified(self):
1105 """Test if the address is unspecified.
1106
1107 Returns:
1108 A boolean, True if this is the unspecified address as defined in
1109 RFC 2373 2.5.2.
1110
1111 """
1112 return (self.network_address.is_unspecified and
1113 self.broadcast_address.is_unspecified)
1114
1115 @property
1116 def is_loopback(self):
1117 """Test if the address is a loopback address.
1118
1119 Returns:
1120 A boolean, True if the address is a loopback address as defined in
1121 RFC 2373 2.5.3.
1122
1123 """
1124 return (self.network_address.is_loopback and
1125 self.broadcast_address.is_loopback)
1126
Hynek Schlawackc4b78a32012-06-01 11:48:32 +02001127class _BaseV4:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001128
1129 """Base IPv4 object.
1130
1131 The following methods are used by IPv4 objects in both single IP
1132 addresses and networks.
1133
1134 """
1135
Serhiy Storchaka88f64f32015-03-07 20:08:34 +02001136 __slots__ = ()
1137 _version = 4
Nick Coghlandc9b2552012-05-20 21:01:57 +10001138 # Equivalent to 255.255.255.255 or 32 bits of 1's.
1139 _ALL_ONES = (2**IPV4LENGTH) - 1
Nick Coghlandc9b2552012-05-20 21:01:57 +10001140
Antoine Pitrou45aba182014-05-15 20:18:41 +02001141 _max_prefixlen = IPV4LENGTH
1142 # There are only a handful of valid v4 netmasks, so we cache them all
1143 # when constructed (see _make_netmask()).
1144 _netmask_cache = {}
1145
Nick Coghlandc9b2552012-05-20 21:01:57 +10001146 def _explode_shorthand_ip_string(self):
1147 return str(self)
1148
Antoine Pitrou45aba182014-05-15 20:18:41 +02001149 @classmethod
1150 def _make_netmask(cls, arg):
1151 """Make a (netmask, prefix_len) tuple from the given argument.
1152
1153 Argument can be:
1154 - an integer (the prefix length)
1155 - a string representing the prefix length (e.g. "24")
1156 - a string representing the prefix netmask (e.g. "255.255.255.0")
1157 """
1158 if arg not in cls._netmask_cache:
1159 if isinstance(arg, int):
1160 prefixlen = arg
Nicolai Moore5e48e3d2019-05-14 20:32:59 +10001161 if not (0 <= prefixlen <= cls._max_prefixlen):
1162 cls._report_invalid_netmask(prefixlen)
Antoine Pitrou45aba182014-05-15 20:18:41 +02001163 else:
1164 try:
1165 # Check for a netmask in prefix length form
1166 prefixlen = cls._prefix_from_prefix_string(arg)
1167 except NetmaskValueError:
1168 # Check for a netmask or hostmask in dotted-quad form.
1169 # This may raise NetmaskValueError.
1170 prefixlen = cls._prefix_from_ip_string(arg)
1171 netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen))
1172 cls._netmask_cache[arg] = netmask, prefixlen
1173 return cls._netmask_cache[arg]
1174
1175 @classmethod
1176 def _ip_int_from_string(cls, ip_str):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001177 """Turn the given IP string into an integer for comparison.
1178
1179 Args:
1180 ip_str: A string, the IP ip_str.
1181
1182 Returns:
1183 The IP ip_str as an integer.
1184
1185 Raises:
1186 AddressValueError: if ip_str isn't a valid IPv4 Address.
1187
1188 """
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001189 if not ip_str:
1190 raise AddressValueError('Address cannot be empty')
1191
Nick Coghlandc9b2552012-05-20 21:01:57 +10001192 octets = ip_str.split('.')
1193 if len(octets) != 4:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001194 raise AddressValueError("Expected 4 octets in %r" % ip_str)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001195
Nick Coghlan7319f692012-07-07 21:43:30 +10001196 try:
Antoine Pitrou45aba182014-05-15 20:18:41 +02001197 return int.from_bytes(map(cls._parse_octet, octets), 'big')
Nick Coghlan7319f692012-07-07 21:43:30 +10001198 except ValueError as exc:
1199 raise AddressValueError("%s in %r" % (exc, ip_str)) from None
Nick Coghlandc9b2552012-05-20 21:01:57 +10001200
Antoine Pitrou45aba182014-05-15 20:18:41 +02001201 @classmethod
1202 def _parse_octet(cls, octet_str):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001203 """Convert a decimal octet into an integer.
1204
1205 Args:
1206 octet_str: A string, the number to parse.
1207
1208 Returns:
1209 The octet as an integer.
1210
1211 Raises:
1212 ValueError: if the octet isn't strictly a decimal from [0..255].
1213
1214 """
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001215 if not octet_str:
1216 raise ValueError("Empty octet not permitted")
Victor Stinnerfabd7bb2020-08-11 15:26:59 +02001217 # Reject non-ASCII digits.
INADA Naoki58a10962018-02-23 20:02:41 +09001218 if not (octet_str.isascii() and octet_str.isdigit()):
Nick Coghlan07c4e332012-07-08 23:06:45 +10001219 msg = "Only decimal digits permitted in %r"
1220 raise ValueError(msg % octet_str)
1221 # We do the length check second, since the invalid character error
1222 # is likely to be more informative for the user
1223 if len(octet_str) > 3:
1224 msg = "At most 3 characters permitted in %r"
1225 raise ValueError(msg % octet_str)
Christian Heimes60ce8f02021-05-02 14:00:35 +02001226 # Handle leading zeros as strict as glibc's inet_pton()
1227 # See security bug bpo-36384
1228 if octet_str != '0' and octet_str[0] == '0':
1229 msg = "Leading zeros are not permitted in %r"
1230 raise ValueError(msg % octet_str)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001231 # Convert to integer (we know digits are legal)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001232 octet_int = int(octet_str, 10)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001233 if octet_int > 255:
Nick Coghlanb582ecc2012-07-07 22:15:22 +10001234 raise ValueError("Octet %d (> 255) not permitted" % octet_int)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001235 return octet_int
1236
Antoine Pitrou45aba182014-05-15 20:18:41 +02001237 @classmethod
1238 def _string_from_ip_int(cls, ip_int):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001239 """Turns a 32-bit integer into dotted decimal notation.
1240
1241 Args:
1242 ip_int: An integer, the IP address.
1243
1244 Returns:
1245 The IP address as a string in dotted decimal notation.
1246
1247 """
Nick Coghlan7319f692012-07-07 21:43:30 +10001248 return '.'.join(map(str, ip_int.to_bytes(4, 'big')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001249
Eric V. Smithebdaaf42014-04-14 12:58:07 -04001250 def _reverse_pointer(self):
1251 """Return the reverse DNS pointer name for the IPv4 address.
1252
1253 This implements the method described in RFC1035 3.5.
1254
1255 """
1256 reverse_octets = str(self).split('.')[::-1]
1257 return '.'.join(reverse_octets) + '.in-addr.arpa'
1258
Nick Coghlandc9b2552012-05-20 21:01:57 +10001259 @property
1260 def max_prefixlen(self):
1261 return self._max_prefixlen
1262
1263 @property
1264 def version(self):
1265 return self._version
1266
Nick Coghlandc9b2552012-05-20 21:01:57 +10001267
1268class IPv4Address(_BaseV4, _BaseAddress):
1269
1270 """Represent and manipulate single IPv4 Addresses."""
1271
Serhiy Storchaka88f64f32015-03-07 20:08:34 +02001272 __slots__ = ('_ip', '__weakref__')
1273
Nick Coghlandc9b2552012-05-20 21:01:57 +10001274 def __init__(self, address):
1275
1276 """
1277 Args:
1278 address: A string or integer representing the IP
1279
1280 Additionally, an integer can be passed, so
1281 IPv4Address('192.0.2.1') == IPv4Address(3221225985).
1282 or, more generally
1283 IPv4Address(int(IPv4Address('192.0.2.1'))) ==
1284 IPv4Address('192.0.2.1')
1285
1286 Raises:
Sandro Tosib4386d32012-06-02 17:14:22 +02001287 AddressValueError: If ipaddress isn't a valid IPv4 address.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001288
1289 """
Nick Coghlandc9b2552012-05-20 21:01:57 +10001290 # Efficient constructor from integer.
1291 if isinstance(address, int):
Nick Coghlan297b1432012-07-08 17:11:04 +10001292 self._check_int_address(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001293 self._ip = address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001294 return
1295
1296 # Constructing from a packed address
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001297 if isinstance(address, bytes):
Nick Coghlan297b1432012-07-08 17:11:04 +10001298 self._check_packed_address(address, 4)
Nick Coghlandb7920b2012-08-20 10:19:12 +10001299 self._ip = int.from_bytes(address, 'big')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001300 return
1301
1302 # Assume input argument to be string or any object representation
1303 # which converts into a formatted IP string.
1304 addr_str = str(address)
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +02001305 if '/' in addr_str:
1306 raise AddressValueError("Unexpected '/' in %r" % address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001307 self._ip = self._ip_int_from_string(addr_str)
1308
1309 @property
1310 def packed(self):
1311 """The binary representation of this address."""
1312 return v4_int_to_packed(self._ip)
1313
Nick Coghlan730f67f2012-08-05 22:02:18 +10001314 @property
1315 def is_reserved(self):
1316 """Test if the address is otherwise IETF reserved.
1317
1318 Returns:
1319 A boolean, True if the address is within the
1320 reserved IPv4 Network range.
1321
1322 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001323 return self in self._constants._reserved_network
Nick Coghlan730f67f2012-08-05 22:02:18 +10001324
1325 @property
Peter Moodybe9c1b12013-10-22 12:36:21 -07001326 @functools.lru_cache()
Nick Coghlan730f67f2012-08-05 22:02:18 +10001327 def is_private(self):
1328 """Test if this address is allocated for private networks.
1329
1330 Returns:
Peter Moody22c31762013-10-21 13:58:06 -07001331 A boolean, True if the address is reserved per
1332 iana-ipv4-special-registry.
Nick Coghlan730f67f2012-08-05 22:02:18 +10001333
1334 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001335 return any(self in net for net in self._constants._private_networks)
Nick Coghlan730f67f2012-08-05 22:02:18 +10001336
1337 @property
Berker Peksag742192a2016-06-11 22:11:47 +03001338 @functools.lru_cache()
1339 def is_global(self):
1340 return self not in self._constants._public_network and not self.is_private
1341
1342 @property
Nick Coghlan730f67f2012-08-05 22:02:18 +10001343 def is_multicast(self):
1344 """Test if the address is reserved for multicast use.
1345
1346 Returns:
1347 A boolean, True if the address is multicast.
1348 See RFC 3171 for details.
1349
1350 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001351 return self in self._constants._multicast_network
Nick Coghlan730f67f2012-08-05 22:02:18 +10001352
1353 @property
1354 def is_unspecified(self):
1355 """Test if the address is unspecified.
1356
1357 Returns:
1358 A boolean, True if this is the unspecified address as defined in
1359 RFC 5735 3.
1360
1361 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001362 return self == self._constants._unspecified_address
Nick Coghlan730f67f2012-08-05 22:02:18 +10001363
1364 @property
1365 def is_loopback(self):
1366 """Test if the address is a loopback address.
1367
1368 Returns:
1369 A boolean, True if the address is a loopback per RFC 3330.
1370
1371 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001372 return self in self._constants._loopback_network
Nick Coghlan730f67f2012-08-05 22:02:18 +10001373
1374 @property
1375 def is_link_local(self):
1376 """Test if the address is reserved for link-local.
1377
1378 Returns:
1379 A boolean, True if the address is link-local per RFC 3927.
1380
1381 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001382 return self in self._constants._linklocal_network
Nick Coghlan730f67f2012-08-05 22:02:18 +10001383
Nick Coghlandc9b2552012-05-20 21:01:57 +10001384
1385class IPv4Interface(IPv4Address):
1386
Nick Coghlandc9b2552012-05-20 21:01:57 +10001387 def __init__(self, address):
Inada Naoki6fa84bd2019-04-16 08:32:28 +09001388 addr, mask = self._split_addr_prefix(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001389
Inada Naoki6fa84bd2019-04-16 08:32:28 +09001390 IPv4Address.__init__(self, addr)
1391 self.network = IPv4Network((addr, mask), strict=False)
1392 self.netmask = self.network.netmask
Nick Coghlandc9b2552012-05-20 21:01:57 +10001393 self._prefixlen = self.network._prefixlen
1394
Inada Naoki6fa84bd2019-04-16 08:32:28 +09001395 @functools.cached_property
1396 def hostmask(self):
1397 return self.network.hostmask
Nick Coghlandc9b2552012-05-20 21:01:57 +10001398
Nick Coghlandc9b2552012-05-20 21:01:57 +10001399 def __str__(self):
1400 return '%s/%d' % (self._string_from_ip_int(self._ip),
Inada Naoki2430d532019-04-15 16:01:00 +09001401 self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001402
1403 def __eq__(self, other):
Nick Coghlan3008ec02012-07-08 00:45:33 +10001404 address_equal = IPv4Address.__eq__(self, other)
MojoVampire469325c2020-03-03 18:50:17 +00001405 if address_equal is NotImplemented or not address_equal:
Nick Coghlan3008ec02012-07-08 00:45:33 +10001406 return address_equal
Nick Coghlandc9b2552012-05-20 21:01:57 +10001407 try:
Nick Coghlan3008ec02012-07-08 00:45:33 +10001408 return self.network == other.network
Nick Coghlandc9b2552012-05-20 21:01:57 +10001409 except AttributeError:
Nick Coghlan3008ec02012-07-08 00:45:33 +10001410 # An interface with an associated network is NOT the
1411 # same as an unassociated address. That's why the hash
1412 # takes the extra info into account.
1413 return False
1414
1415 def __lt__(self, other):
1416 address_less = IPv4Address.__lt__(self, other)
1417 if address_less is NotImplemented:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001418 return NotImplemented
Nick Coghlan3008ec02012-07-08 00:45:33 +10001419 try:
s-sanjay7bd8d3e2017-03-31 23:09:53 -07001420 return (self.network < other.network or
1421 self.network == other.network and address_less)
Nick Coghlan3008ec02012-07-08 00:45:33 +10001422 except AttributeError:
1423 # We *do* allow addresses and interfaces to be sorted. The
1424 # unassociated address is considered less than all interfaces.
1425 return False
Nick Coghlandc9b2552012-05-20 21:01:57 +10001426
1427 def __hash__(self):
Ravi Teja Pb30ee262020-06-29 23:09:29 +05301428 return hash((self._ip, self._prefixlen, int(self.network.network_address)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001429
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +02001430 __reduce__ = _IPAddressBase.__reduce__
1431
Nick Coghlandc9b2552012-05-20 21:01:57 +10001432 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +10001433 def ip(self):
1434 return IPv4Address(self._ip)
1435
1436 @property
1437 def with_prefixlen(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10001438 return '%s/%s' % (self._string_from_ip_int(self._ip),
1439 self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001440
1441 @property
1442 def with_netmask(self):
1443 return '%s/%s' % (self._string_from_ip_int(self._ip),
1444 self.netmask)
Hynek Schlawack072b1e12012-05-26 12:04:56 +02001445
Nick Coghlandc9b2552012-05-20 21:01:57 +10001446 @property
1447 def with_hostmask(self):
1448 return '%s/%s' % (self._string_from_ip_int(self._ip),
1449 self.hostmask)
1450
1451
1452class IPv4Network(_BaseV4, _BaseNetwork):
1453
1454 """This class represents and manipulates 32-bit IPv4 network + addresses..
1455
1456 Attributes: [examples for IPv4Network('192.0.2.0/27')]
1457 .network_address: IPv4Address('192.0.2.0')
1458 .hostmask: IPv4Address('0.0.0.31')
1459 .broadcast_address: IPv4Address('192.0.2.32')
1460 .netmask: IPv4Address('255.255.255.224')
1461 .prefixlen: 27
1462
1463 """
Nick Coghlan51c30672012-05-27 00:25:58 +10001464 # Class to use when creating address objects
Nick Coghlan51c30672012-05-27 00:25:58 +10001465 _address_class = IPv4Address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001466
Nick Coghlandc9b2552012-05-20 21:01:57 +10001467 def __init__(self, address, strict=True):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001468 """Instantiate a new IPv4 network object.
1469
1470 Args:
1471 address: A string or integer representing the IP [& network].
1472 '192.0.2.0/24'
1473 '192.0.2.0/255.255.255.0'
Eric L. Frederich52f98422020-08-05 14:44:53 -04001474 '192.0.2.0/0.0.0.255'
Nick Coghlandc9b2552012-05-20 21:01:57 +10001475 are all functionally the same in IPv4. Similarly,
1476 '192.0.2.1'
1477 '192.0.2.1/255.255.255.255'
1478 '192.0.2.1/32'
Ezio Melotti30b9d5d2013-08-17 15:50:46 +03001479 are also functionally equivalent. That is to say, failing to
Nick Coghlandc9b2552012-05-20 21:01:57 +10001480 provide a subnetmask will create an object with a mask of /32.
1481
1482 If the mask (portion after the / in the argument) is given in
1483 dotted quad form, it is treated as a netmask if it starts with a
1484 non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it
1485 starts with a zero field (e.g. 0.255.255.255 == /8), with the
1486 single exception of an all-zero mask which is treated as a
1487 netmask == /0. If no mask is given, a default of /32 is used.
1488
1489 Additionally, an integer can be passed, so
1490 IPv4Network('192.0.2.1') == IPv4Network(3221225985)
1491 or, more generally
1492 IPv4Interface(int(IPv4Interface('192.0.2.1'))) ==
1493 IPv4Interface('192.0.2.1')
1494
1495 Raises:
Sandro Tosib4386d32012-06-02 17:14:22 +02001496 AddressValueError: If ipaddress isn't a valid IPv4 address.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001497 NetmaskValueError: If the netmask isn't valid for
1498 an IPv4 address.
Sandro Tosib4386d32012-06-02 17:14:22 +02001499 ValueError: If strict is True and a network address is not
Nick Coghlandc9b2552012-05-20 21:01:57 +10001500 supplied.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001501 """
Inada Naoki6fa84bd2019-04-16 08:32:28 +09001502 addr, mask = self._split_addr_prefix(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001503
Xiang Zhang10b134a2018-03-21 08:25:13 +08001504 self.network_address = IPv4Address(addr)
1505 self.netmask, self._prefixlen = self._make_netmask(mask)
1506 packed = int(self.network_address)
1507 if packed & int(self.netmask) != packed:
1508 if strict:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001509 raise ValueError('%s has host bits set' % self)
Xiang Zhang10b134a2018-03-21 08:25:13 +08001510 else:
1511 self.network_address = IPv4Address(packed &
1512 int(self.netmask))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001513
1514 if self._prefixlen == (self._max_prefixlen - 1):
1515 self.hosts = self.__iter__
Pete Wicken8e9c47a2020-03-09 22:33:45 +00001516 elif self._prefixlen == (self._max_prefixlen):
1517 self.hosts = lambda: [IPv4Address(addr)]
Nick Coghlandc9b2552012-05-20 21:01:57 +10001518
Peter Moodye5019d52013-10-24 09:47:10 -07001519 @property
1520 @functools.lru_cache()
1521 def is_global(self):
1522 """Test if this address is allocated for public networks.
1523
1524 Returns:
1525 A boolean, True if the address is not reserved per
1526 iana-ipv4-special-registry.
1527
1528 """
1529 return (not (self.network_address in IPv4Network('100.64.0.0/10') and
1530 self.broadcast_address in IPv4Network('100.64.0.0/10')) and
1531 not self.is_private)
1532
1533
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001534class _IPv4Constants:
1535 _linklocal_network = IPv4Network('169.254.0.0/16')
Antoine Pitrouf573ce92014-05-23 23:12:24 +02001536
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001537 _loopback_network = IPv4Network('127.0.0.0/8')
Antoine Pitrouf573ce92014-05-23 23:12:24 +02001538
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001539 _multicast_network = IPv4Network('224.0.0.0/4')
Antoine Pitrouf573ce92014-05-23 23:12:24 +02001540
Berker Peksag742192a2016-06-11 22:11:47 +03001541 _public_network = IPv4Network('100.64.0.0/10')
1542
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001543 _private_networks = [
1544 IPv4Network('0.0.0.0/8'),
1545 IPv4Network('10.0.0.0/8'),
1546 IPv4Network('127.0.0.0/8'),
1547 IPv4Network('169.254.0.0/16'),
1548 IPv4Network('172.16.0.0/12'),
1549 IPv4Network('192.0.0.0/29'),
1550 IPv4Network('192.0.0.170/31'),
1551 IPv4Network('192.0.2.0/24'),
1552 IPv4Network('192.168.0.0/16'),
1553 IPv4Network('198.18.0.0/15'),
1554 IPv4Network('198.51.100.0/24'),
1555 IPv4Network('203.0.113.0/24'),
1556 IPv4Network('240.0.0.0/4'),
1557 IPv4Network('255.255.255.255/32'),
1558 ]
Antoine Pitrouf573ce92014-05-23 23:12:24 +02001559
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001560 _reserved_network = IPv4Network('240.0.0.0/4')
Antoine Pitrouf573ce92014-05-23 23:12:24 +02001561
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001562 _unspecified_address = IPv4Address('0.0.0.0')
1563
1564
1565IPv4Address._constants = _IPv4Constants
Antoine Pitrouf573ce92014-05-23 23:12:24 +02001566
Nick Coghlandc9b2552012-05-20 21:01:57 +10001567
Hynek Schlawackc4b78a32012-06-01 11:48:32 +02001568class _BaseV6:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001569
1570 """Base IPv6 object.
1571
1572 The following methods are used by IPv6 objects in both single IP
1573 addresses and networks.
1574
1575 """
1576
Serhiy Storchaka88f64f32015-03-07 20:08:34 +02001577 __slots__ = ()
1578 _version = 6
Nick Coghlandc9b2552012-05-20 21:01:57 +10001579 _ALL_ONES = (2**IPV6LENGTH) - 1
1580 _HEXTET_COUNT = 8
1581 _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef')
Antoine Pitrou45aba182014-05-15 20:18:41 +02001582 _max_prefixlen = IPV6LENGTH
1583
1584 # There are only a bunch of valid v6 netmasks, so we cache them all
1585 # when constructed (see _make_netmask()).
1586 _netmask_cache = {}
Nick Coghlandc9b2552012-05-20 21:01:57 +10001587
Antoine Pitrou45aba182014-05-15 20:18:41 +02001588 @classmethod
1589 def _make_netmask(cls, arg):
1590 """Make a (netmask, prefix_len) tuple from the given argument.
1591
1592 Argument can be:
1593 - an integer (the prefix length)
1594 - a string representing the prefix length (e.g. "24")
1595 - a string representing the prefix netmask (e.g. "255.255.255.0")
1596 """
1597 if arg not in cls._netmask_cache:
1598 if isinstance(arg, int):
1599 prefixlen = arg
Nicolai Moore5e48e3d2019-05-14 20:32:59 +10001600 if not (0 <= prefixlen <= cls._max_prefixlen):
1601 cls._report_invalid_netmask(prefixlen)
Antoine Pitrou45aba182014-05-15 20:18:41 +02001602 else:
1603 prefixlen = cls._prefix_from_prefix_string(arg)
1604 netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen))
1605 cls._netmask_cache[arg] = netmask, prefixlen
1606 return cls._netmask_cache[arg]
1607
1608 @classmethod
1609 def _ip_int_from_string(cls, ip_str):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001610 """Turn an IPv6 ip_str into an integer.
1611
1612 Args:
1613 ip_str: A string, the IPv6 ip_str.
1614
1615 Returns:
1616 An int, the IPv6 address
1617
1618 Raises:
1619 AddressValueError: if ip_str isn't a valid IPv6 Address.
1620
1621 """
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001622 if not ip_str:
1623 raise AddressValueError('Address cannot be empty')
1624
Nick Coghlandc9b2552012-05-20 21:01:57 +10001625 parts = ip_str.split(':')
1626
1627 # An IPv6 address needs at least 2 colons (3 parts).
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001628 _min_parts = 3
1629 if len(parts) < _min_parts:
1630 msg = "At least %d parts expected in %r" % (_min_parts, ip_str)
1631 raise AddressValueError(msg)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001632
1633 # If the address has an IPv4-style suffix, convert it to hexadecimal.
1634 if '.' in parts[-1]:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001635 try:
1636 ipv4_int = IPv4Address(parts.pop())._ip
1637 except AddressValueError as exc:
1638 raise AddressValueError("%s in %r" % (exc, ip_str)) from None
Nick Coghlandc9b2552012-05-20 21:01:57 +10001639 parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF))
1640 parts.append('%x' % (ipv4_int & 0xFFFF))
1641
1642 # An IPv6 address can't have more than 8 colons (9 parts).
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001643 # The extra colon comes from using the "::" notation for a single
1644 # leading or trailing zero part.
Antoine Pitrou45aba182014-05-15 20:18:41 +02001645 _max_parts = cls._HEXTET_COUNT + 1
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001646 if len(parts) > _max_parts:
1647 msg = "At most %d colons permitted in %r" % (_max_parts-1, ip_str)
1648 raise AddressValueError(msg)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001649
1650 # Disregarding the endpoints, find '::' with nothing in between.
1651 # This indicates that a run of zeroes has been skipped.
Nick Coghlan7319f692012-07-07 21:43:30 +10001652 skip_index = None
1653 for i in range(1, len(parts) - 1):
1654 if not parts[i]:
1655 if skip_index is not None:
1656 # Can't have more than one '::'
1657 msg = "At most one '::' permitted in %r" % ip_str
1658 raise AddressValueError(msg)
1659 skip_index = i
Nick Coghlandc9b2552012-05-20 21:01:57 +10001660
1661 # parts_hi is the number of parts to copy from above/before the '::'
1662 # parts_lo is the number of parts to copy from below/after the '::'
1663 if skip_index is not None:
1664 # If we found a '::', then check if it also covers the endpoints.
1665 parts_hi = skip_index
1666 parts_lo = len(parts) - skip_index - 1
1667 if not parts[0]:
1668 parts_hi -= 1
1669 if parts_hi:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001670 msg = "Leading ':' only permitted as part of '::' in %r"
1671 raise AddressValueError(msg % ip_str) # ^: requires ^::
Nick Coghlandc9b2552012-05-20 21:01:57 +10001672 if not parts[-1]:
1673 parts_lo -= 1
1674 if parts_lo:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001675 msg = "Trailing ':' only permitted as part of '::' in %r"
1676 raise AddressValueError(msg % ip_str) # :$ requires ::$
Antoine Pitrou45aba182014-05-15 20:18:41 +02001677 parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001678 if parts_skipped < 1:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001679 msg = "Expected at most %d other parts with '::' in %r"
Antoine Pitrou45aba182014-05-15 20:18:41 +02001680 raise AddressValueError(msg % (cls._HEXTET_COUNT-1, ip_str))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001681 else:
Hynek Schlawack072b1e12012-05-26 12:04:56 +02001682 # Otherwise, allocate the entire address to parts_hi. The
1683 # endpoints could still be empty, but _parse_hextet() will check
1684 # for that.
Antoine Pitrou45aba182014-05-15 20:18:41 +02001685 if len(parts) != cls._HEXTET_COUNT:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001686 msg = "Exactly %d parts expected without '::' in %r"
Antoine Pitrou45aba182014-05-15 20:18:41 +02001687 raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str))
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001688 if not parts[0]:
1689 msg = "Leading ':' only permitted as part of '::' in %r"
1690 raise AddressValueError(msg % ip_str) # ^: requires ^::
1691 if not parts[-1]:
1692 msg = "Trailing ':' only permitted as part of '::' in %r"
1693 raise AddressValueError(msg % ip_str) # :$ requires ::$
Nick Coghlandc9b2552012-05-20 21:01:57 +10001694 parts_hi = len(parts)
1695 parts_lo = 0
1696 parts_skipped = 0
1697
1698 try:
1699 # Now, parse the hextets into a 128-bit integer.
1700 ip_int = 0
1701 for i in range(parts_hi):
1702 ip_int <<= 16
Antoine Pitrou45aba182014-05-15 20:18:41 +02001703 ip_int |= cls._parse_hextet(parts[i])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001704 ip_int <<= 16 * parts_skipped
1705 for i in range(-parts_lo, 0):
1706 ip_int <<= 16
Antoine Pitrou45aba182014-05-15 20:18:41 +02001707 ip_int |= cls._parse_hextet(parts[i])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001708 return ip_int
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001709 except ValueError as exc:
1710 raise AddressValueError("%s in %r" % (exc, ip_str)) from None
Nick Coghlandc9b2552012-05-20 21:01:57 +10001711
Antoine Pitrou45aba182014-05-15 20:18:41 +02001712 @classmethod
1713 def _parse_hextet(cls, hextet_str):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001714 """Convert an IPv6 hextet string into an integer.
1715
1716 Args:
1717 hextet_str: A string, the number to parse.
1718
1719 Returns:
1720 The hextet as an integer.
1721
1722 Raises:
Hynek Schlawack072b1e12012-05-26 12:04:56 +02001723 ValueError: if the input isn't strictly a hex number from
1724 [0..FFFF].
Nick Coghlandc9b2552012-05-20 21:01:57 +10001725
1726 """
Victor Stinnerfabd7bb2020-08-11 15:26:59 +02001727 # Reject non-ASCII digits.
Antoine Pitrou45aba182014-05-15 20:18:41 +02001728 if not cls._HEX_DIGITS.issuperset(hextet_str):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001729 raise ValueError("Only hex digits permitted in %r" % hextet_str)
Nick Coghlan07c4e332012-07-08 23:06:45 +10001730 # We do the length check second, since the invalid character error
1731 # is likely to be more informative for the user
Nick Coghlan3c2570c2012-07-07 01:13:55 +10001732 if len(hextet_str) > 4:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001733 msg = "At most 4 characters permitted in %r"
1734 raise ValueError(msg % hextet_str)
Nick Coghlan07c4e332012-07-08 23:06:45 +10001735 # Length check means we can skip checking the integer value
1736 return int(hextet_str, 16)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001737
Antoine Pitrou45aba182014-05-15 20:18:41 +02001738 @classmethod
1739 def _compress_hextets(cls, hextets):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001740 """Compresses a list of hextets.
1741
1742 Compresses a list of strings, replacing the longest continuous
1743 sequence of "0" in the list with "" and adding empty strings at
1744 the beginning or at the end of the string such that subsequently
1745 calling ":".join(hextets) will produce the compressed version of
1746 the IPv6 address.
1747
1748 Args:
1749 hextets: A list of strings, the hextets to compress.
1750
1751 Returns:
1752 A list of strings.
1753
1754 """
1755 best_doublecolon_start = -1
1756 best_doublecolon_len = 0
1757 doublecolon_start = -1
1758 doublecolon_len = 0
Nick Coghlandb7920b2012-08-20 10:19:12 +10001759 for index, hextet in enumerate(hextets):
1760 if hextet == '0':
Nick Coghlandc9b2552012-05-20 21:01:57 +10001761 doublecolon_len += 1
1762 if doublecolon_start == -1:
1763 # Start of a sequence of zeros.
1764 doublecolon_start = index
1765 if doublecolon_len > best_doublecolon_len:
1766 # This is the longest sequence of zeros so far.
1767 best_doublecolon_len = doublecolon_len
1768 best_doublecolon_start = doublecolon_start
1769 else:
1770 doublecolon_len = 0
1771 doublecolon_start = -1
1772
1773 if best_doublecolon_len > 1:
1774 best_doublecolon_end = (best_doublecolon_start +
1775 best_doublecolon_len)
1776 # For zeros at the end of the address.
1777 if best_doublecolon_end == len(hextets):
1778 hextets += ['']
1779 hextets[best_doublecolon_start:best_doublecolon_end] = ['']
1780 # For zeros at the beginning of the address.
1781 if best_doublecolon_start == 0:
1782 hextets = [''] + hextets
1783
1784 return hextets
1785
Antoine Pitrou45aba182014-05-15 20:18:41 +02001786 @classmethod
1787 def _string_from_ip_int(cls, ip_int=None):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001788 """Turns a 128-bit integer into hexadecimal notation.
1789
1790 Args:
1791 ip_int: An integer, the IP address.
1792
1793 Returns:
1794 A string, the hexadecimal representation of the address.
1795
1796 Raises:
1797 ValueError: The address is bigger than 128 bits of all ones.
1798
1799 """
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001800 if ip_int is None:
Antoine Pitrou45aba182014-05-15 20:18:41 +02001801 ip_int = int(cls._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001802
Antoine Pitrou45aba182014-05-15 20:18:41 +02001803 if ip_int > cls._ALL_ONES:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001804 raise ValueError('IPv6 address is too large')
1805
1806 hex_str = '%032x' % ip_int
Nick Coghlan7319f692012-07-07 21:43:30 +10001807 hextets = ['%x' % int(hex_str[x:x+4], 16) for x in range(0, 32, 4)]
Nick Coghlandc9b2552012-05-20 21:01:57 +10001808
Antoine Pitrou45aba182014-05-15 20:18:41 +02001809 hextets = cls._compress_hextets(hextets)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001810 return ':'.join(hextets)
1811
1812 def _explode_shorthand_ip_string(self):
1813 """Expand a shortened IPv6 address.
1814
1815 Args:
1816 ip_str: A string, the IPv6 address.
1817
1818 Returns:
1819 A string, the expanded IPv6 address.
1820
1821 """
1822 if isinstance(self, IPv6Network):
1823 ip_str = str(self.network_address)
1824 elif isinstance(self, IPv6Interface):
1825 ip_str = str(self.ip)
1826 else:
1827 ip_str = str(self)
1828
1829 ip_int = self._ip_int_from_string(ip_str)
Nick Coghlan7319f692012-07-07 21:43:30 +10001830 hex_str = '%032x' % ip_int
1831 parts = [hex_str[x:x+4] for x in range(0, 32, 4)]
Nick Coghlandc9b2552012-05-20 21:01:57 +10001832 if isinstance(self, (_BaseNetwork, IPv6Interface)):
Nick Coghlane3ded952012-08-05 22:45:22 +10001833 return '%s/%d' % (':'.join(parts), self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001834 return ':'.join(parts)
1835
Eric V. Smithebdaaf42014-04-14 12:58:07 -04001836 def _reverse_pointer(self):
1837 """Return the reverse DNS pointer name for the IPv6 address.
1838
1839 This implements the method described in RFC3596 2.5.
1840
1841 """
1842 reverse_chars = self.exploded[::-1].replace(':', '')
1843 return '.'.join(reverse_chars) + '.ip6.arpa'
1844
opavlyuk21da76d2020-02-26 16:33:57 +02001845 @staticmethod
1846 def _split_scope_id(ip_str):
1847 """Helper function to parse IPv6 string address with scope id.
1848
1849 See RFC 4007 for details.
1850
1851 Args:
1852 ip_str: A string, the IPv6 address.
1853
1854 Returns:
1855 (addr, scope_id) tuple.
1856
1857 """
1858 addr, sep, scope_id = ip_str.partition('%')
1859 if not sep:
1860 scope_id = None
1861 elif not scope_id or '%' in scope_id:
1862 raise AddressValueError('Invalid IPv6 address: "%r"' % ip_str)
1863 return addr, scope_id
1864
Nick Coghlandc9b2552012-05-20 21:01:57 +10001865 @property
1866 def max_prefixlen(self):
1867 return self._max_prefixlen
1868
1869 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +10001870 def version(self):
1871 return self._version
1872
Nick Coghlandc9b2552012-05-20 21:01:57 +10001873
1874class IPv6Address(_BaseV6, _BaseAddress):
1875
Sandro Tosib95c6342012-05-23 23:17:22 +02001876 """Represent and manipulate single IPv6 Addresses."""
Nick Coghlandc9b2552012-05-20 21:01:57 +10001877
opavlyuk21da76d2020-02-26 16:33:57 +02001878 __slots__ = ('_ip', '_scope_id', '__weakref__')
Serhiy Storchaka88f64f32015-03-07 20:08:34 +02001879
Nick Coghlandc9b2552012-05-20 21:01:57 +10001880 def __init__(self, address):
1881 """Instantiate a new IPv6 address object.
1882
1883 Args:
1884 address: A string or integer representing the IP
1885
1886 Additionally, an integer can be passed, so
1887 IPv6Address('2001:db8::') ==
1888 IPv6Address(42540766411282592856903984951653826560)
1889 or, more generally
1890 IPv6Address(int(IPv6Address('2001:db8::'))) ==
1891 IPv6Address('2001:db8::')
1892
1893 Raises:
1894 AddressValueError: If address isn't a valid IPv6 address.
1895
1896 """
Nick Coghlandc9b2552012-05-20 21:01:57 +10001897 # Efficient constructor from integer.
1898 if isinstance(address, int):
Nick Coghlan297b1432012-07-08 17:11:04 +10001899 self._check_int_address(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001900 self._ip = address
opavlyuk21da76d2020-02-26 16:33:57 +02001901 self._scope_id = None
Nick Coghlandc9b2552012-05-20 21:01:57 +10001902 return
1903
1904 # Constructing from a packed address
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001905 if isinstance(address, bytes):
Nick Coghlan297b1432012-07-08 17:11:04 +10001906 self._check_packed_address(address, 16)
Nick Coghlandb7920b2012-08-20 10:19:12 +10001907 self._ip = int.from_bytes(address, 'big')
opavlyuk21da76d2020-02-26 16:33:57 +02001908 self._scope_id = None
Nick Coghlandc9b2552012-05-20 21:01:57 +10001909 return
1910
1911 # Assume input argument to be string or any object representation
1912 # which converts into a formatted IP string.
1913 addr_str = str(address)
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +02001914 if '/' in addr_str:
1915 raise AddressValueError("Unexpected '/' in %r" % address)
opavlyuk21da76d2020-02-26 16:33:57 +02001916 addr_str, self._scope_id = self._split_scope_id(addr_str)
1917
Nick Coghlandc9b2552012-05-20 21:01:57 +10001918 self._ip = self._ip_int_from_string(addr_str)
1919
opavlyuk21da76d2020-02-26 16:33:57 +02001920 def __str__(self):
1921 ip_str = super().__str__()
1922 return ip_str + '%' + self._scope_id if self._scope_id else ip_str
1923
1924 def __hash__(self):
1925 return hash((self._ip, self._scope_id))
1926
1927 def __eq__(self, other):
1928 address_equal = super().__eq__(other)
1929 if address_equal is NotImplemented:
1930 return NotImplemented
1931 if not address_equal:
1932 return False
1933 return self._scope_id == getattr(other, '_scope_id', None)
1934
1935 @property
1936 def scope_id(self):
1937 """Identifier of a particular zone of the address's scope.
1938
1939 See RFC 4007 for details.
1940
1941 Returns:
1942 A string identifying the zone of the address if specified, else None.
1943
1944 """
1945 return self._scope_id
1946
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001947 @property
1948 def packed(self):
1949 """The binary representation of this address."""
1950 return v6_int_to_packed(self._ip)
1951
Nick Coghlan730f67f2012-08-05 22:02:18 +10001952 @property
1953 def is_multicast(self):
1954 """Test if the address is reserved for multicast use.
1955
1956 Returns:
1957 A boolean, True if the address is a multicast address.
1958 See RFC 2373 2.7 for details.
1959
1960 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001961 return self in self._constants._multicast_network
Nick Coghlan730f67f2012-08-05 22:02:18 +10001962
1963 @property
1964 def is_reserved(self):
1965 """Test if the address is otherwise IETF reserved.
1966
1967 Returns:
1968 A boolean, True if the address is within one of the
1969 reserved IPv6 Network ranges.
1970
1971 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001972 return any(self in x for x in self._constants._reserved_networks)
Nick Coghlan730f67f2012-08-05 22:02:18 +10001973
1974 @property
1975 def is_link_local(self):
1976 """Test if the address is reserved for link-local.
1977
1978 Returns:
1979 A boolean, True if the address is reserved per RFC 4291.
1980
1981 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001982 return self in self._constants._linklocal_network
Nick Coghlan730f67f2012-08-05 22:02:18 +10001983
1984 @property
1985 def is_site_local(self):
1986 """Test if the address is reserved for site-local.
1987
1988 Note that the site-local address space has been deprecated by RFC 3879.
1989 Use is_private to test if this address is in the space of unique local
1990 addresses as defined by RFC 4193.
1991
1992 Returns:
1993 A boolean, True if the address is reserved per RFC 3513 2.5.6.
1994
1995 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001996 return self in self._constants._sitelocal_network
Nick Coghlan730f67f2012-08-05 22:02:18 +10001997
1998 @property
Peter Moodybe9c1b12013-10-22 12:36:21 -07001999 @functools.lru_cache()
Nick Coghlan730f67f2012-08-05 22:02:18 +10002000 def is_private(self):
2001 """Test if this address is allocated for private networks.
2002
2003 Returns:
Peter Moody22c31762013-10-21 13:58:06 -07002004 A boolean, True if the address is reserved per
2005 iana-ipv6-special-registry.
Nick Coghlan730f67f2012-08-05 22:02:18 +10002006
2007 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02002008 return any(self in net for net in self._constants._private_networks)
Peter Moody22c31762013-10-21 13:58:06 -07002009
2010 @property
2011 def is_global(self):
2012 """Test if this address is allocated for public networks.
2013
2014 Returns:
2015 A boolean, true if the address is not reserved per
2016 iana-ipv6-special-registry.
2017
2018 """
2019 return not self.is_private
Nick Coghlan730f67f2012-08-05 22:02:18 +10002020
2021 @property
2022 def is_unspecified(self):
2023 """Test if the address is unspecified.
2024
2025 Returns:
2026 A boolean, True if this is the unspecified address as defined in
2027 RFC 2373 2.5.2.
2028
2029 """
2030 return self._ip == 0
2031
2032 @property
2033 def is_loopback(self):
2034 """Test if the address is a loopback address.
2035
2036 Returns:
2037 A boolean, True if the address is a loopback address as defined in
2038 RFC 2373 2.5.3.
2039
2040 """
2041 return self._ip == 1
2042
2043 @property
2044 def ipv4_mapped(self):
2045 """Return the IPv4 mapped address.
2046
2047 Returns:
2048 If the IPv6 address is a v4 mapped address, return the
2049 IPv4 mapped address. Return None otherwise.
2050
2051 """
2052 if (self._ip >> 32) != 0xFFFF:
2053 return None
2054 return IPv4Address(self._ip & 0xFFFFFFFF)
2055
2056 @property
2057 def teredo(self):
2058 """Tuple of embedded teredo IPs.
2059
2060 Returns:
2061 Tuple of the (server, client) IPs or None if the address
2062 doesn't appear to be a teredo address (doesn't start with
2063 2001::/32)
2064
2065 """
2066 if (self._ip >> 96) != 0x20010000:
2067 return None
2068 return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF),
2069 IPv4Address(~self._ip & 0xFFFFFFFF))
2070
2071 @property
2072 def sixtofour(self):
2073 """Return the IPv4 6to4 embedded address.
2074
2075 Returns:
2076 The IPv4 6to4-embedded address if present or None if the
2077 address doesn't appear to contain a 6to4 embedded address.
2078
2079 """
2080 if (self._ip >> 112) != 0x2002:
2081 return None
2082 return IPv4Address((self._ip >> 80) & 0xFFFFFFFF)
2083
Nick Coghlandc9b2552012-05-20 21:01:57 +10002084
2085class IPv6Interface(IPv6Address):
2086
2087 def __init__(self, address):
Inada Naoki6fa84bd2019-04-16 08:32:28 +09002088 addr, mask = self._split_addr_prefix(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002089
Inada Naoki6fa84bd2019-04-16 08:32:28 +09002090 IPv6Address.__init__(self, addr)
2091 self.network = IPv6Network((addr, mask), strict=False)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002092 self.netmask = self.network.netmask
2093 self._prefixlen = self.network._prefixlen
Inada Naoki6fa84bd2019-04-16 08:32:28 +09002094
2095 @functools.cached_property
2096 def hostmask(self):
2097 return self.network.hostmask
Nick Coghlandc9b2552012-05-20 21:01:57 +10002098
Nick Coghlandc9b2552012-05-20 21:01:57 +10002099 def __str__(self):
opavlyuk21da76d2020-02-26 16:33:57 +02002100 return '%s/%d' % (super().__str__(),
Inada Naoki2430d532019-04-15 16:01:00 +09002101 self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002102
2103 def __eq__(self, other):
Nick Coghlan3008ec02012-07-08 00:45:33 +10002104 address_equal = IPv6Address.__eq__(self, other)
MojoVampire469325c2020-03-03 18:50:17 +00002105 if address_equal is NotImplemented or not address_equal:
Nick Coghlan3008ec02012-07-08 00:45:33 +10002106 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:
MojoVampire469325c2020-03-03 18:50:17 +00002118 return address_less
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):
Ravi Teja Pb30ee262020-06-29 23:09:29 +05302128 return hash((self._ip, self._prefixlen, int(self.network.network_address)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10002129
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.
Nick Coghlandc9b2552012-05-20 21:01:57 +10002206 """
Inada Naoki6fa84bd2019-04-16 08:32:28 +09002207 addr, mask = self._split_addr_prefix(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002208
Xiang Zhang10b134a2018-03-21 08:25:13 +08002209 self.network_address = IPv6Address(addr)
2210 self.netmask, self._prefixlen = self._make_netmask(mask)
2211 packed = int(self.network_address)
2212 if packed & int(self.netmask) != packed:
2213 if strict:
Nick Coghlan912238e2012-07-07 13:34:50 +10002214 raise ValueError('%s has host bits set' % self)
Xiang Zhang10b134a2018-03-21 08:25:13 +08002215 else:
2216 self.network_address = IPv6Address(packed &
2217 int(self.netmask))
Nick Coghlandc9b2552012-05-20 21:01:57 +10002218
2219 if self._prefixlen == (self._max_prefixlen - 1):
2220 self.hosts = self.__iter__
Pete Wicken8e9c47a2020-03-09 22:33:45 +00002221 elif self._prefixlen == self._max_prefixlen:
2222 self.hosts = lambda: [IPv6Address(addr)]
Nick Coghlandc9b2552012-05-20 21:01:57 +10002223
Peter Moody1243c7d2014-03-11 09:55:46 -07002224 def hosts(self):
2225 """Generate Iterator over usable hosts in a network.
2226
2227 This is like __iter__ except it doesn't return the
2228 Subnet-Router anycast address.
2229
2230 """
2231 network = int(self.network_address)
2232 broadcast = int(self.broadcast_address)
2233 for x in range(network + 1, broadcast + 1):
2234 yield self._address_class(x)
2235
Nick Coghlan730f67f2012-08-05 22:02:18 +10002236 @property
2237 def is_site_local(self):
2238 """Test if the address is reserved for site-local.
2239
2240 Note that the site-local address space has been deprecated by RFC 3879.
2241 Use is_private to test if this address is in the space of unique local
2242 addresses as defined by RFC 4193.
2243
2244 Returns:
2245 A boolean, True if the address is reserved per RFC 3513 2.5.6.
2246
2247 """
2248 return (self.network_address.is_site_local and
2249 self.broadcast_address.is_site_local)
Antoine Pitrouf573ce92014-05-23 23:12:24 +02002250
2251
Antoine Pitroub19e75d2014-05-24 00:32:29 +02002252class _IPv6Constants:
Antoine Pitrouf573ce92014-05-23 23:12:24 +02002253
Antoine Pitroub19e75d2014-05-24 00:32:29 +02002254 _linklocal_network = IPv6Network('fe80::/10')
Antoine Pitrouf573ce92014-05-23 23:12:24 +02002255
Antoine Pitroub19e75d2014-05-24 00:32:29 +02002256 _multicast_network = IPv6Network('ff00::/8')
2257
2258 _private_networks = [
2259 IPv6Network('::1/128'),
2260 IPv6Network('::/128'),
2261 IPv6Network('::ffff:0:0/96'),
2262 IPv6Network('100::/64'),
2263 IPv6Network('2001::/23'),
2264 IPv6Network('2001:2::/48'),
2265 IPv6Network('2001:db8::/32'),
2266 IPv6Network('2001:10::/28'),
2267 IPv6Network('fc00::/7'),
2268 IPv6Network('fe80::/10'),
2269 ]
2270
2271 _reserved_networks = [
2272 IPv6Network('::/8'), IPv6Network('100::/8'),
2273 IPv6Network('200::/7'), IPv6Network('400::/6'),
2274 IPv6Network('800::/5'), IPv6Network('1000::/4'),
2275 IPv6Network('4000::/3'), IPv6Network('6000::/3'),
2276 IPv6Network('8000::/3'), IPv6Network('A000::/3'),
2277 IPv6Network('C000::/3'), IPv6Network('E000::/4'),
2278 IPv6Network('F000::/5'), IPv6Network('F800::/6'),
2279 IPv6Network('FE00::/9'),
Antoine Pitrouf573ce92014-05-23 23:12:24 +02002280 ]
2281
Antoine Pitroub19e75d2014-05-24 00:32:29 +02002282 _sitelocal_network = IPv6Network('fec0::/10')
Antoine Pitrouf573ce92014-05-23 23:12:24 +02002283
Antoine Pitroub19e75d2014-05-24 00:32:29 +02002284
2285IPv6Address._constants = _IPv6Constants