Crmgo Блог

AEL в asterisk

AEL в asterisk

у звичайному форматі: ; А ось так цей самий контекст виглядатиме в синтаксисі ael: Отже, відмінності очевидні. Для мене однією з головних переваг ael є зручність читання конфігу: навіть на цьому маленькому абстрактному прикладі видно, що читати й розуміти…

AEL в asterisk

у звичайному форматі:
;

[internal]
exten => s,1,Answer
exten => s,n,Background(someivr)
exten => s,n,Read(intgroup,,3)
exten => s,n,Goto(${intgroup},1)
exten => XXX,1,Dial(SIP/${EXTEN})
exten => XXX,n,HangUp

А ось так цей самий контекст виглядатиме в синтаксисі ael:

context internal {
	s=> {
		Answer;
		Background(someivr);
		Read(intgroup,,3);
		Goto(${intgroup},1);
	}
	XXX => {
		Dial(SIP/${EXTEN});
		HangUp;
	}
}


Отже, відмінності наявні. Для мене однією з головних переваг ael є зручність читання конфігу: навіть на цьому маленькому абстрактному прикладі видно, що читати й розуміти конфіг простіше. Хоча, припускаю, що це суб'єктивно. Друге, що відразу впадає в око — це відсутність пріоритету (s,n у коді вище, щоправда, як помітили в коментарях, пріоритет і там уже не обов'язковий) в описі dialplan'а.
Чому їх немає? Точніше, чому вони є в описі звичайного dialplan'а?
Якщо ви не мали до цього справи з астеріском і з його звичайним dialplan'ом, то ви будете здивовані, дізнавшись що в ньому немає ні циклів, ні умов. Є лише умовний перехід (gotoif), за допомогою якого, в принципі, можна організувати навіть цикли, але зручність цього підходу вельми сумнівна. Давайте уявимо собі найпростіший ael код, який буде виводити в консоль астеріска true або false:

if(${var}=foo) {
	NoOp(true);
}
else {
	NoOp(false);
}

У звичайному вигляді ця умова виглядатиме так:

exten=>1,1,GotoIf($[${var}=foo]?label1:label2)
exten=>1,n(label1),NoOp(true)
exten=>1,n,Goto(end_of_if)
exten=>1,n(label2),NoOp(false)
exten=>1,n(end_of_if),...

Мало того, що ми втратили «читабельність», так ще й змушені або статично прописувати всюди пріоритети (і отримати абсолютно нерозширюваний код), або вигадувати мітки на кожен чх. Так, в ael теж є мітки, тільки потреба в них практично зникає, оскільки синтаксис дозволяє піти від goto як такого.

s=> {
	Answer;
	somelabel:
		HangUp;
}

Крім безпосередньо умов (if/else) в ael ви можете використовувати і оператор switch зі звичним синтаксисом:

 _777X => {
         switch (${EXTEN}) {
              pattern N11:
                   NoOp(You called a N11 number-- ${EXTEN});
                   break;
              case 7771:
                   NoOp(You called 7771!);
                   break;
              case 7772:
                   NoOp(You called 7772!);
                   break;
              case 7773:
                   NoOp(You called 7773!);
                   // fall thru-
              default:
                   NoOp(In the default clause!);
         };

Примітка: матеріал міг бути створений за підтримки ШІ з подальшою людською редакцією. Відповідальний за зміст: Dmytro Lomaka, Kaltenkirchen.