getConnection(); function jsonResponse(bool $success, string $message, array $extra = []): void { echo json_encode(array_merge([ 'success' => $success, 'message' => $message ], $extra)); exit; } function getCyberpanelEncryptionKey(): string { return hash('sha256', 'CHANGE_THIS_SECRET_KEY_FOR_CYBERPANEL_DASHBOARD'); } function decryptCyberpanelPassword(string $encryptedPassword): string { if ($encryptedPassword === '') { return ''; } $key = getCyberpanelEncryptionKey(); $decoded = base64_decode($encryptedPassword); if (!$decoded || strpos($decoded, '::') === false) { return ''; } [$ivBase64, $encrypted] = explode('::', $decoded, 2); $iv = base64_decode($ivBase64); if (!$iv) { return ''; } $decrypted = openssl_decrypt( $encrypted, 'AES-256-CBC', $key, 0, $iv ); return $decrypted ?: ''; } function callCyberPanelApi(string $panelUrl, string $endpoint, string $username, string $password): array { $apiUrl = rtrim($panelUrl, '/') . '/api/' . ltrim($endpoint, '/'); $payload = [ 'adminUser' => $username, 'adminPass' => $password ]; $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $apiUrl, CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($payload), CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'Accept: application/json' ], CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 25, CURLOPT_CONNECTTIMEOUT => 15, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_SSL_VERIFYPEER => false ]); $response = curl_exec($ch); $curlError = curl_error($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($response === false || $curlError !== '') { return [ 'success' => false, 'endpoint' => $endpoint, 'url' => $apiUrl, 'http_code' => $httpCode, 'error' => $curlError, 'data' => null ]; } $decoded = json_decode($response, true); if (!is_array($decoded)) { return [ 'success' => false, 'endpoint' => $endpoint, 'url' => $apiUrl, 'http_code' => $httpCode, 'error' => 'Invalid JSON response', 'raw' => substr(strip_tags($response), 0, 500), 'data' => null ]; } return [ 'success' => true, 'endpoint' => $endpoint, 'url' => $apiUrl, 'http_code' => $httpCode, 'error' => null, 'data' => $decoded ]; } try { $serverId = isset($_POST['server_id']) ? (int)$_POST['server_id'] : 0; if ($serverId <= 0) { jsonResponse(false, 'Missing server ID.'); } $stmt = $db->prepare(" SELECT id, name, panel_url, username, password_encrypted, api_enabled FROM cyberpanel_servers WHERE id = :id LIMIT 1 "); $stmt->execute([ ':id' => $serverId ]); $server = $stmt->fetch(PDO::FETCH_ASSOC); if (!$server) { jsonResponse(false, 'Server not found.'); } if ((int)$server['api_enabled'] !== 1) { jsonResponse(false, 'API is disabled for this server.'); } $password = decryptCyberpanelPassword($server['password_encrypted']); if ($password === '') { jsonResponse(false, 'Saved password is empty or cannot be decrypted.'); } $panelUrl = $server['panel_url']; $username = $server['username']; $versionResult = callCyberPanelApi($panelUrl, 'cyberPanelVersion', $username, $password); $packagesResult = callCyberPanelApi($panelUrl, 'listPackage', $username, $password); $version = '-'; $packagesCount = 0; if ($versionResult['success']) { $versionData = $versionResult['data']; if (isset($versionData['version'])) { $version = (string)$versionData['version']; } elseif (isset($versionData['currentVersion'])) { $version = (string)$versionData['currentVersion']; } elseif (isset($versionData['cyberPanelVersion'])) { $version = (string)$versionData['cyberPanelVersion']; } else { $version = json_encode($versionData); } } if ($packagesResult['success']) { $packageData = $packagesResult['data']; if (isset($packageData['data']) && is_array($packageData['data'])) { $packagesCount = count($packageData['data']); } elseif (isset($packageData['packages']) && is_array($packageData['packages'])) { $packagesCount = count($packageData['packages']); } elseif (isset($packageData['listPackages']) && is_array($packageData['listPackages'])) { $packagesCount = count($packageData['listPackages']); } else { $packagesCount = 0; } } $update = $db->prepare(" UPDATE cyberpanel_servers SET last_status = 'online', last_check = NOW(), cyberpanel_version = :cyberpanel_version, packages_count = :packages_count WHERE id = :id "); $update->execute([ ':cyberpanel_version' => $version, ':packages_count' => $packagesCount, ':id' => $serverId ]); jsonResponse(true, 'CyberPanel data loaded successfully.', [ 'version' => $version, 'packages_count' => $packagesCount, 'version_response' => $versionResult, 'packages_response' => $packagesResult ]); } catch (Throwable $e) { jsonResponse(false, 'CyberPanel summary error: ' . $e->getMessage()); }