Das geht per REST API. Alle mobilen Geräte und alle aktiven Desktop-Clients zählen. Der jeweilige Benutzer lässt sich durch den Namen des Telefons auslesen.
Anbei ein einfaches PHP 8 Skript ohne externe Abhängigkeiten, welches alle aktiven Lizenzen abruft. Enthalten keine Fehlerbehandlung bei falschem Auth-Token oder unerwartetem Response vom API-Server. Auch keine formatierte Ausgabe, sondern ein einfaches var_dump.
Weitere Fallstricke: Wenn mehrere Benutzer den exakt gleichen Vor- und Nachnamen haben. Hier fehlt in der API die Angabe des Benutzernamens (damit direkt ein Feature-Request). Den könnte man aber über eine weitere Abfrage holen oder mit dem Hash arbeiten, den die device-state API ausgibt. Man müsste dann eben nur den Status für alle Geräte abfragen und nicht nur die Desktop Clients.
Meine OOP pascom Bibliothek berücksichtigt den Fall, dass es mehrere Benutzer mit dem gleichen Namen gibt. Ich werde vermutlich im Q4 2022 ein Repository in GitHub veröffentlichen. Die Bibliothek kann dann per composer installiert werden.
<?php
// Pascom cloud config
$instanceName = ''; // Your instance name "instance-name"
$authToken = ''; // Your auth token "Basic xyz="
// Pascom cloud rest API base URL
$baseUrl = 'https://pascom.cloud/' . $instanceName . '/services';
// Function to request data as json from pascom API
function pascom_request_data(string $requestUrl, string $authToken): array
{
$requestHeaders = [
'Authorization:' . $authToken,
'Accept: application/json',
'Content-Type: application/json',
'Cache-Control: no-cache',
'User-Agent: Pascom-Rest-Client',
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $requestUrl);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $requestHeaders);
$response = curl_exec($ch);
curl_close($ch);
if (! $response) {
throw new ErrorException('Could not fetch device list from API.');
}
return json_decode($response, true);
}
// Function to extract username from device
function pascom_extract_username(string $deviceName): string
{
$matches = [];
preg_match('/\[(.*)\]/u', $deviceName, $matches);
$userName = $matches[1] ?? null;
if (! $userName) {
throw new ErrorException('Could not find the user\'s name.');
}
return $userName;
}
// Request and parse device API data
$requestUrl = $baseUrl . '/device';
$responseData = pascom_request_data($requestUrl, $authToken);
$activeLicenses = [];
$desktopDeviceNames = [];
foreach ($responseData as $deviceItem) {
$deviceName = $deviceItem['010dev_bez'];
if (str_starts_with($deviceName, 'mobile')) {
$userName = pascom_extract_username($deviceName);
$activeLicenses[] = $userName;
} elseif (str_starts_with($deviceName, 'pascom Softphone')) {
$desktopDeviceNames[] = $deviceName;
}
}
// Parse device status API, if desktop devices exist
if (! empty($desktopDeviceNames)) {
$deviceNameQuery = rawurlencode(implode(',', $desktopDeviceNames));
$requestUrl = $baseUrl . '/ipdevice/states?keys=' . $deviceNameQuery;
$responseData = pascom_request_data($requestUrl, $authToken);
foreach ($responseData as $deviceStatusItem) {
$state = strtolower($deviceStatusItem['state']);
$ipAddress = strtolower($deviceStatusItem['ip_address']);
$deviceName = $deviceStatusItem['010dev_bez'];
if ($state === 'unavailable' || $ipAddress === '') {
continue;
}
$userName = pascom_extract_username($deviceName);
if (! in_array($userName, $activeLicenses)) {
$activeLicenses[] = $userName;
}
}
}
// Echo the list of all active licenses
var_dump($activeLicenses);