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. --- src/conf_mode/qos.py | 3 ++- src/conf_mode/service_broadcast-relay.py | 2 +- src/conf_mode/service_mdns_repeater.py | 4 +++- src/conf_mode/service_stunnel.py | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/conf_mode/qos.py b/src/conf_mode/qos.py index 326d617a2..4ea900bb8 100755 --- a/src/conf_mode/qos.py +++ b/src/conf_mode/qos.py @@ -15,7 +15,8 @@ # along with this program. If not, see . from sys import exit -from netifaces import interfaces + +from netifaces import interfaces # pylint: disable = no-name-in-module from vyos.base import Warning from vyos.config import Config diff --git a/src/conf_mode/service_broadcast-relay.py b/src/conf_mode/service_broadcast-relay.py index f7f2875f5..b3f38dd21 100755 --- a/src/conf_mode/service_broadcast-relay.py +++ b/src/conf_mode/service_broadcast-relay.py @@ -17,7 +17,7 @@ import os from glob import glob -from netifaces import AF_INET +from socket import AF_INET from sys import exit from vyos.config import Config diff --git a/src/conf_mode/service_mdns_repeater.py b/src/conf_mode/service_mdns_repeater.py index 360b94588..aa10a687e 100755 --- a/src/conf_mode/service_mdns_repeater.py +++ b/src/conf_mode/service_mdns_repeater.py @@ -18,7 +18,9 @@ import os from json import loads from sys import exit -from netifaces import ifaddresses, AF_INET, AF_INET6 +from socket import AF_INET +from socket import AF_INET6 +from netifaces import ifaddresses # pylint: disable = no-name-in-module from vyos.config import Config from vyos.configverify import verify_interface_exists diff --git a/src/conf_mode/service_stunnel.py b/src/conf_mode/service_stunnel.py index eb1d4dea2..5ea5b88b4 100644 --- a/src/conf_mode/service_stunnel.py +++ b/src/conf_mode/service_stunnel.py @@ -19,7 +19,7 @@ from shutil import rmtree from sys import exit -from netifaces import AF_INET +from socket import AF_INET from psutil import net_if_addrs from vyos.config import Config -- cgit v1.2.3 From c9f7684c107ecdb9a74764d9a4f7bb7c939573db Mon Sep 17 00:00:00 2001 From: Christian Breunig Date: Mon, 21 Jul 2025 21:01:03 +0200 Subject: op-mode: T7648: add missing import statement in connect disconnect handler --- src/op_mode/connect_disconnect.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/op_mode/connect_disconnect.py b/src/op_mode/connect_disconnect.py index 9035ce072..117e65713 100755 --- a/src/op_mode/connect_disconnect.py +++ b/src/op_mode/connect_disconnect.py @@ -18,6 +18,7 @@ import os import argparse from psutil import process_iter +from time import sleep from vyos.configquery import ConfigTreeQuery from vyos.utils.process import call @@ -68,7 +69,7 @@ def connect(interface): if ( count % 60 == 0 ): print(f'Commit still in progress after {count}s - waiting') count += 1 - time.sleep(1) + sleep(1) call('/usr/libexec/vyos/conf_mode/qos.py') def disconnect(interface): -- cgit v1.2.3 From 1e4cc0806435f6e694e74cd6123a45bdedf3f0c9 Mon Sep 17 00:00:00 2001 From: Christian Breunig Date: Mon, 21 Jul 2025 21:02:24 +0200 Subject: op-mode: pki: T7648: fix pylint error ************* Module pki src/op_mode/pki.py:459:8: E1128: Assigning result of a function call, where the function returns None (assignment-from-none) --- src/op_mode/pki.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/op_mode/pki.py b/src/op_mode/pki.py index 2ee57a458..0f144443b 100755 --- a/src/op_mode/pki.py +++ b/src/op_mode/pki.py @@ -417,7 +417,7 @@ def parse_san_string(san_string): output.append(ipaddress.IPv6Address(value)) elif tag == 'dns' or tag == 'rfc822': output.append(value) - return + return output def generate_certificate_request( -- cgit v1.2.3 From 32d5bbaa006fe99b326af51f7fcabd10730fe5b4 Mon Sep 17 00:00:00 2001 From: Christian Breunig Date: Mon, 21 Jul 2025 21:03:41 +0200 Subject: op-mode: T7648: fix pylint errors in storage module ************* Module storage src/op_mode/storage.py:32:11: E0602: Undefined variable '_get_system_storage' (undefined-variable) src/op_mode/storage.py:52:11: E0602: Undefined variable 'output' (undefined-variable) --- src/op_mode/storage.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) (limited to 'src') diff --git a/src/op_mode/storage.py b/src/op_mode/storage.py index 7e869e9d9..0f3fabe32 100755 --- a/src/op_mode/storage.py +++ b/src/op_mode/storage.py @@ -13,10 +13,8 @@ # # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# import sys - import vyos.opmode from jinja2 import Template @@ -28,9 +26,6 @@ Used: {{used}} ({{use_percentage}}%) Available: {{avail}} ({{avail_percentage}}%) """ -def _get_formatted_output(): - return _get_system_storage() - def show(raw: bool): from vyos.utils.disk import get_persistent_storage_stats @@ -49,7 +44,7 @@ def show(raw: bool): tmpl = Template(output_tmpl) return tmpl.render(data).strip() - return output + return None if __name__ == '__main__': try: @@ -59,4 +54,3 @@ if __name__ == '__main__': except (ValueError, vyos.opmode.Error) as e: print(e) sys.exit(1) - -- 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 'src') 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 8c4ddd1e6c9aaf2a9292f291c7d92d1314fb8890 Mon Sep 17 00:00:00 2001 From: Christian Breunig Date: Mon, 21 Jul 2025 21:10:59 +0200 Subject: migration: T7648: fix Undefined variable 'base' in interfaces/0-to-1 --- src/migration-scripts/interfaces/0-to-1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/migration-scripts/interfaces/0-to-1 b/src/migration-scripts/interfaces/0-to-1 index 6ed5f118f..c4417c4ca 100644 --- a/src/migration-scripts/interfaces/0-to-1 +++ b/src/migration-scripts/interfaces/0-to-1 @@ -20,6 +20,8 @@ from vyos.configtree import ConfigTree +base = ['interfaces', 'bridge'] + def migrate_bridge(config, tree, intf): # check if bridge-group exists tree_bridge = tree + ['bridge-group'] @@ -49,8 +51,6 @@ def migrate_bridge(config, tree, intf): def migrate(config: ConfigTree) -> None: - base = ['interfaces', 'bridge'] - if not config.exists(base): # Nothing to do return -- cgit v1.2.3 From f1967db6c12e7b42e2374d0802855d9e4c5f5409 Mon Sep 17 00:00:00 2001 From: Christian Breunig Date: Mon, 21 Jul 2025 21:13:37 +0200 Subject: migration: T7648: fix Undefined variable 'config' in interfaces/5-to-6 --- src/migration-scripts/interfaces/5-to-6 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/migration-scripts/interfaces/5-to-6 b/src/migration-scripts/interfaces/5-to-6 index 45a6daef7..8f406b5c8 100644 --- a/src/migration-scripts/interfaces/5-to-6 +++ b/src/migration-scripts/interfaces/5-to-6 @@ -56,7 +56,7 @@ def copy_rtradv(c, old_base, interface): # cleanup boolean nodes in individual route route_base = new_base + ['route'] if c.exists(route_base): - for route in config.list_nodes(route_base): + for route in c.list_nodes(route_base): if c.exists(route_base + [route, 'remove-route']): tmp = c.return_value(route_base + [route, 'remove-route']) c.delete(route_base + [route, 'remove-route']) @@ -66,7 +66,7 @@ def copy_rtradv(c, old_base, interface): # cleanup boolean nodes in individual prefix prefix_base = new_base + ['prefix'] if c.exists(prefix_base): - for prefix in config.list_nodes(prefix_base): + for prefix in c.list_nodes(prefix_base): if c.exists(prefix_base + [prefix, 'autonomous-flag']): tmp = c.return_value(prefix_base + [prefix, 'autonomous-flag']) c.delete(prefix_base + [prefix, 'autonomous-flag']) -- cgit v1.2.3 From 1b572eddf786bcd1edfcd86eaa7f70f136fafbd4 Mon Sep 17 00:00:00 2001 From: Christian Breunig Date: Mon, 21 Jul 2025 21:14:20 +0200 Subject: migration: T7648: fix Undefined variable 'af_path' in quagga/2-to-3 --- src/migration-scripts/quagga/2-to-3 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/migration-scripts/quagga/2-to-3 b/src/migration-scripts/quagga/2-to-3 index b619d1edc..2494abdae 100644 --- a/src/migration-scripts/quagga/2-to-3 +++ b/src/migration-scripts/quagga/2-to-3 @@ -15,6 +15,8 @@ from vyos.configtree import ConfigTree +# Just to avoid writing it so many times +af_path = ['address-family', 'ipv4-unicast'] def migrate_neighbor(config, neighbor_path, neighbor): if config.exists(neighbor_path): @@ -106,9 +108,6 @@ def migrate(config: ConfigTree) -> None: # Nothing to do return - # Just to avoid writing it so many times - af_path = ['address-family', 'ipv4-unicast'] - # Check if BGP is actually configured and obtain the ASN asn_list = config.list_nodes(['protocols', 'bgp']) if asn_list: -- cgit v1.2.3 From 78c21d260127937dba8d671b54b6eca396ae501a Mon Sep 17 00:00:00 2001 From: Christian Breunig Date: Mon, 21 Jul 2025 21:18:46 +0200 Subject: migration: T7648: fix Undefined variable 'config' in vrrp/1-to-2 --- src/migration-scripts/vrrp/1-to-2 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/migration-scripts/vrrp/1-to-2 b/src/migration-scripts/vrrp/1-to-2 index a717df29c..706537813 100644 --- a/src/migration-scripts/vrrp/1-to-2 +++ b/src/migration-scripts/vrrp/1-to-2 @@ -25,7 +25,7 @@ from vyos.configtree import ConfigTree # It was supported only under ethernet and bonding and their # respective vif, vif-s, and vif-c subinterfaces -def get_vrrp_group(path): +def get_vrrp_group(config, path): group = {"preempt": True, "rfc_compatibility": False, "disable": False} if config.exists(path + ["advertise-interval"]): @@ -115,7 +115,7 @@ def migrate(config: ConfigTree) -> None: if config.exists(parent_path + vg_path): pgroups = config.list_nodes(parent_path + vg_path) for pg in pgroups: - g = get_vrrp_group(parent_path + vg_path + [pg]) + g = get_vrrp_group(config, parent_path + vg_path + [pg]) g["interface"] = pi g["vrid"] = pg groups.append(g) @@ -132,7 +132,7 @@ def migrate(config: ConfigTree) -> None: if config.exists(parent_path + vif_vg_path): vifgroups = config.list_nodes(parent_path + vif_vg_path) for vif_group in vifgroups: - g = get_vrrp_group(parent_path + vif_vg_path + [vif_group]) + g = get_vrrp_group(config, parent_path + vif_vg_path + [vif_group]) g["interface"] = "{0}.{1}".format(pi, vif) g["vrid"] = vif_group groups.append(g) @@ -147,7 +147,7 @@ def migrate(config: ConfigTree) -> None: if config.exists(parent_path + vifs_vg_path): vifsgroups = config.list_nodes(parent_path + vifs_vg_path) for vifs_group in vifsgroups: - g = get_vrrp_group(parent_path + vifs_vg_path + [vifs_group]) + g = get_vrrp_group(config, parent_path + vifs_vg_path + [vifs_group]) g["interface"] = "{0}.{1}".format(pi, vif_s) g["vrid"] = vifs_group groups.append(g) @@ -161,7 +161,7 @@ def migrate(config: ConfigTree) -> None: vifc_vg_path = [pi, "vif-s", vif_s, "vif-c", vif_c, "vrrp", "vrrp-group"] vifcgroups = config.list_nodes(parent_path + vifc_vg_path) for vifc_group in vifcgroups: - g = get_vrrp_group(parent_path + vifc_vg_path + [vifc_group]) + g = get_vrrp_group(config, parent_path + vifc_vg_path + [vifc_group]) g["interface"] = "{0}.{1}.{2}".format(pi, vif_s, vif_c) g["vrid"] = vifc_group groups.append(g) @@ -173,7 +173,7 @@ def migrate(config: ConfigTree) -> None: return # Otherwise, there is VRRP to convert - + # Now convert the collected groups to the new syntax base_group_path = ["high-availability", "vrrp", "group"] sync_path = ["high-availability", "vrrp", "sync-group"] -- cgit v1.2.3