feat: comprehensive debug logging across all controller modules
Add detailed [DEBUG] logging to every controller module when logging.level is set to "debug". Each module with stateful debug uses SetDebug(bool) wired from main.go. Covers stacks, backup, cloudflare, integrations, system, monitor, settings, scheduler, web handlers, storage, metrics, API, selfupdate, and assets. Also includes the app export/import (.fab bundles) feature from v0.32.0 and its debug page integration. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -34,6 +34,7 @@ func (r *Router) geoStatus(w http.ResponseWriter, _ *http.Request) {
|
||||
|
||||
func (r *Router) geoUpdateSettings(w http.ResponseWriter, req *http.Request) {
|
||||
limitBody(w, req)
|
||||
r.dbg("geoUpdateSettings: contentLength=%d", req.ContentLength)
|
||||
|
||||
var body struct {
|
||||
Enabled bool `json:"enabled"`
|
||||
|
||||
@@ -59,6 +59,19 @@ type Router struct {
|
||||
|
||||
// App-to-app integration manager (nil if not configured)
|
||||
integrationMgr *integrations.Manager
|
||||
|
||||
debug bool
|
||||
}
|
||||
|
||||
// SetDebug enables or disables debug logging for API routing.
|
||||
func (r *Router) SetDebug(on bool) {
|
||||
r.debug = on
|
||||
}
|
||||
|
||||
func (r *Router) dbg(format string, args ...interface{}) {
|
||||
if r.debug {
|
||||
r.logger.Printf("[DEBUG] [api] "+format, args...)
|
||||
}
|
||||
}
|
||||
|
||||
// SetAssetsSyncer sets the Hub asset syncer for on-demand sync triggers.
|
||||
@@ -92,6 +105,8 @@ func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||
path := strings.TrimPrefix(req.URL.Path, "/api")
|
||||
path = strings.TrimSuffix(path, "/")
|
||||
|
||||
r.dbg("%s %s (path=%s)", req.Method, req.URL.Path, path)
|
||||
|
||||
switch {
|
||||
// GET /api/stacks
|
||||
case path == "/stacks" && req.Method == http.MethodGet:
|
||||
@@ -282,6 +297,7 @@ func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||
r.geoRemoveAppOverride(w, req, extractName(path, "/geo/override"))
|
||||
|
||||
default:
|
||||
r.dbg("no matching route: %s %s", req.Method, path)
|
||||
writeJSON(w, http.StatusNotFound, apiResponse{OK: false, Error: "endpoint not found"})
|
||||
}
|
||||
}
|
||||
@@ -340,6 +356,7 @@ func (r *Router) getDeployFields(w http.ResponseWriter, _ *http.Request, name st
|
||||
func (r *Router) deployStack(w http.ResponseWriter, req *http.Request, name string) {
|
||||
limitBody(w, req)
|
||||
r.logger.Printf("[API] Deploy requested for stack: %s", name)
|
||||
r.dbg("deployStack: name=%s contentLength=%d", name, req.ContentLength)
|
||||
|
||||
var body struct {
|
||||
Values map[string]string `json:"values"`
|
||||
@@ -396,6 +413,7 @@ func (r *Router) deployStack(w http.ResponseWriter, req *http.Request, name stri
|
||||
|
||||
func (r *Router) actionStack(w http.ResponseWriter, action, name string) {
|
||||
r.logger.Printf("[API] %s requested for stack: %s", action, name)
|
||||
r.dbg("actionStack: action=%s name=%s", action, name)
|
||||
|
||||
// Protected stacks only allow restart — block all other actions
|
||||
if r.cfg.IsProtectedStack(name) && action != "restart" {
|
||||
@@ -587,6 +605,7 @@ func (r *Router) removeStack(w http.ResponseWriter, req *http.Request, name stri
|
||||
}
|
||||
limitBody(w, req)
|
||||
r.logger.Printf("[API] Remove requested for stack: %s", name)
|
||||
r.dbg("removeStack: name=%s", name)
|
||||
|
||||
var body struct {
|
||||
RemoveHDDData bool `json:"remove_hdd_data"`
|
||||
@@ -596,6 +615,7 @@ func (r *Router) removeStack(w http.ResponseWriter, req *http.Request, name stri
|
||||
body.RemoveHDDData = false
|
||||
body.RemoveBackups = false
|
||||
}
|
||||
r.dbg("removeStack: name=%s removeHDDData=%v removeBackups=%v", name, body.RemoveHDDData, body.RemoveBackups)
|
||||
|
||||
// Compute backup paths to remove if requested
|
||||
var backupPaths []string
|
||||
@@ -750,12 +770,14 @@ func (r *Router) backupStatus(w http.ResponseWriter, _ *http.Request) {
|
||||
}
|
||||
|
||||
func (r *Router) triggerBackup(w http.ResponseWriter, _ *http.Request) {
|
||||
r.dbg("triggerBackup: backupMgr=%v", r.backupMgr != nil)
|
||||
if r.backupMgr == nil {
|
||||
writeJSON(w, http.StatusBadRequest, apiResponse{OK: false, Error: "Backup not configured"})
|
||||
return
|
||||
}
|
||||
|
||||
if r.backupMgr.IsRunning() {
|
||||
r.dbg("triggerBackup: backup already running, rejecting")
|
||||
writeJSON(w, http.StatusConflict, apiResponse{OK: false, Error: "Mentés már folyamatban"})
|
||||
return
|
||||
}
|
||||
@@ -1130,6 +1152,7 @@ func (r *Router) selfupdateTrigger(w http.ResponseWriter, _ *http.Request) {
|
||||
// --- Config apply handler ---
|
||||
|
||||
func (r *Router) configApply(w http.ResponseWriter, req *http.Request) {
|
||||
r.dbg("configApply: contentLength=%d remoteAddr=%s", req.ContentLength, req.RemoteAddr)
|
||||
// Read YAML body (limit to 1MB)
|
||||
body, err := io.ReadAll(io.LimitReader(req.Body, 1<<20))
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user