Редактирование Конфиг.Файлов

32 просмотров
спросил 20 Ноя от Mordent (120 баллов) в категории Тонкая настройка

Здравствуйте.

Для начала, хочу сказать спасибо за продукт. При наличии головы и гугла все остальное настраивается почти "само")

По делу.

Мне провайдер отдает номера (20 штук) не транком, а отдельными одноканальными Учетками. Я хотел сделать так, чтобы при звонке наружу n-ным сотрудником, выбиралась любая свободная линия. Из Веб-интерфейса сделать не получилось, поэтому я добавил дополнительные строчки в диалплане напрямую в extension.conf -> Заменять полностью (в блоке, который был создан через веб-интерфейс). Проблема в том, что теперь внесение каких-либо правок через админку не вносит эти правки в сам файл (учитывая количество переменных, сам я такие запросы не напишу никогда), поэтому приходится ставить на файл режим "Не изменять", затем делать правки через ГУИ, копировать "дефолтный" файл к себе, искать в нем новые изменения, переписывать их в уже правленный конфиг. как можно понять, времени уходит порядочно на внесение только одного изменения, а если потом надо откатиться или еще изменить.

насколько я понимаю, в режиме "Добавлять в конец файла" одновременно срабатывают и правила, создаваемые через веб-интерфейс, и дополнительные "ручные" записи. Но прочел здесь, что если ниже я просто переопишу правило, которое уже есть в конфиге выше, то оно не сработает. Соответственно, вопрос: как можно добавить конкретные строки или переопределить полностью уже существующее правило исходящей маршрутизации ([SIP-123-11-outgoing]) в режиме "Добавлять в конец файла"?

пока писал вопрос, наткнулся на конструкцию перед приложением Dial

GosubIf($["${DIALPLAN_EXISTS(SIP-***-outgoing-custom,${EXTEN}),1}" == "1"]?SIP-***-outgoing-custom,${EXTEN},1)

 правильно ли я понял, что если существует план "SIP-***-outgoing-custom", то дальнейший маршрут перейдет в него? соответственно, если я в режиме "Добавлять в конец файла" запишу измененный план в блоке [SIP-***-outgoing-custom], оно и будет выполнено? 

как правильно его описать? также как и первоочередный (начиная с exten=>_X!...)? Ведь, согласно конструкции выше, аргументом в custom отдается изначально введенный номер и парсить его перед набором нужно по-новой. Функция "return" - это окончательный выход или возврат в предыдущую функцию?

Блин, понимаю, что вопросов задал больше чем один, прошу прощения.

Спасибо.

1 Ответ

0 голосов
ответил 20 Ноя от boffart (50,690 баллов)

Ознакомьтесь с инструкциями:

Это должно снять большинство вопросов. 

Приложение "Gosubif" отправляет  текущий канал в sub контекст. Этот контекст обязательно должен вызвать "return". 

Пример контекста:

[SIP-PROVIDER-49-outgoing-custom]
exten => _.!,1,NoOp(callerid settings)
    same => n,ExecIf($["${MIKO_CALLERID_NUM}x" != "x"]?Set(CALLERID(num)=${MIKO_CALLERID_NUM}))
    same => n,ExecIf($["${MIKO_CALLERID_NUM}x" != "x"]?Set(CALLERID(name)=${MIKO_CALLERID_NUM}))  
    same => n,return    
  • "SIP-PROVIDER" - это идентификатор провайдера (см. адресную строку браузера во время редактирования).
  • 49 - это идентификатор маршрута (см. адресную строку браузера во время редактирования). 

В принципе, Вам ничто не мешает в контексте "SIP-PROVIDER-49-outgoing-custom" выполнить "Goto" в свой контекст.

Ведь, согласно конструкции выше, аргументом в custom отдается изначально введенный номер и парсить его перед набором нужно по-новой

Тут у вас есть выбор. 

  • Можно кастомизировать outgoing контекст, тогда потребуется "парсить". 
  • Можно кастомизировать контекст провайдера, тогда все исходящие маршруты работают "как есть"

оставил комментарий 20 Ноя от Mordent (120 баллов)
редактировать 20 Ноя от Mordent
Правильно ли я понял. Имея Дефолтное правило, созданное в веб-интерфейсе:

[SIP-1573201970-22-outgoing]
exten => _X!,1,Set(number=${EXTEN:2})
    same => n,ExecIf($["${EXTEN}" != "${number}"]?Goto(${CONTEXT},${number},$[${PRIORITY} + 1]))
    same => n,ExecIf($["${number}x" == "x"]?Hangup())
    same => n,Set(ROUTFOUND=1)
    same => n,Gosub(${ISTRANSFER}dial,${EXTEN},1)
    same => n,ExecIf($["${EXTERNALPHONE}" == "${EXTEN}"]?Set(DOPTIONS=tk))
    same => n,GosubIf($["${DIALPLAN_EXISTS(SIP-1573201970-outgoing-custom,${EXTEN}),1}" == "1"]?SIP-1573201970-outgoing-custom,${EXTEN},1)
    same => n,Dial(SIP/SIP-1573201970/${number},600,${DOPTIONS}TeKM(dial_answer)b(dial_create_chan,s,1))
    same => n,ExecIf($["${ISTRANSFER}x" != "x"]?Gosub(${ISTRANSFER}dial_hangup,${EXTEN},1))
    same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup())
    same => n,Set(pt1c_UNIQUEID=${EMPTY_VALUE})
    same => n,return

я могу создать следующие два правила в режиме "Добавлять в конец файла":

[SIP-1573201970-outgoing-custom] (ошибся в имени)
exten => _X!,1,Goto(SIP-1573201970-outgoing-custom-1,${EXTEN},1)

[SIP-1573201970-outgoing-custom-1]
exten => _X!,1,Set(number=${EXTEN:2})
    same => n,ExecIf($["${EXTEN}" != "${number}"]?Goto(${CONTEXT},${number},$[${PRIORITY} + 1]))
    same => n,ExecIf($["${number}x" == "x"]?Hangup())
    same => n,Set(ROUTFOUND=1)
    same => n,Gosub(${ISTRANSFER}dial,${EXTEN},1)
    same => n,ExecIf($["${EXTERNALPHONE}" == "${EXTEN}"]?Set(DOPTIONS=tk))
    same => n,GosubIf($["${DIALPLAN_EXISTS(SIP-1573201970-outgoing-custom,${EXTEN}),1}" == "1"]?SIP-1573201970-outgoing-custom,${EXTEN},1)
    same => n,Dial(SIP/SIP-1573201970/${number},600,${DOPTIONS}TeKM(dial_answer)b(dial_create_chan,s,1))
    same => n,GotoIf($["${DIALSTATUS}" = "ANSWER"]?h:a)
    same => n(a),Dial(SIP/SIP-1574069531/${number},600,${DOPTIONS}TeKM(dial_answer)b(dial_create_chan,s,1))
    same => n,GotoIf($["${DIALSTATUS}" = "ANSWER"]?h:b)
    same => n(b),Dial(SIP/SIP-1574069611/${number},600,${DOPTIONS}TeKM(dial_answer)b(dial_create_chan,s,1))
    same => n,GotoIf($["${DIALSTATUS}" = "ANSWER"]?h:c)   
    same => n(c),Dial(SIP/SIP-1574069779/${number},600,${DOPTIONS}TeKM(dial_answer)b(dial_create_chan,s,1))
    same => n(h),ExecIf($["${ISTRANSFER}x" != "x"]?Gosub(${ISTRANSFER}dial_hangup,${EXTEN},1))
    same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup())
    same => n,Set(pt1c_UNIQUEID=${EMPTY_VALUE})
    same => n,return

и будет работать?
спасибо.
оставил комментарий 20 Ноя от boffart (50,690 баллов)
Ваш контекст должен быть описан как "SIP-1573201970-outgoing-custom"
Описывать дополнительную секцию "[SIP-1573201970-22-outgoing]" не требуется
оставил комментарий 20 Ноя от Mordent (120 баллов)
Секция [SIP-1573201970-22-outgoing] создана системой через веб-интерфейс. из нее есть сдандартный Gosub в [SIP-1573201970-outgoing-custom], который должен вернуть return, как я понимаю, в точку, из которой он был вызван.
если схемотично:
FirstContex -> Gosub(CustomContex) -> return(FirstContex)

получится, что если в кастоме я опишу необходимое мне правило, после прохождения по кастому, звонок вернется в изначальное правило и продолжит свой путь уже в нем, т.е. Dial....

или нет?
оставил комментарий 20 Ноя от boffart (50,690 баллов)
вернется.
потому либо выполните hangup() либо goto в свой контекст.
оставил комментарий 23 Ноя от Mordent (120 баллов)
перемещено 25 Ноя от boffart

Добрый день.

Решил не создавать новый вопрос.

Суть следующая. В режиме "Добавлять в конец файла" отредактировал файл extensions. Добавил контекст-кастом, чтобы исходящие звонки распределялись между несколькими одноканальными номерами.

контекст, созданный системой через веб-морду:

[SIP-1573201970-22-outgoing]
exten => _X!,1,Set(number=${EXTEN:2})
    same => n,ExecIf($["${EXTEN}" != "${number}"]?Goto(${CONTEXT},${number},$[${PRIORITY} + 1]))
    same => n,ExecIf($["${number}x" == "x"]?Hangup())
    same => n,Set(ROUTFOUND=1)
    same => n,Gosub(${ISTRANSFER}dial,${EXTEN},1)
    same => n,ExecIf($["${EXTERNALPHONE}" == "${EXTEN}"]?Set(DOPTIONS=tk))
    same => n,GosubIf($["${DIALPLAN_EXISTS(SIP-1573201970-outgoing-custom,${EXTEN}),1}" == "1"]?SIP-1573201970-outgoing-custom,${EXTEN},1)
    same => n,Dial(SIP/SIP-1573201970/${number},600,${DOPTIONS}TeKM(dial_answer)b(dial_create_chan,s,1))
    same => n,ExecIf($["${ISTRANSFER}x" != "x"]?Gosub(${ISTRANSFER}dial_hangup,${EXTEN},1))
    same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup())
    same => n,Set(pt1c_UNIQUEID=${EMPTY_VALUE})
    same => n,return

использовал такую конструкцию:

[SIP-1573201970-outgoing-custom]
exten => _X!,1,Set(number=${EXTEN})
    same => n,Gosub(${ISTRANSFER}dial,${EXTEN},1)
    same => n,ExecIf($["${EXTERNALPHONE}" == "${EXTEN}"]?Set(DOPTIONS=tk))
    same => n,Dial(SIP/SIP-1573201970/${number}&SIP/SIP-1574069531/${number}&SIP/SIP-1574069611/${number}&SIP/SIP-1574069779/${number},600,${DOPTIONS}TeKM(dial_answer)b(dial_create_chan,s,1))
    same => n,ExecIf($["${ISTRANSFER}x" != "x"]?Gosub(${ISTRANSFER}dial_hangup,${EXTEN},1))
    same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup())
    same => n,ExecIf($["${DIALSTATUS}" = "BUSY"]?Hangup())
    same => n,Set(pt1c_UNIQUEID=${EMPTY_VALUE})
    same => n,return

работает как задумано, на сброс звонка принимающим реагирует hangup, но: не пишутся звонки. т.е. инфа кто - кому звонил есть, но звонок не пишется. и, если звонить на мобильный, у звонящего нет гудков дозвона.

попробовал такую конструкцию:

[SIP-1573201970-outgoing-custom]
exten => _X!,1,Set(number=${EXTEN})
    same => n,Gosub(${ISTRANSFER}dial,${EXTEN},1)
    same => n,ExecIf($["${EXTERNALPHONE}" == "${EXTEN}"]?Set(DOPTIONS=tk))
    same => n,Dial(SIP/SIP-1573201970/${number},600,${DOPTIONS}TeKM(dial_answer)b(dial_create_chan,s,1))
    same => n,ExecIf($["${ISTRANSFER}x" != "x"]?Gosub(${ISTRANSFER}dial_hangup,${EXTEN},1))
    same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup())
    same => n,Dial(SIP/SIP-1574069531/${number},600,${DOPTIONS}TeKM(dial_answer)b(dial_create_chan,s,1))
    same => n,ExecIf($["${ISTRANSFER}x" != "x"]?Gosub(${ISTRANSFER}dial_hangup,${EXTEN},1))
    same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup())
    same => n,Dial(SIP/SIP-1574069611/${number},600,${DOPTIONS}TeKM(dial_answer)b(dial_create_chan,s,1))
    same => n,ExecIf($["${ISTRANSFER}x" != "x"]?Gosub(${ISTRANSFER}dial_hangup,${EXTEN},1))
    same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup())
    same => n,Dial(SIP/SIP-1574069779/${number},600,${DOPTIONS}TeKM(dial_answer)b(dial_create_chan,s,1))
    same => n,ExecIf($["${ISTRANSFER}x" != "x"]?Gosub(${ISTRANSFER}dial_hangup,${EXTEN},1))
    same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup())
    same => n,Set(pt1c_UNIQUEID=${EMPTY_VALUE})
    same => n,return

в этом случае гудки есть, звонки по разным линиям тоже работают. но. не могу понять как обработать статус BUSY. получается, что если принимающий сбросит вызов не отвечая, то вызов пойдет снова просто с другого номера. если вставить конструкцию DIALSTATUS=BUSY&Hangup, то не работает распределение линий. И запись звонка работает только для Первого позвонившего через этот контекст. Для остальных - только текстовая запись "кто-кому" с длительностью 59 минут.

подскажите, пожалуйста, в какую сторону копнуть.

Спасибо

Добро пожаловать на сайт Askozia Q&A, где вы можете задавать вопросы и получать ответы от других членов сообщества.

Популярные теги

askozia провайдер запись-разговоров настройка ivr маршрут входящие-вызовы askozia6 маршрутизация очередь провайдеры askozia7 запись факс очередь-вызовов исходящие-звонки транк обновление переадресация веб-интерфейс ascozia история мобильный интеграция перехват-вызова провайдеров логи редактор разговоров goip аон callerid установка маршруты диалплан тишина smtp gsm панель-телефонии-1с перевод-вызова звонок nat лицензия панель askozia-5 переадресация-мобильный префиксы телефонная-книга голосовая почта парковка перевод vmware мультифон мегафон донабор настройка-провайдер статистика время голосовая-почта перехват вызовов номер asterisk skype ssh 2 web-интерфейс дополнительный-диск распределение проброс-портов настройка-исходящие-исходящих-вызов-вызовов подменю goip4 отправка-факса железо grandstream релиз beeline digium bruteforce взлом приложение исходящие fax web cdr времени pickup вызовы yealink ростелеком mango 8 шлюз количество не-слышно-звук перенос_конфигурации запись-разговора

1,414 вопросов

1,227 ответов

2,922 комментариев

1,734 пользователей

...