首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pyst2 fastagi代码设置处理程序

使用pyst2 fastagi代码设置处理程序
EN

Stack Overflow用户
提问于 2018-09-01 14:53:14
回答 1查看 744关注 0票数 2

我正在尝试创建一个fastagi服务器来执行一些agi脚本。我正在使用pyst2来设置快速的agi服务器。运行快速agi服务器的脚本如下:

代码语言:javascript
复制
#!/usr/bin/env python

"""
.. module:: fastagi
   :synopsis: FastAGI service for Asterisk

Requires modified pyst2 to support reading stdin/out/err

 Copyright 2011 VOICE1, LLC
 By: Ben Davis <ben@voice1-dot-me>

Specification
-------------
"""

import sys
import SocketServer
import asterisk.agi
# import pkg_resources
# PYST_VERSION = pkg_resources.get_distribution("pyst2").version

__verison__ = 0.1

#TODO: Read options from config file.
HOST, PORT = "127.0.0.1", 4573

class FastAGI(SocketServer.StreamRequestHandler):
    # Close connections not finished in 5seconds.
    timeout = 5
    def handle(self):
        try:
            agi=asterisk.agi.AGI(stdin=self.rfile, stdout=self.wfile, 
stderr=sys.stderr)
            agi.verbose("pyst2: FastAGI on: {}:{}".format(HOST, PORT))
        except TypeError as e:
            sys.stderr.write('Unable to connect to agi://{} 
{}\n'.format(self.client_address[0], str(e)))
        except SocketServer.socket.timeout as e:
            sys.stderr.write('Timeout receiving data from 
{}\n'.format(self.client_address))
        except SocketServer.socket.error as e:
            sys.stderr.write('Could not open the socket. Is someting else 
listening on this port?\n')
        except Exception as e:
            sys.stderr.write('An unknown error: {}\n'.format(str(e)))

if __name__ == "__main__":
    # server = SocketServer.TCPServer((HOST, PORT), FastAGI)
    server = SocketServer.ForkingTCPServer((HOST, PORT), FastAGI)

    # Keep server running until CTRL-C is pressed.
    server.serve_forever()

当我使用下面的上下文时,它是可以的。

扩展地址123,1,agi(agi:// => _IP_address)

但我希望有超过1个脚本,如扩展=> 123,1,agi(agi://FASTAGI_address/handler_name)

我不知道如何在快速的agi服务器代码中使用一些处理程序名称。我是python的新手,所以如果我能对如何在fastagi代码中添加额外的处理程序有一些明确的指导,我将非常感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-05 04:06:05

找到了解决方案。在asterisk服务器上,我使用以下拨号方案联系Fastagi服务器:

代码语言:javascript
复制
extension=> s,1,AGI(agi://server-address/handler)

上面代码中显示的“处理程序”以“agi.env‘’agi_network_script‘”的形式返回到fastagi服务器。

下面是一个简单的使用handler的例子,代码如下:

代码语言:javascript
复制
class FastAGI(SocketServer.StreamRequestHandler):
def handle(self):
    try:
    agi=asterisk.agi.AGI(stdin=self.rfile, stdout=self.wfile, stderr=sys.stderr)
    handler = agi.env['agi_network_script']
###   Managing Handler Section   ###

        if handler == 'handler1':
            // Do whatever you wanna do with handler2
        elif handler == 'handler2':
            // Do whatever you wanna do with handler2
    except TypeError as e:
        sys.stderr.write('Unable to connect to agi://{} {}\n'.format(self.client_address[0], str(e)))
    except SocketServer.socket.timeout as e:
        sys.stderr.write('Timeout receiving data from {}\n'.format(self.client_address))
    except SocketServer.socket.error as e:
        sys.stderr.write('Could not open the socket. Is someting else listening on this port?\n')
    except Exception as e:
        sys.stderr.write('An unknown error: {}\n'.format(str(e)))
if __name__ == "__main__":
    server = SocketServer.ForkingTCPServer((HOST, PORT), FastAGI)
    server.serve_forever()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52125679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档