VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

Переадресация, внешние номера и ограничения. Не стыкуется...

Проблемы Asterisk без вэб-оболочек и их решения

Модераторы: april22, Zavr2008

virus_net
Сообщения: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

Re: Переадресация, внешние номера и ограничения. Не стыкуетс

Сообщение virus_net »

postscripter писал(а):Но есть ещё feature-коды, типа ## и *2, тоже перевод. Как такую же махинацию провернуть с ними?

Код: Выделить всё

exten => s,n,Set(__TRANSFER_CONTEXT=limitMyUsers)
мой SIP URI sip:virus_net@asterisk.ru
bitname.ru - Домены .bit (namecoin) .emc .coin .lib .bazar (emercoin)

ENUMER - звони бесплатно и напрямую.
Аватара пользователя
postscripter
Сообщения: 93
Зарегистрирован: 16 сен 2015, 15:24

Re: Переадресация, внешние номера и ограничения. Не стыкуетс

Сообщение postscripter »

exten => s,n,Set(__TRANSFER_CONTEXT=limitMyUsers)
На каком шаге диалплана это выполнять? Имея в уме, что комбинацию нажимает человек, которому позвонили, и именно его права, а не звонящего, решают.

Могу придумать только обращение к базе данных, чтобы дёргать оттуда devinfo_context, соответствующий текущему номеру. Кстати, как это правильно делается? (2) Как это делаете вы? У вас ведь наверняка тоже используется трансфер?
помучился сам - дай помучиться другим
virus_net
Сообщения: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

Re: Переадресация, внешние номера и ограничения. Не стыкуетс

Сообщение virus_net »

мой SIP URI sip:virus_net@asterisk.ru
bitname.ru - Домены .bit (namecoin) .emc .coin .lib .bazar (emercoin)

ENUMER - звони бесплатно и напрямую.
Аватара пользователя
postscripter
Сообщения: 93
Зарегистрирован: 16 сен 2015, 15:24

Re: Переадресация, внешние номера и ограничения. Не стыкуетс

Сообщение postscripter »

Что за странные намеки "давай я поищу в гугле за тебя". Вы же специалист, у вас всё в голове, зачем гугл. И ошибки в диалплане страждущего вы должны находить телепатически, и смысл вопроса угадывать по первой строчке))

Это я к тому, что если прочитать мой вопрос полностью, а не только 1ст., станет понятно, почему стандартное решение из гугла не подходит. Буду пробовать func odbc: узнавать callerid и считывать его права из базы...
ded
Сообщения: 15629
Зарегистрирован: 26 авг 2010, 19:00

Re: Переадресация, внешние номера и ограничения. Не стыкуетс

Сообщение ded »

Что бы ни было у кого в голове - должно быть у вас. И дойти до решения нужно самому, без подсказок со стороны, копипаста разжижает мозг.
Перечитайте правила регистрации.ДЛЯ ЧЕГО ФОРУМ - там всё очень концептуально изложено.

http://forum.asterisk.ru/viewtopic.php?f=5&t=6691 - тоже помогает
Когда спрашиваете... [прочтите прежде чем писать сюда]]

Когда спрашиваете... [прочтите прежде чем писать сюда]]

Когда спрашиваете...

Правильно выбирайте форум
Web- и IRC-форумы для начинающих часто позволяют получить ответ как можно быстрее
В качестве второго шага, используйте списки рассылки проектов
Задавайте осмысленные, конкретные темы сообщений
Упростите посылку ответа
Пишите понятным языком, соблюдая правила грамматики и лексики
Посылайте вопросы во всем понятных форматах
Точно и детально опишите проблему
Объем еще не значит точность
Не утверждайте, что нашли ошибку
Публичное самоунижение не заменяет выполнение домашних заданий
Описывайте симптомы проблемы, а не свои предположения
Описывайте симптомы проблемы в хронологическом порядке
Описывайте цель, а не отдельный шаг
Не просите отвечать на личный адрес электронной почты
Задавайте ясные и четкие вопросы
Как спрашивать про код
Не задавайте вопросы из домашних заданий
Избегайте бессмысленных просьб
Не помечайте свой вопрос как Срочный, даже если для вас он именно такой
Вежливость никогда не повредит, и иногда помогает
Пошлите краткое описание решения

Как интерпретировать ответы

RTFM и STFW: как понять, что вы серьезно облажались
Если вы не поняли...
Реакция на грубость

Не реагируйте как неудачник
Вопросы, которые задавать не надо
Хорошие и плохие вопросы
Если ответ не получен
Как давать хорошие ответы
virus_net
Сообщения: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

Re: Переадресация, внешние номера и ограничения. Не стыкуетс

Сообщение virus_net »

Это не намеки, это прямой отсыл к гуглу, где ответ на:
postscripter писал(а):На каком шаге диалплана это выполнять?
Можно узнать самостоятельно, прочитав что пишут люди и документацию. Это то что проделал и я сам, когда прочел в данном форуме о наличии данной переменной.
postscripter писал(а):почему стандартное решение из гугла не подходит
Если вы ищите копипаст решение, то ессно не подходит. Я отправлял вас к гуглу НЕ за копипаст решением, а ЗА ответом на вопрос "как это работает". После того как вы получите на него ответ, вы сможете выполнить поставленную перед вами задачу.
postscripter писал(а):у вас всё в голове
у меня много чего в голове, но это не значит что у меня есть желание разжевывать, то что написано в документации и то что по десятку раз уже обсуждено в Инете.
Ваш вопрос НЕ уникален, на ваш вопрос УЖЕ ЕСТЬ ответ. Потрудитесь его прочесть.
мой SIP URI sip:virus_net@asterisk.ru
bitname.ru - Домены .bit (namecoin) .emc .coin .lib .bazar (emercoin)

ENUMER - звони бесплатно и напрямую.
Аватара пользователя
postscripter
Сообщения: 93
Зарегистрирован: 16 сен 2015, 15:24

Re: Переадресация, внешние номера и ограничения. Не стыкуетс

Сообщение postscripter »

не значит что у меня есть желание разжевывать
Необязательно. Ссылки на обсуждение вместо ссылки на гугл было бы достаточно. Но если вы говорите, что ответ на этот вопрос уже есть, я конечно полистаю ещё.

ded:
Форум нужен для того, чтобы Вы САМИ нашли ответ на свой вопрос.
Могу придумать только обращение к базе данных, чтобы дёргать оттуда devinfo_context, соответствующий текущему номеру.
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:
А для чего форум я уже понял (вслух не буду)
помучился сам - дай помучиться другим
Аватара пользователя
postscripter
Сообщения: 93
Зарегистрирован: 16 сен 2015, 15:24

Re: Переадресация, внешние номера и ограничения. Не стыкуетс

Сообщение postscripter »

Ах, как было бы приятно написать "Всем спасибо, проблема решена". И точку в конце поставить. Как starley440. Ибо решено вовсе не благодаря, а скорее вопреки... Но правила я всё-таки принимал, галочку ставил. Поэтому решение (критика приветствуется):

1) Чтобы абоненты могли переводить звонок только на те номера, на которые им разрешено звонить самим:

[MyTransfer]
exten => _X.,1,Noop(Ooh, hello!)
; Узнаём права звонящего
exten => _X.,n,Set(devinfo_context=${ODBC_CHECK_CONTEXT(${CALLERID(num)})})
; Проверяем, разрешён ли номер
exten => _X.,n,GotoIf(${DIALPLAN_EXISTS(${devinfo_context},${EXTEN},1)}?:dosvidos)
; И таки делаем перевод
exten => _X.,n,Goto(${devinfo_context},${EXTEN},1)
; ...или не делаем
exten => _X.,n(dosvidos),Playback(sarcastic)
exten => _X.,n,Noop(Bye)


Дополнительно в global_custom:

TRANSFER_CONTEXT = MyTransfer

2) Чтобы абоненты могли устанавливать безусловную переадресацию только на те номера, на которые им разрешено звонить самим:

;; Переадресация только на те номера, которые разрешены пользователю!
[app-cf-on-my]
exten => *72,1,Answer
exten => *72,n,Wait(1)
exten => *72,n,Macro(user-callerid,)
exten => *72,n,Set(fromext=${AMPUSER})

; Узнаём права звонящего
exten => *72,n,Set(devinfo_context=${ODBC_CHECK_CONTEXT(${CALLERID(num)})})

exten => *72,n,GotoIf($["${fromext}"!=""]?startread)
exten => *72,n,Playback(agent-loggedoff)
exten => *72,n,Macro(hangupcall,)
exten => *72,n(startread),Read(toext,ent-target-attendant&then-press-pound,,,,)
exten => *72,n,GotoIf($["foo${toext}"="foo"]?startread)

; Проверяем, разрешён ли номер
exten => *72,n,GotoIf(${DIALPLAN_EXISTS(${devinfo_context},${toext},1)}?:startread)

exten => *72,n,Wait(1)
exten => *72,n,Set(DB(CF/${fromext})=${toext})
exten => *72,n,Set(STATE=BUSY)
exten => *72,n,Gosub(app-cf-on,sstate,1())
exten => *72,n(hook_1),Playback(call-fwd-unconditional&for&extension)
exten => *72,n,SayDigits(${fromext})
exten => *72,n,Playback(is-set-to)
exten => *72,n,SayDigits(${toext})
exten => *72,n,Macro(hangupcall,)

exten => _*72.,1,Answer
exten => _*72.,n,Wait(1)
exten => _*72.,n,Macro(user-callerid,)
exten => _*72.,n,Set(fromext=${AMPUSER})

; Узнаём права звонящего
exten => _*72.,n,Set(devinfo_context=${ODBC_CHECK_CONTEXT(${CALLERID(num)})})

exten => _*72.,n,Set(toext=${EXTEN:3})
; Проверяем, разрешён ли номер
exten => _*72.,n,GotoIf(${DIALPLAN_EXISTS(${devinfo_context},${toext},1)}?:dosvidos)

exten => _*72.,n,Set(DB(CF/${fromext})=${toext})
exten => _*72.,n,Set(STATE=BUSY)
exten => _*72.,n,Gosub(app-cf-on,sstate,1())
exten => _*72.,n(hook_2),Playback(call-fwd-unconditional&for&extension)
exten => _*72.,n,SayDigits(${fromext})
exten => _*72.,n,Playback(is-set-to)
exten => _*72.,n,SayDigits(${toext})
exten => _*72.,n,Macro(hangupcall,)

; Нет, не разрешён.
exten => _*72.,n(dosvidos),Playback(invalid)
exten => _*72.,n,Macro(hangupcall,)


exten => sstate,1,Set(DEVICE_STATE(Custom:CF${fromext})=${STATE})
exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${fromext}/device)})
exten => sstate,n,GotoIf($["${DEVICES}" = "" ]?return)
exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
exten => sstate,n,Set(ITER=1)
exten => sstate,n(begin),Set(DEVICE_STATE(Custom:DEVCF${CUT(DEVICES,&,${ITER})})=${STATE})
exten => sstate,n,Set(ITER=$[${ITER} + 1])
exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
exten => sstate,n(return),Return()


Дополнительно в func_odbc:

[CHECK_CONTEXT]
dsn=asterisk_db
readsql=(SELECT data FROM sip WHERE id=${ARG1} AND keyword='context' LIMIT 1)
UNION (SELECT data FROM dahdi WHERE id=${ARG1} AND keyword='context' LIMIT 1)


Дополнительно в CustomContexts отключить стандартное app-cf-on и в extensions_custom:

[ContextForAllUsers]
include => app-cf-on-my
помучился сам - дай помучиться другим
Аватара пользователя
postscripter
Сообщения: 93
Зарегистрирован: 16 сен 2015, 15:24

Re: Переадресация, внешние номера и ограничения. Не стыкуетс

Сообщение postscripter »

После тестов выползли ошибки. Исправленная и более-менее оттестированная версия:

; Узнаём права звонящего
[macro-check-devinfo-context]
exten => s,1,Noop(Who am I?)
same => n,Set(ARG1=${FILTER(0123456789,${ARG1})})
same => n,Gotoif(${devinfo_context}?the_end)
same => n,Set(devinfo_context=${ODBC_CHECK_CONTEXT('${ARG1}')})
same => n(the_end),MacroExit()


[MyTransfer]
exten => _X.,1,Noop(Ooh, hello!)
; Узнаём, кто нажал кнопку перевода
exten => _X.,n,Set(numero=${FROMEXTEN})
exten => _X.,n,Set(numero=${IF($["${numero}" = ""]?${CALLERID(num)}:${numero})})
; Узнаём права
exten => _X.,n,Macro(check-devinfo-context,${numero})
; Проверяем, есть ли вообще права. Это обязательно, иначе зациклится.
exten => _X.,n,GotoIf(${devinfo_context}?:dosvidos)
; Проверяем, разрешён ли номер
exten => _X.,n,GotoIf(${DIALPLAN_EXISTS(${devinfo_context},${EXTEN},1)}?:dosvidos)
; И таки делаем перевод
exten => _X.,n,Goto(${devinfo_context},${EXTEN},1)
; ...или не делаем
exten => _X.,n(dosvidos),Playback(invalid&fun)
exten => _X.,n,Noop(Bye)



Работает только для переадресации с уведомлением. Слепую отключил за ненадобностью. Код получения номера абонента, напомню, для blind и atxfer - разный.
помучился сам - дай помучиться другим
Ответить
© 2008 — 2025 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH