This list is closed, nobody may subscribe to it.
2004 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2005 |
Jan
(13) |
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
(3) |
Nov
|
Dec
|
2006 |
Jan
(6) |
Feb
|
Mar
(5) |
Apr
(3) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(9) |
Nov
(1) |
Dec
|
2007 |
Jan
(3) |
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
(5) |
Jul
|
Aug
|
Sep
(4) |
Oct
|
Nov
|
Dec
|
2008 |
Jan
|
Feb
|
Mar
|
Apr
(25) |
May
|
Jun
(2) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(2) |
2012 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(8) |
Dec
|
2013 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
|
Nov
|
Dec
|
2014 |
Jan
|
Feb
|
Mar
|
Apr
(4) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2015 |
Jan
(4) |
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2016 |
Jan
|
Feb
|
Mar
(4) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2022 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Bernd S. <be...@bs...> - 2022-05-16 14:02:47
|
I try to make asterisk wait for a call, answer some numbers, and Hangup. I also want to run my python3 and pyst 0.8.0 script until the Hangup happens. I do it in the following way: After running connect() on asterisk.manager.Manager() I use register.event() to register a callback for 'Hangup' Then I change the dialplan for a spcific extension and context with command("dialplan remove extension ...") and command("dialplan add extension ...") for each line of Answer() Set(TIMEOUT(absolute)=%d) Set(i=1) While(True) SayNumber(${i}) Wait(1) Set(i=$[${i} + 1]) EndWhile() Hangup() Now I start message_loop() And it works, sometimes without any error. But sometimes after the Hangup callback is called I get the following exception: Exception in thread Thread-3: Traceback (most recent call last): File "/usr/lib/python3.7/threading.py", line 917, in _bootstrap_inner self.run() File "/usr/lib/python3.7/threading.py", line 865, in run self._target(*self._args, **self._kwargs) File "/usr/lib/python3/dist-packages/asterisk/manager.py", line 293, in _receive_data for line in self._sock : File "/usr/lib/python3.7/socket.py", line 583, in readinto self._checkClosed() ValueError: I/O operation on closed file. And when I get the exception, in some cases even worse the python script hangs. I already tested this 5 years before with python2 and an older pyst version. And I believe the Exceptions occur now more often. The good thing is, that before the python script hangs, it has already communicated with asterisk. And asterisk works fine. And so I made a brutal workaround, and kill my PID from the "Hangup" callback afer waiting a short time. But this workaround is ugly. Do you think there is a design error in my algorithm ? Do you have an idea, what I could try ? Regards Bernd Bernd Schumacher Communications Media Solutions Hewlett-Packard GmbH ber...@hp... |
From: Ralf S. <rs...@ru...> - 2016-03-31 12:07:39
|
On Thu, Mar 24, 2016 at 12:44:33PM -0500, Jeff LaCoursiere wrote: > if event.name == 'PeerlistComplete': > printResults() > ami.close() > sys.exit(0) This will exit the thread created by manager, not your main thread. You generally shouldn't call exit in the callback functions, these are called by the manager thread. I'd set up a Queue between your callbacks and the main loop and wait for an event on the queue in the main loop (where you're currently only sleeping). Then when receiving that event you can safely exit the main loop. I'm not sure calling ami.close in the callback is a good idea either, you'd probably do that in the main loop, too, e.g. (code completely untested) from Queue import Queue queue = Queue () ... ami = manager.Manager() ... def handleEvent(event, ami): print ("Received event: %s" % event.name) if event.name == 'PeerlistComplete': ... queue.put("End") ... item = queue.get () ami.close () sys.exit (0) Ralf -- Dr. Ralf Schlatterbeck Tel: +43/2243/26465-16 Open Source Consulting www: http://www.runtux.com Reichergasse 131, A-3411 Weidling email: of...@ru... |
From: Jeff L. <je...@je...> - 2016-03-24 17:44:42
|
On 03/23/2016 10:59 AM, Ralf Schlatterbeck wrote: > On Tue, Mar 22, 2016 at 12:54:44PM -0500, Jeff LaCoursiere wrote: >> In testing I first noticed that about 30% of the time the script hangs, >> thus I implemented the signal timeout. It seems to hang because I never >> get the PeerlistComplete event. Is this a problem with asterisk not >> sending it or some kind of bug in pyst? >> >> I next noticed that I rarely get the same number of peers: >> >> -------- >> >> root@jlpenha:/usr/local/bin# ./pypeers | wc -l >> 27 >> root@jlpenha:/usr/local/bin# ./pypeers | wc -l >> 68 >> root@jlpenha:/usr/local/bin# ./pypeers | wc -l >> 71 >> root@jlpenha:/usr/local/bin# ./pypeers | wc -l >> 67 >> root@jlpenha:/usr/local/bin# ./pypeers | wc -l >> 64 > You can debug this by looking with wireshark (or tcpdump) to the traffic > on port 5038. This should show you in what sequence you receive which > messages from asterisk. > > Looking at your code: You should *not* call ami.message_loop explicitly > in your code. This is done behind the scenes by the ami implementation > of pyst. So you're probably creating a race condition there between your > call to ami.message_loop and the one that is called by a thread created > in the __init__ method of the Manager object. > > So you really should leave all the processing to the thread created by > Manager and do something else (sleep?) in the main program. > > Ralf Hi, yes indeed that was the main issue. I guess two threads were fighting for the responses. Getting rid of that call and just looping forever around a sleep makes it always get all of the peers. However now I can't seem to get the main loop to exit - the timeout alarm does it eventually (after five seconds), but the same code in the handler doesn't. You can see that "printResult()" runs (the empty array shows in stdout), but the sys.exit(0) doesn't exit the parent thread I guess? I get the impression that this library is really designed around making a multi-threaded daemon that just lives to process AMI events. What I am looking for hardly requires that - a single threaded utility that just grabs some info and exits seems to be difficult to code :) Can anyone supply an example that does something similar? Here is what I have now: #!/usr/bin/python from asterisk import manager import signal import time import sys ip = "127.0.0.1" user = "XXX" passwd = "XXX" peers = [] def handleEvent(event, ami): print ("Received event: %s" % event.name) if event.name == 'PeerlistComplete': printResults() ami.close() sys.exit(0) #print ("Received event Header: %s" % event.headers) def eventTimeout(signum, frame): print "Timeout!" ami.close() sys.exit(1) def printResults(): print peers ami = manager.Manager() ami.connect(ip) ami.login(user, passwd) ami.register_event('PeerEntry', handleEvent) ami.register_event('PeerlistComplete', handleEvent) signal.signal(signal.SIGALRM, eventTimeout) # Sippeers tends to hang? signal.alarm(5) response = ami.send_action({'Action' : 'Sippeers'}) #ami.message_loop() while(1): time.sleep(10) ----- and the result: root@jlpenha:/usr/local/bin# ./pypeers Received event: PeerEntry Received event: PeerEntry Received event: PeerEntry [snip] Received event: PeerEntry Received event: PeerlistComplete [] Timeout! The "Timeout!" doesn't appear for five seconds... Cheers, j |
From: Ralf S. <rs...@ru...> - 2016-03-23 16:15:03
|
On Tue, Mar 22, 2016 at 12:54:44PM -0500, Jeff LaCoursiere wrote: > > In testing I first noticed that about 30% of the time the script hangs, > thus I implemented the signal timeout. It seems to hang because I never > get the PeerlistComplete event. Is this a problem with asterisk not > sending it or some kind of bug in pyst? > > I next noticed that I rarely get the same number of peers: > > -------- > > root@jlpenha:/usr/local/bin# ./pypeers | wc -l > 27 > root@jlpenha:/usr/local/bin# ./pypeers | wc -l > 68 > root@jlpenha:/usr/local/bin# ./pypeers | wc -l > 71 > root@jlpenha:/usr/local/bin# ./pypeers | wc -l > 67 > root@jlpenha:/usr/local/bin# ./pypeers | wc -l > 64 You can debug this by looking with wireshark (or tcpdump) to the traffic on port 5038. This should show you in what sequence you receive which messages from asterisk. Looking at your code: You should *not* call ami.message_loop explicitly in your code. This is done behind the scenes by the ami implementation of pyst. So you're probably creating a race condition there between your call to ami.message_loop and the one that is called by a thread created in the __init__ method of the Manager object. So you really should leave all the processing to the thread created by Manager and do something else (sleep?) in the main program. Ralf -- Dr. Ralf Schlatterbeck Tel: +43/2243/26465-16 Open Source Consulting www: http://www.runtux.com Reichergasse 131, A-3411 Weidling email: of...@ru... |
From: Jeff L. <je...@je...> - 2016-03-22 18:14:39
|
Hello, I started what I hoped to be a simple hack this morning and found pyst. I would like to use the asterisk AMI to pull a list of SIP peers and their status. I am doing this today on a number of our customer asterisk instances using bourne shell and "asterisk -x "sip show peers'", then parsing the output, but this is turning out to be quite an intensive act to perform on the instance, thus the desire to use AMI. After a few hours of surfing and playing around, I have ended up with this: -------------- root@jlpenha:/usr/local/bin# more pypeers #!/usr/bin/python from asterisk import manager import signal ip = "127.0.0.1" user = "XXX" passwd = "XXX" peers = [] def handleEvent(event, ami): print ("Received event: %s" % event.name) if event.name == 'PeerlistComplete': printResults() ami.close() #print ("Received event Header: %s" % event.headers) #add to peers[] def eventTimeout(signum, frame): print "Timeout!" ami.close() def printResults(): print peers ami = manager.Manager() ami.connect(ip) ami.login(user, passwd) ami.register_event('PeerEntry', handleEvent) ami.register_event('PeerlistComplete', handleEvent) signal.signal(signal.SIGALRM, eventTimeout) # Sippeers tends to hang? signal.alarm(5) response = ami.send_action({'Action' : 'Sippeers'}) ami.message_loop() print response --------------- In testing I first noticed that about 30% of the time the script hangs, thus I implemented the signal timeout. It seems to hang because I never get the PeerlistComplete event. Is this a problem with asterisk not sending it or some kind of bug in pyst? I next noticed that I rarely get the same number of peers: -------- root@jlpenha:/usr/local/bin# ./pypeers | wc -l 27 root@jlpenha:/usr/local/bin# ./pypeers | wc -l 68 root@jlpenha:/usr/local/bin# ./pypeers | wc -l 71 root@jlpenha:/usr/local/bin# ./pypeers | wc -l 67 root@jlpenha:/usr/local/bin# ./pypeers | wc -l 64 ------- This can't possibly be so difficult. Surely someone has done what I am trying to do, though I haven't found any examples with lots of googling today. Can anyone chime in? Thanks! j |
From: Bilal A. <bil...@gm...> - 2015-07-26 09:42:29
|
Hi Users, Currently i am trying to get the AMI events AgentCalled and AgentConnect using the Python Pyst. here is my code. ======================================================= #!/usr/bin/python import asterisk.manager import sys def handle_shutdown(event, manager): print ("Received shutdown event") manager.close() # we could analize the event and reconnect here def handle_event(event, manager): print ("Received event: %s" % event.name) print ("Received event Header: %s" % event.headers) manager = asterisk.manager.Manager() try: # connect to the manager try: manager.connect('MYIP') manager.login('MYUSER', 'MYSECRET') # register some callbacks manager.register_event('Shutdown', handle_shutdown) # shutdown manager.register_event('AgentCalled', handle_event) manager.register_event('AgentConnect', handle_event) # catch all manager.register_event('QueueCallerAbandon', handle_event) manager.message_loop() # get a status report response = manager.status() manager.logoff() except asterisk.manager.ManagerSocketException as err: errno, reason = err print ("Error connecting to the manager: %s" % reason) sys.exit(1) except asterisk.manager.ManagerAuthException as reason: print ("Error logging in to the manager: %s" % reason) sys.exit(1) except asterisk.manager.ManagerException as reason: print ("Error: %s" % reason) sys.exit(1) finally: # remember to clean up manager.close() ======================================================= I am getting the event QueueCallerAbandon but unable to get the required events, i have set eventwhencalled=yes in queues.conf, Help is highly appreciated. Regards Bilal Abbasi |
From: FERNANDO V. <fvi...@ya...> - 2015-03-04 17:48:00
|
Dear Guys. I have the follow requeriment. I need to receive a http post like http://my.host.com/call.py?5698725 In my host my.host.com i have installed Asterisk. The call.py is in my cgi-bin folder. My question is how i can do a call from my call.py script.It's possible? i need to use the manager.py or agi.py? I hope you could understand me and give some idea about how i can do Best Regards. |
From: Joel S. <jo...@jo...> - 2015-01-22 20:27:55
|
Hi Italo, This is what I see in the logs: [2015-01-22 20:59:28] VERBOSE[4765][C-00002aab] res_agi.c: -- Launched AGI Script /var/lib/asterisk/agi-bin/GetRegServerExt.py [2015-01-22 20:59:28] VERBOSE[4765][C-00002aab] res_agi.c: GetRegServerExt.py,sipusers,159100: ('dynamic', 'friend', 'sip06') [2015-01-22 20:59:29] VERBOSE[4765][C-00002aab] res_agi.c: -- <SIP/XION-00003003>AGI Script GetRegServerExt.py completed, returning 0 If the GetRegServerExt.py for any reason fails, I also see: [2015-01-22 20:59:29] VERBOSE[4765][C-00002aab] res_agi.c: -- <SIP/XION-00003003>AGI Script GetRegServerExt.py completed, returning 0 What I am trying is to set the "returning" code, for example: [2015-01-22 20:59:29] VERBOSE[4765][C-00002aab] res_agi.c: -- <SIP/XION-00003003>AGI Script GetRegServerExt.py completed, returning 16 But I can't seem to find the way to do so. Regards, Joel. -- Joel Serrano De Castro Cell: +34 639 03 13 53 E-Mail: jo...@jo... On Wed, Jan 21, 2015 at 11:08 PM, Ítalo Rossi <ita...@gm...> wrote: > Check the value of ${AGISTATUS} after Agi() in dialplan. You can also set > variable inside the Agi and check the content after execution > > Em 21/01/2015 15:55, "Joel Serrano" <jo...@jo...> escreveu: >> >> Hi everybody. >> >> This is my first post to the list, I am trying pyst and so far so good :) >> >> One thing I don't understand: >> >> No matter whatever I do, I always see in asterisk log: >> >> AGI Script GetRegServerExt.py completed, returning 0 >> >> How can I change the returning code to something else? >> >> This is my GetRegServerExt.py: >> >> >> #!/usr/bin/env python >> # coding: latin-1 >> >> import sys >> import MySQLdb >> from asterisk.agi import * >> >> mysqlhost = "localhost" >> mysqluser = "test" >> mysqlpass = "test" >> mysqldatabase = "test" >> mysqlsock = "/var/run/mysqld/mysql.sock" >> >> table = sys.argv[1] >> extension = sys.argv[2] >> >> myagi = AGI() >> try: >> conn = MySQLdb.connect(host=mysqlhost, unix_socket=mysqlsock, >> user=mysqluser, passwd=mysqlpass, db=mysqldatabase) >> conn.autocommit(True) >> cur = conn.cursor() >> query = "SELECT host,type,regserver FROM %s WHERE name='%s'" % >> (table, extension) >> cur.execute(query) >> sqldata = cur.fetchall() >> cur.close() >> conn.close() >> except (MySQLdb.OperationalError, MySQLdb.DataError, >> MySQLdb.ProgrammingError), message: >> myagi.verbose("[AGI-ERROR] - MySQL Error %s: %s" % (message[0], >> message[1])) >> >> if len(sqldata) == 1: >> myagi.set_variable('host_extension', sqldata[0][0]) >> myagi.set_variable('type_extension', sqldata[0][1]) >> myagi.set_variable('reg_server', sqldata[0][2]) >> else: >> myagi.verbose("AGI Python: ERROR") >> >> >> I have tried different ways of forced errors, but still return code is 0. >> >> In fact, If I force MySQL errors (as wrong password, etc.), return code is >> 0 >> >> How can I send back to asterisk custom return codes so I know the real >> result of the AGI execution? >> >> Thank you all in advanced. >> >> J. >> >> >> ------------------------------------------------------------------------------ >> New Year. New Location. New Benefits. New Data Center in Ashburn, VA. >> GigeNET is offering a free month of service with a new server in Ashburn. >> Choose from 2 high performing configs, both with 100TB of bandwidth. >> Higher redundancy.Lower latency.Increased capacity.Completely compliant. >> http://p.sf.net/sfu/gigenet >> _______________________________________________ >> Pyst-users mailing list >> Pys...@li... >> https://lists.sourceforge.net/lists/listinfo/pyst-users > > > ------------------------------------------------------------------------------ > New Year. New Location. New Benefits. New Data Center in Ashburn, VA. > GigeNET is offering a free month of service with a new server in Ashburn. > Choose from 2 high performing configs, both with 100TB of bandwidth. > Higher redundancy.Lower latency.Increased capacity.Completely compliant. > http://p.sf.net/sfu/gigenet > _______________________________________________ > Pyst-users mailing list > Pys...@li... > https://lists.sourceforge.net/lists/listinfo/pyst-users > |
From: Fernando V. <fvi...@ya...> - 2015-01-21 22:20:19
|
Dear All. How i can get events for avery call attended. I need know id of a answered channel, so i can update the balance of the peer every x seconds. In other words i need listen the asterisk. I hope you understand me. Excuse my english. Regards. Enviado desde mi iPhone |
From: Ítalo R. <ita...@gm...> - 2015-01-21 22:08:21
|
Check the value of ${AGISTATUS} after Agi() in dialplan. You can also set variable inside the Agi and check the content after execution Em 21/01/2015 15:55, "Joel Serrano" <jo...@jo...> escreveu: > Hi everybody. > > This is my first post to the list, I am trying pyst and so far so good :) > > One thing I don't understand: > > No matter whatever I do, I always see in asterisk log: > > AGI Script GetRegServerExt.py completed, returning 0 > > How can I change the returning code to something else? > > This is my GetRegServerExt.py: > > > #!/usr/bin/env python > # coding: latin-1 > > import sys > import MySQLdb > from asterisk.agi import * > > mysqlhost = "localhost" > mysqluser = "test" > mysqlpass = "test" > mysqldatabase = "test" > mysqlsock = "/var/run/mysqld/mysql.sock" > > table = sys.argv[1] > extension = sys.argv[2] > > myagi = AGI() > try: > conn = MySQLdb.connect(host=mysqlhost, unix_socket=mysqlsock, > user=mysqluser, passwd=mysqlpass, db=mysqldatabase) > conn.autocommit(True) > cur = conn.cursor() > query = "SELECT host,type,regserver FROM %s WHERE name='%s'" % > (table, extension) > cur.execute(query) > sqldata = cur.fetchall() > cur.close() > conn.close() > except (MySQLdb.OperationalError, MySQLdb.DataError, > MySQLdb.ProgrammingError), message: > myagi.verbose("[AGI-ERROR] - MySQL Error %s: %s" % (message[0], > message[1])) > > if len(sqldata) == 1: > myagi.set_variable('host_extension', sqldata[0][0]) > myagi.set_variable('type_extension', sqldata[0][1]) > myagi.set_variable('reg_server', sqldata[0][2]) > else: > myagi.verbose("AGI Python: ERROR") > > > I have tried different ways of forced errors, but still return code is 0. > > In fact, If I force MySQL errors (as wrong password, etc.), return code is > 0 > > How can I send back to asterisk custom return codes so I know the real > result of the AGI execution? > > Thank you all in advanced. > > J. > > > ------------------------------------------------------------------------------ > New Year. New Location. New Benefits. New Data Center in Ashburn, VA. > GigeNET is offering a free month of service with a new server in Ashburn. > Choose from 2 high performing configs, both with 100TB of bandwidth. > Higher redundancy.Lower latency.Increased capacity.Completely compliant. > http://p.sf.net/sfu/gigenet > _______________________________________________ > Pyst-users mailing list > Pys...@li... > https://lists.sourceforge.net/lists/listinfo/pyst-users > |
From: Joel S. <jo...@jo...> - 2015-01-21 18:55:28
|
Hi everybody. This is my first post to the list, I am trying pyst and so far so good :) One thing I don't understand: No matter whatever I do, I always see in asterisk log: AGI Script GetRegServerExt.py completed, returning 0 How can I change the returning code to something else? This is my GetRegServerExt.py: #!/usr/bin/env python # coding: latin-1 import sys import MySQLdb from asterisk.agi import * mysqlhost = "localhost" mysqluser = "test" mysqlpass = "test" mysqldatabase = "test" mysqlsock = "/var/run/mysqld/mysql.sock" table = sys.argv[1] extension = sys.argv[2] myagi = AGI() try: conn = MySQLdb.connect(host=mysqlhost, unix_socket=mysqlsock, user=mysqluser, passwd=mysqlpass, db=mysqldatabase) conn.autocommit(True) cur = conn.cursor() query = "SELECT host,type,regserver FROM %s WHERE name='%s'" % (table, extension) cur.execute(query) sqldata = cur.fetchall() cur.close() conn.close() except (MySQLdb.OperationalError, MySQLdb.DataError, MySQLdb.ProgrammingError), message: myagi.verbose("[AGI-ERROR] - MySQL Error %s: %s" % (message[0], message[1])) if len(sqldata) == 1: myagi.set_variable('host_extension', sqldata[0][0]) myagi.set_variable('type_extension', sqldata[0][1]) myagi.set_variable('reg_server', sqldata[0][2]) else: myagi.verbose("AGI Python: ERROR") I have tried different ways of forced errors, but still return code is 0. In fact, If I force MySQL errors (as wrong password, etc.), return code is 0 How can I send back to asterisk custom return codes so I know the real result of the AGI execution? Thank you all in advanced. J. |
From: Michael B. <mbe...@gm...> - 2014-04-21 06:16:10
|
thanks Daniel, that did the trick I guess /usr/local/bin/ is not in the path used by agi's.... seems so odd though that it would work if I ran it outside of an agi as the asterisk user, I would think the paths would be the same since both run as the asterisk user... anyway, it works now, which is what's most important to me :) thanks again! On Sun, Apr 20, 2014 at 3:57 PM, Daniel Selans <da...@se...> wrote: > Try passing the full path for ‘squeezy’. > > On Apr 20, 2014, at 3:07 AM, Michael Belleville <mbe...@gm...> > wrote: > > ok, I redirected stderr to a file, here it is: > begin > log____________________________________________________________________ > Traceback (most recent call last): > File "/var/lib/asterisk/agi-bin/voicecmd_py.agi", line 76, in <module> > check_call([cmd,arg1,arg2], shell=False) > File "/usr/lib64/python2.6/subprocess.py", line 500, in check_call > retcode = call(*popenargs, **kwargs) > File "/usr/lib64/python2.6/subprocess.py", line 478, in call > p = Popen(*popenargs, **kwargs) > File "/usr/lib64/python2.6/subprocess.py", line 642, in __init__ > errread, errwrite) > File "/usr/lib64/python2.6/subprocess.py", line 1234, in _execute_child > raise child_exception > OSError: [Errno 2] No such file or directory > ___________________________________________________________________________ > end log > > > and here is the agi itself: > begin > script__________________________________________________________________ > #!/usr/bin/env python > > > from subprocess import * > from asterisk.agi import * > import os > import sys > > sys.stdout = open('/tmp/pyoutfile', 'w') > sys.stderr = open('/tmp/pyerrfile', 'w') > > > #print "hello" > > > #def main(): > agi = AGI() > agi.verbose("python agi started", 1) > callerId = agi.env['agi_callerid'] > agi.verbose("call from %s" % callerId) > > cmd = agi.env['agi_arg_1'] > agi.verbose("command text: %s" % cmd) > cmd = cmd.lower() > > words = cmd.split() > for word in words: > > agi.verbose("word: %s" % word) > > if any("theater" in s for s in words): > room = "theater" > elif any("kitchen" in s for s in words): > room = "kitchen" > elif any("master" in s for s in words): > room = "masterbedroom" > elif any("season" in s for s in words): > room = "3season" > elif any("outside" in s for s in words): > room = "deck" > else: > room = "none" > > if any("light" in s for s in words): > item = "light" > elif any("music" in s for s in words): > item = "music" > else: > item = "none" > > > if any("off" in s for s in words): > value = "off" > elif any("medium" in s for s in words): > value = "medium" > elif any("on" in s for s in words): > value = "on" > else: > value = "none" > > > agi.verbose("room: %s" % room) > agi.verbose("item: %s" % item) > agi.verbose("value: %s" % value) > > if (item == "music") and (value == "on" or value == "off") and (not room > == "none"): > fullcmd = "squeezy" + " -" + room + " -" + value > cmd = "squeezy" > arg1 = "-" + room > arg2 = "-" + value > agi.verbose(cmd) > agi.verbose(arg1) > agi.verbose(arg2) > agi.verbose(fullcmd) > #out = os.system(fullcmd) > check_call([cmd,arg1,arg2], shell=False) > > > agi.verbose("python agi ended") > ________________________________________________________________________ > end script > > > > if I run this in an outside python script it works just fine, no errors, > I've run it as asterisk and root > begin > script_________________________________________________________________ > #!/usr/bin/env python > > from subprocess import * > import os > > cmd = "turn outside music on" > > words = cmd.split() > for word in words: > > print "word: %s" % word > > if any("theater" in s for s in words): > room = "theater" > elif any("kitchen" in s for s in words): > room = "kitchen" > elif any("outside" in s for s in words): > room = "deck" > else: > room = "none" > > if any("light" in s for s in words): > item = "light" > elif any("music" in s for s in words): > item = "music" > else: > item = "none" > > > if any("off" in s for s in words): > value = "off" > elif any("medium" in s for s in words): > value = "medium" > elif any("on" in s for s in words): > value = "on" > else: > value = "none" > > > print "room: %s" % room > print "item: %s" % item > print "value: %s" % value > > if (item == "music") and (value == "on" or value == "off") and (not room > == "none"): > fullcmd = "squeezy" + " -" + room + " -" + value > cmd = "squeezy" > arg1 = "-" + room > arg2 = "-" + value > #os.system(fullcmd) > check_call([cmd,arg1,arg2],shell=False) > ___________________________________________________________________________ > end script > > > On Sun, Apr 20, 2014 at 2:39 AM, Michael Belleville <mbe...@gm... > > wrote: > >> I've tried using both os.system as well as subprocess.call to invoke an >> external command that is not working for me. It has something to do with >> the command I am trying to run, which is squeezy, a command line interface >> for logitech media center. >> >> I've been able to use os.system as well as subprocess.call successfully >> in an agi using other commands, but not squeezy. >> >> I can get squeezy to work using both os.system as well as subprocess.call >> in an external python script if I copy out the revelant chunk of code, but >> it will not work in an agi. It works in an external python script if I run >> it as either root or asterisk, so I don't think it is a permissions issue... >> >> If I try to run squeezy in the agi using subprocess.call or >> subprocess.check_call, the python agi dies right there >> >> if I use os.system, the command still doesn't run as expected, but the >> agi continues normally. >> >> I don't know how to capture any useful output since the agi dies if I try >> to use subprocess.check_call. >> >> I don't see any of the regular python error messages in my asterisk CLI >> output, the only output I see I generate myself with agi.verbose >> >> How can I get to what is happening in the agi? Can the python >> errors/output be redirected somewhere I can see them? I have been >> debugging my issues using external python scripts to test, but in this case >> my issue goes away in the external script... >> >> I would appreciate any advice :) >> >> thank you very much to all for the wonderful piece of software, it is so >> nice to be able to use python for agi scripts! >> > > > ------------------------------------------------------------------------------ > Learn Graph Databases - Download FREE O'Reilly Book > "Graph Databases" is the definitive new guide to graph databases and their > applications. Written by three acclaimed leaders in the field, > this first edition is now available. Download your free book today! > http://p.sf.net/sfu/NeoTech_______________________________________________ > Pyst-users mailing list > Pys...@li... > https://lists.sourceforge.net/lists/listinfo/pyst-users > > > > > ------------------------------------------------------------------------------ > Learn Graph Databases - Download FREE O'Reilly Book > "Graph Databases" is the definitive new guide to graph databases and their > applications. Written by three acclaimed leaders in the field, > this first edition is now available. Download your free book today! > http://p.sf.net/sfu/NeoTech > _______________________________________________ > Pyst-users mailing list > Pys...@li... > https://lists.sourceforge.net/lists/listinfo/pyst-users > > |
From: Daniel S. <da...@se...> - 2014-04-20 20:18:17
|
Try passing the full path for ‘squeezy’. On Apr 20, 2014, at 3:07 AM, Michael Belleville <mbe...@gm...> wrote: > ok, I redirected stderr to a file, here it is: > begin log____________________________________________________________________ > Traceback (most recent call last): > File "/var/lib/asterisk/agi-bin/voicecmd_py.agi", line 76, in <module> > check_call([cmd,arg1,arg2], shell=False) > File "/usr/lib64/python2.6/subprocess.py", line 500, in check_call > retcode = call(*popenargs, **kwargs) > File "/usr/lib64/python2.6/subprocess.py", line 478, in call > p = Popen(*popenargs, **kwargs) > File "/usr/lib64/python2.6/subprocess.py", line 642, in __init__ > errread, errwrite) > File "/usr/lib64/python2.6/subprocess.py", line 1234, in _execute_child > raise child_exception > OSError: [Errno 2] No such file or directory > ___________________________________________________________________________ > end log > > > and here is the agi itself: > begin script__________________________________________________________________ > #!/usr/bin/env python > > > from subprocess import * > from asterisk.agi import * > import os > import sys > > sys.stdout = open('/tmp/pyoutfile', 'w') > sys.stderr = open('/tmp/pyerrfile', 'w') > > > #print "hello" > > > #def main(): > agi = AGI() > agi.verbose("python agi started", 1) > callerId = agi.env['agi_callerid'] > agi.verbose("call from %s" % callerId) > > cmd = agi.env['agi_arg_1'] > agi.verbose("command text: %s" % cmd) > cmd = cmd.lower() > > words = cmd.split() > for word in words: > > agi.verbose("word: %s" % word) > > if any("theater" in s for s in words): > room = "theater" > elif any("kitchen" in s for s in words): > room = "kitchen" > elif any("master" in s for s in words): > room = "masterbedroom" > elif any("season" in s for s in words): > room = "3season" > elif any("outside" in s for s in words): > room = "deck" > else: > room = "none" > > if any("light" in s for s in words): > item = "light" > elif any("music" in s for s in words): > item = "music" > else: > item = "none" > > > if any("off" in s for s in words): > value = "off" > elif any("medium" in s for s in words): > value = "medium" > elif any("on" in s for s in words): > value = "on" > else: > value = "none" > > > agi.verbose("room: %s" % room) > agi.verbose("item: %s" % item) > agi.verbose("value: %s" % value) > > if (item == "music") and (value == "on" or value == "off") and (not room == "none"): > fullcmd = "squeezy" + " -" + room + " -" + value > cmd = "squeezy" > arg1 = "-" + room > arg2 = "-" + value > agi.verbose(cmd) > agi.verbose(arg1) > agi.verbose(arg2) > agi.verbose(fullcmd) > #out = os.system(fullcmd) > check_call([cmd,arg1,arg2], shell=False) > > > agi.verbose("python agi ended") > ________________________________________________________________________ > end script > > > > if I run this in an outside python script it works just fine, no errors, I've run it as asterisk and root > begin script_________________________________________________________________ > #!/usr/bin/env python > > from subprocess import * > import os > > cmd = "turn outside music on" > > words = cmd.split() > for word in words: > > print "word: %s" % word > > if any("theater" in s for s in words): > room = "theater" > elif any("kitchen" in s for s in words): > room = "kitchen" > elif any("outside" in s for s in words): > room = "deck" > else: > room = "none" > > if any("light" in s for s in words): > item = "light" > elif any("music" in s for s in words): > item = "music" > else: > item = "none" > > > if any("off" in s for s in words): > value = "off" > elif any("medium" in s for s in words): > value = "medium" > elif any("on" in s for s in words): > value = "on" > else: > value = "none" > > > print "room: %s" % room > print "item: %s" % item > print "value: %s" % value > > if (item == "music") and (value == "on" or value == "off") and (not room == "none"): > fullcmd = "squeezy" + " -" + room + " -" + value > cmd = "squeezy" > arg1 = "-" + room > arg2 = "-" + value > #os.system(fullcmd) > check_call([cmd,arg1,arg2],shell=False) > ___________________________________________________________________________ > end script > > > On Sun, Apr 20, 2014 at 2:39 AM, Michael Belleville <mbe...@gm...> wrote: > I've tried using both os.system as well as subprocess.call to invoke an external command that is not working for me. It has something to do with the command I am trying to run, which is squeezy, a command line interface for logitech media center. > > I've been able to use os.system as well as subprocess.call successfully in an agi using other commands, but not squeezy. > > I can get squeezy to work using both os.system as well as subprocess.call in an external python script if I copy out the revelant chunk of code, but it will not work in an agi. It works in an external python script if I run it as either root or asterisk, so I don't think it is a permissions issue... > > If I try to run squeezy in the agi using subprocess.call or subprocess.check_call, the python agi dies right there > > if I use os.system, the command still doesn't run as expected, but the agi continues normally. > > I don't know how to capture any useful output since the agi dies if I try to use subprocess.check_call. > > I don't see any of the regular python error messages in my asterisk CLI output, the only output I see I generate myself with agi.verbose > > How can I get to what is happening in the agi? Can the python errors/output be redirected somewhere I can see them? I have been debugging my issues using external python scripts to test, but in this case my issue goes away in the external script... > > I would appreciate any advice :) > > thank you very much to all for the wonderful piece of software, it is so nice to be able to use python for agi scripts! > > ------------------------------------------------------------------------------ > Learn Graph Databases - Download FREE O'Reilly Book > "Graph Databases" is the definitive new guide to graph databases and their > applications. Written by three acclaimed leaders in the field, > this first edition is now available. Download your free book today! > http://p.sf.net/sfu/NeoTech_______________________________________________ > Pyst-users mailing list > Pys...@li... > https://lists.sourceforge.net/lists/listinfo/pyst-users |
From: Michael B. <mbe...@gm...> - 2014-04-20 07:07:41
|
ok, I redirected stderr to a file, here it is: begin log____________________________________________________________________ Traceback (most recent call last): File "/var/lib/asterisk/agi-bin/voicecmd_py.agi", line 76, in <module> check_call([cmd,arg1,arg2], shell=False) File "/usr/lib64/python2.6/subprocess.py", line 500, in check_call retcode = call(*popenargs, **kwargs) File "/usr/lib64/python2.6/subprocess.py", line 478, in call p = Popen(*popenargs, **kwargs) File "/usr/lib64/python2.6/subprocess.py", line 642, in __init__ errread, errwrite) File "/usr/lib64/python2.6/subprocess.py", line 1234, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory ___________________________________________________________________________ end log and here is the agi itself: begin script__________________________________________________________________ #!/usr/bin/env python from subprocess import * from asterisk.agi import * import os import sys sys.stdout = open('/tmp/pyoutfile', 'w') sys.stderr = open('/tmp/pyerrfile', 'w') #print "hello" #def main(): agi = AGI() agi.verbose("python agi started", 1) callerId = agi.env['agi_callerid'] agi.verbose("call from %s" % callerId) cmd = agi.env['agi_arg_1'] agi.verbose("command text: %s" % cmd) cmd = cmd.lower() words = cmd.split() for word in words: agi.verbose("word: %s" % word) if any("theater" in s for s in words): room = "theater" elif any("kitchen" in s for s in words): room = "kitchen" elif any("master" in s for s in words): room = "masterbedroom" elif any("season" in s for s in words): room = "3season" elif any("outside" in s for s in words): room = "deck" else: room = "none" if any("light" in s for s in words): item = "light" elif any("music" in s for s in words): item = "music" else: item = "none" if any("off" in s for s in words): value = "off" elif any("medium" in s for s in words): value = "medium" elif any("on" in s for s in words): value = "on" else: value = "none" agi.verbose("room: %s" % room) agi.verbose("item: %s" % item) agi.verbose("value: %s" % value) if (item == "music") and (value == "on" or value == "off") and (not room == "none"): fullcmd = "squeezy" + " -" + room + " -" + value cmd = "squeezy" arg1 = "-" + room arg2 = "-" + value agi.verbose(cmd) agi.verbose(arg1) agi.verbose(arg2) agi.verbose(fullcmd) #out = os.system(fullcmd) check_call([cmd,arg1,arg2], shell=False) agi.verbose("python agi ended") ________________________________________________________________________ end script if I run this in an outside python script it works just fine, no errors, I've run it as asterisk and root begin script_________________________________________________________________ #!/usr/bin/env python from subprocess import * import os cmd = "turn outside music on" words = cmd.split() for word in words: print "word: %s" % word if any("theater" in s for s in words): room = "theater" elif any("kitchen" in s for s in words): room = "kitchen" elif any("outside" in s for s in words): room = "deck" else: room = "none" if any("light" in s for s in words): item = "light" elif any("music" in s for s in words): item = "music" else: item = "none" if any("off" in s for s in words): value = "off" elif any("medium" in s for s in words): value = "medium" elif any("on" in s for s in words): value = "on" else: value = "none" print "room: %s" % room print "item: %s" % item print "value: %s" % value if (item == "music") and (value == "on" or value == "off") and (not room == "none"): fullcmd = "squeezy" + " -" + room + " -" + value cmd = "squeezy" arg1 = "-" + room arg2 = "-" + value #os.system(fullcmd) check_call([cmd,arg1,arg2],shell=False) ___________________________________________________________________________ end script On Sun, Apr 20, 2014 at 2:39 AM, Michael Belleville <mbe...@gm...>wrote: > I've tried using both os.system as well as subprocess.call to invoke an > external command that is not working for me. It has something to do with > the command I am trying to run, which is squeezy, a command line interface > for logitech media center. > > I've been able to use os.system as well as subprocess.call successfully in > an agi using other commands, but not squeezy. > > I can get squeezy to work using both os.system as well as subprocess.call > in an external python script if I copy out the revelant chunk of code, but > it will not work in an agi. It works in an external python script if I run > it as either root or asterisk, so I don't think it is a permissions issue... > > If I try to run squeezy in the agi using subprocess.call or > subprocess.check_call, the python agi dies right there > > if I use os.system, the command still doesn't run as expected, but the agi > continues normally. > > I don't know how to capture any useful output since the agi dies if I try > to use subprocess.check_call. > > I don't see any of the regular python error messages in my asterisk CLI > output, the only output I see I generate myself with agi.verbose > > How can I get to what is happening in the agi? Can the python > errors/output be redirected somewhere I can see them? I have been > debugging my issues using external python scripts to test, but in this case > my issue goes away in the external script... > > I would appreciate any advice :) > > thank you very much to all for the wonderful piece of software, it is so > nice to be able to use python for agi scripts! > |
From: Michael B. <mbe...@gm...> - 2014-04-20 06:39:42
|
I've tried using both os.system as well as subprocess.call to invoke an external command that is not working for me. It has something to do with the command I am trying to run, which is squeezy, a command line interface for logitech media center. I've been able to use os.system as well as subprocess.call successfully in an agi using other commands, but not squeezy. I can get squeezy to work using both os.system as well as subprocess.call in an external python script if I copy out the revelant chunk of code, but it will not work in an agi. It works in an external python script if I run it as either root or asterisk, so I don't think it is a permissions issue... If I try to run squeezy in the agi using subprocess.call or subprocess.check_call, the python agi dies right there if I use os.system, the command still doesn't run as expected, but the agi continues normally. I don't know how to capture any useful output since the agi dies if I try to use subprocess.check_call. I don't see any of the regular python error messages in my asterisk CLI output, the only output I see I generate myself with agi.verbose How can I get to what is happening in the agi? Can the python errors/output be redirected somewhere I can see them? I have been debugging my issues using external python scripts to test, but in this case my issue goes away in the external script... I would appreciate any advice :) thank you very much to all for the wonderful piece of software, it is so nice to be able to use python for agi scripts! |
From: Antoine P. <an...@py...> - 2013-09-06 15:50:37
|
Hello Ralf, Today I've just learnt by chance (!) that you're trying to revive the pyst project. At work we're still using pyst2, which is abandonware, but we decided some time ago to start writing a replacement library, which we've just opened on PyPI and BitBucket: https://pypi.python.org/pypi/obelus/ https://bitbucket.org/optiflowsrd/obelus While the library is very young, still low-level, and unused in production, it also comes with a number of improvements which are important to us: - it's designed to be testable (and already has a non-trivial test suite) - it's designed to be used in non-blocking applications, in a framework-agnostic way - furthermore, its code base is bilingual (2.7 and 3.2+ compatible) The reason why we decided to start a new project from scratch is that pyst2's original structure is not really amenable to those improvements, and its lack of actual tests made it difficult to perform major surgery while maintaining functionality. I don't know how you feel about all this, but given the very small number of Python developers interested in working on Asterisk bindings, perhaps it would be nice to join forces. (note that obelus' event-driven design wouldn't preclude it from being used in traditional blocking-style code, if someone writes an adapter for that) Regards Antoine. |
From: Vladimir <v....@gm...> - 2012-11-28 10:43:21
|
2012/11/28 Ralf Schlatterbeck <rs...@ru...> > > I think found the best solution for Fastagi. Thanks Max Nesterov for > patch: > > > https://sourceforge.net/tracker/index.php?func=detail&aid=3047290&group_id=76162&atid=546274 > > You know that the patch is already in the latest Release 0.4.36? > > Yes, I knew. I use latest release 0.4.38 https://sourceforge.net/projects/pyst/files/pyst/0.4.38/ > Thanks for the feedback. > > Ralf > > -- > Dr. Ralf Schlatterbeck Tel: +43/2243/26465-16 > Open Source Consulting www: http://www.runtux.com > Reichergasse 131, A-3411 Weidling email: of...@ru... > osAlliance member email: rs...@os... > |
From: Ralf S. <rs...@ru...> - 2012-11-28 09:53:55
|
On Wed, Nov 28, 2012 at 01:48:45PM +0600, Vladimir wrote: > Thanks, Ralf. > > Running FastAGI in xinetd, set STDERR as file. And before running script > need set in dialplan variable AGISIGHUP=no, if this doesn't set we have > error in CLI Ah, interesting detail, thanks. > I think found the best solution for Fastagi. Thanks Max Nesterov for patch: > https://sourceforge.net/tracker/index.php?func=detail&aid=3047290&group_id=76162&atid=546274 You know that the patch is already in the latest Release 0.4.36? Thanks for the feedback. Ralf -- Dr. Ralf Schlatterbeck Tel: +43/2243/26465-16 Open Source Consulting www: http://www.runtux.com Reichergasse 131, A-3411 Weidling email: of...@ru... osAlliance member email: rs...@os... |
From: Vladimir <v....@gm...> - 2012-11-28 07:49:14
|
Thanks, Ralf. Running FastAGI in xinetd, set STDERR as file. And before running script need set in dialplan variable AGISIGHUP=no, if this doesn't set we have error in CLI [Nov 28 05:49:59] ERROR[6625]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe But I think running script XInetd no different from running script in dialplan. This cloning the many similar processes. I think found the best solution for Fastagi. Thanks Max Nesterov for patch: https://sourceforge.net/tracker/index.php?func=detail&aid=3047290&group_id=76162&atid=546274 P.S: Sorry for my english Regards, Vladimir 2012/11/27 Ralf Schlatterbeck <rs...@ru...> > On Tue, Nov 27, 2012 at 07:42:27PM +0600, Vladimir wrote: > > Script won't work > > Debug from asterisk CLI > > The problem in Pyst? > > > > *CLI> [Nov 27 13:32:47] AGI Tx >> agi_network: yes > > [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_request: agi:// > > test.localnet.ru:26000 > ... > > [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ARGS: > > ['/home/voipster/venv/aster/opt/pyst_manager/myagi.py'] > > [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown > > command > > Interesting. I've never used FASTAGI myself, but thought that it is > basically the same protocol. > > Hmm. > > > http://www.asteriskdocs.org/en/3rd_Edition/asterisk-book-html-chunk/AGI-variants.html > tells us that, yes, it basically is > and > > http://www.asteriskdocs.org/en/3rd_Edition/asterisk-book-html-chunk/AGI-communication.html > seems to confirm this (except on channel hangup) > > It looks to me like standard error is sent via the network connection. > > Can you try redirecting standard error to somewhere else, there was a > recent patch that enabled this. You have to specify the stderr file that > you want to use explicitly when calling the constructor of AGI. > > So in your AGI script instead of > > x = AGI () > > you specify something like > > error_file = open ("/path/to/stderr/log", "w") > x = AGI (stderr = error_file) > > This should do the trick of not sending stderr back to the asterisk > server. > > Ralf > -- > Dr. Ralf Schlatterbeck Tel: +43/2243/26465-16 > Open Source Consulting www: http://www.runtux.com > Reichergasse 131, A-3411 Weidling email: of...@ru... > osAlliance member email: rs...@os... > |
From: Ralf S. <rs...@ru...> - 2012-11-27 16:10:12
|
On Tue, Nov 27, 2012 at 07:42:27PM +0600, Vladimir wrote: > Script won't work > Debug from asterisk CLI > The problem in Pyst? > > *CLI> [Nov 27 13:32:47] AGI Tx >> agi_network: yes > [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_request: agi:// > test.localnet.ru:26000 ... > [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ARGS: > ['/home/voipster/venv/aster/opt/pyst_manager/myagi.py'] > [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown > command Interesting. I've never used FASTAGI myself, but thought that it is basically the same protocol. Hmm. http://www.asteriskdocs.org/en/3rd_Edition/asterisk-book-html-chunk/AGI-variants.html tells us that, yes, it basically is and http://www.asteriskdocs.org/en/3rd_Edition/asterisk-book-html-chunk/AGI-communication.html seems to confirm this (except on channel hangup) It looks to me like standard error is sent via the network connection. Can you try redirecting standard error to somewhere else, there was a recent patch that enabled this. You have to specify the stderr file that you want to use explicitly when calling the constructor of AGI. So in your AGI script instead of x = AGI () you specify something like error_file = open ("/path/to/stderr/log", "w") x = AGI (stderr = error_file) This should do the trick of not sending stderr back to the asterisk server. Ralf -- Dr. Ralf Schlatterbeck Tel: +43/2243/26465-16 Open Source Consulting www: http://www.runtux.com Reichergasse 131, A-3411 Weidling email: of...@ru... osAlliance member email: rs...@os... |
From: Vladimir <v....@gm...> - 2012-11-27 13:42:59
|
Script won't work Debug from asterisk CLI The problem in Pyst? *CLI> [Nov 27 13:32:47] AGI Tx >> agi_network: yes [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_request: agi:// test.localnet.ru:26000 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_channel: SIP/voipster-0000001d [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_language: ru [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_type: SIP [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_uniqueid: 1354001567.29 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_version: 10.10.0 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_callerid: 100 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_calleridname: voipster [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_callingpres: 0 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_callingani2: 0 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_callington: 0 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_callingtns: 0 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_dnid: 100 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_rdnis: unknown [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_context: office [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_extension: 100 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_priority: 1 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_enhanced: 0.0 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_accountcode: [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> agi_threadid: -1235522704 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ARGS: ['/home/voipster/venv/aster/opt/pyst_manager/myagi.py'] [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: agi_network: yes [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: agi_request: agi://test.localnet.ru:26000 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: agi_channel: SIP/voipster-0000001d [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: agi_language: ru [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: agi_type: SIP [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: agi_uniqueid: 1354001567.29 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: agi_version: 10.10.0 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: agi_callerid: 100 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Connection reset by peer [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: agi_calleridname: voipster [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: agi_callingpres: 0 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: agi_callingani2: 0 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: agi_callington: 0 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: agi_callingtns: 0 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: agi_dnid: 100 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: agi_rdnis: unknown [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: agi_context: office [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: agi_extension: 100 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: agi_priority: 1 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: agi_enhanced: 0.0 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: agi_accountcode: [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: agi_threadid: -1235522704 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << ENV LINE: [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << class AGI: self.env = {'agi_accountcode': '', [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << 'agi_callerid': '100', [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << 'agi_calleridname': 'voipster', [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << 'agi_callingani2': '0', [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << 'agi_callingpres': '0', [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << 'agi_callingtns': '0', [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << 'agi_callington': '0', [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << 'agi_channel': 'SIP/voipster-0000001d', [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << 'agi_context': 'office', [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << 'agi_dnid': '100', [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << 'agi_enhanced': '0.0', [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << 'agi_extension': '100', [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << 'agi_language': 'ru', [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << 'agi_network': 'yes', [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << 'agi_priority': '1', [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << 'agi_rdnis': 'unknown', [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << 'agi_request': 'agi:// test.localnet.ru:26000', [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << 'agi_threadid': '-1235522704', [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << 'agi_type': 'SIP', [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << 'agi_uniqueid': '1354001567.29', [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << 'agi_version': '10.10.0'} [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << COMMAND: VERBOSE "Test_message_from_FastAGI" 1 [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << VERBOSE "Test_message_from_FastAGI" 1 [Nov 27 13:32:47] agi://test.localnet.ru:26000: Test_message_from_FastAGI [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 200 result=1 [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << RESULT_LINE: 510 Invalid or unknown command [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << Traceback (most recent call last): [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << File "/home/voipster/venv/aster/opt/pyst_manager/myagi.py", line 11, in <module> [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << agi.verbose('Test_message_from_FastAGI', VERBOSE_LEVEL) [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << File "/home/voipster/venv/aster/lib/python2.7/site-packages/pyst-0.4.38-py2.7.egg/asterisk/agi.py", line 566, in verbose [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << self.execute('VERBOSE', self._quote(message), level) [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << File "/home/voipster/venv/aster/lib/python2.7/site-packages/pyst-0.4.38-py2.7.egg/asterisk/agi.py", line 105, in execute [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << return self.get_result() [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << File "/home/voipster/venv/aster/lib/python2.7/site-packages/pyst-0.4.38-py2.7.egg/asterisk/agi.py", line 149, in get_result [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << raise AGIInvalidCommand(response) [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Rx << asterisk.agi.AGIInvalidCommand: Invalid or unknown command [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> 510 Invalid or unknown command [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe [Nov 27 13:32:47] <SIP/voipster-0000001d>AGI Tx >> HANGUP [Nov 27 13:32:47] ERROR[4007]: utils.c:1177 ast_carefulwrite: write() returned error: Broken pipe 2012/11/24 Ralf Schlatterbeck <rs...@ru...> > On Fri, Nov 23, 2012 at 04:01:37PM +0600, Vladimir wrote: > > Hi everyone > > > > Please show example FastAGI server on pyst. > > Since FastAGI simply forwards all the data from standard input and > standard output via a TCP socket, you should be able to drop your Pyst > Code into a call from inetd on the remote machine, e.g. in > /etc/inetd.conf you'd write something like > > 4711 stream tcp nowait root /path/to/pyst/script > > and then call this from asterisk with somethink like > > exten => s,n,AGI(agi://192.168.0.2:4711) > > In this way you leave the FastAGI network-specific code to inetd and you > should be able to use your local AGI Pyst code unmodified on the remote > server. > > Ralf > -- > Dr. Ralf Schlatterbeck Tel: +43/2243/26465-16 > Open Source Consulting www: http://www.runtux.com > Reichergasse 131, A-3411 Weidling email: of...@ru... > osAlliance member email: rs...@os... > |
From: Vladimir <v....@gm...> - 2012-11-24 13:16:26
|
Thanks, the server works. But script doesn't work. I tested in telnet ## test_agi.py #!/home/tester/venv/aster/bin/python # -*- coding: utf-8 -*- import asterisk.agi VERBOSE_LEVEL = 1 if __name__ == '__main__': agi = asterisk.agi.AGI() agi.verbose(u'Test message from FastAGI', VERBOSE_LEVEL) agi.hangup() ###### % telnet 127.0.0.1 26000 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. ARGS: ['/home/tester/venv/aster/opt/pyst_manager/myagi.py'] agi_network: yes agi_request: agi://127.0.0.1:26000 agi_channel: SIP/IPphone-test-00000312 agi_language: ru agi_type: SIP agi_uniqueid: 1353761065.856 agi_version: 10.3.1 agi_callerid: 100 agi_calleridname: IPphone-test agi_callingpres: 0 agi_callingani2: 0 agi_callington: 0 agi_callingtns: 0 agi_dnid: 1010 agi_rdnis: unknown agi_context: office agi_extension: 1010 agi_priority: 1 agi_enhanced: 0.0 agi_accountcode: agi_threadid: -1237062800 ENV LINE: agi_network: yes ENV LINE: agi_request: agi://127.0.0.1:26000 ENV LINE: agi_channel: SIP/IPphone-test-00000312 ENV LINE: agi_language: ru ENV LINE: agi_type: SIP ENV LINE: agi_uniqueid: 1353761065.856 ENV LINE: agi_version: 10.3.1 ENV LINE: agi_callerid: 100 ENV LINE: agi_calleridname: IPphone-test ENV LINE: agi_callingpres: 0 ENV LINE: agi_callingani2: 0 ENV LINE: agi_callington: 0 ENV LINE: agi_callingtns: 0 ENV LINE: agi_dnid: 1010 ENV LINE: agi_rdnis: unknown ENV LINE: agi_context: office ENV LINE: agi_extension: 1010 ENV LINE: agi_priority: 1 ENV LINE: agi_enhanced: 0.0 ENV LINE: agi_accountcode: ENV LINE: agi_threadid: -1237062800 ENV LINE: class AGI: self.env = {'agi_accountcode': '', 'agi_callerid': '100', 'agi_calleridname': 'IPphone-test', 'agi_callingani2': '0', 'agi_callingpres': '0', 'agi_callingtns': '0', 'agi_callington': '0', 'agi_channel': 'SIP/IPphone-test-00000312', 'agi_context': 'office', 'agi_dnid': '1010', 'agi_enhanced': '0.0', 'agi_extension': '1010', 'agi_language': 'ru', 'agi_network': 'yes', 'agi_priority': '1', 'agi_rdnis': 'unknown', 'agi_request': 'agi://127.0.0.1:26000', 'agi_threadid': '-1237062800', 'agi_type': 'SIP', 'agi_uniqueid': '1353761065.856', 'agi_version': '10.3.1'} COMMAND: VERBOSE "Test message from FastAGI" 1 VERBOSE "Test message from FastAGI" 1 RESULT_LINE: Traceback (most recent call last): File "/home/koqep/venv/aster/opt/pyst_manager/myagi.py", line 10, in <module> agi.verbose('Test message from FastAGI', verbose_level) File "/home/koqep/venv/aster/lib/python2.7/site-packages/pyst-0.4.38-py2.7.egg/asterisk/agi.py", line 566, in verbose self.execute('VERBOSE', self._quote(message), level) File "/home/koqep/venv/aster/lib/python2.7/site-packages/pyst-0.4.38-py2.7.egg/asterisk/agi.py", line 105, in execute return self.get_result() File "/home/koqep/venv/aster/lib/python2.7/site-packages/pyst-0.4.38-py2.7.egg/asterisk/agi.py", line 133, in get_result code = int(code) ValueError: invalid literal for int() with base 10: '' Connection closed by foreign host. 2012/11/24 Ralf Schlatterbeck <rs...@ru...> > On Fri, Nov 23, 2012 at 04:01:37PM +0600, Vladimir wrote: > > Hi everyone > > > > Please show example FastAGI server on pyst. > > Since FastAGI simply forwards all the data from standard input and > standard output via a TCP socket, you should be able to drop your Pyst > Code into a call from inetd on the remote machine, e.g. in > /etc/inetd.conf you'd write something like > > 4711 stream tcp nowait root /path/to/pyst/script > > and then call this from asterisk with somethink like > > exten => s,n,AGI(agi://192.168.0.2:4711) > > In this way you leave the FastAGI network-specific code to inetd and you > should be able to use your local AGI Pyst code unmodified on the remote > server. > > Ralf > -- > Dr. Ralf Schlatterbeck Tel: +43/2243/26465-16 > Open Source Consulting www: http://www.runtux.com > Reichergasse 131, A-3411 Weidling email: of...@ru... > osAlliance member email: rs...@os... > |
From: Ralf S. <rs...@ru...> - 2012-11-24 09:02:04
|
On Fri, Nov 23, 2012 at 04:01:37PM +0600, Vladimir wrote: > Hi everyone > > Please show example FastAGI server on pyst. Since FastAGI simply forwards all the data from standard input and standard output via a TCP socket, you should be able to drop your Pyst Code into a call from inetd on the remote machine, e.g. in /etc/inetd.conf you'd write something like 4711 stream tcp nowait root /path/to/pyst/script and then call this from asterisk with somethink like exten => s,n,AGI(agi://192.168.0.2:4711) In this way you leave the FastAGI network-specific code to inetd and you should be able to use your local AGI Pyst code unmodified on the remote server. Ralf -- Dr. Ralf Schlatterbeck Tel: +43/2243/26465-16 Open Source Consulting www: http://www.runtux.com Reichergasse 131, A-3411 Weidling email: of...@ru... osAlliance member email: rs...@os... |
From: Vladimir <v....@gm...> - 2012-11-23 10:02:09
|
Hi everyone Please show example FastAGI server on pyst. Regards, Vladimir |
From: Ryan C. <ry...@cu...> - 2012-01-03 20:43:29
|
I'd like to edit this code to redial on a CHANUNAVAIL. How can I detect that in the agi script? Thanks! def connect_call(): if per_min <= max_rate: agi.execute('EXEC Dial', 'DAHDI/g1/1%s' % agi.env['agi_extension']) else: agi.stream_file("rateexceeds") agi.execute('EXEC Zapateller',) agi.set_variable('CDR(tag)', 'EXCEEDS RATE') CONFIDENTIALITY / PRIVILEGE NOTICE: This transmission and any attachments are intended solely for the addressee. This transmission is covered by the Electronic Communications Privacy Act, 18 U.S.C §§ 2510-2521. The information contained in this transmission is confidential in nature and protected from further use or disclosure under U.S. Pub. L. 106-102, 113 U.S. Stat. 1338 (1999), and may be subject to attorney-client or other legal privilege. Your use or disclosure of this information for any purpose other than that intended by its transmittal is strictly prohibited, and may subject you to fines and/or penalties under federal and state law. If you are not the intended recipient of this transmission, please DESTROY ALL COPIES RECEIVED and confirm destruction to the sender via return transmittal. |