From df200633bc555229942f23a4093f702579f02fa3941310983e9539c6df1e042d Mon Sep 17 00:00:00 2001 From: Lee Duncan Date: Mon, 24 Mar 2025 19:48:06 +0000 Subject: [PATCH] Accepting request 1255725 from home:lee_duncan:branches:devel:languages:python - Update to version v2.2.2: * Explicitly set build target wheel packages * Fix the program name in pyproject.toml * Fix and update pre-commit ruf check * Add PyPA publish and pre-commit check workflows * Add rtslib_fb import compability * Silently ignore OSError on close * fixup! Fix various issues found by ruff linter rules * Add ruff rules, pre-commit config * Convert codebase to pathlib * Fix various issues found by ruff linter rules * Refactor code to Python>=3.9 to pass pyupgrade * Fix issues found by ruff pep8-naming rules * Fix issues found by ruff pycodestyle rules * Use f-strings * Fixing issues found by ruff Pyflakes rules * Move to PEP-621; Drop -fb from module name * rtslib: explicitely import "kmod.error" and "kmod.Kmod" * rtslib/LUN: add some ALUA property Also, updated the SPEC file, and removed patch no longer needed, since the problem is no longer present: * rtslib-Fix-handling-of-sysfs-RW-attrs-that-are-actually-RO.patch Added three commits, one from upstream, the others submitted there: * Install-targetctl-as-an-entrypoint.patch (added from upstream) * Remove-use-of-usr-bin-python.patch (submitted upstream) * Fix-issue-with-Path-open-needs-parenthesis.patch (submitted upstream) OBS-URL: https://build.opensuse.org/request/show/1255725 OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-rtslib-fb?expand=0&rev=81 --- ...sue-with-Path-open-needs-parenthesis.patch | 85 +++++++++++++++++++ Install-targetctl-as-an-entrypoint.patch | 44 ++++++++++ Remove-use-of-usr-bin-python.patch | 26 ++++++ _service | 3 +- _servicedata | 2 +- python-rtslib-fb-v2.1.76.tar.xz | 3 - python-rtslib-fb-v2.2.2.tar.xz | 3 + python-rtslib-fb.changes | 32 +++++++ python-rtslib-fb.spec | 45 +++++----- ...-sysfs-RW-attrs-that-are-actually-RO.patch | 65 -------------- rtslib-target-service-for-suse.patch | 12 ++- 11 files changed, 223 insertions(+), 97 deletions(-) create mode 100644 Fix-issue-with-Path-open-needs-parenthesis.patch create mode 100644 Install-targetctl-as-an-entrypoint.patch create mode 100644 Remove-use-of-usr-bin-python.patch delete mode 100644 python-rtslib-fb-v2.1.76.tar.xz create mode 100644 python-rtslib-fb-v2.2.2.tar.xz delete mode 100644 rtslib-Fix-handling-of-sysfs-RW-attrs-that-are-actually-RO.patch diff --git a/Fix-issue-with-Path-open-needs-parenthesis.patch b/Fix-issue-with-Path-open-needs-parenthesis.patch new file mode 100644 index 0000000..6e2116b --- /dev/null +++ b/Fix-issue-with-Path-open-needs-parenthesis.patch @@ -0,0 +1,85 @@ +From e70542fec8f78d156cee101bc8680ddabbbbd7f6 Mon Sep 17 00:00:00 2001 +From: Lee Duncan +Date: Mon, 24 Mar 2025 11:21:59 -0700 +Subject: [PATCH] Fix issue with Path(...).open: needs parenthesis + +There are places where the code does this pattern: + + with Path(some_path).open as f: + ... (do stuff) + +But that generates an error message like: + + /> restoreconfig temp.json + Traceback (most recent call last): + File "/usr/bin/targetcli", line 8, in + sys.exit(main()) + ~~~~^^ + File "/usr/lib/python3.13/site-packages/targetcli/targetcli_shell.py", line 313, in main + shell.run_interactive() + ~~~~~~~~~~~~~~~~~~~~~^^ + File "/usr/lib/python3.13/site-packages/configshell/shell.py", line 899, in run_interactive + self._cli_loop() + ~~~~~~~~~~~~~~^^ + File "/usr/lib/python3.13/site-packages/configshell/shell.py", line 728, in _cli_loop + self.run_cmdline(cmdline) + ~~~~~~~~~~~~~~~~^^^^^^^^^ + File "/usr/lib/python3.13/site-packages/configshell/shell.py", line 842, in run_cmdline + self._execute_command(path, command, pparams, kparams) + ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/lib/python3.13/site-packages/configshell/shell.py", line 817, in _execute_command + result = target.execute_command(command, pparams, kparams) + File "/usr/lib/python3.13/site-packages/configshell/node.py", line 1405, in execute_command + return method(*pparams, **kparams) + File "/usr/lib/python3.13/site-packages/targetcli/ui_root.py", line 207, in ui_command_restoreconfig + errors = self.rtsroot.restore_from_file(savefile, clear_existing, + target, storage_object) + File "/usr/lib/python3.13/site-packages/rtslib/root.py", line 490, in restore_from_file + with Path(restore_file).open as f: + ^^^^^^^^^^^^^^^^^^^^^^^ + TypeError: 'method' object does not support the context manager protocol + +Adding empty parenthesis after the "open" fixes the issue. +--- + rtslib/root.py | 4 ++-- + scripts/convert-to-json | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/rtslib/root.py b/rtslib/root.py +index 749a80620e65..b05d380a6c50 100644 +--- a/rtslib/root.py ++++ b/rtslib/root.py +@@ -190,7 +190,7 @@ class RTSRoot(CFSNode): + current = self.dump() + + try: +- with Path(save_file).open as f: ++ with Path(save_file).open() as f: + saveconf = json.loads(f.read()) + except OSError as e: + if e.errno == errno.ENOENT: +@@ -487,7 +487,7 @@ class RTSRoot(CFSNode): + if not restore_file: + restore_file = default_save_file + +- with Path(restore_file).open as f: ++ with Path(restore_file).open() as f: + config = json.loads(f.read()) + return self.restore(config, target, storage_object, + clear_existing=clear_existing, +diff --git a/scripts/convert-to-json b/scripts/convert-to-json +index daa82daf705b..7677350f3040 100755 +--- a/scripts/convert-to-json ++++ b/scripts/convert-to-json +@@ -318,7 +318,7 @@ def parse(txt, cur): + elif txt[cur] == "fabric": + cur = parse_fabric(txt, cur) + +-with Path("/etc/target/scsi_target.lio").open as f: ++with Path("/etc/target/scsi_target.lio").open() as f: + txt = f.read() + txt = split(txt) + cur = parse(txt, 0) +-- +2.43.0 + diff --git a/Install-targetctl-as-an-entrypoint.patch b/Install-targetctl-as-an-entrypoint.patch new file mode 100644 index 0000000..2d3e571 --- /dev/null +++ b/Install-targetctl-as-an-entrypoint.patch @@ -0,0 +1,44 @@ +From 4677e05cf54eab01bde48dcf3ae1488b6a8241b4 Mon Sep 17 00:00:00 2001 +From: Alfred Wingate +Date: Mon, 10 Mar 2025 09:50:53 +0200 +Subject: [PATCH] Install targetctl as an entrypoint + +scripts = ['scripts/targetctl'] didn't survive the transition to hatch, +readd it with required modifications. + +Bug: https://bugs.gentoo.org/950964 +Fixes: 9eea9a306f83b039629350dace0983f65fa9c64f +Signed-off-by: Alfred Wingate +--- + pyproject.toml | 5 ++++- + scripts/targetctl => rtslib/targetctl.py | 0 + 2 files changed, 4 insertions(+), 1 deletion(-) + rename scripts/targetctl => rtslib/targetctl.py (100%) + +diff --git a/pyproject.toml b/pyproject.toml +index c07186aa007c..adebb9f104ea 100644 +--- a/pyproject.toml ++++ b/pyproject.toml +@@ -31,6 +31,9 @@ paths = ["COPYING"] + [project.urls] + Homepage = "http://github.com/open-iscsi/rtslib-fb" + ++[project.scripts] ++targetctl = "rtslib.targetctl:main" ++ + [tool.hatch.version] + source = "vcs" + +@@ -90,4 +93,4 @@ ignore = [ + ] + [tool.ruff.lint.per-file-ignores] + # Magic value used in comparison +-"scripts/targetctl" = ["PLR2004"] ++"rtslib/targetctl.py" = ["PLR2004"] +diff --git a/scripts/targetctl b/rtslib/targetctl.py +similarity index 100% +rename from scripts/targetctl +rename to rtslib/targetctl.py +-- +2.43.0 + diff --git a/Remove-use-of-usr-bin-python.patch b/Remove-use-of-usr-bin-python.patch new file mode 100644 index 0000000..c7494f2 --- /dev/null +++ b/Remove-use-of-usr-bin-python.patch @@ -0,0 +1,26 @@ +From 631685f400d3bd170a449503ce062a82c58d823a Mon Sep 17 00:00:00 2001 +From: Lee Duncan +Date: Mon, 24 Mar 2025 10:00:21 -0700 +Subject: [PATCH] Remove use of /usr/bin/python + +The targetctl.py script was using /usr/bin/python, even +though this package has been ported to python3. + +This makes installing it on modern systems fail. +--- + rtslib/targetctl.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/rtslib/targetctl.py b/rtslib/targetctl.py +index e304be0d2f38..124d03f3c1fb 100755 +--- a/rtslib/targetctl.py ++++ b/rtslib/targetctl.py +@@ -1,4 +1,4 @@ +-#!/usr/bin/python ++#!/usr/bin/python3 + ''' + targetctl + +-- +2.43.0 + diff --git a/_service b/_service index 50ea20e..56d1511 100644 --- a/_service +++ b/_service @@ -3,11 +3,12 @@ git https://github.com/open-iscsi/rtslib-fb.git + yes python-rtslib-fb @PARENT_TAG@ v(\d*\.\d*\.)fb(\d*) \1\2 - v2.1.76 + v2.2.2 enable diff --git a/_servicedata b/_servicedata index fa720bc..8b1097c 100644 --- a/_servicedata +++ b/_servicedata @@ -1,4 +1,4 @@ https://github.com/open-iscsi/rtslib-fb.git - 745d51a46e6718e34c59b728fd96ec08bbf906dc \ No newline at end of file + 139c7770600cd7e367ebc7504b991551c7e67bc4 \ No newline at end of file diff --git a/python-rtslib-fb-v2.1.76.tar.xz b/python-rtslib-fb-v2.1.76.tar.xz deleted file mode 100644 index 969e539..0000000 --- a/python-rtslib-fb-v2.1.76.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b496f1d908600910310a10728df469f00114b4c9d6090e657c212ad672dab1f2 -size 42892 diff --git a/python-rtslib-fb-v2.2.2.tar.xz b/python-rtslib-fb-v2.2.2.tar.xz new file mode 100644 index 0000000..0a1d1f2 --- /dev/null +++ b/python-rtslib-fb-v2.2.2.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1dc96cfe70ac15f6223c09bfb3cc5cfde6fbfc91c6ee1a5130b9995acaa84581 +size 1059224 diff --git a/python-rtslib-fb.changes b/python-rtslib-fb.changes index 879ea8a..6835cf9 100644 --- a/python-rtslib-fb.changes +++ b/python-rtslib-fb.changes @@ -1,3 +1,35 @@ +------------------------------------------------------------------- +Sat Mar 22 15:35:05 UTC 2025 - lduncan@suse.com + +- Update to version v2.2.2: + * Explicitly set build target wheel packages + * Fix the program name in pyproject.toml + * Fix and update pre-commit ruf check + * Add PyPA publish and pre-commit check workflows + * Add rtslib_fb import compability + * Silently ignore OSError on close + * fixup! Fix various issues found by ruff linter rules + * Add ruff rules, pre-commit config + * Convert codebase to pathlib + * Fix various issues found by ruff linter rules + * Refactor code to Python>=3.9 to pass pyupgrade + * Fix issues found by ruff pep8-naming rules + * Fix issues found by ruff pycodestyle rules + * Use f-strings + * Fixing issues found by ruff Pyflakes rules + * Move to PEP-621; Drop -fb from module name + * rtslib: explicitely import "kmod.error" and "kmod.Kmod" + * rtslib/LUN: add some ALUA property + + Also, updated the SPEC file, and removed patch no longer needed, + since the problem is no longer present: + * rtslib-Fix-handling-of-sysfs-RW-attrs-that-are-actually-RO.patch + + Added three commits, one from upstream, the others submitted there: + * Install-targetctl-as-an-entrypoint.patch (added from upstream) + * Remove-use-of-usr-bin-python.patch (submitted upstream) + * Fix-issue-with-Path-open-needs-parenthesis.patch (submitted upstream) + ------------------------------------------------------------------- Mon Jun 17 16:09:09 UTC 2024 - Lee Duncan diff --git a/python-rtslib-fb.spec b/python-rtslib-fb.spec index 28f8636..3639123 100644 --- a/python-rtslib-fb.spec +++ b/python-rtslib-fb.spec @@ -1,7 +1,7 @@ # # spec file for package python-rtslib-fb # -# Copyright (c) 2024 SUSE LLC +# Copyright (c) 2025 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,40 +19,40 @@ %define dbdir %{_sysconfdir}/target %define oldpython python %define cpkg %{oldpython}-rtslib-fb-common -%if 0%{?suse_version} > 1500 -%bcond_without libalternatives -%else -%bcond_with libalternatives -%endif + %{?sle15_python_module_pythons} + Name: python-rtslib-fb -Version: 2.1.76 +Version: 2.2.2 Release: 0%{?dist} Summary: API for Linux kernel SCSI target (aka LIO) License: Apache-2.0 Group: Development/Languages/Python URL: https://github.com/open-iscsi/rtslib-fb.git Source: python-rtslib-fb-v%{version}.tar.xz -Patch2: rtslib-Fix-handling-of-sysfs-RW-attrs-that-are-actually-RO.patch -Patch3: rtslib-target-service-for-suse.patch +Patch1: rtslib-target-service-for-suse.patch +Patch2: Install-targetctl-as-an-entrypoint.patch +Patch3: Remove-use-of-usr-bin-python.patch +Patch4: Fix-issue-with-Path-open-needs-parenthesis.patch +BuildRequires: %{python_module devel} +BuildRequires: %{python_module hatch_vcs} +BuildRequires: %{python_module hatchling} BuildRequires: %{python_module pip} BuildRequires: %{python_module pyudev} BuildRequires: %{python_module setuptools} BuildRequires: %{python_module wheel} BuildRequires: fdupes +BuildRequires: git BuildRequires: python-rpm-macros >= 20210929 +BuildRequires: pkgconfig(systemd) Requires: %{cpkg} Requires: python-pyudev Provides: python-rtslib = %{version}-%{release} Obsoletes: python-rtslib < %{version} BuildArch: noarch -%if %{with libalternatives} -BuildRequires: alts -Requires: alts -%else Requires(post): update-alternatives -Requires(postun):update-alternatives -%endif +Requires(postun): update-alternatives + %python_subpackages %description @@ -61,13 +61,13 @@ SCSI target, present in 3.x Linux kernel versions. rtslib-fb is licensed under the Apache 2.0 license. Contributions are welcome %package -n %{cpkg} -Summary: Common python-rtslib-fb subpackage for Python 2 or 3 +Summary: Common python-rtslib-fb subpackage for all Python 3 versions Group: Development/Languages/Python Obsoletes: %{name} < %{version}-%{release} %description -n %{cpkg} -python-rtslib-fb-common is the invariant base package needed by both -python2-rtslib-fb and python3-rtslib-fb. +python-rtslib-fb-common is the invariant base package needed by all +version of python3*-rtslib-fb. %prep %autosetup -p1 -n python-rtslib-fb-v%{version} @@ -78,7 +78,6 @@ python2-rtslib-fb and python3-rtslib-fb. %install %pyproject_install %python_clone -a %{buildroot}/%{_bindir}/targetctl -%fdupes %{buildroot} install -d -m755 %{buildroot}%{_mandir}/man5 install -m644 doc/saveconfig.json.5 %{buildroot}%{_mandir}/man5 install -d -m755 %{buildroot}%{_mandir}/man8 @@ -89,6 +88,7 @@ install -d -m755 %{buildroot}/%{dbdir}/alua mkdir -p %{buildroot}/%{_unitdir}/ install -m644 systemd/target.service %{buildroot}/%{_unitdir} install -d -m755 %{buildroot}%{_sbindir} +%fdupes %{buildroot} ln -s %{_sbindir}/service %{buildroot}/%{_sbindir}/rctarget %post @@ -101,8 +101,6 @@ ln -s %{_sbindir}/service %{buildroot}/%{_sbindir}/rctarget %pre %{service_add_pre target.service} -# If libalternatives is used: Removing old update-alternatives entries. -%python_libalternatives_reset_alternative targetctl %preun %{stop_on_removal target} @@ -122,9 +120,8 @@ ln -s %{_sbindir}/service %{buildroot}/%{_sbindir}/rctarget %files %{python_files} %python_alternative %{_bindir}/targetctl -%{python_sitelib}/rtslib -%{python_sitelib}/rtslib_fb -%{python_sitelib}/rtslib_fb-%{version}*-info +%{python_sitelib}/rtslib* +%pycache_only %{python_sitelib}/__pycache__ %files -n %{cpkg} %license COPYING diff --git a/rtslib-Fix-handling-of-sysfs-RW-attrs-that-are-actually-RO.patch b/rtslib-Fix-handling-of-sysfs-RW-attrs-that-are-actually-RO.patch deleted file mode 100644 index aa54ee1..0000000 --- a/rtslib-Fix-handling-of-sysfs-RW-attrs-that-are-actually-RO.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 10f23379b2d3e2226782e2d6185bee22cc586170 Mon Sep 17 00:00:00 2001 -From: Lee Duncan -Date: Thu, 15 Oct 2020 14:21:20 -0700 -Subject: [PATCH] Fix handling of sysfs RW attrs that are actually RO - -Kernel commit 356ba2a8bc8d ("scsi: target: tcmu: Make -gr_support and alua_support attributes writable"), made the -alua_support and pgr_support sysfs attributes writable -so that individual target drivers could change them. -This means that the filesystem attributes might saw -read-write, but the attributes can in fact be read-only. -When a user tries to write to them, in this case, -they EINVAL. - -This causes rtslib to throw error messages when one does -a "targetctl restore" like these: - -> Storage Object fileio/file01: Cannot set attribute alua_support: [Errno 22] Invalid argument, skipped -> Storage Object fileio/file01: Cannot set attribute pgr_support: [Errno 22] Invalid argument, skipped - -While these messages are benign, they will cause confusion, since -(1) there's nothing wrong, and (2) they didn't occur before above- -mentioned kernel commit. - -This fix tells rtslib to ignore errno 22 for these two attributes. ---- - rtslib/node.py | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/rtslib/node.py b/rtslib/node.py -index 415f45d675f9..ed08030002bb 100644 ---- a/rtslib/node.py -+++ b/rtslib/node.py -@@ -20,6 +20,7 @@ under the License. - - import os - import stat -+import errno - from .utils import fread, fwrite, RTSLibError, RTSLibNotInCFS - - -@@ -28,6 +29,10 @@ class CFSNode(object): - # Where is the configfs base LIO directory ? - configfs_dir = '/sys/kernel/config/target' - -+ # these two attributes can have file permissions of -+ # read-write but be read-only -+ may_be_ro_attrs = ['alua_support', 'pgr_support'] -+ - # CFSNode private stuff - - def __init__(self): -@@ -172,7 +177,8 @@ class CFSNode(object): - try: - fwrite(path, "%s" % str(value)) - except Exception as e: -- raise RTSLibError("Cannot set attribute %s: %s" % (attribute, e)) -+ if attribute not in self.may_be_ro_attrs or e.errno != errno.EINVAL: -+ raise RTSLibError("Cannot set attribute %s: %s" % (attribute, e)) - - def get_attribute(self, attribute): - ''' --- -2.26.2 - diff --git a/rtslib-target-service-for-suse.patch b/rtslib-target-service-for-suse.patch index 0bfca99..cad5845 100644 --- a/rtslib-target-service-for-suse.patch +++ b/rtslib-target-service-for-suse.patch @@ -1,18 +1,24 @@ +From: Lee Duncan +Date: Sat Mar 22 10:52:22 AM PDT 2025 +Subject: [PATCH] blah + +Blah +--- --- a/systemd/target.service 2019-01-31 11:11:28.517558290 -0800 +++ b/systemd/target.service 2020-10-16 09:34:28.888091013 -0700 -@@ -6,10 +6,13 @@ After=sys-kernel-config.mount network.ta +@@ -6,9 +6,12 @@ After=sys-kernel-config.mount network.ta [Service] Type=oneshot RemainAfterExit=yes -ExecStart=/usr/bin/targetctl restore +-ExecStop=/usr/bin/targetctl clear +Environment=CONFIG_FILE=/etc/target/saveconfig.json +EnvironmentFile=-/etc/sysconfig/target +ExecStart=/usr/bin/targetctl restore $CONFIG_FILE +ExecStop=/usr/bin/targetctl save $CONFIG_FILE - ExecStop=/usr/bin/targetctl clear SyslogIdentifier=target [Install] WantedBy=multi-user.target -- +Alias=targetcli.service +