mirror of
https://github.com/lrnselfreliance/wrolpi.git
synced 2026-10-26 19:01:39 -04:00
A WROLPi drive can move between hosts and across deployment styles (Portable, RPi, Debian). /etc/fstab is host-specific and on the Portable image it's part of a read-only squashfs, so persisting secondary mounts there was both wrong-host and lost-on-reboot. This change makes /media/wrolpi/config/fstab.yaml the single source of truth for WROLPi- managed mounts and introduces a new wrolpi-mounts.service that reconciles live state to match. Architecture: - The Controller writes intent (fstab.yaml) but never calls mount(8) or umount(8) itself. Every mutation triggers `systemctl restart wrolpi-mounts.service`; the Controller then verifies the outcome via the same MountExecutor abstraction the service uses. - wrolpi-mounts.service runs a thin entry point that constructs a real Reconciler with a SubprocessMountExecutor and calls apply(). The reconciler mounts what's in fstab.yaml but missing from the live state, and unmounts paths it previously claimed that are no longer in fstab.yaml. A managed-set file in /run/wrolpi-mounts/managed prevents the reconciler from ever touching user-mounted paths it didn't own. - One-time migration (marker-gated) lifts both /etc/fstab WROLPi entries and any controller.yaml drives.mounts entries into fstab.yaml. /etc/fstab is backed up to /etc/fstab.wrolpi-migration.backup; migrated lines are commented in place with a "migrated to fstab.yaml:" prefix so a host admin can hand-recover. Test approach: dependency injection in place of patching. The MountExecutor protocol has SubprocessMountExecutor (production) and FakeMountExecutor (in-memory, records calls). The Reconciler accepts an executor in its constructor, so the 20 reconciler tests + 13 migration tests + 18 fstab_yaml tests use real files in tmp_path with zero mock.patch calls. test_disks_api.py drops to mocks only for the host-touching read helpers; the mount/unmount paths now run the real Reconciler against the fake executor. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| motd | ||
| 50x.html | ||
| 90-wrolpi | ||
| Caddyfile | ||
| Caddyfile.onboarding | ||
| controller-logo.png | ||
| controller.desktop | ||
| gnome-disks.desktop | ||
| wrolpi-api-dev.service | ||
| wrolpi-api.service | ||
| wrolpi-app-dev.service | ||
| wrolpi-app.service | ||
| wrolpi-cert-renew.service | ||
| wrolpi-cert-renew.timer | ||
| wrolpi-controller.service | ||
| wrolpi-first-startup.service | ||
| wrolpi-fix-media-permissions.service | ||
| wrolpi-help-files.desktop | ||
| wrolpi-help.desktop | ||
| wrolpi-help.service | ||
| wrolpi-kiwix.service | ||
| wrolpi-mounts.service | ||
| wrolpi-repair.service | ||
| wrolpi-upgrade.service | ||
| wrolpi.desktop | ||
| wrolpi.target | ||