Страница 3 из 3

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

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

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

exten => s,n,Set(__TRANSFER_CONTEXT=limitMyUsers)

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

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

Могу придумать только обращение к базе данных, чтобы дёргать оттуда devinfo_context, соответствующий текущему номеру. Кстати, как это правильно делается? (2) Как это делаете вы? У вас ведь наверняка тоже используется трансфер?

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

Добавлено: 13 янв 2016, 19:24
virus_net

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

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

Это я к тому, что если прочитать мой вопрос полностью, а не только 1ст., станет понятно, почему стандартное решение из гугла не подходит. Буду пробовать func odbc: узнавать callerid и считывать его права из базы...

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

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

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

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

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

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

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

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

Не реагируйте как неудачник
Вопросы, которые задавать не надо
Хорошие и плохие вопросы
Если ответ не получен
Как давать хорошие ответы

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

Добавлено: 14 янв 2016, 08:19
virus_net
Это не намеки, это прямой отсыл к гуглу, где ответ на:
postscripter писал(а):На каком шаге диалплана это выполнять?
Можно узнать самостоятельно, прочитав что пишут люди и документацию. Это то что проделал и я сам, когда прочел в данном форуме о наличии данной переменной.
postscripter писал(а):почему стандартное решение из гугла не подходит
Если вы ищите копипаст решение, то ессно не подходит. Я отправлял вас к гуглу НЕ за копипаст решением, а ЗА ответом на вопрос "как это работает". После того как вы получите на него ответ, вы сможете выполнить поставленную перед вами задачу.
postscripter писал(а):у вас всё в голове
у меня много чего в голове, но это не значит что у меня есть желание разжевывать, то что написано в документации и то что по десятку раз уже обсуждено в Инете.
Ваш вопрос НЕ уникален, на ваш вопрос УЖЕ ЕСТЬ ответ. Потрудитесь его прочесть.

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

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

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

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

Добавлено: 18 янв 2016, 10:14
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

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

Добавлено: 21 янв 2016, 10:04
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 - разный.