^rage^ Posted July 19, 2012 Сабж! и в догонку: fastagi используете? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
^rage^ Posted November 15, 2012 (edited) update: вообщем, fastagi - весьма удобная вещь. взял свежий astpy и прикрутил к gevent и теперь счастлив. код без лапши из коллбэков, на каждый новый коннект создаётся новый greenlet. выглядит примерно так в диалплане: exten => _520.,1,AGI(agi://127.0.0.1:4577/fourdigit) со стороны python: #!/usr/bin/env python26 import gevent from gevent.server import StreamServer from gevent.backdoor import BackdoorServer from gevent import monkey; monkey.patch_all() from asterisk.agi import AGI def fourdigit(address,agi): try: print address[0],agi.env['agi_channel'],agi.env['agi_callerid'],'=>',agi.env['agi_extension'], agi.get_full_variable('${DEVICE_STATE(SIP/${EXTEN})}') except: pass def dispatch_req(socket, address): fileobj = socket.makefile() agiobj = AGI(stdin=fileobj, stdout=fileobj, stderr=nullerr) if 'agi_network_script' in agiobj.env: func_name = agiobj.env['agi_network_script'] if func_name in globals(): globals()[func_name](address,agiobj) fileobj.close() if __name__ == '__main__': console = BackdoorServer( ('127.0.0.1', 8823), locals = locals() ) cpid = gevent.spawn(console.serve_forever) nullerr = open('/dev/null','wb') tcpport = 4577 server = StreamServer(('0.0.0.0', tcpport), dispatch_req) print ('Starting agi on port %s' % str(tcpport) ) server.serve_forever() Edited November 15, 2012 by ^rage^ Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
^rage^ Posted November 19, 2012 кто-нибудь пользуется fastagi? или же "только extensions.conf и func_odbc, только харкдор!"? ради эксперимента сделал обновление кода на лету. т.е. можно не перезапуская процесс заменить, допустим, тело функции fourdigit или же добавить новые. вообще, в asterisk есть такая вещь как async agi. работает она следующим образом: сначала подключаемся к AMI и подписываемся на Event'ы. В диалплане пишете AGI(agi:async) в интересующих нас местах. когда обработка диалплана доходит до AGI(agi:async), происходит следующее: That will put the channel to wait AGI commands. The channel will NOT do anything but wait for Hangup or any AGI command you ask it to execute. Action: AGI Channel: SIP/33-blah Command: EXEC Playback tt-monkeys CommandID: MyCommandID по результатам мы получим Event с MyCommandID. т.е. оно идеально ложится на message passing. берем zeromq, epgm-транспорт и pubsub. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...