Skip to content

Commit b723f1f

Browse files
committed
MQTT refactoring
1 parent 87541ac commit b723f1f

38 files changed

+654
-210
lines changed

.env.example

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ ODOO_IP=10.18.0.2
44
DB_IP=10.18.0.3
55
NGINX_IP=10.18.0.4
66
BROKER_IP=10.18.0.5
7-
MARABUNTA_FORCE_VERSION=1.0.0
7+
MMARABUNTA_FORCE_VERSION=1.0.0

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,6 @@ local_conf.py
77
pymakr.conf
88
docker-compose.override.yml
99
deploy/ansible-deployment
10+
odoo/src/odoo
11+
# Ignore .conf files from local bound conainer folder
12+
asterisk/etc/asterisk/

asterisk/Dockerfile

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ RUN apk update && \
99
#Install optional tools
1010
RUN apk add tcpdump ethtool vlan iftop ngrep bash vim screen tmux mosquitto-clients
1111

12+
RUN mkdir /var/log/supervisor
13+
1214
COPY ./ /
1315

14-
RUN pip install -r /etc/agent/requirements.txt && \
15-
pip install -r /etc/asterisk/services/requirements.txt
16+
RUN pip install -r /services/requirements.txt

asterisk/agent/conf.py

-17
This file was deleted.

asterisk/agent/requirements.txt

-1
This file was deleted.

asterisk/etc/agent/asterisk_helper.py

-54
This file was deleted.

asterisk/etc/agent/conf.py

-17
This file was deleted.

asterisk/etc/agent/mqtt_client.py

-36
This file was deleted.

asterisk/etc/agent/requirements.txt

-1
This file was deleted.

asterisk/etc/supervisord.conf

+11-5
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,30 @@ supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
1111
logfile=/var/log/supervisord.log
1212
logfile_maxbytes=50MB
1313
logfile_backups=10
14-
loglevel=info
14+
loglevel=debug
1515
nodaemon=true
16+
childlogdir=/var/log/supervisor
1617

1718
[program:asterisk]
1819
command=asterisk -fpq
20+
redirect_stderr=true
1921

2022
[program:mqtt_client]
21-
directory=/etc/agent
23+
directory=/services
2224
command=python mqtt_client.py
25+
redirect_stderr=true
2326

2427
[program:agent]
25-
directory=/etc/agent
28+
directory=/services
2629
command=python asterisk_helper.py
30+
redirect_stderr=true
2731

2832
[program:ami_broker]
29-
directory=/etc/asterisk/services
33+
directory=/services
3034
command=python ami_broker.py
35+
redirect_stderr=true
3136

3237
[program:stasis_apps]
33-
directory=/etc/asterisk/services
38+
directory=/services
3439
command=python stasis_apps.py
40+
redirect_stderr=true
File renamed without changes.

asterisk/agent/asterisk_helper.py asterisk/services/asterisk_helper.py

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
logging.basicConfig(level=logging.DEBUG)
1010
_logger = logging.getLogger(__name__)
1111

12+
ASTERISK = '/usr/bin/asterisk'
13+
1214
from conf import *
1315

1416
class MyTermSocket(TermSocket):
File renamed without changes.

asterisk/etc/asterisk/services/conf.py asterisk/services/conf.py

+11-15
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,24 @@
1616
POLL_RECONNECT_TIMEOUT = 5
1717
AMI_RELOAD_PAUSE = 2 # 2 seconds between AMI connection reload
1818

19+
# Agent
20+
PORT = 8010
21+
ASTERISK = '/usr/sbin/asterisk'
22+
ASTERISK_ARGS = '-cr'
23+
ASTERISK_RECORDING_FOLDER = '/var/spool/asterisk/monitor'
24+
SSL_ENABLED = False
25+
SSL_CERT = './cert.pem'
26+
SSL_KEY = './privkey.pem'
27+
28+
29+
1930
ASTERISK_HELPER_URL = 'http://localhost:8010'
2031

2132
UPDATE_CDR_DELAY = 5 # Delay X sec before updating cdr to make sure it's in DB.
2233
UPDATE_CHANNEL_DELAY = 1 # Delay X sec before updating cdr to make sure it's in DB.
2334
RECORDING_DOWNLOAD_DELAY = 1 # Delay to let Asterisk close recorded file.
2435

2536
LOG_CONSOLE = True
26-
LOG_FILE = os.path.join(os.path.dirname(__file__), 'services.log')
2737
LOG_LEVEL = 'DEBUG'
2838

2939
try:
@@ -36,8 +46,6 @@
3646
HANDLRES = []
3747
if LOG_CONSOLE:
3848
HANDLRES.append('console')
39-
if LOG_FILE:
40-
HANDLRES.append('file')
4149

4250
LOGGING = {
4351
'version': 1,
@@ -57,18 +65,6 @@
5765
}
5866

5967

60-
# Log to file if log file is configured
61-
if LOG_FILE:
62-
LOGGING['handlers']['file'] = {
63-
'level': LOG_LEVEL,
64-
'class': 'logging.handlers.RotatingFileHandler',
65-
'formatter': 'verbose',
66-
'filename': LOG_FILE,
67-
'maxBytes': 10485760,
68-
'backupCount': 5
69-
}
70-
71-
7268
LOGGING['loggers'] = {
7369
# Disable requests library spam
7470
'requests': {

asterisk/services/mqtt_client.py

+83
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import json
2+
import paho.mqtt.client as mqtt
3+
import re
4+
import socket
5+
import os
6+
import uuid
7+
8+
# Define Variables
9+
AST_ETC_DIR= "/etc/asterisk"
10+
MQTT_HOST = "broker"
11+
MQTT_PORT = 1883
12+
MQTT_KEEPALIVE_INTERVAL = 45
13+
HOSTNAME = socket.gethostname()
14+
15+
16+
17+
class Client():
18+
19+
def __init__(self):
20+
self.uid = os.environ.get('UID') or '{}'.format(uuid.getnode())
21+
print 'UID: ' + self.uid
22+
self.mqtt_client = mqtt.Client(client_id=self.uid)
23+
self.mqtt_client.on_connect = self.on_connect
24+
self.mqtt_client.on_message = self.on_message
25+
self.mqtt_client.on_publish = self.on_publish
26+
self.mqtt_client.on_subscribe = self.on_subscribe
27+
self.mqtt_client.on_log = self.on_log
28+
# Subscribe to myself
29+
self.mqtt_client.connect(MQTT_HOST, MQTT_PORT, MQTT_KEEPALIVE_INTERVAL)
30+
self.mqtt_client.subscribe('/asterisk/' + self.uid + '/#', 0)
31+
self.mqtt_client.loop_forever()
32+
33+
34+
35+
def on_connect(self, client, userdata, flags, rc):
36+
print("rc: " + str(rc))
37+
38+
39+
def on_message(self, client, userdata, msg):
40+
print(msg.info, msg.dup, msg.mid, msg.qos, msg.retain, msg.state, msg.timestamp, msg.topic)
41+
found = re.search('^/asterisk/{}/(.+)$'.format(self.uid), msg.topic)
42+
if not found:
43+
print('Error: topic {} not understood.'.format(msg.topic))
44+
event_handler = getattr(self, 'on_' + found.group(1), self.handler_not_found)
45+
event_handler(client, userdata, msg)
46+
47+
def on_publish(self, client, obj, mid):
48+
print("mid: " + str(mid))
49+
50+
51+
def on_subscribe(self, client, obj, mid, granted_qos):
52+
print("Subscribed: " + str(mid) + " " + str(granted_qos))
53+
54+
55+
def on_log(self, client, obj, level, string):
56+
print(string)
57+
58+
59+
def handler_not_found(self, client, userdata, msg):
60+
print 'Topic {} handler not found.'.format(msg.topic)
61+
62+
63+
def _extract_message(self, payload):
64+
try:
65+
msg = json.loads(payload)
66+
return msg
67+
except ValueError as e:
68+
print(e.message, ': ', payload)
69+
70+
71+
def on_file(self, client, userdata, msg):
72+
data = self._extract_message(msg.payload)
73+
file_name = data.get('FileName')
74+
dest_folder = data.get('DestinationFolder')
75+
filename = os.path.join(dest_folder, file_name)
76+
print 'Updating file %s' % filename
77+
with open(filename, 'w') as f:
78+
f.write(data.get('Content'))
79+
80+
81+
82+
# Initiate MQTT Client
83+
mqttc = Client()

asterisk/etc/asterisk/services/requirements.txt asterisk/services/requirements.txt

+4-3
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ git+https://github.com/digium/swagger-py.git
22
ari
33
odoorpc
44
py-Asterisk
5+
terminado
56

67
#next dependencies are installed with aline's apk but left here for reference
7-
gevent
8-
requests
9-
setproctitle
8+
#gevent
9+
#requests
10+
#setproctitle
File renamed without changes.
File renamed without changes.

docker-compose.override.yml.example

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ services:
1414

1515
asterisk:
1616
volumes:
17-
- "./asterisk/etc/asterisk/services:/etc/asterisk/services"
17+
- "./asterisk/etc/:/etc/"
18+
- "./asterisk/services/:/services/"

0 commit comments

Comments
 (0)