+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#
+# Usage:
+# AGI(/etc/asterisk/agi/mqtt,/etc/asterisk/agi/mqtt.cfg,calls/missed)
+# or, to override the extension:
+# AGI(/etc/asterisk/agi/mqtt,/etc/asterisk/agi/mqtt.cfg,calls/missed,+43123456789)
+#
+
+import sys
+reload(sys)
+sys.setdefaultencoding('utf-8')
+
+from ConfigParser import ConfigParser
+import paho.mqtt.client as paho
+from pymessaging.sms import SmsDeliver
+
+import json
+
+from os import getpid,uname
+from pprint import pprint
+
+import sqlite3
+from sqlite3 import Error
+
+from os import remove,system
+
+client_name='agi-'+uname()[1]+'-'+str(getpid())
+
+conffile, topic, base64 = sys.argv[1:4]
+
+config = ConfigParser()
+config.add_section('mqtt')
+config.add_section('sms')
+# set defaults for anonymous auth
+config.set('mqtt', 'username', '')
+config.set('mqtt', 'password', '')
+config.set('mqtt', 'port', '1883')
+config.set('sms', 'tmpfile', '/tmp/sms.db')
+config.read(conffile)
+
+mqtt_server = config.get('mqtt', 'server')
+mqtt_port = config.getint('mqtt', 'port')
+mqtt_username = config.get('mqtt', 'username')
+mqtt_password = config.get('mqtt', 'password')
+sms_db = config.get('sms','tmpfile')
+
+try:
+ conn = sqlite3.connect(sms_db)
+except:
+ remove(sms_db)
+ conn = sqlite3.connect(sms_db)
+
+agi = []
+while 1:
+ line = sys.stdin.readline()
+ if not line or line == "\n":
+ break
+ agi.append(line)
+
+agi = dict([line.rstrip('\n').replace('agi_', '', 1).split(': ', 1) for line in agi])
+
+agi['base64'] = base64
+
+full_text=""
+try:
+ sms=SmsDeliver(base64.decode('base64').split('\r\n')[1])
+ if 'cnt' in sms.data:
+ sms_type='sms-multipart'
+ part_count=sms.data['cnt']
+ part_number=sms.data['seq']
+ ref=sms.data['ref']
+ agi['part-count']=part_count
+ agi['part-number']=part_number
+ agi['ref']=ref
+ else:
+ sms_type='sms'
+ agi['sms-type']=sms_type
+ sms_text=sms.data['text'].encode('utf-8')
+ agi['sms_text']=sms_text
+ if sms_type=='sms':
+ full_text=sms_text
+ else:
+ cur = conn.cursor()
+ cur.execute("create table if not exists sms_parts (ref integer,cnt integer,seq integer,datetime timestamp default current_timestamp,text varchar(255))")
+ cur.execute("insert into sms_parts(ref,cnt,seq,text) values(%s,%s,%s,\'%s\')" % (ref,part_count,part_number,sms_text))
+ cur.execute("select count(*),cnt from sms_parts where ref=%s" % (ref))
+ received,cnt=cur.fetchone()
+ if received==cnt:
+ cur.execute("select text from sms_parts where ref=%s order by seq" % (ref))
+ full_text=''.join(rec[0] for rec in cur.fetchall())
+# full_text=full_text.replace("\"","")
+ agi["full_text"]=full_text
+ cur.execute("delete from sms_parts where ref=%s" % (ref))
+ conn.commit()
+except:
+ raise
+
+if full_text:
+ print full_text
+ f1=open("/tmp/sms.log","w+")
+ f1.write(full_text.strip().encode('utf-8'))
+ f1.close()
+
+def agi_exit(rc, *args):
+ if rc != 0:
+ print "VERBOSE rc=%s %s" % (rc, args)
+ sys.exit(rc)
+
+def on_connect(mosq, rc, *args):
+ if rc != 0:
+ agi_exit(1, "Connection failed: %d" % rc)
+
+def on_publish(mosq, *args):
+ # done
+ agi_exit(0)
+
+client = paho.Client(client_name)
+client.username_pw_set(mqtt_username, mqtt_password)
+client.connect(mqtt_server, port=mqtt_port)
+client.on_connect = on_connect
+client.on_publish = on_publish
+
+client.publish(topic, payload=json.dumps(agi))
+client.loop()
+agi_exit(1, "Message publish timed out")