commit
debdd61443
20
CHANGELOG
20
CHANGELOG
|
@ -1,3 +1,23 @@
|
||||||
|
2015-07-18 Artem Sorokin
|
||||||
|
|
||||||
|
* Fixing UTF-8 encoding issues.
|
||||||
|
|
||||||
|
2015-07-15 Artem Sorokin
|
||||||
|
|
||||||
|
* Fix multiline command end marker for OpenVox GSM Gateway.
|
||||||
|
|
||||||
|
2015-03-31 Randall Degges
|
||||||
|
|
||||||
|
* Porting packaging to setuptools (modern).
|
||||||
|
* Adding six as a dependency (it was missing before).
|
||||||
|
|
||||||
|
2015-03-30 Areski Belaid
|
||||||
|
|
||||||
|
* Fixing the MANIFEST.in file I accidentally broke :)
|
||||||
|
|
||||||
|
2015-03-29 Timur Tuchkovenko <eill@yandex.ru>
|
||||||
|
* UPGRADE: AMI fix for Python 3 compatibility.
|
||||||
|
|
||||||
2014-10-08 Timur Tuchkovenko <eill@yandex.ru>
|
2014-10-08 Timur Tuchkovenko <eill@yandex.ru>
|
||||||
* UPGRADE: initial Python 3 support. Now pyst2 requires
|
* UPGRADE: initial Python 3 support. Now pyst2 requires
|
||||||
Python 'six' module. Some minor changes in other files.
|
Python 'six' module. Some minor changes in other files.
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
include CHANGELOG
|
include CHANGELOG
|
||||||
include README
|
include README.rst
|
||||||
include MANIFEST.in
|
include MANIFEST.in
|
||||||
|
|
141
README.rst
141
README.rst
|
@ -1,7 +1,44 @@
|
||||||
pyst2: A Python Interface to Asterisk
|
pyst2: A Python Interface to Asterisk
|
||||||
====================================
|
=====================================
|
||||||
|
|
||||||
Pyst2 consists of a set of interfaces and libraries to allow programming of
|
.. image:: https://img.shields.io/pypi/v/pyst2.svg
|
||||||
|
:alt: pyst2 Release
|
||||||
|
:target: https://pypi.python.org/pypi/pyst2
|
||||||
|
|
||||||
|
.. image:: https://img.shields.io/pypi/dm/pyst2.svg
|
||||||
|
:alt: pyst2 Downloads
|
||||||
|
:target: https://pypi.python.org/pypi/pyst2
|
||||||
|
|
||||||
|
.. image:: https://img.shields.io/travis/rdegges/pyst2.svg
|
||||||
|
:alt: pyst2 Build
|
||||||
|
:target: https://travis-ci.org/rdegges/pyst2
|
||||||
|
|
||||||
|
.. image:: https://github.com/rdegges/pyst2/raw/master/assets/snake-sketch.jpg
|
||||||
|
:alt: Snake Sketch
|
||||||
|
|
||||||
|
|
||||||
|
Meta
|
||||||
|
----
|
||||||
|
|
||||||
|
- Author: Randall Degges
|
||||||
|
- Email: r@rdegges.com
|
||||||
|
- Site: http://www.rdegges.com
|
||||||
|
- Status: *looking for maintainer*, active
|
||||||
|
|
||||||
|
**NOTE**: This project is in need of an active maintainer. I'm quite busy with
|
||||||
|
other non-asterisk related projects in my personal time, so if you're a good
|
||||||
|
Python programmer, and working with this library and Asterisk on a daily basis
|
||||||
|
-- please consider maintaining the project! Contact me for more information:
|
||||||
|
r@rdegges.com
|
||||||
|
|
||||||
|
In the meantime, I'm happy to accept pull requests and cut releases as needed.
|
||||||
|
If you want to contribute to the project, please do!
|
||||||
|
|
||||||
|
|
||||||
|
Purpose
|
||||||
|
-------
|
||||||
|
|
||||||
|
pyst2 consists of a set of interfaces and libraries to allow programming of
|
||||||
Asterisk from python. The library currently supports AGI, AMI, and the parsing
|
Asterisk from python. The library currently supports AGI, AMI, and the parsing
|
||||||
of Asterisk configuration files. The library also includes debugging facilities
|
of Asterisk configuration files. The library also includes debugging facilities
|
||||||
for AGI.
|
for AGI.
|
||||||
|
@ -15,25 +52,20 @@ My immediate plans include adding full documentation, re-writing some
|
||||||
of the core routines, adding a test suite, and accepting pull requests.
|
of the core routines, adding a test suite, and accepting pull requests.
|
||||||
|
|
||||||
If you are one of the current maintainers, and would like to take over the
|
If you are one of the current maintainers, and would like to take over the
|
||||||
fork, please contact me: rdegges@gmail.com, so we can get that setup!
|
fork, please contact me: r@rdegges.com, so we can get that setup!
|
||||||
|
|
||||||
Requirements
|
|
||||||
------------
|
|
||||||
|
|
||||||
1. six
|
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
------------
|
------------
|
||||||
|
|
||||||
Download from `Github project page`_.
|
To install ``pyst2``, simply run:
|
||||||
|
|
||||||
.. _`Github project page`: https://github.com/rdegges/pyst2
|
.. code-block:: console
|
||||||
|
|
||||||
Installation is the standard python install::
|
$ pip install pyst2
|
||||||
|
|
||||||
|
This will install the latest version of the library automatically.
|
||||||
|
|
||||||
git clone https://github.com/rdegges/pyst2.git
|
|
||||||
cd pyst2
|
|
||||||
python setup.py install --prefix=/usr/local
|
|
||||||
|
|
||||||
Documentation
|
Documentation
|
||||||
-------------
|
-------------
|
||||||
|
@ -57,15 +89,19 @@ directly on the host where Asterisk is running. Since Asterisk doesn't
|
||||||
run on windows platforms (and probably never will) the agi part of the
|
run on windows platforms (and probably never will) the agi part of the
|
||||||
package can only be run on Asterisk platforms.
|
package can only be run on Asterisk platforms.
|
||||||
|
|
||||||
|
|
||||||
Credits
|
Credits
|
||||||
-------
|
-------
|
||||||
|
|
||||||
Thanks to Karl Putland for writing the original package.
|
Thanks to Karl Putland for writing the original package.
|
||||||
|
|
||||||
Thanks to Matthew Nicholson for maintaining the package for some years
|
Thanks to Matthew Nicholson for maintaining the package for some years
|
||||||
and for handing over maintenance when he was no longer interested.
|
and for handing over maintenance when he was no longer interested.
|
||||||
|
|
||||||
Thanks to Randall Degges for maintaining this for and accepting
|
Thanks to Randall Degges for maintaining this for and accepting
|
||||||
pull requests.
|
pull requests.
|
||||||
|
|
||||||
|
|
||||||
Things to do for pyst
|
Things to do for pyst
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
|
@ -116,82 +152,3 @@ this, I'm currently satisfied with the threaded implementation):
|
||||||
flexible. The current code will be consolidated into a single threaded
|
flexible. The current code will be consolidated into a single threaded
|
||||||
design with hooks to have the library process events and such. These
|
design with hooks to have the library process events and such. These
|
||||||
hooks will be called from the host application's main loop.
|
hooks will be called from the host application's main loop.
|
||||||
|
|
||||||
|
|
||||||
Upgrading from older versions
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
If upgrading from...
|
|
||||||
|
|
||||||
* 0.2:
|
|
||||||
|
|
||||||
- ``get_header()`` methods in ``manager.py`` now work like
|
|
||||||
``dict.get()`` instead of ``dict[key]``
|
|
||||||
|
|
||||||
|
|
||||||
* 0.1.0:
|
|
||||||
|
|
||||||
- ``agi.get_variable`` no longer throws an exception, instead it
|
|
||||||
returns an empty string when a channel variable is not set.
|
|
||||||
- ``manager.quit()`` has be renamed to ``manager.close()``
|
|
||||||
|
|
||||||
Source Code Repository Access
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
The current versions are kept in a Subversion repository on Sourceforge.
|
|
||||||
You can check out the trunk with::
|
|
||||||
|
|
||||||
svn co https://pyst.svn.sourceforge.net/svnroot/pyst/pyst/trunk pyst
|
|
||||||
|
|
||||||
There is also a 0.2 branch in::
|
|
||||||
|
|
||||||
https://pyst.svn.sourceforge.net/svnroot/pyst/pyst/branches/0.2
|
|
||||||
|
|
||||||
which contains unreleased changes after 0.2 (which have been merged into
|
|
||||||
trunk *after* changing how manager commands to asterisk are parsed).
|
|
||||||
|
|
||||||
Released versions are in::
|
|
||||||
|
|
||||||
https://pyst.svn.sourceforge.net/svnroot/pyst/pyst/tags
|
|
||||||
|
|
||||||
For versions prior to the 0.2 release when Matthew Nicholson was
|
|
||||||
maintaining pyst, the changes are kept in a `monotone`_ repository
|
|
||||||
(monotone is a free distributed version control system). Please contact
|
|
||||||
Matthew via Sourceforge if you're interested in intermediate versions.
|
|
||||||
|
|
||||||
.. _`monotone`: http://monotone.ca/
|
|
||||||
|
|
||||||
prior to that the sources are in the CVS repository on sourceforge.
|
|
||||||
|
|
||||||
|
|
||||||
Changes
|
|
||||||
-------
|
|
||||||
|
|
||||||
Version 0.3: Minor feature enhancements
|
|
||||||
|
|
||||||
New maintainer Ralf Schlatterbeck, this is my first release, please
|
|
||||||
report any problems via the Sourceforge Bug-Tracker or email me
|
|
||||||
directly. Thanks to Karl Putland for writing the original package.
|
|
||||||
Thanks to Matthew Nicholson for maintaining the package for some years
|
|
||||||
and for handing over maintenance when he was no longer interested.
|
|
||||||
The parsing of answers from asterisk was completely rewritten. This
|
|
||||||
should fix problems people were having with commands returning embedded
|
|
||||||
'/' or empty lines. Some new manager commands added.
|
|
||||||
|
|
||||||
- Add playdtmf manager command
|
|
||||||
- add sippeers and sipshowpeer manager commands
|
|
||||||
- rewritten manager communication
|
|
||||||
- should no longer choke on '/' in answers returned from a manager
|
|
||||||
command (fixes SF Bug 2947866)
|
|
||||||
- should now correctly parse multi-line output with embedded empty
|
|
||||||
lines, e.g. ``mgr.command('dialplan show')``
|
|
||||||
- Bug-fix for list manipulation in ``event_dispatch``, thanks to Jan
|
|
||||||
Mueller, see mailinglist comment from 2008-04-18
|
|
||||||
- Merge unreleased changes from repository of Matthew Nicholson
|
|
||||||
in particular a typo in ``agi.py`` for ``set_autohangup``, and change
|
|
||||||
of ``get_header`` methods (see Upgrading instructions). The fixed
|
|
||||||
``manager.command`` support is already in (with a different
|
|
||||||
solution). The unreleased changes are also on the 0.2 branch in the
|
|
||||||
subversion repository in case somebody is interested.
|
|
||||||
|
|
||||||
See the ChangeLog for older changes.
|
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 50 KiB |
|
@ -11,4 +11,4 @@ manager - a module for interacting with the asterisk manager interface
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__all__ = ['agi', 'agitb', 'config', 'manager']
|
__all__ = ['agi', 'agitb', 'config', 'manager']
|
||||||
__version__ = '0.4.1'
|
__version__ = '0.4.6'
|
||||||
|
|
|
@ -56,6 +56,7 @@ import sys
|
||||||
import os
|
import os
|
||||||
import socket
|
import socket
|
||||||
import threading
|
import threading
|
||||||
|
from six import PY3
|
||||||
from six.moves import queue
|
from six.moves import queue
|
||||||
import re
|
import re
|
||||||
from types import *
|
from types import *
|
||||||
|
@ -262,7 +263,7 @@ class Manager(object):
|
||||||
|
|
||||||
# lock the socket and send our command
|
# lock the socket and send our command
|
||||||
try:
|
try:
|
||||||
self._sock.write(command)
|
self._sock.write(command.encode('utf8'))
|
||||||
self._sock.flush()
|
self._sock.flush()
|
||||||
except socket.error as e:
|
except socket.error as e:
|
||||||
raise ManagerSocketException(e.errno, e.strerror)
|
raise ManagerSocketException(e.errno, e.strerror)
|
||||||
|
@ -290,6 +291,7 @@ class Manager(object):
|
||||||
try:
|
try:
|
||||||
lines = []
|
lines = []
|
||||||
for line in self._sock:
|
for line in self._sock:
|
||||||
|
line = line.decode('utf8')
|
||||||
# check to see if this is the greeting line
|
# check to see if this is the greeting line
|
||||||
if not self.title and '/' in line and not ':' in line:
|
if not self.title and '/' in line and not ':' in line:
|
||||||
# store the title of the manager we are connecting to:
|
# store the title of the manager we are connecting to:
|
||||||
|
@ -329,7 +331,7 @@ class Manager(object):
|
||||||
line.split(':', 1)[1].strip() == 'Follows':
|
line.split(':', 1)[1].strip() == 'Follows':
|
||||||
wait_for_marker = True
|
wait_for_marker = True
|
||||||
# same when seeing end of multiline response
|
# same when seeing end of multiline response
|
||||||
if multiline and line.startswith('--END COMMAND--'):
|
if multiline and (line.startswith('--END COMMAND--') or line.strip().endswith('--END COMMAND--')):
|
||||||
wait_for_marker = False
|
wait_for_marker = False
|
||||||
multiline = False
|
multiline = False
|
||||||
# same when seeing end of status response
|
# same when seeing end of status response
|
||||||
|
@ -452,6 +454,9 @@ class Manager(object):
|
||||||
try:
|
try:
|
||||||
_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
_sock.connect((host, port))
|
_sock.connect((host, port))
|
||||||
|
if PY3:
|
||||||
|
self._sock = _sock.makefile(mode='rwb', buffering=0)
|
||||||
|
else:
|
||||||
self._sock = _sock.makefile()
|
self._sock = _sock.makefile()
|
||||||
_sock.close()
|
_sock.close()
|
||||||
except socket.error as e:
|
except socket.error as e:
|
||||||
|
|
50
setup.py
50
setup.py
|
@ -1,34 +1,35 @@
|
||||||
#!/usr/bin/env python
|
"""Packaging files and information."""
|
||||||
|
|
||||||
from distutils.core import setup
|
|
||||||
|
from setuptools import setup
|
||||||
|
|
||||||
from asterisk import __version__ as version
|
from asterisk import __version__ as version
|
||||||
|
|
||||||
|
|
||||||
description = []
|
|
||||||
f = open('README.rst')
|
|
||||||
|
|
||||||
logo_stripped = False
|
|
||||||
for line in f:
|
|
||||||
if not logo_stripped and line.strip():
|
|
||||||
continue
|
|
||||||
logo_stripped = True
|
|
||||||
description.append(line)
|
|
||||||
|
|
||||||
licenses = ('Python Software Foundation License',
|
|
||||||
'GNU Library or Lesser General Public License (LGPL)')
|
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
|
|
||||||
|
# Basic package information:
|
||||||
name = 'pyst2',
|
name = 'pyst2',
|
||||||
version = version,
|
version = version,
|
||||||
description='A Python Interface to Asterisk',
|
|
||||||
long_description=''.join(description), author='Karl Putland',
|
|
||||||
author_email='kputland@users.sourceforge.net',
|
|
||||||
maintainer='Randall Degges',
|
|
||||||
maintainer_email='rdegges@gmail.com',
|
|
||||||
url='https://github.com/rdegges/pyst2',
|
|
||||||
packages = ['asterisk'],
|
packages = ['asterisk'],
|
||||||
license=', '.join(licenses),
|
|
||||||
|
# Packaging options:
|
||||||
|
zip_safe = False,
|
||||||
|
include_package_data = True,
|
||||||
|
|
||||||
|
# Package dependencies:
|
||||||
|
install_requires = ['six>=1.9.0'],
|
||||||
|
|
||||||
|
# Metadata for PyPI:
|
||||||
|
author = 'Randall Degges',
|
||||||
|
author_email = 'r@rdegges.com',
|
||||||
|
license = 'Python Software Foundation License / GNU Library or Lesser General Public License (LGPL) / UNLICENSE',
|
||||||
|
url = 'https://github.com/rdegges/pyst2',
|
||||||
|
keywords = 'python asterisk agi ami telephony telephony sip voip',
|
||||||
|
description = 'A Python Interface to Asterisk',
|
||||||
|
long_description = open('README.rst').read(),
|
||||||
|
|
||||||
|
# Classifiers:
|
||||||
platforms = 'Any',
|
platforms = 'Any',
|
||||||
classifiers = [
|
classifiers = [
|
||||||
'Development Status :: 5 - Production/Stable',
|
'Development Status :: 5 - Production/Stable',
|
||||||
|
@ -37,8 +38,6 @@ setup(
|
||||||
'Intended Audience :: Telecommunications Industry',
|
'Intended Audience :: Telecommunications Industry',
|
||||||
'Operating System :: OS Independent',
|
'Operating System :: OS Independent',
|
||||||
'Programming Language :: Python',
|
'Programming Language :: Python',
|
||||||
'Programming Language :: Python :: 2.4',
|
|
||||||
'Programming Language :: Python :: 2.5',
|
|
||||||
'Programming Language :: Python :: 2.6',
|
'Programming Language :: Python :: 2.6',
|
||||||
'Programming Language :: Python :: 2.7',
|
'Programming Language :: Python :: 2.7',
|
||||||
'Programming Language :: Python :: 3',
|
'Programming Language :: Python :: 3',
|
||||||
|
@ -48,5 +47,6 @@ setup(
|
||||||
'Topic :: Communications :: Internet Phone',
|
'Topic :: Communications :: Internet Phone',
|
||||||
'Topic :: Communications :: Telephony',
|
'Topic :: Communications :: Telephony',
|
||||||
'Topic :: Software Development :: Libraries :: Python Modules'
|
'Topic :: Software Development :: Libraries :: Python Modules'
|
||||||
] + ['License :: OSI Approved :: ' + l for l in licenses]
|
],
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue