Hallo
@itNGO
Ich habe mit dem Link auf die Frage von
@mphilipp reagiert und ihm den Hinweis auf die API und etwas Eigeninitiative gegeben. Da kam dann keine Reaktion mehr.
Was
@mk1 mit einem API Aufruf da gemacht hat, das hat er ja nicht geschrieben. Ich vermute, er hat für den betreffenden SIP Trunk in den OutboundParams für die ParamId 24 den Wert ValueId von 2 auf 17 geändert. Aber ich weiß es nicht.
Hi,
vielleicht kannst du das kurz noch mal etwas "einfacher" erklären.
Siehe oben, zweiter Absatz dieses Post mit den möglichen Änderungen. Das ist kurz und bündig, aber ich glaube nicht dass dir das hilft.
Deine Bitte nach einer einfachen Erklärung ist keine einfache Antwort und schon gar nicht kurz. Die kommt jetzt.
Lies bitte den gesamten Text bis ganz zu Ende bevor du etwas tust oder lass es sein.
Die angefragte API Lösung für dich kann z.B. mit folgendem Powershell Skript durchgeführt werden:
3cx-sip-trunk-change-outbound-parameter.ps1
Code:
$tcxurl = "mypbx.mydomain.de" # needs port if not 443
$jsonauthbody = (@{
Username="100" # 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)"}
$uri = "https://$tcxurl/xapi/v1/Trunks"
$tcxtrunks=(Invoke-RestMethod -Uri $uri -Headers $headers -Method GET -ContentType "application/json").Value
Write-Host "found SIP trunks:"
Foreach ( $tcxtrunk in $tcxtrunks) {
Write-Host "trunk ID: $($tcxtrunk.Id) name: $($tcxtrunk.Gateway.Name)"
}
$tcxtid = Read-Host 'enter trunk ID to change outbound params or enter 0 to leave'
If ( ($tcxtid -eq "0") -or [string]::IsNullOrWhiteSpace($tcxtid)) {
Write-Host "exit, no changes"
exit 0
}
$uri = "https://$tcxurl/xapi/v1/Trunks($tcxtid)"
# get existing trunk data
$trunkResponse = Invoke-RestMethod -Uri $uri -Headers $headers -Method GET -ContentType "application/json"
if (-not $trunkResponse) {
Write-Host "error: could not get trunk data, exit"
exit 1
}
$existingOutboundParams = $trunkResponse.gateway.OutboundParams
# show trunk OutboundParams
Write-Host "for the SIP trunk with ID $($tcxtrunk.Id) the OutboundParams are:"
$existingOutboundParams | Format-Table -Property ParamId, ValueId, Custom
# get user input about changes
$paramId = Read-Host "enter ParamId to change / create or enter 0 to leave"
If ($paramId -eq "0" -or [string]::IsNullOrWhiteSpace($paramId)) {
Write-Host "exit, no changes"
exit 0
}
$valueId = Read-Host "enter ValueId to change it (or enter 0 or leave empty to remove it)"
$custom = Read-Host "enter Custom to change it (or leave empty)"
# remove ParamId if ValueId is 0 or empty
If ($valueId -eq "0" -or [string]::IsNullOrWhiteSpace($valueId)) {
Write-Host "parameter with ParamId $paramId will removed"
$existingOutboundParams = $existingOutboundParams | Where-Object { $_.ParamId -ne $paramId }
} Else {
# if ParamId exist then change ValueId and Custom
$param = $existingOutboundParams | Where-Object { $_.ParamId -eq $paramId }
If ($param) {
$param.ValueId = [int]$valueId
$param.Custom = $custom
} Else {
# new ParamId, add it
$existingOutboundParams += @{
"Custom" = $custom
"ParamId" = [int]$paramId
"ValueId" = [int]$valueId
}
}
}
# sort OutboundParams
$existingOutboundParams = $existingOutboundParams | Sort-Object -Property ParamId
# print new OutboundParams
Write-Host "for the SIP trunk with ID $($tcxtrunk.Id) the new OutboundParams are:"
$existingOutboundParams | Format-Table -Property ParamId, ValueId, Custom
# create JSON for Patch request
$gateway = @{
"OutboundParams" = $existingOutboundParams
}
$patchBody = @{
"gateway" = $gateway
} | ConvertTo-Json -Depth 10
Try {
$updateResponse = Invoke-RestMethod -Uri $uri -Headers $headers -Method PATCH -Body $patchBody -ContentType "application/json"
Write-Host "SIP-Trunk change successful"
} Catch {
Write-Host "error during SIP-Trunk change: $_"
if ($_.Exception.Response) {
$response = $_.Exception.Response.GetResponseStream()
$reader = New-Object System.IO.StreamReader($response)
$errorMessage = $reader.ReadToEnd()
Write-Host "answer: $errorMessage"
}
}
Im Skript ganz oben ist noch die Adresse und die Zugangsdaten zur 3CX einzutragen. Dieses Powershell Skript verbindet sich zum Webinterface der 3CX, meldet sich über die 3CX xapi Schnittstelle als berechtigter Benutzer (bevorzugt der Systemeigentümer) an der 3CX an, zeigt alle SIP Trunks an, fragt nach der ID des zu ändernden SIP Trunk, zeigt alle ausgehenden Parameter des SIP Trunk als Tabelle an, fragt nach dem zu ändernden Parameter (ParamID), fragt nach dem neuen Wert (ValueID), fragt nach Custom und führt diese Änderungen aus. Wenn an Statt der Parameter ID eine 0 oder nichts eingegeben wird dann bricht das Programm ab. Wenn an Statt eines Wertes eine 0 oder nichts eingegeben wird, dann wird der Parameter gelöscht. Wenn der eingegebene Parameter noch nicht vorhanden ist, dann wird er mit den angegebenen Werten eingefügt.
Dieses Powershell Skript kann alle vorhandenen ausgehenden Parameter eines beliebigen SIP Trunk einer laufenden 3CX ändern, löschen und erweitern. Wenn falsche Eingaben gemacht werden, dann ist der SIP Trunk evtl. nicht mehr nutzbar. Das Skript hat prinzipiell keine Fehlerbehandlung. Bei Problemen (falsche / unmögliche Eingaben) stürzt es ab, es werden rote Fehlermeldungen ausgegeben und es passiert nichts, vmtl. auch keine Änderung an einem SIP Trunk. Das Skript ist nicht für unbedarfte Benutzer sondern für Anlagenverwalter / Errichter.
Die Erklärung dazu ist folgende:
Alle in einer 3CX auswählbaren SIP Trunks liegen jeweils als XML Datei in einem Vorlagenverzeichnis, unter Linux ist das
/var/lib/3cxpbx/Instance1/Data/Http/Templates/provider/.
Die Vorlage für den Telekom SIP Trunk Company Flex Voice Data heißt
telekomcompanyflexvoicedata.pv.xml. Darin sind alle Parameter des Trunk vordefiniert abgelegt.
Bei der Auswahl und Einrichtung eines neuen SIP Trunk in einer 3CX wird diese Vorlage gelesen, man gibt weitere Daten zur Einrichtung ein und man speichert die SIP Trunk Daten in der 3CX. Für die ausgehenden Parameterfelder werden dabei die Vorgaben der Vorlage in just diesem Moment in den in der 3CX eingerichteten SIP Trunk übernommen und in Form von Parametern (einer Wertetabelle) zu diesem SIP Trunk gespeichert. Wenn irgendwann später die zum Einrichtungszeitpunkt verwendete Vorlage - die XML Datei - geändert wird, dann hat das keinen Einfluss auf die Werte des in der 3CX eingespeicherten und genutzten SIP Trunk. Der bleibt unverändert. Erst wenn man einen neuen SIP Trunk mit so einer geänderten Vorlage einrichtet, dann werden diese geänderten Vorgaben in den neuen SIP Trunk übernommen. Das nutzt dir also nichts. Du möchtest die im laufenden SIP Trunk eingerichteten Daten wie z.B. DID und Zuweisungen in der 3CX behalten.
Es gibt verschiedene Möglichkeiten, an diese Parameter, die in der 3CX zu diesem eingerichteten SIP Trunk gespeichert sind, heranzukommen. Ein derzeit voll unterstützter Weg ist die Nutzung der offiziellen Configuration API von 3CX, der xapi. Genau das macht das Powershell Skript.
Jeder in der 3CX genutzte SIP Trunk hat eine ID. Mit dieser ID kann über die xapi die Wertetabelle der ausgehenden Parameter abgefragt und geändert werden. Eine Abfrage kann dann z.B. so aussehen:
Code:
PS C:\Users\fxbastler> (Invoke-RestMethod -Uri "https://meine.3cx.de/xapi/v1/Trunks" -Headers $headers -Method GET -ContentType "application/json").Value[1].Gateway.OutboundParams
Custom ParamId ValueId
------ ------- -------
1 10
2 3
4 13
5 11
6 10
7 3
8 15
9 19
10 3
24 2
25 3
Das ist wohl aktuell die originale Wertetabelle eines Deutsche Telekom (CompanyFlex - VoiceData) SIP Trunk in einer 3CX. Die Wertetabelle besteht aus einer Parameter ID (ParamId), einem zugehörigen Werte ID (ValueId) und einem möglichen individuellen Eintrag (Custom) für die Werte ID 14 und 15.
Die ID sind wie folgt aufgeschlüsselt:
Code:
Gateway OutboundParams ParamId
------------------------------
1 Request Line URI : User Part
2 Request Line URI : Host Part
3 Contact : User Part
4 Contact : Host Part
5 To : Display Name
6 To : User Part
7 To : Host Part
8 From : Display Name
9 From : User Part
10 From : Host Part
11 User Agent : Text String
12 Remote Party ID - Called Party : Display Name
13 Remote Party ID - Called Party : User Part
14 Remote Party ID - Called Party : Host Part
15 Remote Party ID - Calling Party : Display Name
16 Remote Party ID - Calling Party : User Part
17 Remote Party ID - Calling Party : Host Part
20 P-Asserted Identity : Display Name
21 P-Asserted Identity : User Part
22 P-Asserted Identity : Host Part
23 P-Preferred Identity : Display Name
24 P-Preferred Identity : User Part
25 P-Preferred Identity : Host Part
26 P-Called-Party-ID : Display Name
27 P-Called-Party-ID : User Part
28 P-Called-Party-ID : Host Part
Gateway OutboundParams ValueId
------------------------------
1 "LineID" internal number of line
2 "LineNumber" external number of line
3 "GWHostPort" gateway/provider host/port
4 "OutHostPort" outbound proxy host/port
5 "AuthID" authentication
8 "CallerNum" caller's number (default: From->user)
9 "CallerName" caller's name (default: From->display name)
10 "CalledNum" number thar has been diales(default: To->user)
11 "CalledName" name that has been dialed (default: To->display name)
12 "DevHostPort" source address/port of message
13 "ContactUri" usually, content of Contact field
14 CustomIPRange
15 CustomField
16 "CallerDispName" Display name of a caller as it is in From Header - Provided by phone settings
17 "OutboundCallerId" Outbound caller Id taken from Extension settings in management console
18 "OutboundLineId" Outbound Line Caller ID taken from Outbound caller ID setting in management console
19 "OriginatorCallerID" Original Caller number will be sent
20 "EnforcedOutboundCallerId" To be used when you want to send Anonymous via PAI
21 "EnforcedOriginatorCallerId" To be used when you want to send Anonymous via PAI
Für alle aufgeführten ParamId in der Tabelle gibt es einen zugewiesenen Wert. Ist ein Parameter mit ID nicht aufgeführt, dann wird der Standard der 3CX (i.d.R. wenig bis nichts) verwendet. Für die ValueId 14 und 15 wird der Wert in Custom interpretiert, sonst nicht.
Wenn also der ausgehende Parameter
P-Preferred Identity : User Part von
"LineNumber" external number of line auf
"OutboundCallerId" Outbound caller Id taken from Extension settings in management console
geändert werden soll, dann muss der Parameter mit der ParamId 24 an Statt einer 2 den Wert 17 erhalten. Mit dem Powershell Skript kann man das live ändern.
Merke: nicht alle ParamId / ValueID Kombinationen sind sinnvoll. Das Skript prüft nicht die Plausibilität der eingegebenen Parameter oder Werte.
Eine andere Möglichkeit ist nach wie vor, in einem Backup der 3CX die Parameter unter
<VoipProvider> <ArrayOfOutboundParam> zu ändern und das Backup zurückzuspielen. Aber das war ja nicht die Frage und Bitte um Erklärung der API Nutzung.
Abschließend die obligatorischen Hinweise:
Man sollte ein klein wenig verstehen was man da tut bevor man es tut. Man sollte vorher ein gutes Backup der 3CX haben, testen und für den Notfall anderswo speichern.
Das Skript ist von mir. Ich übernehme keine Haftung wenn ihr es falsch bedient. Aber ihr könnt es nutzen und weiterentwickeln so wie ihr wollt. Das ist nur ein Schnipsel - eine Vorlage für Erweiterungen (z.B. ein Menü mit Auswahl usw.). Ein Hinweis auf den Urheber und diesen Post wäre nett. Ich hoffe auch, ich habe mich nirgends verschrieben
Die Daten sind meine eigenen gefundenen Erkenntnisse. Das ist nicht von 3CX dokumentiert so weit ich das weiß. Das kann sich auch alles irgendwann ändern (hat es aber seit 3CX v16 oder früher bisher nicht). Ich bin nicht 3CX. Vielleicht gibt es auch eine einfachere Lösung, dann wäre es schön, wenn das jemand hier schreibt.
voll gerne