Пожалуйста, войдите здесь. Часто задаваемые вопросы О нас
Задайте Ваш вопрос

AGI не устанавливает переменную [закрыт]

0

Помогите разобраться с такой проблемой:

Пытаюсь из питон скрипта засетить перменную. В 1.8 такое прокатывало, в 11 не работает

вот дебаг

    -- Executing [s@incoming-logic:7] AGI("SIP/out-00000000", "ami_libs.py, 'getSetterSip', 380937777777") in new stack
    -- Launched AGI Script /etc/asterisk/agi/ami_libs.py
<SIP/out-00000000>AGI Tx >> agi_request: ami_libs.py
<SIP/out-00000000>AGI Tx >> agi_channel: SIP/out-00000000
<SIP/out-00000000>AGI Tx >> agi_language: en
<SIP/out-00000000>AGI Tx >> agi_type: SIP
<SIP/out-00000000>AGI Tx >> agi_uniqueid: 1373925375.0
<SIP/out-00000000>AGI Tx >> agi_version: 11.4.0
<SIP/out-00000000>AGI Tx >> agi_callerid: 380937777777
<SIP/out-00000000>AGI Tx >> agi_calleridname: 380937777777
<SIP/out-00000000>AGI Tx >> agi_callingpres: 0
<SIP/out-00000000>AGI Tx >> agi_callingani2: 0
<SIP/out-00000000>AGI Tx >> agi_callington: 0
<SIP/out-00000000>AGI Tx >> agi_callingtns: 0
<SIP/out-00000000>AGI Tx >> agi_dnid: unknown
<SIP/out-00000000>AGI Tx >> agi_rdnis: +380947777777
<SIP/out-00000000>AGI Tx >> agi_context: incoming-logic
<SIP/out-00000000>AGI Tx >> agi_extension: s
<SIP/out-00000000>AGI Tx >> agi_priority: 7
<SIP/out-00000000>AGI Tx >> agi_enhanced: 0.0
<SIP/out-00000000>AGI Tx >> agi_accountcode:
<SIP/out-00000000>AGI Tx >> agi_threadid: 140689864525568
<SIP/out-00000000>AGI Tx >> agi_arg_1:  'getSetterSip'
<SIP/out-00000000>AGI Tx >> agi_arg_2:  380937777777
<SIP/out-00000000>AGI Tx >>
    -- <SIP/out-00000000>AGI Script ami_libs.py completed, returning 0
    -- Executing [s@incoming-logic:8] NoOp("SIP/out-00000000", "") in new stack
    -- Executing [s@incoming-logic:9] Dial("SIP/out-00000000", "SIP/,20,tTM(incoming_answer^^s)") in new stack
[Jul 16 00:56:16] WARNING[17886][C-00000000]: app_dial.c:2330 dial_exec_full: Dial argument takes format (technology/resource)

в диалплане вывожу значение переменной но она пуста

exten => s,n,Noop(${setter_sip})

это видно из дебага. Кусок кода который сетит переменную выглядит так

def send(data):
    sys.stdout.write("%s \n" % data)
    sys.stdout.flush()

if funcName == "getSetterSip":
    setter_sip = getSetterSip(callerid)
    send("SET VARIABLE setter_sip %s" % setter_sip)

то есть по сути делаю вывод в стандартный поток вывода команды

SET VARIABLE setter_sip VALUE

Скрипт рабочий, если выполнить руками то выдает

asterisk11dev ~ # /etc/asterisk/agi/ami_libs.py "getSetterSip" 111111
SET VARIABLE setter_sip 101

UPDATE: Начал копать pyst встраенная документация ничего не прояснила

>>> print asterisk.__doc__
 pyst - A set of interfaces and libraries to allow programming of asterisk from python.

The pyst project includes several python modules to assist in programming
asterisk with python:

agi     - python wrapper for agi
agitb   - a module to assist in agi debugging, like cgitb
config  - a module for parsing asterisk config files
manager - a module for interacting with the asterisk manager interface


>>> print asterisk.agi.__doc__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'agi'
>>> from asterisk import agi
>>> print agi.__doc__
agi

This module contains functions and classes to implment AGI scripts in python.
pyvr

{'agi_callerid' : 'mars.putland.int',
 'agi_channel'  : 'IAX[kputland@kputland]/119',
 'agi_context'  : 'default',
 'agi_dnid'     : '666',
 'agi_enhanced' : '0.0',
 'agi_extension': '666',
 'agi_language' : 'en',
 'agi_priority' : '1',
 'agi_rdnis'    : '',
 'agi_request'  : 'pyst',
 'agi_type'     : 'IAX'}

Как с помощью этой либы сказать астериску установить переменную такую то в значение такое то.

Тут прочитал http://www.asteriskdocs.org/en/2nd_Edition/asterisk-book-html-chunk/asterisk-CHP-9-SECT-4.html что нужно сначала вычитать все что пришлет астериск, но у меня что то все равно не сработало. Подскажите какой нибудь пример аги скрипта на питоне с "правильной" установкой переменной

Написал такое

from asterisk.agi import AGI

agi = AGI()

if funcName == "getSetterSip":
    setter_sip = getSetterSip(callerid)
    agi.set_variable("setter_sip", setter_sip)

все равно нифига не сетится, куда дальше копать не пойму

РЕШЕНИЕ:

Кароче вроде разрулил, если передаешь параметром строку аги скрипту не надо после запятой пробел ставить, даже если в кавычках все равно его хавает, ну и от этого посыпалась остальная логика. Зато хоть научился аги либой пользоваться :)

удалить переоткрыть спам изменить тег редактировать

спросил 2013-07-16 02:21:03 +0400

godlike Gravatar godlike flag of Ukraine
814 92 24 62

обновил 2013-07-17 02:50:40 +0400

2 Ответа

1

Судя по выводы agi debug вы ничего не выставили. Причина? а кто его знает. остановите астриск, запустите его в консоли через

asterisk -vvvgc

не выключая консоль попробуйте. будет показывать ошибки скрипта. я бы еще попробывал "\n" добавить к строчке.

ссылка удалить спам редактировать

ответил 2013-07-16 08:38:43 +0400

meral Gravatar meral flag of Ukraine
23347 24 20 177
http://pro-sip.net/

обновил 2013-07-16 08:39:45 +0400

Comments

я же показал вывод работы скрипта, ошибок в нем нет, сделал как вы написали, лог чистый, нет никаких ошибок

godlike ( 2013-07-16 14:12:01 +0400 )редактировать

по поводу \n sys.stdout.write("%s \n" % data) я его вроде бы ставлю, или вы про какое то другое место говорите?

godlike ( 2013-07-16 14:12:49 +0400 )редактировать

ошбики скрипта показываются только на stderror. если вы коннектитесь к астериску asterisk -r то вы ничего не увидите. попробуйте два раза конец строки.

meral ( 2013-07-16 22:39:29 +0400 )редактировать

попробовал так как вы посоветовали в ответе, скрипт выполняется без ошибок. В другом скрипте есть варнинг и я его увидел, а конкретно этот отрабатывает чисто

godlike ( 2013-07-16 23:00:36 +0400 )редактировать

может быть такой вариант что я не так скомпилил астер? Или AGI полюбому из коробки работает?

godlike ( 2013-07-17 00:02:49 +0400 )редактировать
1

в приличных местах принято сначало читать что астериск отдает а потом уже свои переменные ставить.

ссылка удалить спам редактировать

ответил 2013-07-16 07:53:57 +0400

komrad123 Gravatar komrad123
3810 5 3 44

Comments

это необязательно.

meral ( 2013-07-16 08:36:34 +0400 )редактировать

астериск не читает то, что ему пишут пока не вычитают то что написал он в STDOUT.

komrad123 ( 2013-07-16 08:52:20 +0400 )редактировать

да ну? в unix системах это делается через pipe. количество информации которое помещается в pipe зависит от настройки системы. и у астериска нет никакой возможности узнать что ушло в pipe и прочитано, а что просто ушло в pipe. RTFM короче.

meral ( 2013-07-16 10:03:59 +0400 )редактировать

читайте исходники а потом уже FM. STDOUT == FD. read & write у него блокирующейся и read он не будет делать пока write не сделает.

komrad123 ( 2013-07-16 12:07:04 +0400 )редактировать

вот вы грустный. ну почему говорить то что сам не проверял. вот,гляньте специально для вас показываю.http://snag.gy/44eEM.jpg

meral ( 2013-07-16 13:02:07 +0400 )редактировать

вывод в pipe разблокируется СРАЗУ после того как у OS дойдут до приема руки. тоесть очти мгновенно.

meral ( 2013-07-16 13:04:15 +0400 )редактировать

вывод разблокируется после того как ос загребет все себе. В случае автора может быть банальный райс кондишн. write -> ос еще читает, и в этот момент с того конца в буфер валится то что должно потом быть в read и разу закрывется соединение и генерится SIG_PIPE. после этого ничего читаться не будет. Если это не воспроизводится конкретно на вашем древнем||быстром железе не означает что так надо делать.

komrad123 ( 2013-07-16 13:51:33 +0400 )редактировать

подскажите как в моем случае это правильнее сделать? Что где вычитать? Попробовать хочу этот вариант, потому как не особо большой выбор чего пробовать

godlike ( 2013-07-16 14:13:57 +0400 )редактировать
1

начать со станднартной питоновской либы для работы с AGI. после этого запустить скрипт под узером астериск и после этого под agi...

komrad123 ( 2013-07-16 21:42:05 +0400 )редактировать

добавил апдейт вопроса

godlike ( 2013-07-16 22:58:56 +0400 )редактировать

в дебаге выводятся все строчки, а там где set_variable пустота, не пойму почему

godlike ( 2013-07-17 00:43:14 +0400 )редактировать

Закладки и информация

Добавить закладку

подписаться на rss ленту новостей

Статистика

Задан: 2013-07-16 02:21:03 +0400

Просмотрен: 1,894 раз

Обновлен: Jul 17 '13

Похожие вопросы:

Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией GNU GPL.