diff --git a/src/webui/internal/handlers/configure_firewall.go b/src/webui/internal/handlers/configure_firewall.go index 21c2ec3f..86f29999 100644 --- a/src/webui/internal/handlers/configure_firewall.go +++ b/src/webui/internal/handlers/configure_firewall.go @@ -4,7 +4,6 @@ package handlers import ( "context" - "errors" "fmt" "html/template" "log" @@ -716,17 +715,15 @@ func (h *ConfigureFirewallHandler) fetchFirewall(ctx context.Context) (*firewall if err == nil { return wrap.Firewall, wrap.Firewall != nil, nil } - var rcErr *restconf.Error - if errors.As(err, &rcErr) && rcErr.StatusCode == http.StatusNotFound { - runErr := h.RC.Get(ctx, "/data/infix-firewall:firewall", &wrap) - if runErr == nil { - return wrap.Firewall, wrap.Firewall != nil, nil - } - var rcRun *restconf.Error - if errors.As(runErr, &rcRun) && rcRun.StatusCode == http.StatusNotFound { - return nil, false, nil - } - return nil, false, runErr + if !restconf.IsNotFound(err) { + return nil, false, err } - return nil, false, err + runErr := h.RC.Get(ctx, "/data/infix-firewall:firewall", &wrap) + if runErr == nil { + return wrap.Firewall, wrap.Firewall != nil, nil + } + if restconf.IsNotFound(runErr) { + return nil, false, nil + } + return nil, false, runErr } diff --git a/src/webui/internal/handlers/configure_keystore.go b/src/webui/internal/handlers/configure_keystore.go index ec1bb5c1..b20be1ff 100644 --- a/src/webui/internal/handlers/configure_keystore.go +++ b/src/webui/internal/handlers/configure_keystore.go @@ -8,7 +8,6 @@ import ( "crypto/x509" "encoding/base64" "encoding/pem" - "errors" "fmt" "html/template" "log" @@ -69,18 +68,12 @@ func (h *ConfigureKeystoreHandler) Overview(w http.ResponseWriter, r *http.Reque var ks keystoreWrapper if err := h.RC.Get(r.Context(), keystorePath, &ks); err != nil { - var rcErr *restconf.Error - if errors.As(err, &rcErr) && rcErr.StatusCode == http.StatusNotFound { - if fallErr := h.RC.Get(r.Context(), "/data/ietf-keystore:keystore", &ks); fallErr != nil { - var rcFall *restconf.Error - if !errors.As(fallErr, &rcFall) || rcFall.StatusCode != http.StatusNotFound { - log.Printf("configure keystore (running fallback): %v", fallErr) - data.Error = "Could not read keystore" - } - } - } else { + if !restconf.IsNotFound(err) { log.Printf("configure keystore: %v", err) data.Error = "Could not read keystore" + } else if fallErr := h.RC.Get(r.Context(), "/data/ietf-keystore:keystore", &ks); fallErr != nil && !restconf.IsNotFound(fallErr) { + log.Printf("configure keystore (running fallback): %v", fallErr) + data.Error = "Could not read keystore" } } diff --git a/src/webui/internal/handlers/configure_routes.go b/src/webui/internal/handlers/configure_routes.go index 0be8b02c..6173a3a2 100644 --- a/src/webui/internal/handlers/configure_routes.go +++ b/src/webui/internal/handlers/configure_routes.go @@ -4,7 +4,6 @@ package handlers import ( "context" - "errors" "fmt" "html/template" "log" @@ -298,17 +297,13 @@ func (h *ConfigureRoutesHandler) fetchStaticCPP(ctx context.Context) (staticCPPW if err == nil { return cpp, nil } - var rcErr *restconf.Error - if errors.As(err, &rcErr) && rcErr.StatusCode == http.StatusNotFound { - runErr := h.RC.Get(ctx, "/data"+staticCPPSuffix, &cpp) - if runErr == nil { - return cpp, nil - } - var rcRun *restconf.Error - if errors.As(runErr, &rcRun) && rcRun.StatusCode == http.StatusNotFound { - return cpp, nil // no static routes configured — not an error - } - return cpp, runErr + if !restconf.IsNotFound(err) { + return cpp, err } - return cpp, err + runErr := h.RC.Get(ctx, "/data"+staticCPPSuffix, &cpp) + if runErr == nil || restconf.IsNotFound(runErr) { + // 404 on fallback = no static routes configured, not an error + return cpp, nil + } + return cpp, runErr } diff --git a/src/webui/internal/handlers/configure_system.go b/src/webui/internal/handlers/configure_system.go index b3582d54..b7fedbd7 100644 --- a/src/webui/internal/handlers/configure_system.go +++ b/src/webui/internal/handlers/configure_system.go @@ -4,7 +4,6 @@ package handlers import ( "encoding/json" - "errors" "html/template" "log" "net/http" @@ -108,19 +107,13 @@ func (h *ConfigureSystemHandler) Overview(w http.ResponseWriter, r *http.Request var raw cfgSystemWrapper if err := h.RC.Get(r.Context(), candidatePath+"/ietf-system:system", &raw); err != nil { - var rcErr *restconf.Error - if errors.As(err, &rcErr) && rcErr.StatusCode == http.StatusNotFound { - // Candidate not initialised — read from running as fallback. - if fallErr := h.RC.Get(r.Context(), "/data/ietf-system:system", &raw); fallErr != nil { - var rcFall *restconf.Error - if !errors.As(fallErr, &rcFall) || rcFall.StatusCode != http.StatusNotFound { - log.Printf("configure system (running fallback): %v", fallErr) - data.Error = "Could not read system configuration" - } - } - } else { + if !restconf.IsNotFound(err) { log.Printf("configure system: %v", err) data.Error = "Could not read candidate configuration" + } else if fallErr := h.RC.Get(r.Context(), "/data/ietf-system:system", &raw); fallErr != nil && !restconf.IsNotFound(fallErr) { + // Candidate not initialised — fall back to running; only real errors surface. + log.Printf("configure system (running fallback): %v", fallErr) + data.Error = "Could not read system configuration" } } if data.Error == "" { diff --git a/src/webui/internal/handlers/firewall.go b/src/webui/internal/handlers/firewall.go index 7a069c21..971574c9 100644 --- a/src/webui/internal/handlers/firewall.go +++ b/src/webui/internal/handlers/firewall.go @@ -3,7 +3,6 @@ package handlers import ( - "errors" "html/template" "log" "net/http" @@ -145,8 +144,7 @@ func (h *FirewallHandler) Overview(w http.ResponseWriter, r *http.Request) { var fw firewallWrapper err := h.RC.Get(r.Context(), "/data/infix-firewall:firewall", &fw) if err != nil { - var rcErr *restconf.Error - if errors.As(err, &rcErr) && rcErr.StatusCode == http.StatusNotFound { + if restconf.IsNotFound(err) { // Firewall module not active — show disabled state, not an error. data.EnabledText = "Inactive" } else { diff --git a/src/webui/templates/fragments/yang-leaf-group.html b/src/webui/templates/fragments/yang-leaf-group.html index 11237016..e02538e4 100644 --- a/src/webui/templates/fragments/yang-leaf-group.html +++ b/src/webui/templates/fragments/yang-leaf-group.html @@ -206,12 +206,7 @@ hx-target="closest tr" hx-swap="delete" hx-confirm="Delete {{$row.InstanceName}}?"> - - - - - + {{template "icon-trash"}} {{end}} diff --git a/src/webui/templates/fragments/yang-list-table.html b/src/webui/templates/fragments/yang-list-table.html index a8232431..70af8a0d 100644 --- a/src/webui/templates/fragments/yang-list-table.html +++ b/src/webui/templates/fragments/yang-list-table.html @@ -33,12 +33,7 @@ hx-target="#yang-detail" hx-swap="innerHTML" hx-confirm="Delete {{$row.InstanceName}}?"> - - - - - + {{template "icon-trash"}} {{end}} diff --git a/src/webui/templates/pages/configure-firewall.html b/src/webui/templates/pages/configure-firewall.html index aba66beb..98d1c19c 100644 --- a/src/webui/templates/pages/configure-firewall.html +++ b/src/webui/templates/pages/configure-firewall.html @@ -135,13 +135,7 @@ hx-confirm="Delete zone {{.Name}}?" hx-swap="none" title="Delete zone"> - - - - - + {{template "icon-trash"}} {{end}} @@ -375,13 +369,7 @@ hx-confirm="Delete policy {{.Name}}?" hx-swap="none" title="Delete policy"> - - - - - + {{template "icon-trash"}} {{end}} diff --git a/src/webui/templates/pages/configure-routes.html b/src/webui/templates/pages/configure-routes.html index a1ab7434..7fd052d1 100644 --- a/src/webui/templates/pages/configure-routes.html +++ b/src/webui/templates/pages/configure-routes.html @@ -51,13 +51,7 @@ hx-confirm="Delete route {{.Prefix}}?" hx-swap="none" title="Delete route"> - - - - - + {{template "icon-trash"}} @@ -152,13 +146,7 @@ hx-confirm="Delete route {{.Prefix}}?" hx-swap="none" title="Delete route"> - - - - - + {{template "icon-trash"}}