Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
hhhrrrttt222111
GitHub Repository: hhhrrrttt222111/Dorkify
Path: blob/master/venv/Lib/site-packages/pip/_vendor/ipaddress.py
811 views
1
# Copyright 2007 Google Inc.
2
# Licensed to PSF under a Contributor Agreement.
3
4
"""A fast, lightweight IPv4/IPv6 manipulation library in Python.
5
6
This library is used to create/poke/manipulate IPv4 and IPv6 addresses
7
and networks.
8
9
"""
10
11
from __future__ import unicode_literals
12
13
14
import itertools
15
import struct
16
17
__version__ = '1.0.23'
18
19
# Compatibility functions
20
_compat_int_types = (int,)
21
try:
22
_compat_int_types = (int, long)
23
except NameError:
24
pass
25
try:
26
_compat_str = unicode
27
except NameError:
28
_compat_str = str
29
assert bytes != str
30
if b'\0'[0] == 0: # Python 3 semantics
31
def _compat_bytes_to_byte_vals(byt):
32
return byt
33
else:
34
def _compat_bytes_to_byte_vals(byt):
35
return [struct.unpack(b'!B', b)[0] for b in byt]
36
try:
37
_compat_int_from_byte_vals = int.from_bytes
38
except AttributeError:
39
def _compat_int_from_byte_vals(bytvals, endianess):
40
assert endianess == 'big'
41
res = 0
42
for bv in bytvals:
43
assert isinstance(bv, _compat_int_types)
44
res = (res << 8) + bv
45
return res
46
47
48
def _compat_to_bytes(intval, length, endianess):
49
assert isinstance(intval, _compat_int_types)
50
assert endianess == 'big'
51
if length == 4:
52
if intval < 0 or intval >= 2 ** 32:
53
raise struct.error("integer out of range for 'I' format code")
54
return struct.pack(b'!I', intval)
55
elif length == 16:
56
if intval < 0 or intval >= 2 ** 128:
57
raise struct.error("integer out of range for 'QQ' format code")
58
return struct.pack(b'!QQ', intval >> 64, intval & 0xffffffffffffffff)
59
else:
60
raise NotImplementedError()
61
62
63
if hasattr(int, 'bit_length'):
64
# Not int.bit_length , since that won't work in 2.7 where long exists
65
def _compat_bit_length(i):
66
return i.bit_length()
67
else:
68
def _compat_bit_length(i):
69
for res in itertools.count():
70
if i >> res == 0:
71
return res
72
73
74
def _compat_range(start, end, step=1):
75
assert step > 0
76
i = start
77
while i < end:
78
yield i
79
i += step
80
81
82
class _TotalOrderingMixin(object):
83
__slots__ = ()
84
85
# Helper that derives the other comparison operations from
86
# __lt__ and __eq__
87
# We avoid functools.total_ordering because it doesn't handle
88
# NotImplemented correctly yet (http://bugs.python.org/issue10042)
89
def __eq__(self, other):
90
raise NotImplementedError
91
92
def __ne__(self, other):
93
equal = self.__eq__(other)
94
if equal is NotImplemented:
95
return NotImplemented
96
return not equal
97
98
def __lt__(self, other):
99
raise NotImplementedError
100
101
def __le__(self, other):
102
less = self.__lt__(other)
103
if less is NotImplemented or not less:
104
return self.__eq__(other)
105
return less
106
107
def __gt__(self, other):
108
less = self.__lt__(other)
109
if less is NotImplemented:
110
return NotImplemented
111
equal = self.__eq__(other)
112
if equal is NotImplemented:
113
return NotImplemented
114
return not (less or equal)
115
116
def __ge__(self, other):
117
less = self.__lt__(other)
118
if less is NotImplemented:
119
return NotImplemented
120
return not less
121
122
123
IPV4LENGTH = 32
124
IPV6LENGTH = 128
125
126
127
class AddressValueError(ValueError):
128
"""A Value Error related to the address."""
129
130
131
class NetmaskValueError(ValueError):
132
"""A Value Error related to the netmask."""
133
134
135
def ip_address(address):
136
"""Take an IP string/int and return an object of the correct type.
137
138
Args:
139
address: A string or integer, the IP address. Either IPv4 or
140
IPv6 addresses may be supplied; integers less than 2**32 will
141
be considered to be IPv4 by default.
142
143
Returns:
144
An IPv4Address or IPv6Address object.
145
146
Raises:
147
ValueError: if the *address* passed isn't either a v4 or a v6
148
address
149
150
"""
151
try:
152
return IPv4Address(address)
153
except (AddressValueError, NetmaskValueError):
154
pass
155
156
try:
157
return IPv6Address(address)
158
except (AddressValueError, NetmaskValueError):
159
pass
160
161
if isinstance(address, bytes):
162
raise AddressValueError(
163
'%r does not appear to be an IPv4 or IPv6 address. '
164
'Did you pass in a bytes (str in Python 2) instead of'
165
' a unicode object?' % address)
166
167
raise ValueError('%r does not appear to be an IPv4 or IPv6 address' %
168
address)
169
170
171
def ip_network(address, strict=True):
172
"""Take an IP string/int and return an object of the correct type.
173
174
Args:
175
address: A string or integer, the IP network. Either IPv4 or
176
IPv6 networks may be supplied; integers less than 2**32 will
177
be considered to be IPv4 by default.
178
179
Returns:
180
An IPv4Network or IPv6Network object.
181
182
Raises:
183
ValueError: if the string passed isn't either a v4 or a v6
184
address. Or if the network has host bits set.
185
186
"""
187
try:
188
return IPv4Network(address, strict)
189
except (AddressValueError, NetmaskValueError):
190
pass
191
192
try:
193
return IPv6Network(address, strict)
194
except (AddressValueError, NetmaskValueError):
195
pass
196
197
if isinstance(address, bytes):
198
raise AddressValueError(
199
'%r does not appear to be an IPv4 or IPv6 network. '
200
'Did you pass in a bytes (str in Python 2) instead of'
201
' a unicode object?' % address)
202
203
raise ValueError('%r does not appear to be an IPv4 or IPv6 network' %
204
address)
205
206
207
def ip_interface(address):
208
"""Take an IP string/int and return an object of the correct type.
209
210
Args:
211
address: A string or integer, the IP address. Either IPv4 or
212
IPv6 addresses may be supplied; integers less than 2**32 will
213
be considered to be IPv4 by default.
214
215
Returns:
216
An IPv4Interface or IPv6Interface object.
217
218
Raises:
219
ValueError: if the string passed isn't either a v4 or a v6
220
address.
221
222
Notes:
223
The IPv?Interface classes describe an Address on a particular
224
Network, so they're basically a combination of both the Address
225
and Network classes.
226
227
"""
228
try:
229
return IPv4Interface(address)
230
except (AddressValueError, NetmaskValueError):
231
pass
232
233
try:
234
return IPv6Interface(address)
235
except (AddressValueError, NetmaskValueError):
236
pass
237
238
raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' %
239
address)
240
241
242
def v4_int_to_packed(address):
243
"""Represent an address as 4 packed bytes in network (big-endian) order.
244
245
Args:
246
address: An integer representation of an IPv4 IP address.
247
248
Returns:
249
The integer address packed as 4 bytes in network (big-endian) order.
250
251
Raises:
252
ValueError: If the integer is negative or too large to be an
253
IPv4 IP address.
254
255
"""
256
try:
257
return _compat_to_bytes(address, 4, 'big')
258
except (struct.error, OverflowError):
259
raise ValueError("Address negative or too large for IPv4")
260
261
262
def v6_int_to_packed(address):
263
"""Represent an address as 16 packed bytes in network (big-endian) order.
264
265
Args:
266
address: An integer representation of an IPv6 IP address.
267
268
Returns:
269
The integer address packed as 16 bytes in network (big-endian) order.
270
271
"""
272
try:
273
return _compat_to_bytes(address, 16, 'big')
274
except (struct.error, OverflowError):
275
raise ValueError("Address negative or too large for IPv6")
276
277
278
def _split_optional_netmask(address):
279
"""Helper to split the netmask and raise AddressValueError if needed"""
280
addr = _compat_str(address).split('/')
281
if len(addr) > 2:
282
raise AddressValueError("Only one '/' permitted in %r" % address)
283
return addr
284
285
286
def _find_address_range(addresses):
287
"""Find a sequence of sorted deduplicated IPv#Address.
288
289
Args:
290
addresses: a list of IPv#Address objects.
291
292
Yields:
293
A tuple containing the first and last IP addresses in the sequence.
294
295
"""
296
it = iter(addresses)
297
first = last = next(it)
298
for ip in it:
299
if ip._ip != last._ip + 1:
300
yield first, last
301
first = ip
302
last = ip
303
yield first, last
304
305
306
def _count_righthand_zero_bits(number, bits):
307
"""Count the number of zero bits on the right hand side.
308
309
Args:
310
number: an integer.
311
bits: maximum number of bits to count.
312
313
Returns:
314
The number of zero bits on the right hand side of the number.
315
316
"""
317
if number == 0:
318
return bits
319
return min(bits, _compat_bit_length(~number & (number - 1)))
320
321
322
def summarize_address_range(first, last):
323
"""Summarize a network range given the first and last IP addresses.
324
325
Example:
326
>>> list(summarize_address_range(IPv4Address('192.0.2.0'),
327
... IPv4Address('192.0.2.130')))
328
... #doctest: +NORMALIZE_WHITESPACE
329
[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'),
330
IPv4Network('192.0.2.130/32')]
331
332
Args:
333
first: the first IPv4Address or IPv6Address in the range.
334
last: the last IPv4Address or IPv6Address in the range.
335
336
Returns:
337
An iterator of the summarized IPv(4|6) network objects.
338
339
Raise:
340
TypeError:
341
If the first and last objects are not IP addresses.
342
If the first and last objects are not the same version.
343
ValueError:
344
If the last object is not greater than the first.
345
If the version of the first address is not 4 or 6.
346
347
"""
348
if (not (isinstance(first, _BaseAddress) and
349
isinstance(last, _BaseAddress))):
350
raise TypeError('first and last must be IP addresses, not networks')
351
if first.version != last.version:
352
raise TypeError("%s and %s are not of the same version" % (
353
first, last))
354
if first > last:
355
raise ValueError('last IP address must be greater than first')
356
357
if first.version == 4:
358
ip = IPv4Network
359
elif first.version == 6:
360
ip = IPv6Network
361
else:
362
raise ValueError('unknown IP version')
363
364
ip_bits = first._max_prefixlen
365
first_int = first._ip
366
last_int = last._ip
367
while first_int <= last_int:
368
nbits = min(_count_righthand_zero_bits(first_int, ip_bits),
369
_compat_bit_length(last_int - first_int + 1) - 1)
370
net = ip((first_int, ip_bits - nbits))
371
yield net
372
first_int += 1 << nbits
373
if first_int - 1 == ip._ALL_ONES:
374
break
375
376
377
def _collapse_addresses_internal(addresses):
378
"""Loops through the addresses, collapsing concurrent netblocks.
379
380
Example:
381
382
ip1 = IPv4Network('192.0.2.0/26')
383
ip2 = IPv4Network('192.0.2.64/26')
384
ip3 = IPv4Network('192.0.2.128/26')
385
ip4 = IPv4Network('192.0.2.192/26')
386
387
_collapse_addresses_internal([ip1, ip2, ip3, ip4]) ->
388
[IPv4Network('192.0.2.0/24')]
389
390
This shouldn't be called directly; it is called via
391
collapse_addresses([]).
392
393
Args:
394
addresses: A list of IPv4Network's or IPv6Network's
395
396
Returns:
397
A list of IPv4Network's or IPv6Network's depending on what we were
398
passed.
399
400
"""
401
# First merge
402
to_merge = list(addresses)
403
subnets = {}
404
while to_merge:
405
net = to_merge.pop()
406
supernet = net.supernet()
407
existing = subnets.get(supernet)
408
if existing is None:
409
subnets[supernet] = net
410
elif existing != net:
411
# Merge consecutive subnets
412
del subnets[supernet]
413
to_merge.append(supernet)
414
# Then iterate over resulting networks, skipping subsumed subnets
415
last = None
416
for net in sorted(subnets.values()):
417
if last is not None:
418
# Since they are sorted,
419
# last.network_address <= net.network_address is a given.
420
if last.broadcast_address >= net.broadcast_address:
421
continue
422
yield net
423
last = net
424
425
426
def collapse_addresses(addresses):
427
"""Collapse a list of IP objects.
428
429
Example:
430
collapse_addresses([IPv4Network('192.0.2.0/25'),
431
IPv4Network('192.0.2.128/25')]) ->
432
[IPv4Network('192.0.2.0/24')]
433
434
Args:
435
addresses: An iterator of IPv4Network or IPv6Network objects.
436
437
Returns:
438
An iterator of the collapsed IPv(4|6)Network objects.
439
440
Raises:
441
TypeError: If passed a list of mixed version objects.
442
443
"""
444
addrs = []
445
ips = []
446
nets = []
447
448
# split IP addresses and networks
449
for ip in addresses:
450
if isinstance(ip, _BaseAddress):
451
if ips and ips[-1]._version != ip._version:
452
raise TypeError("%s and %s are not of the same version" % (
453
ip, ips[-1]))
454
ips.append(ip)
455
elif ip._prefixlen == ip._max_prefixlen:
456
if ips and ips[-1]._version != ip._version:
457
raise TypeError("%s and %s are not of the same version" % (
458
ip, ips[-1]))
459
try:
460
ips.append(ip.ip)
461
except AttributeError:
462
ips.append(ip.network_address)
463
else:
464
if nets and nets[-1]._version != ip._version:
465
raise TypeError("%s and %s are not of the same version" % (
466
ip, nets[-1]))
467
nets.append(ip)
468
469
# sort and dedup
470
ips = sorted(set(ips))
471
472
# find consecutive address ranges in the sorted sequence and summarize them
473
if ips:
474
for first, last in _find_address_range(ips):
475
addrs.extend(summarize_address_range(first, last))
476
477
return _collapse_addresses_internal(addrs + nets)
478
479
480
def get_mixed_type_key(obj):
481
"""Return a key suitable for sorting between networks and addresses.
482
483
Address and Network objects are not sortable by default; they're
484
fundamentally different so the expression
485
486
IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')
487
488
doesn't make any sense. There are some times however, where you may wish
489
to have ipaddress sort these for you anyway. If you need to do this, you
490
can use this function as the key= argument to sorted().
491
492
Args:
493
obj: either a Network or Address object.
494
Returns:
495
appropriate key.
496
497
"""
498
if isinstance(obj, _BaseNetwork):
499
return obj._get_networks_key()
500
elif isinstance(obj, _BaseAddress):
501
return obj._get_address_key()
502
return NotImplemented
503
504
505
class _IPAddressBase(_TotalOrderingMixin):
506
507
"""The mother class."""
508
509
__slots__ = ()
510
511
@property
512
def exploded(self):
513
"""Return the longhand version of the IP address as a string."""
514
return self._explode_shorthand_ip_string()
515
516
@property
517
def compressed(self):
518
"""Return the shorthand version of the IP address as a string."""
519
return _compat_str(self)
520
521
@property
522
def reverse_pointer(self):
523
"""The name of the reverse DNS pointer for the IP address, e.g.:
524
>>> ipaddress.ip_address("127.0.0.1").reverse_pointer
525
'1.0.0.127.in-addr.arpa'
526
>>> ipaddress.ip_address("2001:db8::1").reverse_pointer
527
'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'
528
529
"""
530
return self._reverse_pointer()
531
532
@property
533
def version(self):
534
msg = '%200s has no version specified' % (type(self),)
535
raise NotImplementedError(msg)
536
537
def _check_int_address(self, address):
538
if address < 0:
539
msg = "%d (< 0) is not permitted as an IPv%d address"
540
raise AddressValueError(msg % (address, self._version))
541
if address > self._ALL_ONES:
542
msg = "%d (>= 2**%d) is not permitted as an IPv%d address"
543
raise AddressValueError(msg % (address, self._max_prefixlen,
544
self._version))
545
546
def _check_packed_address(self, address, expected_len):
547
address_len = len(address)
548
if address_len != expected_len:
549
msg = (
550
'%r (len %d != %d) is not permitted as an IPv%d address. '
551
'Did you pass in a bytes (str in Python 2) instead of'
552
' a unicode object?')
553
raise AddressValueError(msg % (address, address_len,
554
expected_len, self._version))
555
556
@classmethod
557
def _ip_int_from_prefix(cls, prefixlen):
558
"""Turn the prefix length into a bitwise netmask
559
560
Args:
561
prefixlen: An integer, the prefix length.
562
563
Returns:
564
An integer.
565
566
"""
567
return cls._ALL_ONES ^ (cls._ALL_ONES >> prefixlen)
568
569
@classmethod
570
def _prefix_from_ip_int(cls, ip_int):
571
"""Return prefix length from the bitwise netmask.
572
573
Args:
574
ip_int: An integer, the netmask in expanded bitwise format
575
576
Returns:
577
An integer, the prefix length.
578
579
Raises:
580
ValueError: If the input intermingles zeroes & ones
581
"""
582
trailing_zeroes = _count_righthand_zero_bits(ip_int,
583
cls._max_prefixlen)
584
prefixlen = cls._max_prefixlen - trailing_zeroes
585
leading_ones = ip_int >> trailing_zeroes
586
all_ones = (1 << prefixlen) - 1
587
if leading_ones != all_ones:
588
byteslen = cls._max_prefixlen // 8
589
details = _compat_to_bytes(ip_int, byteslen, 'big')
590
msg = 'Netmask pattern %r mixes zeroes & ones'
591
raise ValueError(msg % details)
592
return prefixlen
593
594
@classmethod
595
def _report_invalid_netmask(cls, netmask_str):
596
msg = '%r is not a valid netmask' % netmask_str
597
raise NetmaskValueError(msg)
598
599
@classmethod
600
def _prefix_from_prefix_string(cls, prefixlen_str):
601
"""Return prefix length from a numeric string
602
603
Args:
604
prefixlen_str: The string to be converted
605
606
Returns:
607
An integer, the prefix length.
608
609
Raises:
610
NetmaskValueError: If the input is not a valid netmask
611
"""
612
# int allows a leading +/- as well as surrounding whitespace,
613
# so we ensure that isn't the case
614
if not _BaseV4._DECIMAL_DIGITS.issuperset(prefixlen_str):
615
cls._report_invalid_netmask(prefixlen_str)
616
try:
617
prefixlen = int(prefixlen_str)
618
except ValueError:
619
cls._report_invalid_netmask(prefixlen_str)
620
if not (0 <= prefixlen <= cls._max_prefixlen):
621
cls._report_invalid_netmask(prefixlen_str)
622
return prefixlen
623
624
@classmethod
625
def _prefix_from_ip_string(cls, ip_str):
626
"""Turn a netmask/hostmask string into a prefix length
627
628
Args:
629
ip_str: The netmask/hostmask to be converted
630
631
Returns:
632
An integer, the prefix length.
633
634
Raises:
635
NetmaskValueError: If the input is not a valid netmask/hostmask
636
"""
637
# Parse the netmask/hostmask like an IP address.
638
try:
639
ip_int = cls._ip_int_from_string(ip_str)
640
except AddressValueError:
641
cls._report_invalid_netmask(ip_str)
642
643
# Try matching a netmask (this would be /1*0*/ as a bitwise regexp).
644
# Note that the two ambiguous cases (all-ones and all-zeroes) are
645
# treated as netmasks.
646
try:
647
return cls._prefix_from_ip_int(ip_int)
648
except ValueError:
649
pass
650
651
# Invert the bits, and try matching a /0+1+/ hostmask instead.
652
ip_int ^= cls._ALL_ONES
653
try:
654
return cls._prefix_from_ip_int(ip_int)
655
except ValueError:
656
cls._report_invalid_netmask(ip_str)
657
658
def __reduce__(self):
659
return self.__class__, (_compat_str(self),)
660
661
662
class _BaseAddress(_IPAddressBase):
663
664
"""A generic IP object.
665
666
This IP class contains the version independent methods which are
667
used by single IP addresses.
668
"""
669
670
__slots__ = ()
671
672
def __int__(self):
673
return self._ip
674
675
def __eq__(self, other):
676
try:
677
return (self._ip == other._ip and
678
self._version == other._version)
679
except AttributeError:
680
return NotImplemented
681
682
def __lt__(self, other):
683
if not isinstance(other, _IPAddressBase):
684
return NotImplemented
685
if not isinstance(other, _BaseAddress):
686
raise TypeError('%s and %s are not of the same type' % (
687
self, other))
688
if self._version != other._version:
689
raise TypeError('%s and %s are not of the same version' % (
690
self, other))
691
if self._ip != other._ip:
692
return self._ip < other._ip
693
return False
694
695
# Shorthand for Integer addition and subtraction. This is not
696
# meant to ever support addition/subtraction of addresses.
697
def __add__(self, other):
698
if not isinstance(other, _compat_int_types):
699
return NotImplemented
700
return self.__class__(int(self) + other)
701
702
def __sub__(self, other):
703
if not isinstance(other, _compat_int_types):
704
return NotImplemented
705
return self.__class__(int(self) - other)
706
707
def __repr__(self):
708
return '%s(%r)' % (self.__class__.__name__, _compat_str(self))
709
710
def __str__(self):
711
return _compat_str(self._string_from_ip_int(self._ip))
712
713
def __hash__(self):
714
return hash(hex(int(self._ip)))
715
716
def _get_address_key(self):
717
return (self._version, self)
718
719
def __reduce__(self):
720
return self.__class__, (self._ip,)
721
722
723
class _BaseNetwork(_IPAddressBase):
724
725
"""A generic IP network object.
726
727
This IP class contains the version independent methods which are
728
used by networks.
729
730
"""
731
def __init__(self, address):
732
self._cache = {}
733
734
def __repr__(self):
735
return '%s(%r)' % (self.__class__.__name__, _compat_str(self))
736
737
def __str__(self):
738
return '%s/%d' % (self.network_address, self.prefixlen)
739
740
def hosts(self):
741
"""Generate Iterator over usable hosts in a network.
742
743
This is like __iter__ except it doesn't return the network
744
or broadcast addresses.
745
746
"""
747
network = int(self.network_address)
748
broadcast = int(self.broadcast_address)
749
for x in _compat_range(network + 1, broadcast):
750
yield self._address_class(x)
751
752
def __iter__(self):
753
network = int(self.network_address)
754
broadcast = int(self.broadcast_address)
755
for x in _compat_range(network, broadcast + 1):
756
yield self._address_class(x)
757
758
def __getitem__(self, n):
759
network = int(self.network_address)
760
broadcast = int(self.broadcast_address)
761
if n >= 0:
762
if network + n > broadcast:
763
raise IndexError('address out of range')
764
return self._address_class(network + n)
765
else:
766
n += 1
767
if broadcast + n < network:
768
raise IndexError('address out of range')
769
return self._address_class(broadcast + n)
770
771
def __lt__(self, other):
772
if not isinstance(other, _IPAddressBase):
773
return NotImplemented
774
if not isinstance(other, _BaseNetwork):
775
raise TypeError('%s and %s are not of the same type' % (
776
self, other))
777
if self._version != other._version:
778
raise TypeError('%s and %s are not of the same version' % (
779
self, other))
780
if self.network_address != other.network_address:
781
return self.network_address < other.network_address
782
if self.netmask != other.netmask:
783
return self.netmask < other.netmask
784
return False
785
786
def __eq__(self, other):
787
try:
788
return (self._version == other._version and
789
self.network_address == other.network_address and
790
int(self.netmask) == int(other.netmask))
791
except AttributeError:
792
return NotImplemented
793
794
def __hash__(self):
795
return hash(int(self.network_address) ^ int(self.netmask))
796
797
def __contains__(self, other):
798
# always false if one is v4 and the other is v6.
799
if self._version != other._version:
800
return False
801
# dealing with another network.
802
if isinstance(other, _BaseNetwork):
803
return False
804
# dealing with another address
805
else:
806
# address
807
return (int(self.network_address) <= int(other._ip) <=
808
int(self.broadcast_address))
809
810
def overlaps(self, other):
811
"""Tell if self is partly contained in other."""
812
return self.network_address in other or (
813
self.broadcast_address in other or (
814
other.network_address in self or (
815
other.broadcast_address in self)))
816
817
@property
818
def broadcast_address(self):
819
x = self._cache.get('broadcast_address')
820
if x is None:
821
x = self._address_class(int(self.network_address) |
822
int(self.hostmask))
823
self._cache['broadcast_address'] = x
824
return x
825
826
@property
827
def hostmask(self):
828
x = self._cache.get('hostmask')
829
if x is None:
830
x = self._address_class(int(self.netmask) ^ self._ALL_ONES)
831
self._cache['hostmask'] = x
832
return x
833
834
@property
835
def with_prefixlen(self):
836
return '%s/%d' % (self.network_address, self._prefixlen)
837
838
@property
839
def with_netmask(self):
840
return '%s/%s' % (self.network_address, self.netmask)
841
842
@property
843
def with_hostmask(self):
844
return '%s/%s' % (self.network_address, self.hostmask)
845
846
@property
847
def num_addresses(self):
848
"""Number of hosts in the current subnet."""
849
return int(self.broadcast_address) - int(self.network_address) + 1
850
851
@property
852
def _address_class(self):
853
# Returning bare address objects (rather than interfaces) allows for
854
# more consistent behaviour across the network address, broadcast
855
# address and individual host addresses.
856
msg = '%200s has no associated address class' % (type(self),)
857
raise NotImplementedError(msg)
858
859
@property
860
def prefixlen(self):
861
return self._prefixlen
862
863
def address_exclude(self, other):
864
"""Remove an address from a larger block.
865
866
For example:
867
868
addr1 = ip_network('192.0.2.0/28')
869
addr2 = ip_network('192.0.2.1/32')
870
list(addr1.address_exclude(addr2)) =
871
[IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'),
872
IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')]
873
874
or IPv6:
875
876
addr1 = ip_network('2001:db8::1/32')
877
addr2 = ip_network('2001:db8::1/128')
878
list(addr1.address_exclude(addr2)) =
879
[ip_network('2001:db8::1/128'),
880
ip_network('2001:db8::2/127'),
881
ip_network('2001:db8::4/126'),
882
ip_network('2001:db8::8/125'),
883
...
884
ip_network('2001:db8:8000::/33')]
885
886
Args:
887
other: An IPv4Network or IPv6Network object of the same type.
888
889
Returns:
890
An iterator of the IPv(4|6)Network objects which is self
891
minus other.
892
893
Raises:
894
TypeError: If self and other are of differing address
895
versions, or if other is not a network object.
896
ValueError: If other is not completely contained by self.
897
898
"""
899
if not self._version == other._version:
900
raise TypeError("%s and %s are not of the same version" % (
901
self, other))
902
903
if not isinstance(other, _BaseNetwork):
904
raise TypeError("%s is not a network object" % other)
905
906
if not other.subnet_of(self):
907
raise ValueError('%s not contained in %s' % (other, self))
908
if other == self:
909
return
910
911
# Make sure we're comparing the network of other.
912
other = other.__class__('%s/%s' % (other.network_address,
913
other.prefixlen))
914
915
s1, s2 = self.subnets()
916
while s1 != other and s2 != other:
917
if other.subnet_of(s1):
918
yield s2
919
s1, s2 = s1.subnets()
920
elif other.subnet_of(s2):
921
yield s1
922
s1, s2 = s2.subnets()
923
else:
924
# If we got here, there's a bug somewhere.
925
raise AssertionError('Error performing exclusion: '
926
's1: %s s2: %s other: %s' %
927
(s1, s2, other))
928
if s1 == other:
929
yield s2
930
elif s2 == other:
931
yield s1
932
else:
933
# If we got here, there's a bug somewhere.
934
raise AssertionError('Error performing exclusion: '
935
's1: %s s2: %s other: %s' %
936
(s1, s2, other))
937
938
def compare_networks(self, other):
939
"""Compare two IP objects.
940
941
This is only concerned about the comparison of the integer
942
representation of the network addresses. This means that the
943
host bits aren't considered at all in this method. If you want
944
to compare host bits, you can easily enough do a
945
'HostA._ip < HostB._ip'
946
947
Args:
948
other: An IP object.
949
950
Returns:
951
If the IP versions of self and other are the same, returns:
952
953
-1 if self < other:
954
eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25')
955
IPv6Network('2001:db8::1000/124') <
956
IPv6Network('2001:db8::2000/124')
957
0 if self == other
958
eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24')
959
IPv6Network('2001:db8::1000/124') ==
960
IPv6Network('2001:db8::1000/124')
961
1 if self > other
962
eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25')
963
IPv6Network('2001:db8::2000/124') >
964
IPv6Network('2001:db8::1000/124')
965
966
Raises:
967
TypeError if the IP versions are different.
968
969
"""
970
# does this need to raise a ValueError?
971
if self._version != other._version:
972
raise TypeError('%s and %s are not of the same type' % (
973
self, other))
974
# self._version == other._version below here:
975
if self.network_address < other.network_address:
976
return -1
977
if self.network_address > other.network_address:
978
return 1
979
# self.network_address == other.network_address below here:
980
if self.netmask < other.netmask:
981
return -1
982
if self.netmask > other.netmask:
983
return 1
984
return 0
985
986
def _get_networks_key(self):
987
"""Network-only key function.
988
989
Returns an object that identifies this address' network and
990
netmask. This function is a suitable "key" argument for sorted()
991
and list.sort().
992
993
"""
994
return (self._version, self.network_address, self.netmask)
995
996
def subnets(self, prefixlen_diff=1, new_prefix=None):
997
"""The subnets which join to make the current subnet.
998
999
In the case that self contains only one IP
1000
(self._prefixlen == 32 for IPv4 or self._prefixlen == 128
1001
for IPv6), yield an iterator with just ourself.
1002
1003
Args:
1004
prefixlen_diff: An integer, the amount the prefix length
1005
should be increased by. This should not be set if
1006
new_prefix is also set.
1007
new_prefix: The desired new prefix length. This must be a
1008
larger number (smaller prefix) than the existing prefix.
1009
This should not be set if prefixlen_diff is also set.
1010
1011
Returns:
1012
An iterator of IPv(4|6) objects.
1013
1014
Raises:
1015
ValueError: The prefixlen_diff is too small or too large.
1016
OR
1017
prefixlen_diff and new_prefix are both set or new_prefix
1018
is a smaller number than the current prefix (smaller
1019
number means a larger network)
1020
1021
"""
1022
if self._prefixlen == self._max_prefixlen:
1023
yield self
1024
return
1025
1026
if new_prefix is not None:
1027
if new_prefix < self._prefixlen:
1028
raise ValueError('new prefix must be longer')
1029
if prefixlen_diff != 1:
1030
raise ValueError('cannot set prefixlen_diff and new_prefix')
1031
prefixlen_diff = new_prefix - self._prefixlen
1032
1033
if prefixlen_diff < 0:
1034
raise ValueError('prefix length diff must be > 0')
1035
new_prefixlen = self._prefixlen + prefixlen_diff
1036
1037
if new_prefixlen > self._max_prefixlen:
1038
raise ValueError(
1039
'prefix length diff %d is invalid for netblock %s' % (
1040
new_prefixlen, self))
1041
1042
start = int(self.network_address)
1043
end = int(self.broadcast_address) + 1
1044
step = (int(self.hostmask) + 1) >> prefixlen_diff
1045
for new_addr in _compat_range(start, end, step):
1046
current = self.__class__((new_addr, new_prefixlen))
1047
yield current
1048
1049
def supernet(self, prefixlen_diff=1, new_prefix=None):
1050
"""The supernet containing the current network.
1051
1052
Args:
1053
prefixlen_diff: An integer, the amount the prefix length of
1054
the network should be decreased by. For example, given a
1055
/24 network and a prefixlen_diff of 3, a supernet with a
1056
/21 netmask is returned.
1057
1058
Returns:
1059
An IPv4 network object.
1060
1061
Raises:
1062
ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have
1063
a negative prefix length.
1064
OR
1065
If prefixlen_diff and new_prefix are both set or new_prefix is a
1066
larger number than the current prefix (larger number means a
1067
smaller network)
1068
1069
"""
1070
if self._prefixlen == 0:
1071
return self
1072
1073
if new_prefix is not None:
1074
if new_prefix > self._prefixlen:
1075
raise ValueError('new prefix must be shorter')
1076
if prefixlen_diff != 1:
1077
raise ValueError('cannot set prefixlen_diff and new_prefix')
1078
prefixlen_diff = self._prefixlen - new_prefix
1079
1080
new_prefixlen = self.prefixlen - prefixlen_diff
1081
if new_prefixlen < 0:
1082
raise ValueError(
1083
'current prefixlen is %d, cannot have a prefixlen_diff of %d' %
1084
(self.prefixlen, prefixlen_diff))
1085
return self.__class__((
1086
int(self.network_address) & (int(self.netmask) << prefixlen_diff),
1087
new_prefixlen))
1088
1089
@property
1090
def is_multicast(self):
1091
"""Test if the address is reserved for multicast use.
1092
1093
Returns:
1094
A boolean, True if the address is a multicast address.
1095
See RFC 2373 2.7 for details.
1096
1097
"""
1098
return (self.network_address.is_multicast and
1099
self.broadcast_address.is_multicast)
1100
1101
@staticmethod
1102
def _is_subnet_of(a, b):
1103
try:
1104
# Always false if one is v4 and the other is v6.
1105
if a._version != b._version:
1106
raise TypeError(
1107
"%s and %s are not of the same version" % (a, b))
1108
return (b.network_address <= a.network_address and
1109
b.broadcast_address >= a.broadcast_address)
1110
except AttributeError:
1111
raise TypeError("Unable to test subnet containment "
1112
"between %s and %s" % (a, b))
1113
1114
def subnet_of(self, other):
1115
"""Return True if this network is a subnet of other."""
1116
return self._is_subnet_of(self, other)
1117
1118
def supernet_of(self, other):
1119
"""Return True if this network is a supernet of other."""
1120
return self._is_subnet_of(other, self)
1121
1122
@property
1123
def is_reserved(self):
1124
"""Test if the address is otherwise IETF reserved.
1125
1126
Returns:
1127
A boolean, True if the address is within one of the
1128
reserved IPv6 Network ranges.
1129
1130
"""
1131
return (self.network_address.is_reserved and
1132
self.broadcast_address.is_reserved)
1133
1134
@property
1135
def is_link_local(self):
1136
"""Test if the address is reserved for link-local.
1137
1138
Returns:
1139
A boolean, True if the address is reserved per RFC 4291.
1140
1141
"""
1142
return (self.network_address.is_link_local and
1143
self.broadcast_address.is_link_local)
1144
1145
@property
1146
def is_private(self):
1147
"""Test if this address is allocated for private networks.
1148
1149
Returns:
1150
A boolean, True if the address is reserved per
1151
iana-ipv4-special-registry or iana-ipv6-special-registry.
1152
1153
"""
1154
return (self.network_address.is_private and
1155
self.broadcast_address.is_private)
1156
1157
@property
1158
def is_global(self):
1159
"""Test if this address is allocated for public networks.
1160
1161
Returns:
1162
A boolean, True if the address is not reserved per
1163
iana-ipv4-special-registry or iana-ipv6-special-registry.
1164
1165
"""
1166
return not self.is_private
1167
1168
@property
1169
def is_unspecified(self):
1170
"""Test if the address is unspecified.
1171
1172
Returns:
1173
A boolean, True if this is the unspecified address as defined in
1174
RFC 2373 2.5.2.
1175
1176
"""
1177
return (self.network_address.is_unspecified and
1178
self.broadcast_address.is_unspecified)
1179
1180
@property
1181
def is_loopback(self):
1182
"""Test if the address is a loopback address.
1183
1184
Returns:
1185
A boolean, True if the address is a loopback address as defined in
1186
RFC 2373 2.5.3.
1187
1188
"""
1189
return (self.network_address.is_loopback and
1190
self.broadcast_address.is_loopback)
1191
1192
1193
class _BaseV4(object):
1194
1195
"""Base IPv4 object.
1196
1197
The following methods are used by IPv4 objects in both single IP
1198
addresses and networks.
1199
1200
"""
1201
1202
__slots__ = ()
1203
_version = 4
1204
# Equivalent to 255.255.255.255 or 32 bits of 1's.
1205
_ALL_ONES = (2 ** IPV4LENGTH) - 1
1206
_DECIMAL_DIGITS = frozenset('0123456789')
1207
1208
# the valid octets for host and netmasks. only useful for IPv4.
1209
_valid_mask_octets = frozenset([255, 254, 252, 248, 240, 224, 192, 128, 0])
1210
1211
_max_prefixlen = IPV4LENGTH
1212
# There are only a handful of valid v4 netmasks, so we cache them all
1213
# when constructed (see _make_netmask()).
1214
_netmask_cache = {}
1215
1216
def _explode_shorthand_ip_string(self):
1217
return _compat_str(self)
1218
1219
@classmethod
1220
def _make_netmask(cls, arg):
1221
"""Make a (netmask, prefix_len) tuple from the given argument.
1222
1223
Argument can be:
1224
- an integer (the prefix length)
1225
- a string representing the prefix length (e.g. "24")
1226
- a string representing the prefix netmask (e.g. "255.255.255.0")
1227
"""
1228
if arg not in cls._netmask_cache:
1229
if isinstance(arg, _compat_int_types):
1230
prefixlen = arg
1231
else:
1232
try:
1233
# Check for a netmask in prefix length form
1234
prefixlen = cls._prefix_from_prefix_string(arg)
1235
except NetmaskValueError:
1236
# Check for a netmask or hostmask in dotted-quad form.
1237
# This may raise NetmaskValueError.
1238
prefixlen = cls._prefix_from_ip_string(arg)
1239
netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen))
1240
cls._netmask_cache[arg] = netmask, prefixlen
1241
return cls._netmask_cache[arg]
1242
1243
@classmethod
1244
def _ip_int_from_string(cls, ip_str):
1245
"""Turn the given IP string into an integer for comparison.
1246
1247
Args:
1248
ip_str: A string, the IP ip_str.
1249
1250
Returns:
1251
The IP ip_str as an integer.
1252
1253
Raises:
1254
AddressValueError: if ip_str isn't a valid IPv4 Address.
1255
1256
"""
1257
if not ip_str:
1258
raise AddressValueError('Address cannot be empty')
1259
1260
octets = ip_str.split('.')
1261
if len(octets) != 4:
1262
raise AddressValueError("Expected 4 octets in %r" % ip_str)
1263
1264
try:
1265
return _compat_int_from_byte_vals(
1266
map(cls._parse_octet, octets), 'big')
1267
except ValueError as exc:
1268
raise AddressValueError("%s in %r" % (exc, ip_str))
1269
1270
@classmethod
1271
def _parse_octet(cls, octet_str):
1272
"""Convert a decimal octet into an integer.
1273
1274
Args:
1275
octet_str: A string, the number to parse.
1276
1277
Returns:
1278
The octet as an integer.
1279
1280
Raises:
1281
ValueError: if the octet isn't strictly a decimal from [0..255].
1282
1283
"""
1284
if not octet_str:
1285
raise ValueError("Empty octet not permitted")
1286
# Whitelist the characters, since int() allows a lot of bizarre stuff.
1287
if not cls._DECIMAL_DIGITS.issuperset(octet_str):
1288
msg = "Only decimal digits permitted in %r"
1289
raise ValueError(msg % octet_str)
1290
# We do the length check second, since the invalid character error
1291
# is likely to be more informative for the user
1292
if len(octet_str) > 3:
1293
msg = "At most 3 characters permitted in %r"
1294
raise ValueError(msg % octet_str)
1295
# Convert to integer (we know digits are legal)
1296
octet_int = int(octet_str, 10)
1297
# Any octets that look like they *might* be written in octal,
1298
# and which don't look exactly the same in both octal and
1299
# decimal are rejected as ambiguous
1300
if octet_int > 7 and octet_str[0] == '0':
1301
msg = "Ambiguous (octal/decimal) value in %r not permitted"
1302
raise ValueError(msg % octet_str)
1303
if octet_int > 255:
1304
raise ValueError("Octet %d (> 255) not permitted" % octet_int)
1305
return octet_int
1306
1307
@classmethod
1308
def _string_from_ip_int(cls, ip_int):
1309
"""Turns a 32-bit integer into dotted decimal notation.
1310
1311
Args:
1312
ip_int: An integer, the IP address.
1313
1314
Returns:
1315
The IP address as a string in dotted decimal notation.
1316
1317
"""
1318
return '.'.join(_compat_str(struct.unpack(b'!B', b)[0]
1319
if isinstance(b, bytes)
1320
else b)
1321
for b in _compat_to_bytes(ip_int, 4, 'big'))
1322
1323
def _is_hostmask(self, ip_str):
1324
"""Test if the IP string is a hostmask (rather than a netmask).
1325
1326
Args:
1327
ip_str: A string, the potential hostmask.
1328
1329
Returns:
1330
A boolean, True if the IP string is a hostmask.
1331
1332
"""
1333
bits = ip_str.split('.')
1334
try:
1335
parts = [x for x in map(int, bits) if x in self._valid_mask_octets]
1336
except ValueError:
1337
return False
1338
if len(parts) != len(bits):
1339
return False
1340
if parts[0] < parts[-1]:
1341
return True
1342
return False
1343
1344
def _reverse_pointer(self):
1345
"""Return the reverse DNS pointer name for the IPv4 address.
1346
1347
This implements the method described in RFC1035 3.5.
1348
1349
"""
1350
reverse_octets = _compat_str(self).split('.')[::-1]
1351
return '.'.join(reverse_octets) + '.in-addr.arpa'
1352
1353
@property
1354
def max_prefixlen(self):
1355
return self._max_prefixlen
1356
1357
@property
1358
def version(self):
1359
return self._version
1360
1361
1362
class IPv4Address(_BaseV4, _BaseAddress):
1363
1364
"""Represent and manipulate single IPv4 Addresses."""
1365
1366
__slots__ = ('_ip', '__weakref__')
1367
1368
def __init__(self, address):
1369
1370
"""
1371
Args:
1372
address: A string or integer representing the IP
1373
1374
Additionally, an integer can be passed, so
1375
IPv4Address('192.0.2.1') == IPv4Address(3221225985).
1376
or, more generally
1377
IPv4Address(int(IPv4Address('192.0.2.1'))) ==
1378
IPv4Address('192.0.2.1')
1379
1380
Raises:
1381
AddressValueError: If ipaddress isn't a valid IPv4 address.
1382
1383
"""
1384
# Efficient constructor from integer.
1385
if isinstance(address, _compat_int_types):
1386
self._check_int_address(address)
1387
self._ip = address
1388
return
1389
1390
# Constructing from a packed address
1391
if isinstance(address, bytes):
1392
self._check_packed_address(address, 4)
1393
bvs = _compat_bytes_to_byte_vals(address)
1394
self._ip = _compat_int_from_byte_vals(bvs, 'big')
1395
return
1396
1397
# Assume input argument to be string or any object representation
1398
# which converts into a formatted IP string.
1399
addr_str = _compat_str(address)
1400
if '/' in addr_str:
1401
raise AddressValueError("Unexpected '/' in %r" % address)
1402
self._ip = self._ip_int_from_string(addr_str)
1403
1404
@property
1405
def packed(self):
1406
"""The binary representation of this address."""
1407
return v4_int_to_packed(self._ip)
1408
1409
@property
1410
def is_reserved(self):
1411
"""Test if the address is otherwise IETF reserved.
1412
1413
Returns:
1414
A boolean, True if the address is within the
1415
reserved IPv4 Network range.
1416
1417
"""
1418
return self in self._constants._reserved_network
1419
1420
@property
1421
def is_private(self):
1422
"""Test if this address is allocated for private networks.
1423
1424
Returns:
1425
A boolean, True if the address is reserved per
1426
iana-ipv4-special-registry.
1427
1428
"""
1429
return any(self in net for net in self._constants._private_networks)
1430
1431
@property
1432
def is_global(self):
1433
return (
1434
self not in self._constants._public_network and
1435
not self.is_private)
1436
1437
@property
1438
def is_multicast(self):
1439
"""Test if the address is reserved for multicast use.
1440
1441
Returns:
1442
A boolean, True if the address is multicast.
1443
See RFC 3171 for details.
1444
1445
"""
1446
return self in self._constants._multicast_network
1447
1448
@property
1449
def is_unspecified(self):
1450
"""Test if the address is unspecified.
1451
1452
Returns:
1453
A boolean, True if this is the unspecified address as defined in
1454
RFC 5735 3.
1455
1456
"""
1457
return self == self._constants._unspecified_address
1458
1459
@property
1460
def is_loopback(self):
1461
"""Test if the address is a loopback address.
1462
1463
Returns:
1464
A boolean, True if the address is a loopback per RFC 3330.
1465
1466
"""
1467
return self in self._constants._loopback_network
1468
1469
@property
1470
def is_link_local(self):
1471
"""Test if the address is reserved for link-local.
1472
1473
Returns:
1474
A boolean, True if the address is link-local per RFC 3927.
1475
1476
"""
1477
return self in self._constants._linklocal_network
1478
1479
1480
class IPv4Interface(IPv4Address):
1481
1482
def __init__(self, address):
1483
if isinstance(address, (bytes, _compat_int_types)):
1484
IPv4Address.__init__(self, address)
1485
self.network = IPv4Network(self._ip)
1486
self._prefixlen = self._max_prefixlen
1487
return
1488
1489
if isinstance(address, tuple):
1490
IPv4Address.__init__(self, address[0])
1491
if len(address) > 1:
1492
self._prefixlen = int(address[1])
1493
else:
1494
self._prefixlen = self._max_prefixlen
1495
1496
self.network = IPv4Network(address, strict=False)
1497
self.netmask = self.network.netmask
1498
self.hostmask = self.network.hostmask
1499
return
1500
1501
addr = _split_optional_netmask(address)
1502
IPv4Address.__init__(self, addr[0])
1503
1504
self.network = IPv4Network(address, strict=False)
1505
self._prefixlen = self.network._prefixlen
1506
1507
self.netmask = self.network.netmask
1508
self.hostmask = self.network.hostmask
1509
1510
def __str__(self):
1511
return '%s/%d' % (self._string_from_ip_int(self._ip),
1512
self.network.prefixlen)
1513
1514
def __eq__(self, other):
1515
address_equal = IPv4Address.__eq__(self, other)
1516
if not address_equal or address_equal is NotImplemented:
1517
return address_equal
1518
try:
1519
return self.network == other.network
1520
except AttributeError:
1521
# An interface with an associated network is NOT the
1522
# same as an unassociated address. That's why the hash
1523
# takes the extra info into account.
1524
return False
1525
1526
def __lt__(self, other):
1527
address_less = IPv4Address.__lt__(self, other)
1528
if address_less is NotImplemented:
1529
return NotImplemented
1530
try:
1531
return (self.network < other.network or
1532
self.network == other.network and address_less)
1533
except AttributeError:
1534
# We *do* allow addresses and interfaces to be sorted. The
1535
# unassociated address is considered less than all interfaces.
1536
return False
1537
1538
def __hash__(self):
1539
return self._ip ^ self._prefixlen ^ int(self.network.network_address)
1540
1541
__reduce__ = _IPAddressBase.__reduce__
1542
1543
@property
1544
def ip(self):
1545
return IPv4Address(self._ip)
1546
1547
@property
1548
def with_prefixlen(self):
1549
return '%s/%s' % (self._string_from_ip_int(self._ip),
1550
self._prefixlen)
1551
1552
@property
1553
def with_netmask(self):
1554
return '%s/%s' % (self._string_from_ip_int(self._ip),
1555
self.netmask)
1556
1557
@property
1558
def with_hostmask(self):
1559
return '%s/%s' % (self._string_from_ip_int(self._ip),
1560
self.hostmask)
1561
1562
1563
class IPv4Network(_BaseV4, _BaseNetwork):
1564
1565
"""This class represents and manipulates 32-bit IPv4 network + addresses..
1566
1567
Attributes: [examples for IPv4Network('192.0.2.0/27')]
1568
.network_address: IPv4Address('192.0.2.0')
1569
.hostmask: IPv4Address('0.0.0.31')
1570
.broadcast_address: IPv4Address('192.0.2.32')
1571
.netmask: IPv4Address('255.255.255.224')
1572
.prefixlen: 27
1573
1574
"""
1575
# Class to use when creating address objects
1576
_address_class = IPv4Address
1577
1578
def __init__(self, address, strict=True):
1579
1580
"""Instantiate a new IPv4 network object.
1581
1582
Args:
1583
address: A string or integer representing the IP [& network].
1584
'192.0.2.0/24'
1585
'192.0.2.0/255.255.255.0'
1586
'192.0.0.2/0.0.0.255'
1587
are all functionally the same in IPv4. Similarly,
1588
'192.0.2.1'
1589
'192.0.2.1/255.255.255.255'
1590
'192.0.2.1/32'
1591
are also functionally equivalent. That is to say, failing to
1592
provide a subnetmask will create an object with a mask of /32.
1593
1594
If the mask (portion after the / in the argument) is given in
1595
dotted quad form, it is treated as a netmask if it starts with a
1596
non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it
1597
starts with a zero field (e.g. 0.255.255.255 == /8), with the
1598
single exception of an all-zero mask which is treated as a
1599
netmask == /0. If no mask is given, a default of /32 is used.
1600
1601
Additionally, an integer can be passed, so
1602
IPv4Network('192.0.2.1') == IPv4Network(3221225985)
1603
or, more generally
1604
IPv4Interface(int(IPv4Interface('192.0.2.1'))) ==
1605
IPv4Interface('192.0.2.1')
1606
1607
Raises:
1608
AddressValueError: If ipaddress isn't a valid IPv4 address.
1609
NetmaskValueError: If the netmask isn't valid for
1610
an IPv4 address.
1611
ValueError: If strict is True and a network address is not
1612
supplied.
1613
1614
"""
1615
_BaseNetwork.__init__(self, address)
1616
1617
# Constructing from a packed address or integer
1618
if isinstance(address, (_compat_int_types, bytes)):
1619
self.network_address = IPv4Address(address)
1620
self.netmask, self._prefixlen = self._make_netmask(
1621
self._max_prefixlen)
1622
# fixme: address/network test here.
1623
return
1624
1625
if isinstance(address, tuple):
1626
if len(address) > 1:
1627
arg = address[1]
1628
else:
1629
# We weren't given an address[1]
1630
arg = self._max_prefixlen
1631
self.network_address = IPv4Address(address[0])
1632
self.netmask, self._prefixlen = self._make_netmask(arg)
1633
packed = int(self.network_address)
1634
if packed & int(self.netmask) != packed:
1635
if strict:
1636
raise ValueError('%s has host bits set' % self)
1637
else:
1638
self.network_address = IPv4Address(packed &
1639
int(self.netmask))
1640
return
1641
1642
# Assume input argument to be string or any object representation
1643
# which converts into a formatted IP prefix string.
1644
addr = _split_optional_netmask(address)
1645
self.network_address = IPv4Address(self._ip_int_from_string(addr[0]))
1646
1647
if len(addr) == 2:
1648
arg = addr[1]
1649
else:
1650
arg = self._max_prefixlen
1651
self.netmask, self._prefixlen = self._make_netmask(arg)
1652
1653
if strict:
1654
if (IPv4Address(int(self.network_address) & int(self.netmask)) !=
1655
self.network_address):
1656
raise ValueError('%s has host bits set' % self)
1657
self.network_address = IPv4Address(int(self.network_address) &
1658
int(self.netmask))
1659
1660
if self._prefixlen == (self._max_prefixlen - 1):
1661
self.hosts = self.__iter__
1662
1663
@property
1664
def is_global(self):
1665
"""Test if this address is allocated for public networks.
1666
1667
Returns:
1668
A boolean, True if the address is not reserved per
1669
iana-ipv4-special-registry.
1670
1671
"""
1672
return (not (self.network_address in IPv4Network('100.64.0.0/10') and
1673
self.broadcast_address in IPv4Network('100.64.0.0/10')) and
1674
not self.is_private)
1675
1676
1677
class _IPv4Constants(object):
1678
1679
_linklocal_network = IPv4Network('169.254.0.0/16')
1680
1681
_loopback_network = IPv4Network('127.0.0.0/8')
1682
1683
_multicast_network = IPv4Network('224.0.0.0/4')
1684
1685
_public_network = IPv4Network('100.64.0.0/10')
1686
1687
_private_networks = [
1688
IPv4Network('0.0.0.0/8'),
1689
IPv4Network('10.0.0.0/8'),
1690
IPv4Network('127.0.0.0/8'),
1691
IPv4Network('169.254.0.0/16'),
1692
IPv4Network('172.16.0.0/12'),
1693
IPv4Network('192.0.0.0/29'),
1694
IPv4Network('192.0.0.170/31'),
1695
IPv4Network('192.0.2.0/24'),
1696
IPv4Network('192.168.0.0/16'),
1697
IPv4Network('198.18.0.0/15'),
1698
IPv4Network('198.51.100.0/24'),
1699
IPv4Network('203.0.113.0/24'),
1700
IPv4Network('240.0.0.0/4'),
1701
IPv4Network('255.255.255.255/32'),
1702
]
1703
1704
_reserved_network = IPv4Network('240.0.0.0/4')
1705
1706
_unspecified_address = IPv4Address('0.0.0.0')
1707
1708
1709
IPv4Address._constants = _IPv4Constants
1710
1711
1712
class _BaseV6(object):
1713
1714
"""Base IPv6 object.
1715
1716
The following methods are used by IPv6 objects in both single IP
1717
addresses and networks.
1718
1719
"""
1720
1721
__slots__ = ()
1722
_version = 6
1723
_ALL_ONES = (2 ** IPV6LENGTH) - 1
1724
_HEXTET_COUNT = 8
1725
_HEX_DIGITS = frozenset('0123456789ABCDEFabcdef')
1726
_max_prefixlen = IPV6LENGTH
1727
1728
# There are only a bunch of valid v6 netmasks, so we cache them all
1729
# when constructed (see _make_netmask()).
1730
_netmask_cache = {}
1731
1732
@classmethod
1733
def _make_netmask(cls, arg):
1734
"""Make a (netmask, prefix_len) tuple from the given argument.
1735
1736
Argument can be:
1737
- an integer (the prefix length)
1738
- a string representing the prefix length (e.g. "24")
1739
- a string representing the prefix netmask (e.g. "255.255.255.0")
1740
"""
1741
if arg not in cls._netmask_cache:
1742
if isinstance(arg, _compat_int_types):
1743
prefixlen = arg
1744
else:
1745
prefixlen = cls._prefix_from_prefix_string(arg)
1746
netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen))
1747
cls._netmask_cache[arg] = netmask, prefixlen
1748
return cls._netmask_cache[arg]
1749
1750
@classmethod
1751
def _ip_int_from_string(cls, ip_str):
1752
"""Turn an IPv6 ip_str into an integer.
1753
1754
Args:
1755
ip_str: A string, the IPv6 ip_str.
1756
1757
Returns:
1758
An int, the IPv6 address
1759
1760
Raises:
1761
AddressValueError: if ip_str isn't a valid IPv6 Address.
1762
1763
"""
1764
if not ip_str:
1765
raise AddressValueError('Address cannot be empty')
1766
1767
parts = ip_str.split(':')
1768
1769
# An IPv6 address needs at least 2 colons (3 parts).
1770
_min_parts = 3
1771
if len(parts) < _min_parts:
1772
msg = "At least %d parts expected in %r" % (_min_parts, ip_str)
1773
raise AddressValueError(msg)
1774
1775
# If the address has an IPv4-style suffix, convert it to hexadecimal.
1776
if '.' in parts[-1]:
1777
try:
1778
ipv4_int = IPv4Address(parts.pop())._ip
1779
except AddressValueError as exc:
1780
raise AddressValueError("%s in %r" % (exc, ip_str))
1781
parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF))
1782
parts.append('%x' % (ipv4_int & 0xFFFF))
1783
1784
# An IPv6 address can't have more than 8 colons (9 parts).
1785
# The extra colon comes from using the "::" notation for a single
1786
# leading or trailing zero part.
1787
_max_parts = cls._HEXTET_COUNT + 1
1788
if len(parts) > _max_parts:
1789
msg = "At most %d colons permitted in %r" % (
1790
_max_parts - 1, ip_str)
1791
raise AddressValueError(msg)
1792
1793
# Disregarding the endpoints, find '::' with nothing in between.
1794
# This indicates that a run of zeroes has been skipped.
1795
skip_index = None
1796
for i in _compat_range(1, len(parts) - 1):
1797
if not parts[i]:
1798
if skip_index is not None:
1799
# Can't have more than one '::'
1800
msg = "At most one '::' permitted in %r" % ip_str
1801
raise AddressValueError(msg)
1802
skip_index = i
1803
1804
# parts_hi is the number of parts to copy from above/before the '::'
1805
# parts_lo is the number of parts to copy from below/after the '::'
1806
if skip_index is not None:
1807
# If we found a '::', then check if it also covers the endpoints.
1808
parts_hi = skip_index
1809
parts_lo = len(parts) - skip_index - 1
1810
if not parts[0]:
1811
parts_hi -= 1
1812
if parts_hi:
1813
msg = "Leading ':' only permitted as part of '::' in %r"
1814
raise AddressValueError(msg % ip_str) # ^: requires ^::
1815
if not parts[-1]:
1816
parts_lo -= 1
1817
if parts_lo:
1818
msg = "Trailing ':' only permitted as part of '::' in %r"
1819
raise AddressValueError(msg % ip_str) # :$ requires ::$
1820
parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo)
1821
if parts_skipped < 1:
1822
msg = "Expected at most %d other parts with '::' in %r"
1823
raise AddressValueError(msg % (cls._HEXTET_COUNT - 1, ip_str))
1824
else:
1825
# Otherwise, allocate the entire address to parts_hi. The
1826
# endpoints could still be empty, but _parse_hextet() will check
1827
# for that.
1828
if len(parts) != cls._HEXTET_COUNT:
1829
msg = "Exactly %d parts expected without '::' in %r"
1830
raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str))
1831
if not parts[0]:
1832
msg = "Leading ':' only permitted as part of '::' in %r"
1833
raise AddressValueError(msg % ip_str) # ^: requires ^::
1834
if not parts[-1]:
1835
msg = "Trailing ':' only permitted as part of '::' in %r"
1836
raise AddressValueError(msg % ip_str) # :$ requires ::$
1837
parts_hi = len(parts)
1838
parts_lo = 0
1839
parts_skipped = 0
1840
1841
try:
1842
# Now, parse the hextets into a 128-bit integer.
1843
ip_int = 0
1844
for i in range(parts_hi):
1845
ip_int <<= 16
1846
ip_int |= cls._parse_hextet(parts[i])
1847
ip_int <<= 16 * parts_skipped
1848
for i in range(-parts_lo, 0):
1849
ip_int <<= 16
1850
ip_int |= cls._parse_hextet(parts[i])
1851
return ip_int
1852
except ValueError as exc:
1853
raise AddressValueError("%s in %r" % (exc, ip_str))
1854
1855
@classmethod
1856
def _parse_hextet(cls, hextet_str):
1857
"""Convert an IPv6 hextet string into an integer.
1858
1859
Args:
1860
hextet_str: A string, the number to parse.
1861
1862
Returns:
1863
The hextet as an integer.
1864
1865
Raises:
1866
ValueError: if the input isn't strictly a hex number from
1867
[0..FFFF].
1868
1869
"""
1870
# Whitelist the characters, since int() allows a lot of bizarre stuff.
1871
if not cls._HEX_DIGITS.issuperset(hextet_str):
1872
raise ValueError("Only hex digits permitted in %r" % hextet_str)
1873
# We do the length check second, since the invalid character error
1874
# is likely to be more informative for the user
1875
if len(hextet_str) > 4:
1876
msg = "At most 4 characters permitted in %r"
1877
raise ValueError(msg % hextet_str)
1878
# Length check means we can skip checking the integer value
1879
return int(hextet_str, 16)
1880
1881
@classmethod
1882
def _compress_hextets(cls, hextets):
1883
"""Compresses a list of hextets.
1884
1885
Compresses a list of strings, replacing the longest continuous
1886
sequence of "0" in the list with "" and adding empty strings at
1887
the beginning or at the end of the string such that subsequently
1888
calling ":".join(hextets) will produce the compressed version of
1889
the IPv6 address.
1890
1891
Args:
1892
hextets: A list of strings, the hextets to compress.
1893
1894
Returns:
1895
A list of strings.
1896
1897
"""
1898
best_doublecolon_start = -1
1899
best_doublecolon_len = 0
1900
doublecolon_start = -1
1901
doublecolon_len = 0
1902
for index, hextet in enumerate(hextets):
1903
if hextet == '0':
1904
doublecolon_len += 1
1905
if doublecolon_start == -1:
1906
# Start of a sequence of zeros.
1907
doublecolon_start = index
1908
if doublecolon_len > best_doublecolon_len:
1909
# This is the longest sequence of zeros so far.
1910
best_doublecolon_len = doublecolon_len
1911
best_doublecolon_start = doublecolon_start
1912
else:
1913
doublecolon_len = 0
1914
doublecolon_start = -1
1915
1916
if best_doublecolon_len > 1:
1917
best_doublecolon_end = (best_doublecolon_start +
1918
best_doublecolon_len)
1919
# For zeros at the end of the address.
1920
if best_doublecolon_end == len(hextets):
1921
hextets += ['']
1922
hextets[best_doublecolon_start:best_doublecolon_end] = ['']
1923
# For zeros at the beginning of the address.
1924
if best_doublecolon_start == 0:
1925
hextets = [''] + hextets
1926
1927
return hextets
1928
1929
@classmethod
1930
def _string_from_ip_int(cls, ip_int=None):
1931
"""Turns a 128-bit integer into hexadecimal notation.
1932
1933
Args:
1934
ip_int: An integer, the IP address.
1935
1936
Returns:
1937
A string, the hexadecimal representation of the address.
1938
1939
Raises:
1940
ValueError: The address is bigger than 128 bits of all ones.
1941
1942
"""
1943
if ip_int is None:
1944
ip_int = int(cls._ip)
1945
1946
if ip_int > cls._ALL_ONES:
1947
raise ValueError('IPv6 address is too large')
1948
1949
hex_str = '%032x' % ip_int
1950
hextets = ['%x' % int(hex_str[x:x + 4], 16) for x in range(0, 32, 4)]
1951
1952
hextets = cls._compress_hextets(hextets)
1953
return ':'.join(hextets)
1954
1955
def _explode_shorthand_ip_string(self):
1956
"""Expand a shortened IPv6 address.
1957
1958
Args:
1959
ip_str: A string, the IPv6 address.
1960
1961
Returns:
1962
A string, the expanded IPv6 address.
1963
1964
"""
1965
if isinstance(self, IPv6Network):
1966
ip_str = _compat_str(self.network_address)
1967
elif isinstance(self, IPv6Interface):
1968
ip_str = _compat_str(self.ip)
1969
else:
1970
ip_str = _compat_str(self)
1971
1972
ip_int = self._ip_int_from_string(ip_str)
1973
hex_str = '%032x' % ip_int
1974
parts = [hex_str[x:x + 4] for x in range(0, 32, 4)]
1975
if isinstance(self, (_BaseNetwork, IPv6Interface)):
1976
return '%s/%d' % (':'.join(parts), self._prefixlen)
1977
return ':'.join(parts)
1978
1979
def _reverse_pointer(self):
1980
"""Return the reverse DNS pointer name for the IPv6 address.
1981
1982
This implements the method described in RFC3596 2.5.
1983
1984
"""
1985
reverse_chars = self.exploded[::-1].replace(':', '')
1986
return '.'.join(reverse_chars) + '.ip6.arpa'
1987
1988
@property
1989
def max_prefixlen(self):
1990
return self._max_prefixlen
1991
1992
@property
1993
def version(self):
1994
return self._version
1995
1996
1997
class IPv6Address(_BaseV6, _BaseAddress):
1998
1999
"""Represent and manipulate single IPv6 Addresses."""
2000
2001
__slots__ = ('_ip', '__weakref__')
2002
2003
def __init__(self, address):
2004
"""Instantiate a new IPv6 address object.
2005
2006
Args:
2007
address: A string or integer representing the IP
2008
2009
Additionally, an integer can be passed, so
2010
IPv6Address('2001:db8::') ==
2011
IPv6Address(42540766411282592856903984951653826560)
2012
or, more generally
2013
IPv6Address(int(IPv6Address('2001:db8::'))) ==
2014
IPv6Address('2001:db8::')
2015
2016
Raises:
2017
AddressValueError: If address isn't a valid IPv6 address.
2018
2019
"""
2020
# Efficient constructor from integer.
2021
if isinstance(address, _compat_int_types):
2022
self._check_int_address(address)
2023
self._ip = address
2024
return
2025
2026
# Constructing from a packed address
2027
if isinstance(address, bytes):
2028
self._check_packed_address(address, 16)
2029
bvs = _compat_bytes_to_byte_vals(address)
2030
self._ip = _compat_int_from_byte_vals(bvs, 'big')
2031
return
2032
2033
# Assume input argument to be string or any object representation
2034
# which converts into a formatted IP string.
2035
addr_str = _compat_str(address)
2036
if '/' in addr_str:
2037
raise AddressValueError("Unexpected '/' in %r" % address)
2038
self._ip = self._ip_int_from_string(addr_str)
2039
2040
@property
2041
def packed(self):
2042
"""The binary representation of this address."""
2043
return v6_int_to_packed(self._ip)
2044
2045
@property
2046
def is_multicast(self):
2047
"""Test if the address is reserved for multicast use.
2048
2049
Returns:
2050
A boolean, True if the address is a multicast address.
2051
See RFC 2373 2.7 for details.
2052
2053
"""
2054
return self in self._constants._multicast_network
2055
2056
@property
2057
def is_reserved(self):
2058
"""Test if the address is otherwise IETF reserved.
2059
2060
Returns:
2061
A boolean, True if the address is within one of the
2062
reserved IPv6 Network ranges.
2063
2064
"""
2065
return any(self in x for x in self._constants._reserved_networks)
2066
2067
@property
2068
def is_link_local(self):
2069
"""Test if the address is reserved for link-local.
2070
2071
Returns:
2072
A boolean, True if the address is reserved per RFC 4291.
2073
2074
"""
2075
return self in self._constants._linklocal_network
2076
2077
@property
2078
def is_site_local(self):
2079
"""Test if the address is reserved for site-local.
2080
2081
Note that the site-local address space has been deprecated by RFC 3879.
2082
Use is_private to test if this address is in the space of unique local
2083
addresses as defined by RFC 4193.
2084
2085
Returns:
2086
A boolean, True if the address is reserved per RFC 3513 2.5.6.
2087
2088
"""
2089
return self in self._constants._sitelocal_network
2090
2091
@property
2092
def is_private(self):
2093
"""Test if this address is allocated for private networks.
2094
2095
Returns:
2096
A boolean, True if the address is reserved per
2097
iana-ipv6-special-registry.
2098
2099
"""
2100
return any(self in net for net in self._constants._private_networks)
2101
2102
@property
2103
def is_global(self):
2104
"""Test if this address is allocated for public networks.
2105
2106
Returns:
2107
A boolean, true if the address is not reserved per
2108
iana-ipv6-special-registry.
2109
2110
"""
2111
return not self.is_private
2112
2113
@property
2114
def is_unspecified(self):
2115
"""Test if the address is unspecified.
2116
2117
Returns:
2118
A boolean, True if this is the unspecified address as defined in
2119
RFC 2373 2.5.2.
2120
2121
"""
2122
return self._ip == 0
2123
2124
@property
2125
def is_loopback(self):
2126
"""Test if the address is a loopback address.
2127
2128
Returns:
2129
A boolean, True if the address is a loopback address as defined in
2130
RFC 2373 2.5.3.
2131
2132
"""
2133
return self._ip == 1
2134
2135
@property
2136
def ipv4_mapped(self):
2137
"""Return the IPv4 mapped address.
2138
2139
Returns:
2140
If the IPv6 address is a v4 mapped address, return the
2141
IPv4 mapped address. Return None otherwise.
2142
2143
"""
2144
if (self._ip >> 32) != 0xFFFF:
2145
return None
2146
return IPv4Address(self._ip & 0xFFFFFFFF)
2147
2148
@property
2149
def teredo(self):
2150
"""Tuple of embedded teredo IPs.
2151
2152
Returns:
2153
Tuple of the (server, client) IPs or None if the address
2154
doesn't appear to be a teredo address (doesn't start with
2155
2001::/32)
2156
2157
"""
2158
if (self._ip >> 96) != 0x20010000:
2159
return None
2160
return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF),
2161
IPv4Address(~self._ip & 0xFFFFFFFF))
2162
2163
@property
2164
def sixtofour(self):
2165
"""Return the IPv4 6to4 embedded address.
2166
2167
Returns:
2168
The IPv4 6to4-embedded address if present or None if the
2169
address doesn't appear to contain a 6to4 embedded address.
2170
2171
"""
2172
if (self._ip >> 112) != 0x2002:
2173
return None
2174
return IPv4Address((self._ip >> 80) & 0xFFFFFFFF)
2175
2176
2177
class IPv6Interface(IPv6Address):
2178
2179
def __init__(self, address):
2180
if isinstance(address, (bytes, _compat_int_types)):
2181
IPv6Address.__init__(self, address)
2182
self.network = IPv6Network(self._ip)
2183
self._prefixlen = self._max_prefixlen
2184
return
2185
if isinstance(address, tuple):
2186
IPv6Address.__init__(self, address[0])
2187
if len(address) > 1:
2188
self._prefixlen = int(address[1])
2189
else:
2190
self._prefixlen = self._max_prefixlen
2191
self.network = IPv6Network(address, strict=False)
2192
self.netmask = self.network.netmask
2193
self.hostmask = self.network.hostmask
2194
return
2195
2196
addr = _split_optional_netmask(address)
2197
IPv6Address.__init__(self, addr[0])
2198
self.network = IPv6Network(address, strict=False)
2199
self.netmask = self.network.netmask
2200
self._prefixlen = self.network._prefixlen
2201
self.hostmask = self.network.hostmask
2202
2203
def __str__(self):
2204
return '%s/%d' % (self._string_from_ip_int(self._ip),
2205
self.network.prefixlen)
2206
2207
def __eq__(self, other):
2208
address_equal = IPv6Address.__eq__(self, other)
2209
if not address_equal or address_equal is NotImplemented:
2210
return address_equal
2211
try:
2212
return self.network == other.network
2213
except AttributeError:
2214
# An interface with an associated network is NOT the
2215
# same as an unassociated address. That's why the hash
2216
# takes the extra info into account.
2217
return False
2218
2219
def __lt__(self, other):
2220
address_less = IPv6Address.__lt__(self, other)
2221
if address_less is NotImplemented:
2222
return NotImplemented
2223
try:
2224
return (self.network < other.network or
2225
self.network == other.network and address_less)
2226
except AttributeError:
2227
# We *do* allow addresses and interfaces to be sorted. The
2228
# unassociated address is considered less than all interfaces.
2229
return False
2230
2231
def __hash__(self):
2232
return self._ip ^ self._prefixlen ^ int(self.network.network_address)
2233
2234
__reduce__ = _IPAddressBase.__reduce__
2235
2236
@property
2237
def ip(self):
2238
return IPv6Address(self._ip)
2239
2240
@property
2241
def with_prefixlen(self):
2242
return '%s/%s' % (self._string_from_ip_int(self._ip),
2243
self._prefixlen)
2244
2245
@property
2246
def with_netmask(self):
2247
return '%s/%s' % (self._string_from_ip_int(self._ip),
2248
self.netmask)
2249
2250
@property
2251
def with_hostmask(self):
2252
return '%s/%s' % (self._string_from_ip_int(self._ip),
2253
self.hostmask)
2254
2255
@property
2256
def is_unspecified(self):
2257
return self._ip == 0 and self.network.is_unspecified
2258
2259
@property
2260
def is_loopback(self):
2261
return self._ip == 1 and self.network.is_loopback
2262
2263
2264
class IPv6Network(_BaseV6, _BaseNetwork):
2265
2266
"""This class represents and manipulates 128-bit IPv6 networks.
2267
2268
Attributes: [examples for IPv6('2001:db8::1000/124')]
2269
.network_address: IPv6Address('2001:db8::1000')
2270
.hostmask: IPv6Address('::f')
2271
.broadcast_address: IPv6Address('2001:db8::100f')
2272
.netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0')
2273
.prefixlen: 124
2274
2275
"""
2276
2277
# Class to use when creating address objects
2278
_address_class = IPv6Address
2279
2280
def __init__(self, address, strict=True):
2281
"""Instantiate a new IPv6 Network object.
2282
2283
Args:
2284
address: A string or integer representing the IPv6 network or the
2285
IP and prefix/netmask.
2286
'2001:db8::/128'
2287
'2001:db8:0000:0000:0000:0000:0000:0000/128'
2288
'2001:db8::'
2289
are all functionally the same in IPv6. That is to say,
2290
failing to provide a subnetmask will create an object with
2291
a mask of /128.
2292
2293
Additionally, an integer can be passed, so
2294
IPv6Network('2001:db8::') ==
2295
IPv6Network(42540766411282592856903984951653826560)
2296
or, more generally
2297
IPv6Network(int(IPv6Network('2001:db8::'))) ==
2298
IPv6Network('2001:db8::')
2299
2300
strict: A boolean. If true, ensure that we have been passed
2301
A true network address, eg, 2001:db8::1000/124 and not an
2302
IP address on a network, eg, 2001:db8::1/124.
2303
2304
Raises:
2305
AddressValueError: If address isn't a valid IPv6 address.
2306
NetmaskValueError: If the netmask isn't valid for
2307
an IPv6 address.
2308
ValueError: If strict was True and a network address was not
2309
supplied.
2310
2311
"""
2312
_BaseNetwork.__init__(self, address)
2313
2314
# Efficient constructor from integer or packed address
2315
if isinstance(address, (bytes, _compat_int_types)):
2316
self.network_address = IPv6Address(address)
2317
self.netmask, self._prefixlen = self._make_netmask(
2318
self._max_prefixlen)
2319
return
2320
2321
if isinstance(address, tuple):
2322
if len(address) > 1:
2323
arg = address[1]
2324
else:
2325
arg = self._max_prefixlen
2326
self.netmask, self._prefixlen = self._make_netmask(arg)
2327
self.network_address = IPv6Address(address[0])
2328
packed = int(self.network_address)
2329
if packed & int(self.netmask) != packed:
2330
if strict:
2331
raise ValueError('%s has host bits set' % self)
2332
else:
2333
self.network_address = IPv6Address(packed &
2334
int(self.netmask))
2335
return
2336
2337
# Assume input argument to be string or any object representation
2338
# which converts into a formatted IP prefix string.
2339
addr = _split_optional_netmask(address)
2340
2341
self.network_address = IPv6Address(self._ip_int_from_string(addr[0]))
2342
2343
if len(addr) == 2:
2344
arg = addr[1]
2345
else:
2346
arg = self._max_prefixlen
2347
self.netmask, self._prefixlen = self._make_netmask(arg)
2348
2349
if strict:
2350
if (IPv6Address(int(self.network_address) & int(self.netmask)) !=
2351
self.network_address):
2352
raise ValueError('%s has host bits set' % self)
2353
self.network_address = IPv6Address(int(self.network_address) &
2354
int(self.netmask))
2355
2356
if self._prefixlen == (self._max_prefixlen - 1):
2357
self.hosts = self.__iter__
2358
2359
def hosts(self):
2360
"""Generate Iterator over usable hosts in a network.
2361
2362
This is like __iter__ except it doesn't return the
2363
Subnet-Router anycast address.
2364
2365
"""
2366
network = int(self.network_address)
2367
broadcast = int(self.broadcast_address)
2368
for x in _compat_range(network + 1, broadcast + 1):
2369
yield self._address_class(x)
2370
2371
@property
2372
def is_site_local(self):
2373
"""Test if the address is reserved for site-local.
2374
2375
Note that the site-local address space has been deprecated by RFC 3879.
2376
Use is_private to test if this address is in the space of unique local
2377
addresses as defined by RFC 4193.
2378
2379
Returns:
2380
A boolean, True if the address is reserved per RFC 3513 2.5.6.
2381
2382
"""
2383
return (self.network_address.is_site_local and
2384
self.broadcast_address.is_site_local)
2385
2386
2387
class _IPv6Constants(object):
2388
2389
_linklocal_network = IPv6Network('fe80::/10')
2390
2391
_multicast_network = IPv6Network('ff00::/8')
2392
2393
_private_networks = [
2394
IPv6Network('::1/128'),
2395
IPv6Network('::/128'),
2396
IPv6Network('::ffff:0:0/96'),
2397
IPv6Network('100::/64'),
2398
IPv6Network('2001::/23'),
2399
IPv6Network('2001:2::/48'),
2400
IPv6Network('2001:db8::/32'),
2401
IPv6Network('2001:10::/28'),
2402
IPv6Network('fc00::/7'),
2403
IPv6Network('fe80::/10'),
2404
]
2405
2406
_reserved_networks = [
2407
IPv6Network('::/8'), IPv6Network('100::/8'),
2408
IPv6Network('200::/7'), IPv6Network('400::/6'),
2409
IPv6Network('800::/5'), IPv6Network('1000::/4'),
2410
IPv6Network('4000::/3'), IPv6Network('6000::/3'),
2411
IPv6Network('8000::/3'), IPv6Network('A000::/3'),
2412
IPv6Network('C000::/3'), IPv6Network('E000::/4'),
2413
IPv6Network('F000::/5'), IPv6Network('F800::/6'),
2414
IPv6Network('FE00::/9'),
2415
]
2416
2417
_sitelocal_network = IPv6Network('fec0::/10')
2418
2419
2420
IPv6Address._constants = _IPv6Constants
2421
2422