From 7f20a2ed716b396dde4b2a16f47d237c909c8d12 Mon Sep 17 00:00:00 2001 From: Christian Breunig Date: Mon, 21 Jul 2025 20:57:52 +0200 Subject: T7648: when using netifaces set "pylint: disable = no-name-in-module" As the python netifaces module is written in C - we can not inspect any import line as the linter does not see it. Disable the warnings here. --- python/vyos/ifconfig/interface.py | 7 +++---- python/vyos/utils/network.py | 17 +++++++---------- 2 files changed, 10 insertions(+), 14 deletions(-) (limited to 'python') diff --git a/python/vyos/ifconfig/interface.py b/python/vyos/ifconfig/interface.py index 787364483..3b3536301 100644 --- a/python/vyos/ifconfig/interface.py +++ b/python/vyos/ifconfig/interface.py @@ -23,10 +23,9 @@ from glob import glob from ipaddress import IPv4Network from ipaddress import IPv6Interface -from netifaces import ifaddresses -# this is not the same as socket.AF_INET/INET6 -from netifaces import AF_INET -from netifaces import AF_INET6 +from netifaces import ifaddresses # pylint: disable = no-name-in-module +from socket import AF_INET +from socket import AF_INET6 from netaddr import EUI from netaddr import mac_unix_expanded diff --git a/python/vyos/utils/network.py b/python/vyos/utils/network.py index 2182642dd..0e2cc58cf 100644 --- a/python/vyos/utils/network.py +++ b/python/vyos/utils/network.py @@ -13,9 +13,10 @@ # You should have received a copy of the GNU Lesser General Public # License along with this library. If not, see . +from socket import AF_INET +from socket import AF_INET6 + def _are_same_ip(one, two): - from socket import AF_INET - from socket import AF_INET6 from socket import inet_pton from vyos.template import is_ipv4 # compare the binary representation of the IP @@ -347,7 +348,7 @@ def is_ipv6_link_local(addr): def is_addr_assigned(ip_address, vrf=None, return_ifname=False, include_vrf=False) -> bool | str: """ Verify if the given IPv4/IPv6 address is assigned to any interface """ - from netifaces import interfaces + from netifaces import interfaces # pylint: disable = no-name-in-module from vyos.utils.network import get_interface_config from vyos.utils.dict import dict_search @@ -445,10 +446,8 @@ def is_subnet_connected(subnet, primary=False): from ipaddress import ip_address from ipaddress import ip_network - from netifaces import ifaddresses - from netifaces import interfaces - from netifaces import AF_INET - from netifaces import AF_INET6 + from netifaces import ifaddresses # pylint: disable = no-name-in-module + from netifaces import interfaces # pylint: disable = no-name-in-module from vyos.template import is_ipv6 @@ -482,9 +481,7 @@ def is_subnet_connected(subnet, primary=False): def is_afi_configured(interface: str, afi): """ Check if given address family is configured, or in other words - an IP address is assigned to the interface. """ - from netifaces import ifaddresses - from netifaces import AF_INET - from netifaces import AF_INET6 + from netifaces import ifaddresses # pylint: disable = no-name-in-module if afi not in [AF_INET, AF_INET6]: raise ValueError('Address family must be in [AF_INET, AF_INET6]') -- cgit v1.2.3 From b058016e76f8b1f12d4ae1ae9ba7aa98a28990dd Mon Sep 17 00:00:00 2001 From: Christian Breunig Date: Mon, 21 Jul 2025 21:00:16 +0200 Subject: vyos.ifconfig: T7648: fix pylint errors ************* Module vyos.ifconfig.control python/vyos/ifconfig/control.py:53:22: E1101: Instance of 'Control' has no 'config' member (no-member) python/vyos/ifconfig/control.py:59:47: E1101: Instance of 'Control' has no 'config' member (no-member) python/vyos/ifconfig/control.py:63:43: E1101: Instance of 'Control' has no 'config' member (no-member) python/vyos/ifconfig/control.py:91:28: E1101: Instance of 'Control' has no 'ifname' member (no-member) python/vyos/ifconfig/control.py:186:35: E1101: Instance of 'Control' has no 'config' member (no-member) python/vyos/ifconfig/control.py:188:37: E1101: Instance of 'Control' has no 'config' member (no-member) python/vyos/ifconfig/control.py:193:35: E1101: Instance of 'Control' has no 'config' member (no-member) python/vyos/ifconfig/control.py:195:37: E1101: Instance of 'Control' has no 'config' member (no-member) --- python/vyos/ifconfig/control.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'python') diff --git a/python/vyos/ifconfig/control.py b/python/vyos/ifconfig/control.py index e5672ed50..3cf3297b4 100644 --- a/python/vyos/ifconfig/control.py +++ b/python/vyos/ifconfig/control.py @@ -29,6 +29,8 @@ class Control(Section): _command_get = {} _command_set = {} _signature = {} + config = {} + ifname = None def __init__(self, **kargs): # some commands (such as operation comands - show interfaces, etc.) -- cgit v1.2.3 From f6e25c242bd4623c452c7d034cd12aa47fee8953 Mon Sep 17 00:00:00 2001 From: Christian Breunig Date: Mon, 21 Jul 2025 21:04:59 +0200 Subject: vyos.utils: T7648: only provide one chown function Remove duplicate function definition vyos.utils.file.chown which was also provided by vyos.utils.permission.chown. --- python/vyos/utils/file.py | 30 ------------------------------ python/vyos/utils/permission.py | 24 +++++++++++++++++++----- src/conf_mode/service_dhcp-server.py | 2 +- src/conf_mode/service_dhcpv6-server.py | 2 +- src/conf_mode/system_login.py | 2 +- 5 files changed, 22 insertions(+), 38 deletions(-) (limited to 'python') diff --git a/python/vyos/utils/file.py b/python/vyos/utils/file.py index 31c2361df..49bea567d 100644 --- a/python/vyos/utils/file.py +++ b/python/vyos/utils/file.py @@ -92,36 +92,6 @@ def read_json(fname, defaultonfailure=None): return defaultonfailure raise e -def chown(path, user=None, group=None, recursive=False): - """ change file/directory owner """ - from pwd import getpwnam - from grp import getgrnam - - if user is None and group is None: - return False - - # path may also be an open file descriptor - if not isinstance(path, int) and not os.path.exists(path): - return False - - # keep current value if not specified otherwise - uid = -1 - gid = -1 - - if user: - uid = getpwnam(user).pw_uid - if group: - gid = getgrnam(group).gr_gid - - if recursive: - for dirpath, dirnames, filenames in os.walk(path): - os.chown(dirpath, uid, gid) - for filename in filenames: - os.chown(os.path.join(dirpath, filename), uid, gid) - else: - os.chown(path, uid, gid) - return True - def chmod(path, bitmask): # path may also be an open file descriptor diff --git a/python/vyos/utils/permission.py b/python/vyos/utils/permission.py index efd44bfeb..08bb7bdbc 100644 --- a/python/vyos/utils/permission.py +++ b/python/vyos/utils/permission.py @@ -15,23 +15,37 @@ import os -def chown(path, user, group): +def chown(path, user=None, group=None, recursive=False): """ change file/directory owner """ from pwd import getpwnam from grp import getgrnam - if user is None or group is None: + if user is None and group is None: return False # path may also be an open file descriptor if not isinstance(path, int) and not os.path.exists(path): return False - uid = getpwnam(user).pw_uid - gid = getgrnam(group).gr_gid - os.chown(path, uid, gid) + # keep current value if not specified otherwise + uid = -1 + gid = -1 + + if user: + uid = getpwnam(user).pw_uid + if group: + gid = getgrnam(group).gr_gid + + if recursive: + for dirpath, dirnames, filenames in os.walk(path): + os.chown(dirpath, uid, gid) + for filename in filenames: + os.chown(os.path.join(dirpath, filename), uid, gid) + else: + os.chown(path, uid, gid) return True + def chmod(path, bitmask): # path may also be an open file descriptor if not isinstance(path, int) and not os.path.exists(path): diff --git a/src/conf_mode/service_dhcp-server.py b/src/conf_mode/service_dhcp-server.py index 6bbe72e90..b404b1708 100755 --- a/src/conf_mode/service_dhcp-server.py +++ b/src/conf_mode/service_dhcp-server.py @@ -29,9 +29,9 @@ from vyos.template import render from vyos.utils.dict import dict_search from vyos.utils.dict import dict_search_args from vyos.utils.file import chmod_775 -from vyos.utils.file import chown from vyos.utils.file import makedir from vyos.utils.file import write_file +from vyos.utils.permission import chown from vyos.utils.process import call from vyos.utils.network import interface_exists from vyos.utils.network import is_subnet_connected diff --git a/src/conf_mode/service_dhcpv6-server.py b/src/conf_mode/service_dhcpv6-server.py index 07dd08337..8344f99b4 100755 --- a/src/conf_mode/service_dhcpv6-server.py +++ b/src/conf_mode/service_dhcpv6-server.py @@ -25,11 +25,11 @@ from vyos.config import Config from vyos.template import render from vyos.utils.process import call from vyos.utils.file import chmod_775 -from vyos.utils.file import chown from vyos.utils.file import makedir from vyos.utils.file import write_file from vyos.utils.dict import dict_search from vyos.utils.network import is_subnet_connected +from vyos.utils.permission import chown from vyos import ConfigError from vyos import airbag airbag.enable() diff --git a/src/conf_mode/system_login.py b/src/conf_mode/system_login.py index 00cacccd1..234b24770 100755 --- a/src/conf_mode/system_login.py +++ b/src/conf_mode/system_login.py @@ -37,7 +37,7 @@ from vyos.utils.auth import get_current_user from vyos.utils.configfs import delete_cli_node from vyos.utils.configfs import add_cli_node from vyos.utils.dict import dict_search -from vyos.utils.file import chown +from vyos.utils.permission import chown from vyos.utils.process import cmd from vyos.utils.process import call from vyos.utils.process import run -- cgit v1.2.3 From dc06f6ff6e98c69daf4ed32b6234fbf443c8e3df Mon Sep 17 00:00:00 2001 From: Christian Breunig Date: Mon, 21 Jul 2025 21:06:01 +0200 Subject: vyos.utils: T7648: remove duplicate definition of makedir Function makedir defined two times inside the same file. --- python/vyos/utils/file.py | 6 ------ 1 file changed, 6 deletions(-) (limited to 'python') diff --git a/python/vyos/utils/file.py b/python/vyos/utils/file.py index 49bea567d..1e2de2b39 100644 --- a/python/vyos/utils/file.py +++ b/python/vyos/utils/file.py @@ -145,12 +145,6 @@ def file_permissions(path): """ Return file permissions in string format, e.g '0755' """ return oct(os.stat(path).st_mode)[4:] -def makedir(path, user=None, group=None): - if os.path.exists(path): - return - os.makedirs(path, mode=0o755) - chown(path, user, group) - def wait_for_inotify(file_path, pre_hook=None, event_type=None, timeout=None, sleep_interval=0.1): """ Waits for an inotify event to occur """ if not os.path.dirname(file_path): -- cgit v1.2.3 From 5f3485d44151dab88b7ca11d12e61fd990457f03 Mon Sep 17 00:00:00 2001 From: Christian Breunig Date: Mon, 21 Jul 2025 21:06:46 +0200 Subject: vyos.utils: T7648: fix missing import for ConfigError --- python/vyos/utils/dict.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'python') diff --git a/python/vyos/utils/dict.py b/python/vyos/utils/dict.py index e6ef943c6..ff21f0677 100644 --- a/python/vyos/utils/dict.py +++ b/python/vyos/utils/dict.py @@ -347,8 +347,6 @@ class FixedDict(dict): raise ConfigError(f'Option "{k}" has no defined default') """ - from vyos import ConfigError - def __init__(self, **options): self._allowed = options.keys() super().__init__(**options) @@ -368,6 +366,7 @@ class FixedDict(dict): >>> d {'key': 'value'} """ + from vyos import ConfigError if k not in self._allowed: raise ConfigError(f'Option "{k}" has no defined default') super().__setitem__(k, v) -- cgit v1.2.3 From ef3ed4feae0a08be815020a0013bd6217d70381c Mon Sep 17 00:00:00 2001 From: Christian Breunig Date: Mon, 21 Jul 2025 21:07:56 +0200 Subject: vyos.utils: T7648: fix undefined variable in install_into_config ************* Module vyos.utils.misc python/vyos/utils/misc.py:51:46: E0602: Undefined variable 'node' (undefined-variable) --- python/vyos/utils/misc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'python') diff --git a/python/vyos/utils/misc.py b/python/vyos/utils/misc.py index 0ffd82696..c7f7e7343 100644 --- a/python/vyos/utils/misc.py +++ b/python/vyos/utils/misc.py @@ -48,7 +48,7 @@ def install_into_config(conf, config_paths, override_prompt=True): for path in config_paths: if override_prompt and conf.exists(path) and not conf.is_multi(path): - if not ask_yes_no(f'Config node "{node}" already exists. Do you want to overwrite it?'): + if not ask_yes_no(f'Config node "{path}" already exists. Do you want to overwrite it?'): continue try: -- cgit v1.2.3