diff --git a/public/userarea/ajax/fetch_cyberpanel_summary.php b/public/userarea/ajax/fetch_cyberpanel_summary.php index 504b465..a391b08 100644 --- a/public/userarea/ajax/fetch_cyberpanel_summary.php +++ b/public/userarea/ajax/fetch_cyberpanel_summary.php @@ -59,7 +59,9 @@ function callCyberPanelApi(string $panelUrl, string $endpoint, string $username, $payload = [ 'adminUser' => $username, - 'adminPass' => $password + 'adminPass' => $password, + 'username' => $username, + 'password' => $password ]; $ch = curl_init(); @@ -165,7 +167,27 @@ try { $versionResult = callCyberPanelApi($panelUrl, 'cyberPanelVersion', $username, $password); $packagesResult = callCyberPanelApi($panelUrl, 'listPackage', $username, $password); + if ( + !$versionResult['success'] && + !$packagesResult['success'] + ) { + $failUpdate = $db->prepare(" + UPDATE cyberpanel_servers + SET + last_status = 'offline', + last_check = NOW() + WHERE id = :id + "); + $failUpdate->execute([ + ':id' => $serverId + ]); + + jsonResponse(false, 'CyberPanel API authentication failed.', [ + 'version_response' => $versionResult, + 'packages_response' => $packagesResult + ]); + } $version = '-'; $packagesCount = 0; diff --git a/public/userarea/ajax/sync_cyberpanel_websites.php b/public/userarea/ajax/sync_cyberpanel_websites.php new file mode 100644 index 0000000..5e2e34d --- /dev/null +++ b/public/userarea/ajax/sync_cyberpanel_websites.php @@ -0,0 +1,452 @@ +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 readCookieFromJar(string $cookieFile, string $cookieName): string +{ + if (!file_exists($cookieFile)) { + return ''; + } + + $lines = file($cookieFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + + foreach ($lines as $line) { + if (strpos($line, '#') === 0) { + continue; + } + + $parts = preg_split('/\s+/', $line); + + if (count($parts) >= 7 && $parts[5] === $cookieName) { + return $parts[6]; + } + } + + return ''; +} + +function cyberpanelGet(string $url, string $cookieFile): array +{ + $ch = curl_init(); + + curl_setopt_array($ch, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HEADER => false, + CURLOPT_COOKIEJAR => $cookieFile, + CURLOPT_COOKIEFILE => $cookieFile, + CURLOPT_TIMEOUT => 30, + CURLOPT_CONNECTTIMEOUT => 15, + CURLOPT_SSL_VERIFYHOST => false, + CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_USERAGENT => 'Mozilla/5.0 CyberPanelDashboard' + ]); + + $response = curl_exec($ch); + $curlError = curl_error($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + + curl_close($ch); + + return [ + 'http_code' => $httpCode, + 'curl_error' => $curlError, + 'raw' => $response + ]; +} + +function cyberpanelPostJson(string $url, array $payload, string $cookieFile, string $csrfToken, string $referer): array +{ + $headers = [ + 'Content-Type: application/json', + 'Accept: application/json', + 'X-Csrftoken: ' . $csrfToken, + 'Referer: ' . $referer + ]; + + $ch = curl_init(); + + curl_setopt_array($ch, [ + CURLOPT_URL => $url, + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => json_encode($payload), + CURLOPT_HTTPHEADER => $headers, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HEADER => false, + CURLOPT_COOKIEJAR => $cookieFile, + CURLOPT_COOKIEFILE => $cookieFile, + CURLOPT_TIMEOUT => 30, + CURLOPT_CONNECTTIMEOUT => 15, + CURLOPT_SSL_VERIFYHOST => false, + CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_USERAGENT => 'Mozilla/5.0 CyberPanelDashboard' + ]); + + $response = curl_exec($ch); + $curlError = curl_error($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + + curl_close($ch); + + $json = json_decode((string)$response, true); + + return [ + 'http_code' => $httpCode, + 'curl_error' => $curlError, + 'raw' => $response, + 'json' => is_array($json) ? $json : null + ]; +} + +function normalizeWebsiteItems(array $fetchJson): array +{ + $items = []; + + if (isset($fetchJson['data'])) { + if (is_string($fetchJson['data'])) { + $decodedData = json_decode($fetchJson['data'], true); + if (is_array($decodedData)) { + $items = $decodedData; + } + } elseif (is_array($fetchJson['data'])) { + $items = $fetchJson['data']; + } + } elseif (isset($fetchJson['websites']) && is_array($fetchJson['websites'])) { + $items = $fetchJson['websites']; + } elseif (isset($fetchJson['records']) && is_array($fetchJson['records'])) { + $items = $fetchJson['records']; + } + + $websites = []; + + foreach ($items as $item) { + if (!is_array($item)) { + continue; + } + + $domain = $item['domain'] ?? $item['domainName'] ?? $item['website'] ?? $item['name'] ?? ''; + $owner = $item['admin'] ?? $item['owner'] ?? $item['user'] ?? $item['websiteOwner'] ?? ''; + $ownerUsername = $item['owner_username'] ?? $item['ownerUsername'] ?? $item['username'] ?? $owner ?? ''; + $package = $item['package'] ?? $item['packageName'] ?? ''; + $phpVersion = $item['php_version'] ?? $item['phpVersion'] ?? $item['php'] ?? ''; + $sslStatus = $item['ssl']['status'] ?? $item['ssl_status'] ?? $item['sslStatus'] ?? 'unknown'; + $diskUsage = $item['diskUsed'] ?? $item['disk_usage'] ?? $item['diskUsage'] ?? ''; + $status = $item['status'] ?? $item['state'] ?? 'unknown'; + + if ($domain === '') { + foreach ($item as $value) { + if (is_string($value) && preg_match('/^[a-z0-9.-]+\.[a-z]{2,}$/i', trim($value))) { + $domain = trim($value); + break; + } + } + } + + if ($domain !== '') { + $websites[] = [ + 'domain' => $domain, + 'owner' => $owner, + 'owner_username' => $ownerUsername, + 'package' => $package, + 'php_version' => $phpVersion, + 'ssl_status' => $sslStatus, + 'disk_usage' => $diskUsage, + 'status' => strtolower(trim((string)$status)), + 'php_version' => trim((string)$phpVersion), + 'ssl_status' => strtolower(trim((string)$sslStatus)), + 'disk_usage' => trim((string)$diskUsage), + 'raw' => $item + ]; + } + } + + return $websites; +} + +try { + $serverId = isset($_POST['server_id']) ? (int)$_POST['server_id'] : 0; + + if ($serverId <= 0) { + jsonResponse(false, 'Missing server ID.'); + } + + $stmt = $db->prepare(" + SELECT + id, + 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 disabled for this server.'); + } + + $panelUrl = rtrim($server['panel_url'], '/'); + $username = $server['username']; + $password = decryptCyberpanelPassword($server['password_encrypted']); + + if ($password === '') { + jsonResponse(false, 'Password cannot be decrypted.'); + } + + $cookieFile = tempnam(sys_get_temp_dir(), 'cyberpanel_cookie_'); + + /* + * Step 1: open CyberPanel first to obtain csrftoken cookie. + */ + $initialGet = cyberpanelGet($panelUrl . '/', $cookieFile); + + if ($initialGet['curl_error'] !== '') { + @unlink($cookieFile); + jsonResponse(false, 'CyberPanel initial GET failed: ' . $initialGet['curl_error']); + } + + $csrfToken = readCookieFromJar($cookieFile, 'csrftoken'); + + if ($csrfToken === '') { + @unlink($cookieFile); + jsonResponse(false, 'CSRF token not found from CyberPanel.', [ + 'http_code' => $initialGet['http_code'], + 'raw_preview' => substr(strip_tags((string)$initialGet['raw']), 0, 1000) + ]); + } + + /* + * Step 2: login with csrf token. + */ + $login = cyberpanelPostJson( + $panelUrl . '/verifyLogin', + [ + 'username' => $username, + 'password' => $password, + 'languageSelection' => 'english' + ], + $cookieFile, + $csrfToken, + $panelUrl . '/' + ); + + if ($login['curl_error'] !== '') { + @unlink($cookieFile); + jsonResponse(false, 'CyberPanel login cURL error: ' . $login['curl_error']); + } + + if (!$login['json']) { + @unlink($cookieFile); + jsonResponse(false, 'CyberPanel login did not return JSON.', [ + 'http_code' => $login['http_code'], + 'raw_preview' => substr(strip_tags((string)$login['raw']), 0, 1000) + ]); + } + + $loginOk = false; + + if (isset($login['json']['loginStatus']) && $login['json']['loginStatus']) { + $loginOk = true; + } + + if (isset($login['json']['status']) && (int)$login['json']['status'] === 1) { + $loginOk = true; + } + + if (!$loginOk) { + @unlink($cookieFile); + jsonResponse(false, 'CyberPanel login failed.', [ + 'login_response' => $login['json'] + ]); + } + + /* + * Step 3: after login, read sessionid and fetch websites. + */ + + + $csrfTokenAfterLogin = readCookieFromJar($cookieFile, 'csrftoken'); + + if ($csrfTokenAfterLogin !== '') { + $csrfToken = $csrfTokenAfterLogin; + } + + $fetch = cyberpanelPostJson( + $panelUrl . '/websites/fetchWebsitesList', + [ + 'page' => 1, + 'recordsToShow' => 1000 + ], + $cookieFile, + $csrfToken, + $panelUrl . '/websites/listWebsites' + ); + + @unlink($cookieFile); + + if ($fetch['curl_error'] !== '') { + jsonResponse(false, 'fetchWebsitesList cURL error: ' . $fetch['curl_error']); + } + + if (!$fetch['json']) { + jsonResponse(false, 'fetchWebsitesList did not return JSON.', [ + 'http_code' => $fetch['http_code'], + 'raw_preview' => substr(strip_tags((string)$fetch['raw']), 0, 1000) + ]); + } + + if ( + isset($fetch['json']['error_message']) && + stripos($fetch['json']['error_message'], 'session') !== false + ) { + jsonResponse(false, 'CyberPanel session not accepted.', [ + 'fetch_response' => $fetch['json'] + ]); + } + + $websites = normalizeWebsiteItems($fetch['json']); + + $upsert = $db->prepare(" + INSERT INTO cyberpanel_websites + ( + server_id, + domain, + website_owner, + owner_username, + package_name, + php_version, + ssl_status, + website_status, + disk_usage, + raw_json, + last_sync + ) + VALUES + ( + :server_id, + :domain, + :website_owner, + :owner_username, + :package_name, + :php_version, + :ssl_status, + :website_status, + :disk_usage, + :raw_json, + NOW() + ) + ON DUPLICATE KEY UPDATE + website_owner = VALUES(website_owner), + owner_username = VALUES(owner_username), + package_name = VALUES(package_name), + php_version = VALUES(php_version), + ssl_status = VALUES(ssl_status), + website_status = VALUES(website_status), + disk_usage = VALUES(disk_usage), + raw_json = VALUES(raw_json), + last_sync = NOW() +"); + + $inserted = 0; + + $inserted = 0; + + foreach ($websites as $website) { + $upsert->execute([ + ':server_id' => $serverId, + ':domain' => $website['domain'], + ':website_owner' => $website['owner'], + ':owner_username' => $website['owner_username'] ?: null, + ':package_name' => $website['package'] ?: null, + ':php_version' => $website['php_version'] ?: null, + ':ssl_status' => $website['ssl_status'] ?: 'unknown', + ':website_status' => $website['status'] ?: 'unknown', + ':disk_usage' => $website['disk_usage'] ?: null, + ':raw_json' => json_encode($website['raw'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) + ]); + + $inserted++; + } + + $update = $db->prepare(" + UPDATE cyberpanel_servers + SET + last_status = 'online', + last_check = NOW() + WHERE id = :server_id + "); + + $update->execute([ + ':server_id' => $serverId + ]); + + jsonResponse(true, 'Websites synced successfully.', [ + 'count' => $inserted, + 'websites' => $websites, + 'raw_response' => $fetch['json'] + ]); +} catch (Throwable $e) { + jsonResponse(false, 'Sync websites error: ' . $e->getMessage()); +} diff --git a/public/userarea/ajax/test_cyberpanel_websites.php b/public/userarea/ajax/test_cyberpanel_websites.php new file mode 100644 index 0000000..511fe93 --- /dev/null +++ b/public/userarea/ajax/test_cyberpanel_websites.php @@ -0,0 +1,163 @@ +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 callCyberPanel(string $panelUrl, string $endpoint, string $username, string $password, array $payload = []): array +{ + $url = rtrim($panelUrl, '/') . '/' . ltrim($endpoint, '/'); + + $payload = array_merge([ + 'adminUser' => $username, + 'adminPass' => $password + ], $payload); + + $ch = curl_init(); + + curl_setopt_array($ch, [ + CURLOPT_URL => $url, + 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); + + $json = json_decode($response, true); + + return [ + 'endpoint' => $endpoint, + 'url' => $url, + 'http_code' => $httpCode, + 'curl_error' => $curlError, + 'is_json' => is_array($json), + 'json' => $json, + 'raw_preview' => substr(strip_tags((string)$response), 0, 700) + ]; +} + +try { + $serverId = isset($_POST['server_id']) ? (int)$_POST['server_id'] : 0; + + if ($serverId <= 0) { + jsonResponse(false, 'Missing server ID.'); + } + + $stmt = $db->prepare(" + SELECT + id, + panel_url, + username, + password_encrypted + 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.'); + } + + $password = decryptCyberpanelPassword($server['password_encrypted']); + + if ($password === '') { + jsonResponse(false, 'Password cannot be decrypted.'); + } + + $tests = []; + + $tests[] = callCyberPanel( + $server['panel_url'], + 'websites/fetchWebsitesList', + $server['username'], + $password + ); + + $tests[] = callCyberPanel( + $server['panel_url'], + 'websites/listWebsites', + $server['username'], + $password + ); + + $tests[] = callCyberPanel( + $server['panel_url'], + 'api/listWebsites', + $server['username'], + $password + ); + + jsonResponse(true, 'Website API test completed.', [ + 'tests' => $tests + ]); +} catch (Throwable $e) { + jsonResponse(false, 'Website API test error: ' . $e->getMessage()); +} diff --git a/public/userarea/import_dashboard.php b/public/userarea/import_dashboard.php index 163b7f9..db55082 100644 --- a/public/userarea/import_dashboard.php +++ b/public/userarea/import_dashboard.php @@ -102,38 +102,7 @@ color: #fff; } - .server-card { - border: 1px solid #edf0f4; - border-radius: 16px; - padding: 18px; - background: #fff; - height: 100%; - transition: all 0.2s ease; - } - .server-card:hover { - transform: translateY(-2px); - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.06); - } - - .server-main { - display: flex; - justify-content: space-between; - gap: 12px; - margin-bottom: 14px; - } - - .server-name { - font-weight: 700; - font-size: 17px; - margin-bottom: 4px; - } - - .server-url { - color: #6c757d; - font-size: 13px; - word-break: break-all; - } .status-badge { display: inline-flex; @@ -185,20 +154,7 @@ font-size: 15px; } - .server-actions { - display: flex; - flex-wrap: wrap; - gap: 8px; - margin-top: 14px; - } - .server-actions .btn { - border-radius: 9px; - font-size: 13px; - display: inline-flex; - align-items: center; - gap: 6px; - } .domain-table th { font-size: 13px; @@ -282,6 +238,150 @@ align-items: flex-start; } } + + .server-card { + border: 1px solid #e8edf3; + border-radius: 18px; + padding: 20px; + background: linear-gradient(180deg, #ffffff 0%, #fbfcfe 100%); + height: 100%; + transition: all 0.22s ease; + box-shadow: 0 6px 18px rgba(16, 24, 40, 0.04); + position: relative; + overflow: hidden; + } + + .server-card::before { + content: ""; + position: absolute; + inset: 0 0 auto 0; + height: 4px; + background: linear-gradient(90deg, #0d6efd 0%, #6ea8fe 100%); + opacity: 0.9; + } + + .server-card:hover { + transform: translateY(-4px); + box-shadow: 0 16px 36px rgba(16, 24, 40, 0.08); + border-color: #d8e2f0; + } + + .server-main { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: 14px; + margin-bottom: 16px; + } + + .server-name { + font-weight: 700; + font-size: 18px; + line-height: 1.2; + margin-bottom: 6px; + color: #0f172a; + } + + .server-url { + color: #64748b; + font-size: 13px; + word-break: break-all; + line-height: 1.45; + } + + .server-meta-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 10px; + margin-bottom: 16px; + } + + .server-meta-item { + background: #f8fafc; + border: 1px solid #eef2f7; + border-radius: 12px; + padding: 10px 12px; + } + + .server-meta-label { + font-size: 11px; + text-transform: uppercase; + letter-spacing: 0.04em; + color: #64748b; + margin-bottom: 4px; + font-weight: 600; + } + + .server-meta-value { + font-size: 14px; + font-weight: 700; + color: #0f172a; + line-height: 1.3; + word-break: break-word; + } + + .metric-row { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 12px; + margin: 16px 0; + } + + .metric-box { + border-radius: 14px; + background: #f8fafc; + border: 1px solid #eef2f7; + padding: 14px 12px; + text-align: left; + } + + .metric-label { + font-size: 11px; + text-transform: uppercase; + letter-spacing: 0.04em; + color: #64748b; + margin-bottom: 6px; + font-weight: 600; + } + + .metric-value { + font-weight: 700; + font-size: 18px; + color: #0f172a; + line-height: 1.2; + } + + .server-footer { + display: flex; + justify-content: space-between; + align-items: center; + gap: 12px; + margin-top: 14px; + padding-top: 14px; + border-top: 1px dashed #e2e8f0; + } + + .server-lastcheck { + font-size: 12px; + color: #64748b; + } + + .server-actions { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-top: 16px; + } + + .server-actions .btn { + border-radius: 10px; + font-size: 13px; + display: inline-flex; + align-items: center; + gap: 6px; + padding: 8px 12px; + font-weight: 600; + } @@ -303,21 +403,24 @@ $servers = []; $sql = " - SELECT - id, - name, - provider, - ip_address, - panel_url, - username, - api_enabled, - environment, - notes, - last_check, - last_status - FROM cyberpanel_servers - ORDER BY name ASC -"; + SELECT + id, + name, + provider, + ip_address, + panel_url, + username, + api_enabled, + environment, + notes, + last_check, + last_status, + cyberpanel_version, + packages_count, + websites_count + FROM cyberpanel_servers + ORDER BY name ASC + "; $stmt = $db->query($sql); @@ -339,9 +442,11 @@ 'cpu' => 0, 'ram' => 0, 'disk' => 0, - 'websites' => 0, + 'websites' => (int)($row['websites_count'] ?? 0), + 'packages_count' => (int)($row['packages_count'] ?? 0), 'databases' => 0, - 'ssl_expiring' => 0, + 'sslexpiring' => 0, + 'cyberpanel_version' => $row['cyberpanel_version'] ?? '-', 'last_check' => $row['last_check'] ?: '-' ]; } @@ -377,6 +482,34 @@ } } + $websites = []; + + $stmtWebsites = $db->query(" + SELECT + w.id, + w.server_id, + w.domain, + w.website_owner, + w.owner_username, + w.package_name, + w.php_version, + w.ssl_status, + w.disk_usage, + w.website_status, + w.last_sync, + s.name AS server_name, + s.panel_url + FROM cyberpanel_websites w + LEFT JOIN cyberpanel_servers s ON s.id = w.server_id + ORDER BY s.name ASC, w.domain ASC + "); + + if ($stmtWebsites) { + while ($rowWebsite = $stmtWebsites->fetch(PDO::FETCH_ASSOC)) { + $websites[] = $rowWebsite; + } + } + $domains = [ [ 'domain' => 'yogasoul.it', @@ -577,87 +710,76 @@ -
-
- Provider -
+
+
+
Provider
+
-
- IP -
+
+
IP Address
+
-
- Env -
+
+
Environment
+
-
CPU
-
%
-
-
-
+
CyberPanel
+
-
RAM
-
%
-
-
-
+
Packages
+
-
Disk
-
%
-
-
-
+
Websites
+
-
-
- Websites -
+
-
+ +
+
+ +
+
+
+
Domains / Websites
+

Theoretical list of websites detected from all CyberPanel servers.

+
+ +
-
-
-
-
Domains / Websites
-

Theoretical list of websites detected from all CyberPanel servers.

-
+
+ + + + + + + + + + + + + + + - - - -
-
DomainServerOwnerPackagePHPSSLDiskStatusLast SyncActions
- + + - - - - - - - + - - - - + + - + + + + + + + - - - + + + + + +
DomainServerPHPSSLDiskStatusActions + No websites synced yet. +
- + - - PHP + + + + - - + + -
- - Open Panel - - - - - -
+ + Open Site +
+
+
+ +
+
+
+
+
Verify Connection
+

Test API credentials and check if the CyberPanel instance is reachable.

+ +
+
+ +
+
+
List Websites
+

Retrieve all websites configured on the selected CyberPanel server.

+ +
+
+ +
+
+
List Databases
+

Retrieve databases and database users created in CyberPanel.

+ +
+
+ +
+
+
SSL Status
+

Check SSL status and detect domains with certificates close to expiration.

+ +
+
+ +
+
+
Create Website
+

Create a new website on the selected CyberPanel server.

+ +
+
+ +
+
+
Backup Website
+

Launch a backup operation for a selected website or database.

+ +
+
+ +
+
+
Email Accounts
+

Read or manage email accounts configured on a specific domain.

+ +
+
+ +
+
+
Raw API Call
+

Send a manual API command for debugging and advanced operations.

+ +
+
+
+
+ +
+
+
+
API Logs
+

Temporary theoretical log area. Later it will read from a database table or log files.

+
+ + +
+ +
+ [2026-05-20 09:42:11] INFO Checking API connection: OVH VPS 1 + [2026-05-20 09:42:12] OK verifyConn returned success + [2026-05-20 09:42:14] INFO Loading websites from CyberPanel + [2026-05-20 09:42:15] OK 8 websites detected + [2026-05-20 09:42:20] WARN villadonatella.com SSL will expire soon + [2026-05-20 09:43:02] ERROR Test Server API disabled or unreachable +
+
+ +
+
+
+ +
+ + + + + + -