Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-pyroute2 for openSUSE:Factory checked in at 2024-03-01 23:37:35 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-pyroute2 (Old) and /work/SRC/openSUSE:Factory/.python-pyroute2.new.1770 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pyroute2" Fri Mar 1 23:37:35 2024 rev:28 rq:1153828 version:0.7.12 Changes: -------- --- /work/SRC/openSUSE:Factory/python-pyroute2/python-pyroute2.changes 2023-12-15 21:48:45.417400485 +0100 +++ /work/SRC/openSUSE:Factory/.python-pyroute2.new.1770/python-pyroute2.changes 2024-03-01 23:37:36.453803162 +0100 @@ -1,0 +2,14 @@ +Fri Mar 1 09:54:09 UTC 2024 - Dirk Müller <dmuel...@suse.com> + +- update to 0.7.12: + * cli: move readline import to the script + * nl80211: decoder improvements + * remote: fix dump() on RemoteIPRoute + * ndb: add ensure() call + * ethtool: ring support + ndb: fix sources objects counting + * ethtool: ring support + * ndb: fix FDB records index + * ndb: fix sources objects counting + +------------------------------------------------------------------- Old: ---- pyroute2-0.7.10.tar.gz New: ---- pyroute2-0.7.12.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-pyroute2.spec ++++++ --- /var/tmp/diff_new_pack.ml7B5U/_old 2024-03-01 23:37:36.969821821 +0100 +++ /var/tmp/diff_new_pack.ml7B5U/_new 2024-03-01 23:37:36.973821967 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-pyroute2 # -# Copyright (c) 2023 SUSE LLC +# Copyright (c) 2024 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,7 +18,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-pyroute2 -Version: 0.7.10 +Version: 0.7.12 Release: 0 Summary: Python Netlink library License: Apache-2.0 OR GPL-2.0-or-later @@ -30,7 +30,7 @@ BuildRequires: fdupes BuildRequires: python-rpm-macros Requires(post): update-alternatives -Requires(postun):update-alternatives +Requires(postun): update-alternatives BuildArch: noarch Provides: python-pyroute2.core = %{version} Obsoletes: python-pyroute2.core < %{version} ++++++ pyroute2-0.7.10.tar.gz -> pyroute2-0.7.12.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/CHANGELOG.rst new/pyroute2-0.7.12/CHANGELOG.rst --- old/pyroute2-0.7.10/CHANGELOG.rst 2023-11-30 09:11:55.000000000 +0100 +++ new/pyroute2-0.7.12/CHANGELOG.rst 2024-02-10 14:52:33.000000000 +0100 @@ -1,6 +1,18 @@ Changelog ========= +* 0.7.12 + * cli: move readline import to the script <https://github.com/svinota/pyroute2/pull/1165> + * ci: update tools versions <https://github.com/svinota/pyroute2/pull/1167> + * ci: generic make test target, update docs <https://github.com/svinota/pyroute2/pull/1173> + * ci: rename Linux python sessions in nox <https://github.com/svinota/pyroute2/pull/1172> + * nl80211: decoder improvements <https://github.com/svinota/pyroute2/pull/1168> + * remote: fix dump() on RemoteIPRoute <https://github.com/svinota/pyroute2/pull/1169> + * ndb: add ensure() call <https://github.com/svinota/pyroute2/pull/1171> +* 0.7.11 + * ethtool: ring support <https://github.com/svinota/pyroute2/pull/1152> + * ndb: fix FDB records index <https://github.com/svinota/pyroute2/pull/1158> + * ndb: fix sources objects counting <https://github.com/svinota/pyroute2/pull/1156> * 0.7.10 * ss2: fix classful flow data <https://github.com/svinota/pyroute2/pull/1143> * ci: add Python versions 3.8 and 3.12, update platform versions diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/PKG-INFO new/pyroute2-0.7.12/PKG-INFO --- old/pyroute2-0.7.10/PKG-INFO 2023-11-30 09:16:18.270647000 +0100 +++ new/pyroute2-0.7.12/PKG-INFO 2024-02-10 16:04:20.602168800 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: pyroute2 -Version: 0.7.10 +Version: 0.7.12 Summary: Python Netlink library Home-page: https://github.com/svinota/pyroute2 Author: Peter Saveliev @@ -17,12 +17,11 @@ Classifier: Intended Audience :: System Administrators Classifier: Intended Audience :: Telecommunications Industry Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 Classifier: Development Status :: 4 - Beta Description-Content-Type: text/x-rst License-File: LICENSE diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/README.contribute.rst new/pyroute2-0.7.12/README.contribute.rst --- old/pyroute2-0.7.10/README.contribute.rst 2023-03-15 11:10:02.000000000 +0100 +++ new/pyroute2-0.7.12/README.contribute.rst 2024-02-10 14:17:37.000000000 +0100 @@ -16,21 +16,13 @@ # git # python # GNU make, sed, awk - # - # then clone the repo + + # clone the repo git clone ${pyroute2_git_url} cd pyroute2 - # create and activate virtualenv - python -m venv venv - . venv/bin/activate - - # update pip and install nox - pip install --upgrade pip - pip install nox - - # run the test cycle - nox + # run the test suite + make test OpenBSD +++++++ @@ -38,33 +30,31 @@ .. code-block:: sh # install required tools - pkg_add bash git gmake gsed python + pkg_add bash git gmake gsed python rust # clone the repo git clone ${pyroute_git_url} cd pyroute2 - # create and activate virtualenv - python3.10 -m venv venv - . venv/bin/activate - - # update pip and install nox - pip install --upgrade pip - pip install nox + # run the test suite + gmake test - # run the platform specific environment - nox -e openbsd +Step 2: plan and implement the change +------------------------------------- -Step 2: make a change ---------------------- +The best practice is that any change should be covered by tests. +The test suite is in the `/tests/` folder and is run by `nox`. You +can add your tests to an existing tests module, or create your +own module, if it requires some specific environment that is not +covered yet. In the latter case add a new session to `noxfile.py`. The project is designed to work on the bare standard library. But some embedded environments strip even the stdlib, removing modules like sqlite3. -So to run pyroute2 even in such environments, the project provdes +So to run pyroute2 even in such environments, the project provides two packages, `pyroute2` and `pyroute2.minimal`, with the latter -providing a minimal distribution, but using no sqlite3 or pickle. +providing a minimal distribution, with no sqlite3 or pickle. Modules `pyroute2` and `pyroute2.minimal` are mutually exclusive. @@ -74,18 +64,15 @@ Step 3: test the change ----------------------- -Assume the environment is already set up on the step 1. Thus: +Assume the environment is already set up on the step 1: .. code-block:: sh - # run code checks - nox -e linter - - # run unit tests - nox -e unit + # run code linter + make format - # run functional test, some require root - nox -e linux-3.10 + # run test suite, some tests may require root + make test Step 4: submit a PR ------------------- @@ -98,7 +85,7 @@ The code must comply some requirements: -* the library must work on Python >= 3.6. -* the code must pass `nox -e linter` -* the code must not break existing unit and functional tests -* the `ctypes` usage must not break the library on SELinux +* the library **must** work on Python >= 3.9 +* the code **must** pass `make format` +* the code **must** not break existing unit and functional tests (`make test`) +* the `ctypes` usage **must not** break the library on SELinux diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/VERSION new/pyroute2-0.7.12/VERSION --- old/pyroute2-0.7.10/VERSION 2023-11-30 09:16:06.000000000 +0100 +++ new/pyroute2-0.7.12/VERSION 2024-02-10 16:04:01.000000000 +0100 @@ -1 +1 @@ -0.7.10 +0.7.12 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/examples/generic/netl.py new/pyroute2-0.7.12/examples/generic/netl.py --- old/pyroute2-0.7.10/examples/generic/netl.py 2023-03-15 11:10:02.000000000 +0100 +++ new/pyroute2-0.7.12/examples/generic/netl.py 2024-01-29 12:26:05.000000000 +0100 @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import traceback from pyroute2.netlink import NLM_F_REQUEST diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/examples/ndb/keystone_auth.py new/pyroute2-0.7.12/examples/ndb/keystone_auth.py --- old/pyroute2-0.7.10/examples/ndb/keystone_auth.py 2023-03-15 11:10:02.000000000 +0100 +++ new/pyroute2-0.7.12/examples/ndb/keystone_auth.py 2024-01-29 12:26:05.000000000 +0100 @@ -40,7 +40,7 @@ $ . openstack.rc # <-- your OpenStack APIv3 RC file $ export PYTHONPATH=`pwd` - $ python examples/ndb/keystone_auth.py 14080769fe05e1f8b837fb43ca0f0ba4 + $ python3 examples/ndb/keystone_auth.py 14080769fe05e1f8b837fb43ca0f0ba4 Using this example you can implement services that export NDB via any RPC, e.g. HTTP, and use Keystone integration. Same scheme may be used for any diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/examples/ndb/radius_auth.py new/pyroute2-0.7.12/examples/ndb/radius_auth.py --- old/pyroute2-0.7.10/examples/ndb/radius_auth.py 2023-03-15 11:10:02.000000000 +0100 +++ new/pyroute2-0.7.12/examples/ndb/radius_auth.py 2024-01-29 12:26:05.000000000 +0100 @@ -32,7 +32,7 @@ export PYTHONPATH=`pwd` $ . radius.rc - $ python examples/ndb/radius_auth.py testing secret + $ python3 examples/ndb/radius_auth.py testing secret ''' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/examples/policy/policy.py new/pyroute2-0.7.12/examples/policy/policy.py --- old/pyroute2-0.7.10/examples/policy/policy.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/examples/policy/policy.py 2024-01-29 12:26:05.000000000 +0100 @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import traceback from pprint import pprint diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/examples/wifi/nl80211_interfaces.py new/pyroute2-0.7.12/examples/wifi/nl80211_interfaces.py --- old/pyroute2-0.7.10/examples/wifi/nl80211_interfaces.py 2023-03-15 11:10:02.000000000 +0100 +++ new/pyroute2-0.7.12/examples/wifi/nl80211_interfaces.py 2024-01-29 12:26:05.000000000 +0100 @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf-8 -*- # from pyroute2.iwutil import IW diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pr2modules/__init__.py new/pyroute2-0.7.12/pr2modules/__init__.py --- old/pyroute2-0.7.10/pr2modules/__init__.py 2023-03-15 11:10:02.000000000 +0100 +++ new/pyroute2-0.7.12/pr2modules/__init__.py 2024-02-07 10:51:28.000000000 +0100 @@ -3,6 +3,7 @@ It will be removed in 0.8.x ''' + import sys import warnings diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/bsd/util.py new/pyroute2-0.7.12/pyroute2/bsd/util.py --- old/pyroute2-0.7.10/pyroute2/bsd/util.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/bsd/util.py 2024-02-07 10:51:28.000000000 +0100 @@ -6,6 +6,7 @@ Maybe some day it will be ioctl. For now it's ifconfig and netstat. ''' + import re import socket import subprocess diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/cli/console.py new/pyroute2-0.7.12/pyroute2/cli/console.py --- old/pyroute2-0.7.10/pyroute2/cli/console.py 2023-08-02 18:44:38.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/cli/console.py 2024-02-07 15:16:34.000000000 +0100 @@ -6,17 +6,9 @@ from pyroute2.cli.session import Session from pyroute2.ndb.main import NDB -try: - import readline - - HAS_READLINE = True -except ImportError: - HAS_READLINE = False - class Console(code.InteractiveConsole): def __init__(self, stdout=None, log=None, sources=None): - global HAS_READLINE self.db = NDB(log=log, sources=sources) self.db.config.update( {'show_format': 'json', 'recordset_pipe': 'true'} @@ -28,10 +20,6 @@ self.prompt = '' self.set_prompt() code.InteractiveConsole.__init__(self) - if HAS_READLINE: - readline.parse_and_bind('tab: complete') - readline.set_completer(self.completer) - readline.set_completion_display_matches_hook(self.display) def close(self): self.db.close() @@ -92,6 +80,11 @@ self.showtraceback() continue + def set_completer(self, readline): + readline.parse_and_bind('tab: complete') + readline.set_completer(self.completer) + readline.set_completion_display_matches_hook(self.display) + def completer(self, text, state): if state == 0: d = [x for x in dir(self.session.ptr) if x.startswith(text)] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/common.py new/pyroute2-0.7.12/pyroute2/common.py --- old/pyroute2-0.7.10/pyroute2/common.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/common.py 2024-02-07 10:51:28.000000000 +0100 @@ -199,7 +199,9 @@ __var_name = re.compile('^[a-zA-Z_]+[a-zA-Z_0-9]*$') def __dir__(self): - return [i for i in self if type(i) == str and self.__var_name.match(i)] + return [ + i for i in self if isinstance(i, str) and self.__var_name.match(i) + ] def __getattribute__(self, key, *argv): try: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/config/version.py new/pyroute2-0.7.12/pyroute2/config/version.py --- old/pyroute2-0.7.10/pyroute2/config/version.py 2023-11-30 09:16:06.000000000 +0100 +++ new/pyroute2-0.7.12/pyroute2/config/version.py 2024-02-10 16:04:01.000000000 +0100 @@ -1 +1 @@ -__version__ = "0.7.10" +__version__ = "0.7.12" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/dhcp/dhcp4socket.py new/pyroute2-0.7.12/pyroute2/dhcp/dhcp4socket.py --- old/pyroute2-0.7.10/pyroute2/dhcp/dhcp4socket.py 2023-03-15 11:10:02.000000000 +0100 +++ new/pyroute2-0.7.12/pyroute2/dhcp/dhcp4socket.py 2024-02-07 10:51:28.000000000 +0100 @@ -3,6 +3,7 @@ ================ ''' + from pyroute2.common import AddrPool from pyroute2.dhcp.dhcp4msg import dhcp4msg from pyroute2.ext.rawsocket import RawSocket diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ethtool/ethtool.py new/pyroute2-0.7.12/pyroute2/ethtool/ethtool.py --- old/pyroute2-0.7.10/pyroute2/ethtool/ethtool.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/ethtool/ethtool.py 2024-02-07 10:51:28.000000000 +0100 @@ -13,7 +13,7 @@ ) from pyroute2.ethtool.ioctl import WAKE_NAMES, IoctlEthtool from pyroute2.netlink.exceptions import NetlinkError -from pyroute2.netlink.generic.ethtool import NlEthtool +from pyroute2.netlink.generic.ethtool import NlEthtool, ethtool_rings_msg INT32MINUS_UINT32 = c_uint32(-1).value INT16MINUS_UINT16 = c_uint16(-1).value @@ -196,11 +196,9 @@ @classmethod def from_ioctl(cls, link_settings): - ( - map_supported, - map_advertising, - map_lp_advertising, - ) = IoctlEthtool.get_link_mode_masks(link_settings) + (map_supported, map_advertising, map_lp_advertising) = ( + IoctlEthtool.get_link_mode_masks(link_settings) + ) bits_supported = IoctlEthtool.get_link_mode_bits(map_supported) supported_ports = [] supported_modes = [] @@ -257,6 +255,108 @@ ) +class EthtoolRings( + namedtuple( + 'EthtoolRings', + ( + "rx_max", + "rx_mini_max", + "rx_jumbo_max", + "tx_max", + "rx", + "rx_mini", + "rx_jumbo", + "tx", + "rx_buf_len", + "tcp_data_split", + "cqe_size", + "tx_push", + "rx_push", + "tx_push_buf_len", + "tx_push_buf_len_max", + ), + ) +): + nl_attributs_dict = { + "rx_max": 'ETHTOOL_A_RINGS_RX_MAX', + "rx_mini_max": 'ETHTOOL_A_RINGS_RX_MINI_MAX', + "rx_jumbo_max": 'ETHTOOL_A_RINGS_RX_JUMBO_MAX', + "tx_max": 'ETHTOOL_A_RINGS_TX_MAX', + "rx": 'ETHTOOL_A_RINGS_RX', + "rx_mini": 'ETHTOOL_A_RINGS_RX_MINI', + "rx_jumbo": 'ETHTOOL_A_RINGS_RX_JUMBO', + "tx": 'ETHTOOL_A_RINGS_TX', + "rx_buf_len": 'ETHTOOL_A_RINGS_RX_BUF_LEN', + "tcp_data_split": 'ETHTOOL_A_RINGS_TCP_DATA_SPLIT', + "cqe_size": 'ETHTOOL_A_RINGS_CQE_SIZE', + "tx_push": 'ETHTOOL_A_RINGS_TX_PUSH', + "rx_push": 'ETHTOOL_A_RINGS_RX_PUSH', + "tx_push_buf_len": 'ETHTOOL_A_RINGS_TX_PUSH_BUF_LEN', + "tx_push_buf_len_max": 'ETHTOOL_A_RINGS_TX_PUSH_BUF_LEN_MAX', + } + + def __new__( + cls, + rx_max=None, + rx_mini_max=None, + rx_jumbo_max=None, + tx_max=None, + rx=None, + rx_mini=None, + rx_jumbo=None, + tx=None, + rx_buf_len=None, + tcp_data_split=None, + cqe_size=None, + tx_push=None, + rx_push=None, + tx_push_buf_len=None, + tx_push_buf_len_max=None, + ): + return super(EthtoolRings, cls).__new__( + cls, + rx_max, + rx_mini_max, + rx_jumbo_max, + tx_max, + rx, + rx_mini, + rx_jumbo, + tx, + rx_buf_len, + tcp_data_split, + cqe_size, + tx_push, + rx_push, + tx_push_buf_len, + tx_push_buf_len_max, + ) + + @classmethod + def from_netlink(cls, nl_rings): + nl_rings = nl_rings[0] + return cls( + **{ + cls_attr: nl_rings.get_attr(netlink_attr) + for cls_attr, netlink_attr in cls.nl_attributs_dict.items() + } + ) + + def to_netlink(self): + nl_rings_attrs = ethtool_rings_msg() + for cls_attr, netlink_attr in self.nl_attributs_dict.items(): + attr = getattr(self, cls_attr) + if attr is not None: + nl_rings_attrs["attrs"].append((netlink_attr, attr)) + return nl_rings_attrs + + @classmethod + def from_ioctl(cls, ioctl_rings): + ioctl_rings = dict(ioctl_rings) + ioctl_rings.pop("cmd") + return cls(**ioctl_rings) + + class Ethtool: def __init__(self): self._with_ioctl = IoctlEthtool() @@ -330,6 +430,31 @@ wol_mode = self._with_ioctl.get_wol() return EthtoolWakeOnLan.from_ioctl(wol_mode) + def get_rings(self, ifname, with_netlink=None): + try: + rings = self._nl_exec( + self._with_nl.get_rings, with_netlink, ifname + ) + rings = EthtoolRings.from_netlink(rings) + except UseIoctl: + self._with_ioctl.change_ifname(ifname) + rings_info = self._with_ioctl.get_rings() + rings = EthtoolRings.from_ioctl(rings_info) + return rings + + def set_rings(self, ifname, with_netlink=None, **kwargs): + try: + rings = EthtoolRings(**kwargs).to_netlink() + self._nl_exec(self._with_nl.set_rings, with_netlink, rings, ifname) + except UseIoctl: + self._with_ioctl.change_ifname(ifname) + ioctl_rings = self._with_ioctl.get_rings() + for name, value in kwargs.items(): + if name in ioctl_rings.keys() and ioctl_rings[name] != value: + ioctl_rings[name] = value + + self._with_ioctl.set_rings(ioctl_rings) + def get_features(self, ifname): self._with_ioctl.change_ifname(ifname) return EthtoolFeatures.from_ioctl(self._with_ioctl.get_features()) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ethtool/ioctl.py new/pyroute2-0.7.12/pyroute2/ethtool/ioctl.py --- old/pyroute2-0.7.10/pyroute2/ethtool/ioctl.py 2023-10-27 20:33:32.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/ethtool/ioctl.py 2024-01-29 12:26:05.000000000 +0100 @@ -23,6 +23,9 @@ ETHTOOL_GSTATS = 0x0000001D ETH_GSTRING_LEN = 32 +ETHTOOL_GRINGPARAM = 0x00000010 +ETHTOOL_SRINGPARAM = 0x00000011 + ETHTOOL_GRXCSUM = 0x00000014 ETHTOOL_SRXCSUM = 0x00000015 ETHTOOL_GTXCSUM = 0x00000016 @@ -340,6 +343,21 @@ _fields_ = [("off_flags", ctypes.c_uint32), ("features", EthtoolGfeatures)] +class EthtoolRingParam(DictStruct): + _pack_ = 1 + _fields_ = [ + ("cmd", ctypes.c_uint32), + ("rx_max", ctypes.c_uint32), + ("rx_mini_max", ctypes.c_uint32), + ("rx_jumbo_max", ctypes.c_uint32), + ("tx_max", ctypes.c_uint32), + ("rx", ctypes.c_uint32), + ("rx_mini", ctypes.c_uint32), + ("rx_jumbo", ctypes.c_uint32), + ("tx", ctypes.c_uint32), + ] + + class IfReqData(ctypes.Union): dummy = generate_EthtoolGstrings(0) _fields_ = [ @@ -353,6 +371,7 @@ ("sfeatures", ctypes.POINTER(EthtoolSfeatures)), ("glinksettings", ctypes.POINTER(IoctlEthtoolLinkSettings)), ("wolinfo", ctypes.POINTER(EthtoolWolInfo)), + ("rings", ctypes.POINTER(EthtoolRingParam)), ] @@ -627,3 +646,14 @@ self.ifreq.wolinfo = ctypes.pointer(cmd) self.ioctl() return cmd + + def get_rings(self): + cmd = EthtoolRingParam(cmd=ETHTOOL_GRINGPARAM) + self.ifreq.rings = ctypes.pointer(cmd) + self.ioctl() + return cmd + + def set_rings(self, rings): + rings.cmd = ETHTOOL_SRINGPARAM + self.ifreq.rings = ctypes.pointer(rings) + self.ioctl() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ipdb/linkedset.py new/pyroute2-0.7.12/pyroute2/ipdb/linkedset.py --- old/pyroute2-0.7.10/pyroute2/ipdb/linkedset.py 2023-03-15 11:10:02.000000000 +0100 +++ new/pyroute2-0.7.12/pyroute2/ipdb/linkedset.py 2024-02-07 10:51:28.000000000 +0100 @@ -1,5 +1,6 @@ ''' ''' + import struct import threading from collections import OrderedDict diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ipdb/routes.py new/pyroute2-0.7.12/pyroute2/ipdb/routes.py --- old/pyroute2-0.7.10/pyroute2/ipdb/routes.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/ipdb/routes.py 2024-02-07 10:51:28.000000000 +0100 @@ -598,9 +598,9 @@ if isinstance(labels, (list, tuple, set)): labels = '/'.join( map( - lambda x: str(x['label']) - if isinstance(x, dict) - else str(x), + lambda x: ( + str(x['label']) if isinstance(x, dict) else str(x) + ), labels, ) ) @@ -659,9 +659,11 @@ if field == 'encap' and isinstance(v, (list, tuple, set)): v = '/'.join( map( - lambda x: str(x['label']) - if isinstance(x, dict) - else str(x), + lambda x: ( + str(x['label']) + if isinstance(x, dict) + else str(x) + ), v, ) ) @@ -727,7 +729,7 @@ ret = Transactional.__getitem__(self, key) # it doesn't # (plain dict can be safely discarded) - if (type(ret) == dict) or not ret: + if isinstance(ret, dict) or not ret: # bake transactionals in place if key == 'encap': ret = Encap(parent=self) @@ -822,7 +824,7 @@ def __setitem__(self, key, value): if key == 'via' and isinstance(value, dict): # replace with a new transactional - if type(value) == Via: + if isinstance(value, Via): with self._direct_state: return BaseRoute.__setitem__(self, key, value) # or load the dict diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ipdb/transactional.py new/pyroute2-0.7.12/pyroute2/ipdb/transactional.py --- old/pyroute2-0.7.10/pyroute2/ipdb/transactional.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/ipdb/transactional.py 2024-02-07 10:51:28.000000000 +0100 @@ -1,5 +1,6 @@ ''' ''' + import logging import threading diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/iproute/bsd.py new/pyroute2-0.7.12/pyroute2/iproute/bsd.py --- old/pyroute2-0.7.10/pyroute2/iproute/bsd.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/iproute/bsd.py 2024-02-07 10:51:28.000000000 +0100 @@ -43,6 +43,7 @@ `IPRoute.recv(...)` method returns valid netlink RTNL raw binary payload and `IPRoute.get(...)` returns parsed RTNL messages. ''' + import errno import os import select diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/iproute/windows.py new/pyroute2-0.7.12/pyroute2/iproute/windows.py --- old/pyroute2-0.7.10/pyroute2/iproute/windows.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/iproute/windows.py 2024-02-07 10:51:28.000000000 +0100 @@ -10,6 +10,7 @@ Using pyroute2 on Windows requires installing `win_inet_pton` module, you can use `pip install win_inet_pton`. ''' + import ctypes import os from socket import AF_INET diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ipset.py new/pyroute2-0.7.12/pyroute2/ipset.py --- old/pyroute2-0.7.10/pyroute2/ipset.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/ipset.py 2024-02-07 10:51:28.000000000 +0100 @@ -8,6 +8,7 @@ It supports almost all kernel commands (create, destroy, flush, rename, swap, test...) ''' + import errno import socket diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/cli.py new/pyroute2-0.7.12/pyroute2/ndb/cli.py --- old/pyroute2-0.7.10/pyroute2/ndb/cli.py 2023-03-15 11:10:02.000000000 +0100 +++ new/pyroute2-0.7.12/pyroute2/ndb/cli.py 2024-02-07 15:16:34.000000000 +0100 @@ -14,6 +14,10 @@ from pyroute2.cli.auth.auth_radius import RadiusAuthManager except ImportError: RadiusAuthManager = None +try: + import readline +except ImportError: + readline = None def run(): @@ -61,6 +65,8 @@ return 0 else: console = Console(log=args.l, sources=sources) + if readline is not None: + console.set_completer(readline) if args.r: console.loadrc(args.r) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/main.py new/pyroute2-0.7.12/pyroute2/ndb/main.py --- old/pyroute2-0.7.10/pyroute2/ndb/main.py 2023-08-02 18:44:38.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/ndb/main.py 2024-02-07 10:51:28.000000000 +0100 @@ -278,6 +278,7 @@ # context manager's __exit__() ''' + import atexit import ctypes import ctypes.util diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/objects/__init__.py new/pyroute2-0.7.12/pyroute2/ndb/objects/__init__.py --- old/pyroute2-0.7.10/pyroute2/ndb/objects/__init__.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/ndb/objects/__init__.py 2024-02-09 23:09:58.000000000 +0100 @@ -61,6 +61,7 @@ API === ''' + import collections import errno import json @@ -301,6 +302,9 @@ self.knorm = self.schema.compiled[self.table]['norm_idx'] self.spec = self.schema.compiled[self.table]['all_names'] self.names = self.schema.compiled[self.table]['norm_names'] + self.lookup_fallbacks = self.schema.compiled[self.table][ + 'lookup_fallbacks' + ] self.names_count = [self.names.count(x) for x in self.names] self.last_save = None if self.event_map is None: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/objects/address.py new/pyroute2-0.7.12/pyroute2/ndb/objects/address.py --- old/pyroute2-0.7.10/pyroute2/ndb/objects/address.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/ndb/objects/address.py 2024-02-07 10:51:28.000000000 +0100 @@ -155,6 +155,7 @@ Please notice that address objects are read-only, you may not change them, only remove old ones, and create new. ''' + from pyroute2.netlink.rtnl.ifaddrmsg import ifaddrmsg from pyroute2.requests.address import AddressFieldFilter diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/objects/interface.py new/pyroute2-0.7.12/pyroute2/ndb/objects/interface.py --- old/pyroute2-0.7.10/pyroute2/ndb/objects/interface.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/ndb/objects/interface.py 2024-02-09 23:09:58.000000000 +0100 @@ -655,6 +655,21 @@ return self @check_auth('obj:modify') + def ensure_vlan(self, spec): + def do_ensure_vlan(self, mode, spec): + try: + method = getattr(self.vlan.create(spec), mode) + return [method()] + except KeyError: + return [] + except Exception as e_s: + e_s.trace = traceback.format_stack() + return [e_s] + + self._apply_script.append((do_ensure_vlan, {'spec': spec})) + return self + + @check_auth('obj:modify') def del_vlan(self, spec): def do_del_vlan(self, mode, spec): try: @@ -683,6 +698,23 @@ return self @check_auth('obj:modify') + def ensure_neighbour(self, spec=None, **kwarg): + spec = spec or kwarg + + def do_ensure_neighbour(self, mode, spec): + try: + method = getattr(self.neighbours.create(spec), mode) + return [method()] + except KeyError: + return [] + except Exception as e_s: + e_s.trace = traceback.format_stack() + return [e_s] + + self._apply_script.append((do_ensure_neighbour, {'spec': spec})) + return self + + @check_auth('obj:modify') def del_neighbour(self, spec=None, **kwarg): spec = spec or dict(kwarg) @@ -728,6 +760,23 @@ return self @check_auth('obj:modify') + def ensure_ip(self, spec=None, **kwarg): + spec = spec or kwarg + + def do_ensure_ip(self, mode, spec): + try: + method = getattr(self.ipaddr.create(spec), mode) + return [method()] + except KeyError: + return [] + except Exception as e_s: + e_s.trace = traceback.format_stack() + return [e_s] + + self._apply_script.append((do_ensure_ip, {'spec': spec})) + return self + + @check_auth('obj:modify') def del_ip(self, spec=None, **kwarg): spec = spec or kwarg diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/objects/neighbour.py new/pyroute2-0.7.12/pyroute2/ndb/objects/neighbour.py --- old/pyroute2-0.7.10/pyroute2/ndb/objects/neighbour.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/ndb/objects/neighbour.py 2024-01-29 12:26:05.000000000 +0100 @@ -48,8 +48,9 @@ brmsg_schema = ( ndmsg.sql_schema() - .unique_index('ifindex', 'NDA_LLADDR', 'NDA_VLAN') + .unique_index('ifindex', 'NDA_LLADDR', 'NDA_DST', 'NDA_VLAN') .constraint('NDA_LLADDR', "NOT NULL DEFAULT ''") + .constraint('NDA_DST', "NOT NULL DEFAULT ''") .constraint('NDA_VLAN', "NOT NULL DEFAULT 0") .foreign_key( 'interfaces', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/objects/route.py new/pyroute2-0.7.12/pyroute2/ndb/objects/route.py --- old/pyroute2-0.7.10/pyroute2/ndb/objects/route.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/ndb/objects/route.py 2024-02-07 10:51:28.000000000 +0100 @@ -107,6 +107,7 @@ See here: :ref:`mpls` ''' + import json import struct import time diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/report.py new/pyroute2-0.7.12/pyroute2/ndb/report.py --- old/pyroute2-0.7.10/pyroute2/ndb/report.py 2023-08-02 18:44:38.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/ndb/report.py 2024-02-07 10:51:28.000000000 +0100 @@ -31,6 +31,7 @@ 2,'eth0','5254.0072.58b2','up' ''' + import json import warnings from itertools import chain diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/schema.py new/pyroute2-0.7.12/pyroute2/ndb/schema.py --- old/pyroute2-0.7.10/pyroute2/ndb/schema.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/ndb/schema.py 2024-02-09 23:09:58.000000000 +0100 @@ -116,6 +116,7 @@ all the tables from the DB, and NDB will create them from scratch on startup. ''' + import enum import json import random @@ -460,6 +461,7 @@ 'fset': ','.join(f_set), 'knames': ','.join(f_idx), 'fidx': ' AND '.join(f_idx_match), + 'lookup_fallbacks': iclass.lookup_fallbacks, } @publish diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/source.py new/pyroute2-0.7.12/pyroute2/ndb/source.py --- old/pyroute2-0.7.10/pyroute2/ndb/source.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/ndb/source.py 2024-02-07 10:51:28.000000000 +0100 @@ -7,10 +7,21 @@ starts with one local RTNL source names `localhost`:: >>> ndb = NDB() - >>> ndb.sources.details() - {'kind': u'local', u'nlm_generator': 1, 'target': u'localhost'} + >>> ndb.sources.summary().format("json") + [ + { + "name": "localhost", + "spec": "{'target': 'localhost', 'nlm_generator': 1}", + "state": "running" + }, + { + "name": "localhost/nsmanager", + "spec": "{'target': 'localhost/nsmanager'}", + "state": "running" + } + ] >>> ndb.sources['localhost'] - [running] <IPRoute {'nlm_generator': 1}> + [running] <IPRoute {'target: 'localhost', 'nlm_generator': 1}> The `localhost` RTNL source starts an additional async cache thread. The `nlm_generator` option means that instead of collections the @@ -18,7 +29,7 @@ consume memory regardless of the RTNL objects number:: >>> ndb.sources['localhost'].nl.link('dump') - <generator object _match at 0x7fa444961e10> + <generator object RTNL_API.filter_messages at 0x7f61a99a34a0> See also: :ref:`iproute` @@ -68,6 +79,7 @@ See also: :ref:`remote` ''' + import errno import importlib import queue @@ -180,6 +192,12 @@ self.ndb.task_manager.db_add_nl_source(self.target, self.kind, spec) self.load_sql() + @classmethod + def _count(cls, view): + return view.ndb.task_manager.db_fetchone( + "SELECT count(*) FROM %s" % view.table + ) + @property def must_restart(self): if self.max_errors < 0 or self.errors_counter <= self.max_errors: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/transaction.py new/pyroute2-0.7.12/pyroute2/ndb/transaction.py --- old/pyroute2-0.7.10/pyroute2/ndb/transaction.py 2023-03-15 11:10:02.000000000 +0100 +++ new/pyroute2-0.7.12/pyroute2/ndb/transaction.py 2024-02-07 10:51:28.000000000 +0100 @@ -183,6 +183,7 @@ --- ''' + import logging import shlex import shutil diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/view.py new/pyroute2-0.7.12/pyroute2/ndb/view.py --- old/pyroute2-0.7.10/pyroute2/ndb/view.py 2023-08-02 18:44:38.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/ndb/view.py 2024-02-09 23:09:58.000000000 +0100 @@ -191,6 +191,17 @@ @cli.change_pointer @check_auth('obj:modify') + def ensure(self, *argspec, **kwspec): + try: + obj = self.locate(**kwspec) + except KeyError: + obj = self.create(**kwspec) + for key, value in kwspec.items(): + obj[key] = value + return obj + + @cli.change_pointer + @check_auth('obj:modify') def add(self, *argspec, **kwspec): self.log.warning( '''\n @@ -266,11 +277,17 @@ iclass = self.classes[table] spec = iclass.new_spec(spec) kspec = self.ndb.schema.compiled[table]['norm_idx'] + lookup_fallbacks = self.ndb.schema.compiled[table]['lookup_fallbacks'] request = {} for name in kspec: name = iclass.nla2name(name) if name in spec: request[name] = spec[name] + elif name in lookup_fallbacks: + fallback = lookup_fallbacks[name] + if fallback in spec: + request[fallback] = spec[fallback] + if not request: raise KeyError('got an empty key') return self[request] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/__init__.py new/pyroute2-0.7.12/pyroute2/netlink/__init__.py --- old/pyroute2-0.7.10/pyroute2/netlink/__init__.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/netlink/__init__.py 2024-02-09 23:09:58.000000000 +0100 @@ -834,6 +834,7 @@ sql_constraints = {} sql_extra_fields = () sql_extend = () + lookup_fallbacks = {} nla_flags = 0 # NLA flags value_map = {} is_nla = False diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/devlink/__init__.py new/pyroute2-0.7.12/pyroute2/netlink/devlink/__init__.py --- old/pyroute2-0.7.10/pyroute2/netlink/devlink/__init__.py 2023-08-02 18:44:38.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/netlink/devlink/__init__.py 2024-02-07 10:51:28.000000000 +0100 @@ -2,6 +2,7 @@ devlink module ============== ''' + from pyroute2.common import map_namespace from pyroute2.netlink import genlmsg, nla from pyroute2.netlink.generic import GenericNetlinkSocket diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/diag/ss2.py new/pyroute2-0.7.12/pyroute2/netlink/diag/ss2.py --- old/pyroute2-0.7.10/pyroute2/netlink/diag/ss2.py 2023-11-30 08:55:26.000000000 +0100 +++ new/pyroute2-0.7.12/pyroute2/netlink/diag/ss2.py 2024-02-07 10:51:28.000000000 +0100 @@ -528,7 +528,7 @@ vessel[info_k] = {} # BUG - pyroute2 diag - seems always last info instance from kernel - if type(tcp_info_raw) != str: + if not isinstance(tcp_info_raw, str): for k, v in tcp_info_raw.items(): if k not in info_refine_tabl: continue diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/event/acpi_event.py new/pyroute2-0.7.12/pyroute2/netlink/event/acpi_event.py --- old/pyroute2-0.7.10/pyroute2/netlink/event/acpi_event.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/netlink/event/acpi_event.py 2024-02-07 10:51:28.000000000 +0100 @@ -24,6 +24,7 @@ 'type': 32768} ''' + from pyroute2.common import load_dump from pyroute2.netlink import genlmsg, nla from pyroute2.netlink.event import EventSocket diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/event/dquot.py new/pyroute2-0.7.12/pyroute2/netlink/event/dquot.py --- old/pyroute2-0.7.10/pyroute2/netlink/event/dquot.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/netlink/event/dquot.py 2024-02-07 10:51:28.000000000 +0100 @@ -23,6 +23,7 @@ quota warning 8 for uid 0 on 7:0 ''' + from pyroute2.common import load_dump from pyroute2.netlink import genlmsg from pyroute2.netlink.event import EventSocket diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/event/thermal.py new/pyroute2-0.7.12/pyroute2/netlink/event/thermal.py --- old/pyroute2-0.7.10/pyroute2/netlink/event/thermal.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/netlink/event/thermal.py 2024-02-07 10:51:28.000000000 +0100 @@ -1,5 +1,6 @@ ''' ''' + from enum import Enum from pyroute2.netlink import genlmsg diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/generic/ethtool.py new/pyroute2-0.7.12/pyroute2/netlink/generic/ethtool.py --- old/pyroute2-0.7.10/pyroute2/netlink/generic/ethtool.py 2023-03-15 11:10:02.000000000 +0100 +++ new/pyroute2-0.7.12/pyroute2/netlink/generic/ethtool.py 2024-01-29 12:26:05.000000000 +0100 @@ -1,4 +1,10 @@ -from pyroute2.netlink import NLA_F_NESTED, NLM_F_REQUEST, genlmsg, nla +from pyroute2.netlink import ( + NLA_F_NESTED, + NLM_F_ACK, + NLM_F_REQUEST, + genlmsg, + nla, +) from pyroute2.netlink.exceptions import NetlinkError from pyroute2.netlink.generic import GenericNetlinkSocket @@ -16,6 +22,12 @@ ETHTOOL_MSG_DEBUG_SET = 8 ETHTOOL_MSG_WOL_GET = 9 ETHTOOL_MSG_WOL_SET = 10 +ETHTOOL_MSG_FEATURES_GET = 11 +ETHTOOL_MSG_FEATURES_SET = 12 +ETHTOOL_MSG_PRIVFLAGS_GET = 13 +ETHTOOL_MSG_PRIVFLAGS_SET = 14 +ETHTOOL_MSG_RINGS_GET = 15 +ETHTOOL_MSG_RINGS_SET = 16 class ethtoolheader(nla): @@ -149,6 +161,30 @@ ethtoolbitset = ethtoolbitset +class ethtool_rings_msg(genlmsg): + nla_map = ( + ('ETHTOOL_A_RINGS_UNSPEC', 'none'), + ('ETHTOOL_A_RINGS_HEADER', 'ethtoolheader'), + ('ETHTOOL_A_RINGS_RX_MAX', 'uint32'), + ('ETHTOOL_A_RINGS_RX_MINI_MAX', 'uint32'), + ('ETHTOOL_A_RINGS_RX_JUMBO_MAX', 'uint32'), + ('ETHTOOL_A_RINGS_TX_MAX', 'uint32'), + ('ETHTOOL_A_RINGS_RX', 'uint32'), + ('ETHTOOL_A_RINGS_RX_MINI', 'uint32'), + ('ETHTOOL_A_RINGS_RX_JUMBO', 'uint32'), + ('ETHTOOL_A_RINGS_TX', 'uint32'), + ('ETHTOOL_A_RINGS_RX_BUF_LEN', 'uint32'), + ('ETHTOOL_A_RINGS_TCP_DATA_SPLIT', 'uint8'), + ('ETHTOOL_A_RINGS_CQE_SIZE', 'uint32'), + ('ETHTOOL_A_RINGS_TX_PUSH', 'uint8'), + ('ETHTOOL_A_RINGS_RX_PUSH', 'uint8'), + ('ETHTOOL_A_RINGS_TX_PUSH_BUF_LEN', 'uint32'), + ('ETHTOOL_A_RINGS_TX_PUSH_BUF_LEN_MAX', 'uint32'), + ) + + ethtoolheader = ethtoolheader + + class NlEthtool(GenericNetlinkSocket): def _do_request(self, msg, msg_flags=NLM_F_REQUEST): return self.nlm_request(msg, msg_type=self.prid, msg_flags=msg_flags) @@ -231,3 +267,24 @@ self.bind(ETHTOOL_GENL_NAME, ethtool_wol_msg) return self._do_request(msg) + + def get_rings(self, ifname=None, ifindex=None): + msg = ethtool_rings_msg() + msg["cmd"] = ETHTOOL_MSG_RINGS_GET + msg["version"] = ETHTOOL_GENL_VERSION + msg["attrs"].append( + ('ETHTOOL_A_RINGS_HEADER', self._get_dev_header(ifname, ifindex)) + ) + + self.bind(ETHTOOL_GENL_NAME, ethtool_rings_msg) + return self._do_request(msg) + + def set_rings(self, rings, ifname=None, ifindex=None): + rings["cmd"] = ETHTOOL_MSG_RINGS_SET + rings["version"] = ETHTOOL_GENL_VERSION + rings["attrs"].append( + ('ETHTOOL_A_RINGS_HEADER', self._get_dev_header(ifname, ifindex)) + ) + + self.bind(ETHTOOL_GENL_NAME, ethtool_rings_msg) + return self._do_request(rings, msg_flags=NLM_F_REQUEST | NLM_F_ACK) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/generic/wireguard.py new/pyroute2-0.7.12/pyroute2/netlink/generic/wireguard.py --- old/pyroute2-0.7.10/pyroute2/netlink/generic/wireguard.py 2023-08-02 18:44:38.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/netlink/generic/wireguard.py 2024-02-07 10:51:28.000000000 +0100 @@ -63,7 +63,6 @@ } ''' - import errno import logging import struct diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/ipq/__init__.py new/pyroute2-0.7.12/pyroute2/netlink/ipq/__init__.py --- old/pyroute2-0.7.10/pyroute2/netlink/ipq/__init__.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/netlink/ipq/__init__.py 2024-02-07 10:51:28.000000000 +0100 @@ -11,6 +11,7 @@ `NF_ACCEPT`, and the packet will be pass the rule. ''' + from pyroute2.netlink import NLM_F_REQUEST, nlmsg from pyroute2.netlink.nlsocket import Marshal, NetlinkSocket diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/nl80211/__init__.py new/pyroute2-0.7.12/pyroute2/netlink/nl80211/__init__.py --- old/pyroute2-0.7.10/pyroute2/netlink/nl80211/__init__.py 2023-08-02 18:44:38.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/netlink/nl80211/__init__.py 2024-02-07 14:35:28.000000000 +0100 @@ -4,6 +4,7 @@ TODO ''' + import datetime import struct @@ -217,13 +218,13 @@ 'NL80211_SCAN_FLAG_', globals() ) -NL80211_STA_FLAG_AUTHORIZED = 1 -NL80211_STA_FLAG_SHORT_PREAMBLE = 2 -NL80211_STA_FLAG_WME = 3 -NL80211_STA_FLAG_MFP = 4 -NL80211_STA_FLAG_AUTHENTICATED = 5 -NL80211_STA_FLAG_TDLS_PEER = 6 -NL80211_STA_FLAG_ASSOCIATED = 7 +NL80211_STA_FLAG_AUTHORIZED = 1 << 1 +NL80211_STA_FLAG_SHORT_PREAMBLE = 1 << 2 +NL80211_STA_FLAG_WME = 1 << 3 +NL80211_STA_FLAG_MFP = 1 << 4 +NL80211_STA_FLAG_AUTHENTICATED = 1 << 5 +NL80211_STA_FLAG_TDLS_PEER = 1 << 6 +NL80211_STA_FLAG_ASSOCIATED = 1 << 7 (STA_FLAG_NAMES, STA_FLAG_VALUES) = map_namespace( 'NL80211_STA_FLAG_', globals() ) @@ -943,9 +944,9 @@ data = data[16:] if len(data) >= 4: - rsn_values[ - "group_mgmt_cipher_suite" - ] = self._get_cipher_list(data) + rsn_values["group_mgmt_cipher_suite"] = ( + self._get_cipher_list(data) + ) data = data[4:] return rsn_values @@ -1064,9 +1065,9 @@ ) if msg_type == NL80211_BSS_ELEMENTS_VHT_OPERATION: - self.value[ - "VHT_OPERATION" - ] = self.binary_vht_operation(offset + 2, length) + self.value["VHT_OPERATION"] = ( + self.binary_vht_operation(offset + 2, length) + ) offset += length + 2 @@ -1216,44 +1217,95 @@ self.value["TDLS_PEER"] = False self.value["ASSOCIATED"] = False - init = offset = self.offset + 4 - while (offset - init) < (self.length - 4): - (msg_type, length) = struct.unpack_from( - 'BB', self.data, offset - ) - mask, set_ = struct.unpack_from( - 'II', self.data, offset + 2 - ) + offset = self.offset + 4 + mask, set_ = struct.unpack_from('II', self.data, offset) - if mask & NL80211_STA_FLAG_AUTHORIZED: - if set_ & NL80211_STA_FLAG_AUTHORIZED: - self.value["AUTHORIZED"] = True - - if mask & NL80211_STA_FLAG_SHORT_PREAMBLE: - if set_ & NL80211_STA_FLAG_SHORT_PREAMBLE: - self.value["SHORT_PREAMBLE"] = True - - if mask & NL80211_STA_FLAG_WME: - if set_ & NL80211_STA_FLAG_WME: - self.value["WME"] = True - - if mask & NL80211_STA_FLAG_MFP: - if set_ & NL80211_STA_FLAG_MFP: - self.value["MFP"] = True - - if mask & NL80211_STA_FLAG_AUTHENTICATED: - if set_ & NL80211_STA_FLAG_AUTHENTICATED: - self.value["AUTHENTICATED"] = True - - if mask & NL80211_STA_FLAG_TDLS_PEER: - if set_ & NL80211_STA_FLAG_TDLS_PEER: - self.value["TDLS_PEER"] = True - - if mask & NL80211_STA_FLAG_ASSOCIATED: - if set_ & NL80211_STA_FLAG_ASSOCIATED: - self.value["ASSOCIATED"] = True + if mask & NL80211_STA_FLAG_AUTHORIZED: + if set_ & NL80211_STA_FLAG_AUTHORIZED: + self.value["AUTHORIZED"] = True - offset += length + 2 + if mask & NL80211_STA_FLAG_SHORT_PREAMBLE: + if set_ & NL80211_STA_FLAG_SHORT_PREAMBLE: + self.value["SHORT_PREAMBLE"] = True + + if mask & NL80211_STA_FLAG_WME: + if set_ & NL80211_STA_FLAG_WME: + self.value["WME"] = True + + if mask & NL80211_STA_FLAG_MFP: + if set_ & NL80211_STA_FLAG_MFP: + self.value["MFP"] = True + + if mask & NL80211_STA_FLAG_AUTHENTICATED: + if set_ & NL80211_STA_FLAG_AUTHENTICATED: + self.value["AUTHENTICATED"] = True + + if mask & NL80211_STA_FLAG_TDLS_PEER: + if set_ & NL80211_STA_FLAG_TDLS_PEER: + self.value["TDLS_PEER"] = True + + if mask & NL80211_STA_FLAG_ASSOCIATED: + if set_ & NL80211_STA_FLAG_ASSOCIATED: + self.value["ASSOCIATED"] = True + + class rate_info(nla): + ''' + Decode the data rate information + See nl80211.h: enum nl80211_sta_info, + NL80211_STA_INFO_TX_BITRATE + NL80211_STA_INFO_RX_BITRATE + ''' + + prefix = "NL80211_RATE_INFO_" + nla_map = ( + ('__NL80211_RATE_INFO_INVALID', 'hex'), + ('NL80211_RATE_INFO_BITRATE', 'uint16'), + ('NL80211_RATE_INFO_MCS', 'uint8'), + ('NL80211_RATE_INFO_40_MHZ_WIDTH', 'flag'), + ('NL80211_RATE_INFO_SHORT_GI', 'flag'), + ('NL80211_RATE_INFO_BITRATE32', 'uint32'), + ('NL80211_RATE_INFO_VHT_MCS', 'uint8'), + ('NL80211_RATE_INFO_VHT_NSS', 'uint8'), + ('NL80211_RATE_INFO_80_MHZ_WIDTH', 'flag'), + ('NL80211_RATE_INFO_80P80_MHZ_WIDTH', 'flag'), + ('NL80211_RATE_INFO_160_MHZ_WIDTH', 'flag'), + ('NL80211_RATE_INFO_10_MHZ_WIDTH', 'flag'), + ('NL80211_RATE_INFO_5_MHZ_WIDTH', 'flag'), + ('NL80211_RATE_INFO_HE_MCS', 'uint8'), + ('NL80211_RATE_INFO_HE_NSS', 'uint8'), + ('NL80211_RATE_INFO_HE_GI', 'uint8'), + ('NL80211_RATE_INFO_HE_DCM', 'uint8'), + ('NL80211_RATE_INFO_HE_RU_ALLOC', 'uint8'), + ('NL80211_RATE_INFO_320_MHZ_WIDTH', 'flag'), + ('NL80211_RATE_INFO_EHT_MCS', 'uint8'), + ('NL80211_RATE_INFO_EHT_NSS', 'uint8'), + ('NL80211_RATE_INFO_EHT_GI', 'uint8'), + ('NL80211_RATE_INFO_EHT_RU_ALLOC', 'uint8'), + ('NL80211_RATE_INFO_S1G_MCS', 'uint8'), + ('NL80211_RATE_INFO_S1G_NSS', 'uint8'), + ('NL80211_RATE_INFO_1_MHZ_WIDTH', 'flag'), + ('NL80211_RATE_INFO_2_MHZ_WIDTH', 'flag'), + ('NL80211_RATE_INFO_4_MHZ_WIDTH', 'flag'), + ('NL80211_RATE_INFO_8_MHZ_WIDTH', 'flag'), + ('NL80211_RATE_INFO_16_MHZ_WIDTH', 'flag'), + ) + + class bss_param(nla): + ''' + Decode the BSS information + See nl80211.h: enum nl80211_sta_bss_param, + NL80211_STA_INFO_BSS_PARAM + ''' + + prefix = "NL80211_STA_BSS_PARAM_" + nla_map = ( + ('__NL80211_STA_BSS_PARAM_INVALID', 'hex'), + ('NL80211_STA_BSS_PARAM_CTS_PROT', 'flag'), + ('NL80211_STA_BSS_PARAM_SHORT_PREAMBLE', 'flag'), + ('NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME', 'flag'), + ('NL80211_STA_BSS_PARAM_DTIM_PERIOD', 'uint8'), + ('NL80211_STA_BSS_PARAM_BEACON_INTERVAL', 'uint16'), + ) prefix = 'NL80211_STA_INFO_' nla_map = ( @@ -1265,14 +1317,14 @@ ('NL80211_STA_INFO_PLID', 'uint16'), ('NL80211_STA_INFO_PLINK_STATE', 'uint8'), ('NL80211_STA_INFO_SIGNAL', 'int8'), - ('NL80211_STA_INFO_TX_BITRATE', 'hex'), + ('NL80211_STA_INFO_TX_BITRATE', 'rate_info'), ('NL80211_STA_INFO_RX_PACKETS', 'uint32'), ('NL80211_STA_INFO_TX_PACKETS', 'uint32'), ('NL80211_STA_INFO_TX_RETRIES', 'uint32'), ('NL80211_STA_INFO_TX_FAILED', 'uint32'), ('NL80211_STA_INFO_SIGNAL_AVG', 'int8'), - ('NL80211_STA_INFO_RX_BITRATE', 'hex'), - ('NL80211_STA_INFO_BSS_PARAM', 'hex'), + ('NL80211_STA_INFO_RX_BITRATE', 'rate_info'), + ('NL80211_STA_INFO_BSS_PARAM', 'bss_param'), ('NL80211_STA_INFO_CONNECTED_TIME', 'uint32'), ('NL80211_STA_INFO_STA_FLAGS', 'STAFlags'), ('NL80211_STA_INFO_BEACON_LOSS', 'uint32'), @@ -1282,12 +1334,12 @@ ('NL80211_STA_INFO_NONPEER_PM', 'hex'), ('NL80211_STA_INFO_RX_BYTES64', 'uint64'), ('NL80211_STA_INFO_TX_BYTES64', 'uint64'), - ('NL80211_STA_INFO_CHAIN_SIGNAL', 'string'), - ('NL80211_STA_INFO_CHAIN_SIGNAL_AVG', 'string'), + ('NL80211_STA_INFO_CHAIN_SIGNAL', '*int8'), + ('NL80211_STA_INFO_CHAIN_SIGNAL_AVG', '*int8'), ('NL80211_STA_INFO_EXPECTED_THROUGHPUT', 'uint32'), ('NL80211_STA_INFO_RX_DROP_MISC', 'uint32'), ('NL80211_STA_INFO_BEACON_RX', 'uint64'), - ('NL80211_STA_INFO_BEACON_SIGNAL_AVG', 'uint8'), + ('NL80211_STA_INFO_BEACON_SIGNAL_AVG', 'int8'), ('NL80211_STA_INFO_TID_STATS', 'hex'), ('NL80211_STA_INFO_RX_DURATION', 'uint64'), ('NL80211_STA_INFO_PAD', 'hex'), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/proxy.py new/pyroute2-0.7.12/pyroute2/netlink/proxy.py --- old/pyroute2-0.7.10/pyroute2/netlink/proxy.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/netlink/proxy.py 2024-02-07 10:51:28.000000000 +0100 @@ -1,6 +1,7 @@ ''' Netlink proxy engine ''' + import errno import logging import struct diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/rtnl/__init__.py new/pyroute2-0.7.12/pyroute2/netlink/rtnl/__init__.py --- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/__init__.py 2023-03-15 11:10:02.000000000 +0100 +++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/__init__.py 2024-02-07 10:51:28.000000000 +0100 @@ -34,6 +34,7 @@ Module contents: ''' + from pyroute2.common import map_namespace # RTnetlink multicast group flags (for use with bind()) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/rtnl/ifinfmsg/__init__.py new/pyroute2-0.7.12/pyroute2/netlink/rtnl/ifinfmsg/__init__.py --- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/ifinfmsg/__init__.py 2023-08-02 18:44:38.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/ifinfmsg/__init__.py 2024-02-09 23:09:58.000000000 +0100 @@ -450,6 +450,7 @@ # sql_constraints = {'index': 'NOT NULL'} sql_extra_fields = (('state', 'TEXT'),) + lookup_fallbacks = {'index': 'ifname'} fields = ( ('family', 'B'), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/act_skbedit.py new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/act_skbedit.py --- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/act_skbedit.py 2023-03-15 11:10:02.000000000 +0100 +++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/act_skbedit.py 2024-02-07 10:51:28.000000000 +0100 @@ -42,7 +42,6 @@ - queue: integer ''' - from pyroute2.netlink import nla from pyroute2.netlink.rtnl.tcmsg.common import tc_actions diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/cls_u32.py new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/cls_u32.py --- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/cls_u32.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/cls_u32.py 2024-02-07 10:51:28.000000000 +0100 @@ -54,6 +54,7 @@ # 0xffffff00 = 255.255.255.0 (/24) # 16 = Destination network field bit offset ''' + import struct from socket import htons diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/common.py new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/common.py --- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/common.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/common.py 2024-02-07 10:51:28.000000000 +0100 @@ -263,7 +263,7 @@ attrs.append(['TCA_FLOW_RSHIFT', rshift_value]) elif op == 'addend': # Check if an IP was specified - if type(num) == str and len(num.split('.')) == 4: + if isinstance(num, str) and len(num.split('.')) == 4: if num.startswith('-'): inverse = True else: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_cake.py new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_cake.py --- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_cake.py 2023-03-15 11:10:02.000000000 +0100 +++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_cake.py 2024-02-07 10:51:28.000000000 +0100 @@ -72,7 +72,6 @@ - wash: False or True (False by default) ''' - from pyroute2.netlink import nla from pyroute2.netlink.rtnl import TC_H_ROOT diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_choke.py new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_choke.py --- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_choke.py 2023-03-15 11:10:02.000000000 +0100 +++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_choke.py 2024-02-07 10:51:28.000000000 +0100 @@ -21,6 +21,7 @@ ecn=True) ''' + import logging import struct diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_clsact.py new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_clsact.py --- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_clsact.py 2023-03-15 11:10:02.000000000 +0100 +++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_clsact.py 2024-02-07 10:51:28.000000000 +0100 @@ -23,6 +23,7 @@ parent="ffff:fff3", classid=1, direct_action=True) ''' + from pyroute2.netlink.rtnl import TC_H_CLSACT parent = TC_H_CLSACT diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_drr.py new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_drr.py --- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_drr.py 2023-03-15 11:10:02.000000000 +0100 +++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_drr.py 2024-02-07 10:51:28.000000000 +0100 @@ -10,6 +10,7 @@ ip.tc('add-class', 'drr', interface, '1:20', quantum=1600) ''' + from pyroute2.netlink import nla from pyroute2.netlink.rtnl import TC_H_ROOT from pyroute2.netlink.rtnl.tcmsg.common import stats2 as c_stats2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_hfsc.py new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_hfsc.py --- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_hfsc.py 2023-03-15 11:10:02.000000000 +0100 +++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_hfsc.py 2024-02-07 10:51:28.000000000 +0100 @@ -19,6 +19,7 @@ * `fsc`: link-share curve * `usc`: upper-limit curve ''' + from pyroute2.netlink import nla from pyroute2.netlink.rtnl import RTM_DELQDISC, RTM_NEWQDISC, TC_H_ROOT from pyroute2.netlink.rtnl.tcmsg.common import get_rate, get_time diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_htb.py new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_htb.py --- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_htb.py 2023-03-15 11:10:02.000000000 +0100 +++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_htb.py 2024-02-07 10:51:28.000000000 +0100 @@ -59,6 +59,7 @@ target=0x10020, keys=["0x5/0xf+0", "0x10/0xff+33"]) ''' + from pyroute2.netlink import nla from pyroute2.netlink.rtnl import RTM_DELQDISC, RTM_NEWQDISC, TC_H_ROOT from pyroute2.netlink.rtnl.tcmsg.common import ( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_template.py new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_template.py --- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_template.py 2023-03-15 11:10:02.000000000 +0100 +++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_template.py 2024-02-07 10:51:28.000000000 +0100 @@ -5,6 +5,7 @@ All the methods, variables and classes are optional, but the naming scheme is fixed. ''' + from pyroute2.netlink import nla from pyroute2.netlink.rtnl import TC_H_ROOT from pyroute2.netlink.rtnl.tcmsg import common diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netns/__init__.py new/pyroute2-0.7.12/pyroute2/netns/__init__.py --- old/pyroute2-0.7.10/pyroute2/netns/__init__.py 2023-10-27 20:33:18.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/netns/__init__.py 2024-02-07 10:51:28.000000000 +0100 @@ -79,6 +79,7 @@ SELinux state with `getenforce` command. ''' + import ctypes import ctypes.util import errno diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/nftables/main.py new/pyroute2-0.7.12/pyroute2/nftables/main.py --- old/pyroute2-0.7.10/pyroute2/nftables/main.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/nftables/main.py 2024-02-07 10:51:28.000000000 +0100 @@ -1,5 +1,6 @@ ''' ''' + from pyroute2.netlink.nfnetlink import nfgen_msg from pyroute2.netlink.nfnetlink.nftsocket import ( DATA_TYPE_ID_TO_NAME, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/remote/iproute.py new/pyroute2-0.7.12/pyroute2/remote/iproute.py --- old/pyroute2-0.7.10/pyroute2/remote/iproute.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/remote/iproute.py 2024-02-09 15:07:02.000000000 +0100 @@ -130,6 +130,7 @@ raise self.marshal = MarshalRtnl() self.target = target + self.groups = 67372509 def clone(self): return type(self)(*self._argv, **self._kwarg) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/remote/transport.py new/pyroute2-0.7.12/pyroute2/remote/transport.py --- old/pyroute2-0.7.10/pyroute2/remote/transport.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/remote/transport.py 2024-02-07 10:51:28.000000000 +0100 @@ -196,9 +196,9 @@ and ipr._brd_socket is not None ): inputs.append(ipr._brd_socket.fileno()) - broadcasts[ - ipr._brd_socket.fileno() - ] = ipr._brd_socket + broadcasts[ipr._brd_socket.fileno()] = ( + ipr._brd_socket + ) except Exception as e: ret = None error = e diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/requests/main.py new/pyroute2-0.7.12/pyroute2/requests/main.py --- old/pyroute2-0.7.10/pyroute2/requests/main.py 2023-07-03 16:56:33.000000000 +0200 +++ new/pyroute2-0.7.12/pyroute2/requests/main.py 2024-02-07 10:51:28.000000000 +0100 @@ -1,6 +1,7 @@ ''' General request and RTNL object data filters. ''' + import weakref from collections import ChainMap diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/requests/neighbour.py new/pyroute2-0.7.12/pyroute2/requests/neighbour.py --- old/pyroute2-0.7.10/pyroute2/requests/neighbour.py 2023-03-15 11:10:02.000000000 +0100 +++ new/pyroute2-0.7.12/pyroute2/requests/neighbour.py 2024-01-29 12:26:05.000000000 +0100 @@ -28,6 +28,12 @@ def set_state(self, context, value): return self._state(value) + def set_dst(self, context, value): + if value: + return {'dst': value} + else: + return {} + class NeighbourIPRouteFilter(IPRouteFilter): def set_dst(self, context, value): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2.egg-info/PKG-INFO new/pyroute2-0.7.12/pyroute2.egg-info/PKG-INFO --- old/pyroute2-0.7.10/pyroute2.egg-info/PKG-INFO 2023-11-30 09:16:18.000000000 +0100 +++ new/pyroute2-0.7.12/pyroute2.egg-info/PKG-INFO 2024-02-10 16:04:20.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: pyroute2 -Version: 0.7.10 +Version: 0.7.12 Summary: Python Netlink library Home-page: https://github.com/svinota/pyroute2 Author: Peter Saveliev @@ -17,12 +17,11 @@ Classifier: Intended Audience :: System Administrators Classifier: Intended Audience :: Telecommunications Industry Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 Classifier: Development Status :: 4 - Beta Description-Content-Type: text/x-rst License-File: LICENSE diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyroute2-0.7.10/setup.cfg new/pyroute2-0.7.12/setup.cfg --- old/pyroute2-0.7.10/setup.cfg 2023-11-30 09:16:18.271647000 +0100 +++ new/pyroute2-0.7.12/setup.cfg 2024-02-10 16:04:20.603168700 +0100 @@ -20,12 +20,11 @@ Intended Audience :: System Administrators Intended Audience :: Telecommunications Industry Programming Language :: Python :: 3 - Programming Language :: Python :: 3.6 - Programming Language :: Python :: 3.7 Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 + Programming Language :: Python :: 3.12 Development Status :: 4 - Beta [options]