Fix five quality findings from second re-review

sitecustomize.py: when find_spec resolves real_spec as None (module absent
after a TrueNAS update), record a FAIL status and mark the module done so
hook_status.json is still written and cmd_verify shows a diagnostic FAIL
instead of the ambiguous "no status file found".

sitecustomize.py: the AttributeError fallback in the URL-fix wrapper now
writes a WARNING to stderr before returning the unmodified result, making
the unexpected ResticConfig type visible in journalctl.

apply.sh: after falling back to bare python3, verify that python3 can also
import middlewared; if not, emit a second warning so the operator knows the
backend patch may be installed in the wrong site-packages directory.

patch_ui.py: abort (return without writing) when FIND.subn produces a count
other than 1, instead of committing a doubly-patched bundle and having
subsequent runs silently accept it via the MARKER check.

uninstall.sh: when a vendor sitecustomize.py backup exists, use mv to
atomically overwrite our file rather than rm-then-mv; eliminates the window
where a read-only /usr causes rm to fail under set -e, aborting before the
backup is restored.
This commit is contained in:
2026-06-15 04:07:16 +00:00
parent 8829fbb9d4
commit cc43b2831d
5 changed files with 27 additions and 6 deletions
+15 -1
View File
@@ -60,7 +60,13 @@ class _Finder:
self._loading.discard(fullname)
if real_spec is None:
return None # module doesn't exist; don't intercept
# Module absent in this Python installation (e.g. removed in a
# TrueNAS update). Record a FAIL so hook_status.json is still
# written and cmd_verify gives a diagnostic instead of "no file".
_record_status(fullname, ok=False,
detail="module not found in this Python installation")
self._mark_done(fullname)
return None
return importlib.machinery.ModuleSpec(
fullname,
@@ -185,6 +191,10 @@ def _patch_restic(module):
try:
return result._replace(cmd=cmd)
except AttributeError:
sys.stderr.write(
"[truecloud-patch] WARNING: cannot fix repo URL; "
f"unexpected ResticConfig type {type(result).__name__!r}\n"
)
return result
break
if i and cmd[i - 1] in ("-r", "--repo", "--repository"):
@@ -197,6 +207,10 @@ def _patch_restic(module):
try:
return result._replace(cmd=cmd)
except AttributeError:
sys.stderr.write(
"[truecloud-patch] WARNING: cannot fix repo URL; "
f"unexpected ResticConfig type {type(result).__name__!r}\n"
)
return result
break
return result