[Gelöst] Dial-Befehl mit Bedingung: Wie nur EIN Dial-Befehl?

MET

Mitglied
Mitglied seit
27 Okt 2004
Beiträge
682
Punkte für Reaktionen
0
Punkte
16
In Betateilchen's Macro-ruf möchte ich den Dial-Befehl je nach {ARG2} unterschiedlich ausführen. Mit einem GotoIf-Befehl könnte dies bspw. so aussehen:
Code:
[macro-ruf]
exten => s,1,NoOp(Wir sind im Macro ruf gelandet)
exten => s,n,GotoIf($["${ARG2}" <> "30"]?dial1)
exten => s,n,Dial,${ARG1}/${ARG2}&IAX2/40|25|r    ; wenn {ARG2}= 30 läutet bei Anschluss 30 und via IAX2 bei 40
exten => s,n(dial1),Dial,${ARG1}/${ARG2}|25|r      ; wenn {ARG2}<>30 läutet nur bei Anschluss {ARG2}
exten => s,n,NoOp(Hier geht es in allen Fällen weiter)
Wenn ich dies richtig verstehe würden hier aber bei einem Anruf auf 30 fälschlicherweise beide Dial-Befehle ausgeführt. Wie muss man dies ändern damit in jedem Fall nur ein Dial-Befehl ausgeführt wird?
 
Zuletzt bearbeitet:
Moins

An der richtigen Stelle ein Goto() einbauen...
Code:
[macro-ruf]
exten => s,1,NoOp(Wir sind im Macro ruf gelandet)
same => n,GotoIf($["${ARG2}" <> "30"]?dial1)
same => n,Dial,${ARG1}/${ARG2}&IAX2/40|25|r    ; wenn {ARG2}= 30 läutet bei Anschluss 30 und via IAX2 bei 40
same => n,Goto([COLOR=#ff0000][B]exit[/B][/COLOR])
same => n(dial1),Dial,${ARG1}/${ARG2}|25|r      ; wenn {ARG2}<>30 läutet nur bei Anschluss {ARG2}
same => n([COLOR=#ff0000][B]exit[/B][/COLOR]),NoOp(Hier geht es in allen Fällen weiter)
 
Hallo koyaanisqatsi

Danke für den Tipp. Dies funktioniert noch nicht. Dies kann damit zusammenhängen, dass ich das Skript anfänglich zu stark anonymisiert habe. Bei mir sind die Kontexte der Teilnehmer alphanumerisch, d.h. die Nummer 30 ist bspw. unter Kontext [30a] definiert. Das Skript sieht tatsächlich etwa so aus:
Code:
[macro-ruf]
exten => s,1,NoOp(Wir sind im Macro ruf gelandet)
exten => s,n,GotoIf($["${ARG2}" = "30a"]?dial1)
exten => s,n(dial1),Dial,${ARG1}/${ARG2}&IAX2/40a|25|r    ; wenn {ARG2}= 30 läutet bei Anschluss 30 und via IAX2 bei 40
exten => s,n,Goto(dial2)
exten => s,n,Dial,${ARG1}/${ARG2}|25|r      ; wenn {ARG2}<>30 läutet nur bei Anschluss {ARG2}
exten => s,n(dial2),NoOp(Hier geht es in allen Fällen weiter)
Wie die CLI anzeigt, gelangt ein Anruf an 35 fälschlicherweise auch an 40:
Code:
    -- Executing [35@app30:1] NoCDR("SIP/30a-000000b1", "") in new stack
    -- Executing [35@app30:2] Macro("SIP/30a-000000b1", "ruf|SIP|35a") in new stack
    -- Executing [s@macro-ruf:1] NoOp("SIP/30a-000000b1", "Wir sind im Macro ruf gelandet") in new stack
    -- Executing [s@macro-ruf:2] GotoIf("SIP/30a-000000b1", "0?dial1") in new stack
    -- Executing [s@macro-ruf:3] Dial("SIP/30a-000000b1", "SIP/35a&IAX2/40a|25|r") in new stack
    -- Called 35a
    -- Called 40a
    -- Call accepted by xx.xxx.xx.xxx (format ulaw)
    -- Format for call is ulaw
    -- IAX2/40a-1901 is ringing
    -- SIP/35a-000000b2 is ringing
    -- Hungup 'IAX2/40a-1901'
  == Spawn extension (macro-ruf, s, 3) exited non-zero on 'SIP/30a-000000b1' in macro 'ruf'
  == Spawn extension (app30, 35, 2) exited non-zero on 'SIP/30a-000000b1'
Wie muss das Skript geändert werden, damit die Überprüfung funktioniert?
 
Zuletzt bearbeitet:
Ich wüde REGEX nehmen...
Code:
same  => n,GotoIf(${REGEX("[a]" ${ARG2})}?dial1)
...wenn ein* "a" in ${ARG2} ist, dann gehe nach Sprungmarke dial1.
Das lässt sich auch ganz leicht ins Gegenteil umwandeln...
Code:
same  => n,GotoIf(${REGEX("[a]" ${ARG2}=[COLOR=#ff0000][B]0[/B][/COLOR])}?dial2)
...wenn kein "a" in ${ARG2} ist, dann gehe nach Sprungmarke dial2.


* Genauer: Mindestens ein "a", für genau ein "a" sieht der REGEX so aus: REGEX("[a]\{1\,1\}" ${ARG2})
...die geschweiften Klammern und das Komma müssen mit jeweils einen Backslash maskiert werden.
Quelle
 
Zuletzt bearbeitet:
...wenn ein* "a" in ${ARG2} ist, dann gehe nach Sprungmarke dial1.
Mit "a" als Kriterium wäre die Bedingung nicht wie gewünscht. Es gibt mehrere Nummern mit "a" in obigem Beispiel 35a und 40a. Wenn ich 35 (bzw. 35a) wähle soll ja nur {ARG2} angerufen werden. Könnte es vielleicht mit
Code:
same  => n,GotoIf(${REGEX("[30]" ${ARG2})}?dial1)
funktionieren?
 
Das "[0-9]" steht für Zahlen.
Das "[a-z]" steht für Kleinbuchstaben (ohne Umlaute).
Das "[A-Z]", jawohl, Grossbuchstaben.
Alle drei Arten auf einmal: "[a-z, A-Z, 0-9]"

Eine bestimmte Range ab 30 bis 35 kann also so aussehen: "^3[0-5]$"
...wobei ^ den Anfang darstellt und $ das Ende.

30a bis 35a: "^3[0-5]a$"

Jetzt mal die 33a auschliessen: "^3[0-2,4-5]a$"

Punkt und Asterisk haben ausserhalb von [A-Z,a-z,0-9] eine Wildcardfunktion.
Genau ein beliebiges Zeichen: "."
Zeichen, beliebiger Länge: ".*"

Innerhalb von [] verlieren sie die Wildcardfunktion und dienen als Suchmuster für genau dieses Zeichen.
Nach Punkte suchen: "[.]"
Nach Punkte und Asterisk suchen: "[.,*]"
 
Zuletzt bearbeitet:
Danke, da gibt es einiges Neues für mich. Bin aber trotzdem noch nicht weiter. Bei der Bedingung geht es nur um die Nr. 30 (bzw. 30a). Habe die Bedingung jetzt so formuliert
"${ARG2}" = "^30a$" aber es funktioniert auch damit noch nicht. Bei diesen Tests rufe ich die Nr. 35 an. Bei einem Anruf auf diese Nummer sollte es bei 40 (bzw. 40a) nicht läuten, aber es tut dies. Hier nochmals Skript und CLI von diesem letzten Versuch.
Extension.conf:
Code:
[macro-ruf]
exten => s,1,NoOp(Wir sind im Macro ruf gelandet)
exten => s,n,GotoIf($["${ARG2}" = "^30a$"]?dial1)
exten => s,n(dial1),Dial,${ARG1}/${ARG2}&IAX2/40a|25|r    ; wenn {ARG2}= 30 läutet bei Anschluss 30 und via IAX2 bei 40
exten => s,n,Goto(dial2)
exten => s,n,Dial,${ARG1}/${ARG2}|25|r      ; wenn {ARG2}<>30 läutet nur bei Anschluss {ARG2}
exten => s,n(dial2),NoOp(Hier geht es in allen Fällen weiter)
... und dann noch die CLI:
Code:
    -- Executing [35@app30:1] NoCDR("SIP/30a-000000bb", "") in new stack
    -- Executing [35@app30:2] Macro("SIP/30a-000000bb", "ruf|SIP|35a") in new stack
    -- Executing [s@macro-ruf:1] NoOp("SIP/30a-000000bb", "Wir sind im Macro ruf gelandet") in new stack
    -- Executing [s@macro-ruf:2] GotoIf("SIP/30a-000000bb", "0?dial1") in new stack
    -- Executing [s@macro-ruf:3] Dial("SIP/30a-000000bb", "SIP/35a&IAX2/40a|25|r") in new stack
    -- Called 35a
    -- Called 40a
    -- Call accepted by xx.xxx.xx.xxx (format ulaw)
    -- Format for call is ulaw
    -- IAX2/40a-2322 is ringing
    -- SIP/35a-000000bc is ringing
    -- Hungup 'IAX2/40a-2322'
  == Spawn extension (macro-ruf, s, 3) exited non-zero on 'SIP/30a-000000bb' in macro 'ruf'
  == Spawn extension (app30, 35, 2) exited non-zero on 'SIP/30a-000000bb'
Liegt es vielleicht an den Labels? Müssen diese irgendwo vorher noch als solche deklariert (definiert) werden?
 
Das funktioniert deshalb nicht, weil es ("${ARG2}" = "^30a$") kein REGEX() ist.
Der REGEX() würde so aussehen...
Code:
exten => s,n,GotoIf(${REGEX("^30a$" "${ARG2}")}?dial1)
...aber ich bin mir ziemlich sicher, dass in $ARG2 ungefähr sowas steht: SIP/30a@CONTEXTNAME
Und da kann ANFANG->^30a$<-ENDE als REGEX() gar keinen Treffer liefern.

Liegt es vielleicht an den Labels? Müssen diese irgendwo vorher noch als solche deklariert (definiert) werden?
Ein Goto() springt zu einem Label und ab da gehts stumpf weiter bis zum Ende der Extension.
Wenn du den ${DIALSTATUS} sowieso nicht auswerten tust, dann gehört mindestens unter jedem Dial() als nächste Zeile ein: same => n,Hangup()
...damit nicht stumpf ins nächste Dial() gesprungen wird.

In Post #2 hab ich bereits ein Beispiel für ein Label exit in der letzten Zeile und den Sprung dahin nach dem ersten Dial() gegeben.
...damit wird das dazwischenliegende Dial() mit Label dial1 sauber übersprungen.
...falls das erste Dial() ausgeführt und beendet wurde.
Denn das erste Dial() wird ja nur ausgeführt wenn das GotoIf() nicht nach dial1 springt.
Und wenn dial1 angesprungen wird, wird das erste Dial() niemals ausgeführt.

Vielleicht ist es auch einfacher für dich den BLACKLIST() Mechanismus dafür zu nutzen.
Flexibler ist der auf jeden Fall.
Mach dich also darüber schlau und dann kannst du einfach in der Extension auf Blacklisteintrag prüfen.
Code:
same  => n,GotoIf(${BLACKLIST()}?blacklisted)
...und im Label blacklisted machst du dann das Dial().

Mit der Goto() Logik musst du dich aber dennoch beschäftigen. ;)
 
Zuletzt bearbeitet:
Es will und will einfacht noch nicht. Habe es mit
REGEX("^30a$" "${ARG2}")
und
REGEX("^SIP/30a*" "${ARG2}"
versucht. Ich bekomme einfach keine Übereinstimmung. Mit welchem Befehl kann ich von der CLI den Inhalt von ${ARG2} anzeigen lassen?

Danke für die Nachträge mit den Erläuterungen in #8. Möcht doch herausfinden was exakt in ${ARG2} steht. Wie kann ich dies sichtbar machen?
 
Zuletzt bearbeitet:
Mach einfach ein...
same => n(debug_${CONTEXT}),NoOp(${ARG1} ${ARG2})
...rein, dann wirds im Asterisk CLI ausgegeben.

Für die Anrufernummer nehm ich für gewöhnlich: ${CALLERID(num)}
 
${ARG2} enthält nur "30a" (..wie im Aufruf vom Macro gewünscht). Die CALLERID zeigt die Nummer des Anrufers. Die Bedingung bezieht sich jedoch auf die angerufene Nummer. Aber ... endlich ...die folgende Lösung funktioniert jetzt:
Code:
[macro-ruf]
exten => s,1,NoOp(Wir sind im Macro ruf gelandet)
exten => s,n,GotoIf($["${ARG2}" = "30a"]?dial1:dial2)
exten => s,n(dial1),Dial,${ARG1}/${ARG2}&IAX2/40a|25|r    ; wenn {ARG2}= 30a läutet bei Anschluss 30 und via IAX2 auch bei 40
exten => s,n,Goto(exit)
exten => s,n(dial2),Dial,${ARG1}/${ARG2}|25|r             ; wenn {ARG2}<>30a läutet nur bei Anschluss {ARG2}
exten => s,n(exit),NoOp(Hier geht es in allen Fällen weiter)
exten => s,n,Goto,s-${DIALSTATUS}|1
...
Vielen Dank koyaanisqatsi für Deine Hilfe. Es fehlt halt einfach die Routine wenn nur alle Schaltjahre im Asterisk etwas anzupassen ist. Wünsche Dir noch schöne Festtage und einen guten Rutsch ins 2016.
 
Der Vollständigkeit halber, eine verneinte Übereinstimmung wird mit != abgefragt.

GotoIf($["${ARG2}" != "30a"]?dial2)
 
Danke, rentier-s, für diesen Hinweis. Das != ist mir bei meinen diversen Suchanfragen auch begegnet, konnte aber nirgends eine Erklärung dafür finden.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.