Zeilen-Limitierung in Skripten?

Hallo,

wir verwenden im Kontext sub_pre-main eine lange Reihe von GOTOIF-Anweisungen, um eine Art Blacklisting von unerwünschte Anrufer durchzuführen.

Hier ein Auszug aus dem Kontext:

exten => s,n,NOOP("##################### M7 1 ######################")
exten => s,n,GOTOIF($"${CALLERID(num):0:11}" = “07117542260”]?notel,1,1)
exten => s,n,NOOP("##################### M7 2 ######################")
exten => s,n,GOTOIF($"${CALLERID(num):0:9}" = “070316481”]?notel,1,1)
exten => s,n,NOOP("##################### M7 3 ######################")
;exten => s,n,GOTOIF($"${CALLERID(num):0:10}" = “0703120441”]?notel,1,1)
exten => s,n,NOOP("##################### M7 4 ######################")

Die NOOP-Anweisungen haben wir eingebaut, weil der Asterisk die Auswertung des Skripts eigenmächtig abbricht:

-- Executing [s@sub_pre-main:140] NoOp("SIP/d8df0d00146a-00000359", ""##################### M7 1 ######################"") in new stack
-- Executing [s@sub_pre-main:141] GotoIf("SIP/d8df0d00146a-00000359", "0?notel,1,1") in new stack
-- Executing [s@sub_pre-main:142] NoOp("SIP/d8df0d00146a-00000359", ""##################### M7 2 ######################"") in new stack
-- Executing [s@sub_pre-main:143] GotoIf("SIP/d8df0d00146a-00000359", "0?notel,1,1") in new stack
-- Executing [s@sub_pre-main:144] NoOp("SIP/d8df0d00146a-00000359", ""##################### M7 3 ######################"") in new stack
-- Executing [98@mdc_multidial-98:1] Set("Local/98@mdc_multidial-98-00000865;2", "__MDC_CALLEE_USER_ID=8") in new stack
-- Executing [98@mdc_multidial-98:2] Set("Local/98@mdc_multidial-98-00000865;2", "__PICKUPMARK=98") in new stack

Entferne ich die beiden ersten NOOP-Anweisungen, dann geht die Auswertung zwei Zeile weiter:

-- Executing [s@sub_pre-main:141] GotoIf("SIP/d8df0d00146a-00000369", "0?notel,1,1") in new stack
-- Executing [s@sub_pre-main:142] NoOp("SIP/d8df0d00146a-00000369", ""##################### M7 4 ######################"") in new stack
-- Executing [s@sub_pre-main:143] GotoIf("SIP/d8df0d00146a-00000369", "0?notel,1,1") in new stack
-- Executing [s@sub_pre-main:144] GotoIf("SIP/d8df0d00146a-00000369", "0?notel,1,1") in new stack

Gibt es ein Limit, das dafür sorgt, dass maximal 144-Zeilen ausgewertet werden?

Gruss,

Stefan

Guten Morgen Stefan,

was meinst du mit ausgewertet werden. Kannst du nicht mehr als 144 Zeilen im Skript selbst speichern oder wird der Dialplan beschnitten. Was sagt die Ausgabe dialplan show sub_pre-main?

Alternativ dazu, hast du dir die Funktion BLACKLIST schon einmal angeschaut, siehe auch https://wiki.asterisk.org/wiki/display/AST/Asterisk+11+Function_BLACKLIST

Grüße
Markus

Guten Morgen Markus,

“dialplan show sub_pre-main” endet bei Zeile 394 mit einem RETURN() und enthält unter anderem:

                144. GOTOIF($"${CALLERID(num):0:9}"  = "070316481"]?notel,1,1) [pbx_config]
                145. NOOP("##################### M7 4 ######################") [pbx_config]
                146. GOTOIF($"${CALLERID(num):0:10}" = "0703164825"]?notel,1,1) [pbx_config]
                147. GOTOIF($"${CALLERID(num):0:8}" = "07116645"]?notel,1,1) [pbx_config]
                148. GOTOIF($"${CALLERID(num)}" = "02241925350"]?notel,1,1) [pbx_config]
                149. GOTOIF($"${CALLERID(num)}" = "01706348021"]?notel,1,1) [pbx_config]
                150. GOTOIF($"${CALLERID(num)}" = "07231280185"]?notel,1,1) [pbx_config]

Ich habe mich schon gefragt, ob ich irgendwo einen Tippfehler habe. Aber zum einen finde ich keinen, zum anderen ist es seltsam, dass auch nach Entfernen von zwei Zeilen die Auswertung lediglich um die nächsten zwei Zeilen fortschreitet.

BLACKLIST blockiert mir, soweit ich es verstehe, nur genau eine Nummer. Mit dem GOTOIF-Konstrukt verwende ich nur die Vorwahl und die Stammrufnummer und erledige damit gleich das ganze CallCenter.

Gruss,

Stefan

Re Stefan,

also im Commander ist das Skript vollständig gespeichert.
Ich gehe jetzt davon aus, dass es in deinem Skript nur eine Return-Anweisung gibt und somit das Skript auch vollständig im Dialplan geladen ist.

Wenn ich dich recht verstehe, bricht jetzt der Anruf irgendwo innerhalb der Routine sub_pre-main ab. Bleibt der Anruf hängen, wird aufgelegt oder was passiert anschließend mit dem Anruf?

Grüße
Markus

Hallo Markus,

ja, es gibt nur eine RETURN() Anweisung.

Nach dem “Abbruch” wird der Anruf ganz normal weitergeleitet:

– Executing [s@sub_pre-main:144] NoOp(“SIP/d8df0d00146a-00000359”, “”##################### M7 3 ######################"") in new stack
– Executing [98@mdc_multidial-98:1] Set(“Local/98@mdc_multidial-98-00000865;2”, “__MDC_CALLEE_USER_ID=8”) in new stack
– Executing [98@mdc_multidial-98:2] Set(“Local/98@mdc_multidial-98-00000865;2”, “__PICKUPMARK=98”) in new stack

Gruss,

Stefan

Re,

kannst du mir das komplette Skript mal schicken, dann teste ich mal was.

Grüße
Markus

Hallo Stefan,

ich habs mir mal angeschaut. Bei meinem Test werden werden mir in der console 162 Zeilen angezeigt. Im Dialplan ist das komplette Skript geladen und es kommt auch zur Ausführung. Setzte einfach mal ein Playback(tt-monkeys) vor die Return-Anweisung. Es werden nur nicht alle Informationen in der console ausgegeben.

Bei der Vielzahl der Rufnummern könnte ich mir vorstellen, das per AGI und einen Regular-Expression zu lösen. Je nach Ergebnis könntest du dir im AGI einen bestimmten Wert in eine Variable schreiben und diesen dann im Dialplan prüfen und entsprechend auf deine notel, nofax, ring-Kontext verweisen. Könntest auch eine Datei mit den Rufnummern oder DB mit einbinden.

Oder du schreibst alles in die interne Asterisk DB und iterierst im Dialplan darüber, ginge wohl auch - quasi manuelle BLACKLIST Funktion.

Grüße
Markus

Hallo Markus,

Danke für die Analyse. Dann werde ich mir ein AGI-Skript bauen, dazu eine Textdatei und den Vergleich darüber laufen lassen.

Gruss,

Stefan