feat: enhance ServerMonitoring to resolve container names based on protocol and improve client metrics handling
This commit is contained in:
@@ -275,7 +275,7 @@ class ServerMonitoring
|
|||||||
// this->fetchXrayStats() call moved to collectClientMetrics to handle failure gracefully
|
// this->fetchXrayStats() call moved to collectClientMetrics to handle failure gracefully
|
||||||
|
|
||||||
// Get current stats from server
|
// Get current stats from server
|
||||||
$containerName = $this->serverData['container_name'];
|
$containerName = (string) ($this->serverData['container_name'] ?? '');
|
||||||
$bytesReceived = 0;
|
$bytesReceived = 0;
|
||||||
$bytesSent = 0;
|
$bytesSent = 0;
|
||||||
$speedUp = 0;
|
$speedUp = 0;
|
||||||
@@ -356,6 +356,10 @@ class ServerMonitoring
|
|||||||
stripos($protocolSlug, 'wireguard') !== false
|
stripos($protocolSlug, 'wireguard') !== false
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if ($isWireguardClient) {
|
||||||
|
$containerName = $this->resolveContainerForProtocol($protocolSlug);
|
||||||
|
}
|
||||||
|
|
||||||
if ($isAivpnClient) {
|
if ($isAivpnClient) {
|
||||||
$aivpn = $this->getAivpnClientStats($client);
|
$aivpn = $this->getAivpnClientStats($client);
|
||||||
if (is_array($aivpn)) {
|
if (is_array($aivpn)) {
|
||||||
@@ -810,6 +814,41 @@ class ServerMonitoring
|
|||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function resolveContainerForProtocol(string $protocolSlug): string
|
||||||
|
{
|
||||||
|
$default = trim((string) ($this->serverData['container_name'] ?? ''));
|
||||||
|
if ($protocolSlug === '') {
|
||||||
|
return $default;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$db = DB::conn();
|
||||||
|
$stmt = $db->prepare('SELECT definition FROM protocols WHERE slug = ? LIMIT 1');
|
||||||
|
$stmt->execute([$protocolSlug]);
|
||||||
|
$definitionJson = $stmt->fetchColumn();
|
||||||
|
if (is_string($definitionJson) && $definitionJson !== '') {
|
||||||
|
$definition = json_decode($definitionJson, true);
|
||||||
|
if (is_array($definition)) {
|
||||||
|
$candidate = trim((string) ($definition['metadata']['container_name'] ?? ''));
|
||||||
|
if ($candidate !== '') {
|
||||||
|
return $candidate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Throwable $e) {
|
||||||
|
// Fallback to default container.
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($protocolSlug === 'awg2') {
|
||||||
|
return 'amnezia-awg2';
|
||||||
|
}
|
||||||
|
if (stripos($protocolSlug, 'aivpn') !== false) {
|
||||||
|
return 'aivpn-server';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $default;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enforce single IP per user for Xray connections
|
* Enforce single IP per user for Xray connections
|
||||||
* If a user is connected from multiple IPs, block all but the first one
|
* If a user is connected from multiple IPs, block all but the first one
|
||||||
|
|||||||
Reference in New Issue
Block a user