Skip to content

Instantly share code, notes, and snippets.

@achmel
Created January 14, 2019 20:37
Show Gist options
  • Save achmel/eb349b14bab745c370110c1b591aef1e to your computer and use it in GitHub Desktop.
Save achmel/eb349b14bab745c370110c1b591aef1e to your computer and use it in GitHub Desktop.
A simple POC forwarder of 7-bit SMS from Asterisk logs to any 3-rd party delivering API. Takes less resources being compared to a usual `tail -f`. Requires python 3.7 due to `smspdudecoder` dependency (TODO: provide a simple inline GSM 7-bit decoding).
#!/usr/bin/env python3.7
# encoding: utf-8
import time
import os
from io import StringIO
from smspdu.fields import SMSDeliver
import requests
asterisk_log = '/var/log/asterisk/messages'
def follow(the_file):
the_file.seek(0, os.SEEK_END)
while True:
line = the_file.readline()
if not line:
time.sleep(2)
continue
yield line
def decode(pdu_text):
msg = SMSDeliver.decode(StringIO(pdu_text))
return msg
def send(msg):
sender = str(msg['sender']['number'])
payload = str(msg['user_data']['data'])
url = 'https://api.pushover.net/1/messages.json'
data = {'token': '##############', 'user': '##############',
'sound': 'cashregister', 'title': sender, 'message': payload}
r = requests.post(url, data=data)
if r.status_code == 200:
return r.text
return r.status_code
logfile = open(asterisk_log)
log_lines = follow(logfile)
for line in log_lines:
print(line, end='')
if 'Can\'t parse OA' in line:
line = str(line.split('\'')[0])
message = decode(line)
s = send(message)
print(s)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment