fixed speedtest action

This commit is contained in:
2025-12-09 08:21:12 +01:00
parent ceda4feab1
commit 40c986534b
2 changed files with 94 additions and 112 deletions

View File

@@ -54,18 +54,21 @@ class RadiusController extends mfBaseController {
if (!$deviceId) self::sendError("Device ID is required");
$acs = $this->getGenieACS();
// Set speedtest parameters on the device
$acs->setParameterValues($deviceId, [
'InternetGatewayDevice.X_AVM-DE_SpeedtestServer.UDP.Start' => 1,
'InternetGatewayDevice.X_AVM-DE_SpeedtestServer.UDP.StartBidirect' => 1,
'InternetGatewayDevice.X_AVM-DE_SpeedtestServer.UDP.WANAccess' => true
]);
// Get device and extract IP
$device = $acs->getDevice($deviceId);
$ip = GenieACS::getExternalIP($device);
if (!$ip) self::sendError("Could not determine device IP");
// Trigger speedtest via external API
$url = "http://acs.xinon.at:5000/run-speedtest";
$apiKey = "2H9zWrgxPEJL9MZ1yTGtWh16cPCu0AsQ";
$data = json_encode(['ip' => $ip]);
@@ -85,9 +88,7 @@ class RadiusController extends mfBaseController {
if ($response === false) self::sendError("Failed to connect to speedtest server");
header("Content-Type: application/json");
echo $response;
die();
self::returnJson(['success' => true, 'message' => 'Speedtest started']);
} catch (Exception $e) {
$this->log->debug("Speedtest Error", ['error' => $e->getMessage()]);
self::sendError("Error running speedtest: " . $e->getMessage());
@@ -103,15 +104,77 @@ class RadiusController extends mfBaseController {
if (!$deviceId) self::sendError("Device ID is required");
$acs = $this->getGenieACS();
$value = $acs->getSpeedtestResult($deviceId);
self::returnJson(['success' => true, 'value' => $value]);
// Request parameter refresh
$acs->getParameterValues($deviceId, ['InternetGatewayDevice.X_AVM-DE_SpeedtestServer.UDP.Result']);
// Get device info with full data
$device = $acs->getDevice($deviceId);
if (!$device) self::sendError("Device not found");
// Extract speedtest result parameter
$paramName = 'InternetGatewayDevice.X_AVM-DE_SpeedtestServer.UDP.Result';
$rawValue = null;
if (isset($device[$paramName]) && isset($device[$paramName]['value'][0])) {
$rawValue = $device[$paramName]['value'][0];
}
if (!$rawValue || !is_string($rawValue) || !str_contains($rawValue, 'BPS')) {
self::returnJson(['success' => true, 'result' => null]);
return;
}
// Parse the result string (format: "BPS 12345678 Bytes 9876543 Packets 1234")
$parsed = $this->parseSpeedtestResult($rawValue);
self::returnJson(['success' => true, 'result' => $parsed]);
} catch (Exception $e) {
$this->log->debug("Speedtest Result Error", ['error' => $e->getMessage()]);
self::sendError($e->getMessage());
}
}
private function parseSpeedtestResult($raw) {
try {
preg_match('/BPS\s+(\d+)/', $raw, $bpsMatch);
preg_match('/Bytes\s+(\d+)/', $raw, $bytesMatch);
preg_match('/Packets\s+(\d+)/', $raw, $packetsMatch);
if (!$bpsMatch) return null;
$bps = (int)$bpsMatch[1];
$bytes = $bytesMatch ? (int)$bytesMatch[1] : 0;
$packets = $packetsMatch ? (int)$packetsMatch[1] : 0;
return [
'raw' => $raw,
'bps' => $bps,
'bpsFormatted' => $this->formatBits($bps),
'bytes' => $bytes,
'bytesFormatted' => $this->formatBytes($bytes),
'packets' => $packets
];
} catch (Exception $e) {
$this->log->debug("Error parsing speedtest result", ['error' => $e->getMessage()]);
return null;
}
}
private function formatBits($bps) {
if (!$bps) return '0 Mbit/s';
$mbits = $bps / 1000000;
return number_format($mbits, 2, ',', '.') . ' Mbit/s';
}
private function formatBytes($bytes) {
if ($bytes == 0) return '0 B';
$units = ['B', 'KB', 'MB', 'GB', 'TB'];
$i = floor(log($bytes) / log(1024));
return number_format($bytes / pow(1024, $i), 2, ',', '.') . ' ' . $units[$i];
}
private function getGenieACS() {
$host = defined('GENIEACS_HOST') ? GENIEACS_HOST : 'http://acs.xinon.at:3000';
$username = defined('GENIEACS_USERNAME') ? GENIEACS_USERNAME : 'admin';