Files
wevads-platform/cron/zombie-killer.php
2026-02-26 04:53:11 +01:00

105 lines
3.6 KiB
PHP

<?php
/**
* Zombie Server Killer
* Vérifie la connectivité des serveurs MTA et marque les zombies
* Exécuté toutes les 10 minutes via cron
*/
$logFile = '/var/log/wevads/zombie-killer.log';
$log = function($msg) use ($logFile) {
$time = date('Y-m-d H:i:s');
file_put_contents($logFile, "[$time] $msg\n", FILE_APPEND);
echo "[$time] $msg\n";
};
try {
$pdo = new PDO("pgsql:host=localhost;dbname=adx_system", "admin", "admin123");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Set search_path
$pdo->exec("SET search_path TO admin, public");
$log("=== Zombie Killer Started ===");
// 1. Récupérer les serveurs actifs
$servers = $pdo->query("
SELECT id, name, main_ip, ssh_port
FROM mta_servers
WHERE status = 'Activated'
")->fetchAll(PDO::FETCH_ASSOC);
$log("Serveurs actifs à vérifier: " . count($servers));
$zombies = [];
$alive = [];
foreach ($servers as $server) {
$ip = $server['main_ip'];
$port = $server['ssh_port'] ?: 22;
// Test de connectivité (timeout 3 secondes)
$connection = @fsockopen($ip, $port, $errno, $errstr, 3);
if ($connection) {
fclose($connection);
$alive[] = $server['name'];
$log("{$server['name']} ($ip:$port) - ALIVE");
} else {
$zombies[] = $server;
$log("{$server['name']} ($ip:$port) - ZOMBIE (no response)");
}
}
// 2. Marquer les zombies comme Deleted
if (!empty($zombies)) {
$ids = array_column($zombies, 'id');
$placeholders = implode(',', $ids);
$pdo->exec("UPDATE mta_servers SET status = 'Deleted' WHERE id IN ($placeholders)");
$zombieNames = array_column($zombies, 'name');
$log("🗑️ " . count($zombies) . " serveurs zombies marqués Deleted: " . implode(', ', $zombieNames));
// 3. Vérifier si on doit déclencher une création automatique
$activeCount = $pdo->query("SELECT COUNT(*) FROM mta_servers WHERE status = 'Activated'")->fetchColumn();
$minServers = 3;
if ($activeCount < $minServers) {
$needed = $minServers - $activeCount;
$log("⚠️ Seulement $activeCount serveurs actifs. Besoin de $needed nouveaux serveurs.");
// Déclencher n8n webhook pour création automatique
$webhookUrl = 'http://localhost:5678/webhook/huawei-create-server';
$payload = json_encode([
'action' => 'create_servers',
'count' => $needed,
'reason' => 'zombie_replacement',
'triggered_at' => date('Y-m-d H:i:s')
]);
$ch = curl_init($webhookUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
$result = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode == 200) {
$log("🚀 n8n webhook déclenché pour créer $needed serveurs");
} else {
$log("⚠️ n8n webhook failed (HTTP $httpCode)");
}
}
} else {
$log("✅ Aucun zombie détecté. " . count($alive) . " serveurs en ligne.");
}
$log("=== Zombie Killer Finished ===\n");
} catch (Exception $e) {
$log("❌ ERROR: " . $e->getMessage());
}