Project description

Pyroute2 is a pure Python netlink library. It requires only Python stdlib,
no 3rd party libraries. The library was started as an RTNL protocol
implementation, so the name is pyroute2, but now it supports many netlink
protocols. Some supported netlink families and protocols:

rtnl, network settings — addresses, routes, traffic controls

nfnetlink — netfilter API: ipset, nftables, …

ipq — simplest userspace packet filtering, iptables QUEUE target

devlink — manage and monitor devlink-enabled hardware

generic — generic netlink families

nl80211 — wireless functions API (basic support)

taskstats — extended process statistics

acpi_events — ACPI events monitoring

thermal_events — thermal events monitoring

VFS_DQUOT — disk quota events monitoring

the simplest usecase

The socket objects, provided by the library, are actual socket objects with a
little bit extended API. The additional functionality aims to:

Help to open/bind netlink sockets

Discover generic netlink protocols and multicast groups

Construct, encode and decode netlink messages

Maybe the simplest usecase is to monitor events. Disk quota events:

from pyroute2 import DQuotSocket
# DQuotSocket automatically performs discovery and binding,
# since it has no other functionality beside of the monitoring
with DQuotSocket() as ds:
for message in ds.get():
print(message)

Or IPRoute:

from pyroute2 import IPRoute
with IPRoute() as ipr:
# With IPRoute objects you have to call bind() manually
ipr.bind()
for message in ipr.get():
print(message)

rtnetlink sample

More samples you can read in the project documentation.

Low-level IPRoute utility — Linux network configuration.
The IPRoute class is a 1-to-1 RTNL mapping. There are no implicit
interface lookups and so on.

from pyroute2 import IPDB
#
# The `with` statement automatically calls `IPDB.release()`
# in the case of an exception.
with IPDB() as ip:
#
# Create bridge and add ports and addresses.
#
# Transaction will be started by `with` statement
# and will be committed at the end of the block
with ip.create(kind='bridge', ifname='rhev') as i:
i.add_port('em1')
i.add_port('em2')
i.add_ip('10.0.0.2/24')
# --> <-- Here the system state is as described in
# the transaction, if no error occurs. If
# there is an error, all the changes will be
# rolled back.

The IPDB arch allows to use it transparently with network
namespaces:

from pyroute2 import IPDB
from pyroute2 import NetNS
# Create IPDB to work with the 'test' ip netns.
#
# Pls notice, that IPDB itself will work in the
# main netns, only the netlink transport is
# working in the namespace `test`.
ip = IPDB(nl=NetNS('test'))
# Wait until someone will set up ipaddr 127.0.0.1
# in the netns on the loopback device
ip.interfaces.lo.wait_ip('127.0.0.1')
# The IPDB object must be released before exit to
# sync all the possible changes that are in progress.
ip.release()

The project contains several modules for different types of
netlink messages, not only RTNL.