diff --git a/VERSION b/VERSION index d1887a0..1f83700 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1.113 +1.1.114 diff --git a/cmd/edgeguard-api/main.go b/cmd/edgeguard-api/main.go index daefa4a..4050582 100644 --- a/cmd/edgeguard-api/main.go +++ b/cmd/edgeguard-api/main.go @@ -60,7 +60,7 @@ import ( usersvc "git.netcell-it.de/projekte/edgeguard-native/internal/services/users" ) -var version = "1.1.113" +var version = "1.1.114" func main() { addr := os.Getenv("EDGEGUARD_API_ADDR") diff --git a/cmd/edgeguard-ctl/main.go b/cmd/edgeguard-ctl/main.go index c8384b8..b528206 100644 --- a/cmd/edgeguard-ctl/main.go +++ b/cmd/edgeguard-ctl/main.go @@ -11,7 +11,7 @@ import ( "git.netcell-it.de/projekte/edgeguard-native/internal/services/setup" ) -var version = "1.1.113" +var version = "1.1.114" const usage = `edgeguard-ctl — EdgeGuard CLI diff --git a/cmd/edgeguard-scheduler/main.go b/cmd/edgeguard-scheduler/main.go index 8da6e19..9b1c34a 100644 --- a/cmd/edgeguard-scheduler/main.go +++ b/cmd/edgeguard-scheduler/main.go @@ -41,7 +41,7 @@ import ( "git.netcell-it.de/projekte/edgeguard-native/internal/services/tlscerts" ) -var version = "1.1.113" +var version = "1.1.114" const ( // renewTickInterval — how often we re-evaluate expiring certs. diff --git a/management-ui/src/pages/Dashboard/index.tsx b/management-ui/src/pages/Dashboard/index.tsx index 8679f57..42341bb 100644 --- a/management-ui/src/pages/Dashboard/index.tsx +++ b/management-ui/src/pages/Dashboard/index.tsx @@ -6,7 +6,7 @@ import { } from '@ant-design/icons' import { Link } from 'react-router-dom' import { useQuery } from '@tanstack/react-query' -import { useEffect, useRef, useState } from 'react' +import { useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import apiClient, { isEnvelope } from '../../api/client' @@ -201,9 +201,9 @@ export default function DashboardPage() { try { const r = await apiClient.get('/haproxy/stats') if (!isEnvelope(r.data)) return { backends: [] as HAProxyBackend[], frontends: [] as HAProxyFrontend[] } - const d = r.data.data as { backends?: HAProxyBackend[]; frontends?: HAProxyFrontend[] } - return { backends: d.backends ?? [], frontends: d.frontends ?? [] } - } catch { return { backends: [] as HAProxyBackend[], frontends: [] as HAProxyFrontend[] } } + const d = r.data.data as { backends?: HAProxyBackend[]; frontends?: HAProxyFrontend[]; error?: string } + return { backends: d.backends ?? [], frontends: d.frontends ?? [], error: d.error } + } catch { return { backends: [] as HAProxyBackend[], frontends: [] as HAProxyFrontend[], error: undefined } } }, refetchInterval: 10_000, }) @@ -267,6 +267,18 @@ export default function DashboardPage() { const now = Date.now() const maintenanceDomains = (domains.data ?? []).filter(d => d.maintenance_mode) + // eg_backend_ → friendly name lookup for HAProxy stats display. + const backendIdToName = useMemo(() => { + const m = new Map() + for (const b of backends.data ?? []) m.set(b.id, b.name) + return m + }, [backends.data]) + const resolveHAName = (haName: string): string => { + const match = /^eg_backend_(\d+)$/.exec(haName) + const id = match ? Number(match[1]) : null + return id != null ? (backendIdToName.get(id) ?? haName) : haName + } + // Backends die komplett DOWN sind (mind. 1 Server mit echtem Check, // aber kein einziger UP) — liefert friendly Backend-Namen. const downBackends = (() => { @@ -486,13 +498,19 @@ export default function DashboardPage() { )} {(haproxyBackends.data ?? []).length === 0 ? ( - {t('dashboard.haproxyCard.empty')} + haproxyStats.data?.error ? ( + + ⚠ HAProxy socket: {haproxyStats.data.error} + + ) : ( + {t('dashboard.haproxyCard.empty')} + ) ) : ( {(haproxyBackends.data ?? []).map((b, i) => (
- {b.backend}/{b.server} + {resolveHAName(b.backend)}/{b.server}