1, CURLOPT_POST=>1, CURLOPT_POSTFIELDS=>json_encode(["message"=>$msg]), CURLOPT_HTTPHEADER=>["Content-Type: application/json"], CURLOPT_TIMEOUT=>20, CURLOPT_SSL_VERIFYPEER=>0]); $r = json_decode(curl_exec($ch), true); return $r["content"] ?? $r["response"] ?? "ERR"; } $r = []; // 1. Reconciliation $rc = master("reconciliation"); $r["reconcile"] = (strpos($rc,"153/153")!==false||strpos($rc,"WAVE")!==false) ? "OK" : substr($rc,0,40); // 2. NonReg $nrc = master("nonreg run"); $r["nonreg"] = substr($nrc, 0, 30); // 3. L99 $nr = json_decode(@file_get_contents("/var/www/html/api/l99-state.json"), true); $r["l99"] = ($nr["pass"]??0) . "/" . ($nr["total"]??0); // 4. Infra $r["docker"] = intval(trim(shell_exec("docker ps -q|wc -l"))); $r["disk"] = intval(trim(shell_exec("df / --output=pcent|tail -1|tr -d ' %'"))); $r["hubs"] = intval(trim(shell_exec("ls /var/www/html/*-hub.html 2>/dev/null|wc -l"))); // 5. Git auto-push $dirty = intval(trim(shell_exec("cd /var/www/html && git status --porcelain|wc -l"))); $r["dirty"] = $dirty; if ($dirty > 0) { shell_exec("cd /var/www/html && git add -A && git commit -m 'supervisor-".date("Hi")."' 2>/dev/null"); shell_exec("cd /var/www/html && git push origin main 2>/dev/null && git push github main 2>/dev/null"); $r["pushed"] = true; } // 6. Auto-heal $alerts = []; if ($r["disk"] > 88) { shell_exec("find /tmp -name 'playwright*' -mmin +30 -exec rm -rf {} + 2>/dev/null"); $alerts[] = "DISK_CLEAN"; } if ($r["docker"] < 15) { master("auto heal"); $alerts[] = "DOCKER_HEAL"; } $r["alerts"] = $alerts ?: ["CLEAR"]; // Log + state $line = "$ts | L99:{$r['l99']} | NR:{$r['nonreg']} | D:{$r['docker']} | disk:{$r['disk']}% | hubs:{$r['hubs']} | " . implode(",", $r["alerts"]); file_put_contents($log, $line . "\n", FILE_APPEND); file_put_contents("/var/www/html/api/supervisor-state.json", json_encode(["ts"=>$ts,"r"=>$r], JSON_PRETTY_PRINT)); echo $line;