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"}}