105 lines
3.6 KiB
PHP
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());
|
|
}
|