]>
git.ipfire.org Git - ipfire.org.git/blob - src/backend/asterisk.py
8a478bfb3ce21e1081be6e6ac1df13903b629e56
9 from .decorators
import *
11 loop
= asyncio
.get_event_loop()
13 class Asterisk(misc
.Object
):
17 # Connect as soon as the event loop starts
18 loop
.create_task(self
.connect())
22 if not self
.__manager
:
23 raise RuntimeError("Asterisk is not connected")
27 async def connect(self
):
31 manager
= panoramisk
.Manager(
32 host
= self
.settings
.get("asterisk-ami-host"),
33 username
= self
.settings
.get("asterisk-ami-username"),
34 secret
= self
.settings
.get("asterisk-ami-secret"),
36 on_connect
=self
._on
_connect
,
40 await manager
.connect()
44 def _on_connect(self
, manager
):
45 logging
.debug("Connection to Asterisk established")
47 # Close any existing connections
49 self
.__manager
.close()
51 self
.__manager
= manager
54 manager
= await self
.manager()
56 result
= manager
.ping()
59 async def get_sip_channels(self
, filter=None):
62 for data
in await self
.manager
.send_action({"Action" : "CoreShowChannels"}):
63 # Skip header and trailer
68 channel
= Channel(self
.backend
, data
)
71 if filter and not channel
.matches(filter):
74 channels
.append(channel
)
79 class Channel(misc
.Object
):
84 return self
.connected_line
87 def account_code(self
):
88 return self
.data
.AccountCode
91 def connected_line(self
):
92 return self
.data
.ConnectedLineName
or self
.data
.ConnectedLineNum
94 def matches(self
, filter):
96 self
.data
.CallerIDNum
,
101 h
, m
, s
= self
.data
.Duration
.split(":")
104 h
, m
, s
= int(h
), int(m
), int(s
)
108 return datetime
.timedelta(hours
=h
, minutes
=m
, seconds
=s
)
110 def is_connected(self
):
111 return self
.data
.ChannelStateDesc
== "Up"
113 def is_ringing(self
):
114 return self
.data
.ChannelStateDesc
== "Ringing"