Files
cyberpanel-dashboard/public/userarea/ajax/fetch_cyberpanel_summary.php
T
2026-05-20 14:01:28 +02:00

225 lines
5.9 KiB
PHP

<?php
ini_set('display_errors', 0);
error_reporting(E_ALL);
header('Content-Type: application/json; charset=utf-8');
require_once __DIR__ . '/../class/db-functions.php';
$db = DBHandlerSelect::getInstance()->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());
}