91 lines
4.3 KiB
PHP
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);
|