Generated files by make
This commit is contained in:
1 parent
5dc07b628b
commit
00cb52915a
55 files changed
+18910
No files matched your search
@@ -0,0 +1,808 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>asterisk.agi — pyst2 0.4.9 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '../../',
|
||||
VERSION: '0.4.9',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="../../_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="../../_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="../../_static/doctools.js"></script>
|
||||
<link rel="top" title="pyst2 0.4.9 documentation" href="../../index.html" />
|
||||
<link rel="up" title="Module code" href="../index.html" />
|
||||
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
|
||||
|
||||
</head>
|
||||
<body role="document">
|
||||
|
||||
<div class="document">
|
||||
<div class="documentwrapper">
|
||||
<div class="bodywrapper">
|
||||
<div class="body" role="main">
|
||||
|
||||
<h1>Source code for asterisk.agi</h1><div class="highlight"><pre>
|
||||
<span></span><span class="ch">#!/usr/bin/env python2</span>
|
||||
<span class="c1"># vim: set et sw=4:</span>
|
||||
<span class="sd">"""</span>
|
||||
<span class="sd">.. module:: agi</span>
|
||||
<span class="sd"> :synopsis: This module contains functions and classes to implment AGI scripts in python. </span>
|
||||
<span class="sd"> </span>
|
||||
<span class="sd">pyvr</span>
|
||||
|
||||
<span class="sd">{'agi_callerid' : 'mars.putland.int',</span>
|
||||
<span class="sd"> 'agi_channel' : 'IAX[kputland@kputland]/119',</span>
|
||||
<span class="sd"> 'agi_context' : 'default',</span>
|
||||
<span class="sd"> 'agi_dnid' : '1000',</span>
|
||||
<span class="sd"> 'agi_enhanced' : '0.0',</span>
|
||||
<span class="sd"> 'agi_extension': '1000',</span>
|
||||
<span class="sd"> 'agi_language' : 'en',</span>
|
||||
<span class="sd"> 'agi_priority' : '1',</span>
|
||||
<span class="sd"> 'agi_rdnis' : '',</span>
|
||||
<span class="sd"> 'agi_request' : 'pyst',</span>
|
||||
<span class="sd"> 'agi_type' : 'IAX'}</span>
|
||||
|
||||
<span class="sd">Specification</span>
|
||||
<span class="sd">-------------</span>
|
||||
<span class="sd">"""</span>
|
||||
|
||||
<span class="kn">import</span> <span class="nn">sys</span>
|
||||
<span class="kn">import</span> <span class="nn">pprint</span>
|
||||
<span class="kn">import</span> <span class="nn">re</span>
|
||||
<span class="kn">import</span> <span class="nn">signal</span>
|
||||
|
||||
<span class="n">DEFAULT_TIMEOUT</span> <span class="o">=</span> <span class="mi">2000</span> <span class="c1"># 2sec timeout used as default for functions that take timeouts</span>
|
||||
<span class="n">DEFAULT_RECORD</span> <span class="o">=</span> <span class="mi">20000</span> <span class="c1"># 20sec record time</span>
|
||||
|
||||
<span class="n">re_code</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">r'(^\d*)\s*(.*)'</span><span class="p">)</span>
|
||||
<span class="n">re_kv</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">r'(?P<key>\w+)=(?P<value>[^\s]+)\s*(?:\((?P<data>.*)\))*'</span><span class="p">)</span>
|
||||
|
||||
|
||||
<span class="k">class</span> <span class="nc">AGIException</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
|
||||
<span class="k">pass</span>
|
||||
|
||||
|
||||
<span class="k">class</span> <span class="nc">AGIError</span><span class="p">(</span><span class="n">AGIException</span><span class="p">):</span>
|
||||
<span class="k">pass</span>
|
||||
|
||||
|
||||
<span class="k">class</span> <span class="nc">AGIUnknownError</span><span class="p">(</span><span class="n">AGIError</span><span class="p">):</span>
|
||||
<span class="k">pass</span>
|
||||
|
||||
|
||||
<span class="k">class</span> <span class="nc">AGIAppError</span><span class="p">(</span><span class="n">AGIError</span><span class="p">):</span>
|
||||
<span class="k">pass</span>
|
||||
|
||||
<span class="c1"># there are several different types of hangups we can detect</span>
|
||||
<span class="c1"># they all are derrived from AGIHangup</span>
|
||||
|
||||
|
||||
<span class="k">class</span> <span class="nc">AGIHangup</span><span class="p">(</span><span class="n">AGIAppError</span><span class="p">):</span>
|
||||
<span class="k">pass</span>
|
||||
|
||||
|
||||
<span class="k">class</span> <span class="nc">AGISIGHUPHangup</span><span class="p">(</span><span class="n">AGIHangup</span><span class="p">):</span>
|
||||
<span class="k">pass</span>
|
||||
|
||||
|
||||
<span class="k">class</span> <span class="nc">AGISIGPIPEHangup</span><span class="p">(</span><span class="n">AGIHangup</span><span class="p">):</span>
|
||||
<span class="k">pass</span>
|
||||
|
||||
|
||||
<span class="k">class</span> <span class="nc">AGIResultHangup</span><span class="p">(</span><span class="n">AGIHangup</span><span class="p">):</span>
|
||||
<span class="k">pass</span>
|
||||
|
||||
|
||||
<span class="k">class</span> <span class="nc">AGIDBError</span><span class="p">(</span><span class="n">AGIAppError</span><span class="p">):</span>
|
||||
<span class="k">pass</span>
|
||||
|
||||
|
||||
<span class="k">class</span> <span class="nc">AGIUsageError</span><span class="p">(</span><span class="n">AGIError</span><span class="p">):</span>
|
||||
<span class="k">pass</span>
|
||||
|
||||
|
||||
<span class="k">class</span> <span class="nc">AGIInvalidCommand</span><span class="p">(</span><span class="n">AGIError</span><span class="p">):</span>
|
||||
<span class="k">pass</span>
|
||||
|
||||
|
||||
<div class="viewcode-block" id="AGI"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI">[docs]</a><span class="k">class</span> <span class="nc">AGI</span><span class="p">:</span>
|
||||
<span class="sd">"""</span>
|
||||
<span class="sd"> This class encapsulates communication between Asterisk an a python script.</span>
|
||||
<span class="sd"> It handles encoding commands to Asterisk and parsing responses from</span>
|
||||
<span class="sd"> Asterisk.</span>
|
||||
<span class="sd"> """</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stdin</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stdin</span><span class="p">,</span> <span class="n">stdout</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="p">,</span> <span class="n">stderr</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="p">):</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">stdin</span> <span class="o">=</span> <span class="n">stdin</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="n">stdout</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">stderr</span> <span class="o">=</span> <span class="n">stderr</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_got_sighup</span> <span class="o">=</span> <span class="bp">False</span>
|
||||
<span class="n">signal</span><span class="o">.</span><span class="n">signal</span><span class="p">(</span><span class="n">signal</span><span class="o">.</span><span class="n">SIGHUP</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handle_sighup</span><span class="p">)</span> <span class="c1"># handle SIGHUP</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'ARGS: '</span><span class="p">)</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">))</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">env</span> <span class="o">=</span> <span class="p">{}</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_get_agi_env</span><span class="p">()</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">_get_agi_env</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
|
||||
<span class="n">line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'ENV LINE: '</span><span class="p">)</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
|
||||
<span class="k">if</span> <span class="n">line</span> <span class="o">==</span> <span class="s1">''</span><span class="p">:</span>
|
||||
<span class="c1">#blank line signals end</span>
|
||||
<span class="k">break</span>
|
||||
<span class="n">key</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">':'</span><span class="p">)[</span><span class="mi">0</span><span class="p">],</span> <span class="s1">':'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">':'</span><span class="p">)[</span><span class="mi">1</span><span class="p">:])</span>
|
||||
<span class="n">key</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
|
||||
<span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
|
||||
<span class="k">if</span> <span class="n">key</span> <span class="o">!=</span> <span class="s1">''</span><span class="p">:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">data</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'class AGI: self.env = '</span><span class="p">)</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">pprint</span><span class="o">.</span><span class="n">pformat</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">))</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">_quote</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">string</span><span class="p">):</span>
|
||||
<span class="sd">""" provides double quotes to string, converts int/bool to string """</span>
|
||||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
|
||||
<span class="n">string</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
|
||||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="nb">float</span><span class="p">):</span>
|
||||
<span class="n">string</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
|
||||
<span class="k">return</span> <span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s1">'"'</span><span class="p">,</span> <span class="n">string</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">'ascii'</span><span class="p">,</span> <span class="s1">'ignore'</span><span class="p">),</span> <span class="s1">'"'</span><span class="p">])</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">_handle_sighup</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">signum</span><span class="p">,</span> <span class="n">frame</span><span class="p">):</span>
|
||||
<span class="sd">"""Handle the SIGHUP signal"""</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_got_sighup</span> <span class="o">=</span> <span class="bp">True</span>
|
||||
|
||||
<div class="viewcode-block" id="AGI.test_hangup"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.test_hangup">[docs]</a> <span class="k">def</span> <span class="nf">test_hangup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="sd">"""This function throws AGIHangup if we have recieved a SIGHUP"""</span>
|
||||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_got_sighup</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGISIGHUPHangup</span><span class="p">(</span><span class="s2">"Received SIGHUP from Asterisk"</span><span class="p">)</span></div>
|
||||
|
||||
<span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">command</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">test_hangup</span><span class="p">()</span>
|
||||
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">send_command</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span>
|
||||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_result</span><span class="p">()</span>
|
||||
<span class="k">except</span> <span class="ne">IOError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
||||
<span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">errno</span> <span class="o">==</span> <span class="mi">32</span><span class="p">:</span>
|
||||
<span class="c1"># Broken Pipe * let us go</span>
|
||||
<span class="k">raise</span> <span class="n">AGISIGPIPEHangup</span><span class="p">(</span><span class="s2">"Received SIGPIPE"</span><span class="p">)</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">raise</span>
|
||||
|
||||
<div class="viewcode-block" id="AGI.send_command"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.send_command">[docs]</a> <span class="k">def</span> <span class="nf">send_command</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">command</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
|
||||
<span class="sd">"""Send a command to Asterisk"""</span>
|
||||
<span class="n">command</span> <span class="o">=</span> <span class="n">command</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
|
||||
<span class="n">command</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="s1">' '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">)))</span>
|
||||
<span class="n">command</span> <span class="o">=</span> <span class="n">command</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
|
||||
<span class="k">if</span> <span class="n">command</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">:</span>
|
||||
<span class="n">command</span> <span class="o">+=</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">' COMMAND: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">command</span><span class="p">)</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">command</span><span class="p">)</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.get_result"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.get_result">[docs]</a> <span class="k">def</span> <span class="nf">get_result</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stdin</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stdin</span><span class="p">):</span>
|
||||
<span class="sd">"""Read the result of a command from Asterisk"""</span>
|
||||
<span class="n">code</span> <span class="o">=</span> <span class="mi">0</span>
|
||||
<span class="n">result</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'result'</span><span class="p">:</span> <span class="p">(</span><span class="s1">''</span><span class="p">,</span> <span class="s1">''</span><span class="p">)}</span>
|
||||
<span class="n">line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">' RESULT_LINE: </span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="n">line</span><span class="p">)</span>
|
||||
<span class="n">m</span> <span class="o">=</span> <span class="n">re_code</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
|
||||
<span class="k">if</span> <span class="n">m</span><span class="p">:</span>
|
||||
<span class="n">code</span><span class="p">,</span> <span class="n">response</span> <span class="o">=</span> <span class="n">m</span><span class="o">.</span><span class="n">groups</span><span class="p">()</span>
|
||||
<span class="n">code</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">code</span><span class="p">)</span>
|
||||
|
||||
<span class="k">if</span> <span class="n">code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
|
||||
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">data</span> <span class="ow">in</span> <span class="n">re_kv</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">response</span><span class="p">):</span>
|
||||
<span class="n">result</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
|
||||
|
||||
<span class="c1"># If user hangs up... we get 'hangup' in the data</span>
|
||||
<span class="k">if</span> <span class="n">data</span> <span class="o">==</span> <span class="s1">'hangup'</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIResultHangup</span><span class="p">(</span><span class="s2">"User hungup during execution"</span><span class="p">)</span>
|
||||
|
||||
<span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'result'</span> <span class="ow">and</span> <span class="n">value</span> <span class="o">==</span> <span class="s1">'-1'</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIAppError</span><span class="p">(</span><span class="s2">"Error executing application, or hangup"</span><span class="p">)</span>
|
||||
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">' RESULT_DICT: </span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="n">pprint</span><span class="o">.</span><span class="n">pformat</span><span class="p">(</span><span class="n">result</span><span class="p">))</span>
|
||||
<span class="k">return</span> <span class="n">result</span>
|
||||
<span class="k">elif</span> <span class="n">code</span> <span class="o">==</span> <span class="mi">510</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIInvalidCommand</span><span class="p">(</span><span class="n">response</span><span class="p">)</span>
|
||||
<span class="k">elif</span> <span class="n">code</span> <span class="o">==</span> <span class="mi">520</span><span class="p">:</span>
|
||||
<span class="n">usage</span> <span class="o">=</span> <span class="p">[</span><span class="n">line</span><span class="p">]</span>
|
||||
<span class="n">line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
|
||||
<span class="k">while</span> <span class="n">line</span><span class="p">[:</span><span class="mi">3</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">'520'</span><span class="p">:</span>
|
||||
<span class="n">usage</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
|
||||
<span class="n">line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
|
||||
<span class="n">usage</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
|
||||
<span class="n">usage</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">usage</span><span class="p">)</span>
|
||||
<span class="k">raise</span> <span class="n">AGIUsageError</span><span class="p">(</span><span class="n">usage</span><span class="p">)</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIUnknownError</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="s1">'Unhandled code or undefined response'</span><span class="p">)</span></div>
|
||||
|
||||
<span class="k">def</span> <span class="nf">_process_digit_list</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">digits</span><span class="p">):</span>
|
||||
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">digits</span><span class="p">)</span> <span class="ow">is</span> <span class="nb">list</span><span class="p">:</span>
|
||||
<span class="n">digits</span> <span class="o">=</span> <span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">digits</span><span class="p">))</span>
|
||||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">digits</span><span class="p">)</span>
|
||||
|
||||
<div class="viewcode-block" id="AGI.answer"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.answer">[docs]</a> <span class="k">def</span> <span class="nf">answer</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.answer() --> None</span>
|
||||
<span class="sd"> Answer channel if not already in answer state.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'ANSWER'</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.wait_for_digit"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.wait_for_digit">[docs]</a> <span class="k">def</span> <span class="nf">wait_for_digit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">DEFAULT_TIMEOUT</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.wait_for_digit(timeout=DEFAULT_TIMEOUT) --> digit</span>
|
||||
<span class="sd"> Waits for up to 'timeout' milliseconds for a channel to receive a DTMF</span>
|
||||
<span class="sd"> digit. Returns digit dialed</span>
|
||||
<span class="sd"> Throws AGIError on channel falure</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'WAIT FOR DIGIT'</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="s1">''</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
|
||||
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to digit: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.send_text"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.send_text">[docs]</a> <span class="k">def</span> <span class="nf">send_text</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.send_text(text='') --> None</span>
|
||||
<span class="sd"> Sends the given text on a channel. Most channels do not support the</span>
|
||||
<span class="sd"> transmission of text.</span>
|
||||
<span class="sd"> Throws AGIError on error/hangup</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SEND TEXT'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">text</span><span class="p">))[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.receive_char"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.receive_char">[docs]</a> <span class="k">def</span> <span class="nf">receive_char</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">DEFAULT_TIMEOUT</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.receive_char(timeout=DEFAULT_TIMEOUT) --> chr</span>
|
||||
<span class="sd"> Receives a character of text on a channel. Specify timeout to be the</span>
|
||||
<span class="sd"> maximum time to wait for input in milliseconds, or 0 for infinite. Most channels</span>
|
||||
<span class="sd"> do not support the reception of text.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'RECEIVE CHAR'</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
|
||||
|
||||
<span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="s1">''</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
|
||||
<span class="k">except</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.tdd_mode"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.tdd_mode">[docs]</a> <span class="k">def</span> <span class="nf">tdd_mode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s1">'off'</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.tdd_mode(mode='on'|'off') --> None</span>
|
||||
<span class="sd"> Enable/Disable TDD transmission/reception on a channel.</span>
|
||||
<span class="sd"> Throws AGIAppError if channel is not TDD-capable.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'TDD MODE'</span><span class="p">,</span> <span class="n">mode</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIAppError</span><span class="p">(</span><span class="s1">'Channel </span><span class="si">%s</span><span class="s1"> is not TDD-capable'</span><span class="p">)</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.stream_file"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.stream_file">[docs]</a> <span class="k">def</span> <span class="nf">stream_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">sample_offset</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.stream_file(filename, escape_digits='', sample_offset=0) --> digit</span>
|
||||
<span class="sd"> Send the given file, allowing playback to be interrupted by the given</span>
|
||||
<span class="sd"> digits, if any. escape_digits is a string '12345' or a list of</span>
|
||||
<span class="sd"> ints [1,2,3,4,5] or strings ['1','2','3'] or mixed [1,'2',3,'4']</span>
|
||||
<span class="sd"> If sample offset is provided then the audio will seek to sample</span>
|
||||
<span class="sd"> offset before play starts. Returns digit if one was pressed.</span>
|
||||
<span class="sd"> Throws AGIError if the channel was disconnected. Remember, the file</span>
|
||||
<span class="sd"> extension must not be included in the filename.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
|
||||
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
|
||||
<span class="s1">'STREAM FILE'</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">escape_digits</span><span class="p">,</span> <span class="n">sample_offset</span><span class="p">)</span>
|
||||
<span class="n">res</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="s1">''</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
|
||||
<span class="k">except</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.control_stream_file"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.control_stream_file">[docs]</a> <span class="k">def</span> <span class="nf">control_stream_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">skipms</span><span class="o">=</span><span class="mi">3000</span><span class="p">,</span> <span class="n">fwd</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">rew</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">pause</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
|
||||
<span class="sd">"""</span>
|
||||
<span class="sd"> Send the given file, allowing playback to be interrupted by the given</span>
|
||||
<span class="sd"> digits, if any. escape_digits is a string '12345' or a list of</span>
|
||||
<span class="sd"> ints [1,2,3,4,5] or strings ['1','2','3'] or mixed [1,'2',3,'4']</span>
|
||||
<span class="sd"> If sample offset is provided then the audio will seek to sample</span>
|
||||
<span class="sd"> offset before play starts. Returns digit if one was pressed.</span>
|
||||
<span class="sd"> Throws AGIError if the channel was disconnected. Remember, the file</span>
|
||||
<span class="sd"> extension must not be included in the filename.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
|
||||
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'CONTROL STREAM FILE'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">filename</span><span class="p">),</span> <span class="n">escape_digits</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">skipms</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">fwd</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">rew</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">pause</span><span class="p">))</span>
|
||||
<span class="n">res</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="s1">''</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
|
||||
<span class="k">except</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.send_image"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.send_image">[docs]</a> <span class="k">def</span> <span class="nf">send_image</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.send_image(filename) --> None</span>
|
||||
<span class="sd"> Sends the given image on a channel. Most channels do not support the</span>
|
||||
<span class="sd"> transmission of images. Image names should not include extensions.</span>
|
||||
<span class="sd"> Throws AGIError on channel failure</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SEND IMAGE'</span><span class="p">,</span> <span class="n">filename</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="n">res</span> <span class="o">!=</span> <span class="s1">'0'</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIAppError</span><span class="p">(</span><span class="s1">'Channel falure on channel </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'agi_channel'</span><span class="p">,</span> <span class="s1">'UNKNOWN'</span><span class="p">))</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.say_digits"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.say_digits">[docs]</a> <span class="k">def</span> <span class="nf">say_digits</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">digits</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.say_digits(digits, escape_digits='') --> digit</span>
|
||||
<span class="sd"> Say a given digit string, returning early if any of the given DTMF digits</span>
|
||||
<span class="sd"> are received on the channel.</span>
|
||||
<span class="sd"> Throws AGIError on channel failure</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">digits</span><span class="p">)</span>
|
||||
<span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
|
||||
<span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SAY DIGITS'</span><span class="p">,</span> <span class="n">digits</span><span class="p">,</span> <span class="n">escape_digits</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="s1">''</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
|
||||
<span class="k">except</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.say_number"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.say_number">[docs]</a> <span class="k">def</span> <span class="nf">say_number</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">number</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.say_number(number, escape_digits='') --> digit</span>
|
||||
<span class="sd"> Say a given digit string, returning early if any of the given DTMF digits</span>
|
||||
<span class="sd"> are received on the channel.</span>
|
||||
<span class="sd"> Throws AGIError on channel failure</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">number</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">number</span><span class="p">)</span>
|
||||
<span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
|
||||
<span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SAY NUMBER'</span><span class="p">,</span> <span class="n">number</span><span class="p">,</span> <span class="n">escape_digits</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="s1">''</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
|
||||
<span class="k">except</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.say_alpha"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.say_alpha">[docs]</a> <span class="k">def</span> <span class="nf">say_alpha</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">characters</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.say_alpha(string, escape_digits='') --> digit</span>
|
||||
<span class="sd"> Say a given character string, returning early if any of the given DTMF</span>
|
||||
<span class="sd"> digits are received on the channel.</span>
|
||||
<span class="sd"> Throws AGIError on channel failure</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">characters</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">characters</span><span class="p">)</span>
|
||||
<span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
|
||||
<span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SAY ALPHA'</span><span class="p">,</span> <span class="n">characters</span><span class="p">,</span> <span class="n">escape_digits</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="s1">''</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
|
||||
<span class="k">except</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.say_phonetic"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.say_phonetic">[docs]</a> <span class="k">def</span> <span class="nf">say_phonetic</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">characters</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.say_phonetic(string, escape_digits='') --> digit</span>
|
||||
<span class="sd"> Phonetically say a given character string, returning early if any of</span>
|
||||
<span class="sd"> the given DTMF digits are received on the channel.</span>
|
||||
<span class="sd"> Throws AGIError on channel failure</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">characters</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">characters</span><span class="p">)</span>
|
||||
<span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
|
||||
<span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
|
||||
<span class="s1">'SAY PHONETIC'</span><span class="p">,</span> <span class="n">characters</span><span class="p">,</span> <span class="n">escape_digits</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="s1">''</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
|
||||
<span class="k">except</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.say_date"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.say_date">[docs]</a> <span class="k">def</span> <span class="nf">say_date</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">seconds</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.say_date(seconds, escape_digits='') --> digit</span>
|
||||
<span class="sd"> Say a given date, returning early if any of the given DTMF digits are</span>
|
||||
<span class="sd"> pressed. The date should be in seconds since the UNIX Epoch (Jan 1, 1970 00:00:00)</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
|
||||
<span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SAY DATE'</span><span class="p">,</span> <span class="n">seconds</span><span class="p">,</span> <span class="n">escape_digits</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="s1">''</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
|
||||
<span class="k">except</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.say_time"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.say_time">[docs]</a> <span class="k">def</span> <span class="nf">say_time</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">seconds</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.say_time(seconds, escape_digits='') --> digit</span>
|
||||
<span class="sd"> Say a given time, returning early if any of the given DTMF digits are</span>
|
||||
<span class="sd"> pressed. The time should be in seconds since the UNIX Epoch (Jan 1, 1970 00:00:00)</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
|
||||
<span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SAY TIME'</span><span class="p">,</span> <span class="n">seconds</span><span class="p">,</span> <span class="n">escape_digits</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="s1">''</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
|
||||
<span class="k">except</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.say_datetime"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.say_datetime">[docs]</a> <span class="k">def</span> <span class="nf">say_datetime</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">seconds</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">zone</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.say_datetime(seconds, escape_digits='', format='', zone='') --> digit</span>
|
||||
<span class="sd"> Say a given date in the format specfied (see voicemail.conf), returning</span>
|
||||
<span class="sd"> early if any of the given DTMF digits are pressed. The date should be</span>
|
||||
<span class="sd"> in seconds since the UNIX Epoch (Jan 1, 1970 00:00:00).</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
|
||||
<span class="k">if</span> <span class="n">format</span><span class="p">:</span>
|
||||
<span class="n">format</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">format</span><span class="p">)</span>
|
||||
<span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
|
||||
<span class="s1">'SAY DATETIME'</span><span class="p">,</span> <span class="n">seconds</span><span class="p">,</span> <span class="n">escape_digits</span><span class="p">,</span> <span class="n">format</span><span class="p">,</span> <span class="n">zone</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="s1">''</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
|
||||
<span class="k">except</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.get_data"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.get_data">[docs]</a> <span class="k">def</span> <span class="nf">get_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">DEFAULT_TIMEOUT</span><span class="p">,</span> <span class="n">max_digits</span><span class="o">=</span><span class="mi">255</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.get_data(filename, timeout=DEFAULT_TIMEOUT, max_digits=255) --> digits</span>
|
||||
<span class="sd"> Stream the given file and receive dialed digits</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'GET DATA'</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">max_digits</span><span class="p">)</span>
|
||||
<span class="n">res</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">'result'</span><span class="p">]</span>
|
||||
<span class="k">return</span> <span class="n">res</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.get_option"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.get_option">[docs]</a> <span class="k">def</span> <span class="nf">get_option</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.get_option(filename, escape_digits='', timeout=0) --> digit</span>
|
||||
<span class="sd"> Send the given file, allowing playback to be interrupted by the given</span>
|
||||
<span class="sd"> digits, if any. escape_digits is a string '12345' or a list of</span>
|
||||
<span class="sd"> ints [1,2,3,4,5] or strings ['1','2','3'] or mixed [1,'2',3,'4']</span>
|
||||
<span class="sd"> Returns digit if one was pressed.</span>
|
||||
<span class="sd"> Throws AGIError if the channel was disconnected. Remember, the file</span>
|
||||
<span class="sd"> extension must not be included in the filename.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
|
||||
<span class="k">if</span> <span class="n">timeout</span><span class="p">:</span>
|
||||
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
|
||||
<span class="s1">'GET OPTION'</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">escape_digits</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'GET OPTION'</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">escape_digits</span><span class="p">)</span>
|
||||
|
||||
<span class="n">res</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="s1">''</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
|
||||
<span class="k">except</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.set_context"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.set_context">[docs]</a> <span class="k">def</span> <span class="nf">set_context</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.set_context(context)</span>
|
||||
<span class="sd"> Sets the context for continuation upon exiting the application.</span>
|
||||
<span class="sd"> No error appears to be produced. Does not set exten or priority</span>
|
||||
<span class="sd"> Use at your own risk. Ensure that you specify a valid context.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SET CONTEXT'</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.set_extension"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.set_extension">[docs]</a> <span class="k">def</span> <span class="nf">set_extension</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">extension</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.set_extension(extension)</span>
|
||||
<span class="sd"> Sets the extension for continuation upon exiting the application.</span>
|
||||
<span class="sd"> No error appears to be produced. Does not set context or priority</span>
|
||||
<span class="sd"> Use at your own risk. Ensure that you specify a valid extension.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SET EXTENSION'</span><span class="p">,</span> <span class="n">extension</span><span class="p">)</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.set_priority"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.set_priority">[docs]</a> <span class="k">def</span> <span class="nf">set_priority</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">priority</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.set_priority(priority)</span>
|
||||
<span class="sd"> Sets the priority for continuation upon exiting the application.</span>
|
||||
<span class="sd"> No error appears to be produced. Does not set exten or context</span>
|
||||
<span class="sd"> Use at your own risk. Ensure that you specify a valid priority.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'set priority'</span><span class="p">,</span> <span class="n">priority</span><span class="p">)</span></div>
|
||||
|
||||
<span class="k">def</span> <span class="nf">goto_on_exit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">extension</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">priority</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
|
||||
<span class="n">context</span> <span class="o">=</span> <span class="n">context</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s1">'agi_context'</span><span class="p">]</span>
|
||||
<span class="n">extension</span> <span class="o">=</span> <span class="n">extension</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s1">'agi_extension'</span><span class="p">]</span>
|
||||
<span class="n">priority</span> <span class="o">=</span> <span class="n">priority</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s1">'agi_priority'</span><span class="p">]</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">set_context</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">set_extension</span><span class="p">(</span><span class="n">extension</span><span class="p">)</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">set_priority</span><span class="p">(</span><span class="n">priority</span><span class="p">)</span>
|
||||
|
||||
<div class="viewcode-block" id="AGI.record_file"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.record_file">[docs]</a> <span class="k">def</span> <span class="nf">record_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="s1">'gsm'</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">'#'</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">DEFAULT_RECORD</span><span class="p">,</span> <span class="n">offset</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">beep</span><span class="o">=</span><span class="s1">'beep'</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.record_file(filename, format, escape_digits, timeout=DEFAULT_TIMEOUT, offset=0, beep='beep') --> None</span>
|
||||
<span class="sd"> Record to a file until a given dtmf digit in the sequence is received</span>
|
||||
<span class="sd"> The format will specify what kind of file will be recorded. The timeout</span>
|
||||
<span class="sd"> is the maximum record time in milliseconds, or -1 for no timeout. Offset</span>
|
||||
<span class="sd"> samples is optional, and if provided will seek to the offset without</span>
|
||||
<span class="sd"> exceeding the end of the file</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
|
||||
<span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'RECORD FILE'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">filename</span><span class="p">),</span> <span class="n">format</span><span class="p">,</span>
|
||||
<span class="n">escape_digits</span><span class="p">,</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">beep</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
|
||||
<span class="k">except</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to digit: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.set_autohangup"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.set_autohangup">[docs]</a> <span class="k">def</span> <span class="nf">set_autohangup</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">secs</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.set_autohangup(secs) --> None</span>
|
||||
<span class="sd"> Cause the channel to automatically hangup at <secs> seconds in the</span>
|
||||
<span class="sd"> future. Of course it can be hungup before then as well. Setting to</span>
|
||||
<span class="sd"> 0 will cause the autohangup feature to be disabled on this channel.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SET AUTOHANGUP'</span><span class="p">,</span> <span class="n">secs</span><span class="p">)</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.hangup"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.hangup">[docs]</a> <span class="k">def</span> <span class="nf">hangup</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">channel</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.hangup(channel='')</span>
|
||||
<span class="sd"> Hangs up the specified channel.</span>
|
||||
<span class="sd"> If no channel name is given, hangs up the current channel</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'HANGUP'</span><span class="p">,</span> <span class="n">channel</span><span class="p">)</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.appexec"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.appexec">[docs]</a> <span class="k">def</span> <span class="nf">appexec</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">application</span><span class="p">,</span> <span class="n">options</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.appexec(application, options='')</span>
|
||||
<span class="sd"> Executes <application> with given <options>.</span>
|
||||
<span class="sd"> Returns whatever the application returns, or -2 on failure to find</span>
|
||||
<span class="sd"> application</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'EXEC'</span><span class="p">,</span> <span class="n">application</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">options</span><span class="p">))</span>
|
||||
<span class="n">res</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'-2'</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIAppError</span><span class="p">(</span><span class="s1">'Unable to find application: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">application</span><span class="p">)</span>
|
||||
<span class="k">return</span> <span class="n">res</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.set_callerid"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.set_callerid">[docs]</a> <span class="k">def</span> <span class="nf">set_callerid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">number</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.set_callerid(number) --> None</span>
|
||||
<span class="sd"> Changes the callerid of the current channel.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SET CALLERID'</span><span class="p">,</span> <span class="n">number</span><span class="p">)</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.channel_status"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.channel_status">[docs]</a> <span class="k">def</span> <span class="nf">channel_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">channel</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.channel_status(channel='') --> int</span>
|
||||
<span class="sd"> Returns the status of the specified channel. If no channel name is</span>
|
||||
<span class="sd"> given the returns the status of the current channel.</span>
|
||||
|
||||
<span class="sd"> Return values:</span>
|
||||
<span class="sd"> 0 Channel is down and available</span>
|
||||
<span class="sd"> 1 Channel is down, but reserved</span>
|
||||
<span class="sd"> 2 Channel is off hook</span>
|
||||
<span class="sd"> 3 Digits (or equivalent) have been dialed</span>
|
||||
<span class="sd"> 4 Line is ringing</span>
|
||||
<span class="sd"> 5 Remote end is ringing</span>
|
||||
<span class="sd"> 6 Line is up</span>
|
||||
<span class="sd"> 7 Line is busy</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'CHANNEL STATUS'</span><span class="p">,</span> <span class="n">channel</span><span class="p">)</span>
|
||||
<span class="k">except</span> <span class="n">AGIHangup</span><span class="p">:</span>
|
||||
<span class="k">raise</span>
|
||||
<span class="k">except</span> <span class="n">AGIAppError</span><span class="p">:</span>
|
||||
<span class="n">result</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'result'</span><span class="p">:</span> <span class="p">(</span><span class="s1">'-1'</span><span class="p">,</span> <span class="s1">''</span><span class="p">)}</span>
|
||||
|
||||
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">])</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.set_variable"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.set_variable">[docs]</a> <span class="k">def</span> <span class="nf">set_variable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
||||
<span class="sd">"""Set a channel variable.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SET VARIABLE'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">name</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">value</span><span class="p">))</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.get_variable"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.get_variable">[docs]</a> <span class="k">def</span> <span class="nf">get_variable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
||||
<span class="sd">"""Get a channel variable.</span>
|
||||
|
||||
<span class="sd"> This function returns the value of the indicated channel variable. If</span>
|
||||
<span class="sd"> the variable is not set, an empty string is returned.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'GET VARIABLE'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
|
||||
<span class="k">except</span> <span class="n">AGIResultHangup</span><span class="p">:</span>
|
||||
<span class="n">result</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'result'</span><span class="p">:</span> <span class="p">(</span><span class="s1">'1'</span><span class="p">,</span> <span class="s1">'hangup'</span><span class="p">)}</span>
|
||||
|
||||
<span class="n">res</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">'result'</span><span class="p">]</span>
|
||||
<span class="k">return</span> <span class="n">value</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.get_full_variable"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.get_full_variable">[docs]</a> <span class="k">def</span> <span class="nf">get_full_variable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">channel</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
|
||||
<span class="sd">"""Get a channel variable.</span>
|
||||
|
||||
<span class="sd"> This function returns the value of the indicated channel variable. If</span>
|
||||
<span class="sd"> the variable is not set, an empty string is returned.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="k">if</span> <span class="n">channel</span><span class="p">:</span>
|
||||
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'GET FULL VARIABLE'</span><span class="p">,</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">name</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">channel</span><span class="p">))</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'GET FULL VARIABLE'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
|
||||
|
||||
<span class="k">except</span> <span class="n">AGIResultHangup</span><span class="p">:</span>
|
||||
<span class="n">result</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'result'</span><span class="p">:</span> <span class="p">(</span><span class="s1">'1'</span><span class="p">,</span> <span class="s1">'hangup'</span><span class="p">)}</span>
|
||||
|
||||
<span class="n">res</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">'result'</span><span class="p">]</span>
|
||||
<span class="k">return</span> <span class="n">value</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.verbose"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.verbose">[docs]</a> <span class="k">def</span> <span class="nf">verbose</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.verbose(message='', level=1) --> None</span>
|
||||
<span class="sd"> Sends <message> to the console via verbose message system.</span>
|
||||
<span class="sd"> <level> is the the verbose level (1-4)</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'VERBOSE'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">message</span><span class="p">),</span> <span class="n">level</span><span class="p">)</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.database_get"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.database_get">[docs]</a> <span class="k">def</span> <span class="nf">database_get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">family</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.database_get(family, key) --> str</span>
|
||||
<span class="sd"> Retrieves an entry in the Asterisk database for a given family and key.</span>
|
||||
<span class="sd"> Returns 0 if <key> is not set. Returns 1 if <key></span>
|
||||
<span class="sd"> is set and returns the variable in parenthesis</span>
|
||||
<span class="sd"> example return code: 200 result=1 (testvariable)</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">family</span> <span class="o">=</span> <span class="s1">'"</span><span class="si">%s</span><span class="s1">"'</span> <span class="o">%</span> <span class="n">family</span>
|
||||
<span class="n">key</span> <span class="o">=</span> <span class="s1">'"</span><span class="si">%s</span><span class="s1">"'</span> <span class="o">%</span> <span class="n">key</span>
|
||||
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
|
||||
<span class="s1">'DATABASE GET'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">family</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">key</span><span class="p">))</span>
|
||||
<span class="n">res</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">'result'</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIDBError</span><span class="p">(</span><span class="s1">'Key not found in database: family=</span><span class="si">%s</span><span class="s1">, key=</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span>
|
||||
<span class="p">(</span><span class="n">family</span><span class="p">,</span> <span class="n">key</span><span class="p">))</span>
|
||||
<span class="k">elif</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'1'</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="n">value</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unknown exception for : family=</span><span class="si">%s</span><span class="s1">, key=</span><span class="si">%s</span><span class="s1">, result=</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">family</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">pprint</span><span class="o">.</span><span class="n">pformat</span><span class="p">(</span><span class="n">result</span><span class="p">)))</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.database_put"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.database_put">[docs]</a> <span class="k">def</span> <span class="nf">database_put</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">family</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.database_put(family, key, value) --> None</span>
|
||||
<span class="sd"> Adds or updates an entry in the Asterisk database for a</span>
|
||||
<span class="sd"> given family, key, and value.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'DATABASE PUT'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span>
|
||||
<span class="n">family</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">key</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
|
||||
<span class="n">res</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">'result'</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIDBError</span><span class="p">(</span><span class="s1">'Unable to put vaule in databale: family=</span><span class="si">%s</span><span class="s1">, key=</span><span class="si">%s</span><span class="s1">, value=</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">family</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.database_del"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.database_del">[docs]</a> <span class="k">def</span> <span class="nf">database_del</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">family</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.database_del(family, key) --> None</span>
|
||||
<span class="sd"> Deletes an entry in the Asterisk database for a</span>
|
||||
<span class="sd"> given family and key.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
|
||||
<span class="s1">'DATABASE DEL'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">family</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">key</span><span class="p">))</span>
|
||||
<span class="n">res</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">'result'</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIDBError</span><span class="p">(</span><span class="s1">'Unable to delete from database: family=</span><span class="si">%s</span><span class="s1">, key=</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">family</span><span class="p">,</span> <span class="n">key</span><span class="p">))</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.database_deltree"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.database_deltree">[docs]</a> <span class="k">def</span> <span class="nf">database_deltree</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">family</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.database_deltree(family, key='') --> None</span>
|
||||
<span class="sd"> Deletes a family or specific keytree with in a family</span>
|
||||
<span class="sd"> in the Asterisk database.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
|
||||
<span class="s1">'DATABASE DELTREE'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">family</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">key</span><span class="p">))</span>
|
||||
<span class="n">res</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">'result'</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">AGIDBError</span><span class="p">(</span><span class="s1">'Unable to delete tree from database: family=</span><span class="si">%s</span><span class="s1">, key=</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">family</span><span class="p">,</span> <span class="n">key</span><span class="p">))</span></div>
|
||||
|
||||
<div class="viewcode-block" id="AGI.noop"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.noop">[docs]</a> <span class="k">def</span> <span class="nf">noop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="sd">"""agi.noop() --> None</span>
|
||||
<span class="sd"> Does nothing</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'NOOP'</span><span class="p">)</span></div></div>
|
||||
|
||||
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
|
||||
<span class="n">agi</span> <span class="o">=</span> <span class="n">AGI</span><span class="p">()</span>
|
||||
<span class="c1">#agi.appexec('festival','Welcome to Klass Technologies. Thank you for calling.')</span>
|
||||
<span class="c1">#agi.appexec('festival','This is a test of the text to speech engine.')</span>
|
||||
<span class="c1">#agi.appexec('festival','Press 1 for sales ')</span>
|
||||
<span class="c1">#agi.appexec('festival','Press 2 for customer support ')</span>
|
||||
<span class="c1">#agi.hangup()</span>
|
||||
<span class="c1">#agi.goto_on_exit(extension='1234', priority='1')</span>
|
||||
<span class="c1">#sys.exit(0)</span>
|
||||
<span class="c1">#agi.say_digits('123', [4,'5',6])</span>
|
||||
<span class="c1">#agi.say_digits([4,5,6])</span>
|
||||
<span class="c1">#agi.say_number('1234')</span>
|
||||
<span class="c1">#agi.say_number('01234') # 668</span>
|
||||
<span class="c1">#agi.say_number('0xf5') # 245</span>
|
||||
<span class="n">agi</span><span class="o">.</span><span class="n">get_data</span><span class="p">(</span><span class="s1">'demo-congrats'</span><span class="p">)</span>
|
||||
<span class="n">agi</span><span class="o">.</span><span class="n">hangup</span><span class="p">()</span>
|
||||
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
|
||||
<span class="c1">#agi.record_file('pyst-test') #FAILS</span>
|
||||
<span class="c1">#agi.stream_file('demo-congrats', [1,2,3,4,5,6,7,8,9,0,'#','*'])</span>
|
||||
<span class="c1">#agi.appexec('background','demo-congrats')</span>
|
||||
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="n">agi</span><span class="o">.</span><span class="n">appexec</span><span class="p">(</span><span class="s1">'backgrounder'</span><span class="p">,</span> <span class="s1">'demo-congrats'</span><span class="p">)</span>
|
||||
<span class="k">except</span> <span class="n">AGIAppError</span><span class="p">:</span>
|
||||
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span>
|
||||
<span class="s2">"Handled exception for missing application backgrounder</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
|
||||
|
||||
<span class="n">agi</span><span class="o">.</span><span class="n">set_variable</span><span class="p">(</span><span class="s1">'foo'</span><span class="p">,</span> <span class="s1">'bar'</span><span class="p">)</span>
|
||||
<span class="n">agi</span><span class="o">.</span><span class="n">get_variable</span><span class="p">(</span><span class="s1">'foo'</span><span class="p">)</span>
|
||||
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="n">agi</span><span class="o">.</span><span class="n">get_variable</span><span class="p">(</span><span class="s1">'foobar'</span><span class="p">)</span>
|
||||
<span class="k">except</span> <span class="n">AGIAppError</span><span class="p">:</span>
|
||||
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">"Handled exception for missing variable foobar</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
|
||||
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="n">agi</span><span class="o">.</span><span class="n">database_put</span><span class="p">(</span><span class="s1">'foo'</span><span class="p">,</span> <span class="s1">'bar'</span><span class="p">,</span> <span class="s1">'foobar'</span><span class="p">)</span>
|
||||
<span class="n">agi</span><span class="o">.</span><span class="n">database_put</span><span class="p">(</span><span class="s1">'foo'</span><span class="p">,</span> <span class="s1">'baz'</span><span class="p">,</span> <span class="s1">'foobaz'</span><span class="p">)</span>
|
||||
<span class="n">agi</span><span class="o">.</span><span class="n">database_put</span><span class="p">(</span><span class="s1">'foo'</span><span class="p">,</span> <span class="s1">'bat'</span><span class="p">,</span> <span class="s1">'foobat'</span><span class="p">)</span>
|
||||
<span class="n">v</span> <span class="o">=</span> <span class="n">agi</span><span class="o">.</span><span class="n">database_get</span><span class="p">(</span><span class="s1">'foo'</span><span class="p">,</span> <span class="s1">'bar'</span><span class="p">)</span>
|
||||
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'DBVALUE foo:bar = </span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="n">v</span><span class="p">)</span>
|
||||
<span class="n">v</span> <span class="o">=</span> <span class="n">agi</span><span class="o">.</span><span class="n">database_get</span><span class="p">(</span><span class="s1">'bar'</span><span class="p">,</span> <span class="s1">'foo'</span><span class="p">)</span>
|
||||
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'DBVALUE foo:bar = </span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="n">v</span><span class="p">)</span>
|
||||
<span class="n">agi</span><span class="o">.</span><span class="n">database_del</span><span class="p">(</span><span class="s1">'foo'</span><span class="p">,</span> <span class="s1">'bar'</span><span class="p">)</span>
|
||||
<span class="n">agi</span><span class="o">.</span><span class="n">database_deltree</span><span class="p">(</span><span class="s1">'foo'</span><span class="p">)</span>
|
||||
<span class="k">except</span> <span class="n">AGIDBError</span><span class="p">:</span>
|
||||
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span>
|
||||
<span class="s2">"Handled exception for missing database entry bar:foo</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
|
||||
|
||||
<span class="n">agi</span><span class="o">.</span><span class="n">hangup</span><span class="p">()</span>
|
||||
</pre></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
||||
<div class="sphinxsidebarwrapper"><div class="relations">
|
||||
<h3>Related Topics</h3>
|
||||
<ul>
|
||||
<li><a href="../../index.html">Documentation overview</a><ul>
|
||||
<li><a href="../index.html">Module code</a><ul>
|
||||
</ul></li>
|
||||
</ul></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div id="searchbox" style="display: none" role="search">
|
||||
<h3>Quick search</h3>
|
||||
<form class="search" action="../../search.html" method="get">
|
||||
<input type="text" name="q" />
|
||||
<input type="submit" value="Go" />
|
||||
<input type="hidden" name="check_keywords" value="yes" />
|
||||
<input type="hidden" name="area" value="default" />
|
||||
</form>
|
||||
<p class="searchtip" style="font-size: 90%">
|
||||
Enter search terms or a module, class or function name.
|
||||
</p>
|
||||
</div>
|
||||
<script type="text/javascript">$('#searchbox').show(0);</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearer"></div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
©2016, Randall Degges.
|
||||
|
||||
|
|
||||
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.6</a>
|
||||
& <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.7</a>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,334 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>asterisk.agitb — pyst2 0.4.9 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '../../',
|
||||
VERSION: '0.4.9',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="../../_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="../../_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="../../_static/doctools.js"></script>
|
||||
<link rel="top" title="pyst2 0.4.9 documentation" href="../../index.html" />
|
||||
<link rel="up" title="Module code" href="../index.html" />
|
||||
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
|
||||
|
||||
</head>
|
||||
<body role="document">
|
||||
|
||||
<div class="document">
|
||||
<div class="documentwrapper">
|
||||
<div class="bodywrapper">
|
||||
<div class="body" role="main">
|
||||
|
||||
<h1>Source code for asterisk.agitb</h1><div class="highlight"><pre>
|
||||
<span></span><span class="sd">"""</span>
|
||||
<span class="sd">.. module:: agi</span>
|
||||
<span class="sd"> :synopsis: More comprehensive traceback formatting for Python scripts.</span>
|
||||
|
||||
<span class="sd">Example</span>
|
||||
<span class="sd">-------</span>
|
||||
|
||||
<span class="sd">To enable this module, do:</span>
|
||||
|
||||
<span class="sd">.. code-block:: python</span>
|
||||
|
||||
<span class="sd"> import asterisk.agitb, asterisk.agi</span>
|
||||
<span class="sd"> asterisk.agitb.enable(display = False, logdir = '/var/log/asterisk/')</span>
|
||||
|
||||
<span class="sd"> agi = asterisk.agi.AGI()</span>
|
||||
<span class="sd"> asterisk.agitb.enable(agi, False, '/var/log/asterisk')</span>
|
||||
|
||||
<span class="sd">at the top of your script. The optional arguments to enable() are:</span>
|
||||
|
||||
<span class="sd">* agi - the agi handle to write verbose messages to</span>
|
||||
<span class="sd">* display - if true, tracebacks are displayed on the asterisk console</span>
|
||||
<span class="sd"> (used with the agi option)</span>
|
||||
<span class="sd">* logdir - if set, tracebacks are written to files in this directory</span>
|
||||
<span class="sd">* context - number of lines of source code to show for each stack frame</span>
|
||||
|
||||
<span class="sd">By default, tracebacks are displayed but not saved, and the context is 5 lines.</span>
|
||||
|
||||
<span class="sd">You may want to add a logdir if you call agitb.enable() before you have</span>
|
||||
<span class="sd">an agi.AGI() handle.</span>
|
||||
|
||||
<span class="sd">Alternatively, if you have caught an exception and want agitb to display it</span>
|
||||
<span class="sd">for you, call agitb.handler(). The optional argument to handler() is a</span>
|
||||
<span class="sd">3-item tuple (etype, evalue, etb) just like the value of sys.exc_info().</span>
|
||||
<span class="sd">If you do not pass anything to handler() it will use sys.exc_info().</span>
|
||||
|
||||
<span class="sd">This script was adapted from Ka-Ping Yee's cgitb.</span>
|
||||
|
||||
<span class="sd">Specification</span>
|
||||
<span class="sd">-------------</span>
|
||||
<span class="sd">"""</span>
|
||||
|
||||
<span class="n">__author__</span> <span class="o">=</span> <span class="s1">'Matthew Nicholson'</span>
|
||||
<span class="n">__version__</span> <span class="o">=</span> <span class="s1">'0.1.0'</span>
|
||||
|
||||
<span class="kn">import</span> <span class="nn">sys</span>
|
||||
|
||||
<span class="n">__UNDEF__</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># a special sentinel object</span>
|
||||
|
||||
|
||||
<div class="viewcode-block" id="lookup"><a class="viewcode-back" href="../../agitb.html#asterisk.agitb.lookup">[docs]</a><span class="k">def</span> <span class="nf">lookup</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">frame</span><span class="p">,</span> <span class="nb">locals</span><span class="p">):</span>
|
||||
<span class="sd">"""Find the value for a given name in the given environment."""</span>
|
||||
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="nb">locals</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="s1">'local'</span><span class="p">,</span> <span class="nb">locals</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">frame</span><span class="o">.</span><span class="n">f_globals</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="s1">'global'</span><span class="p">,</span> <span class="n">frame</span><span class="o">.</span><span class="n">f_globals</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="s1">'__builtins__'</span> <span class="ow">in</span> <span class="n">frame</span><span class="o">.</span><span class="n">f_globals</span><span class="p">:</span>
|
||||
<span class="n">builtins</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">f_globals</span><span class="p">[</span><span class="s1">'__builtins__'</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">builtins</span><span class="p">,</span> <span class="nb">type</span><span class="p">({})):</span>
|
||||
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">builtins</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="s1">'builtin'</span><span class="p">,</span> <span class="n">builtins</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">builtins</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="s1">'builtin'</span><span class="p">,</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">builtins</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
|
||||
<span class="k">return</span> <span class="bp">None</span><span class="p">,</span> <span class="n">__UNDEF__</span></div>
|
||||
|
||||
|
||||
<div class="viewcode-block" id="scanvars"><a class="viewcode-back" href="../../agitb.html#asterisk.agitb.scanvars">[docs]</a><span class="k">def</span> <span class="nf">scanvars</span><span class="p">(</span><span class="n">reader</span><span class="p">,</span> <span class="n">frame</span><span class="p">,</span> <span class="nb">locals</span><span class="p">):</span>
|
||||
<span class="sd">"""Scan one logical line of Python and look up values of variables used."""</span>
|
||||
<span class="kn">import</span> <span class="nn">tokenize</span>
|
||||
<span class="kn">import</span> <span class="nn">keyword</span>
|
||||
<span class="nb">vars</span><span class="p">,</span> <span class="n">lasttoken</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">prefix</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="p">[],</span> <span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="s1">''</span><span class="p">,</span> <span class="n">__UNDEF__</span>
|
||||
<span class="k">for</span> <span class="n">ttype</span><span class="p">,</span> <span class="n">token</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">tokenize</span><span class="o">.</span><span class="n">generate_tokens</span><span class="p">(</span><span class="n">reader</span><span class="p">):</span>
|
||||
<span class="k">if</span> <span class="n">ttype</span> <span class="o">==</span> <span class="n">tokenize</span><span class="o">.</span><span class="n">NEWLINE</span><span class="p">:</span>
|
||||
<span class="k">break</span>
|
||||
<span class="k">if</span> <span class="n">ttype</span> <span class="o">==</span> <span class="n">tokenize</span><span class="o">.</span><span class="n">NAME</span> <span class="ow">and</span> <span class="n">token</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">keyword</span><span class="o">.</span><span class="n">kwlist</span><span class="p">:</span>
|
||||
<span class="k">if</span> <span class="n">lasttoken</span> <span class="o">==</span> <span class="s1">'.'</span><span class="p">:</span>
|
||||
<span class="k">if</span> <span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">__UNDEF__</span><span class="p">:</span>
|
||||
<span class="n">value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="n">token</span><span class="p">,</span> <span class="n">__UNDEF__</span><span class="p">)</span>
|
||||
<span class="nb">vars</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">prefix</span> <span class="o">+</span> <span class="n">token</span><span class="p">,</span> <span class="n">prefix</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="n">where</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">lookup</span><span class="p">(</span><span class="n">token</span><span class="p">,</span> <span class="n">frame</span><span class="p">,</span> <span class="nb">locals</span><span class="p">)</span>
|
||||
<span class="nb">vars</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">token</span><span class="p">,</span> <span class="n">where</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
|
||||
<span class="k">elif</span> <span class="n">token</span> <span class="o">==</span> <span class="s1">'.'</span><span class="p">:</span>
|
||||
<span class="n">prefix</span> <span class="o">+=</span> <span class="n">lasttoken</span> <span class="o">+</span> <span class="s1">'.'</span>
|
||||
<span class="n">parent</span> <span class="o">=</span> <span class="n">value</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="n">parent</span><span class="p">,</span> <span class="n">prefix</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="s1">''</span>
|
||||
<span class="n">lasttoken</span> <span class="o">=</span> <span class="n">token</span>
|
||||
<span class="k">return</span> <span class="nb">vars</span></div>
|
||||
|
||||
|
||||
<div class="viewcode-block" id="text"><a class="viewcode-back" href="../../agitb.html#asterisk.agitb.text">[docs]</a><span class="k">def</span> <span class="nf">text</span><span class="p">(</span><span class="n">eparams</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span>
|
||||
<span class="sd">"""Return a plain text document describing a given traceback."""</span>
|
||||
<span class="kn">import</span> <span class="nn">os</span>
|
||||
<span class="kn">import</span> <span class="nn">types</span>
|
||||
<span class="kn">import</span> <span class="nn">time</span>
|
||||
<span class="kn">import</span> <span class="nn">traceback</span>
|
||||
<span class="kn">import</span> <span class="nn">linecache</span>
|
||||
<span class="kn">import</span> <span class="nn">inspect</span>
|
||||
<span class="kn">import</span> <span class="nn">pydoc</span>
|
||||
|
||||
<span class="n">etype</span><span class="p">,</span> <span class="n">evalue</span><span class="p">,</span> <span class="n">etb</span> <span class="o">=</span> <span class="n">eparams</span>
|
||||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">etype</span><span class="p">,</span> <span class="n">types</span><span class="o">.</span><span class="n">ClassType</span><span class="p">):</span>
|
||||
<span class="n">etype</span> <span class="o">=</span> <span class="n">etype</span><span class="o">.</span><span class="n">__name__</span>
|
||||
<span class="n">pyver</span> <span class="o">=</span> <span class="s1">'Python '</span> <span class="o">+</span> <span class="n">sys</span><span class="o">.</span><span class="n">version</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="s1">': '</span> <span class="o">+</span> <span class="n">sys</span><span class="o">.</span><span class="n">executable</span>
|
||||
<span class="n">date</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">ctime</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span>
|
||||
<span class="n">head</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="se">\n</span><span class="si">%s</span><span class="se">\n</span><span class="si">%s</span><span class="se">\n</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">etype</span><span class="p">),</span> <span class="n">pyver</span><span class="p">,</span> <span class="n">date</span><span class="p">)</span> <span class="o">+</span> <span class="s1">'''</span>
|
||||
<span class="s1">A problem occurred in a Python script. Here is the sequence of</span>
|
||||
<span class="s1">function calls leading up to the error, in the order they occurred.</span>
|
||||
<span class="s1">'''</span>
|
||||
|
||||
<span class="n">frames</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
<span class="n">records</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getinnerframes</span><span class="p">(</span><span class="n">etb</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
|
||||
<span class="k">for</span> <span class="n">frame</span><span class="p">,</span> <span class="nb">file</span><span class="p">,</span> <span class="n">lnum</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">lines</span><span class="p">,</span> <span class="n">index</span> <span class="ow">in</span> <span class="n">records</span><span class="p">:</span>
|
||||
<span class="nb">file</span> <span class="o">=</span> <span class="nb">file</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="nb">file</span><span class="p">)</span> <span class="ow">or</span> <span class="s1">'?'</span>
|
||||
<span class="n">args</span><span class="p">,</span> <span class="n">varargs</span><span class="p">,</span> <span class="n">varkw</span><span class="p">,</span> <span class="nb">locals</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getargvalues</span><span class="p">(</span><span class="n">frame</span><span class="p">)</span>
|
||||
<span class="n">call</span> <span class="o">=</span> <span class="s1">''</span>
|
||||
<span class="k">if</span> <span class="n">func</span> <span class="o">!=</span> <span class="s1">'?'</span><span class="p">:</span>
|
||||
<span class="n">call</span> <span class="o">=</span> <span class="s1">'in '</span> <span class="o">+</span> <span class="n">func</span> <span class="o">+</span> \
|
||||
<span class="n">inspect</span><span class="o">.</span><span class="n">formatargvalues</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">varargs</span><span class="p">,</span> <span class="n">varkw</span><span class="p">,</span> <span class="nb">locals</span><span class="p">,</span>
|
||||
<span class="n">formatvalue</span><span class="o">=</span><span class="k">lambda</span> <span class="n">value</span><span class="p">:</span> <span class="s1">'='</span> <span class="o">+</span> <span class="n">pydoc</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">repr</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
|
||||
|
||||
<span class="n">highlight</span> <span class="o">=</span> <span class="p">{}</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">reader</span><span class="p">(</span><span class="n">lnum</span><span class="o">=</span><span class="p">[</span><span class="n">lnum</span><span class="p">]):</span>
|
||||
<span class="n">highlight</span><span class="p">[</span><span class="n">lnum</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> <span class="o">=</span> <span class="mi">1</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="n">linecache</span><span class="o">.</span><span class="n">getline</span><span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="n">lnum</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
||||
<span class="k">finally</span><span class="p">:</span>
|
||||
<span class="n">lnum</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
|
||||
<span class="nb">vars</span> <span class="o">=</span> <span class="n">scanvars</span><span class="p">(</span><span class="n">reader</span><span class="p">,</span> <span class="n">frame</span><span class="p">,</span> <span class="nb">locals</span><span class="p">)</span>
|
||||
|
||||
<span class="n">rows</span> <span class="o">=</span> <span class="p">[</span><span class="s1">' </span><span class="si">%s</span><span class="s1"> </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="n">call</span><span class="p">)]</span>
|
||||
<span class="k">if</span> <span class="n">index</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
|
||||
<span class="n">i</span> <span class="o">=</span> <span class="n">lnum</span> <span class="o">-</span> <span class="n">index</span>
|
||||
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span>
|
||||
<span class="n">num</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%5d</span><span class="s1"> '</span> <span class="o">%</span> <span class="n">i</span>
|
||||
<span class="n">rows</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">num</span> <span class="o">+</span> <span class="n">line</span><span class="o">.</span><span class="n">rstrip</span><span class="p">())</span>
|
||||
<span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
|
||||
|
||||
<span class="n">done</span><span class="p">,</span> <span class="n">dump</span> <span class="o">=</span> <span class="p">{},</span> <span class="p">[]</span>
|
||||
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">where</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="nb">vars</span><span class="p">:</span>
|
||||
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">done</span><span class="p">:</span>
|
||||
<span class="k">continue</span>
|
||||
<span class="n">done</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
|
||||
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">__UNDEF__</span><span class="p">:</span>
|
||||
<span class="k">if</span> <span class="n">where</span> <span class="o">==</span> <span class="s1">'global'</span><span class="p">:</span>
|
||||
<span class="n">name</span> <span class="o">=</span> <span class="s1">'global '</span> <span class="o">+</span> <span class="n">name</span>
|
||||
<span class="k">elif</span> <span class="n">where</span> <span class="o">==</span> <span class="s1">'local'</span><span class="p">:</span>
|
||||
<span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="n">name</span> <span class="o">=</span> <span class="n">where</span> <span class="o">+</span> <span class="n">name</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'.'</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
||||
<span class="n">dump</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'</span><span class="si">%s</span><span class="s1"> = </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">pydoc</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">repr</span><span class="p">(</span><span class="n">value</span><span class="p">)))</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="n">dump</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">name</span> <span class="o">+</span> <span class="s1">' undefined'</span><span class="p">)</span>
|
||||
|
||||
<span class="n">rows</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">dump</span><span class="p">))</span>
|
||||
<span class="n">frames</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">rows</span><span class="p">))</span>
|
||||
|
||||
<span class="n">exception</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'</span><span class="si">%s</span><span class="s1">: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">etype</span><span class="p">),</span> <span class="nb">str</span><span class="p">(</span><span class="n">evalue</span><span class="p">))]</span>
|
||||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">evalue</span><span class="p">,</span> <span class="n">types</span><span class="o">.</span><span class="n">InstanceType</span><span class="p">):</span>
|
||||
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="n">evalue</span><span class="p">):</span>
|
||||
<span class="n">value</span> <span class="o">=</span> <span class="n">pydoc</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">repr</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">evalue</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span>
|
||||
<span class="n">exception</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="si">%s%s</span><span class="s1"> = </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="s2">" "</span> <span class="o">*</span> <span class="mi">4</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
|
||||
|
||||
<span class="kn">import</span> <span class="nn">traceback</span>
|
||||
<span class="k">return</span> <span class="n">head</span> <span class="o">+</span> <span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">frames</span><span class="p">)</span> <span class="o">+</span> <span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">exception</span><span class="p">)</span> <span class="o">+</span> <span class="s1">'''</span>
|
||||
|
||||
<span class="s1">The above is a description of an error in a Python program. Here is</span>
|
||||
<span class="s1">the original traceback:</span>
|
||||
|
||||
<span class="si">%s</span><span class="s1"></span>
|
||||
<span class="s1">'''</span> <span class="o">%</span> <span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">traceback</span><span class="o">.</span><span class="n">format_exception</span><span class="p">(</span><span class="n">etype</span><span class="p">,</span> <span class="n">evalue</span><span class="p">,</span> <span class="n">etb</span><span class="p">))</span></div>
|
||||
|
||||
|
||||
<div class="viewcode-block" id="Hook"><a class="viewcode-back" href="../../agitb.html#asterisk.agitb.Hook">[docs]</a><span class="k">class</span> <span class="nc">Hook</span><span class="p">:</span>
|
||||
<span class="sd">"""A hook to replace sys.excepthook that shows tracebacks in HTML."""</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">logdir</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="nb">file</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
|
||||
<span class="n">agi</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">display</span> <span class="o">=</span> <span class="n">display</span> <span class="c1"># send tracebacks to browser if true</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">logdir</span> <span class="o">=</span> <span class="n">logdir</span> <span class="c1"># log tracebacks to files if not None</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">context</span> <span class="o">=</span> <span class="n">context</span> <span class="c1"># number of source code lines per frame</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">file</span> <span class="o">=</span> <span class="nb">file</span> <span class="ow">or</span> <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span> <span class="c1"># place to send the output</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">agi</span> <span class="o">=</span> <span class="n">agi</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">etype</span><span class="p">,</span> <span class="n">evalue</span><span class="p">,</span> <span class="n">etb</span><span class="p">):</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">((</span><span class="n">etype</span><span class="p">,</span> <span class="n">evalue</span><span class="p">,</span> <span class="n">etb</span><span class="p">))</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">info</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
|
||||
<span class="n">info</span> <span class="o">=</span> <span class="n">info</span> <span class="ow">or</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()</span>
|
||||
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="n">doc</span> <span class="o">=</span> <span class="n">text</span><span class="p">(</span><span class="n">info</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">context</span><span class="p">)</span>
|
||||
<span class="k">except</span><span class="p">:</span> <span class="c1"># just in case something goes wrong</span>
|
||||
<span class="kn">import</span> <span class="nn">traceback</span>
|
||||
<span class="n">doc</span> <span class="o">=</span> <span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">traceback</span><span class="o">.</span><span class="n">format_exception</span><span class="p">(</span><span class="o">*</span><span class="n">info</span><span class="p">))</span>
|
||||
|
||||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">display</span><span class="p">:</span>
|
||||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">agi</span><span class="p">:</span> <span class="c1"># print to agi</span>
|
||||
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">doc</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">):</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">agi</span><span class="o">.</span><span class="n">verbose</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">doc</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
|
||||
|
||||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">agi</span><span class="p">:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">agi</span><span class="o">.</span><span class="n">verbose</span><span class="p">(</span><span class="s1">'A problem occured in a python script'</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'A problem occured in a python script</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
|
||||
|
||||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">logdir</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
|
||||
<span class="kn">import</span> <span class="nn">os</span>
|
||||
<span class="kn">import</span> <span class="nn">tempfile</span>
|
||||
<span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span> <span class="o">=</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">mkstemp</span><span class="p">(</span><span class="n">suffix</span><span class="o">=</span><span class="s1">'.txt'</span><span class="p">,</span> <span class="nb">dir</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">logdir</span><span class="p">)</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="nb">file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">fdopen</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span>
|
||||
<span class="nb">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">doc</span><span class="p">)</span>
|
||||
<span class="nb">file</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
||||
<span class="n">msg</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> contains the description of this error.'</span> <span class="o">%</span> <span class="n">path</span>
|
||||
<span class="k">except</span><span class="p">:</span>
|
||||
<span class="n">msg</span> <span class="o">=</span> <span class="s1">'Tried to save traceback to </span><span class="si">%s</span><span class="s1">, but failed.'</span> <span class="o">%</span> <span class="n">path</span>
|
||||
|
||||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">agi</span><span class="p">:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">agi</span><span class="o">.</span><span class="n">verbose</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">msg</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
|
||||
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
|
||||
<span class="k">except</span><span class="p">:</span>
|
||||
<span class="k">pass</span></div>
|
||||
|
||||
|
||||
<span class="n">handler</span> <span class="o">=</span> <span class="n">Hook</span><span class="p">()</span><span class="o">.</span><span class="n">handle</span>
|
||||
|
||||
|
||||
<div class="viewcode-block" id="enable"><a class="viewcode-back" href="../../agitb.html#asterisk.agitb.enable">[docs]</a><span class="k">def</span> <span class="nf">enable</span><span class="p">(</span><span class="n">agi</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">display</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">logdir</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span>
|
||||
<span class="sd">"""Install an exception handler that formats tracebacks as HTML.</span>
|
||||
|
||||
<span class="sd"> The optional argument 'display' can be set to 0 to suppress sending the</span>
|
||||
<span class="sd"> traceback to the browser, and 'logdir' can be set to a directory to cause</span>
|
||||
<span class="sd"> tracebacks to be written to files there."""</span>
|
||||
<span class="n">except_hook</span> <span class="o">=</span> <span class="n">Hook</span><span class="p">(</span><span class="n">display</span><span class="o">=</span><span class="n">display</span><span class="p">,</span> <span class="n">logdir</span><span class="o">=</span><span class="n">logdir</span><span class="p">,</span>
|
||||
<span class="n">context</span><span class="o">=</span><span class="n">context</span><span class="p">,</span> <span class="n">agi</span><span class="o">=</span><span class="n">agi</span><span class="p">)</span>
|
||||
<span class="n">sys</span><span class="o">.</span><span class="n">excepthook</span> <span class="o">=</span> <span class="n">except_hook</span>
|
||||
|
||||
<span class="k">global</span> <span class="n">handler</span>
|
||||
<span class="n">handler</span> <span class="o">=</span> <span class="n">except_hook</span><span class="o">.</span><span class="n">handle</span></div>
|
||||
</pre></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
||||
<div class="sphinxsidebarwrapper"><div class="relations">
|
||||
<h3>Related Topics</h3>
|
||||
<ul>
|
||||
<li><a href="../../index.html">Documentation overview</a><ul>
|
||||
<li><a href="../index.html">Module code</a><ul>
|
||||
</ul></li>
|
||||
</ul></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div id="searchbox" style="display: none" role="search">
|
||||
<h3>Quick search</h3>
|
||||
<form class="search" action="../../search.html" method="get">
|
||||
<input type="text" name="q" />
|
||||
<input type="submit" value="Go" />
|
||||
<input type="hidden" name="check_keywords" value="yes" />
|
||||
<input type="hidden" name="area" value="default" />
|
||||
</form>
|
||||
<p class="searchtip" style="font-size: 90%">
|
||||
Enter search terms or a module, class or function name.
|
||||
</p>
|
||||
</div>
|
||||
<script type="text/javascript">$('#searchbox').show(0);</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearer"></div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
©2016, Randall Degges.
|
||||
|
||||
|
|
||||
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.6</a>
|
||||
& <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.7</a>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,767 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>asterisk.manager — pyst2 0.4.9 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '../../',
|
||||
VERSION: '0.4.9',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="../../_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="../../_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="../../_static/doctools.js"></script>
|
||||
<link rel="top" title="pyst2 0.4.9 documentation" href="../../index.html" />
|
||||
<link rel="up" title="Module code" href="../index.html" />
|
||||
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
|
||||
|
||||
</head>
|
||||
<body role="document">
|
||||
|
||||
<div class="document">
|
||||
<div class="documentwrapper">
|
||||
<div class="bodywrapper">
|
||||
<div class="body" role="main">
|
||||
|
||||
<h1>Source code for asterisk.manager</h1><div class="highlight"><pre>
|
||||
<span></span><span class="ch">#!/usr/bin/env python</span>
|
||||
<span class="c1"># vim: set expandtab shiftwidth=4:</span>
|
||||
|
||||
<span class="sd">"""</span>
|
||||
<span class="sd">.. module:: manager</span>
|
||||
<span class="sd"> :synopsis: Python Interface for Asterisk Manager</span>
|
||||
|
||||
<span class="sd">This module provides a Python API for interfacing with the asterisk manager.</span>
|
||||
|
||||
<span class="sd">Example</span>
|
||||
<span class="sd">-------</span>
|
||||
|
||||
<span class="sd">.. code-block:: python</span>
|
||||
|
||||
<span class="sd"> import asterisk.manager</span>
|
||||
<span class="sd"> import sys</span>
|
||||
|
||||
<span class="sd"> def handle_shutdown(event, manager):</span>
|
||||
<span class="sd"> print "Recieved shutdown event"</span>
|
||||
<span class="sd"> manager.close()</span>
|
||||
<span class="sd"> # we could analize the event and reconnect here</span>
|
||||
|
||||
<span class="sd"> def handle_event(event, manager):</span>
|
||||
<span class="sd"> print "Recieved event: %s" % event.name</span>
|
||||
|
||||
<span class="sd"> manager = asterisk.manager.Manager()</span>
|
||||
<span class="sd"> try:</span>
|
||||
<span class="sd"> # connect to the manager</span>
|
||||
<span class="sd"> try:</span>
|
||||
<span class="sd"> manager.connect('host')</span>
|
||||
<span class="sd"> manager.login('user', 'secret')</span>
|
||||
|
||||
<span class="sd"> # register some callbacks</span>
|
||||
<span class="sd"> manager.register_event('Shutdown', handle_shutdown) # shutdown</span>
|
||||
<span class="sd"> manager.register_event('*', handle_event) # catch all</span>
|
||||
|
||||
<span class="sd"> # get a status report</span>
|
||||
<span class="sd"> response = manager.status()</span>
|
||||
|
||||
<span class="sd"> manager.logoff()</span>
|
||||
<span class="sd"> except asterisk.manager.ManagerSocketException as e:</span>
|
||||
<span class="sd"> print "Error connecting to the manager: %s" % e.strerror</span>
|
||||
<span class="sd"> sys.exit(1)</span>
|
||||
<span class="sd"> except asterisk.manager.ManagerAuthException as e:</span>
|
||||
<span class="sd"> print "Error logging in to the manager: %s" % e.strerror</span>
|
||||
<span class="sd"> sys.exit(1)</span>
|
||||
<span class="sd"> except asterisk.manager.ManagerException as e:</span>
|
||||
<span class="sd"> print "Error: %s" % e.strerror</span>
|
||||
<span class="sd"> sys.exit(1)</span>
|
||||
|
||||
<span class="sd"> finally:</span>
|
||||
<span class="sd"> # remember to clean up</span>
|
||||
<span class="sd"> manager.close()</span>
|
||||
|
||||
<span class="sd">Remember all header, response, and event names are case sensitive.</span>
|
||||
|
||||
<span class="sd">Not all manager actions are implmented as of yet, feel free to add them</span>
|
||||
<span class="sd">and submit patches.</span>
|
||||
|
||||
<span class="sd">Specification</span>
|
||||
<span class="sd">-------------</span>
|
||||
<span class="sd">"""</span>
|
||||
|
||||
<span class="kn">import</span> <span class="nn">sys</span>
|
||||
<span class="kn">import</span> <span class="nn">os</span>
|
||||
<span class="kn">import</span> <span class="nn">socket</span>
|
||||
<span class="kn">import</span> <span class="nn">threading</span>
|
||||
<span class="kn">from</span> <span class="nn">six</span> <span class="kn">import</span> <span class="n">PY3</span>
|
||||
<span class="kn">from</span> <span class="nn">six.moves</span> <span class="kn">import</span> <span class="n">queue</span>
|
||||
<span class="kn">import</span> <span class="nn">re</span>
|
||||
<span class="kn">from</span> <span class="nn">types</span> <span class="kn">import</span> <span class="o">*</span>
|
||||
<span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span> <span class="n">sleep</span>
|
||||
|
||||
<span class="n">EOL</span> <span class="o">=</span> <span class="s1">'</span><span class="se">\r\n</span><span class="s1">'</span>
|
||||
|
||||
|
||||
<div class="viewcode-block" id="ManagerMsg"><a class="viewcode-back" href="../../manager.html#asterisk.manager.ManagerMsg">[docs]</a><span class="k">class</span> <span class="nc">ManagerMsg</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
||||
<span class="sd">"""A manager interface message"""</span>
|
||||
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">response</span><span class="p">):</span>
|
||||
<span class="c1"># the raw response, straight from the horse's mouth:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">response</span> <span class="o">=</span> <span class="n">response</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s1">''</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">headers</span> <span class="o">=</span> <span class="p">{}</span>
|
||||
|
||||
<span class="c1"># parse the response</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">response</span><span class="p">)</span>
|
||||
|
||||
<span class="c1"># This is an unknown message, may happen if a command (notably</span>
|
||||
<span class="c1"># 'dialplan show something') contains a \n\r\n sequence in the</span>
|
||||
<span class="c1"># middle of output. We hope this happens only *once* during a</span>
|
||||
<span class="c1"># misbehaved command *and* the command ends with --END COMMAND--</span>
|
||||
<span class="c1"># in that case we return an Event. Otherwise we asume it is</span>
|
||||
<span class="c1"># from a misbehaving command not returning a proper header (e.g.</span>
|
||||
<span class="c1"># IAXnetstats in Asterisk 1.4.X)</span>
|
||||
<span class="c1"># A better solution is probably to retain some knowledge of</span>
|
||||
<span class="c1"># commands sent and their expected return syntax. In that case</span>
|
||||
<span class="c1"># we could wait for --END COMMAND-- for 'command'.</span>
|
||||
<span class="c1"># B0rken in asterisk. This should be parseable without context.</span>
|
||||
<span class="k">if</span> <span class="s1">'Event'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span> <span class="ow">and</span> <span class="s1">'Response'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">:</span>
|
||||
<span class="c1"># there are commands that return the ActionID but not</span>
|
||||
<span class="c1"># 'Response', e.g., IAXpeers in Asterisk 1.4.X</span>
|
||||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_header</span><span class="p">(</span><span class="s1">'ActionID'</span><span class="p">):</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">'Response'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Generated Header'</span>
|
||||
<span class="k">elif</span> <span class="s1">'--END COMMAND--'</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">'Event'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'NoClue'</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">'Response'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Generated Header'</span>
|
||||
|
||||
<div class="viewcode-block" id="ManagerMsg.parse"><a class="viewcode-back" href="../../manager.html#asterisk.manager.ManagerMsg.parse">[docs]</a> <span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">response</span><span class="p">):</span>
|
||||
<span class="sd">"""Parse a manager message"""</span>
|
||||
|
||||
<span class="n">data</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
<span class="k">for</span> <span class="n">n</span><span class="p">,</span> <span class="n">line</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">response</span><span class="p">):</span>
|
||||
<span class="c1"># all valid header lines end in \r\n</span>
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="n">line</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">'</span><span class="se">\r\n</span><span class="s1">'</span><span class="p">):</span>
|
||||
<span class="n">data</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">response</span><span class="p">[</span><span class="n">n</span><span class="p">:])</span>
|
||||
<span class="k">break</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">':'</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
|
||||
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
|
||||
<span class="c1"># invalid header, start of multi-line data response</span>
|
||||
<span class="n">data</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">response</span><span class="p">[</span><span class="n">n</span><span class="p">:])</span>
|
||||
<span class="k">break</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">data</span><span class="p">)</span></div>
|
||||
|
||||
<div class="viewcode-block" id="ManagerMsg.has_header"><a class="viewcode-back" href="../../manager.html#asterisk.manager.ManagerMsg.has_header">[docs]</a> <span class="k">def</span> <span class="nf">has_header</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hname</span><span class="p">):</span>
|
||||
<span class="sd">"""Check for a header"""</span>
|
||||
<span class="k">return</span> <span class="n">hname</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span></div>
|
||||
|
||||
<div class="viewcode-block" id="ManagerMsg.get_header"><a class="viewcode-back" href="../../manager.html#asterisk.manager.ManagerMsg.get_header">[docs]</a> <span class="k">def</span> <span class="nf">get_header</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hname</span><span class="p">,</span> <span class="n">defval</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
|
||||
<span class="sd">"""Return the specfied header"""</span>
|
||||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">hname</span><span class="p">,</span> <span class="n">defval</span><span class="p">)</span></div>
|
||||
|
||||
<span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hname</span><span class="p">):</span>
|
||||
<span class="sd">"""Return the specfied header"""</span>
|
||||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="n">hname</span><span class="p">]</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="k">if</span> <span class="s1">'Response'</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">'Response'</span><span class="p">]</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">'Event'</span><span class="p">]</span></div>
|
||||
|
||||
|
||||
<div class="viewcode-block" id="Event"><a class="viewcode-back" href="../../manager.html#asterisk.manager.Event">[docs]</a><span class="k">class</span> <span class="nc">Event</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
||||
<span class="sd">"""Manager interface Events, __init__ expects and 'Event' message"""</span>
|
||||
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
|
||||
|
||||
<span class="c1"># store all of the event data</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">message</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">headers</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">headers</span>
|
||||
|
||||
<span class="c1"># if this is not an event message we have a problem</span>
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">has_header</span><span class="p">(</span><span class="s1">'Event'</span><span class="p">):</span>
|
||||
<span class="k">raise</span> <span class="n">ManagerException</span><span class="p">(</span>
|
||||
<span class="s1">'Trying to create event from non event message'</span><span class="p">)</span>
|
||||
|
||||
<span class="c1"># get the event name</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">get_header</span><span class="p">(</span><span class="s1">'Event'</span><span class="p">)</span>
|
||||
|
||||
<div class="viewcode-block" id="Event.has_header"><a class="viewcode-back" href="../../manager.html#asterisk.manager.Event.has_header">[docs]</a> <span class="k">def</span> <span class="nf">has_header</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hname</span><span class="p">):</span>
|
||||
<span class="sd">"""Check for a header"""</span>
|
||||
<span class="k">return</span> <span class="n">hname</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span></div>
|
||||
|
||||
<div class="viewcode-block" id="Event.get_header"><a class="viewcode-back" href="../../manager.html#asterisk.manager.Event.get_header">[docs]</a> <span class="k">def</span> <span class="nf">get_header</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hname</span><span class="p">,</span> <span class="n">defval</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
|
||||
<span class="sd">"""Return the specfied header"""</span>
|
||||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">hname</span><span class="p">,</span> <span class="n">defval</span><span class="p">)</span></div>
|
||||
|
||||
<span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hname</span><span class="p">):</span>
|
||||
<span class="sd">"""Return the specfied header"""</span>
|
||||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="n">hname</span><span class="p">]</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">'Event'</span><span class="p">]</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">get_action_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'ActionID'</span><span class="p">,</span> <span class="mo">0000</span><span class="p">)</span></div>
|
||||
|
||||
|
||||
<span class="k">class</span> <span class="nc">Manager</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
||||
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_sock</span> <span class="o">=</span> <span class="bp">None</span> <span class="c1"># our socket</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">title</span> <span class="o">=</span> <span class="bp">None</span> <span class="c1"># set by received greeting</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_connected</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Event</span><span class="p">()</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_running</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Event</span><span class="p">()</span>
|
||||
|
||||
<span class="c1"># our hostname</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">hostname</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostname</span><span class="p">()</span>
|
||||
|
||||
<span class="c1"># our queues</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_message_queue</span> <span class="o">=</span> <span class="n">queue</span><span class="o">.</span><span class="n">Queue</span><span class="p">()</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_response_queue</span> <span class="o">=</span> <span class="n">queue</span><span class="o">.</span><span class="n">Queue</span><span class="p">()</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_event_queue</span> <span class="o">=</span> <span class="n">queue</span><span class="o">.</span><span class="n">Queue</span><span class="p">()</span>
|
||||
|
||||
<span class="c1"># callbacks for events</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_event_callbacks</span> <span class="o">=</span> <span class="p">{}</span>
|
||||
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_reswaiting</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># who is waiting for a response</span>
|
||||
|
||||
<span class="c1"># sequence stuff</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_seqlock</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Lock</span><span class="p">()</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_seq</span> <span class="o">=</span> <span class="mi">0</span>
|
||||
|
||||
<span class="c1"># some threads</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">message_thread</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">message_loop</span><span class="p">)</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">event_dispatch_thread</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span>
|
||||
<span class="n">target</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">event_dispatch</span><span class="p">)</span>
|
||||
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">message_thread</span><span class="o">.</span><span class="n">setDaemon</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">event_dispatch_thread</span><span class="o">.</span><span class="n">setDaemon</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="sd">"""</span>
|
||||
<span class="sd"> Check if we are connected or not.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">isSet</span><span class="p">()</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">next_seq</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="sd">"""Return the next number in the sequence, this is used for ActionID"""</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_seqlock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_seq</span>
|
||||
<span class="k">finally</span><span class="p">:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_seq</span> <span class="o">+=</span> <span class="mi">1</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_seqlock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">send_action</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cdict</span><span class="o">=</span><span class="p">{},</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
<span class="sd">"""</span>
|
||||
<span class="sd"> Send a command to the manager</span>
|
||||
|
||||
<span class="sd"> If a list is passed to the cdict argument, each item in the list will</span>
|
||||
<span class="sd"> be sent to asterisk under the same header in the following manner:</span>
|
||||
|
||||
<span class="sd"> cdict = {"Action": "Originate",</span>
|
||||
<span class="sd"> "Variable": ["var1=value", "var2=value"]}</span>
|
||||
<span class="sd"> send_action(cdict)</span>
|
||||
|
||||
<span class="sd"> ...</span>
|
||||
|
||||
<span class="sd"> Action: Originate</span>
|
||||
<span class="sd"> Variable: var1=value</span>
|
||||
<span class="sd"> Variable: var2=value</span>
|
||||
<span class="sd"> """</span>
|
||||
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">isSet</span><span class="p">():</span>
|
||||
<span class="k">raise</span> <span class="n">ManagerException</span><span class="p">(</span><span class="s2">"Not connected"</span><span class="p">)</span>
|
||||
|
||||
<span class="c1"># fill in our args</span>
|
||||
<span class="n">cdict</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span>
|
||||
|
||||
<span class="c1"># set the action id</span>
|
||||
<span class="k">if</span> <span class="s1">'ActionID'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">cdict</span><span class="p">:</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'ActionID'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">-</span><span class="si">%08x</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">hostname</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">next_seq</span><span class="p">())</span>
|
||||
<span class="n">clist</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
|
||||
<span class="c1"># generate the command</span>
|
||||
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">cdict</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
||||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
|
||||
<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
|
||||
<span class="n">item</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">([</span><span class="n">key</span><span class="p">,</span> <span class="n">item</span><span class="p">])</span>
|
||||
<span class="n">clist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'</span><span class="si">%s</span><span class="s1">: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">item</span><span class="p">)</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="n">item</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">([</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">])</span>
|
||||
<span class="n">clist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'</span><span class="si">%s</span><span class="s1">: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">item</span><span class="p">)</span>
|
||||
<span class="n">clist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">EOL</span><span class="p">)</span>
|
||||
<span class="n">command</span> <span class="o">=</span> <span class="n">EOL</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">clist</span><span class="p">)</span>
|
||||
|
||||
<span class="c1"># lock the socket and send our command</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_sock</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">command</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">'utf8'</span><span class="p">))</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_sock</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
|
||||
<span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">ManagerSocketException</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">errno</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">strerror</span><span class="p">)</span>
|
||||
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_reswaiting</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
||||
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_response_queue</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_reswaiting</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
|
||||
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="n">response</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">ManagerSocketException</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s1">'Connection Terminated'</span><span class="p">)</span>
|
||||
|
||||
<span class="k">return</span> <span class="n">response</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">_receive_data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="sd">"""</span>
|
||||
<span class="sd"> Read the response from a command.</span>
|
||||
<span class="sd"> """</span>
|
||||
|
||||
<span class="n">multiline</span> <span class="o">=</span> <span class="bp">False</span>
|
||||
<span class="n">status</span> <span class="o">=</span> <span class="bp">False</span>
|
||||
<span class="n">wait_for_marker</span> <span class="o">=</span> <span class="bp">False</span>
|
||||
<span class="n">eolcount</span> <span class="o">=</span> <span class="mi">0</span>
|
||||
<span class="c1"># loop while we are sill running and connected</span>
|
||||
<span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_running</span><span class="o">.</span><span class="n">isSet</span><span class="p">()</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">isSet</span><span class="p">():</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="n">lines</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sock</span><span class="p">:</span>
|
||||
<span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">'utf8'</span><span class="p">)</span>
|
||||
<span class="c1"># check to see if this is the greeting line</span>
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">title</span> <span class="ow">and</span> <span class="s1">'/'</span> <span class="ow">in</span> <span class="n">line</span> <span class="ow">and</span> <span class="ow">not</span> <span class="s1">':'</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
|
||||
<span class="c1"># store the title of the manager we are connecting to:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">title</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
|
||||
<span class="c1"># store the version of the manager we are connecting to:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">version</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
|
||||
<span class="c1"># fake message header</span>
|
||||
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'Response: Generated Header</span><span class="se">\r\n</span><span class="s1">'</span><span class="p">)</span>
|
||||
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
|
||||
<span class="k">break</span>
|
||||
<span class="c1"># If the line is EOL marker we have a complete message.</span>
|
||||
<span class="c1"># Some commands are broken and contain a \n\r\n</span>
|
||||
<span class="c1"># sequence, in the case wait_for_marker is set, we</span>
|
||||
<span class="c1"># have such a command where the data ends with the</span>
|
||||
<span class="c1"># marker --END COMMAND--, so we ignore embedded</span>
|
||||
<span class="c1"># newlines until we see that marker</span>
|
||||
<span class="k">if</span> <span class="n">line</span> <span class="o">==</span> <span class="n">EOL</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">wait_for_marker</span><span class="p">:</span>
|
||||
<span class="n">multiline</span> <span class="o">=</span> <span class="bp">False</span>
|
||||
<span class="k">if</span> <span class="n">lines</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">isSet</span><span class="p">():</span>
|
||||
<span class="k">break</span>
|
||||
<span class="c1"># ignore empty lines at start</span>
|
||||
<span class="k">continue</span>
|
||||
<span class="c1"># If the user executed the status command, it's a special</span>
|
||||
<span class="c1"># case, so we need to look for a marker.</span>
|
||||
<span class="k">if</span> <span class="s1">'status will follow'</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
|
||||
<span class="n">status</span> <span class="o">=</span> <span class="bp">True</span>
|
||||
<span class="n">wait_for_marker</span> <span class="o">=</span> <span class="bp">True</span>
|
||||
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
|
||||
|
||||
<span class="c1"># line not ending in \r\n or without ':' isn't a</span>
|
||||
<span class="c1"># valid header and starts multiline response</span>
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="n">line</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">'</span><span class="se">\r\n</span><span class="s1">'</span><span class="p">)</span> <span class="ow">or</span> <span class="s1">':'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
|
||||
<span class="n">multiline</span> <span class="o">=</span> <span class="bp">True</span>
|
||||
<span class="c1"># Response: Follows indicates we should wait for end</span>
|
||||
<span class="c1"># marker --END COMMAND--</span>
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">multiline</span> <span class="ow">or</span> <span class="n">status</span><span class="p">)</span> <span class="ow">and</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'Response'</span><span class="p">)</span> <span class="ow">and</span> \
|
||||
<span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">':'</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="o">==</span> <span class="s1">'Follows'</span><span class="p">:</span>
|
||||
<span class="n">wait_for_marker</span> <span class="o">=</span> <span class="bp">True</span>
|
||||
<span class="c1"># same when seeing end of multiline response</span>
|
||||
<span class="k">if</span> <span class="n">multiline</span> <span class="ow">and</span> <span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'--END COMMAND--'</span><span class="p">)</span> <span class="ow">or</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">'--END COMMAND--'</span><span class="p">)):</span>
|
||||
<span class="n">wait_for_marker</span> <span class="o">=</span> <span class="bp">False</span>
|
||||
<span class="n">multiline</span> <span class="o">=</span> <span class="bp">False</span>
|
||||
<span class="c1"># same when seeing end of status response</span>
|
||||
<span class="k">if</span> <span class="n">status</span> <span class="ow">and</span> <span class="s1">'StatusComplete'</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
|
||||
<span class="n">wait_for_marker</span> <span class="o">=</span> <span class="bp">False</span>
|
||||
<span class="n">status</span> <span class="o">=</span> <span class="bp">False</span>
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">isSet</span><span class="p">():</span>
|
||||
<span class="k">break</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="c1"># EOF during reading</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_sock</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
|
||||
<span class="c1"># if we have a message append it to our queue</span>
|
||||
<span class="k">if</span> <span class="n">lines</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">isSet</span><span class="p">():</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_message_queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_message_queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
|
||||
<span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span><span class="p">:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_sock</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_message_queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">register_event</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">function</span><span class="p">):</span>
|
||||
<span class="sd">"""</span>
|
||||
<span class="sd"> Register a callback for the specfied event.</span>
|
||||
<span class="sd"> If a callback function returns True, no more callbacks for that</span>
|
||||
<span class="sd"> event will be executed.</span>
|
||||
<span class="sd"> """</span>
|
||||
|
||||
<span class="c1"># get the current value, or an empty list</span>
|
||||
<span class="c1"># then add our new callback</span>
|
||||
<span class="n">current_callbacks</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_event_callbacks</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="p">[])</span>
|
||||
<span class="n">current_callbacks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">function</span><span class="p">)</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_event_callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]</span> <span class="o">=</span> <span class="n">current_callbacks</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">unregister_event</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">function</span><span class="p">):</span>
|
||||
<span class="sd">"""</span>
|
||||
<span class="sd"> Unregister a callback for the specified event.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="n">current_callbacks</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_event_callbacks</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="p">[])</span>
|
||||
<span class="n">current_callbacks</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">function</span><span class="p">)</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_event_callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]</span> <span class="o">=</span> <span class="n">current_callbacks</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">message_loop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="sd">"""</span>
|
||||
<span class="sd"> The method for the event thread.</span>
|
||||
<span class="sd"> This actually recieves all types of messages and places them</span>
|
||||
<span class="sd"> in the proper queues.</span>
|
||||
<span class="sd"> """</span>
|
||||
|
||||
<span class="c1"># start a thread to recieve data</span>
|
||||
<span class="n">t</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_receive_data</span><span class="p">)</span>
|
||||
<span class="n">t</span><span class="o">.</span><span class="n">setDaemon</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
|
||||
<span class="n">t</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
|
||||
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="c1"># loop getting messages from the queue</span>
|
||||
<span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_running</span><span class="o">.</span><span class="n">isSet</span><span class="p">():</span>
|
||||
<span class="c1"># get/wait for messages</span>
|
||||
<span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message_queue</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
|
||||
|
||||
<span class="c1"># if we got None as our message we are done</span>
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="n">data</span><span class="p">:</span>
|
||||
<span class="c1"># notify the other queues</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_event_queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
|
||||
<span class="k">for</span> <span class="n">waiter</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reswaiting</span><span class="p">:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_response_queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
|
||||
<span class="k">break</span>
|
||||
|
||||
<span class="c1"># parse the data</span>
|
||||
<span class="n">message</span> <span class="o">=</span> <span class="n">ManagerMsg</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
|
||||
|
||||
<span class="c1"># check if this is an event message</span>
|
||||
<span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">has_header</span><span class="p">(</span><span class="s1">'Event'</span><span class="p">):</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_event_queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="n">Event</span><span class="p">(</span><span class="n">message</span><span class="p">))</span>
|
||||
<span class="c1"># check if this is a response</span>
|
||||
<span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">has_header</span><span class="p">(</span><span class="s1">'Response'</span><span class="p">):</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_response_queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="s1">'No clue what we got</span><span class="se">\n</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
|
||||
<span class="k">finally</span><span class="p">:</span>
|
||||
<span class="c1"># wait for our data receiving thread to exit</span>
|
||||
<span class="n">t</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">event_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="sd">"""This thread is responsible for dispatching events"""</span>
|
||||
|
||||
<span class="c1"># loop dispatching events</span>
|
||||
<span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_running</span><span class="o">.</span><span class="n">isSet</span><span class="p">():</span>
|
||||
<span class="c1"># get/wait for an event</span>
|
||||
<span class="n">ev</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_event_queue</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
|
||||
|
||||
<span class="c1"># if we got None as an event, we are finished</span>
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="n">ev</span><span class="p">:</span>
|
||||
<span class="k">break</span>
|
||||
|
||||
<span class="c1"># dispatch our events</span>
|
||||
|
||||
<span class="c1"># first build a list of the functions to execute</span>
|
||||
<span class="n">callbacks</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_event_callbacks</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">ev</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="p">[])</span>
|
||||
<span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">_event_callbacks</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'*'</span><span class="p">,</span> <span class="p">[]))</span>
|
||||
|
||||
<span class="c1"># now execute the functions</span>
|
||||
<span class="k">for</span> <span class="n">callback</span> <span class="ow">in</span> <span class="n">callbacks</span><span class="p">:</span>
|
||||
<span class="k">if</span> <span class="n">callback</span><span class="p">(</span><span class="n">ev</span><span class="p">,</span> <span class="bp">self</span><span class="p">):</span>
|
||||
<span class="k">break</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">5038</span><span class="p">):</span>
|
||||
<span class="sd">"""Connect to the manager interface"""</span>
|
||||
|
||||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">isSet</span><span class="p">():</span>
|
||||
<span class="k">raise</span> <span class="n">ManagerException</span><span class="p">(</span><span class="s1">'Already connected to manager'</span><span class="p">)</span>
|
||||
|
||||
<span class="c1"># make sure host is a string</span>
|
||||
<span class="k">assert</span> <span class="nb">type</span><span class="p">(</span><span class="n">host</span><span class="p">)</span> <span class="ow">is</span> <span class="nb">str</span>
|
||||
|
||||
<span class="n">port</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">port</span><span class="p">)</span> <span class="c1"># make sure port is an int</span>
|
||||
|
||||
<span class="c1"># create our socket and connect</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="n">_sock</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>
|
||||
<span class="n">_sock</span><span class="o">.</span><span class="n">connect</span><span class="p">((</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">))</span>
|
||||
<span class="k">if</span> <span class="n">PY3</span><span class="p">:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_sock</span> <span class="o">=</span> <span class="n">_sock</span><span class="o">.</span><span class="n">makefile</span><span class="p">(</span><span class="n">mode</span><span class="o">=</span><span class="s1">'rwb'</span><span class="p">,</span> <span class="n">buffering</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_sock</span> <span class="o">=</span> <span class="n">_sock</span><span class="o">.</span><span class="n">makefile</span><span class="p">()</span>
|
||||
<span class="n">_sock</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
||||
<span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">ManagerSocketException</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">errno</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">strerror</span><span class="p">)</span>
|
||||
|
||||
<span class="c1"># we are connected and running</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">set</span><span class="p">()</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_running</span><span class="o">.</span><span class="n">set</span><span class="p">()</span>
|
||||
|
||||
<span class="c1"># start the event thread</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">message_thread</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
|
||||
|
||||
<span class="c1"># start the event dispatching thread</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">event_dispatch_thread</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
|
||||
|
||||
<span class="c1"># get our initial connection response</span>
|
||||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_response_queue</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="sd">"""Shutdown the connection to the manager"""</span>
|
||||
|
||||
<span class="c1"># if we are still running, logout</span>
|
||||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_running</span><span class="o">.</span><span class="n">isSet</span><span class="p">()</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">isSet</span><span class="p">():</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">logoff</span><span class="p">()</span>
|
||||
|
||||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_running</span><span class="o">.</span><span class="n">isSet</span><span class="p">():</span>
|
||||
<span class="c1"># put None in the message_queue to kill our threads</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_message_queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
|
||||
|
||||
<span class="c1"># wait for the event thread to exit</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">message_thread</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
|
||||
|
||||
<span class="c1"># make sure we do not join our self (when close is called from event handlers)</span>
|
||||
<span class="k">if</span> <span class="n">threading</span><span class="o">.</span><span class="n">currentThread</span><span class="p">()</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">event_dispatch_thread</span><span class="p">:</span>
|
||||
<span class="c1"># wait for the dispatch thread to exit</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">event_dispatch_thread</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
|
||||
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_running</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
|
||||
|
||||
<span class="c1"># Manager actions</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">login</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">secret</span><span class="p">):</span>
|
||||
<span class="sd">"""Login to the manager, throws ManagerAuthException when login falis"""</span>
|
||||
|
||||
<span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'Login'</span><span class="p">}</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Username'</span><span class="p">]</span> <span class="o">=</span> <span class="n">username</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Secret'</span><span class="p">]</span> <span class="o">=</span> <span class="n">secret</span>
|
||||
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
|
||||
|
||||
<span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">get_header</span><span class="p">(</span><span class="s1">'Response'</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'Error'</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">ManagerAuthException</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">get_header</span><span class="p">(</span><span class="s1">'Message'</span><span class="p">))</span>
|
||||
|
||||
<span class="k">return</span> <span class="n">response</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">ping</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="sd">"""Send a ping action to the manager"""</span>
|
||||
<span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'Ping'</span><span class="p">}</span>
|
||||
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
|
||||
<span class="k">return</span> <span class="n">response</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">logoff</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="sd">"""Logoff from the manager"""</span>
|
||||
|
||||
<span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'Logoff'</span><span class="p">}</span>
|
||||
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
|
||||
|
||||
<span class="k">return</span> <span class="n">response</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">hangup</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">channel</span><span class="p">):</span>
|
||||
<span class="sd">"""Hangup the specified channel"""</span>
|
||||
|
||||
<span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'Hangup'</span><span class="p">}</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Channel'</span><span class="p">]</span> <span class="o">=</span> <span class="n">channel</span>
|
||||
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
|
||||
|
||||
<span class="k">return</span> <span class="n">response</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">channel</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
|
||||
<span class="sd">"""Get a status message from asterisk"""</span>
|
||||
|
||||
<span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'Status'</span><span class="p">}</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Channel'</span><span class="p">]</span> <span class="o">=</span> <span class="n">channel</span>
|
||||
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
|
||||
|
||||
<span class="k">return</span> <span class="n">response</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">redirect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">channel</span><span class="p">,</span> <span class="n">exten</span><span class="p">,</span> <span class="n">priority</span><span class="o">=</span><span class="s1">'1'</span><span class="p">,</span> <span class="n">extra_channel</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
|
||||
<span class="sd">"""Redirect a channel"""</span>
|
||||
|
||||
<span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'Redirect'</span><span class="p">}</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Channel'</span><span class="p">]</span> <span class="o">=</span> <span class="n">channel</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Exten'</span><span class="p">]</span> <span class="o">=</span> <span class="n">exten</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Priority'</span><span class="p">]</span> <span class="o">=</span> <span class="n">priority</span>
|
||||
<span class="k">if</span> <span class="n">context</span><span class="p">:</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Context'</span><span class="p">]</span> <span class="o">=</span> <span class="n">context</span>
|
||||
<span class="k">if</span> <span class="n">extra_channel</span><span class="p">:</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'ExtraChannel'</span><span class="p">]</span> <span class="o">=</span> <span class="n">extra_channel</span>
|
||||
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
|
||||
|
||||
<span class="k">return</span> <span class="n">response</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">originate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">channel</span><span class="p">,</span> <span class="n">exten</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">priority</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">caller_id</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">async</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">account</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">variables</span><span class="o">=</span><span class="p">{}):</span>
|
||||
<span class="sd">"""Originate a call"""</span>
|
||||
|
||||
<span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'Originate'</span><span class="p">}</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Channel'</span><span class="p">]</span> <span class="o">=</span> <span class="n">channel</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Exten'</span><span class="p">]</span> <span class="o">=</span> <span class="n">exten</span>
|
||||
<span class="k">if</span> <span class="n">context</span><span class="p">:</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Context'</span><span class="p">]</span> <span class="o">=</span> <span class="n">context</span>
|
||||
<span class="k">if</span> <span class="n">priority</span><span class="p">:</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Priority'</span><span class="p">]</span> <span class="o">=</span> <span class="n">priority</span>
|
||||
<span class="k">if</span> <span class="n">timeout</span><span class="p">:</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Timeout'</span><span class="p">]</span> <span class="o">=</span> <span class="n">timeout</span>
|
||||
<span class="k">if</span> <span class="n">caller_id</span><span class="p">:</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'CallerID'</span><span class="p">]</span> <span class="o">=</span> <span class="n">caller_id</span>
|
||||
<span class="k">if</span> <span class="n">async</span><span class="p">:</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Async'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'yes'</span>
|
||||
<span class="k">if</span> <span class="n">account</span><span class="p">:</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Account'</span><span class="p">]</span> <span class="o">=</span> <span class="n">account</span>
|
||||
<span class="c1"># join dict of vairables together in a string in the form of 'key=val|key=val'</span>
|
||||
<span class="c1"># with the latest CVS HEAD this is no longer necessary</span>
|
||||
<span class="c1"># if variables: cdict['Variable'] = '|'.join(['='.join((str(key), str(value))) for key, value in variables.items()])</span>
|
||||
<span class="k">if</span> <span class="n">variables</span><span class="p">:</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Variable'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'='</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
|
||||
<span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">key</span><span class="p">),</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)))</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">variables</span><span class="o">.</span><span class="n">items</span><span class="p">()]</span>
|
||||
|
||||
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
|
||||
|
||||
<span class="k">return</span> <span class="n">response</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">mailbox_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mailbox</span><span class="p">):</span>
|
||||
<span class="sd">"""Get the status of the specfied mailbox"""</span>
|
||||
|
||||
<span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'MailboxStatus'</span><span class="p">}</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Mailbox'</span><span class="p">]</span> <span class="o">=</span> <span class="n">mailbox</span>
|
||||
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
|
||||
|
||||
<span class="k">return</span> <span class="n">response</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">command</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">command</span><span class="p">):</span>
|
||||
<span class="sd">"""Execute a command"""</span>
|
||||
|
||||
<span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'Command'</span><span class="p">}</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Command'</span><span class="p">]</span> <span class="o">=</span> <span class="n">command</span>
|
||||
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
|
||||
|
||||
<span class="k">return</span> <span class="n">response</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">extension_state</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exten</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
|
||||
<span class="sd">"""Get the state of an extension"""</span>
|
||||
|
||||
<span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'ExtensionState'</span><span class="p">}</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Exten'</span><span class="p">]</span> <span class="o">=</span> <span class="n">exten</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Context'</span><span class="p">]</span> <span class="o">=</span> <span class="n">context</span>
|
||||
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
|
||||
|
||||
<span class="k">return</span> <span class="n">response</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">playdtmf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">channel</span><span class="p">,</span> <span class="n">digit</span><span class="p">):</span>
|
||||
<span class="sd">"""Plays a dtmf digit on the specified channel"""</span>
|
||||
|
||||
<span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'PlayDTMF'</span><span class="p">}</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Channel'</span><span class="p">]</span> <span class="o">=</span> <span class="n">channel</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Digit'</span><span class="p">]</span> <span class="o">=</span> <span class="n">digit</span>
|
||||
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
|
||||
|
||||
<span class="k">return</span> <span class="n">response</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">absolute_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">channel</span><span class="p">,</span> <span class="n">timeout</span><span class="p">):</span>
|
||||
<span class="sd">"""Set an absolute timeout on a channel"""</span>
|
||||
|
||||
<span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'AbsoluteTimeout'</span><span class="p">}</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Channel'</span><span class="p">]</span> <span class="o">=</span> <span class="n">channel</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Timeout'</span><span class="p">]</span> <span class="o">=</span> <span class="n">timeout</span>
|
||||
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
|
||||
<span class="k">return</span> <span class="n">response</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">mailbox_count</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mailbox</span><span class="p">):</span>
|
||||
<span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'MailboxCount'</span><span class="p">}</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Mailbox'</span><span class="p">]</span> <span class="o">=</span> <span class="n">mailbox</span>
|
||||
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
|
||||
<span class="k">return</span> <span class="n">response</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">sippeers</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'Sippeers'</span><span class="p">}</span>
|
||||
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
|
||||
<span class="k">return</span> <span class="n">response</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">sipshowpeer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">peer</span><span class="p">):</span>
|
||||
<span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'SIPshowpeer'</span><span class="p">}</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Peer'</span><span class="p">]</span> <span class="o">=</span> <span class="n">peer</span>
|
||||
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
|
||||
<span class="k">return</span> <span class="n">response</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">reload</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">module</span><span class="p">):</span>
|
||||
<span class="sd">""" Reloads config for a given module """</span>
|
||||
|
||||
<span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'Reload'</span><span class="p">}</span>
|
||||
<span class="n">cdict</span><span class="p">[</span><span class="s1">'Module'</span><span class="p">]</span> <span class="o">=</span> <span class="n">module</span>
|
||||
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
|
||||
<span class="k">return</span> <span class="n">response</span>
|
||||
|
||||
|
||||
<span class="k">class</span> <span class="nc">ManagerException</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
|
||||
<span class="k">pass</span>
|
||||
|
||||
|
||||
<span class="k">class</span> <span class="nc">ManagerSocketException</span><span class="p">(</span><span class="n">ManagerException</span><span class="p">):</span>
|
||||
<span class="k">pass</span>
|
||||
|
||||
|
||||
<span class="k">class</span> <span class="nc">ManagerAuthException</span><span class="p">(</span><span class="n">ManagerException</span><span class="p">):</span>
|
||||
<span class="k">pass</span>
|
||||
</pre></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
||||
<div class="sphinxsidebarwrapper"><div class="relations">
|
||||
<h3>Related Topics</h3>
|
||||
<ul>
|
||||
<li><a href="../../index.html">Documentation overview</a><ul>
|
||||
<li><a href="../index.html">Module code</a><ul>
|
||||
</ul></li>
|
||||
</ul></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div id="searchbox" style="display: none" role="search">
|
||||
<h3>Quick search</h3>
|
||||
<form class="search" action="../../search.html" method="get">
|
||||
<input type="text" name="q" />
|
||||
<input type="submit" value="Go" />
|
||||
<input type="hidden" name="check_keywords" value="yes" />
|
||||
<input type="hidden" name="area" value="default" />
|
||||
</form>
|
||||
<p class="searchtip" style="font-size: 90%">
|
||||
Enter search terms or a module, class or function name.
|
||||
</p>
|
||||
</div>
|
||||
<script type="text/javascript">$('#searchbox').show(0);</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearer"></div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
©2016, Randall Degges.
|
||||
|
||||
|
|
||||
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.6</a>
|
||||
& <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.7</a>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,86 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Overview: module code — pyst2 0.4.9 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '../',
|
||||
VERSION: '0.4.9',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="../_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="../_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="../_static/doctools.js"></script>
|
||||
<link rel="top" title="pyst2 0.4.9 documentation" href="../index.html" />
|
||||
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
|
||||
|
||||
</head>
|
||||
<body role="document">
|
||||
|
||||
<div class="document">
|
||||
<div class="documentwrapper">
|
||||
<div class="bodywrapper">
|
||||
<div class="body" role="main">
|
||||
|
||||
<h1>All modules for which code is available</h1>
|
||||
<ul><li><a href="asterisk/agi.html">asterisk.agi</a></li>
|
||||
<li><a href="asterisk/agitb.html">asterisk.agitb</a></li>
|
||||
<li><a href="asterisk/manager.html">asterisk.manager</a></li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
||||
<div class="sphinxsidebarwrapper"><div class="relations">
|
||||
<h3>Related Topics</h3>
|
||||
<ul>
|
||||
<li><a href="../index.html">Documentation overview</a><ul>
|
||||
</ul></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div id="searchbox" style="display: none" role="search">
|
||||
<h3>Quick search</h3>
|
||||
<form class="search" action="../search.html" method="get">
|
||||
<input type="text" name="q" />
|
||||
<input type="submit" value="Go" />
|
||||
<input type="hidden" name="check_keywords" value="yes" />
|
||||
<input type="hidden" name="area" value="default" />
|
||||
</form>
|
||||
<p class="searchtip" style="font-size: 90%">
|
||||
Enter search terms or a module, class or function name.
|
||||
</p>
|
||||
</div>
|
||||
<script type="text/javascript">$('#searchbox').show(0);</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearer"></div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
©2016, Randall Degges.
|
||||
|
||||
|
|
||||
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.6</a>
|
||||
& <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.7</a>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Reference in new issue
Block a user