controller v0.92.0: NAS network storage Part A2 (registry + UI + per-share health)

Controller-side of NAS network storage, proxying to agent A1 /netstorage/*. Distinct
'network' storage kind (no drive lifecycle); add/list/remove + per-share health UI;
unreachable NAS is a recoverable warning, never the drive missing/stop cascade; SMB
creds pass through to the agent, never persisted.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HxLA1mZurFq9kt8hneFeCs
This commit is contained in:
2026-06-30 14:40:47 +02:00
parent 9391f4ea71
commit 364dc50794
13 changed files with 837 additions and 1 deletions
+7
View File
@@ -212,6 +212,13 @@ func planDriveGates(paths []settings.StoragePath, disks []agentapi.DiskInfo) []g
if sp.Decommissioned {
continue
}
// NAS network storage is NOT a drive — the agent never lists it in /disks, so the drive-absent gate
// would falsely see it "absent" (present[sp.Path]==false) and STOP its apps. A NAS blip is
// recoverable (the agent's per-share liveness → a warning badge), never the drive stop-cascade.
// Skip network paths here entirely (Scenario C: unreachable ≠ missing).
if sp.IsNetwork() {
continue
}
// ONLY gate EXTERNAL drives — those registered under the stable parent /mnt/felhom-drives/<name>.
// Internal SSD / system paths (e.g. /mnt/sys_drive/felhom-data) are always-present locals the agent
// never reports as drives; gating them on "absence" would falsely stop/block their apps. (Legacy