Repository navigation
fix: separate UI customisation from pinning, stop silent config loss - #4
Merged
Merged
Conversation
Found by remediating a real host against these scripts. Each of these either did nothing when it looked like it worked, or quietly discarded something. - update-policy: pinning and the UI customisation are now independent. The APT hook gated on the pinning file, so a host that wanted latest packages got the subscription warnings back with no way to say otherwise. New ui-only and ui-disable commands; the hook gates on the customisation's own marker - update-policy: the served JS lives in a pve-manager-owned directory and is deleted by package updates. A master copy outside dpkg's control means the hook can restore it rather than only logging that it is missing - cleanup: refuse to remove a superseded sysctl file that still sets keys its replacement does not. Classification was by generation, not content, so a file could be removed along with tuning nothing else carried. On a live host that was five keys -- dirty writeback intervals, keepalive probe tuning, an inotify limit. A backup makes that recoverable, not safe - disk-errors: address drives by /dev/disk/by-id and match the udev rule on ID_MODEL. Reverted to the approach in Derek's original incident scripts, which was better than the generated one: kernel names are not stable across reboots, so a boot-time unit keyed on sdX can assert settings against the wrong disk, and a per-serial udev rule leaves a replacement drive of the same model unprotected until someone re-runs this - power-management: hold SATA controllers backing a ZFS pool at max_performance, and reassert it from the boot script. Link power management parks the SATA link between commands and adds wake latency to every I/O, which works against the bounded retry times disk-errors configures. Found live on all four members of the pool carrying every VM. The sysfs policy does not survive a reboot, so setting it once at install time was not enough - optimize: carry the keepalive probe/interval pair and the inotify instance limit, so the baseline is a superset of what it replaces. Deliberately NOT the dirty writeback intervals: holding dirty pages longer is a defensible choice with a UPS and a reckless one without, so it stays an operator decision rather than a default - tests: 121 checks. Cleanup gains coverage for the key-loss guard, driven by the real content of the two files that exposed it
github-actions Bot
added a commit
that referenced
this pull request
Jul 26, 2026
## [2.6.2](v2.6.1...v2.6.2) (2026-07-26) ### Bug Fixes * separate UI customisation from pinning, stop silent config loss ([#4](#4)) ([c85901f](c85901f))
Contributor
|
🎉 This PR is included in version 2.6.2 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Every one of these was found by remediating a real host against these scripts. Each either did nothing while looking like it worked, or quietly discarded something.
Pinning and nag suppression were welded together
The APT hook gated on the pinning file existing:
So a host that wanted latest packages got the subscription warnings back with no way to say otherwise. They are independent concerns -- new
ui-only/ui-disablecommands, and the hook now gates on the customisation's own marker.Verified on nested PVE 9.2.5:
ui-onlyinstalls with 0 pinning entries; deleting the served JS and script tag then runningapt --reinstall pve-managerrestored both withAPT_EXIT=0.The served JS also lives in a pve-manager-owned directory and is deleted by package updates. A master copy outside dpkg's control means the hook restores it rather than only logging that it is gone.
Cleanup could silently drop tuning
It classified superseded sysctl files by generation, not content. Run against the live host:
All five would have gone. A backup makes that recoverable, not safe.
Drive addressing reverted to Derek's original approach
His incident scripts addressed drives by
/dev/disk/by-idand matched the udev rule onID_MODEL. Both were better than what this generated:sdXcan assert SCT ERC against the wrong diskSATA link power management on VM disks
Found live on all four members of the pool carrying every VM (
med_power_with_dipm). ALPM parks the SATA link between commands and adds wake latency to every I/O, working directly against the bounded retry timesdisk-errorsconfigures.The sysfs policy does not survive a reboot, so setting it once at install time was not enough -- it is now reasserted from the generated boot script, ZFS-aware.
Baseline is now a superset
optimizecarries the keepalive probe/interval pair and the inotify instance limit. Deliberately not the dirty writeback intervals: holding dirty pages longer is defensible with a UPS and reckless without, so it stays an operator decision rather than a default.Tests
121 checks, no Proxmox / root / network needed. Cleanup gains coverage for the key-loss guard, driven by the real content of the two files that exposed it.
Not verified