URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 97021
[ Назад ]

Исходное сообщение
"Asterisk помощь с dialplan"

Отправлено Shodan , 17-Окт-17 18:55 
Подскажите как стандартными средствами астериска реализовать такую логику

если CID такой то - звоним через такого провайдера
если CID такой то - звоним через другого провайдера

Например

exten => _[+0-9]X.,1,NoOp()
same => n,Set(sip=${IF($["${CALLERID(num)}" = "+12345"]?sip_trunk1)})
same => n,Set(sip=${IF($["${CALLERID(num)}" = "+67891"]?sip_trunk2)})
same => n,Dial(SIP/${sip}/${EXTEN})

Проблема в том что астериск смотрит только на первое правило с IF и дальше уже не проверяет
Можно ли реализовать цикличную проверку по всем IF-ам?


Содержание

Сообщения в этом обсуждении
"Asterisk помощь с dialplan"
Отправлено Andrey , 17-Окт-17 22:44 
>[оверквотинг удален]
> если CID такой то - звоним через такого провайдера
> если CID такой то - звоним через другого провайдера
> Например
> exten => _[+0-9]X.,1,NoOp()
> same => n,Set(sip=${IF($["${CALLERID(num)}" = "+12345"]?sip_trunk1)})
> same => n,Set(sip=${IF($["${CALLERID(num)}" = "+67891"]?sip_trunk2)})
> same => n,Dial(SIP/${sip}/${EXTEN})
> Проблема в том что астериск смотрит только на первое правило с IF
> и дальше уже не проверяет
> Можно ли реализовать цикличную проверку по всем IF-ам?

Вы используете в операторе IF только одно условие - true. Попробуйте использовать переход по false


"Asterisk помощь с dialplan"
Отправлено Shodan , 17-Окт-17 22:59 
>[оверквотинг удален]
>> Например
>> exten => _[+0-9]X.,1,NoOp()
>> same => n,Set(sip=${IF($["${CALLERID(num)}" = "+12345"]?sip_trunk1)})
>> same => n,Set(sip=${IF($["${CALLERID(num)}" = "+67891"]?sip_trunk2)})
>> same => n,Dial(SIP/${sip}/${EXTEN})
>> Проблема в том что астериск смотрит только на первое правило с IF
>> и дальше уже не проверяет
>> Можно ли реализовать цикличную проверку по всем IF-ам?
> Вы используете в операторе IF только одно условие - true. Попробуйте использовать
> переход по false

Как раз false не хотело бы использовать, хотелось чтобы астер шел сверху вниз по ифам, и если тру, то прекращал поиск.
Я сейчас сделал через gotoif, но вышло более громоздко


"Asterisk помощь с dialplan"
Отправлено mmm62 , 18-Окт-17 05:27 
Все уже придумано
exten => куда/кто

У ненадо с if извращаться


"Asterisk помощь с dialplan"
Отправлено Shodan , 18-Окт-17 19:07 
> Все уже придумано
> exten => куда/кто
> У ненадо с if извращаться

Да, проглядел, этот вариант подходит

Other options for defining extensions include an option commonly referred to as the ex-girlfriend logic. This logic matches the dialed extension irrespective of its origin based on the callerid of the person calling it


"Asterisk помощь с dialplan"
Отправлено Shodan , 19-Окт-17 14:09 
> Все уже придумано
> exten => куда/кто
> У ненадо с if извращаться

Хотя как-то странно это работает, на одних правилах работает, на других нет, так и не понял причину.


"Asterisk помощь с dialplan"
Отправлено mmm62 , 19-Окт-17 14:21 
>> Все уже придумано
>> exten => куда/кто
>> У ненадо с if извращаться
> Хотя как-то странно это работает, на одних правилах работает, на других нет,
> так и не понял причину.

ищите причину в callerid


"Asterisk помощь с dialplan"
Отправлено Shodan , 19-Окт-17 17:35 
>>> Все уже придумано
>>> exten => куда/кто
>>> У ненадо с if извращаться
>> Хотя как-то странно это работает, на одних правилах работает, на других нет,
>> так и не понял причину.
> ищите причину в callerid

Например есть такой дайлплан

exten => _[+0-9]X.,1,NoOp
same => n,NoOp(CID ${CALLERID(num)})
same => n,Dial(SIP/1234/test_trunk1/${EXTEN})
same => n,Dial(SIP/5678/test_trunk2/${EXTEN})
same => n,Hangup()

Астериск всегда срабатывает на первое правило same => n,Dial(SIP/1234/test_trunk1/${EXTEN})
Хотя noop показывает что CID 5678


"Asterisk помощь с dialplan"
Отправлено Andrey , 20-Окт-17 08:30 
>[оверквотинг удален]
>>> так и не понял причину.
>> ищите причину в callerid
> Например есть такой дайлплан
> exten => _[+0-9]X.,1,NoOp
> same => n,NoOp(CID ${CALLERID(num)})
> same => n,Dial(SIP/1234/test_trunk1/${EXTEN})
> same => n,Dial(SIP/5678/test_trunk2/${EXTEN})
> same => n,Hangup()
> Астериск всегда срабатывает на первое правило same => n,Dial(SIP/1234/test_trunk1/${EXTEN})
> Хотя noop показывает что CID 5678

Здесь: https://www.voip-info.org/wiki/view/Asterisk+config+extensio...
в разделе Example.



"Asterisk помощь с dialplan"
Отправлено Shodan , 20-Окт-17 10:40 
>[оверквотинг удален]
>> Например есть такой дайлплан
>> exten => _[+0-9]X.,1,NoOp
>> same => n,NoOp(CID ${CALLERID(num)})
>> same => n,Dial(SIP/1234/test_trunk1/${EXTEN})
>> same => n,Dial(SIP/5678/test_trunk2/${EXTEN})
>> same => n,Hangup()
>> Астериск всегда срабатывает на первое правило same => n,Dial(SIP/1234/test_trunk1/${EXTEN})
>> Хотя noop показывает что CID 5678
> Здесь: https://www.voip-info.org/wiki/view/Asterisk+config+extensio...
> в разделе Example.

Да, ошибся
Я сделал так, немного более компактно

exten => _[+0-9]X.,1,NoOp
same => n,NoOp(CID ${CALLERID(num)})
same => n,Set(cid=${CALLERID(num)})
same => n,GotoIf($["${cid}" = "7777"]?dial1)
same => n,GotoIf($["${cid}" = "55555"]?dial3)
same => n,GotoIf($["${cid}" = "66666"]?dial2)
same => n(dial1),Dial(SIP/trunk1/${EXTEN})
same => n(dial3),Dial(SIP/trunk3/${EXTEN})
same => n(dial2),Dial(SIP/trunk2/${EXTEN})
same => n,Hangup()


"Asterisk помощь с dialplan"
Отправлено Andrey , 20-Окт-17 10:53 
>[оверквотинг удален]
> exten => _[+0-9]X.,1,NoOp
> same => n,NoOp(CID ${CALLERID(num)})
> same => n,Set(cid=${CALLERID(num)})
> same => n,GotoIf($["${cid}" = "7777"]?dial1)
> same => n,GotoIf($["${cid}" = "55555"]?dial3)
> same => n,GotoIf($["${cid}" = "66666"]?dial2)
> same => n(dial1),Dial(SIP/trunk1/${EXTEN})
> same => n(dial3),Dial(SIP/trunk3/${EXTEN})
> same => n(dial2),Dial(SIP/trunk2/${EXTEN})
> same => n,Hangup()

Хозяин - барин. Только у вас есть уверенность, что через год этих проверок не будет под пол сотни? В этой схеме у вас на каждый callerid по 2 строки - gotoif и dial.

В данном решении, если _звонящий_, который пройдет через dial1, не положит трубку, то с большой вероятностью звонок пойдет повторяться через dial2,dial3.


"Asterisk помощь с dialplan"
Отправлено Shodan , 20-Окт-17 11:06 
>[оверквотинг удален]
>> same => n,GotoIf($["${cid}" = "66666"]?dial2)
>> same => n(dial1),Dial(SIP/trunk1/${EXTEN})
>> same => n(dial3),Dial(SIP/trunk3/${EXTEN})
>> same => n(dial2),Dial(SIP/trunk2/${EXTEN})
>> same => n,Hangup()
> Хозяин - барин. Только у вас есть уверенность, что через год этих
> проверок не будет под пол сотни? В этой схеме у вас
> на каждый callerid по 2 строки - gotoif и dial.
> В данном решении, если _звонящий_, который пройдет через dial1, не положит трубку,
> то с большой вероятностью звонок пойдет повторяться через dial2,dial3.

Нет, не будет
Будет несколько openvox железок, на каждую будет свой контекст, где будет максимум пять проверок. Если звонок пойдет повторяться это ок


"Asterisk помощь с dialplan"
Отправлено mmm62 , 21-Окт-17 16:06 
>>>> Все уже придумано
>>>> exten => куда/кто
> exten => _[+0-9]X.,1,NoOp
> same => n,NoOp(CID ${CALLERID(num)})
> same => n,Dial(SIP/1234/test_trunk1/${EXTEN})
> same => n,Dial(SIP/5678/test_trunk2/${EXTEN})
> same => n,Hangup()
> Астериск всегда срабатывает на первое правило same => n,Dial(SIP/1234/test_trunk1/${EXTEN})
> Хотя noop показывает что CID 5678

должно быть так
exten => _[+0-9]X./1234,1,Dial(SIP/test_trunk1/${EXTEN})
exten => _[+0-9]X./5678,1,Dial(SIP/test_trunk2/${EXTEN})


"Asterisk помощь с dialplan"
Отправлено Andrey , 18-Окт-17 08:21 
>[оверквотинг удален]
>>> same => n,Set(sip=${IF($["${CALLERID(num)}" = "+67891"]?sip_trunk2)})
>>> same => n,Dial(SIP/${sip}/${EXTEN})
>>> Проблема в том что астериск смотрит только на первое правило с IF
>>> и дальше уже не проверяет
>>> Можно ли реализовать цикличную проверку по всем IF-ам?
>> Вы используете в операторе IF только одно условие - true. Попробуйте использовать
>> переход по false
> Как раз false не хотело бы использовать, хотелось чтобы астер шел сверху
> вниз по ифам, и если тру, то прекращал поиск.
> Я сейчас сделал через gotoif, но вышло более громоздко

Зачем вам последовательная проверка по всем условиям if? Допустим астер нашел совпадение по _первому_ if, присвоил переменной значение. И пошел дальше проверять все ваши if. Сколько их у вас в продакшене, больше трех? Сколько их будет через пол года-год-два?
Понимаю что процессорные мощности сейчас очень дешевы, но я бы наказывал за такую логику рублем.

Если у вас больше 3 проверок if то вообще оптимально вынести в табличку ваши callerid--sip. Добавился callerid - не нужно перегружать dialplan.


"Asterisk помощь с dialplan"
Отправлено PavelR , 20-Окт-17 07:32 
> Подскажите как стандартными средствами астериска реализовать такую логику
> если CID такой то - звоним через такого провайдера
> если CID такой то - звоним через другого провайдера

а можно уточняющий вопрос: вы используете CID - это вами подразумевается вызывающий или вызываемый?



"Asterisk помощь с dialplan"
Отправлено mmm62 , 21-Окт-17 11:21 
боевой пример диалплана

; запрет межгорода номерам 1701 1702 1901
exten =>_8XXXXXXXXXX/1701,1,Hangup()
exten =>_8XXXXXXXXXX/1702,1,Hangup()
exten =>_8XXXXXXXXXX/1901,1,Hangup()
; запрет города номерам 1701 1702 1901
exten =>_XXXXXXX/1701,1,Hangup()
exten =>_XXXXXXX/1702,1,Hangup()
exten =>_XXXXXXX/1901,1,Hangup()
; все номера из бухгалтерии начинающиеся с 33хх звонят по своей линии
exten =>_83472XXXXXX/_33XX,1,Dial(SIP/u2825432538/${EXTEN},60)
; 3301 звонит только по своей персональной линии
exten =>_83472XXXXXX/_3301,1,Dial(SIP/ufanet89/${EXTEN},60)


"Asterisk помощь с dialplan"
Отправлено Andrey , 21-Окт-17 14:41 
>[оверквотинг удален]
> exten =>_8XXXXXXXXXX/1702,1,Hangup()
> exten =>_8XXXXXXXXXX/1901,1,Hangup()
> ; запрет города номерам 1701 1702 1901
> exten =>_XXXXXXX/1701,1,Hangup()
> exten =>_XXXXXXX/1702,1,Hangup()
> exten =>_XXXXXXX/1901,1,Hangup()
> ; все номера из бухгалтерии начинающиеся с 33хх звонят по своей линии
> exten =>_83472XXXXXX/_33XX,1,Dial(SIP/u2825432538/${EXTEN},60)
> ; 3301 звонит только по своей персональной линии
> exten =>_83472XXXXXX/_3301,1,Dial(SIP/ufanet89/${EXTEN},60)

Почему номерам 1701,1702,1901 нельзя было закрыть все номера от 7 цифр и более?
например так: exten => _XXXXXXX!/1701,1,Hangup()
Получается: при наборе номером 1701 7-значного номера (или более) - выдаем Hangup.


"Asterisk помощь с dialplan"
Отправлено mmm62 , 21-Окт-17 15:53 

> Почему номерам 1701,1702,1901 нельзя было закрыть все номера от 7 цифр и
> более?
> например так: exten => _XXXXXXX!/1701,1,Hangup()
> Получается: при наборе номером 1701 7-значного номера (или более) - выдаем Hangup.

так сложилось исторически....
работает - не трогаем :)


"Asterisk помощь с dialplan"
Отправлено Shodan , 22-Окт-17 20:16 
> боевой пример диалплана

Спасибо