Asterisk的Python接口
项目描述
Pyst由一组接口和库组成,允许从Python编程Asterisk。该库目前支持AGI、AMI以及Asterisk配置文件的解析。该库还包括AGI的调试工具。
新闻 2020:更新到Python3,包括Py7,代码中使用了新的“async”关键字。请注意,在GitHub上还有一个名为pyst2的项目,它是从pyst的早期版本分叉而来的。遗憾的是,这个分支是从旧的Subversion存储库创建的,因此这两个存储库在git中不共享共同的根,这使得合并更改变得困难。此外,我自那时起引入了一个回归测试,据我所知,pyst2中不包括这个回归测试。维护者似乎尝试通过Sourceforge联系我,但由于SF转发邮件的问题,这可能没有成功。现在这应该不再发生,因为在GIT中,我所有的提交现在都包含我的正确电子邮件地址。
到目前为止,我已经尝试保持与提到的async关键字更改的兼容性,以便API不会偏离太多。请注意,pyst2中有一个临时的补丁会破坏旧API
现在,Asterisk的新版本在发送AMI命令的输出时,都会在前面加上Output:前缀。在我的版本中,这很好地适应了已经实现的multiheaders变量,其中重复标题的行被保留。所以所有的Output:行都已经被正确解析,并放入self.multiheaders ['Output']中。我需要修复的唯一事情就是将这些行也放入旧的data变量中。所以,如果你使用过旧的Asterisk版本的data,你的代码仍然可以在pyst中使用。相反,pyst2有一个补丁,会返回带有Output:前缀的data(未经测试,这是我看代码的方式)。
当我有空时,我打算将pyst2仓库合并到我的工作副本中(可能使用reposurgeon),并查看一些有趣的更改。如果你在pyst2中发现了一些你认为应该包含在pyst中的内容,请给我留言。
Github仓库可以通过以下方式克隆
git clone https://github.com/schlatterbeck/pyst.git
旧新闻:源代码现在位于Sourceforge上的GIT仓库中。要匿名检出至本地目录pyst,请使用
git clone git://git.code.sf.net/p/pyst/code pyst
2020年更新:我将继续将更改推送到Sourceforge仓库。
感谢Eric S. Raymond的reposurgeon,使得将旧的CVS仓库、直到0.2版本(以及稍后一点)使用的monotone仓库和最近的subversion仓库合并到包含整个历史和清理一些遗物的一个git仓库成为可能。
关于维护和分叉的说明:当前维护者是Ralf Schlatterbeck。我已经联系了分叉的维护者,试图联合力量。有关任何问题,请通过rsc@runtux.com或我的Sourceforge用户联系我。
从Sourceforge项目页面下载。
安装是标准的python安装
tar xvf pyst.tar.gz cd pyst python setup.py install --prefix=/usr/local
文档目前仅包含python docstrings,您可以使用Python内置的帮助功能
import asterisk help (asterisk) import asterisk.agi help (asterisk.agi) import asterisk.manager help (asterisk.manager) import asterisk.config help (asterisk.config)
有关平台的一些说明:我们现在在setup.py中指定“platforms = ‘Any’”。这意味着,该包的管理器部分可能在任何平台上运行。另一方面,agi脚本直接在Asterisk运行的主机上调用,在这种情况下,它们仅限于Asterisk运行的平台上。或者,您可以使用Asterisk的fastagi机制,该机制在远程主机上调用agi脚本。在后一种情况下,此主机可以是Python运行的任何平台。
测试
测试是标准的pytest兼容测试。运行方式为
python3 -m pytest test
致谢
感谢Karl Putland为编写原始包。感谢Matthew Nicholson维护该包数年,并在他不再感兴趣时移交维护权。
还要感谢Sourceforge项目中的人们以及仅报告错误的人:Antoine Brenner、Max Nesterov、Sven Uebelacker,以及Matthias Urlichs(至少在一段时间内)维护debain包。
……以及早期版本中未命名的贡献者。
为pyst要做的事情
这是合并到readme文件中的原始变更日志。我不太确定我是否真的想改变所有这些内容(特别是线程实现看起来很好)。我将在README中维护一个总结变更的部分,ChangeLog将不再维护。详细的变更将在版本控制工具中提供。
ChangeLog:需要从monotone日志更新ChangeLog。
文档:pyst的所有内联文档都需要更新。
manager.py: 应该改为单线程模式。此外,当用户调用manager.logoff()后再调用manager.close()时,存在竞争条件。如果套接字线程尚未清除_connected标志,close()函数可能还会再次调用logoff。
应该为每个manager操作创建一个类,而不是在manager类中有一个函数。manager类应该适应有一个send方法,该方法知道类的通用格式。
Matthew Nicholson在邮件列表上写道(请注意,我不确定我会这样做,我目前对多线程实现很满意)
对于pyst 0.3,我计划清理manager.py。代码中存在一些已知问题。没有人将这些报告为问题,但我个人遇到了这些问题的麻烦。目前manager.py在多个线程中运行,主程序线程、从网络读取的线程以及事件分发线程。这导致像MySQLdb库这样的非线程安全代码出现问题。这种设计还导致当事件处理程序抛出异常导致事件处理线程终止时出现问题。
第二个问题是关于发送操作的方式。在manager对象中,每个操作都与一个特定的函数相关联,该函数接受可能传递给该操作的任何所有可能参数。这使得API有些僵化,并且Manager对象很杂乱。
为了解决这些问题,我基本上将复制我的Astxx manager库(用C++编写)的设计,并使其更符合Python风格。每个操作将是一个不同的对象,具有处理各种任务的方法,实际Manager类中有一个函数来发送操作。这将使Manager类变得更小,更灵活。当前代码将合并到单线程设计,具有挂钩让库处理事件等。这些挂钩将来自主机应用程序的主循环。
源代码库访问
当前版本保存在GitHub上的Git仓库中。您可以使用以下命令检出主分支:
git clone https://github.com/schlatterbeck/pyst.git
尽管在GitHub上报告问题等更方便,但我会继续向Sourceforge版本推送。使用以下命令从Sourceforge检出:
git clone git://git.code.sf.net/p/pyst/code pyst
存在一个monotone-after-0.2分支,其中包含0.2之后的未发布更改,这些更改在版本0.2发布后在monotone仓库中提交(这些更改已在将manager命令解析方式更改后合并到主分支中)。
已发布版本已标记,请参阅Sourceforge的Web界面上的标记(或使用本地git命令查找)
对于0.6版本之前的版本,代码保存在Sourceforge的Subversion仓库中。这已被合并到当前Git仓库(清理了一些Subversion对象)。
在Matthew Nicholson维护pyst之前的0.2发布之前,更改保存在一个monotone仓库中(monotone是一个免费分布式版本控制系统)。此仓库也已合并到Git仓库中。
在此之前,源代码在Sourceforge的CVS仓库中,该仓库也已合并到Git仓库中。
更改
版本0.9:添加LICENSE,pyproject.toml,删除旧测试框架
添加了LICENSE,该软件始终是双许可,当时没有指定LGPL更新条款(“2.0或更高版本”)。由于与Python软件基金会许可的双许可,许可证应与GPL/LGPL 3.0兼容。
在删除旧测试框架后,在README.rst中添加了新部分,用于运行测试
添加补丁以允许使用IPv6连接
版本0.8:修复README.rst
在0.8发布到pypi之前清理README。
版本0.7:更新测试,兼容性
现在存在一个AGI测试(除了现有的AMI测试)。在新版本中,星号符号表示输出AMI命令,前面加上Output:。这些已经被正确解析到multiheaders变量中,其中包含重复标题的行。为了与旧版本兼容,所有这些行也被放入了旧的data变量中。所以如果你使用过旧版本的asterisk的data,你的代码仍然可以用pyst运行。Python 3.7引入了一个新的关键字async。不幸的是,我们使用这个关键字作为AMI originate调用的参数。我将其改为run_async(为了与pyst2兼容,我本来想命名为simpy asynchronous,参见提交历史)。
版本0.6:功能增强
Asterisk管理接口模拟器asterisk/astemu现在可以用于使用asterisk.manager的应用程序单元测试。我们在回归测试中使用它(参见测试目录)。但这种方式也可以供其他人使用。
将asterisk模拟器从回归测试中提取出来作为独立的模块
版本0.5:小幅度安装更改
修复setup.py以包含download_url。这使得可以使用pip等安装工具进行安装。
将download_url添加到setup.py中
在SourceForge升级后修复svn url
版本0.4:功能增强
对AGI和Manager模块进行小的功能扩展。添加了一个回归测试,该测试现在覆盖了manager API的一些方面。
处理具有相同名称的多个字段的事件(例如,“Variable”在“AgentCalled”事件中。感谢Max Nesterov的建议,实现方式与SF补丁3290869中的建议不同。有关用例,请参阅SF补丁和回归测试用例test_agent_event。
允许通过TCP连接以FastAGI方式使用AGI模块。此更改允许您指定套接字流而不是sys.stdin/sys.stdout流。感谢Max Nesterov的补丁。应用SF补丁3047290。
添加回归测试框架和一些manager API的测试用例。
为manager接口生成的ActionID现在包括进程ID,这允许多个并发进程使用manager API。
版本0.3:功能增强
新维护者Ralf Schlatterbeck,这是我第一次发布,请通过Sourceforge Bug-Tracker报告任何问题,或直接给我发邮件。感谢Karl Putland编写原始包。感谢Matthew Nicholson多年来维护该包,并在他不再感兴趣时移交维护工作。完全重写了从asterisk接收答案的解析。这应该解决了人们在使用返回包含嵌入“/”或空行的命令时遇到的问题。添加了一些新的manager命令。
添加playdtmf manager命令
添加sippeers和sipshowpeer manager命令
重写manager通信
不再会在来自manager命令的答案中“/”上卡住(修复了SF Bug 2947866)
现在可以正确解析包含嵌入空行的多行输出,例如mgr.command('dialplan show')
修复event_dispatch中列表操作的错误,感谢Jan Mueller,参见2008-04-18的邮件列表评论
合并来自Matthew Nicholson的未发布更改,特别是agi.py中的set_autohangup的拼写错误,以及get_header方法的更改(参见升级说明)。已修复的manager.command支持已在(采用不同的解决方案)。未发布的更改也位于子版本库的0.2分支中,以防有人感兴趣。
项目详情
下载文件
下载适合您平台的文件。如果您不确定该选择哪个,请了解更多关于安装包的信息。
源代码分发
构建分发
pyst-0.9.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8ca3993a68e117f15bd5eac741c59083d99eda7b3ef2333fd6b67ad699fde878 |
|
MD5 | 2bfd8be31a0a15dc77a3db8d68b65182 |
|
BLAKE2b-256 | 1189acbcf3ed5c55e588ef84186b45138c96c672a40ce3e6b640a66b79ba988e |
pyst-0.9-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9701aab1059e6f8e22be8365f4e19b74950b3363d533b31a8b9b4c8ab77acd35 |
|
MD5 | 8387f44270a8662efc90e62f524c481f |
|
BLAKE2b-256 | e2be73f3ebe281b9056f98c73609defa747b862a5908368fb49896044d38b434 |