controller v0.269.0: whole restore from the second drive; crash loops stopped; exact image digests; steps judged by their own .felhom.yml (decisions 26-28, R-661 R-666 R-667 R-668 R-664 R-665 R-662, 09 6.4 part 6)
gates / gates (push) Successful in 27s

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-09-24 12:18:39 +02:00
parent 7c3b3a9694
commit 3c6b49b31c
141 changed files with 3401 additions and 237 deletions
+15
View File
@@ -1,6 +1,8 @@
package stacks
import (
"gitea.dooplex.hu/admin/felhom-controller/internal/util"
"bufio"
"context"
"fmt"
@@ -171,6 +173,19 @@ type HDDDataResponse struct {
Stack string `json:"stack"`
HDDPaths []HDDPath `json:"hdd_paths"`
HasHDDData bool `json:"has_hdd_data"`
// KeepDataOnly (v0.269.0, `09` §3 decision 27, R-666): the app is held and its page says support is
// informed — the remove dialog offers only "remove the app, keep my data", and the API refuses the rest.
KeepDataOnly bool `json:"keep_data_only,omitempty"`
}
// ErrRemoveKeepDataWhileSupport is the refusal of a data-deleting remove while support is informed.
var ErrRemoveKeepDataWhileSupport = util.MsgError("err.stacks.remove_keep_data_while_support")
// RemoveKeepsDataOnly reports decision 27's condition for one app: held, and the hold names no whole
// copy (the page says support is informed).
func (m *Manager) RemoveKeepsDataOnly(name string) bool {
st, ok := m.GetStack(name)
return ok && st.HoldReason != "" && st.HoldNoWholeCopy
}
// HDDPath represents a single HDD bind mount path and its status.