]>
git.ipfire.org Git - ipfire.org.git/blob - webapp/backend/asterisk.py
7 log
= logging
.getLogger("asterisk")
9 class AsteriskManager(object):
10 def __init__(self
, address
, port
=5038, username
=None, password
=None, timeout
=10):
11 self
.socket
= socket
.socket(socket
.AF_INET
, socket
.SOCK_STREAM
)
12 self
.socket
.settimeout(timeout
)
13 self
.socket
.connect((address
, port
))
15 self
.conn
= self
.socket
.makefile("rw", 0)
17 self
._authenticate
(username
, password
)
19 def _authenticate(self
, username
, password
):
20 banner
= self
.conn
.readline()
22 if not banner
.startswith("Asterisk Call Manager"):
23 raise RuntimeError("Did not connect to an Asterisk here")
25 self
._send
_action
("Login", {
26 "Username" : username
,
31 def _make_action_id(self
):
32 return "%s" % time
.time()
34 def _send_action(self
, action
, parameters
={}):
35 self
._send
("Action", action
)
37 action_id
= self
._make
_action
_id
()
38 self
._send
("ActionID", action_id
)
40 for k
, v
in parameters
.items():
45 def _send(self
, key
, value
):
46 line
= "%s: %s" % (key
, value
)
47 log
.debug("S: %s" % line
)
49 self
.conn
.write("%s\r\n" % line
)
52 line
= self
.conn
.readline()
55 log
.debug("R: %s" % line
)
59 def _recv_response(self
):
66 # An empty line signals end of response
70 k
, sep
, v
= line
.partition(": ")
77 self
.conn
.write("\r\n")
80 res
= self
._recv
_response
()
82 if res
["Response"] == "Error":
83 raise Exception(res
["Message"])
85 if res
.get("EventList") == "start":
89 event
= self
._recv
_response
()
91 # This is the end of the list
92 if event
.get("EventList") == "Complete":
104 Sends a ping to asterisk and expects pong
106 res
= self
._send
_action
("Ping")
108 return res
["Ping"] == "Pong"
110 def call(self
, caller
, callee
, caller_id
=None, timeout
=30000):
111 res
= self
._send
_action
("Originate", {
112 "Channel" : "SIP/%s@kamailio" % caller
,
114 "Context" : "from-cli",
117 "CallerID" : caller_id
or caller
,
122 def list_channels(self
):
125 for c
in self
._send
_action
("CoreShowChannels"):
126 channel
= Channel(self
, c
.get("Channel"))
127 channels
.append(channel
)
129 return sorted(channels
)
131 def _mailbox_status(self
, mailbox
):
132 return self
._send
_action
("MailboxStatus", { "Mailbox" : "%s@default" % mailbox
})
134 def messages_waiting(self
, mailbox
):
135 status
= self
._mailbox
_status
(mailbox
)
137 # Get messages waiting
138 waiting
= status
.get("Waiting", 0)
142 def list_peers(self
):
145 for p
in self
._send
_action
("SIPPeers"):
146 peer
= Peer(self
, p
.get("ObjectName"))
151 def list_registry(self
):
152 print self
._send
_action
("SIPShowRegistry")
155 class Channel(object):
156 def __init__(self
, manager
, channel_id
):
157 self
.manager
= manager
160 self
.status
= self
.manager
._send
_action
("Status", { "Channel" : self
.id })[0]
162 def __eq__(self
, other
):
163 return self
.id == other
.id
165 def __lt__(self
, other
):
167 return not self
.duration
< other
.duration
170 return "<%s %s>" % (self
.__class
__.__name
__, self
.id)
173 res
= self
.manager
._send
_action
("Hangup", { "Channel" : self
.id })
175 return res
["Response"] == "Success"
179 return self
.status
.get("Type")
182 def application(self
):
183 return self
.status
.get("Application")
187 seconds
= self
.status
.get("Seconds", None)
201 state
= self
.status
.get("ChannelState")
204 return self
._states
[state
]
210 format
= self
.status
.get("Nativeformats")
212 return format
.lstrip("(").rstrip(")")
215 def _format_number(number
):
217 if number
and number
.startswith("00"):
218 return "+%s" % number
[2:]
224 num
= self
.status
.get("CallerIDNum")
226 return self
._format
_number
(num
)
229 def caller_name(self
):
230 name
= self
.status
.get("CallerIDName")
232 if name
in ("", "<unknown>"):
239 if self
.application
== "ConfBridge":
240 return self
.data
# Will have the conference room number
242 elif self
.application
== "Echo":
245 elif self
.application
in ("VoiceMail", "VoiceMailMain"):
247 user
, rest
= self
.data
.split("@", 1)
253 num
= self
.status
.get("EffectiveConnectedLineNum") or self
.status
.get("DNID")
255 return self
._format
_number
(num
)
258 def application(self
):
259 return self
.status
.get("Application")
263 return self
.status
.get("Data")
267 def __init__(self
, manager
, peer_id
):
268 self
.manager
= manager
271 self
.data
= self
.manager
._send
_action
("SIPShowPeer", { "Peer" : self
.id })
274 return "<%s %s>" % (self
.__class
__.__name
__, self
.id)
276 def __eq__(self
, other
):
277 return self
.id == other
.id
279 def __lt__(self
, other
):
280 return self
.id < other
.id