Страница 1 из 2
invalid extension при использовании Goto и s
Добавлено: 04 окт 2023, 12:17
Iskatel
Понадобилось написать диалплан в котором для исходящих фильтрация по экстеншенам осуществляется в одном экстеншене, потом делается Goto в другой экстеншен, и там уже осуществляется постобработка, сделал так:
Код: Выделить всё
[outcalls]
;внутризоновые вызовы
exten => _XXXXXXX,1,Goto(inzone,${EXTEN},1)
;вызовы с использованием ABC и DEF кодов
exten => _83XXXXXXXX.,1,Goto(abcdef,${EXTEN},1)
exten => _84XXXXXXXX.,1,Goto(abcdef,${EXTEN},1)
exten => _88XXXXXXXX.,1,Goto(abcdef,${EXTEN},1)
exten => _89XXXXXXXX.,1,Goto(abcdef,${EXTEN},1)
;международные вызовы
exten => _810X.,1,Goto(international,${EXTEN},1)
;экстренные службы
exten => 100,1,Goto(emergency,${EXTEN},1)
exten => 112,1,Goto(emergency,${EXTEN},1)
[abcdef]
exten => s,1,Dial(SIP/main_asterisk)
exten => s,n,Hangup()
Словил ошибку "sent to invalid extension but no invalid handler", полез в гугл, нашёл кучу аналогичных ситуаций, где авторы используют Goto и экстеншен 's' и везде им объясняют что они не правы, но суть ПОЧЕМУ они не правы не раскрывается, должно же ведь работать, правда должно? Что нужно было написать чтобы было правильно?
Re: invalid extension при использовании Goto и s
Добавлено: 04 окт 2023, 18:30
ded
Потому что экстен s (start) используется в основном в макросах.
В макрос передают параметры, он выполняется, и возвращает результат в ту же точку диаплана, откуда был вызван.
У вас же при вызове
exten => _88XXXXXXXX.,1,Goto(abcdef,${EXTEN},1)
переменная EXTEN получит значение набранного номера, например 8812345678, и согласно указанию Got пойдёт в контекст abcdef и там будет искать себя - 8812345678, чтобы выполнить первый шаг. Но её там нет, там только s.
Конструкция
Dial(SIP/main_asterisk)
вообще безродная, без рук и без ног. Одно слово - инвалид! Отправляю вас читать учебник.
Re: invalid extension при использовании Goto и s
Добавлено: 04 окт 2023, 23:11
Iskatel
Отправляю вас читать учебник.
Так в учебнике же и написано, что 's' использовать правильнее чем '_.' потому что последний будет обрабатывать вообще все экстеншены, включая служебные, что будет приводить к непредсказуемым последствиям. Тогда я вообще не понимаю, если s не означает любые цифры, в том числе и 8812345678, то какой шаблон будет означать любые цифры?
Конструкция
Dial(SIP/main_asterisk)
вообще безродная, без рук и без ног. Одно слово - инвалид!
Ну опустил те параметры функции Dial, которые в квадратных скобках. На других серверах работало. Что, не стоит так писать?
Re: invalid extension при использовании Goto и s
Добавлено: 05 окт 2023, 00:23
ded
s не означает любые цифры, в том числе и 8812345678, можно убедиться вставляя на любом шаге проверку
NoOp(my exten now is ${EXTEN})
Iskatel писал(а):Тогда я вообще не понимаю, если s не означает любые цифры, в том числе и 8812345678, то какой шаблон будет означать любые цифры?
exten => X.,1,
Iskatel писал(а):Что, не стоит так писать?
Не стоит. Учебник много раз указывает на формулу успеха:
Dial(Технология/узел/номер)
то есть
Код: Выделить всё
[abcdef]
exten => _X.,1,Dial(SIP/main_asterisk/${EXTEN})
Re: invalid extension при использовании Goto и s
Добавлено: 05 окт 2023, 16:11
Iskatel
Да, но в шаблон _X. не попадут экстеншены состоящие из одной цифры.
Получается, что задача была: в контексте outcalls выполнить фильтрацию по экстеншенам и переадресовать в другой контекст, а потом из-за особенностей в этом самом другом контексте нужно снова прописывать фильтрацию, весь изначальный смысл теряется.
Re: invalid extension при использовании Goto и s
Добавлено: 05 окт 2023, 17:10
ded
Если у вас всё как в примере (выше), то в контекст abcdef никак не попадают экстеншены, состоящие из одной цифры, а только десятизнак, начинающийся с 83, 84, 88, 89..
Не нужно в этом контексте снова прописывать фильтрацию, Второй раз предлагаю понавставлять везде проверки
NoOp(my exten now is ${EXTEN})
Фильтрацию можно вообще задать одной строкой
Код: Выделить всё
exten => _8[3489]XXXXXXXX.,1,Goto(abcdef,${EXTEN},1)
Как-то вам подучиться нужно ещё, и попрактиковаться.
Зачёт не сдан.
Re: invalid extension при использовании Goto и s
Добавлено: 06 окт 2023, 17:31
Iskatel
Функция NoOp у меня ничего в консоль не пишет, пробовал поставить verbose 9 и debug 9. На другом сервере где asterisk 11 - пишет, а на этом где 16 - не пишет.
Re: invalid extension при использовании Goto и s
Добавлено: 06 окт 2023, 20:35
ded
Не верю. (с)
Re: invalid extension при использовании Goto и s
Добавлено: 07 окт 2023, 22:43
Iskatel
Это уже вышло за рамки изначального вопроса, но короче функция NoOp не работает. Попробовал в дополнении к verbose=9 и debug=9 добавить опцию console=yes, стало сыпаться такое сообщение:
Код: Выделить всё
Executing [891664?????@outcalls:1] NoOp("SIP/???????1015-00000004", "my exten now is 891664?????") in new stack
Но опять же это debug-сообщение, а не NoOp.
Re: invalid extension при использовании Goto и s
Добавлено: 09 окт 2023, 15:01
Zavr2008
Ого как тут всё запущено)))
logger.conf нужно смотреть, там как раз и задается что куда при verbose выводить.
Код: Выделить всё
console => notice,warning,error
;console => notice,warning,error,debug
Так по самой теме тут уже разжевано до нельзя.
Разве только я бы вот так не делал
;международные вызовы
exten => _810X.,1,Goto(international,${EXTEN},1)
Делать лучше
Код: Выделить всё
exten => _810XXXXXXXXX.,1,Goto(international,${EXTEN},1)