Automatischer Statuswechsel problem

Ben04

3CX MVP
Silver Partner
Mitglied seit
4. August 2023
Beiträge
728
Moin,

Wir haben seit ein paar Tagen (genau wissen wir es seit 2 Tagen) ein Problem, dass eine Nebenstelle, die sich innerhalb der Geschäftszeiten den Status auf Custom 1 gesetzt hat, am nächsten Morgen wieder den Status verfügbar haben soll.

Klingt erstmal nach der Einstellung „Zeitplan“ beim User, diese ist aber nicht aktiv. Also nur auf Standard-GZ, kein Status–Switcher online.

Im Auditlog, Ereignisprotokoll und Aktivitätsprotokoll finde ich keine einzige Information darüber. Was mich stutzig macht.

Einstellungen wurden auch durchgeschaut und nichts gefunden, was das auslösen könnte.

Hier ein paar Zeiten:

– Gestern um 12:12 Uhr ca. geswitcht auf Status: Custom 1 (via Anrufskript).

– Um kurz nach 7 Uhr wurde festgestellt: Status ist wieder auf „Aktiv“.

– Um 8 Uhr beginnen erst unsere GZ, daher passen die Uhrzeiten schon mal nicht zusammen.

– Uhrzeit im Linux ist eine halbe Minute hinterher, im Vergleich zu meinem Windows-PC.
 
Wir haben seit ein paar Tagen (genau wissen wir es seit 2 Tagen) ein Problem, dass eine Nebenstelle, die sich innerhalb der Geschäftszeiten den Status auf Custom 1 gesetzt hat, am nächsten Morgen wieder den Status verfügbar haben soll.
Ich habe ein Problem beim Lesen und Verständnis dessen und dem was darunter folgt. Meinst du wirklich haben soll oder hat.
Erst mit hat ergibt der Rest der Anfrage von dir für mich irgendwie einen Sinn.

Klingt erstmal nach der Einstellung „Zeitplan“ beim User, diese ist aber nicht aktiv. Also nur auf Standard-GZ, kein Status–Switcher online.
Mach bitte ein Bildschirmfoto vom Dialog.

Gestern um 12:12 Uhr ca. geswitcht auf Status: Custom 1 (via Anrufskript).
aha

Um kurz nach 7 Uhr wurde festgestellt: Status ist wieder auf „Aktiv“.
Der Status Custom1 schaltet nie automatisch um auf Grund von irgendwelchen GZ / PZ. Das geht nur per 3CX Wählcode, per App, mit einem Skript, per REST API oder sonstiger externer Benutzeranbindung (O365 o.ä.).
 
Ich habe ein Problem beim Lesen und Verständnis dessen und dem was darunter folgt. Meinst du wirklich haben soll oder hat.
Erst mit hat ergibt der Rest der Anfrage von dir für mich irgendwie einen Sinn.
Da ich es nur gesagt bekomme und keine Beweise/Indizien habe, wäre es ein solcher Fall. Der Status soll sich gewechselt haben, ohne eigene Einwirkung.

Mach bitte ein Bildschirmfoto vom Dialog.
Adminkonsole - 3CX - Google Chrome 24.10.2024 11_14_50.png

Der Status Custom1 schaltet nie automatisch um auf Grund von irgendwelchen GZ / PZ. Das geht nur per 3CX Wählcode, per App, mit einem Skript, per REST API oder sonstiger externer Benutzeranbindung (O365 o.ä.).
Skript gibt es, aber das muss erst Gewählt werden.
APP Muss die Person es selber umstellen, wurde aber nicht.
REST API oder externe Anbindungen sind nicht vorhanden / Konfiguriert.
 
Da ich es nur gesagt bekomme und keine Beweise/Indizien habe, wäre es ein solcher Fall. Der Status soll sich gewechselt haben, ohne eigene Einwirkung.
Dann: überwachen lassen ...
 
Ja wir schauen uns das jetzt mal an und schauen ob wir das mitbekommen.
Sonst wüsste ich nicht, wie ich das nur auf die Stelle überwachen kann über den Zeitraum in der Abwesenheit.
Screen aufnehmen und nur auf die Nebenstelle des Status gucken lassen :D
 
Sonst wüsste ich nicht, wie ich das nur auf die Stelle überwachen kann über den Zeitraum in der Abwesenheit.
Per Powershell und cron job auf der 3CX oder per Task und Powershell über die REST API irgendwo anders oder per Monitoring z.B. Zabbix.
 
Wenn du mir sagt, wie ich was machen müsste dafür. Was wäre den einfacher ?
Zabbix ist ein „normales“ Monitoring-Programm für Systeme, oder was kann das in Bezug auf den Fall?
 
Was wäre den einfacher ?
Für mich: ein Powershell Skript auf der 3CX (leicht unsupported wenn kein Windows...) per Zeitplanung des System laufen lassen, den Status damit direkt abfragen und in ein Log schreiben, z.B. so wie hier in Zeile 79:

Code:
#!/usr/bin/pwsh
#
# name: 3cx-powershell-example.ps1
#
# script uses Powershell Core, >7.4 at this time
#   look at https://learn.microsoft.com/de-de/powershell/scripting/install/install-debian?view=powershell-7.4
#   or direct download  https://github.com/PowerShell/PowerShell/releases/tag/v7.4.5
#
#
# install Powershell on Debian10 (3CX v16 / v18) or Debian12 (3CX v20):
#   source /etc/os-release
#   wget -q https://packages.microsoft.com/config/debian/$VERSION_ID/packages-microsoft-prod.deb
#   dpkg -i packages-microsoft-prod.deb
#   wget https://github.com/PowerShell/PowerShell/releases/download/v7.4.4/powershell_7.4.5-1.deb_amd64.deb
#   dpkg -i powershell_7.4.5-1.deb_amd64.deb
#   apt install -f
#       optional installation (ATTENTION! breaks 3CX? in far future) to compile dotnet programs: apt -y install -y apt-transport-https dotnet-sdk-5.0
#
#
# run script on Debian:
#   via shell:              /usr/bin/pwsh -File 3cx-powershell-example.ps1
#   via cron job entry:     * * * * * /usr/bin/pwsh -File 3cx-powershell-example.ps1 >/dev/null 2>&1
#   add cron job entry:     (crontab -l ; echo "* * * * * /usr/bin/pwsh -File 3cx-powershell-example.ps1 >/dev/null 2>&1" ) | crontab -
#
# do not forget at first:   chmod +x 3cx-powershell-example.ps1
#

$tcxappname="pwshexample"       # name, must be unique at runtime

$osname=[System.Environment]::OSVersion.Platform
if( $osname -match "win" ) {
    $tcxdllfilelocation="C:\Program files\3CX Phone System\Bin\3cxpscomcpp2.dll"
    $tcxinifilelocation="C:\ProgramData\3CX\Bin\3CXPhoneSystem.ini"
} else {
    $tcxdllfilelocation="/usr/lib/3cxpbx/3cxpscomcpp2.dll"
    $tcxinifilelocation="/var/lib/3cxpbx/Bin/3CXPhoneSystem.ini"
}

# $job = Start-Job -ScriptBlock { # encapsulation as job block
Add-Type -Path $tcxdllfilelocation  # Debian "/usr/lib/3cxpbx/3cxpscomcpp2.dll", Windows "C:\Program files\3CX Phone System\Bin\3cxpscomcpp2.dll"

Function ReadConfiguration() {
    $CurrentSectionName=$null
    foreach($striline in ([System.IO.File]::ReadLines($tcxinifilelocation).Trim())) {  # Debian "/var/lib/3cxpbx/Bin/3CXPhoneSystem.ini", Windows "C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini"
        $delim="[","]"
        if ($striline.StartsWith("[")) {
            if( $CurrentSectionName -notmatch "ConfService" ) {
                $CurrentSectionName = ($striline -Split {$delim -contains $_}).Where({$_ -ne "" })
            } else {
                break
            }
        }
        elseif( ($CurrentSectionName -ne $null) -and (-not ([string]::IsNullOrEmpty($striline))) -and (-not ($striline.StartsWith("#"))) -and (-not ($striline.StartsWith(";")))) {
            if( $CurrentSectionName -match "ConfService" ) {
                $param=$striline.split("=")[0].Trim()
                $value=$striline.split("=")[1].Trim()
                switch( $param ) {
                    "confNIC"  { $PS::CfgServerHost=$value }
                    "ConfPort" { $PS::CfgServerPort=$value }
                    "confUser" { $PS::CfgServerUser=$value }
                    "confPass" { $PS::CfgServerPassword=$value }
                }
            }
        }
    }
}

$PS = [TCX.Configuration.PhoneSystem]
ReadConfiguration
$PS::ApplicationName = $tcxappname

# $TCXConn = ($PS::Root)
$TCXConn = $PS::Reset($PS::ApplicationName, $PS::CfgServerHost, $PS::CfgServerPort, $PS::CfgServerUser, $PS::CfgServerPassword)
$TCXConn.WaitForConnect((New-TimeSpan -Seconds 30)) | Out-Null   # wait for connection to 3CX
if( $TCXConn.Connected ) {
    # Write-Host "connection to call api established"
 
    # do something with 3CX, like ask state of an extension and log it
    Add-Content -Path "tcxlogfile.txt" -Value "$(Get-Date -Format yyyy-MM-dd_HH-mm_dddd)   $($TCXConn.GetDNByNumber(""200"").CurrentProfile.Name)"
 
    $TCXConn.Disconnect()
}
else {
    # Write-Error "connection to call api failed"
}
 
Ehm du musst mir nochmal n stück weiter helfen.
Also Schritt 1: Das Ausführen / befolgen
Code:
install Powershell on Debian10 (3CX v16 / v18) or Debian12 (3CX v20):
#   source /etc/os-release
#   wget -q https://packages.microsoft.com/config/debian/$VERSION_ID/packages-microsoft-prod.deb
#   dpkg -i packages-microsoft-prod.deb
#   wget https://github.com/PowerShell/PowerShell/releases/download/v7.4.4/powershell_7.4.5-1.deb_amd64.deb
#   dpkg -i powershell_7.4.5-1.deb_amd64.deb
#   apt install -f
#       optional installation (ATTENTION! breaks 3CX? in far future) to compile dotnet programs: apt -y install -y apt-transport-https dotnet-sdk-5.0
#
#
# run script on Debian:
#   via shell:              /usr/bin/pwsh -File 3cx-powershell-example.ps1
#   via cron job entry:     * * * * * /usr/bin/pwsh -File 3cx-powershell-example1.ps1 >/dev/null 2>&1
#   add cron job entry:     (crontab -l ; echo "* * * * * /usr/bin/pwsh -File 3cx-powershell-example.ps1 >/dev/null 2>&1" ) | crontab -
#
# do not forget at first:   chmod +x 3cx-powershell-example.ps1
#

Schritt 2: 3cx-powershell-example.ps1 aufrufen und folgenes rein schreiben:
Code:
$tcxappname="pwshexample"   -> = "XY"    # name, must be unique at runtime

$osname=[System.Environment]::OSVersion.Platform
if( $osname -match "win" ) {
    $tcxdllfilelocation="C:\Program files\3CX Phone System\Bin\3cxpscomcpp2.dll"
    $tcxinifilelocation="C:\ProgramData\3CX\Bin\3CXPhoneSystem.ini"
} else {
    $tcxdllfilelocation="/usr/lib/3cxpbx/3cxpscomcpp2.dll"
    $tcxinifilelocation="/var/lib/3cxpbx/Bin/3CXPhoneSystem.ini"
}

# $job = Start-Job -ScriptBlock { # encapsulation as job block
Add-Type -Path $tcxdllfilelocation  # Debian "/usr/lib/3cxpbx/3cxpscomcpp2.dll", Windows "C:\Program files\3CX Phone System\Bin\3cxpscomcpp2.dll"

Function ReadConfiguration() {
    $CurrentSectionName=$null
    foreach($striline in ([System.IO.File]::ReadLines($tcxinifilelocation).Trim())) {  # Debian "/var/lib/3cxpbx/Bin/3CXPhoneSystem.ini", Windows "C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini"
        $delim="[","]"
        if ($striline.StartsWith("[")) {
            if( $CurrentSectionName -notmatch "ConfService" ) {
                $CurrentSectionName = ($striline -Split {$delim -contains $_}).Where({$_ -ne "" })
            } else {
                break
            }
        }
        elseif( ($CurrentSectionName -ne $null) -and (-not ([string]::IsNullOrEmpty($striline))) -and (-not ($striline.StartsWith("#"))) -and (-not ($striline.StartsWith(";")))) {
            if( $CurrentSectionName -match "ConfService" ) {
                $param=$striline.split("=")[0].Trim()
                $value=$striline.split("=")[1].Trim()
                switch( $param ) {
                    "confNIC"  { $PS::CfgServerHost=$value }
                    "ConfPort" { $PS::CfgServerPort=$value }
                    "confUser" { $PS::CfgServerUser=$value }
                    "confPass" { $PS::CfgServerPassword=$value }
                }
            }
        }
    }
}

$PS = [TCX.Configuration.PhoneSystem]
ReadConfiguration
$PS::ApplicationName = $tcxappname

# $TCXConn = ($PS::Root)
$TCXConn = $PS::Reset($PS::ApplicationName, $PS::CfgServerHost, $PS::CfgServerPort, $PS::CfgServerUser, $PS::CfgServerPassword)
$TCXConn.WaitForConnect((New-TimeSpan -Seconds 30)) | Out-Null   # wait for connection to 3CX
if( $TCXConn.Connected ) {
    # Write-Host "connection to call api established"
    
    # do something with 3CX, like ask state of a extension
    Add-Content -Path "tcxlogfile.txt" -Value "$(Get-Date -Format yyyy-MM-dd_HH-mm_dddd)   $($TCXConn.GetDNByNumber(""40"").CurrentProfile.Name)"
    
    $TCXConn.Disconnect()
}
else {
    # Write-Error "connection to call api failed"
}
 
Grundsätzlich ja, ABER: der ganze Code Block im Post ist das Skript (eben auch Zeile 1), mit Anleitung in den Kommentaren oben.
Dann funktioniert das für dich Entscheidende auch in Zeile 79.
 
Also Anleitung durchführen, Skript öffnen, das Ganze rein speichern, ab deiner Zeile 1 und dann ausführen, richtig?
 
Also Anleitung durchführen, Skript öffnen, das Ganze rein speichern, ab deiner Zeile 1 und dann ausführen, richtig?
richtig, so in etwa

Nach dem Speichern Rechte anpassen, Powershell starten und Skript ausführen oder das Skript als Einzeiler starten oder einen cron job anlegen - steht alles mehr als ausführlich in der Anleitung.
 
  • Like
Reaktionen: Ben04
Passe dir die Zeile 79 an: die Nummer der Nebenstelle deren Status mitgemeiselt werden soll (hier im Beispiel die 200) und evtl. den Namen des logfile (hier im Beispiel die tcxlogfile.txt). Die Datei wird kommenarlos im Basisordner des user (root?) bzw. da wo du dich gerade beim Lauf des Skriptes befindest angelegt. Wenn per cron als root gestartet dann eben in /root .

Mist, ich habe im Post oben das Suchstichwort Schnipsel vergessen. Dann halt hier mit Link
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Ben04
Nicht ganz richtig @fxbastler, zu deiner Verteidgung ist es aber auch ein neues Feature

Admin Tab -> System -> Optionen
Screenshot 2024-10-24 14.35.58.png


Mit der Fragestellung tue ich mich auch ein wenig schwer.

Ich verstehe das es in die Richtung geht Montag während der GZ möchte ich Status X, am Dienstag während der GZ aber Y.
 
Brauch nochmal Hilfe.
Ich habe jetzt die beiden Pakete installiert und "apt install -f" ausgeführt.

Nun sollte doch folgender Pfad Exisitieren: /usr/bin/pwsh -File 3cx-powershell-example.ps1
../pwsh ist eine Datei und er kann damit nichts anfangen bzgl. chmod +x 3cx-powershell-example.ps1

Edit: Es geht nicht darum, dass während der und der Zeit, auf Status XY umgeschaltet wird. Das haben wir nicht aktiv und brauchen wir nicht bei uns. Dennoch schaltet sich die Nebenstelle 40 um.. Vor allem NUR diese Nebenstelle.. keine andere macht dieses Phänomen.


Edit2:
Optionen - 3CX - Google Chrome 24.10.2024 13_47_24.png
Gilt das jetzt Automatisch immer ? Also Always On Einstellung ? Oder muss man das Aktivieren / Kann man es deaktivieren ?
 
Zuletzt bearbeitet:
Nicht ganz richtig @fxbastler, zu deiner Verteidgung ist es aber auch ein neues Feature

Admin Tab -> System -> Optionen
Anhang anzeigen 16905


Mit der Fragestellung tue ich mich auch ein wenig schwer.

Ich verstehe das es in die Richtung geht Montag während der GZ möchte ich Status X, am Dienstag während der GZ aber Y.
Hallo Sascha. Ich kenne das Feature. Ich verstehe jetzt nicht ganz, was das mit der Frage hier zu tun hat.

Du meinst: weil ich das hier:
Der Status Custom1 schaltet nie automatisch um auf Grund von irgendwelchen GZ / PZ. Das geht nur per 3CX Wählcode, per App, mit einem Skript, per REST API oder sonstiger externer Benutzeranbindung (O365 o.ä.).
geschrieben habe, dass die automatische Umschaltung auf custom1 und 2 (und anderes) mit der v20u3 möglich ist? Ja, dann stimmt das Geschrieben nicht mehr ganz, weiß ich. Das kann eine gefährliche Sache sein ;)

Wenn du das meinst, dann hoffe ich mal, ich kann richtig davon ausgehen, dass das dort nicht systemweit eingestellt ist. Sonst hätten andere Benutzer vmtl. auch das Problem und würde die Zeiten kennen.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: SaschaA_3CX und Ben04
Es ist eine systemweite Einstellung.
"Profile wählen für die automatische Statusumschaltung durch den Scheduler für alle Nutzer."

Ich wollte nur sicherstellen das der Fragesteller die Option kennt und diese überprüfen kann. Er schrieb ja, das er den Statuswechsel zu gewissen Uhrzeiten nicht nachvollziehen kann.
 
Kannst du in der Shell pwsh eingeben und das startet? Das sollte funktionieren. Sonst nacharbeiten, dann ist es nicht installiert.
Gilt das jetzt Automatisch immer ? Also Always On Einstellung ? Oder muss man das Aktivieren / Kann man es deaktivieren ?
Ja, immer, für alle Benutzer der 3CX. Das ist aber nicht die Funktion, dass das überall auch aktiviert ist und die Umschaltung passiert. Dort wird die Einstellung getroffen, dass wenn umgeschalten wird in welchen Status umgeschalten wird. Die Voreinstellung laut Bild passt und war schon immer so der Standard. Das kann man jetzt genau dort systemweit ändern.
 
  • Like
Reaktionen: Ben04
Hinweis: Es passiert auch während der Geschäftszeiten.
Folgendes finde ich immer wieder:
Code:
24.10.2024 14:20:53.162    Extn:40: Synch devices to dndOFF
24.10.2024 14:20:53.105    Endpoint Extn:40 has refreshed contact <sip:[email protected]:5060/UDP>
24.10.2024 14:20:52.831    Extn:40: DND change request to dndOFF is ignored - same state is charged already
24.10.2024 14:20:52.831    Extn:40: Starting DND change transaction to dndOFF requested from configuration
24.10.2024 14:20:52.830    Settings of Extn:40 has been updated
24.10.2024 14:20:52.830    Extn:40: Profile is set to dndOFF
24.10.2024 14:20:52.830    Extn:40 belongs to groups 32,33,
24.10.2024 14:20:52.830    DN:40 belong to groups: 32{GRP0000},33,, primary group: 'GRP0000'
24.10.2024 14:20:52.830    Extn:40 belongs to groups [32{GRP0000},33,]
24.10.2024 14:20:52.830    Settings of Extn:40 has been updated
24.10.2024 14:20:52.830    Extn:40: Profile is set to dndOFF
24.10.2024 14:20:52.830    Extn:40 belongs to groups 32,33,
24.10.2024 14:20:52.830    DN:40 belong to groups: 32{GRP0000},33,, primary group: 'GRP0000'
24.10.2024 14:20:52.830    Extn:40 belongs to groups [32{GRP0000},33,]
24.10.2024 14:20:52.816    Extn:40: Switch profile to dndOFF
24.10.2024 14:20:52.486    Extn:40: Starting DND change transaction to dndOFF requested from a device
 

Statistik des Forums

Themen
44.754
Beiträge
233.661
Mitglieder
78.497
Neuestes Mitglied
Support IDMC