Syntax GosubIf

Mansaylon

Neuer User
Mitglied seit
7 Mai 2007
Beiträge
158
Punkte für Reaktionen
1
Punkte
18
Hallo Zusammen

Kann man aus einer Subroutine eine weitere Subroutine mit GosubIf aufrufen?

Wenn ja, wie ist die Syntax?
Es will mir irgendwie nicht gelingen ;(
Folgendes Beispiel ist auf jede Fall nicht funktionsfähig:

Code:
[subAnruf]
exten => s,1,NoOp(Caller-ID: ${CALLERID(num)})
same => n,Gosubif($["${ARG3}" = "n"]?go00)                      ; wenn Nummer nicht in Betrieb
same => n,Dial(${ARG1},30,Ttr)
same => n,Gosubif(${ARG2}=${ARG2}?go${ARG2})            ; Weiterleitung nach Zeit (30 Sek)
same => n,Playback(silence/1&pls-try-call-later)
same => n,Hangup()

exten => go50,1,NoOp("***** Hauptnummer 50 / Weiterleitung Christ *****")
exten => go50,n,Playback(silence/1&transfer)
exten => go50,n,NoOp(SIP/GSM1 hat den Status ${DEVICE_STATE(SIP/GSM1)})
exten => go50,n,GotoIf($[${DEVICE_STATE(SIP/GSM1)}=NOT_INUSE]?go50G)
exten => go50,n,Dial(SIP/0760000000@Voip,20,r)
exten => go50,n,Return()
exten => go50,n(go50G),Dial(Sip/0760000000@GSM1,20,r)
exten => go50,n,Return()
 
Zuletzt bearbeitet:
Die Syntax von allen Goto und Gosub ist immer [[Context,]Exten,]Priority

Um zB. in die exten=>go50 zu kommen musst Du nach go${ARG2},1 springen. go${ARG2} interpretiert Asterisk als Priorität bzw. Label innerhalb der aktuellen exten.
 
Was würde man nur machen, wärst Du nicht im Forum ;-)
Danke.... werde es testen und Feedback geben.

Ich kann nach dem 1.
exten => go50,1,....

auch mit same => weiter fahren?
 
Zuletzt bearbeitet:
Ja ich finde auch, jedes Forum sollte mindestens eine Blondine haben, Quotenregelung sozusagen ;-)
Aber ich bin mir sicher, jemand anderes würde dann die Frage beantworten. Abgesehen davon steht das auch alles im manual :cool:

"same=>" ist eine Abkürzung für "exten=>wie_zeile_zuvor," und kann so immer und überall verwendet werden. Mehr dazu
 
Mit der Anleitung hast Du natürlich recht.... doch a) ist sie in englisch gehalten, was ab und zu nicht immer einfach ist und b) sind die Erklärungen ebenfalls nicht immer wirklich nachvollziehbar, weshalb man unter anderem auch froh ist, ein deutschsprachiges Forum zu haben, wo kompetente Leute anzutreffen sind.

Leider wurde seit Version 1.6 kein neues deutschsprachiges Buch mehr heraus gebracht. Auch wenn das Meiste noch aus den alten Büchern anwendbar ist, wünschte ich mir doch eine Neuauflage, wo die diversen Erneuerungen und auch Syntaxänderungen an einem Ort nachschlagbar wäre.

Und bevor ich hier eine Frage absetze, habe ich sicher lange selber im Netz gesucht und auch viele erfolglose Versuche/Tests gemacht.

Meine ursprüngliche Frage betr. GosubIf konnte ich jetzt lösen und sieht wie folgt aus:
Code:
[subAnruf]
exten => s,1,NoOp(Caller-ID: ${CALLERID(num)})
same => n,Gosubif($["${ARG3}" = "n"]?go00)                      ; wenn Nummer nicht in Betrieb
same => n,Dial(${ARG1},30,Ttr)
same => n,Gosubif(${ARG2}=${ARG2}?go${ARG2},1)          ; Weiterleitung nach Zeit (30 Sek)
same => n,Playback(silence/1&pls-try-call-later)
same => n,Hangup()

exten => go50,1,NoOp("***** Hauptnummer 50 / Weiterleitung Christ *****")
same => n,Playback(silence/1&transfer)
same => n,NoOp(SIP/GSM1 hat den Status ${DEVICE_STATE(SIP/gsm1)})
same => n,GotoIf($[${DEVICE_STATE(SIP/gsm1)}=NOT_INUSE]?go50G)
same => n,Dial(SIP/0760000000@Voip,20,r)
same => n,Return()
same => n(go50G),Dial(SIP/0760000000@gsm1,20,r)
same => n,Return()
.
.
 
War doch nicht böse gemeint :oops:

Du hast noch zwei Syntaxfehler in dem Code. Zumindest gibt es innerhalb der exten=>s kein Label go00, deshalb denke ich willst Du hier auch nach exten=>go00,1.

Code:
same => n,Gosubif($["${ARG3}" = "n"]?go00[B][COLOR=#ff0000],1[/COLOR][/B])                      ; wenn Nummer nicht in Betrieb
...
same => n,Gosubif([B][COLOR=#ff0000]$[[/COLOR][/B]${ARG2}=${[COLOR=#800080]ARG2[/COLOR]}[B][COLOR=#ff0000]][/COLOR][/B]?go${ARG2},1)          ; Weiterleitung nach Zeit (30 Sek)

Außerdem wird If ARG2=ARG2 immer zutreffen.
 
Danke für die Hinweise.... funktioniert zwar so.... aber wenn schon, dann richtig fehlerfrei ;-)

go00 ist weiter unten vorhanden.

Der GosubIf, welcher aktuell immer wahr ist, soll so lediglich vorbereitend für eine weitere Funktion sein. So würde ein normaler Gosub natürlich auch reichen.
 
Kann man bei einem Gosubif eine AND Verknüpfung machen.... so in der Art: wenn a=1 and b=2

Wenn ja, wie?

Code:
same => n,Gosubif($["${ARG4}" = "a","${CALLERID(num)} = "Anonymous"]?go_a,1)
Das funktioniert schon mal nicht.
 
Zuletzt bearbeitet:
Moin


Nicht direkt, dokumentiert ist nur...
Code:
GosubIf([COLOR=red]condition[/COLOR]?[labeliftrue:[labeliffalse]])
...aber mit RegEx() kannst du die Bedingung (condition) genau auf 1 und 2 prüfen lassen...
REGEX("[1-2]" ${ARG4})
Ergebnis: 1 (wahr) oder 0 (nicht wahr)
http://das-asterisk-buch.de/1.6/functions-regex.html
Bau also ein RegEx() was darauf prüft in dein GoSubIf() als condition ein.


PS: RegEx() ist eine mächtige Sache
 
Zuletzt bearbeitet:
Ui.... ich steh mir wohl gerade selber auf dem Schlauch..... aber im Moment habe ich damit keinen Durchblick.
 
Macht nichts.

Hab grad erst geschnallt, dass du zwei Variablen testen willst.
Normalerweise wird sowas mit && gemacht, und nicht mit einem Komma.
Leider hab ich das in GoSubIf(condition && condition?iftrue:iffalse) nicht hingekriegt.

Wenn && und || nicht unterstützt werden, dann bleibt nur vom ersten GoSubIf() in ein zweites, gelabeltes zu springen, für die zweite Prüdung.
Code:
same => n(test1),GoSubIf(condition?test2)
...
same => n(test2),GoSubIf(condition?action)
...
Wenn beide wahr sind, wird zu action gesprungen.

Edit
Quatsch, && funktioniert, hatte in einer vorangegangenen Zeile einen Fehler.

Beispiel:
Code:
same => n,Set(a="1")
same => n,Set(b="2")
same => n,GoSubIf($[${a} = "1" && ${b} = "2"]?labeliftrue:labeliffalse)
same => n,Goto(labeliffalse)
 
Zuletzt bearbeitet:
Vielen Dank.... so einfach... und nirgends beschrieben ;-)
 
Bei mir sieht es jetzt wie folgt aus und es funktioniert:

Code:
Gosubif($["${ARG4}" = "a" && "${CALLERID(num)}" = "Anonymous"]?go_a,1)

- - - Aktualisiert - - -

Und gleich nochmals eine Knacknuss..... der Gosubif hat es mir offenbar angetan ;-)

Kann ich auch ein Argument mit dem Gosubif mitgeben, wie bei einem normalen Gosub?

- - - Aktualisiert - - -

Habe das Ganze jetzt mal mit einer globalen Variable gelöst.
Danach wird die Gosubif Funktion ausgeführt, wo ich offenbar kein Argument mitgeben kann.
Code:
same => n,Set(GLOBAL(FOO)=${ARG2})
same => n,Gosubif($["${LEN(${ARG2})}" = "3"]?goab,1)

Am Sprungort lese ich dann einfach die Variable FOO wieder aus.
Ob dies wirklich eine saubere Lösung ist, weiss ich nicht...... es funktioniert auf jeden Fall mal.
 
@rentier-s: Da hab ich ja nochmal Glück gehabt :mrgreen:
Der Hinweis ist aber wichtig.
Da eben auch der Datentyp (String oder Integer) beachtet wird.


Du kannst das SET() im GoSubIf() einsetzen...
Code:
same  => n,GoSubIf($[${REGEX("^100[3-9]$" ${CALLERID(num)})} && ${SET(GOSUBIFSTATUS="TRUE")}]?einszwei:drei)
...weil Rückgabewert von SET() wohl immer wahr/true ist muss hier auch nicht mit = oder != verglichen werden.

Das SET() muss auch nicht unbedingt GLOBAL() sein.
 
Zuletzt bearbeitet:
Globale Variablen sollte man niemals für Channel-spezifische Werte verwenden. Je mehr Channel gleichzeitig verarbeitet werden, umso größer die Wahrscheinlichkeit, dass einer dem anderen dazwischen funkt.

Ich hätte naiv wie ich bin behauptet, Gosubif hat die gleiche Syntax wie Gosub, also kann man auch genau so Argumente in Klammern mitgeben. Probier das doch einfach mal.
 
Moin

Stimmt, im deutschen Asterisk-Buch fehlt die Info, aber...
http://www.voip-info.org/wiki/view/Asterisk+cmd+GosubIf
...dokumentiert das richtig.

Also mal testen mit 2x && (and) 1x || (or) und 1 Argument fürs "label if true"...
Code:
exten => 500,1(testext),Answer(500)
same  => n(start),Verbose(Caller: ${CALLERID(all)})
same  => n,TrySystem(/etc/asterisk/osmc_notify.sh \"${CALLERID(name)} (${CALLERID(num)}) ruft\" "${EXTEN}")
same  => n,GoSubIf($[${REGEX("^100[3-9]$" ${CALLERID(num)})} && ${EXTEN} = 500 && ${SET(GOSUBIFSTATUS="TRUE")} || "${CALLERID(name)}" = "Mobilteil 1"]?einszwei([COLOR=red]${EPOCH}[/COLOR]):drei)
same  => n,GoTo(drei)
same  => n(einszwei),SET(MYVAR=${SHELL(/bin/sh /etc/asterisk/cmdret [COLOR=red]${ARG1}[/COLOR])})
same  => n,Verbose(MYVAR: "${MYVAR}")
same  => n,SendText("${CALLERID(all)}": "${MYVAR}")
same  => n,Playback(vm-theperson)
same  => n,SayDigits(${EXTEN})
same  => n,Playback(vm-isonphone)
same  => n(drei),Verbose(GOSUBIFSTATUS: ${GOSUBIFSTATUS})
Was macht das GoSubIf() in dieser Extension?
1. Prüfung (Integer) auf Anrufer: Nur 1003-1009 erlaubt
2. Prüfung auf gewählte (Integer) Nummer: 500
3. Ein SET() (wird immer ausgeführt)
4. Ausnahme (String): "${CALLERID(name)}" = "Mobilteil 1"
...kommt immer durch.
Wenn die Prüfung positiv war wird einszwei mit Argument ${EPOCH} (Integer) aufgerufen.
...und wird dann als ${ARG1} (Integer) ausgewertet/weiterverarbeitet.

Das erfolgreiche GoSubIf() sieht in der Asteriskkonsole so aus...
Code:
GosubIf("SIP/1003-00000052", "1?einszwei(1475921340):drei") in new stack
...und noch einmal, wenn "Mobilteil 1" anruft...
Code:
GosubIf("SIP/1000-00000056", "1?einszwei(1475946796):drei") in new stack
...hier greift das || (or), weil die Anrufernummer nicht 1003-1009 ist.
 
Zuletzt bearbeitet:
Kaum zu glauben... aber ich habe es doch tatsächlich hinbekommen mit dem Gosubif ein Argument mit zu geben :D

Code:
same => n,Gosubif($["${LEN(${ARG2})}" = "3"]?goab,1(${ARG2}))
Wenn man weiss, wo man die Klammer mit dem Argument setzen muss, ist es wirklich einfach.
Schade dass man dies wirklich nirgends findet. Vermutlich geht man einfach davon aus, dass niemand Noob genug ist, um dies nicht zu wissen ;)
 
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.