false, 'error' => 'IP required']); break; } $check = $pdo->prepare("SELECT id FROM admin.mta_servers WHERE main_ip = ?"); $check->execute([$ip]); if ($check->fetch()) { echo json_encode(['success' => true, 'message' => 'Already registered', 'ip' => $ip]); break; } $providerMap = ['Huawei Cloud'=>1, 'Hetzner'=>3, 'OVH'=>4, 'Vultr'=>5, 'Scaleway'=>2]; $provId = $providerMap[$provider] ?? 0; $stmt = $pdo->prepare("INSERT INTO admin.mta_servers (provider_id, provider_name, status, name, ssh_login_type, ssh_username, ssh_port, old_ssh_port, ssh_connectivity_status, expiration_date, created_by, created_date, host_name, main_ip, ips_count, is_installed) VALUES (?, ?, 'Activated', ?, 'password', 'root', 49222, 49222, 'Not Checked', (NOW() + INTERVAL '30 days')::date, 'n8n-auto', NOW(), ?, ?, 1, false)"); $stmt->execute([$provId, $provider, $name, $hostname ?: 'mail.'.$name.'.com', $ip]); $serverId = $pdo->lastInsertId(); // Auto-créer le VMTA $vmtaName = str_replace('.', '_', $ip); $vmtaDomain = $_POST['domain'] ?? ''; $pdo->prepare("INSERT INTO admin.servers_vmtas (mta_server_id, mta_server_name, status, type, name, ip, domain, created_by, created_date) VALUES (?, ?, 'Activated', 'Default', ?, ?, ?, 'n8n-auto', NOW())")->execute([$serverId, $name, $vmtaName, $ip, $vmtaDomain]); echo json_encode(['success'=>true, 'registered'=>true, 'server_id'=>$serverId, 'ip'=>$ip, 'name'=>$name]); break; case 'provision': // Trigger N8N webhook pour créer un serveur $provider = $_POST['provider'] ?? 'hetzner'; $count = intval($_POST['count'] ?? 1); $region = $_POST['region'] ?? ''; $webhook = 'http://127.0.0.1:5678/webhook/huawei-provision'; $payload = json_encode(['provider'=>$provider, 'count'=>$count, 'region'=>$region]); $ch = curl_init($webhook); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => $payload, CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10 ]); $resp = curl_exec($ch); curl_close($ch); echo json_encode(['success'=>true, 'message'=>"Provisioning $count $provider server(s)", 'n8n_response'=>$resp]); break; case 'stats': $total = $pdo->query("SELECT COUNT(*) FROM admin.mta_servers")->fetchColumn(); $active = $pdo->query("SELECT COUNT(*) FROM admin.mta_servers WHERE status='Activated'")->fetchColumn(); $byProvider = $pdo->query("SELECT provider_name, COUNT(*) as cnt, SUM(CASE WHEN status='Activated' THEN 1 ELSE 0 END) as active FROM admin.mta_servers GROUP BY provider_name")->fetchAll(PDO::FETCH_ASSOC); echo json_encode(['success'=>true, 'total'=>$total, 'active'=>$active, 'by_provider'=>$byProvider]); break; case 'list': $servers = $pdo->query("SELECT id, main_ip, host_name, provider_name, status, name, ssh_connectivity_status, expiration_date FROM admin.mta_servers ORDER BY id DESC LIMIT 50")->fetchAll(PDO::FETCH_ASSOC); echo json_encode(['success'=>true, 'servers'=>$servers]); break; case 'delete': $id = intval($_POST['id'] ?? 0); if ($id > 0) { $pdo->prepare("UPDATE admin.mta_servers SET status='Deleted' WHERE id=?")->execute([$id]); echo json_encode(['success'=>true, 'deleted'=>$id]); } else { echo json_encode(['success'=>false, 'error'=>'ID required']); } break; default: echo json_encode(['success'=>false, 'error'=>'Unknown action', 'available'=>['register','provision','stats','list','delete']]); }