feat: add CRL health status schema and UI (PR 3 of 6)
All checks were successful
CI Pipeline / Rust Format Check (push) Successful in 5s
CI Pipeline / Clippy Lints (push) Successful in 52s
CI Pipeline / Rust Unit Tests (push) Successful in 1m8s
CI Pipeline / Security Audit (push) Successful in 5s
CI Pipeline / Frontend Lint & Type Check (push) Successful in 15s
CI Pipeline / Build .deb & Release (push) Has been skipped
All checks were successful
CI Pipeline / Rust Format Check (push) Successful in 5s
CI Pipeline / Clippy Lints (push) Successful in 52s
CI Pipeline / Rust Unit Tests (push) Successful in 1m8s
CI Pipeline / Security Audit (push) Successful in 5s
CI Pipeline / Frontend Lint & Type Check (push) Successful in 15s
CI Pipeline / Build .deb & Release (push) Has been skipped
* feat: add CRL health status schema and UI (PR 3 of 6) * fix(lint): strict equality for crl_age_seconds --------- Co-authored-by: Draco Lunaris <331325+Draco-Lunaris@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
5aec9e629c
commit
ea8337b944
@ -46,6 +46,9 @@ import {
|
||||
Schedule as ScheduleIcon,
|
||||
VpnKey as VpnKeyIcon,
|
||||
ContentCopy as CopyIcon,
|
||||
VerifiedUser as VerifiedUserIcon,
|
||||
Security as SecurityIcon,
|
||||
WarningAmber as WarningAmberIcon,
|
||||
} from '@mui/icons-material'
|
||||
import { apiClient, hostsApi, maintenanceWindowsApi, healthChecksApi, certsApi } from '../api/client'
|
||||
import { useAuthStore } from '../store/authStore'
|
||||
@ -1035,6 +1038,53 @@ export default function HostDetailPage() {
|
||||
</Grid>
|
||||
</Paper>
|
||||
|
||||
{/* ── CRL Status ─────────────────────────────────────────────────── */}
|
||||
<Paper sx={{ p: 3, mb: 3 }}>
|
||||
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 2 }}>
|
||||
<VerifiedUserIcon color="primary" />
|
||||
<Typography variant="h6" fontWeight={600}>CRL Status</Typography>
|
||||
</Box>
|
||||
<Divider sx={{ mb: 2 }} />
|
||||
{host?.crl_status === undefined || host?.crl_status === null ? (
|
||||
<Alert severity="info">
|
||||
CRL status not available (agent version does not support CRL)
|
||||
</Alert>
|
||||
) : (
|
||||
<Grid container spacing={2}>
|
||||
<Grid size={{ xs: 12, sm: 4 }}>
|
||||
<Typography variant="caption" color="text.secondary" display="block">Status</Typography>
|
||||
{host.crl_status === 'valid' ? (
|
||||
<Chip icon={<VerifiedUserIcon />} label="Valid" color="success" size="small" />
|
||||
) : host.crl_status === 'expired' ? (
|
||||
<Chip icon={<WarningAmberIcon />} label="Expired" color="warning" size="small" />
|
||||
) : host.crl_status === 'missing' ? (
|
||||
<Chip icon={<WarningAmberIcon />} label="Missing" color="warning" size="small" />
|
||||
) : host.crl_status === 'invalid' ? (
|
||||
<Chip icon={<SecurityIcon />} label="Invalid" color="error" size="small" />
|
||||
) : (
|
||||
<Typography variant="body2">{String(host.crl_status)}</Typography>
|
||||
)}
|
||||
</Grid>
|
||||
<Grid size={{ xs: 12, sm: 4 }}>
|
||||
<Typography variant="caption" color="text.secondary" display="block">CRL Age</Typography>
|
||||
<Typography variant="body2">
|
||||
{host.crl_age_seconds !== null
|
||||
? (() => { const s = Number(host.crl_age_seconds); return s < 3600 ? `${Math.round(s / 60)} minutes ago` : s < 86400 ? `${Math.round(s / 3600)} hours ago` : `${Math.round(s / 86400)} days ago`; })()
|
||||
: '—'}
|
||||
</Typography>
|
||||
</Grid>
|
||||
<Grid size={{ xs: 12, sm: 4 }}>
|
||||
<Typography variant="caption" color="text.secondary" display="block">Next Update</Typography>
|
||||
<Typography variant="body2">
|
||||
{host.crl_next_update
|
||||
? new Date(host.crl_next_update as string).toLocaleString()
|
||||
: '—'}
|
||||
</Typography>
|
||||
</Grid>
|
||||
</Grid>
|
||||
)}
|
||||
</Paper>
|
||||
|
||||
{/* ── Maintenance Windows ──────────────────────────────────────────── */}
|
||||
<Paper sx={{ p: 3, mb: 3 }}>
|
||||
<Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', mb: 2 }}>
|
||||
|
||||
Reference in New Issue
Block a user