Files
html/api/wevia-dashboard.php
2026-04-16 02:28:32 +02:00

91 lines
4.3 KiB
PHP

<?php
// WEVIA Master Dashboard — One-call complete status
header("Content-Type: application/json");
header("Access-Control-Allow-Origin: *");
$start = microtime(true);
// System
$disk = (int)trim(shell_exec("df / | awk 'NR==2{print $5}' | tr -d '%'"));
$ram = (int)trim(shell_exec("free | awk '/Mem/{printf(\"%.0f\", $3/$2*100)}'"));
$load = trim(shell_exec("cat /proc/loadavg | cut -d' ' -f1-3"));
$docker = (int)trim(shell_exec("docker ps -q 2>/dev/null | wc -l"));
$uptime = trim(shell_exec("uptime -p"));
// SSL
$ssl_exp = trim(shell_exec("openssl x509 -in /var/www/weval/ssl/fullchain.pem -noout -enddate 2>/dev/null | cut -d= -f2"));
$ssl_days = $ssl_exp ? (int)((strtotime($ssl_exp) - time()) / 86400) : -1;
// Ollama
$ollama = @json_decode(@file_get_contents('http://127.0.0.1:11434/api/tags'), true);
$models = count($ollama['models'] ?? []);
$ollama_gb = round(array_sum(array_map(fn($m) => $m['size'] / (1024**3), $ollama['models'] ?? [])), 1);
// Qdrant
$qdrant = @json_decode(@file_get_contents('http://127.0.0.1:6333/collections'), true);
$vectors = 0;
foreach ($qdrant['result']['collections'] ?? [] as $c) {
$ci = @json_decode(@file_get_contents("http://127.0.0.1:6333/collections/{$c['name']}"), true);
$vectors += $ci['result']['points_count'] ?? 0;
}
// L99 + NonReg
$l99 = @json_decode(@file_get_contents('/var/www/html/api/l99-ux-results.json'), true);
$nr = @json_decode(@file_get_contents('/var/www/html/api/nonreg-latest.json'), true);
$auth = @json_decode(@file_get_contents('/var/www/html/api/l99-auth-results.json'), true);
// Architecture
$arch = @json_decode(@file_get_contents('/var/www/html/api/architecture-index.json'), true);
// Autonomy
$auto = @json_decode(@file_get_contents('/var/www/html/api/wevia-autonomy-status.json'), true);
// Blade
$blade = @json_decode(@file_get_contents('/var/www/html/api/blade-tasks/heartbeat.json'), true);
$blade_pending = count(array_filter(
array_map(fn($f) => @json_decode(file_get_contents($f), true),
glob('/var/www/html/api/blade-tasks/task_*.json')),
fn($t) => ($t['status'] ?? '') === 'pending'
));
// S95 MTA (via Action Engine)
$s95r = @json_decode(@file_get_contents('http://127.0.0.1/api/wevia-action-engine.php?action=s95_status',
false, stream_context_create(['http'=>['timeout'=>5]])), true);
$s95_ports = ($s95r && $s95r['ok']) ? $s95r['ports'] : ['pmta:25'=>false];
// Domains
$domains = [];
foreach (['weval-consulting.com','wevads.weval-consulting.com','monitor.weval-consulting.com',
'ethica.weval-consulting.com','mirofish.weval-consulting.com','auth.weval-consulting.com'] as $d) {
$ch = curl_init("https://$d/"); curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER=>1,CURLOPT_TIMEOUT=>3,CURLOPT_NOBODY=>1,CURLOPT_SSL_VERIFYPEER=>0]);
curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
$domains[$d] = $code > 0 && $code < 500;
}
// Ethica
$c = @pg_connect("host=127.0.0.1 dbname=adx_system user=admin password=admin123");
$ethica = $c ? (int)pg_fetch_result(pg_query($c, "SELECT COUNT(*) FROM ethica.medecins_validated"), 0, 0) : 0;
if ($c) pg_close($c);
$elapsed = round((microtime(true) - $start) * 1000);
echo json_encode([
'ts' => date('c'),
'elapsed_ms' => $elapsed,
'system' => ['disk'=>$disk,'ram'=>$ram,'load'=>$load,'docker'=>$docker,'uptime'=>$uptime],
'ssl' => ['days'=>$ssl_days,'expires'=>$ssl_exp],
'ai' => ['ollama_models'=>$models,'ollama_gb'=>$ollama_gb,'qdrant_vectors'=>$vectors],
'quality' => [
'l99' => ['pass'=>$l99['pass']??0,'fail'=>$l99['fail']??0,'warn'=>$l99['warn']??0,'total'=>($l99['pass']??0)+($l99['fail']??0)+($l99['warn']??0)],
'nonreg' => ['pass'=>$nr['pass']??0,'total'=>$nr['total']??0],
'auth' => ['pass'=>$auth['pass']??0,'fail'=>$auth['fail']??0],
'arch_score' => $arch['recommendations']['score'] ?? 0
],
'mta' => ['ports'=>$s95_ports,'all_up'=>!in_array(false,$s95_ports)],
'domains' => ['list'=>$domains,'all_up'=>!in_array(false,$domains),'count'=>count(array_filter($domains))],
'blade' => ['online'=>!empty($blade['ts']),'ts'=>$blade['ts']??null,'pending'=>$blade_pending],
'ethica' => ['hcp'=>$ethica],
'autonomy' => ['fixes'=>$auto['fixes_count']??0,'alerts'=>$auto['alerts_count']??0,'last_run'=>$auto['timestamp']??null],
'action_engine' => ['routes'=>53,'version'=>'2.0'],
], JSON_PRETTY_PRINT);