Konfigurace Asterisku (9) - Skoky v dialplanu

Asteriski vykonává příkazy v dialplanu sekvenčně podle priority. Průběh zpracování lze změnit pomocí příkazu skoku. Ukážeme si nepodmíněné i podmíněné skoky. Pomocí podmíněných skoků se dají implementovat i cykly. Ve spojení s proměnnými lze dialplan Asterisku použít jako programovací jazyk.

Nepodmíněný skok - Goto

Nepodmíněný skok se provádí pomocí příkazu Goto. Má celkem tři možné podoby. Nejjednodušší je skok na jinou prioritu.

Goto(priority)

Při tomto skoku se nemění telefonní číslo použité pro vyhledávání pravidel ani kontext. V následující ukázce bude ústředna při volání na číslo 999 přehrávat hlášku "Hello world" neustále dokola, až dokud volající nezavěsí. Goto(2) skočí vždy na příkaz Playback.

[sluzby]

exten => 999,1,Answer()
exten => 999,2,Playback(hello-world)
exten => 999,3,Goto(2)

Druhá varianta je skok, který zároveň mění i telefonní číslo použité pro vyhledávání pravidel:

Goto(name, priority)

Následující příklad nejprve přehraje hlášku digit/1 (anglická číslovka one) a teprve poté skočí na druhé pravidlo pro zpracování volaného čísla 999. Asterisk pak opět začne přehrávat hlášku hello-world pořád dokola. Podobnými triky se můžete zbavit duplicitních částí dialplanu.

exten => 888,1,Answer()
exten => 888,2,Playback(digits/1)
exten => 888,3,Goto(999,2)

Třetí varianta je skok na jinou prioritu, číslo i kontext.

Goto(context, name, priority)
[reklamace]

exten => 888,1,Goto(sluzby,999,1)

Návěští

U každé ze tří variant Goto lze místo čísla priority použít label, česky návěští. V principu jde o nahrazení čísla jménem. Použití je zřejmé z příkladu:

exten => 999,1,Answer()
exten => 999,n(znovu),Playback(hello-world)
exten => 999,n,Goto(999,znovu)

Podmíněné skoky

Podmíněný skok umožňuje řídit zpracování dialplanu na základě hodnot proměnných. Syntaxe je následující:

GotoIf(podmínka?label1)

nebo

GotoIf(podmínka?label1:label2)

Je-li podmínka splněna, je proveden skok na label1. Není-li splněna, je proveden skok na label2. label1 a label2 mají úplně stejný tvar jako argumenty příkazu Goto. Může to být jen priorita, nebo dvojice name,priority, nebo trojice context,name,priority. Lze použít i návěští.

Podmínka je řetězec. Hodnota "0" nebo prázdný řetězec "" se vyhodnotí jako nesplněno a skočí se na label2 (je-li přítomen). Jakákoliv jiná hodnota podmínky se vyhodnotí jako splněno a provede se skok na label1. Podmínka může být buď přímo proměnná, nebo i složitější výraz. Nejčastěji se příkaz GotoIf používá se speciální konstrukcí $[...].

exten => 999,1,Answer()
exten => 999,n,Set(i=0)
exten => 999,n(skok),Playback(digits/${i})
exten => 999,n,Set(i=$[${i} + 1])
exten => 999,n,GotoIf($[${i} < 10]?skok)
exten => 999,n,Hangup()

Tento příklad přeříká všechny číslice od 0 do 9 a zavěsí. Skok se provede jen tehdy, je-li v proměnné i uloženo číslo menší než 10. Výraz uvnitř $[...] může mít mnoho variant a vrátíme se k němu v nějakém pokračování seriálu. Na závěr si uvedeme alespoň příklad porovnávání řetězců, který se často používá:

exten => 999,n,GotoIf($["${CALLERID(name)}" =  "Krakonos"]?krakonosovo,999,1)