minor rewrite for Python 3 support. Some other fixes in corresponding files.
parent
6bd0cc9bd6
commit
5efe3f4593
|
@ -1,6 +1,6 @@
|
|||
# Temporary files.
|
||||
*.pyc
|
||||
*.swp
|
||||
*.py[cod]
|
||||
*.sw?
|
||||
*~
|
||||
.coverage
|
||||
|
||||
|
@ -10,5 +10,11 @@ build
|
|||
_build
|
||||
*.egg-info
|
||||
|
||||
# Python-related stuff
|
||||
env/
|
||||
.env/
|
||||
venv/
|
||||
__pycache__/
|
||||
|
||||
# Auto-generated files.
|
||||
MANIFEST
|
||||
|
|
18
CHANGELOG
18
CHANGELOG
|
@ -1,3 +1,21 @@
|
|||
2014-10-08 Timur Tuchkovenko <eill@yandex.ru>
|
||||
* UPGRADE: initial Python 3 support. Now pyst2 requires
|
||||
Python 'six' module. Some minor changes in other files.
|
||||
|
||||
2014-09-14 Sp1tF1r3 <https://github.com/Sp1tF1r3>
|
||||
* asterisk/manager.py: added action 'Reload' for Asterisk Manager
|
||||
Interface (AMI).
|
||||
|
||||
2013-12-03 Ludovic Gasc <gmludo@gmail.com>
|
||||
* examples/agi_script.py: added example script to explain AGI
|
||||
functionality.
|
||||
* README: renamed to REAMDE.rst for Github's Markdown support.
|
||||
* setup.py: minor changes.
|
||||
|
||||
2012-11-12 Arezqui Belaid <areski@gmail.com>
|
||||
* asterisk/manager.py: minor empty line enhancements.
|
||||
* examples/show_channels.py: added example script to show information via
|
||||
Asterisk Manager Interface (AMI).
|
||||
|
||||
2012-11-11 Arezqui Belaid <areski@gmail.com>
|
||||
* PEP8 Fixes
|
||||
|
|
2
Makefile
2
Makefile
|
@ -9,7 +9,7 @@ VERSION=$(VERSIONPY)
|
|||
LASTRELEASE:=$(shell ../svntools/lastrelease -n)
|
||||
|
||||
USERNAME=schlatterbeck
|
||||
PROJECT=pyst
|
||||
PROJECT=pyst2
|
||||
PACKAGE=${PROJECT}
|
||||
CHANGES=changes
|
||||
NOTES=notes
|
||||
|
|
52
README.rst
52
README.rst
|
@ -1,21 +1,43 @@
|
|||
pyst: A Python Interface to Asterisk
|
||||
pyst2: A Python Interface to Asterisk
|
||||
====================================
|
||||
|
||||
Pyst consists of a set of interfaces and libraries to allow programming of
|
||||
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
|
||||
of Asterisk configuration files. The library also includes debugging facilities
|
||||
for AGI.
|
||||
|
||||
Download from `Sourceforge project page`_.
|
||||
This project has been forked from pyst (http://sf.net/projects/pyst/) because
|
||||
it was impossible for me to contact the project maintainer (after several
|
||||
attempts), and I'd like to bring the project up-to-date, fix bugs, and make
|
||||
it more usable overall.
|
||||
|
||||
.. _`Sourceforge project page`: http://sourceforge.net/projects/pyst/
|
||||
My immediate plans include adding full documentation, re-writing some
|
||||
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
|
||||
fork, please contact me: rdegges@gmail.com, so we can get that setup!
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
||||
1. six
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
Download from `Github project page`_.
|
||||
|
||||
.. _`Github project page`: https://github.com/rdegges/pyst2
|
||||
|
||||
Installation is the standard python install::
|
||||
|
||||
tar xvf pyst.tar.gz
|
||||
cd pyst
|
||||
git clone https://github.com/rdegges/pyst2.git
|
||||
cd pyst2
|
||||
python setup.py install --prefix=/usr/local
|
||||
|
||||
Documentation
|
||||
-------------
|
||||
|
||||
Documentation is currently only in python docstrings, you can use
|
||||
pythons built-in help facility::
|
||||
|
||||
|
@ -35,23 +57,14 @@ 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
|
||||
package can only be run on Asterisk platforms.
|
||||
|
||||
.. note::
|
||||
This project has been forked because it was impossible for me to contact
|
||||
the project maintainer (after several attempts), and I'd like to bring the
|
||||
project up-to-date, fix bugs, and make it more usable overall.
|
||||
|
||||
My plans immediate plans include adding full documentation, re-writing some
|
||||
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
|
||||
fork, please contact me: rdegges@gmail.com, so we can get that setup!
|
||||
|
||||
Credits
|
||||
-------
|
||||
|
||||
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.
|
||||
Thanks to Randall Degges for maintaining this for and accepting
|
||||
pull requests.
|
||||
|
||||
Things to do for pyst
|
||||
---------------------
|
||||
|
@ -59,9 +72,8 @@ Things to do for pyst
|
|||
This is the original changelog merged into the readme file. I'm not so
|
||||
sure I really want to change all these things (in particular the
|
||||
threaded implementation looks good to me). I will maintain a section
|
||||
summarizing the changes in this README, the ChangeLog won't be
|
||||
maintained any longer. Detailed changes will be available in the version
|
||||
control tool (currently svn).
|
||||
summarizing the changes in this README. Detailed changes will be
|
||||
available in the version control tool (currently git).
|
||||
|
||||
* ChangeLog:
|
||||
The ChangeLog needs to be updated from the monotone logs.
|
||||
|
|
|
@ -11,4 +11,4 @@ manager - a module for interacting with the asterisk manager interface
|
|||
"""
|
||||
|
||||
__all__ = ['agi', 'agitb', 'config', 'manager']
|
||||
__version__ = '0.4'
|
||||
__version__ = '0.4.1'
|
||||
|
|
|
@ -22,7 +22,6 @@ pyvr
|
|||
import sys
|
||||
import pprint
|
||||
import re
|
||||
from types import ListType
|
||||
import signal
|
||||
|
||||
DEFAULT_TIMEOUT = 2000 # 2sec timeout used as default for functions that take timeouts
|
||||
|
@ -131,7 +130,7 @@ class AGI:
|
|||
try:
|
||||
self.send_command(command, *args)
|
||||
return self.get_result()
|
||||
except IOError, e:
|
||||
except IOError as e:
|
||||
if e.errno == 32:
|
||||
# Broken Pipe * let us go
|
||||
raise AGISIGPIPEHangup("Received SIGPIPE")
|
||||
|
@ -188,7 +187,7 @@ class AGI:
|
|||
raise AGIUnknownError(code, 'Unhandled code or undefined response')
|
||||
|
||||
def _process_digit_list(self, digits):
|
||||
if type(digits) == ListType:
|
||||
if type(digits) is list:
|
||||
digits = ''.join(map(str, digits))
|
||||
return self._quote(digits)
|
||||
|
||||
|
|
|
@ -79,7 +79,7 @@ def scanvars(reader, frame, locals):
|
|||
return vars
|
||||
|
||||
|
||||
def text((etype, evalue, etb), context=5):
|
||||
def text(eparams, context=5):
|
||||
"""Return a plain text document describing a given traceback."""
|
||||
import os
|
||||
import types
|
||||
|
@ -89,6 +89,7 @@ def text((etype, evalue, etb), context=5):
|
|||
import inspect
|
||||
import pydoc
|
||||
|
||||
etype, evalue, etb = eparams
|
||||
if isinstance(etype, types.ClassType):
|
||||
etype = etype.__name__
|
||||
pyver = 'Python ' + sys.version.split()[0] + ': ' + sys.executable
|
||||
|
|
|
@ -11,11 +11,11 @@ This module provides parsing functionality for asterisk config files.
|
|||
# load and parse the config file
|
||||
try:
|
||||
config = asterisk.config.Config('/etc/asterisk/extensions.conf')
|
||||
except asterisk.config.ParseError, (line, reason):
|
||||
print "Parse Error line: %s: %s" % (line, reason)
|
||||
except asterisk.config.ParseError as e:
|
||||
print "Parse Error line: %s: %s" % (e.line, e.strerror)
|
||||
sys.exit(1)
|
||||
except IOError, reason:
|
||||
print "Error opening file: %s" % reason
|
||||
except IOError as e:
|
||||
print "Error opening file: %s" % e.strerror
|
||||
sys.exit(1)
|
||||
|
||||
# print our parsed output
|
||||
|
|
|
@ -32,14 +32,14 @@ This module provides a Python API for interfacing with the asterisk manager.
|
|||
response = manager.status()
|
||||
|
||||
manager.logoff()
|
||||
except asterisk.manager.ManagerSocketException, (errno, reason):
|
||||
print "Error connecting to the manager: %s" % reason
|
||||
except asterisk.manager.ManagerSocketException as e:
|
||||
print "Error connecting to the manager: %s" % e.strerror
|
||||
sys.exit(1)
|
||||
except asterisk.manager.ManagerAuthException, reason:
|
||||
print "Error logging in to the manager: %s" % reason
|
||||
except asterisk.manager.ManagerAuthException as e:
|
||||
print "Error logging in to the manager: %s" % e.strerror
|
||||
sys.exit(1)
|
||||
except asterisk.manager.ManagerException, reason:
|
||||
print "Error: %s" % reason
|
||||
except asterisk.manager.ManagerException as e:
|
||||
print "Error: %s" % e.strerror
|
||||
sys.exit(1)
|
||||
|
||||
finally:
|
||||
|
@ -56,9 +56,8 @@ import sys
|
|||
import os
|
||||
import socket
|
||||
import threading
|
||||
import Queue
|
||||
from six.moves import queue
|
||||
import re
|
||||
from cStringIO import StringIO
|
||||
from types import *
|
||||
from time import sleep
|
||||
|
||||
|
@ -181,9 +180,9 @@ class Manager(object):
|
|||
self.hostname = socket.gethostname()
|
||||
|
||||
# our queues
|
||||
self._message_queue = Queue.Queue()
|
||||
self._response_queue = Queue.Queue()
|
||||
self._event_queue = Queue.Queue()
|
||||
self._message_queue = queue.Queue()
|
||||
self._response_queue = queue.Queue()
|
||||
self._event_queue = queue.Queue()
|
||||
|
||||
# callbacks for events
|
||||
self._event_callbacks = {}
|
||||
|
@ -265,8 +264,8 @@ class Manager(object):
|
|||
try:
|
||||
self._sock.write(command)
|
||||
self._sock.flush()
|
||||
except socket.error, (errno, reason):
|
||||
raise ManagerSocketException(errno, reason)
|
||||
except socket.error as e:
|
||||
raise ManagerSocketException(e.errno, e.strerror)
|
||||
|
||||
self._reswaiting.insert(0, 1)
|
||||
response = self._response_queue.get()
|
||||
|
@ -410,7 +409,7 @@ class Manager(object):
|
|||
elif message.has_header('Response'):
|
||||
self._response_queue.put(message)
|
||||
else:
|
||||
print 'No clue what we got\n%s' % message.data
|
||||
print('No clue what we got\n%s' % message.data)
|
||||
finally:
|
||||
# wait for our data receiving thread to exit
|
||||
t.join()
|
||||
|
@ -445,7 +444,7 @@ class Manager(object):
|
|||
raise ManagerException('Already connected to manager')
|
||||
|
||||
# make sure host is a string
|
||||
assert type(host) in StringTypes
|
||||
assert type(host) is str
|
||||
|
||||
port = int(port) # make sure port is an int
|
||||
|
||||
|
@ -455,8 +454,8 @@ class Manager(object):
|
|||
_sock.connect((host, port))
|
||||
self._sock = _sock.makefile()
|
||||
_sock.close()
|
||||
except socket.error, (errno, reason):
|
||||
raise ManagerSocketException(errno, reason)
|
||||
except socket.error as e:
|
||||
raise ManagerSocketException(e.errno, e.strerror)
|
||||
|
||||
# we are connected and running
|
||||
self._connected.set()
|
||||
|
|
|
@ -14,20 +14,20 @@ try:
|
|||
|
||||
# get a status report
|
||||
response = manager.status()
|
||||
print response
|
||||
print(response)
|
||||
|
||||
response = manager.command('core show channels concise')
|
||||
print response.data
|
||||
print(response.data)
|
||||
|
||||
manager.logoff()
|
||||
except asterisk.manager.ManagerSocketException, (errno, reason):
|
||||
print "Error connecting to the manager: %s" % reason
|
||||
except asterisk.manager.ManagerSocketException as e:
|
||||
print "Error connecting to the manager: %s" % e.strerror
|
||||
sys.exit(1)
|
||||
except asterisk.manager.ManagerAuthException, reason:
|
||||
print "Error logging in to the manager: %s" % reason
|
||||
except asterisk.manager.ManagerAuthException as e:
|
||||
print "Error logging in to the manager: %s" % e.strerror
|
||||
sys.exit(1)
|
||||
except asterisk.manager.ManagerException, reason:
|
||||
print "Error: %s" % reason
|
||||
except asterisk.manager.ManagerException as e:
|
||||
print "Error: %s" % e.strerror
|
||||
sys.exit(1)
|
||||
|
||||
finally:
|
||||
|
|
4
setup.py
4
setup.py
|
@ -41,6 +41,10 @@ setup(
|
|||
'Programming Language :: Python :: 2.5',
|
||||
'Programming Language :: Python :: 2.6',
|
||||
'Programming Language :: Python :: 2.7',
|
||||
'Programming Language :: Python :: 3',
|
||||
'Programming Language :: Python :: 3.2',
|
||||
'Programming Language :: Python :: 3.3',
|
||||
'Programming Language :: Python :: 3.4',
|
||||
'Topic :: Communications :: Internet Phone',
|
||||
'Topic :: Communications :: Telephony',
|
||||
'Topic :: Software Development :: Libraries :: Python Modules'
|
||||
|
|
Loading…
Reference in New Issue