mirror of
https://github.com/python/cpython.git
synced 2024-12-17 05:43:48 +08:00
60ce8f0be6
Reverts commit e653d4d8e8
and makes
parsing even more strict. Like socket.inet_pton() any leading zero
is now treated as invalid input.
Signed-off-by: Christian Heimes <christian@python.org>
Co-authored-by: Łukasz Langa <lukasz@langa.pl>
995 lines
35 KiB
ReStructuredText
995 lines
35 KiB
ReStructuredText
:mod:`ipaddress` --- IPv4/IPv6 manipulation library
|
|
===================================================
|
|
|
|
.. module:: ipaddress
|
|
:synopsis: IPv4/IPv6 manipulation library.
|
|
|
|
.. moduleauthor:: Peter Moody
|
|
|
|
**Source code:** :source:`Lib/ipaddress.py`
|
|
|
|
--------------
|
|
|
|
:mod:`ipaddress` provides the capabilities to create, manipulate and
|
|
operate on IPv4 and IPv6 addresses and networks.
|
|
|
|
The functions and classes in this module make it straightforward to handle
|
|
various tasks related to IP addresses, including checking whether or not two
|
|
hosts are on the same subnet, iterating over all hosts in a particular
|
|
subnet, checking whether or not a string represents a valid IP address or
|
|
network definition, and so on.
|
|
|
|
This is the full module API reference—for an overview and introduction, see
|
|
:ref:`ipaddress-howto`.
|
|
|
|
.. versionadded:: 3.3
|
|
|
|
.. testsetup::
|
|
|
|
import ipaddress
|
|
from ipaddress import (
|
|
ip_network, IPv4Address, IPv4Interface, IPv4Network,
|
|
)
|
|
|
|
Convenience factory functions
|
|
-----------------------------
|
|
|
|
The :mod:`ipaddress` module provides factory functions to conveniently create
|
|
IP addresses, networks and interfaces:
|
|
|
|
.. function:: ip_address(address)
|
|
|
|
Return an :class:`IPv4Address` or :class:`IPv6Address` object depending on
|
|
the IP address passed as argument. Either IPv4 or IPv6 addresses may be
|
|
supplied; integers less than 2**32 will be considered to be IPv4 by default.
|
|
A :exc:`ValueError` is raised if *address* does not represent a valid IPv4
|
|
or IPv6 address.
|
|
|
|
>>> ipaddress.ip_address('192.168.0.1')
|
|
IPv4Address('192.168.0.1')
|
|
>>> ipaddress.ip_address('2001:db8::')
|
|
IPv6Address('2001:db8::')
|
|
|
|
|
|
.. function:: ip_network(address, strict=True)
|
|
|
|
Return an :class:`IPv4Network` or :class:`IPv6Network` object depending on
|
|
the IP address passed as argument. *address* is a string or integer
|
|
representing the IP network. Either IPv4 or IPv6 networks may be supplied;
|
|
integers less than 2**32 will be considered to be IPv4 by default. *strict*
|
|
is passed to :class:`IPv4Network` or :class:`IPv6Network` constructor. A
|
|
:exc:`ValueError` is raised if *address* does not represent a valid IPv4 or
|
|
IPv6 address, or if the network has host bits set.
|
|
|
|
>>> ipaddress.ip_network('192.168.0.0/28')
|
|
IPv4Network('192.168.0.0/28')
|
|
|
|
|
|
.. function:: ip_interface(address)
|
|
|
|
Return an :class:`IPv4Interface` or :class:`IPv6Interface` object depending
|
|
on the IP address passed as argument. *address* is a string or integer
|
|
representing the IP address. Either IPv4 or IPv6 addresses may be supplied;
|
|
integers less than 2**32 will be considered to be IPv4 by default. A
|
|
:exc:`ValueError` is raised if *address* does not represent a valid IPv4 or
|
|
IPv6 address.
|
|
|
|
One downside of these convenience functions is that the need to handle both
|
|
IPv4 and IPv6 formats means that error messages provide minimal
|
|
information on the precise error, as the functions don't know whether the
|
|
IPv4 or IPv6 format was intended. More detailed error reporting can be
|
|
obtained by calling the appropriate version specific class constructors
|
|
directly.
|
|
|
|
|
|
IP Addresses
|
|
------------
|
|
|
|
Address objects
|
|
^^^^^^^^^^^^^^^
|
|
|
|
The :class:`IPv4Address` and :class:`IPv6Address` objects share a lot of common
|
|
attributes. Some attributes that are only meaningful for IPv6 addresses are
|
|
also implemented by :class:`IPv4Address` objects, in order to make it easier to
|
|
write code that handles both IP versions correctly. Address objects are
|
|
:term:`hashable`, so they can be used as keys in dictionaries.
|
|
|
|
.. class:: IPv4Address(address)
|
|
|
|
Construct an IPv4 address. An :exc:`AddressValueError` is raised if
|
|
*address* is not a valid IPv4 address.
|
|
|
|
The following constitutes a valid IPv4 address:
|
|
|
|
1. A string in decimal-dot notation, consisting of four decimal integers in
|
|
the inclusive range 0--255, separated by dots (e.g. ``192.168.0.1``). Each
|
|
integer represents an octet (byte) in the address. Leading zeroes are
|
|
not tolerated to prevent confusion with octal notation.
|
|
2. An integer that fits into 32 bits.
|
|
3. An integer packed into a :class:`bytes` object of length 4 (most
|
|
significant octet first).
|
|
|
|
>>> ipaddress.IPv4Address('192.168.0.1')
|
|
IPv4Address('192.168.0.1')
|
|
>>> ipaddress.IPv4Address(3232235521)
|
|
IPv4Address('192.168.0.1')
|
|
>>> ipaddress.IPv4Address(b'\xC0\xA8\x00\x01')
|
|
IPv4Address('192.168.0.1')
|
|
|
|
.. versionchanged:: 3.8
|
|
|
|
Leading zeros are tolerated, even in ambiguous cases that look like
|
|
octal notation.
|
|
|
|
.. versionchanged:: 3.10
|
|
|
|
Leading zeros are no longer tolerated and are treated as an error.
|
|
IPv4 address strings are now parsed as strict as glibc
|
|
:func:`~socket.inet_pton`.
|
|
|
|
.. versionchanged:: 3.9.5
|
|
|
|
The above change was also included in Python 3.9 starting with
|
|
version 3.9.5.
|
|
|
|
.. attribute:: version
|
|
|
|
The appropriate version number: ``4`` for IPv4, ``6`` for IPv6.
|
|
|
|
.. attribute:: max_prefixlen
|
|
|
|
The total number of bits in the address representation for this
|
|
version: ``32`` for IPv4, ``128`` for IPv6.
|
|
|
|
The prefix defines the number of leading bits in an address that
|
|
are compared to determine whether or not an address is part of a
|
|
network.
|
|
|
|
.. attribute:: compressed
|
|
.. attribute:: exploded
|
|
|
|
The string representation in dotted decimal notation. Leading zeroes
|
|
are never included in the representation.
|
|
|
|
As IPv4 does not define a shorthand notation for addresses with octets
|
|
set to zero, these two attributes are always the same as ``str(addr)``
|
|
for IPv4 addresses. Exposing these attributes makes it easier to
|
|
write display code that can handle both IPv4 and IPv6 addresses.
|
|
|
|
.. attribute:: packed
|
|
|
|
The binary representation of this address - a :class:`bytes` object of
|
|
the appropriate length (most significant octet first). This is 4 bytes
|
|
for IPv4 and 16 bytes for IPv6.
|
|
|
|
.. attribute:: reverse_pointer
|
|
|
|
The name of the reverse DNS PTR record for the IP address, e.g.::
|
|
|
|
>>> ipaddress.ip_address("127.0.0.1").reverse_pointer
|
|
'1.0.0.127.in-addr.arpa'
|
|
>>> ipaddress.ip_address("2001:db8::1").reverse_pointer
|
|
'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'
|
|
|
|
This is the name that could be used for performing a PTR lookup, not the
|
|
resolved hostname itself.
|
|
|
|
.. versionadded:: 3.5
|
|
|
|
.. attribute:: is_multicast
|
|
|
|
``True`` if the address is reserved for multicast use. See
|
|
:RFC:`3171` (for IPv4) or :RFC:`2373` (for IPv6).
|
|
|
|
.. attribute:: is_private
|
|
|
|
``True`` if the address is allocated for private networks. See
|
|
iana-ipv4-special-registry_ (for IPv4) or iana-ipv6-special-registry_
|
|
(for IPv6).
|
|
|
|
.. attribute:: is_global
|
|
|
|
``True`` if the address is allocated for public networks. See
|
|
iana-ipv4-special-registry_ (for IPv4) or iana-ipv6-special-registry_
|
|
(for IPv6).
|
|
|
|
.. versionadded:: 3.4
|
|
|
|
.. attribute:: is_unspecified
|
|
|
|
``True`` if the address is unspecified. See :RFC:`5735` (for IPv4)
|
|
or :RFC:`2373` (for IPv6).
|
|
|
|
.. attribute:: is_reserved
|
|
|
|
``True`` if the address is otherwise IETF reserved.
|
|
|
|
.. attribute:: is_loopback
|
|
|
|
``True`` if this is a loopback address. See :RFC:`3330` (for IPv4)
|
|
or :RFC:`2373` (for IPv6).
|
|
|
|
.. attribute:: is_link_local
|
|
|
|
``True`` if the address is reserved for link-local usage. See
|
|
:RFC:`3927`.
|
|
|
|
.. _iana-ipv4-special-registry: https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
|
|
.. _iana-ipv6-special-registry: https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml
|
|
|
|
.. method:: IPv4Address.__format__(fmt)
|
|
|
|
Returns a string representation of the IP address, controlled by
|
|
an explicit format string.
|
|
*fmt* can be one of the following: ``'s'``, the default option,
|
|
equivalent to :func:`str`, ``'b'`` for a zero-padded binary string,
|
|
``'X'`` or ``'x'`` for an uppercase or lowercase hexadecimal
|
|
representation, or ``'n'``, which is equivalent to ``'b'`` for IPv4
|
|
addresses and ``'x'`` for IPv6. For binary and hexadecimal
|
|
representations, the form specifier ``'#'`` and the grouping option
|
|
``'_'`` are available. ``__format__`` is used by ``format``, ``str.format``
|
|
and f-strings.
|
|
|
|
>>> format(ipaddress.IPv4Address('192.168.0.1'))
|
|
'192.168.0.1'
|
|
>>> '{:#b}'.format(ipaddress.IPv4Address('192.168.0.1'))
|
|
'0b11000000101010000000000000000001'
|
|
>>> f'{ipaddress.IPv6Address("2001:db8::1000"):s}'
|
|
'2001:db8::1000'
|
|
>>> format(ipaddress.IPv6Address('2001:db8::1000'), '_X')
|
|
'2001_0DB8_0000_0000_0000_0000_0000_1000'
|
|
>>> '{:#_n}'.format(ipaddress.IPv6Address('2001:db8::1000'))
|
|
'0x2001_0db8_0000_0000_0000_0000_0000_1000'
|
|
|
|
.. versionadded:: 3.9
|
|
|
|
|
|
.. class:: IPv6Address(address)
|
|
|
|
Construct an IPv6 address. An :exc:`AddressValueError` is raised if
|
|
*address* is not a valid IPv6 address.
|
|
|
|
The following constitutes a valid IPv6 address:
|
|
|
|
1. A string consisting of eight groups of four hexadecimal digits, each
|
|
group representing 16 bits. The groups are separated by colons.
|
|
This describes an *exploded* (longhand) notation. The string can
|
|
also be *compressed* (shorthand notation) by various means. See
|
|
:RFC:`4291` for details. For example,
|
|
``"0000:0000:0000:0000:0000:0abc:0007:0def"`` can be compressed to
|
|
``"::abc:7:def"``.
|
|
|
|
Optionally, the string may also have a scope zone ID, expressed
|
|
with a suffix ``%scope_id``. If present, the scope ID must be non-empty,
|
|
and may not contain ``%``.
|
|
See :RFC:`4007` for details.
|
|
For example, ``fe80::1234%1`` might identify address ``fe80::1234`` on the first link of the node.
|
|
2. An integer that fits into 128 bits.
|
|
3. An integer packed into a :class:`bytes` object of length 16, big-endian.
|
|
|
|
|
|
>>> ipaddress.IPv6Address('2001:db8::1000')
|
|
IPv6Address('2001:db8::1000')
|
|
>>> ipaddress.IPv6Address('ff02::5678%1')
|
|
IPv6Address('ff02::5678%1')
|
|
|
|
.. attribute:: compressed
|
|
|
|
The short form of the address representation, with leading zeroes in
|
|
groups omitted and the longest sequence of groups consisting entirely of
|
|
zeroes collapsed to a single empty group.
|
|
|
|
This is also the value returned by ``str(addr)`` for IPv6 addresses.
|
|
|
|
.. attribute:: exploded
|
|
|
|
The long form of the address representation, with all leading zeroes and
|
|
groups consisting entirely of zeroes included.
|
|
|
|
|
|
For the following attributes and methods, see the corresponding
|
|
documentation of the :class:`IPv4Address` class:
|
|
|
|
.. attribute:: packed
|
|
.. attribute:: reverse_pointer
|
|
.. attribute:: version
|
|
.. attribute:: max_prefixlen
|
|
.. attribute:: is_multicast
|
|
.. attribute:: is_private
|
|
.. attribute:: is_global
|
|
.. attribute:: is_unspecified
|
|
.. attribute:: is_reserved
|
|
.. attribute:: is_loopback
|
|
.. attribute:: is_link_local
|
|
|
|
.. versionadded:: 3.4
|
|
is_global
|
|
|
|
.. attribute:: is_site_local
|
|
|
|
``True`` if the address is reserved for site-local usage. Note that
|
|
the site-local address space has been deprecated by :RFC:`3879`. Use
|
|
:attr:`~IPv4Address.is_private` to test if this address is in the
|
|
space of unique local addresses as defined by :RFC:`4193`.
|
|
|
|
.. attribute:: ipv4_mapped
|
|
|
|
For addresses that appear to be IPv4 mapped addresses (starting with
|
|
``::FFFF/96``), this property will report the embedded IPv4 address.
|
|
For any other address, this property will be ``None``.
|
|
|
|
.. attribute:: scope_id
|
|
|
|
For scoped addresses as defined by :RFC:`4007`, this property identifies
|
|
the particular zone of the address's scope that the address belongs to,
|
|
as a string. When no scope zone is specified, this property will be ``None``.
|
|
|
|
.. attribute:: sixtofour
|
|
|
|
For addresses that appear to be 6to4 addresses (starting with
|
|
``2002::/16``) as defined by :RFC:`3056`, this property will report
|
|
the embedded IPv4 address. For any other address, this property will
|
|
be ``None``.
|
|
|
|
.. attribute:: teredo
|
|
|
|
For addresses that appear to be Teredo addresses (starting with
|
|
``2001::/32``) as defined by :RFC:`4380`, this property will report
|
|
the embedded ``(server, client)`` IP address pair. For any other
|
|
address, this property will be ``None``.
|
|
|
|
.. method:: IPv6Address.__format__(fmt)
|
|
|
|
Refer to the corresponding method documentation in
|
|
:class:`IPv4Address`.
|
|
|
|
.. versionadded:: 3.9
|
|
|
|
Conversion to Strings and Integers
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
To interoperate with networking interfaces such as the socket module,
|
|
addresses must be converted to strings or integers. This is handled using
|
|
the :func:`str` and :func:`int` builtin functions::
|
|
|
|
>>> str(ipaddress.IPv4Address('192.168.0.1'))
|
|
'192.168.0.1'
|
|
>>> int(ipaddress.IPv4Address('192.168.0.1'))
|
|
3232235521
|
|
>>> str(ipaddress.IPv6Address('::1'))
|
|
'::1'
|
|
>>> int(ipaddress.IPv6Address('::1'))
|
|
1
|
|
|
|
Note that IPv6 scoped addresses are converted to integers without scope zone ID.
|
|
|
|
|
|
Operators
|
|
^^^^^^^^^
|
|
|
|
Address objects support some operators. Unless stated otherwise, operators can
|
|
only be applied between compatible objects (i.e. IPv4 with IPv4, IPv6 with
|
|
IPv6).
|
|
|
|
|
|
Comparison operators
|
|
""""""""""""""""""""
|
|
|
|
Address objects can be compared with the usual set of comparison operators.
|
|
Same IPv6 addresses with different scope zone IDs are not equal.
|
|
Some examples::
|
|
|
|
>>> IPv4Address('127.0.0.2') > IPv4Address('127.0.0.1')
|
|
True
|
|
>>> IPv4Address('127.0.0.2') == IPv4Address('127.0.0.1')
|
|
False
|
|
>>> IPv4Address('127.0.0.2') != IPv4Address('127.0.0.1')
|
|
True
|
|
>>> IPv6Address('fe80::1234') == IPv6Address('fe80::1234%1')
|
|
False
|
|
>>> IPv6Address('fe80::1234%1') != IPv6Address('fe80::1234%2')
|
|
True
|
|
|
|
|
|
Arithmetic operators
|
|
""""""""""""""""""""
|
|
|
|
Integers can be added to or subtracted from address objects. Some examples::
|
|
|
|
>>> IPv4Address('127.0.0.2') + 3
|
|
IPv4Address('127.0.0.5')
|
|
>>> IPv4Address('127.0.0.2') - 3
|
|
IPv4Address('126.255.255.255')
|
|
>>> IPv4Address('255.255.255.255') + 1
|
|
Traceback (most recent call last):
|
|
File "<stdin>", line 1, in <module>
|
|
ipaddress.AddressValueError: 4294967296 (>= 2**32) is not permitted as an IPv4 address
|
|
|
|
|
|
IP Network definitions
|
|
----------------------
|
|
|
|
The :class:`IPv4Network` and :class:`IPv6Network` objects provide a mechanism
|
|
for defining and inspecting IP network definitions. A network definition
|
|
consists of a *mask* and a *network address*, and as such defines a range of
|
|
IP addresses that equal the network address when masked (binary AND) with the
|
|
mask. For example, a network definition with the mask ``255.255.255.0`` and
|
|
the network address ``192.168.1.0`` consists of IP addresses in the inclusive
|
|
range ``192.168.1.0`` to ``192.168.1.255``.
|
|
|
|
|
|
Prefix, net mask and host mask
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
There are several equivalent ways to specify IP network masks. A *prefix*
|
|
``/<nbits>`` is a notation that denotes how many high-order bits are set in
|
|
the network mask. A *net mask* is an IP address with some number of
|
|
high-order bits set. Thus the prefix ``/24`` is equivalent to the net mask
|
|
``255.255.255.0`` in IPv4, or ``ffff:ff00::`` in IPv6. In addition, a
|
|
*host mask* is the logical inverse of a *net mask*, and is sometimes used
|
|
(for example in Cisco access control lists) to denote a network mask. The
|
|
host mask equivalent to ``/24`` in IPv4 is ``0.0.0.255``.
|
|
|
|
|
|
Network objects
|
|
^^^^^^^^^^^^^^^
|
|
|
|
All attributes implemented by address objects are implemented by network
|
|
objects as well. In addition, network objects implement additional attributes.
|
|
All of these are common between :class:`IPv4Network` and :class:`IPv6Network`,
|
|
so to avoid duplication they are only documented for :class:`IPv4Network`.
|
|
Network objects are :term:`hashable`, so they can be used as keys in
|
|
dictionaries.
|
|
|
|
.. class:: IPv4Network(address, strict=True)
|
|
|
|
Construct an IPv4 network definition. *address* can be one of the following:
|
|
|
|
1. A string consisting of an IP address and an optional mask, separated by
|
|
a slash (``/``). The IP address is the network address, and the mask
|
|
can be either a single number, which means it's a *prefix*, or a string
|
|
representation of an IPv4 address. If it's the latter, the mask is
|
|
interpreted as a *net mask* if it starts with a non-zero field, or as a
|
|
*host mask* if it starts with a zero field, with the single exception of
|
|
an all-zero mask which is treated as a *net mask*. If no mask is provided,
|
|
it's considered to be ``/32``.
|
|
|
|
For example, the following *address* specifications are equivalent:
|
|
``192.168.1.0/24``, ``192.168.1.0/255.255.255.0`` and
|
|
``192.168.1.0/0.0.0.255``.
|
|
|
|
2. An integer that fits into 32 bits. This is equivalent to a
|
|
single-address network, with the network address being *address* and
|
|
the mask being ``/32``.
|
|
|
|
3. An integer packed into a :class:`bytes` object of length 4, big-endian.
|
|
The interpretation is similar to an integer *address*.
|
|
|
|
4. A two-tuple of an address description and a netmask, where the address
|
|
description is either a string, a 32-bits integer, a 4-bytes packed
|
|
integer, or an existing IPv4Address object; and the netmask is either
|
|
an integer representing the prefix length (e.g. ``24``) or a string
|
|
representing the prefix mask (e.g. ``255.255.255.0``).
|
|
|
|
An :exc:`AddressValueError` is raised if *address* is not a valid IPv4
|
|
address. A :exc:`NetmaskValueError` is raised if the mask is not valid for
|
|
an IPv4 address.
|
|
|
|
If *strict* is ``True`` and host bits are set in the supplied address,
|
|
then :exc:`ValueError` is raised. Otherwise, the host bits are masked out
|
|
to determine the appropriate network address.
|
|
|
|
Unless stated otherwise, all network methods accepting other network/address
|
|
objects will raise :exc:`TypeError` if the argument's IP version is
|
|
incompatible to ``self``.
|
|
|
|
.. versionchanged:: 3.5
|
|
|
|
Added the two-tuple form for the *address* constructor parameter.
|
|
|
|
.. attribute:: version
|
|
.. attribute:: max_prefixlen
|
|
|
|
Refer to the corresponding attribute documentation in
|
|
:class:`IPv4Address`.
|
|
|
|
.. attribute:: is_multicast
|
|
.. attribute:: is_private
|
|
.. attribute:: is_unspecified
|
|
.. attribute:: is_reserved
|
|
.. attribute:: is_loopback
|
|
.. attribute:: is_link_local
|
|
|
|
These attributes are true for the network as a whole if they are true
|
|
for both the network address and the broadcast address.
|
|
|
|
.. attribute:: network_address
|
|
|
|
The network address for the network. The network address and the
|
|
prefix length together uniquely define a network.
|
|
|
|
.. attribute:: broadcast_address
|
|
|
|
The broadcast address for the network. Packets sent to the broadcast
|
|
address should be received by every host on the network.
|
|
|
|
.. attribute:: hostmask
|
|
|
|
The host mask, as an :class:`IPv4Address` object.
|
|
|
|
.. attribute:: netmask
|
|
|
|
The net mask, as an :class:`IPv4Address` object.
|
|
|
|
.. attribute:: with_prefixlen
|
|
.. attribute:: compressed
|
|
.. attribute:: exploded
|
|
|
|
A string representation of the network, with the mask in prefix
|
|
notation.
|
|
|
|
``with_prefixlen`` and ``compressed`` are always the same as
|
|
``str(network)``.
|
|
``exploded`` uses the exploded form the network address.
|
|
|
|
.. attribute:: with_netmask
|
|
|
|
A string representation of the network, with the mask in net mask
|
|
notation.
|
|
|
|
.. attribute:: with_hostmask
|
|
|
|
A string representation of the network, with the mask in host mask
|
|
notation.
|
|
|
|
.. attribute:: num_addresses
|
|
|
|
The total number of addresses in the network.
|
|
|
|
.. attribute:: prefixlen
|
|
|
|
Length of the network prefix, in bits.
|
|
|
|
.. method:: hosts()
|
|
|
|
Returns an iterator over the usable hosts in the network. The usable
|
|
hosts are all the IP addresses that belong to the network, except the
|
|
network address itself and the network broadcast address. For networks
|
|
with a mask length of 31, the network address and network broadcast
|
|
address are also included in the result. Networks with a mask of 32
|
|
will return a list containing the single host address.
|
|
|
|
>>> list(ip_network('192.0.2.0/29').hosts()) #doctest: +NORMALIZE_WHITESPACE
|
|
[IPv4Address('192.0.2.1'), IPv4Address('192.0.2.2'),
|
|
IPv4Address('192.0.2.3'), IPv4Address('192.0.2.4'),
|
|
IPv4Address('192.0.2.5'), IPv4Address('192.0.2.6')]
|
|
>>> list(ip_network('192.0.2.0/31').hosts())
|
|
[IPv4Address('192.0.2.0'), IPv4Address('192.0.2.1')]
|
|
>>> list(ip_network('192.0.2.1/32').hosts())
|
|
[IPv4Address('192.0.2.1')]
|
|
|
|
.. method:: overlaps(other)
|
|
|
|
``True`` if this network is partly or wholly contained in *other* or
|
|
*other* is wholly contained in this network.
|
|
|
|
.. method:: address_exclude(network)
|
|
|
|
Computes the network definitions resulting from removing the given
|
|
*network* from this one. Returns an iterator of network objects.
|
|
Raises :exc:`ValueError` if *network* is not completely contained in
|
|
this network.
|
|
|
|
>>> n1 = ip_network('192.0.2.0/28')
|
|
>>> n2 = ip_network('192.0.2.1/32')
|
|
>>> list(n1.address_exclude(n2)) #doctest: +NORMALIZE_WHITESPACE
|
|
[IPv4Network('192.0.2.8/29'), IPv4Network('192.0.2.4/30'),
|
|
IPv4Network('192.0.2.2/31'), IPv4Network('192.0.2.0/32')]
|
|
|
|
.. method:: subnets(prefixlen_diff=1, new_prefix=None)
|
|
|
|
The subnets that join to make the current network definition, depending
|
|
on the argument values. *prefixlen_diff* is the amount our prefix
|
|
length should be increased by. *new_prefix* is the desired new
|
|
prefix of the subnets; it must be larger than our prefix. One and
|
|
only one of *prefixlen_diff* and *new_prefix* must be set. Returns an
|
|
iterator of network objects.
|
|
|
|
>>> list(ip_network('192.0.2.0/24').subnets())
|
|
[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]
|
|
>>> list(ip_network('192.0.2.0/24').subnets(prefixlen_diff=2)) #doctest: +NORMALIZE_WHITESPACE
|
|
[IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'),
|
|
IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')]
|
|
>>> list(ip_network('192.0.2.0/24').subnets(new_prefix=26)) #doctest: +NORMALIZE_WHITESPACE
|
|
[IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'),
|
|
IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')]
|
|
>>> list(ip_network('192.0.2.0/24').subnets(new_prefix=23))
|
|
Traceback (most recent call last):
|
|
File "<stdin>", line 1, in <module>
|
|
raise ValueError('new prefix must be longer')
|
|
ValueError: new prefix must be longer
|
|
>>> list(ip_network('192.0.2.0/24').subnets(new_prefix=25))
|
|
[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]
|
|
|
|
.. method:: supernet(prefixlen_diff=1, new_prefix=None)
|
|
|
|
The supernet containing this network definition, depending on the
|
|
argument values. *prefixlen_diff* is the amount our prefix length
|
|
should be decreased by. *new_prefix* is the desired new prefix of
|
|
the supernet; it must be smaller than our prefix. One and only one
|
|
of *prefixlen_diff* and *new_prefix* must be set. Returns a single
|
|
network object.
|
|
|
|
>>> ip_network('192.0.2.0/24').supernet()
|
|
IPv4Network('192.0.2.0/23')
|
|
>>> ip_network('192.0.2.0/24').supernet(prefixlen_diff=2)
|
|
IPv4Network('192.0.0.0/22')
|
|
>>> ip_network('192.0.2.0/24').supernet(new_prefix=20)
|
|
IPv4Network('192.0.0.0/20')
|
|
|
|
.. method:: subnet_of(other)
|
|
|
|
Return ``True`` if this network is a subnet of *other*.
|
|
|
|
>>> a = ip_network('192.168.1.0/24')
|
|
>>> b = ip_network('192.168.1.128/30')
|
|
>>> b.subnet_of(a)
|
|
True
|
|
|
|
.. versionadded:: 3.7
|
|
|
|
.. method:: supernet_of(other)
|
|
|
|
Return ``True`` if this network is a supernet of *other*.
|
|
|
|
>>> a = ip_network('192.168.1.0/24')
|
|
>>> b = ip_network('192.168.1.128/30')
|
|
>>> a.supernet_of(b)
|
|
True
|
|
|
|
.. versionadded:: 3.7
|
|
|
|
.. method:: compare_networks(other)
|
|
|
|
Compare this network to *other*. In this comparison only the network
|
|
addresses are considered; host bits aren't. Returns either ``-1``,
|
|
``0`` or ``1``.
|
|
|
|
>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.2/32'))
|
|
-1
|
|
>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.0/32'))
|
|
1
|
|
>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.1/32'))
|
|
0
|
|
|
|
.. deprecated:: 3.7
|
|
It uses the same ordering and comparison algorithm as "<", "==", and ">"
|
|
|
|
|
|
.. class:: IPv6Network(address, strict=True)
|
|
|
|
Construct an IPv6 network definition. *address* can be one of the following:
|
|
|
|
1. A string consisting of an IP address and an optional prefix length,
|
|
separated by a slash (``/``). The IP address is the network address,
|
|
and the prefix length must be a single number, the *prefix*. If no
|
|
prefix length is provided, it's considered to be ``/128``.
|
|
|
|
Note that currently expanded netmasks are not supported. That means
|
|
``2001:db00::0/24`` is a valid argument while ``2001:db00::0/ffff:ff00::``
|
|
not.
|
|
|
|
2. An integer that fits into 128 bits. This is equivalent to a
|
|
single-address network, with the network address being *address* and
|
|
the mask being ``/128``.
|
|
|
|
3. An integer packed into a :class:`bytes` object of length 16, big-endian.
|
|
The interpretation is similar to an integer *address*.
|
|
|
|
4. A two-tuple of an address description and a netmask, where the address
|
|
description is either a string, a 128-bits integer, a 16-bytes packed
|
|
integer, or an existing IPv6Address object; and the netmask is an
|
|
integer representing the prefix length.
|
|
|
|
An :exc:`AddressValueError` is raised if *address* is not a valid IPv6
|
|
address. A :exc:`NetmaskValueError` is raised if the mask is not valid for
|
|
an IPv6 address.
|
|
|
|
If *strict* is ``True`` and host bits are set in the supplied address,
|
|
then :exc:`ValueError` is raised. Otherwise, the host bits are masked out
|
|
to determine the appropriate network address.
|
|
|
|
.. versionchanged:: 3.5
|
|
|
|
Added the two-tuple form for the *address* constructor parameter.
|
|
|
|
.. attribute:: version
|
|
.. attribute:: max_prefixlen
|
|
.. attribute:: is_multicast
|
|
.. attribute:: is_private
|
|
.. attribute:: is_unspecified
|
|
.. attribute:: is_reserved
|
|
.. attribute:: is_loopback
|
|
.. attribute:: is_link_local
|
|
.. attribute:: network_address
|
|
.. attribute:: broadcast_address
|
|
.. attribute:: hostmask
|
|
.. attribute:: netmask
|
|
.. attribute:: with_prefixlen
|
|
.. attribute:: compressed
|
|
.. attribute:: exploded
|
|
.. attribute:: with_netmask
|
|
.. attribute:: with_hostmask
|
|
.. attribute:: num_addresses
|
|
.. attribute:: prefixlen
|
|
.. method:: hosts()
|
|
|
|
Returns an iterator over the usable hosts in the network. The usable
|
|
hosts are all the IP addresses that belong to the network, except the
|
|
Subnet-Router anycast address. For networks with a mask length of 127,
|
|
the Subnet-Router anycast address is also included in the result.
|
|
Networks with a mask of 128 will return a list containing the
|
|
single host address.
|
|
|
|
.. method:: overlaps(other)
|
|
.. method:: address_exclude(network)
|
|
.. method:: subnets(prefixlen_diff=1, new_prefix=None)
|
|
.. method:: supernet(prefixlen_diff=1, new_prefix=None)
|
|
.. method:: subnet_of(other)
|
|
.. method:: supernet_of(other)
|
|
.. method:: compare_networks(other)
|
|
|
|
Refer to the corresponding attribute documentation in
|
|
:class:`IPv4Network`.
|
|
|
|
.. attribute:: is_site_local
|
|
|
|
These attribute is true for the network as a whole if it is true
|
|
for both the network address and the broadcast address.
|
|
|
|
|
|
Operators
|
|
^^^^^^^^^
|
|
|
|
Network objects support some operators. Unless stated otherwise, operators can
|
|
only be applied between compatible objects (i.e. IPv4 with IPv4, IPv6 with
|
|
IPv6).
|
|
|
|
|
|
Logical operators
|
|
"""""""""""""""""
|
|
|
|
Network objects can be compared with the usual set of logical operators.
|
|
Network objects are ordered first by network address, then by net mask.
|
|
|
|
|
|
Iteration
|
|
"""""""""
|
|
|
|
Network objects can be iterated to list all the addresses belonging to the
|
|
network. For iteration, *all* hosts are returned, including unusable hosts
|
|
(for usable hosts, use the :meth:`~IPv4Network.hosts` method). An
|
|
example::
|
|
|
|
>>> for addr in IPv4Network('192.0.2.0/28'):
|
|
... addr
|
|
...
|
|
IPv4Address('192.0.2.0')
|
|
IPv4Address('192.0.2.1')
|
|
IPv4Address('192.0.2.2')
|
|
IPv4Address('192.0.2.3')
|
|
IPv4Address('192.0.2.4')
|
|
IPv4Address('192.0.2.5')
|
|
IPv4Address('192.0.2.6')
|
|
IPv4Address('192.0.2.7')
|
|
IPv4Address('192.0.2.8')
|
|
IPv4Address('192.0.2.9')
|
|
IPv4Address('192.0.2.10')
|
|
IPv4Address('192.0.2.11')
|
|
IPv4Address('192.0.2.12')
|
|
IPv4Address('192.0.2.13')
|
|
IPv4Address('192.0.2.14')
|
|
IPv4Address('192.0.2.15')
|
|
|
|
|
|
Networks as containers of addresses
|
|
"""""""""""""""""""""""""""""""""""
|
|
|
|
Network objects can act as containers of addresses. Some examples::
|
|
|
|
>>> IPv4Network('192.0.2.0/28')[0]
|
|
IPv4Address('192.0.2.0')
|
|
>>> IPv4Network('192.0.2.0/28')[15]
|
|
IPv4Address('192.0.2.15')
|
|
>>> IPv4Address('192.0.2.6') in IPv4Network('192.0.2.0/28')
|
|
True
|
|
>>> IPv4Address('192.0.3.6') in IPv4Network('192.0.2.0/28')
|
|
False
|
|
|
|
|
|
Interface objects
|
|
-----------------
|
|
|
|
Interface objects are :term:`hashable`, so they can be used as keys in
|
|
dictionaries.
|
|
|
|
.. class:: IPv4Interface(address)
|
|
|
|
Construct an IPv4 interface. The meaning of *address* is as in the
|
|
constructor of :class:`IPv4Network`, except that arbitrary host addresses
|
|
are always accepted.
|
|
|
|
:class:`IPv4Interface` is a subclass of :class:`IPv4Address`, so it inherits
|
|
all the attributes from that class. In addition, the following attributes
|
|
are available:
|
|
|
|
.. attribute:: ip
|
|
|
|
The address (:class:`IPv4Address`) without network information.
|
|
|
|
>>> interface = IPv4Interface('192.0.2.5/24')
|
|
>>> interface.ip
|
|
IPv4Address('192.0.2.5')
|
|
|
|
.. attribute:: network
|
|
|
|
The network (:class:`IPv4Network`) this interface belongs to.
|
|
|
|
>>> interface = IPv4Interface('192.0.2.5/24')
|
|
>>> interface.network
|
|
IPv4Network('192.0.2.0/24')
|
|
|
|
.. attribute:: with_prefixlen
|
|
|
|
A string representation of the interface with the mask in prefix notation.
|
|
|
|
>>> interface = IPv4Interface('192.0.2.5/24')
|
|
>>> interface.with_prefixlen
|
|
'192.0.2.5/24'
|
|
|
|
.. attribute:: with_netmask
|
|
|
|
A string representation of the interface with the network as a net mask.
|
|
|
|
>>> interface = IPv4Interface('192.0.2.5/24')
|
|
>>> interface.with_netmask
|
|
'192.0.2.5/255.255.255.0'
|
|
|
|
.. attribute:: with_hostmask
|
|
|
|
A string representation of the interface with the network as a host mask.
|
|
|
|
>>> interface = IPv4Interface('192.0.2.5/24')
|
|
>>> interface.with_hostmask
|
|
'192.0.2.5/0.0.0.255'
|
|
|
|
|
|
.. class:: IPv6Interface(address)
|
|
|
|
Construct an IPv6 interface. The meaning of *address* is as in the
|
|
constructor of :class:`IPv6Network`, except that arbitrary host addresses
|
|
are always accepted.
|
|
|
|
:class:`IPv6Interface` is a subclass of :class:`IPv6Address`, so it inherits
|
|
all the attributes from that class. In addition, the following attributes
|
|
are available:
|
|
|
|
.. attribute:: ip
|
|
.. attribute:: network
|
|
.. attribute:: with_prefixlen
|
|
.. attribute:: with_netmask
|
|
.. attribute:: with_hostmask
|
|
|
|
Refer to the corresponding attribute documentation in
|
|
:class:`IPv4Interface`.
|
|
|
|
|
|
Operators
|
|
^^^^^^^^^
|
|
|
|
Interface objects support some operators. Unless stated otherwise, operators
|
|
can only be applied between compatible objects (i.e. IPv4 with IPv4, IPv6 with
|
|
IPv6).
|
|
|
|
|
|
Logical operators
|
|
"""""""""""""""""
|
|
|
|
Interface objects can be compared with the usual set of logical operators.
|
|
|
|
For equality comparison (``==`` and ``!=``), both the IP address and network
|
|
must be the same for the objects to be equal. An interface will not compare
|
|
equal to any address or network object.
|
|
|
|
For ordering (``<``, ``>``, etc) the rules are different. Interface and
|
|
address objects with the same IP version can be compared, and the address
|
|
objects will always sort before the interface objects. Two interface objects
|
|
are first compared by their networks and, if those are the same, then by their
|
|
IP addresses.
|
|
|
|
|
|
Other Module Level Functions
|
|
----------------------------
|
|
|
|
The module also provides the following module level functions:
|
|
|
|
.. function:: v4_int_to_packed(address)
|
|
|
|
Represent an address as 4 packed bytes in network (big-endian) order.
|
|
*address* is an integer representation of an IPv4 IP address. A
|
|
:exc:`ValueError` is raised if the integer is negative or too large to be an
|
|
IPv4 IP address.
|
|
|
|
>>> ipaddress.ip_address(3221225985)
|
|
IPv4Address('192.0.2.1')
|
|
>>> ipaddress.v4_int_to_packed(3221225985)
|
|
b'\xc0\x00\x02\x01'
|
|
|
|
|
|
.. function:: v6_int_to_packed(address)
|
|
|
|
Represent an address as 16 packed bytes in network (big-endian) order.
|
|
*address* is an integer representation of an IPv6 IP address. A
|
|
:exc:`ValueError` is raised if the integer is negative or too large to be an
|
|
IPv6 IP address.
|
|
|
|
|
|
.. function:: summarize_address_range(first, last)
|
|
|
|
Return an iterator of the summarized network range given the first and last
|
|
IP addresses. *first* is the first :class:`IPv4Address` or
|
|
:class:`IPv6Address` in the range and *last* is the last :class:`IPv4Address`
|
|
or :class:`IPv6Address` in the range. A :exc:`TypeError` is raised if
|
|
*first* or *last* are not IP addresses or are not of the same version. A
|
|
:exc:`ValueError` is raised if *last* is not greater than *first* or if
|
|
*first* address version is not 4 or 6.
|
|
|
|
>>> [ipaddr for ipaddr in ipaddress.summarize_address_range(
|
|
... ipaddress.IPv4Address('192.0.2.0'),
|
|
... ipaddress.IPv4Address('192.0.2.130'))]
|
|
[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), IPv4Network('192.0.2.130/32')]
|
|
|
|
|
|
.. function:: collapse_addresses(addresses)
|
|
|
|
Return an iterator of the collapsed :class:`IPv4Network` or
|
|
:class:`IPv6Network` objects. *addresses* is an iterator of
|
|
:class:`IPv4Network` or :class:`IPv6Network` objects. A :exc:`TypeError` is
|
|
raised if *addresses* contains mixed version objects.
|
|
|
|
>>> [ipaddr for ipaddr in
|
|
... ipaddress.collapse_addresses([ipaddress.IPv4Network('192.0.2.0/25'),
|
|
... ipaddress.IPv4Network('192.0.2.128/25')])]
|
|
[IPv4Network('192.0.2.0/24')]
|
|
|
|
|
|
.. function:: get_mixed_type_key(obj)
|
|
|
|
Return a key suitable for sorting between networks and addresses. Address
|
|
and Network objects are not sortable by default; they're fundamentally
|
|
different, so the expression::
|
|
|
|
IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')
|
|
|
|
doesn't make sense. There are some times however, where you may wish to
|
|
have :mod:`ipaddress` sort these anyway. If you need to do this, you can use
|
|
this function as the *key* argument to :func:`sorted()`.
|
|
|
|
*obj* is either a network or address object.
|
|
|
|
|
|
Custom Exceptions
|
|
-----------------
|
|
|
|
To support more specific error reporting from class constructors, the
|
|
module defines the following exceptions:
|
|
|
|
.. exception:: AddressValueError(ValueError)
|
|
|
|
Any value error related to the address.
|
|
|
|
|
|
.. exception:: NetmaskValueError(ValueError)
|
|
|
|
Any value error related to the net mask.
|