(int)$db->query('SELECT COUNT(*) FROM licenses')->fetchColumn(), 'licenses_active' => (int)$db->query('SELECT COUNT(*) FROM licenses WHERE revoked_at IS NULL AND download_entitlement_until >= NOW()')->fetchColumn(), 'licenses_expired' => (int)$db->query('SELECT COUNT(*) FROM licenses WHERE revoked_at IS NULL AND download_entitlement_until < NOW()')->fetchColumn(), 'licenses_revoked' => (int)$db->query('SELECT COUNT(*) FROM licenses WHERE revoked_at IS NOT NULL')->fetchColumn(), 'machines_30d' => (int)$db->query('SELECT COUNT(*) FROM license_machines WHERE last_seen >= DATE_SUB(NOW(), INTERVAL 30 DAY)')->fetchColumn(), 'audit_24h' => (int)$db->query('SELECT COUNT(*) FROM audit_log WHERE ts >= DATE_SUB(NOW(), INTERVAL 24 HOUR)')->fetchColumn(), ]; $manifestPath = dirname(__DIR__) . '/manifest/versions.json'; $manifest = is_file($manifestPath) ? json_decode(file_get_contents($manifestPath), true) : null; $buildsDir = dirname(__DIR__) . '/builds'; $zips = is_dir($buildsDir) ? glob("$buildsDir/*.zip") : []; $lastAudit = $db->query('SELECT * FROM audit_log ORDER BY id DESC LIMIT 10')->fetchAll(); Layout::header('Dashboard', 'dashboard'); ?>
= count($manifest['versions'] ?? []) ?> entrée(s) dans le manifest •
= count($zips) ?> ZIP(s) dans builds/ •
signature manifest :
= empty($manifest['signature'])
? "NON SIGNÉ"
: "SIGNÉ Ed25519" ?>
Dernière version annoncée : v= htmlspecialchars($manifest['latest'] ?? '?') ?>
(publiée le = htmlspecialchars(substr($manifest['publishedAt'] ?? '', 0, 10)) ?>)
Aucune activité enregistrée.
| Date | Événement | License | IP |
|---|---|---|---|
| = htmlspecialchars($row['ts']) ?> | = htmlspecialchars($row['event']) ?> | = $row['license_id'] ? '#' . htmlspecialchars((string)$row['license_id']) : '—' ?> | = htmlspecialchars($row['ip'] ?? '—') ?> |