import { html, PageHeader, definePage, getModel, renderGuard, ServiceStatus, StatCard } from '/static/hoover/index.js?v=8'; export default definePage({ init() { return { status: getModel('status'), }; }, render(state) { const guard = renderGuard(state.status, 'Dashboard', 'System overview', state.status.data); if (guard) return guard; const d = state.status.data; const fwZones = (d.firewall?.zones) || {}; const net = d.net || {}; const nCount = Object.keys(net).length; const upI = Object.values(net).filter(i => i.state === 'up'); const upC = upI.length; const certs = d.certs || []; const certW = certs.filter(c => c.expired || c.days_remaining <= 30); const dmsk = d.dnsmasq?.status || {}; const wP = (d.wg || {}).peers || []; const stats = html`
<${StatCard} label="Active Zones" value=${Object.keys(fwZones).length} meta=${Object.keys(fwZones).join(', ') || 'None'} /> <${StatCard} label="Interfaces Up" value=${upC + '/' + nCount} meta=${upI.map(i => i.name).join(', ') || 'None up'} /> <${StatCard} label="WireGuard" value=${String((d.wg?.status?.up) ? 'up' : 'down')} meta=${wP.length + ' peers'} /> <${StatCard} label="Certificates" value=${certs.length} meta=${certW.length + ' expiring/expired'} />
`; const services = html`
Services
  • <${ServiceStatus} state=${dmsk.service_active ? 'up' : 'down'} label="Dnsmasq" />
  • <${ServiceStatus} state=${(d.wg?.status?.up) ? 'up' : 'down'} label="WireGuard" />
`; return [ PageHeader({ title: 'Dashboard', subtitle: 'System overview' }), stats, services, ]; }, });