blob: 439f2418174686e51aedf78b38f7c0c46b3546ff [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
Batuhan Taşkaya2fa67df2020-04-10 07:04:54 +030015import types
Hynek Schlawack91c5a342012-06-05 11:55:58 +020016
Nick Coghlandc9b2552012-05-20 21:01:57 +100017IPV4LENGTH = 32
18IPV6LENGTH = 128
19
Nick Coghlandc9b2552012-05-20 21:01:57 +100020class AddressValueError(ValueError):
21 """A Value Error related to the address."""
22
23
24class NetmaskValueError(ValueError):
25 """A Value Error related to the netmask."""
26
27
Nick Coghlan51c30672012-05-27 00:25:58 +100028def ip_address(address):
Nick Coghlandc9b2552012-05-20 21:01:57 +100029 """Take an IP string/int and return an object of the correct type.
30
31 Args:
32 address: A string or integer, the IP address. Either IPv4 or
33 IPv6 addresses may be supplied; integers less than 2**32 will
34 be considered to be IPv4 by default.
Nick Coghlandc9b2552012-05-20 21:01:57 +100035
36 Returns:
37 An IPv4Address or IPv6Address object.
38
39 Raises:
Sandro Tosi876ecad2012-05-23 22:26:55 +020040 ValueError: if the *address* passed isn't either a v4 or a v6
Nick Coghlan51c30672012-05-27 00:25:58 +100041 address
Nick Coghlandc9b2552012-05-20 21:01:57 +100042
43 """
Nick Coghlandc9b2552012-05-20 21:01:57 +100044 try:
45 return IPv4Address(address)
46 except (AddressValueError, NetmaskValueError):
47 pass
48
49 try:
50 return IPv6Address(address)
51 except (AddressValueError, NetmaskValueError):
52 pass
53
54 raise ValueError('%r does not appear to be an IPv4 or IPv6 address' %
55 address)
56
57
Nick Coghlan51c30672012-05-27 00:25:58 +100058def ip_network(address, strict=True):
Nick Coghlandc9b2552012-05-20 21:01:57 +100059 """Take an IP string/int and return an object of the correct type.
60
61 Args:
62 address: A string or integer, the IP network. Either IPv4 or
63 IPv6 networks may be supplied; integers less than 2**32 will
64 be considered to be IPv4 by default.
Nick Coghlandc9b2552012-05-20 21:01:57 +100065
66 Returns:
67 An IPv4Network or IPv6Network object.
68
69 Raises:
70 ValueError: if the string passed isn't either a v4 or a v6
Nick Coghlan51c30672012-05-27 00:25:58 +100071 address. Or if the network has host bits set.
Nick Coghlandc9b2552012-05-20 21:01:57 +100072
73 """
Nick Coghlandc9b2552012-05-20 21:01:57 +100074 try:
75 return IPv4Network(address, strict)
76 except (AddressValueError, NetmaskValueError):
77 pass
78
79 try:
80 return IPv6Network(address, strict)
81 except (AddressValueError, NetmaskValueError):
82 pass
83
84 raise ValueError('%r does not appear to be an IPv4 or IPv6 network' %
85 address)
86
87
Nick Coghlan51c30672012-05-27 00:25:58 +100088def ip_interface(address):
Nick Coghlandc9b2552012-05-20 21:01:57 +100089 """Take an IP string/int and return an object of the correct type.
90
91 Args:
92 address: A string or integer, the IP address. Either IPv4 or
93 IPv6 addresses may be supplied; integers less than 2**32 will
94 be considered to be IPv4 by default.
Nick Coghlandc9b2552012-05-20 21:01:57 +100095
96 Returns:
Sandro Tosi876ecad2012-05-23 22:26:55 +020097 An IPv4Interface or IPv6Interface object.
Nick Coghlandc9b2552012-05-20 21:01:57 +100098
99 Raises:
100 ValueError: if the string passed isn't either a v4 or a v6
Nick Coghlan51c30672012-05-27 00:25:58 +1000101 address.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000102
103 Notes:
104 The IPv?Interface classes describe an Address on a particular
105 Network, so they're basically a combination of both the Address
106 and Network classes.
Sandro Tosib95c6342012-05-23 23:17:22 +0200107
Nick Coghlandc9b2552012-05-20 21:01:57 +1000108 """
Nick Coghlandc9b2552012-05-20 21:01:57 +1000109 try:
110 return IPv4Interface(address)
111 except (AddressValueError, NetmaskValueError):
112 pass
113
114 try:
115 return IPv6Interface(address)
116 except (AddressValueError, NetmaskValueError):
117 pass
118
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000119 raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' %
Nick Coghlandc9b2552012-05-20 21:01:57 +1000120 address)
121
122
123def v4_int_to_packed(address):
Sandro Tosi876ecad2012-05-23 22:26:55 +0200124 """Represent an address as 4 packed bytes in network (big-endian) order.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000125
126 Args:
127 address: An integer representation of an IPv4 IP address.
128
129 Returns:
Sandro Tosi876ecad2012-05-23 22:26:55 +0200130 The integer address packed as 4 bytes in network (big-endian) order.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000131
132 Raises:
Sandro Tosi876ecad2012-05-23 22:26:55 +0200133 ValueError: If the integer is negative or too large to be an
134 IPv4 IP address.
Sandro Tosib95c6342012-05-23 23:17:22 +0200135
Nick Coghlandc9b2552012-05-20 21:01:57 +1000136 """
Sandro Tosi876ecad2012-05-23 22:26:55 +0200137 try:
Nick Coghlandb7920b2012-08-20 10:19:12 +1000138 return address.to_bytes(4, 'big')
Serhiy Storchakaba9ac5b2015-05-20 10:33:40 +0300139 except OverflowError:
Sandro Tosi876ecad2012-05-23 22:26:55 +0200140 raise ValueError("Address negative or too large for IPv4")
Nick Coghlandc9b2552012-05-20 21:01:57 +1000141
142
143def v6_int_to_packed(address):
Sandro Tosi876ecad2012-05-23 22:26:55 +0200144 """Represent an address as 16 packed bytes in network (big-endian) order.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000145
146 Args:
Sandro Tosib4386d32012-06-02 17:14:22 +0200147 address: An integer representation of an IPv6 IP address.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000148
149 Returns:
Sandro Tosi876ecad2012-05-23 22:26:55 +0200150 The integer address packed as 16 bytes in network (big-endian) order.
Sandro Tosib95c6342012-05-23 23:17:22 +0200151
Nick Coghlandc9b2552012-05-20 21:01:57 +1000152 """
Sandro Tosi876ecad2012-05-23 22:26:55 +0200153 try:
Nick Coghlandb7920b2012-08-20 10:19:12 +1000154 return address.to_bytes(16, 'big')
Serhiy Storchakaba9ac5b2015-05-20 10:33:40 +0300155 except OverflowError:
Sandro Tosi876ecad2012-05-23 22:26:55 +0200156 raise ValueError("Address negative or too large for IPv6")
Nick Coghlandc9b2552012-05-20 21:01:57 +1000157
158
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000159def _split_optional_netmask(address):
160 """Helper to split the netmask and raise AddressValueError if needed"""
161 addr = str(address).split('/')
162 if len(addr) > 2:
163 raise AddressValueError("Only one '/' permitted in %r" % address)
164 return addr
165
Nick Coghlan297b1432012-07-08 17:11:04 +1000166
Nick Coghlandc9b2552012-05-20 21:01:57 +1000167def _find_address_range(addresses):
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +0200168 """Find a sequence of sorted deduplicated IPv#Address.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000169
170 Args:
Sandro Tosi876ecad2012-05-23 22:26:55 +0200171 addresses: a list of IPv#Address objects.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000172
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +0200173 Yields:
174 A tuple containing the first and last IP addresses in the sequence.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000175
176 """
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +0200177 it = iter(addresses)
178 first = last = next(it)
179 for ip in it:
180 if ip._ip != last._ip + 1:
181 yield first, last
182 first = ip
183 last = ip
184 yield first, last
Nick Coghlandc9b2552012-05-20 21:01:57 +1000185
Sandro Tosib95c6342012-05-23 23:17:22 +0200186
Nick Coghlandc9b2552012-05-20 21:01:57 +1000187def _count_righthand_zero_bits(number, bits):
188 """Count the number of zero bits on the right hand side.
189
190 Args:
191 number: an integer.
192 bits: maximum number of bits to count.
193
194 Returns:
195 The number of zero bits on the right hand side of the number.
196
197 """
198 if number == 0:
199 return bits
Antoine Pitrou824db302014-05-15 20:21:48 +0200200 return min(bits, (~number & (number-1)).bit_length())
Nick Coghlandc9b2552012-05-20 21:01:57 +1000201
202
203def summarize_address_range(first, last):
204 """Summarize a network range given the first and last IP addresses.
205
206 Example:
Eli Bendersky948af232012-10-07 07:23:50 -0700207 >>> list(summarize_address_range(IPv4Address('192.0.2.0'),
208 ... IPv4Address('192.0.2.130')))
209 ... #doctest: +NORMALIZE_WHITESPACE
Nick Coghlandc9b2552012-05-20 21:01:57 +1000210 [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'),
Eli Bendersky948af232012-10-07 07:23:50 -0700211 IPv4Network('192.0.2.130/32')]
Nick Coghlandc9b2552012-05-20 21:01:57 +1000212
213 Args:
214 first: the first IPv4Address or IPv6Address in the range.
215 last: the last IPv4Address or IPv6Address in the range.
216
217 Returns:
218 An iterator of the summarized IPv(4|6) network objects.
219
220 Raise:
221 TypeError:
222 If the first and last objects are not IP addresses.
223 If the first and last objects are not the same version.
224 ValueError:
225 If the last object is not greater than the first.
Nick Coghlan51c30672012-05-27 00:25:58 +1000226 If the version of the first address is not 4 or 6.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000227
228 """
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200229 if (not (isinstance(first, _BaseAddress) and
230 isinstance(last, _BaseAddress))):
Nick Coghlandc9b2552012-05-20 21:01:57 +1000231 raise TypeError('first and last must be IP addresses, not networks')
232 if first.version != last.version:
233 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000234 first, last))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000235 if first > last:
236 raise ValueError('last IP address must be greater than first')
237
Nick Coghlandc9b2552012-05-20 21:01:57 +1000238 if first.version == 4:
239 ip = IPv4Network
240 elif first.version == 6:
241 ip = IPv6Network
242 else:
243 raise ValueError('unknown IP version')
244
245 ip_bits = first._max_prefixlen
246 first_int = first._ip
247 last_int = last._ip
248 while first_int <= last_int:
Nick Coghlan7319f692012-07-07 21:43:30 +1000249 nbits = min(_count_righthand_zero_bits(first_int, ip_bits),
250 (last_int - first_int + 1).bit_length() - 1)
Antoine Pitrou824db302014-05-15 20:21:48 +0200251 net = ip((first_int, ip_bits - nbits))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000252 yield net
Nick Coghlan7319f692012-07-07 21:43:30 +1000253 first_int += 1 << nbits
254 if first_int - 1 == ip._ALL_ONES:
Nick Coghlandc9b2552012-05-20 21:01:57 +1000255 break
Nick Coghlandc9b2552012-05-20 21:01:57 +1000256
Sandro Tosib95c6342012-05-23 23:17:22 +0200257
Antoine Pitrou1e71c532014-05-15 20:40:53 +0200258def _collapse_addresses_internal(addresses):
Nick Coghlandc9b2552012-05-20 21:01:57 +1000259 """Loops through the addresses, collapsing concurrent netblocks.
260
261 Example:
262
263 ip1 = IPv4Network('192.0.2.0/26')
264 ip2 = IPv4Network('192.0.2.64/26')
265 ip3 = IPv4Network('192.0.2.128/26')
266 ip4 = IPv4Network('192.0.2.192/26')
267
Antoine Pitrou1e71c532014-05-15 20:40:53 +0200268 _collapse_addresses_internal([ip1, ip2, ip3, ip4]) ->
Nick Coghlandc9b2552012-05-20 21:01:57 +1000269 [IPv4Network('192.0.2.0/24')]
270
271 This shouldn't be called directly; it is called via
272 collapse_addresses([]).
273
274 Args:
275 addresses: A list of IPv4Network's or IPv6Network's
276
277 Returns:
278 A list of IPv4Network's or IPv6Network's depending on what we were
279 passed.
280
281 """
Antoine Pitrou1e71c532014-05-15 20:40:53 +0200282 # First merge
283 to_merge = list(addresses)
284 subnets = {}
285 while to_merge:
286 net = to_merge.pop()
287 supernet = net.supernet()
288 existing = subnets.get(supernet)
289 if existing is None:
290 subnets[supernet] = net
291 elif existing != net:
292 # Merge consecutive subnets
293 del subnets[supernet]
294 to_merge.append(supernet)
295 # Then iterate over resulting networks, skipping subsumed subnets
296 last = None
297 for net in sorted(subnets.values()):
298 if last is not None:
299 # Since they are sorted, last.network_address <= net.network_address
300 # is a given.
301 if last.broadcast_address >= net.broadcast_address:
302 continue
303 yield net
304 last = net
Nick Coghlandc9b2552012-05-20 21:01:57 +1000305
306
307def collapse_addresses(addresses):
308 """Collapse a list of IP objects.
309
310 Example:
311 collapse_addresses([IPv4Network('192.0.2.0/25'),
312 IPv4Network('192.0.2.128/25')]) ->
313 [IPv4Network('192.0.2.0/24')]
314
315 Args:
316 addresses: An iterator of IPv4Network or IPv6Network objects.
317
318 Returns:
319 An iterator of the collapsed IPv(4|6)Network objects.
320
321 Raises:
322 TypeError: If passed a list of mixed version objects.
323
324 """
Nick Coghlandc9b2552012-05-20 21:01:57 +1000325 addrs = []
326 ips = []
327 nets = []
328
329 # split IP addresses and networks
330 for ip in addresses:
331 if isinstance(ip, _BaseAddress):
332 if ips and ips[-1]._version != ip._version:
333 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000334 ip, ips[-1]))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000335 ips.append(ip)
336 elif ip._prefixlen == ip._max_prefixlen:
337 if ips and ips[-1]._version != ip._version:
338 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000339 ip, ips[-1]))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000340 try:
341 ips.append(ip.ip)
342 except AttributeError:
343 ips.append(ip.network_address)
344 else:
345 if nets and nets[-1]._version != ip._version:
346 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000347 ip, nets[-1]))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000348 nets.append(ip)
349
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +0200350 # sort and dedup
351 ips = sorted(set(ips))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000352
Antoine Pitroue6f250e2015-01-18 16:22:47 +0100353 # find consecutive address ranges in the sorted sequence and summarize them
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +0200354 if ips:
355 for first, last in _find_address_range(ips):
356 addrs.extend(summarize_address_range(first, last))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000357
Antoine Pitrou1e71c532014-05-15 20:40:53 +0200358 return _collapse_addresses_internal(addrs + nets)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000359
360
361def get_mixed_type_key(obj):
362 """Return a key suitable for sorting between networks and addresses.
363
364 Address and Network objects are not sortable by default; they're
365 fundamentally different so the expression
366
367 IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')
368
369 doesn't make any sense. There are some times however, where you may wish
370 to have ipaddress sort these for you anyway. If you need to do this, you
371 can use this function as the key= argument to sorted().
372
373 Args:
374 obj: either a Network or Address object.
375 Returns:
376 appropriate key.
377
378 """
379 if isinstance(obj, _BaseNetwork):
380 return obj._get_networks_key()
381 elif isinstance(obj, _BaseAddress):
382 return obj._get_address_key()
383 return NotImplemented
384
385
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200386class _IPAddressBase:
Nick Coghlandc9b2552012-05-20 21:01:57 +1000387
388 """The mother class."""
389
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200390 __slots__ = ()
391
Nick Coghlandc9b2552012-05-20 21:01:57 +1000392 @property
393 def exploded(self):
394 """Return the longhand version of the IP address as a string."""
395 return self._explode_shorthand_ip_string()
396
397 @property
398 def compressed(self):
399 """Return the shorthand version of the IP address as a string."""
400 return str(self)
401
Nick Coghland9722652012-06-17 16:33:00 +1000402 @property
Eric V. Smithebdaaf42014-04-14 12:58:07 -0400403 def reverse_pointer(self):
404 """The name of the reverse DNS pointer for the IP address, e.g.:
405 >>> ipaddress.ip_address("127.0.0.1").reverse_pointer
406 '1.0.0.127.in-addr.arpa'
407 >>> ipaddress.ip_address("2001:db8::1").reverse_pointer
408 '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'
409
410 """
411 return self._reverse_pointer()
412
413 @property
Nick Coghland9722652012-06-17 16:33:00 +1000414 def version(self):
415 msg = '%200s has no version specified' % (type(self),)
416 raise NotImplementedError(msg)
417
Nick Coghlan297b1432012-07-08 17:11:04 +1000418 def _check_int_address(self, address):
419 if address < 0:
420 msg = "%d (< 0) is not permitted as an IPv%d address"
421 raise AddressValueError(msg % (address, self._version))
422 if address > self._ALL_ONES:
423 msg = "%d (>= 2**%d) is not permitted as an IPv%d address"
424 raise AddressValueError(msg % (address, self._max_prefixlen,
425 self._version))
426
427 def _check_packed_address(self, address, expected_len):
428 address_len = len(address)
429 if address_len != expected_len:
430 msg = "%r (len %d != %d) is not permitted as an IPv%d address"
431 raise AddressValueError(msg % (address, address_len,
432 expected_len, self._version))
433
Antoine Pitrou45aba182014-05-15 20:18:41 +0200434 @classmethod
435 def _ip_int_from_prefix(cls, prefixlen):
Nick Coghlan932346f2014-02-08 23:17:36 +1000436 """Turn the prefix length into a bitwise netmask
Nick Coghlandc9b2552012-05-20 21:01:57 +1000437
438 Args:
439 prefixlen: An integer, the prefix length.
440
441 Returns:
442 An integer.
443
444 """
Antoine Pitrou45aba182014-05-15 20:18:41 +0200445 return cls._ALL_ONES ^ (cls._ALL_ONES >> prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000446
Antoine Pitrou45aba182014-05-15 20:18:41 +0200447 @classmethod
448 def _prefix_from_ip_int(cls, ip_int):
Nick Coghlan932346f2014-02-08 23:17:36 +1000449 """Return prefix length from the bitwise netmask.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000450
451 Args:
Berker Peksagf23530f2014-10-19 18:04:38 +0300452 ip_int: An integer, the netmask in expanded bitwise format
Nick Coghlandc9b2552012-05-20 21:01:57 +1000453
454 Returns:
455 An integer, the prefix length.
456
Nick Coghlan932346f2014-02-08 23:17:36 +1000457 Raises:
458 ValueError: If the input intermingles zeroes & ones
Nick Coghlandc9b2552012-05-20 21:01:57 +1000459 """
Nick Coghlan932346f2014-02-08 23:17:36 +1000460 trailing_zeroes = _count_righthand_zero_bits(ip_int,
Antoine Pitrou45aba182014-05-15 20:18:41 +0200461 cls._max_prefixlen)
462 prefixlen = cls._max_prefixlen - trailing_zeroes
Nick Coghlan932346f2014-02-08 23:17:36 +1000463 leading_ones = ip_int >> trailing_zeroes
464 all_ones = (1 << prefixlen) - 1
465 if leading_ones != all_ones:
Antoine Pitrou45aba182014-05-15 20:18:41 +0200466 byteslen = cls._max_prefixlen // 8
Nick Coghlan932346f2014-02-08 23:17:36 +1000467 details = ip_int.to_bytes(byteslen, 'big')
468 msg = 'Netmask pattern %r mixes zeroes & ones'
469 raise ValueError(msg % details)
470 return prefixlen
Nick Coghlandc9b2552012-05-20 21:01:57 +1000471
Antoine Pitrou45aba182014-05-15 20:18:41 +0200472 @classmethod
473 def _report_invalid_netmask(cls, netmask_str):
Nick Coghlan932346f2014-02-08 23:17:36 +1000474 msg = '%r is not a valid netmask' % netmask_str
475 raise NetmaskValueError(msg) from None
476
Antoine Pitrou45aba182014-05-15 20:18:41 +0200477 @classmethod
478 def _prefix_from_prefix_string(cls, prefixlen_str):
Nick Coghlan932346f2014-02-08 23:17:36 +1000479 """Return prefix length from a numeric string
Nick Coghlandc9b2552012-05-20 21:01:57 +1000480
481 Args:
Nick Coghlan932346f2014-02-08 23:17:36 +1000482 prefixlen_str: The string to be converted
Nick Coghlandc9b2552012-05-20 21:01:57 +1000483
484 Returns:
Nick Coghlan932346f2014-02-08 23:17:36 +1000485 An integer, the prefix length.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000486
Nick Coghlan932346f2014-02-08 23:17:36 +1000487 Raises:
488 NetmaskValueError: If the input is not a valid netmask
Nick Coghlandc9b2552012-05-20 21:01:57 +1000489 """
Nick Coghlan932346f2014-02-08 23:17:36 +1000490 # int allows a leading +/- as well as surrounding whitespace,
491 # so we ensure that isn't the case
INADA Naoki58a10962018-02-23 20:02:41 +0900492 if not (prefixlen_str.isascii() and prefixlen_str.isdigit()):
Antoine Pitrou45aba182014-05-15 20:18:41 +0200493 cls._report_invalid_netmask(prefixlen_str)
Nick Coghlan932346f2014-02-08 23:17:36 +1000494 try:
495 prefixlen = int(prefixlen_str)
496 except ValueError:
Antoine Pitrou45aba182014-05-15 20:18:41 +0200497 cls._report_invalid_netmask(prefixlen_str)
498 if not (0 <= prefixlen <= cls._max_prefixlen):
499 cls._report_invalid_netmask(prefixlen_str)
Nick Coghlan932346f2014-02-08 23:17:36 +1000500 return prefixlen
501
Antoine Pitrou45aba182014-05-15 20:18:41 +0200502 @classmethod
503 def _prefix_from_ip_string(cls, ip_str):
Nick Coghlan932346f2014-02-08 23:17:36 +1000504 """Turn a netmask/hostmask string into a prefix length
505
506 Args:
507 ip_str: The netmask/hostmask to be converted
508
509 Returns:
510 An integer, the prefix length.
511
512 Raises:
513 NetmaskValueError: If the input is not a valid netmask/hostmask
514 """
515 # Parse the netmask/hostmask like an IP address.
516 try:
Antoine Pitrou45aba182014-05-15 20:18:41 +0200517 ip_int = cls._ip_int_from_string(ip_str)
Nick Coghlan932346f2014-02-08 23:17:36 +1000518 except AddressValueError:
Antoine Pitrou45aba182014-05-15 20:18:41 +0200519 cls._report_invalid_netmask(ip_str)
Nick Coghlan932346f2014-02-08 23:17:36 +1000520
521 # Try matching a netmask (this would be /1*0*/ as a bitwise regexp).
522 # Note that the two ambiguous cases (all-ones and all-zeroes) are
523 # treated as netmasks.
524 try:
Antoine Pitrou45aba182014-05-15 20:18:41 +0200525 return cls._prefix_from_ip_int(ip_int)
Nick Coghlan932346f2014-02-08 23:17:36 +1000526 except ValueError:
527 pass
528
529 # Invert the bits, and try matching a /0+1+/ hostmask instead.
Antoine Pitrou45aba182014-05-15 20:18:41 +0200530 ip_int ^= cls._ALL_ONES
Nick Coghlan932346f2014-02-08 23:17:36 +1000531 try:
Antoine Pitrou45aba182014-05-15 20:18:41 +0200532 return cls._prefix_from_ip_int(ip_int)
Nick Coghlan932346f2014-02-08 23:17:36 +1000533 except ValueError:
Antoine Pitrou45aba182014-05-15 20:18:41 +0200534 cls._report_invalid_netmask(ip_str)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000535
Inada Naoki6fa84bd2019-04-16 08:32:28 +0900536 @classmethod
537 def _split_addr_prefix(cls, address):
538 """Helper function to parse address of Network/Interface.
539
540 Arg:
541 address: Argument of Network/Interface.
542
543 Returns:
544 (addr, prefix) tuple.
545 """
546 # a packed address or integer
547 if isinstance(address, (bytes, int)):
548 return address, cls._max_prefixlen
549
550 if not isinstance(address, tuple):
551 # Assume input argument to be string or any object representation
552 # which converts into a formatted IP prefix string.
553 address = _split_optional_netmask(address)
554
555 # Constructing from a tuple (addr, [mask])
556 if len(address) > 1:
557 return address
558 return address[0], cls._max_prefixlen
559
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200560 def __reduce__(self):
561 return self.__class__, (str(self),)
562
Nick Coghlan730f67f2012-08-05 22:02:18 +1000563
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300564_address_fmt_re = None
565
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200566@functools.total_ordering
Nick Coghlandc9b2552012-05-20 21:01:57 +1000567class _BaseAddress(_IPAddressBase):
568
569 """A generic IP object.
570
571 This IP class contains the version independent methods which are
572 used by single IP addresses.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000573 """
574
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200575 __slots__ = ()
576
Nick Coghlandc9b2552012-05-20 21:01:57 +1000577 def __int__(self):
578 return self._ip
579
Nick Coghlandc9b2552012-05-20 21:01:57 +1000580 def __eq__(self, other):
581 try:
582 return (self._ip == other._ip
583 and self._version == other._version)
584 except AttributeError:
585 return NotImplemented
586
Nick Coghlandc9b2552012-05-20 21:01:57 +1000587 def __lt__(self, other):
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200588 if not isinstance(other, _BaseAddress):
589 return NotImplemented
Nick Coghlandc9b2552012-05-20 21:01:57 +1000590 if self._version != other._version:
591 raise TypeError('%s and %s are not of the same version' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000592 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000593 if self._ip != other._ip:
594 return self._ip < other._ip
595 return False
596
Nick Coghlandc9b2552012-05-20 21:01:57 +1000597 # Shorthand for Integer addition and subtraction. This is not
598 # meant to ever support addition/subtraction of addresses.
599 def __add__(self, other):
600 if not isinstance(other, int):
601 return NotImplemented
Nick Coghlan51c30672012-05-27 00:25:58 +1000602 return self.__class__(int(self) + other)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000603
604 def __sub__(self, other):
605 if not isinstance(other, int):
606 return NotImplemented
Nick Coghlan51c30672012-05-27 00:25:58 +1000607 return self.__class__(int(self) - other)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000608
609 def __repr__(self):
610 return '%s(%r)' % (self.__class__.__name__, str(self))
611
612 def __str__(self):
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200613 return str(self._string_from_ip_int(self._ip))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000614
615 def __hash__(self):
616 return hash(hex(int(self._ip)))
617
618 def _get_address_key(self):
619 return (self._version, self)
620
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200621 def __reduce__(self):
622 return self.__class__, (self._ip,)
623
ewosbornef9c95a42019-09-12 05:03:31 -0400624 def __format__(self, fmt):
625 """Returns an IP address as a formatted string.
626
627 Supported presentation types are:
628 's': returns the IP address as a string (default)
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300629 'b': converts to binary and returns a zero-padded string
ewosbornef9c95a42019-09-12 05:03:31 -0400630 'X' or 'x': converts to upper- or lower-case hex and returns a zero-padded string
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300631 'n': the same as 'b' for IPv4 and 'x' for IPv6
ewosbornef9c95a42019-09-12 05:03:31 -0400632
633 For binary and hex presentation types, the alternate form specifier
634 '#' and the grouping option '_' are supported.
635 """
636
ewosbornef9c95a42019-09-12 05:03:31 -0400637 # Support string formatting
638 if not fmt or fmt[-1] == 's':
ewosbornef9c95a42019-09-12 05:03:31 -0400639 return format(str(self), fmt)
640
641 # From here on down, support for 'bnXx'
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300642 global _address_fmt_re
643 if _address_fmt_re is None:
644 import re
645 _address_fmt_re = re.compile('(#?)(_?)([xbnX])')
ewosbornef9c95a42019-09-12 05:03:31 -0400646
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300647 m = _address_fmt_re.fullmatch(fmt)
ewosbornef9c95a42019-09-12 05:03:31 -0400648 if not m:
649 return super().__format__(fmt)
650
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300651 alternate, grouping, fmt_base = m.groups()
ewosbornef9c95a42019-09-12 05:03:31 -0400652
653 # Set some defaults
654 if fmt_base == 'n':
655 if self._version == 4:
656 fmt_base = 'b' # Binary is default for ipv4
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300657 else:
ewosbornef9c95a42019-09-12 05:03:31 -0400658 fmt_base = 'x' # Hex is default for ipv6
659
ewosbornef9c95a42019-09-12 05:03:31 -0400660 if fmt_base == 'b':
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300661 padlen = self._max_prefixlen
662 else:
663 padlen = self._max_prefixlen // 4
ewosbornef9c95a42019-09-12 05:03:31 -0400664
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300665 if grouping:
666 padlen += padlen // 4 - 1
ewosbornef9c95a42019-09-12 05:03:31 -0400667
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300668 if alternate:
669 padlen += 2 # 0b or 0x
ewosbornef9c95a42019-09-12 05:03:31 -0400670
Serhiy Storchaka5d6f5b62019-09-27 20:02:58 +0300671 return format(int(self), f'{alternate}0{padlen}{grouping}{fmt_base}')
ewosbornef9c95a42019-09-12 05:03:31 -0400672
Nick Coghlandc9b2552012-05-20 21:01:57 +1000673
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200674@functools.total_ordering
Nick Coghlandc9b2552012-05-20 21:01:57 +1000675class _BaseNetwork(_IPAddressBase):
Nick Coghlan51c30672012-05-27 00:25:58 +1000676 """A generic IP network object.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000677
678 This IP class contains the version independent methods which are
679 used by networks.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000680 """
Nick Coghlandc9b2552012-05-20 21:01:57 +1000681
Nick Coghlandc9b2552012-05-20 21:01:57 +1000682 def __repr__(self):
683 return '%s(%r)' % (self.__class__.__name__, str(self))
684
Hynek Schlawack454a74d2012-06-04 18:14:02 +0200685 def __str__(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000686 return '%s/%d' % (self.network_address, self.prefixlen)
Hynek Schlawack454a74d2012-06-04 18:14:02 +0200687
Nick Coghlandc9b2552012-05-20 21:01:57 +1000688 def hosts(self):
689 """Generate Iterator over usable hosts in a network.
690
Sandro Tosib95c6342012-05-23 23:17:22 +0200691 This is like __iter__ except it doesn't return the network
692 or broadcast addresses.
Nick Coghlandc9b2552012-05-20 21:01:57 +1000693
694 """
Nick Coghlan7319f692012-07-07 21:43:30 +1000695 network = int(self.network_address)
696 broadcast = int(self.broadcast_address)
697 for x in range(network + 1, broadcast):
698 yield self._address_class(x)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000699
700 def __iter__(self):
Nick Coghlan7319f692012-07-07 21:43:30 +1000701 network = int(self.network_address)
702 broadcast = int(self.broadcast_address)
703 for x in range(network, broadcast + 1):
704 yield self._address_class(x)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000705
706 def __getitem__(self, n):
707 network = int(self.network_address)
708 broadcast = int(self.broadcast_address)
709 if n >= 0:
710 if network + n > broadcast:
Berker Peksag28dc1182016-06-11 22:30:05 +0300711 raise IndexError('address out of range')
Nick Coghlan51c30672012-05-27 00:25:58 +1000712 return self._address_class(network + n)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000713 else:
714 n += 1
715 if broadcast + n < network:
Berker Peksag28dc1182016-06-11 22:30:05 +0300716 raise IndexError('address out of range')
Nick Coghlan51c30672012-05-27 00:25:58 +1000717 return self._address_class(broadcast + n)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000718
719 def __lt__(self, other):
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200720 if not isinstance(other, _BaseNetwork):
721 return NotImplemented
Nick Coghlandc9b2552012-05-20 21:01:57 +1000722 if self._version != other._version:
723 raise TypeError('%s and %s are not of the same version' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000724 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000725 if self.network_address != other.network_address:
726 return self.network_address < other.network_address
727 if self.netmask != other.netmask:
728 return self.netmask < other.netmask
729 return False
730
Nick Coghlandc9b2552012-05-20 21:01:57 +1000731 def __eq__(self, other):
Nick Coghlan9a9c28c2012-07-07 23:05:59 +1000732 try:
733 return (self._version == other._version and
734 self.network_address == other.network_address and
735 int(self.netmask) == int(other.netmask))
736 except AttributeError:
737 return NotImplemented
Nick Coghlandc9b2552012-05-20 21:01:57 +1000738
Nick Coghlandc9b2552012-05-20 21:01:57 +1000739 def __hash__(self):
740 return hash(int(self.network_address) ^ int(self.netmask))
741
742 def __contains__(self, other):
743 # always false if one is v4 and the other is v6.
744 if self._version != other._version:
745 return False
746 # dealing with another network.
747 if isinstance(other, _BaseNetwork):
748 return False
749 # dealing with another address
750 else:
751 # address
gescheit3bbcc922019-04-30 10:54:30 +0300752 return other._ip & self.netmask._ip == self.network_address._ip
Nick Coghlandc9b2552012-05-20 21:01:57 +1000753
754 def overlaps(self, other):
755 """Tell if self is partly contained in other."""
756 return self.network_address in other or (
757 self.broadcast_address in other or (
758 other.network_address in self or (
759 other.broadcast_address in self)))
760
Inada Naoki2430d532019-04-15 16:01:00 +0900761 @functools.cached_property
Nick Coghlandc9b2552012-05-20 21:01:57 +1000762 def broadcast_address(self):
Inada Naoki2430d532019-04-15 16:01:00 +0900763 return self._address_class(int(self.network_address) |
764 int(self.hostmask))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000765
Inada Naoki2430d532019-04-15 16:01:00 +0900766 @functools.cached_property
Nick Coghlandc9b2552012-05-20 21:01:57 +1000767 def hostmask(self):
Inada Naoki2430d532019-04-15 16:01:00 +0900768 return self._address_class(int(self.netmask) ^ self._ALL_ONES)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000769
770 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +1000771 def with_prefixlen(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000772 return '%s/%d' % (self.network_address, self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000773
774 @property
775 def with_netmask(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000776 return '%s/%s' % (self.network_address, self.netmask)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000777
778 @property
779 def with_hostmask(self):
Nick Coghlan912238e2012-07-07 13:34:50 +1000780 return '%s/%s' % (self.network_address, self.hostmask)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000781
782 @property
783 def num_addresses(self):
784 """Number of hosts in the current subnet."""
785 return int(self.broadcast_address) - int(self.network_address) + 1
786
787 @property
Nick Coghlan51c30672012-05-27 00:25:58 +1000788 def _address_class(self):
Nick Coghland9722652012-06-17 16:33:00 +1000789 # Returning bare address objects (rather than interfaces) allows for
790 # more consistent behaviour across the network address, broadcast
791 # address and individual host addresses.
792 msg = '%200s has no associated address class' % (type(self),)
793 raise NotImplementedError(msg)
Nick Coghlan51c30672012-05-27 00:25:58 +1000794
795 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +1000796 def prefixlen(self):
797 return self._prefixlen
798
799 def address_exclude(self, other):
800 """Remove an address from a larger block.
801
802 For example:
803
804 addr1 = ip_network('192.0.2.0/28')
805 addr2 = ip_network('192.0.2.1/32')
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +0200806 list(addr1.address_exclude(addr2)) =
Nick Coghlandc9b2552012-05-20 21:01:57 +1000807 [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'),
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +0200808 IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')]
Nick Coghlandc9b2552012-05-20 21:01:57 +1000809
810 or IPv6:
811
812 addr1 = ip_network('2001:db8::1/32')
813 addr2 = ip_network('2001:db8::1/128')
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +0200814 list(addr1.address_exclude(addr2)) =
Nick Coghlandc9b2552012-05-20 21:01:57 +1000815 [ip_network('2001:db8::1/128'),
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +0200816 ip_network('2001:db8::2/127'),
817 ip_network('2001:db8::4/126'),
818 ip_network('2001:db8::8/125'),
819 ...
820 ip_network('2001:db8:8000::/33')]
Nick Coghlandc9b2552012-05-20 21:01:57 +1000821
822 Args:
823 other: An IPv4Network or IPv6Network object of the same type.
824
825 Returns:
Ezio Melotti3f5db392013-01-27 06:20:14 +0200826 An iterator of the IPv(4|6)Network objects which is self
Nick Coghlandc9b2552012-05-20 21:01:57 +1000827 minus other.
828
829 Raises:
Ezio Melotti30b9d5d2013-08-17 15:50:46 +0300830 TypeError: If self and other are of differing address
Nick Coghlandc9b2552012-05-20 21:01:57 +1000831 versions, or if other is not a network object.
832 ValueError: If other is not completely contained by self.
833
834 """
835 if not self._version == other._version:
836 raise TypeError("%s and %s are not of the same version" % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000837 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000838
839 if not isinstance(other, _BaseNetwork):
Nick Coghlan912238e2012-07-07 13:34:50 +1000840 raise TypeError("%s is not a network object" % other)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000841
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400842 if not other.subnet_of(self):
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200843 raise ValueError('%s not contained in %s' % (other, self))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000844 if other == self:
Raymond Hettingerbb6c0aa2014-11-22 22:14:41 -0800845 return
Nick Coghlandc9b2552012-05-20 21:01:57 +1000846
Nick Coghlandc9b2552012-05-20 21:01:57 +1000847 # Make sure we're comparing the network of other.
Nick Coghlan912238e2012-07-07 13:34:50 +1000848 other = other.__class__('%s/%s' % (other.network_address,
849 other.prefixlen))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000850
851 s1, s2 = self.subnets()
852 while s1 != other and s2 != other:
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400853 if other.subnet_of(s1):
Nick Coghlandc9b2552012-05-20 21:01:57 +1000854 yield s2
855 s1, s2 = s1.subnets()
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400856 elif other.subnet_of(s2):
Nick Coghlandc9b2552012-05-20 21:01:57 +1000857 yield s1
858 s1, s2 = s2.subnets()
859 else:
860 # If we got here, there's a bug somewhere.
861 raise AssertionError('Error performing exclusion: '
862 's1: %s s2: %s other: %s' %
Nick Coghlan912238e2012-07-07 13:34:50 +1000863 (s1, s2, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000864 if s1 == other:
865 yield s2
866 elif s2 == other:
867 yield s1
868 else:
869 # If we got here, there's a bug somewhere.
870 raise AssertionError('Error performing exclusion: '
871 's1: %s s2: %s other: %s' %
Nick Coghlan912238e2012-07-07 13:34:50 +1000872 (s1, s2, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000873
874 def compare_networks(self, other):
875 """Compare two IP objects.
876
877 This is only concerned about the comparison of the integer
878 representation of the network addresses. This means that the
879 host bits aren't considered at all in this method. If you want
880 to compare host bits, you can easily enough do a
881 'HostA._ip < HostB._ip'
882
883 Args:
884 other: An IP object.
885
886 Returns:
887 If the IP versions of self and other are the same, returns:
888
889 -1 if self < other:
890 eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25')
891 IPv6Network('2001:db8::1000/124') <
892 IPv6Network('2001:db8::2000/124')
893 0 if self == other
894 eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24')
895 IPv6Network('2001:db8::1000/124') ==
896 IPv6Network('2001:db8::1000/124')
897 1 if self > other
898 eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25')
899 IPv6Network('2001:db8::2000/124') >
900 IPv6Network('2001:db8::1000/124')
901
902 Raises:
903 TypeError if the IP versions are different.
904
905 """
906 # does this need to raise a ValueError?
907 if self._version != other._version:
908 raise TypeError('%s and %s are not of the same type' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000909 self, other))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000910 # self._version == other._version below here:
911 if self.network_address < other.network_address:
912 return -1
913 if self.network_address > other.network_address:
914 return 1
915 # self.network_address == other.network_address below here:
916 if self.netmask < other.netmask:
917 return -1
918 if self.netmask > other.netmask:
919 return 1
920 return 0
921
922 def _get_networks_key(self):
923 """Network-only key function.
924
925 Returns an object that identifies this address' network and
926 netmask. This function is a suitable "key" argument for sorted()
927 and list.sort().
928
929 """
930 return (self._version, self.network_address, self.netmask)
931
932 def subnets(self, prefixlen_diff=1, new_prefix=None):
933 """The subnets which join to make the current subnet.
934
935 In the case that self contains only one IP
936 (self._prefixlen == 32 for IPv4 or self._prefixlen == 128
937 for IPv6), yield an iterator with just ourself.
938
939 Args:
940 prefixlen_diff: An integer, the amount the prefix length
941 should be increased by. This should not be set if
942 new_prefix is also set.
943 new_prefix: The desired new prefix length. This must be a
944 larger number (smaller prefix) than the existing prefix.
945 This should not be set if prefixlen_diff is also set.
946
947 Returns:
948 An iterator of IPv(4|6) objects.
949
950 Raises:
951 ValueError: The prefixlen_diff is too small or too large.
952 OR
953 prefixlen_diff and new_prefix are both set or new_prefix
954 is a smaller number than the current prefix (smaller
955 number means a larger network)
956
957 """
958 if self._prefixlen == self._max_prefixlen:
959 yield self
960 return
961
962 if new_prefix is not None:
963 if new_prefix < self._prefixlen:
964 raise ValueError('new prefix must be longer')
965 if prefixlen_diff != 1:
966 raise ValueError('cannot set prefixlen_diff and new_prefix')
967 prefixlen_diff = new_prefix - self._prefixlen
968
969 if prefixlen_diff < 0:
970 raise ValueError('prefix length diff must be > 0')
971 new_prefixlen = self._prefixlen + prefixlen_diff
972
Nick Coghlan932346f2014-02-08 23:17:36 +1000973 if new_prefixlen > self._max_prefixlen:
Nick Coghlandc9b2552012-05-20 21:01:57 +1000974 raise ValueError(
975 'prefix length diff %d is invalid for netblock %s' % (
Nick Coghlan912238e2012-07-07 13:34:50 +1000976 new_prefixlen, self))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000977
Antoine Pitrou824db302014-05-15 20:21:48 +0200978 start = int(self.network_address)
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +0200979 end = int(self.broadcast_address) + 1
Antoine Pitrou824db302014-05-15 20:21:48 +0200980 step = (int(self.hostmask) + 1) >> prefixlen_diff
981 for new_addr in range(start, end, step):
982 current = self.__class__((new_addr, new_prefixlen))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000983 yield current
984
Nick Coghlandc9b2552012-05-20 21:01:57 +1000985 def supernet(self, prefixlen_diff=1, new_prefix=None):
986 """The supernet containing the current network.
987
988 Args:
989 prefixlen_diff: An integer, the amount the prefix length of
990 the network should be decreased by. For example, given a
991 /24 network and a prefixlen_diff of 3, a supernet with a
992 /21 netmask is returned.
993
994 Returns:
995 An IPv4 network object.
996
997 Raises:
Hynek Schlawack072b1e12012-05-26 12:04:56 +0200998 ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have
999 a negative prefix length.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001000 OR
1001 If prefixlen_diff and new_prefix are both set or new_prefix is a
1002 larger number than the current prefix (larger number means a
1003 smaller network)
1004
1005 """
1006 if self._prefixlen == 0:
1007 return self
1008
1009 if new_prefix is not None:
1010 if new_prefix > self._prefixlen:
1011 raise ValueError('new prefix must be shorter')
1012 if prefixlen_diff != 1:
1013 raise ValueError('cannot set prefixlen_diff and new_prefix')
1014 prefixlen_diff = self._prefixlen - new_prefix
1015
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001016 new_prefixlen = self.prefixlen - prefixlen_diff
1017 if new_prefixlen < 0:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001018 raise ValueError(
1019 'current prefixlen is %d, cannot have a prefixlen_diff of %d' %
1020 (self.prefixlen, prefixlen_diff))
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001021 return self.__class__((
1022 int(self.network_address) & (int(self.netmask) << prefixlen_diff),
1023 new_prefixlen
1024 ))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001025
Nick Coghlan730f67f2012-08-05 22:02:18 +10001026 @property
1027 def is_multicast(self):
1028 """Test if the address is reserved for multicast use.
1029
1030 Returns:
1031 A boolean, True if the address is a multicast address.
1032 See RFC 2373 2.7 for details.
1033
1034 """
1035 return (self.network_address.is_multicast and
1036 self.broadcast_address.is_multicast)
1037
Cheryl Sabella91dc64b2017-10-22 17:39:49 -04001038 @staticmethod
1039 def _is_subnet_of(a, b):
1040 try:
1041 # Always false if one is v4 and the other is v6.
1042 if a._version != b._version:
1043 raise TypeError(f"{a} and {b} are not of the same version")
1044 return (b.network_address <= a.network_address and
1045 b.broadcast_address >= a.broadcast_address)
1046 except AttributeError:
1047 raise TypeError(f"Unable to test subnet containment "
1048 f"between {a} and {b}")
1049
1050 def subnet_of(self, other):
1051 """Return True if this network is a subnet of other."""
1052 return self._is_subnet_of(self, other)
1053
1054 def supernet_of(self, other):
1055 """Return True if this network is a supernet of other."""
1056 return self._is_subnet_of(other, self)
1057
Nick Coghlan730f67f2012-08-05 22:02:18 +10001058 @property
1059 def is_reserved(self):
1060 """Test if the address is otherwise IETF reserved.
1061
1062 Returns:
1063 A boolean, True if the address is within one of the
1064 reserved IPv6 Network ranges.
1065
1066 """
1067 return (self.network_address.is_reserved and
1068 self.broadcast_address.is_reserved)
1069
1070 @property
1071 def is_link_local(self):
1072 """Test if the address is reserved for link-local.
1073
1074 Returns:
1075 A boolean, True if the address is reserved per RFC 4291.
1076
1077 """
1078 return (self.network_address.is_link_local and
1079 self.broadcast_address.is_link_local)
1080
1081 @property
1082 def is_private(self):
1083 """Test if this address is allocated for private networks.
1084
1085 Returns:
Peter Moody22c31762013-10-21 13:58:06 -07001086 A boolean, True if the address is reserved per
1087 iana-ipv4-special-registry or iana-ipv6-special-registry.
Nick Coghlan730f67f2012-08-05 22:02:18 +10001088
1089 """
1090 return (self.network_address.is_private and
1091 self.broadcast_address.is_private)
1092
1093 @property
Peter Moody22c31762013-10-21 13:58:06 -07001094 def is_global(self):
Peter Moodybe9c1b12013-10-22 12:36:21 -07001095 """Test if this address is allocated for public networks.
Peter Moody22c31762013-10-21 13:58:06 -07001096
1097 Returns:
1098 A boolean, True if the address is not reserved per
1099 iana-ipv4-special-registry or iana-ipv6-special-registry.
1100
1101 """
1102 return not self.is_private
1103
1104 @property
Nick Coghlan730f67f2012-08-05 22:02:18 +10001105 def is_unspecified(self):
1106 """Test if the address is unspecified.
1107
1108 Returns:
1109 A boolean, True if this is the unspecified address as defined in
1110 RFC 2373 2.5.2.
1111
1112 """
1113 return (self.network_address.is_unspecified and
1114 self.broadcast_address.is_unspecified)
1115
1116 @property
1117 def is_loopback(self):
1118 """Test if the address is a loopback address.
1119
1120 Returns:
1121 A boolean, True if the address is a loopback address as defined in
1122 RFC 2373 2.5.3.
1123
1124 """
1125 return (self.network_address.is_loopback and
1126 self.broadcast_address.is_loopback)
1127
Batuhan Taşkaya2fa67df2020-04-10 07:04:54 +03001128 __class_getitem__ = classmethod(types.GenericAlias)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001129
Hynek Schlawackc4b78a32012-06-01 11:48:32 +02001130class _BaseV4:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001131
1132 """Base IPv4 object.
1133
1134 The following methods are used by IPv4 objects in both single IP
1135 addresses and networks.
1136
1137 """
1138
Serhiy Storchaka88f64f32015-03-07 20:08:34 +02001139 __slots__ = ()
1140 _version = 4
Nick Coghlandc9b2552012-05-20 21:01:57 +10001141 # Equivalent to 255.255.255.255 or 32 bits of 1's.
1142 _ALL_ONES = (2**IPV4LENGTH) - 1
Nick Coghlandc9b2552012-05-20 21:01:57 +10001143
Antoine Pitrou45aba182014-05-15 20:18:41 +02001144 _max_prefixlen = IPV4LENGTH
1145 # There are only a handful of valid v4 netmasks, so we cache them all
1146 # when constructed (see _make_netmask()).
1147 _netmask_cache = {}
1148
Nick Coghlandc9b2552012-05-20 21:01:57 +10001149 def _explode_shorthand_ip_string(self):
1150 return str(self)
1151
Antoine Pitrou45aba182014-05-15 20:18:41 +02001152 @classmethod
1153 def _make_netmask(cls, arg):
1154 """Make a (netmask, prefix_len) tuple from the given argument.
1155
1156 Argument can be:
1157 - an integer (the prefix length)
1158 - a string representing the prefix length (e.g. "24")
1159 - a string representing the prefix netmask (e.g. "255.255.255.0")
1160 """
1161 if arg not in cls._netmask_cache:
1162 if isinstance(arg, int):
1163 prefixlen = arg
Nicolai Moore5e48e3d2019-05-14 20:32:59 +10001164 if not (0 <= prefixlen <= cls._max_prefixlen):
1165 cls._report_invalid_netmask(prefixlen)
Antoine Pitrou45aba182014-05-15 20:18:41 +02001166 else:
1167 try:
1168 # Check for a netmask in prefix length form
1169 prefixlen = cls._prefix_from_prefix_string(arg)
1170 except NetmaskValueError:
1171 # Check for a netmask or hostmask in dotted-quad form.
1172 # This may raise NetmaskValueError.
1173 prefixlen = cls._prefix_from_ip_string(arg)
1174 netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen))
1175 cls._netmask_cache[arg] = netmask, prefixlen
1176 return cls._netmask_cache[arg]
1177
1178 @classmethod
1179 def _ip_int_from_string(cls, ip_str):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001180 """Turn the given IP string into an integer for comparison.
1181
1182 Args:
1183 ip_str: A string, the IP ip_str.
1184
1185 Returns:
1186 The IP ip_str as an integer.
1187
1188 Raises:
1189 AddressValueError: if ip_str isn't a valid IPv4 Address.
1190
1191 """
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001192 if not ip_str:
1193 raise AddressValueError('Address cannot be empty')
1194
Nick Coghlandc9b2552012-05-20 21:01:57 +10001195 octets = ip_str.split('.')
1196 if len(octets) != 4:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001197 raise AddressValueError("Expected 4 octets in %r" % ip_str)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001198
Nick Coghlan7319f692012-07-07 21:43:30 +10001199 try:
Antoine Pitrou45aba182014-05-15 20:18:41 +02001200 return int.from_bytes(map(cls._parse_octet, octets), 'big')
Nick Coghlan7319f692012-07-07 21:43:30 +10001201 except ValueError as exc:
1202 raise AddressValueError("%s in %r" % (exc, ip_str)) from None
Nick Coghlandc9b2552012-05-20 21:01:57 +10001203
Antoine Pitrou45aba182014-05-15 20:18:41 +02001204 @classmethod
1205 def _parse_octet(cls, octet_str):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001206 """Convert a decimal octet into an integer.
1207
1208 Args:
1209 octet_str: A string, the number to parse.
1210
1211 Returns:
1212 The octet as an integer.
1213
1214 Raises:
1215 ValueError: if the octet isn't strictly a decimal from [0..255].
1216
1217 """
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001218 if not octet_str:
1219 raise ValueError("Empty octet not permitted")
Nick Coghlandc9b2552012-05-20 21:01:57 +10001220 # Whitelist the characters, since int() allows a lot of bizarre stuff.
INADA Naoki58a10962018-02-23 20:02:41 +09001221 if not (octet_str.isascii() and octet_str.isdigit()):
Nick Coghlan07c4e332012-07-08 23:06:45 +10001222 msg = "Only decimal digits permitted in %r"
1223 raise ValueError(msg % octet_str)
1224 # We do the length check second, since the invalid character error
1225 # is likely to be more informative for the user
1226 if len(octet_str) > 3:
1227 msg = "At most 3 characters permitted in %r"
1228 raise ValueError(msg % octet_str)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001229 # Convert to integer (we know digits are legal)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001230 octet_int = int(octet_str, 10)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10001231 if octet_int > 255:
Nick Coghlanb582ecc2012-07-07 22:15:22 +10001232 raise ValueError("Octet %d (> 255) not permitted" % octet_int)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001233 return octet_int
1234
Antoine Pitrou45aba182014-05-15 20:18:41 +02001235 @classmethod
1236 def _string_from_ip_int(cls, ip_int):
Nick Coghlandc9b2552012-05-20 21:01:57 +10001237 """Turns a 32-bit integer into dotted decimal notation.
1238
1239 Args:
1240 ip_int: An integer, the IP address.
1241
1242 Returns:
1243 The IP address as a string in dotted decimal notation.
1244
1245 """
Nick Coghlan7319f692012-07-07 21:43:30 +10001246 return '.'.join(map(str, ip_int.to_bytes(4, 'big')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001247
Eric V. Smithebdaaf42014-04-14 12:58:07 -04001248 def _reverse_pointer(self):
1249 """Return the reverse DNS pointer name for the IPv4 address.
1250
1251 This implements the method described in RFC1035 3.5.
1252
1253 """
1254 reverse_octets = str(self).split('.')[::-1]
1255 return '.'.join(reverse_octets) + '.in-addr.arpa'
1256
Nick Coghlandc9b2552012-05-20 21:01:57 +10001257 @property
1258 def max_prefixlen(self):
1259 return self._max_prefixlen
1260
1261 @property
1262 def version(self):
1263 return self._version
1264
Nick Coghlandc9b2552012-05-20 21:01:57 +10001265
1266class IPv4Address(_BaseV4, _BaseAddress):
1267
1268 """Represent and manipulate single IPv4 Addresses."""
1269
Serhiy Storchaka88f64f32015-03-07 20:08:34 +02001270 __slots__ = ('_ip', '__weakref__')
1271
Nick Coghlandc9b2552012-05-20 21:01:57 +10001272 def __init__(self, address):
1273
1274 """
1275 Args:
1276 address: A string or integer representing the IP
1277
1278 Additionally, an integer can be passed, so
1279 IPv4Address('192.0.2.1') == IPv4Address(3221225985).
1280 or, more generally
1281 IPv4Address(int(IPv4Address('192.0.2.1'))) ==
1282 IPv4Address('192.0.2.1')
1283
1284 Raises:
Sandro Tosib4386d32012-06-02 17:14:22 +02001285 AddressValueError: If ipaddress isn't a valid IPv4 address.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001286
1287 """
Nick Coghlandc9b2552012-05-20 21:01:57 +10001288 # Efficient constructor from integer.
1289 if isinstance(address, int):
Nick Coghlan297b1432012-07-08 17:11:04 +10001290 self._check_int_address(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001291 self._ip = address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001292 return
1293
1294 # Constructing from a packed address
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001295 if isinstance(address, bytes):
Nick Coghlan297b1432012-07-08 17:11:04 +10001296 self._check_packed_address(address, 4)
Nick Coghlandb7920b2012-08-20 10:19:12 +10001297 self._ip = int.from_bytes(address, 'big')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001298 return
1299
1300 # Assume input argument to be string or any object representation
1301 # which converts into a formatted IP string.
1302 addr_str = str(address)
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +02001303 if '/' in addr_str:
1304 raise AddressValueError("Unexpected '/' in %r" % address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001305 self._ip = self._ip_int_from_string(addr_str)
1306
1307 @property
1308 def packed(self):
1309 """The binary representation of this address."""
1310 return v4_int_to_packed(self._ip)
1311
Nick Coghlan730f67f2012-08-05 22:02:18 +10001312 @property
1313 def is_reserved(self):
1314 """Test if the address is otherwise IETF reserved.
1315
1316 Returns:
1317 A boolean, True if the address is within the
1318 reserved IPv4 Network range.
1319
1320 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001321 return self in self._constants._reserved_network
Nick Coghlan730f67f2012-08-05 22:02:18 +10001322
1323 @property
Peter Moodybe9c1b12013-10-22 12:36:21 -07001324 @functools.lru_cache()
Nick Coghlan730f67f2012-08-05 22:02:18 +10001325 def is_private(self):
1326 """Test if this address is allocated for private networks.
1327
1328 Returns:
Peter Moody22c31762013-10-21 13:58:06 -07001329 A boolean, True if the address is reserved per
1330 iana-ipv4-special-registry.
Nick Coghlan730f67f2012-08-05 22:02:18 +10001331
1332 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001333 return any(self in net for net in self._constants._private_networks)
Nick Coghlan730f67f2012-08-05 22:02:18 +10001334
1335 @property
Berker Peksag742192a2016-06-11 22:11:47 +03001336 @functools.lru_cache()
1337 def is_global(self):
1338 return self not in self._constants._public_network and not self.is_private
1339
1340 @property
Nick Coghlan730f67f2012-08-05 22:02:18 +10001341 def is_multicast(self):
1342 """Test if the address is reserved for multicast use.
1343
1344 Returns:
1345 A boolean, True if the address is multicast.
1346 See RFC 3171 for details.
1347
1348 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001349 return self in self._constants._multicast_network
Nick Coghlan730f67f2012-08-05 22:02:18 +10001350
1351 @property
1352 def is_unspecified(self):
1353 """Test if the address is unspecified.
1354
1355 Returns:
1356 A boolean, True if this is the unspecified address as defined in
1357 RFC 5735 3.
1358
1359 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001360 return self == self._constants._unspecified_address
Nick Coghlan730f67f2012-08-05 22:02:18 +10001361
1362 @property
1363 def is_loopback(self):
1364 """Test if the address is a loopback address.
1365
1366 Returns:
1367 A boolean, True if the address is a loopback per RFC 3330.
1368
1369 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001370 return self in self._constants._loopback_network
Nick Coghlan730f67f2012-08-05 22:02:18 +10001371
1372 @property
1373 def is_link_local(self):
1374 """Test if the address is reserved for link-local.
1375
1376 Returns:
1377 A boolean, True if the address is link-local per RFC 3927.
1378
1379 """
Antoine Pitroub19e75d2014-05-24 00:32:29 +02001380 return self in self._constants._linklocal_network
Nick Coghlan730f67f2012-08-05 22:02:18 +10001381
Nick Coghlandc9b2552012-05-20 21:01:57 +10001382
1383class IPv4Interface(IPv4Address):
1384
Nick Coghlandc9b2552012-05-20 21:01:57 +10001385 def __init__(self, address):
Inada Naoki6fa84bd2019-04-16 08:32:28 +09001386 addr, mask = self._split_addr_prefix(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001387
Inada Naoki6fa84bd2019-04-16 08:32:28 +09001388 IPv4Address.__init__(self, addr)
1389 self.network = IPv4Network((addr, mask), strict=False)
1390 self.netmask = self.network.netmask
Nick Coghlandc9b2552012-05-20 21:01:57 +10001391 self._prefixlen = self.network._prefixlen
1392
Inada Naoki6fa84bd2019-04-16 08:32:28 +09001393 @functools.cached_property
1394 def hostmask(self):
1395 return self.network.hostmask
Nick Coghlandc9b2552012-05-20 21:01:57 +10001396
Nick Coghlandc9b2552012-05-20 21:01:57 +10001397 def __str__(self):
1398 return '%s/%d' % (self._string_from_ip_int(self._ip),
Inada Naoki2430d532019-04-15 16:01:00 +09001399 self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001400
1401 def __eq__(self, other):
Nick Coghlan3008ec02012-07-08 00:45:33 +10001402 address_equal = IPv4Address.__eq__(self, other)
MojoVampire469325c2020-03-03 18:50:17 +00001403 if address_equal is NotImplemented or not address_equal:
Nick Coghlan3008ec02012-07-08 00:45:33 +10001404 return address_equal
Nick Coghlandc9b2552012-05-20 21:01:57 +10001405 try:
Nick Coghlan3008ec02012-07-08 00:45:33 +10001406 return self.network == other.network
Nick Coghlandc9b2552012-05-20 21:01:57 +10001407 except AttributeError:
Nick Coghlan3008ec02012-07-08 00:45:33 +10001408 # An interface with an associated network is NOT the
1409 # same as an unassociated address. That's why the hash
1410 # takes the extra info into account.
1411 return False
1412
1413 def __lt__(self, other):
1414 address_less = IPv4Address.__lt__(self, other)
1415 if address_less is NotImplemented:
Nick Coghlandc9b2552012-05-20 21:01:57 +10001416 return NotImplemented
Nick Coghlan3008ec02012-07-08 00:45:33 +10001417 try:
s-sanjay7bd8d3e2017-03-31 23:09:53 -07001418 return (self.network < other.network or
1419 self.network == other.network and address_less)
Nick Coghlan3008ec02012-07-08 00:45:33 +10001420 except AttributeError:
1421 # We *do* allow addresses and interfaces to be sorted. The
1422 # unassociated address is considered less than all interfaces.
1423 return False
Nick Coghlandc9b2552012-05-20 21:01:57 +10001424
1425 def __hash__(self):
1426 return self._ip ^ self._prefixlen ^ int(self.network.network_address)
1427
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +02001428 __reduce__ = _IPAddressBase.__reduce__
1429
Nick Coghlandc9b2552012-05-20 21:01:57 +10001430 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +10001431 def ip(self):
1432 return IPv4Address(self._ip)
1433
1434 @property
1435 def with_prefixlen(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10001436 return '%s/%s' % (self._string_from_ip_int(self._ip),
1437 self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001438
1439 @property
1440 def with_netmask(self):
1441 return '%s/%s' % (self._string_from_ip_int(self._ip),
1442 self.netmask)
Hynek Schlawack072b1e12012-05-26 12:04:56 +02001443
Nick Coghlandc9b2552012-05-20 21:01:57 +10001444 @property
1445 def with_hostmask(self):
1446 return '%s/%s' % (self._string_from_ip_int(self._ip),
1447 self.hostmask)
1448
Batuhan Taşkaya2fa67df2020-04-10 07:04:54 +03001449 __class_getitem__ = classmethod(types.GenericAlias)
1450
Nick Coghlandc9b2552012-05-20 21:01:57 +10001451
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'
1474 '192.0.0.2/0.0.0.255'
1475 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 """
1727 # Whitelist the characters, since int() allows a lot of bizarre stuff.
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):
2128 return self._ip ^ self._prefixlen ^ int(self.network.network_address)
2129
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +02002130 __reduce__ = _IPAddressBase.__reduce__
2131
Nick Coghlandc9b2552012-05-20 21:01:57 +10002132 @property
Nick Coghlandc9b2552012-05-20 21:01:57 +10002133 def ip(self):
2134 return IPv6Address(self._ip)
2135
2136 @property
2137 def with_prefixlen(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10002138 return '%s/%s' % (self._string_from_ip_int(self._ip),
2139 self._prefixlen)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002140
2141 @property
2142 def with_netmask(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10002143 return '%s/%s' % (self._string_from_ip_int(self._ip),
2144 self.netmask)
Hynek Schlawack072b1e12012-05-26 12:04:56 +02002145
Nick Coghlandc9b2552012-05-20 21:01:57 +10002146 @property
2147 def with_hostmask(self):
2148 return '%s/%s' % (self._string_from_ip_int(self._ip),
2149 self.hostmask)
2150
Nick Coghlan730f67f2012-08-05 22:02:18 +10002151 @property
2152 def is_unspecified(self):
2153 return self._ip == 0 and self.network.is_unspecified
2154
2155 @property
2156 def is_loopback(self):
2157 return self._ip == 1 and self.network.is_loopback
2158
Batuhan Taşkaya2fa67df2020-04-10 07:04:54 +03002159 __class_getitem__ = classmethod(types.GenericAlias)
2160
Nick Coghlandc9b2552012-05-20 21:01:57 +10002161
2162class IPv6Network(_BaseV6, _BaseNetwork):
2163
2164 """This class represents and manipulates 128-bit IPv6 networks.
2165
2166 Attributes: [examples for IPv6('2001:db8::1000/124')]
2167 .network_address: IPv6Address('2001:db8::1000')
2168 .hostmask: IPv6Address('::f')
2169 .broadcast_address: IPv6Address('2001:db8::100f')
2170 .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0')
2171 .prefixlen: 124
2172
2173 """
2174
Nick Coghlan51c30672012-05-27 00:25:58 +10002175 # Class to use when creating address objects
Nick Coghlan51c30672012-05-27 00:25:58 +10002176 _address_class = IPv6Address
2177
Nick Coghlandc9b2552012-05-20 21:01:57 +10002178 def __init__(self, address, strict=True):
2179 """Instantiate a new IPv6 Network object.
2180
2181 Args:
Hynek Schlawack072b1e12012-05-26 12:04:56 +02002182 address: A string or integer representing the IPv6 network or the
2183 IP and prefix/netmask.
Nick Coghlandc9b2552012-05-20 21:01:57 +10002184 '2001:db8::/128'
2185 '2001:db8:0000:0000:0000:0000:0000:0000/128'
2186 '2001:db8::'
2187 are all functionally the same in IPv6. That is to say,
2188 failing to provide a subnetmask will create an object with
2189 a mask of /128.
2190
2191 Additionally, an integer can be passed, so
2192 IPv6Network('2001:db8::') ==
2193 IPv6Network(42540766411282592856903984951653826560)
2194 or, more generally
2195 IPv6Network(int(IPv6Network('2001:db8::'))) ==
2196 IPv6Network('2001:db8::')
2197
2198 strict: A boolean. If true, ensure that we have been passed
2199 A true network address, eg, 2001:db8::1000/124 and not an
2200 IP address on a network, eg, 2001:db8::1/124.
2201
2202 Raises:
2203 AddressValueError: If address isn't a valid IPv6 address.
2204 NetmaskValueError: If the netmask isn't valid for
2205 an IPv6 address.
2206 ValueError: If strict was True and a network address was not
2207 supplied.
Nick Coghlandc9b2552012-05-20 21:01:57 +10002208 """
Inada Naoki6fa84bd2019-04-16 08:32:28 +09002209 addr, mask = self._split_addr_prefix(address)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002210
Xiang Zhang10b134a2018-03-21 08:25:13 +08002211 self.network_address = IPv6Address(addr)
2212 self.netmask, self._prefixlen = self._make_netmask(mask)
2213 packed = int(self.network_address)
2214 if packed & int(self.netmask) != packed:
2215 if strict:
Nick Coghlan912238e2012-07-07 13:34:50 +10002216 raise ValueError('%s has host bits set' % self)
Xiang Zhang10b134a2018-03-21 08:25:13 +08002217 else:
2218 self.network_address = IPv6Address(packed &
2219 int(self.netmask))
Nick Coghlandc9b2552012-05-20 21:01:57 +10002220
2221 if self._prefixlen == (self._max_prefixlen - 1):
2222 self.hosts = self.__iter__
Pete Wicken8e9c47a2020-03-09 22:33:45 +00002223 elif self._prefixlen == self._max_prefixlen:
2224 self.hosts = lambda: [IPv6Address(addr)]
Nick Coghlandc9b2552012-05-20 21:01:57 +10002225
Peter Moody1243c7d2014-03-11 09:55:46 -07002226 def hosts(self):
2227 """Generate Iterator over usable hosts in a network.
2228
2229 This is like __iter__ except it doesn't return the
2230 Subnet-Router anycast address.
2231
2232 """
2233 network = int(self.network_address)
2234 broadcast = int(self.broadcast_address)
2235 for x in range(network + 1, broadcast + 1):
2236 yield self._address_class(x)
2237
Nick Coghlan730f67f2012-08-05 22:02:18 +10002238 @property
2239 def is_site_local(self):
2240 """Test if the address is reserved for site-local.
2241
2242 Note that the site-local address space has been deprecated by RFC 3879.
2243 Use is_private to test if this address is in the space of unique local
2244 addresses as defined by RFC 4193.
2245
2246 Returns:
2247 A boolean, True if the address is reserved per RFC 3513 2.5.6.
2248
2249 """
2250 return (self.network_address.is_site_local and
2251 self.broadcast_address.is_site_local)
Antoine Pitrouf573ce92014-05-23 23:12:24 +02002252
2253
Antoine Pitroub19e75d2014-05-24 00:32:29 +02002254class _IPv6Constants:
Antoine Pitrouf573ce92014-05-23 23:12:24 +02002255
Antoine Pitroub19e75d2014-05-24 00:32:29 +02002256 _linklocal_network = IPv6Network('fe80::/10')
Antoine Pitrouf573ce92014-05-23 23:12:24 +02002257
Antoine Pitroub19e75d2014-05-24 00:32:29 +02002258 _multicast_network = IPv6Network('ff00::/8')
2259
2260 _private_networks = [
2261 IPv6Network('::1/128'),
2262 IPv6Network('::/128'),
2263 IPv6Network('::ffff:0:0/96'),
2264 IPv6Network('100::/64'),
2265 IPv6Network('2001::/23'),
2266 IPv6Network('2001:2::/48'),
2267 IPv6Network('2001:db8::/32'),
2268 IPv6Network('2001:10::/28'),
2269 IPv6Network('fc00::/7'),
2270 IPv6Network('fe80::/10'),
2271 ]
2272
2273 _reserved_networks = [
2274 IPv6Network('::/8'), IPv6Network('100::/8'),
2275 IPv6Network('200::/7'), IPv6Network('400::/6'),
2276 IPv6Network('800::/5'), IPv6Network('1000::/4'),
2277 IPv6Network('4000::/3'), IPv6Network('6000::/3'),
2278 IPv6Network('8000::/3'), IPv6Network('A000::/3'),
2279 IPv6Network('C000::/3'), IPv6Network('E000::/4'),
2280 IPv6Network('F000::/5'), IPv6Network('F800::/6'),
2281 IPv6Network('FE00::/9'),
Antoine Pitrouf573ce92014-05-23 23:12:24 +02002282 ]
2283
Antoine Pitroub19e75d2014-05-24 00:32:29 +02002284 _sitelocal_network = IPv6Network('fec0::/10')
Antoine Pitrouf573ce92014-05-23 23:12:24 +02002285
Antoine Pitroub19e75d2014-05-24 00:32:29 +02002286
2287IPv6Address._constants = _IPv6Constants