fix(fwlog): Live-Log war seit Tagen still tot + Seitengröße wirkungslos
Zwei unabhängige Bugs hinter "Live-Log zeigt Einträge, aber nichts Neues":
1) ulogd2 stirbt beim nächtlichen Logrotate. Der postinst nahm an, ulogd
laufe als root — die Debian-Unit startet aber `ulogd --daemon --uid ulog`.
Beim Start öffnet ulogd die JSONL noch als root und schreibt danach über
den offenen fd weiter, egal wem sie gehört. Nachts schickt das Distro-
Profil /etc/logrotate.d/ulogd2 ein SIGHUP; das Reopen läuft dann als
`ulog` und scheitert an root:edgeguard 0640 ("can't open JSON log file:
Permission denied"). ulogd wertet das als fatal und beendet sich mit
Exit-Code 0 — Restart=on-failure hätte also nicht gegriffen, und ohne
Restart= blieb der Dienst tot (auf utm-1 5 Tage unbemerkt). Die API
servierte derweil weiter ihren In-Memory-Ring von vor der Rotation,
deshalb sah die UI Einträge, aber nie neue.
Fix: Owner ulog (Schreiber) : edgeguard (Leser), logrotate `create`
passend, plus Drop-in Restart=always als Selbstheilung.
2) Seitengröße liess sich nicht umstellen. Die Tabellen übergaben ein
literales `pagination={{ pageSize: N }}`. antd merged via
extendsObject(innerPagination, paginationObj) — der Prop überschreibt
bei jedem Render den State, den der Size-Changer gerade gesetzt hat.
Bei einem Live-Log rendert das im Sekundentakt, der Klick auf 20/100
war also sofort wieder weg. Fix: defaultPageSize (unkontrolliert).
Betraf ausser dem Live-Log auch Logs, Backups-History, Routes,
Alerts und CrowdSec.
Ausserdem: `t` aus den WS-Effect-Deps genommen. i18n wechselt dessen
Identität bei Store-Updates, was den Effect neu laufen liess — inklusive
setEntries([]), d.h. der Live-Puffer leerte sich ohne erkennbaren Grund.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -438,7 +438,7 @@ export default function AlertsPage() {
|
||||
onChange: (keys) => setSelectedIds(keys as number[]),
|
||||
}}
|
||||
rowClassName={(r) => (r.acknowledged_at ? 'eg-row-muted' : '')}
|
||||
pagination={{ pageSize: 25 }}
|
||||
pagination={{ defaultPageSize: 25 }}
|
||||
locale={{ emptyText: (
|
||||
<EmptyState
|
||||
icon={<BellOutlined />}
|
||||
|
||||
@@ -350,7 +350,7 @@ export default function HistoryTab() {
|
||||
loading={list.isFetching}
|
||||
dataSource={list.data ?? []}
|
||||
columns={columns}
|
||||
pagination={{ pageSize: 25, showSizeChanger: true, pageSizeOptions: [25, 50, 100] }}
|
||||
pagination={{ defaultPageSize: 25, showSizeChanger: true, pageSizeOptions: [25, 50, 100] }}
|
||||
locale={{ emptyText: t('backups.empty') }}
|
||||
/>
|
||||
|
||||
|
||||
@@ -225,7 +225,7 @@ function DecisionsTab() {
|
||||
loading={isLoading}
|
||||
dataSource={decisions ?? []}
|
||||
columns={columns}
|
||||
pagination={{ pageSize: 20 }}
|
||||
pagination={{ defaultPageSize: 20 }}
|
||||
/>
|
||||
<Modal
|
||||
title={t('cs.decision.banModal')}
|
||||
@@ -321,7 +321,7 @@ function AlertsTab() {
|
||||
loading={isLoading}
|
||||
dataSource={alerts ?? []}
|
||||
columns={columns}
|
||||
pagination={{ pageSize: 20 }}
|
||||
pagination={{ defaultPageSize: 20 }}
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
@@ -379,7 +379,7 @@ function BouncersTab() {
|
||||
loading={isLoading}
|
||||
dataSource={bouncers ?? []}
|
||||
columns={columns}
|
||||
pagination={{ pageSize: 20 }}
|
||||
pagination={{ defaultPageSize: 20 }}
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
@@ -436,7 +436,7 @@ function MachinesTab() {
|
||||
loading={isLoading}
|
||||
dataSource={machines ?? []}
|
||||
columns={columns}
|
||||
pagination={{ pageSize: 20 }}
|
||||
pagination={{ defaultPageSize: 20 }}
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
@@ -515,7 +515,7 @@ function CollectionsTab() {
|
||||
loading={isLoading}
|
||||
dataSource={collections ?? []}
|
||||
columns={columns}
|
||||
pagination={{ pageSize: 50 }}
|
||||
pagination={{ defaultPageSize: 50 }}
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
|
||||
@@ -129,6 +129,12 @@ export default function FirewallLivePage() {
|
||||
pausedRef.current = paused
|
||||
const pendingDuringPauseRef = useRef<Entry[]>([])
|
||||
const wsRef = useRef<WebSocket | null>(null)
|
||||
// tRef statt `t` in den WS-Effect-Deps: `t` wechselt bei jedem
|
||||
// i18n-Store-Update die Identität. Stünde es in den Deps, würde der
|
||||
// Effect neu laufen — inkl. `setEntries([])` und WS-Reconnect, d. h.
|
||||
// der Live-Puffer wäre ohne erkennbaren Grund plötzlich leer.
|
||||
const tRef = useRef(t)
|
||||
useEffect(() => { tRef.current = t }, [t])
|
||||
|
||||
useEffect(() => {
|
||||
const t = setTimeout(() => setAppliedFilters(filters), 300)
|
||||
@@ -187,7 +193,7 @@ export default function FirewallLivePage() {
|
||||
if (!cancelled && active) scheduleReconnect()
|
||||
}
|
||||
ws.onerror = () => {
|
||||
setError(t('fwlog.connError'))
|
||||
setError(tRef.current('fwlog.connError'))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -204,7 +210,7 @@ export default function FirewallLivePage() {
|
||||
if (reconnectTimer) clearTimeout(reconnectTimer)
|
||||
if (wsRef.current) { wsRef.current.close(); wsRef.current = null }
|
||||
}
|
||||
}, [active, query, t])
|
||||
}, [active, query])
|
||||
|
||||
// Resume: gebufferte Events in die Tabelle mergen.
|
||||
useEffect(() => {
|
||||
@@ -412,7 +418,7 @@ export default function FirewallLivePage() {
|
||||
size="small"
|
||||
dataSource={[...entries].reverse()}
|
||||
columns={columns}
|
||||
pagination={{ pageSize: 50, showSizeChanger: true, pageSizeOptions: [25, 50, 100, 200] }}
|
||||
pagination={{ defaultPageSize: 50, showSizeChanger: true, pageSizeOptions: [25, 50, 100, 200] }}
|
||||
locale={{ emptyText: connected ? t('fwlog.empty') : t('fwlog.connecting') }}
|
||||
/>
|
||||
</>
|
||||
|
||||
@@ -293,7 +293,7 @@ export default function LogsPage() {
|
||||
loading={logsQuery.isFetching}
|
||||
dataSource={entries}
|
||||
columns={columns}
|
||||
pagination={{ pageSize: 50, showSizeChanger: true, pageSizeOptions: [25, 50, 100, 200] }}
|
||||
pagination={{ defaultPageSize: 50, showSizeChanger: true, pageSizeOptions: [25, 50, 100, 200] }}
|
||||
/>
|
||||
|
||||
{entries.length === 0 && !logsQuery.isFetching && (
|
||||
|
||||
@@ -228,7 +228,7 @@ export default function RoutesTab() {
|
||||
size="small"
|
||||
dataSource={live.data ?? []}
|
||||
columns={liveColumns}
|
||||
pagination={{ pageSize: 25, showSizeChanger: true, pageSizeOptions: [25, 50, 100] }}
|
||||
pagination={{ defaultPageSize: 25, showSizeChanger: true, pageSizeOptions: [25, 50, 100] }}
|
||||
locale={{ emptyText: t('routes.liveEmpty') }}
|
||||
style={{ marginTop: 12 }}
|
||||
/>
|
||||
|
||||
Reference in New Issue
Block a user