Suche nach der API-Dokumentation

Damit ich es selber wieder finde und nicht ewig suchen muss (wie heute), hier das Perl Skript und ein Beispiel Template für die Anbindung an Zabbix:

Perl:
#!/usr/bin/perl

use strict;
use warnings;
use REST::Client;
use JSON;

my ($fqdn, $port, $username, $userpassword, $type);

while (my $s = shift(@ARGV)) {
    for($s) {
        if(   /^-H/) { $fqdn = shift(@ARGV); }
        elsif(/^-P/) { $port = shift(@ARGV); }
        elsif(/^-U/) { $username = shift(@ARGV); }
        elsif(/^-S/) { $userpassword = shift(@ARGV); }
        elsif(/^-T/) { $type = shift(@ARGV); }
        else { print "INVALID PARAMETER SYNTAX\n";  }
    }
}

my $client = REST::Client->new();
my $res = "";
$client->setHost("https://$fqdn");
$client->addHeader('Accept', 'application/json');
$client->addHeader('Content-Type', 'application/json');
$client->addHeader('charset', 'UTF-8');
$client->getUseragent()->cookie_jar({});

my $req = "{\"username\":\"$username\", \"password\":\"$userpassword\"}";
$client->POST('/api/login', $req);

if ($client->responseContent() eq 'AuthSuccess') {
    $client->GET("/api/$type");
    print $client->responseContent();
    $client->POST('/api/logout', $req);
}
else {
    print "NO CONNECT TO 3CX\n";
    exit 1;
}

exit 0;

Das Skript kommt z.B. als Datei 3cx-monitoring-restapi.pl auf einem Debian (aktuell 12, Bookworm) mit Zabbix Server (aktuell 6.0 LTS) in das Verzeichnis
/usr/lib/zabbix/externalscripts/ und bekommt mit
chmod +x ... noch die Rechte ausführbar.

Auf einem nackigen Debian ist Perl immer passend installiert, allerdings muss mit
apt -y install librest-client-perl noch die Rest Library für Perl installiert werden.

Im Zabbix Template dann idealerweise die Variablen (Macros) {$TCX_FQDN}, {$TCX_TCP_PORT}, {$TCX_USERNAME} und {$TCX_PASSWORD} mit den passenden Werten einrichten. Es ist sinnvoll, einen extra Benutzer in der 3CX vom Typ Systemadministrator dafür einzurichten, damit der normale administrative Benutzer nicht ständig abgemeldet wird. Der extra Benutzer bekommt auch eine eigene Gruppe und wird aus der Default gelöscht. Damit ist der nicht sichtbar. Die Anmeldung erfolgt dann nicht mit dem Namen sondern der NSt. Nummer und dessen 3CX Webkennwort (neu vergeben).

Der Aufruf des Skriptes als Item vom Typ External Check erfolgt mit
3cx-monitoring-restapi.pl["-H", "{$TCX_FQDN}", "-P", "{$TCX_TCP_PORT}", "-U", "{$TCX_USERNAME}", "-S", "{$TCX_PASSWORD}", "-T", "SystemStatus"]. Da kommt dann JSON zurück. Das kann alles gut direkt ausgewertet werden, siehe Beispiel Template.

perl rulez
 

Anhänge

Zuletzt bearbeitet:
  • Like
Reaktionen: vieledinge
3CX v20 REST API via Powershell:

Code:
$tcxurl="mypbx.mydomain.de"     # needs port if not 443

$jsonauthbody = (@{
    Username="988"              # 3CX user, maybe email address
    Password="Super_Secret0815" # 3CX user password
    SecurityCode=""
} | ConvertTo-Json)

$LoginResponse = Invoke-RestMethod -Uri "https://$tcxurl/webclient/api/Login/GetAccessToken" -Body $jsonauthbody -Method POST -ContentType "application/json"

$headers = @{Authorization = "Bearer $($LoginResponse.Token.access_token)"}

# get information about endpoints
(Invoke-RestMethod -uri "https://$tcxurl/xapi/v1" -headers $headers -Method GET -ContentType "application/json").value

# or users ...
(Invoke-RestMethod -uri "https://$tcxurl/xapi/v1/Users" -headers $headers -Method GET -ContentType "application/json").value

Da fehlt noch jegliche Fehlerbehandlung.

Stichwort: Schnipsel
 
  • Like
Reaktionen: matictec und patrickb
Ergänzend zu oben, hier die Aktualisierung des Perl Skriptes für eine 3CX v20 xapi Abfrage für Zabbix:

Perl:
#!/usr/bin/perl
# ./xapi.pl -H mypbx.domain.de -U 100 -S MySecretPassw0rd -T Systemstatus

use strict;
use warnings;
use REST::Client;
use JSON;

my ($fqdn, $port, $username, $userpassword, $type);

while (my $s = shift(@ARGV)) {
    for($s) {
        if(   /^-H/) { $fqdn = shift(@ARGV); }
        elsif(/^-P/) { $port = shift(@ARGV); }
        elsif(/^-U/) { $username = shift(@ARGV); }
        elsif(/^-S/) { $userpassword = shift(@ARGV); }
        elsif(/^-T/) { $type = shift(@ARGV); }
        else { print "INVALID PARAMETER SYNTAX\n";  }
    }
}

my $ptrimmed = "";
if( $port ) {
  ($ptrimmed) = $port =~ /(\d+)/;
}
if( (length($ptrimmed) > 0) && ($ptrimmed != /^443$/)) { $fqdn="$fqdn:$ptrimmed" };

my $client = REST::Client->new();
my $res = "";
$client->setHost("https://$fqdn");
$client->addHeader('Accept', 'application/json');
$client->addHeader('Content-Type', 'application/json');
$client->addHeader('charset', 'UTF-8');

my %req=("Username" => $username, "Password" => $userpassword, "SecurityCode" => "");
$client->POST('/webclient/api/Login/GetAccessToken', encode_json(\%req));

my $jsresult=from_json($client->responseContent());
if ( $jsresult->{'Status'} eq 'AuthSuccess') {
    $client->addHeader('Authorization', 'Bearer ' . $jsresult->{'Token'}->{'access_token'});
    $client->GET("/xapi/v1/$type");
    print $client->responseContent();
    $client->POST('/api/logout', encode_json(\%req));
}
else {
    print "NO CONNECT TO 3CX\n";
    exit 1;
}

exit 0;
 
  • Like
Reaktionen: mbehrens

Statistik des Forums

Themen
44.413
Beiträge
232.713
Mitglieder
78.328
Neuestes Mitglied
as7h