itimport freepbx-glue - dmt - source code for the kunsthal art installation Err parazyd.org 70 hgit clone git://parazyd.org/dmt.git URL:git://parazyd.org/dmt.git parazyd.org 70 1Log /git/dmt/log.gph parazyd.org 70 1Files /git/dmt/files.gph parazyd.org 70 1Refs /git/dmt/refs.gph parazyd.org 70 1README /git/dmt/file/README.md.gph parazyd.org 70 1LICENSE /git/dmt/file/LICENSE.gph parazyd.org 70 i--- Err parazyd.org 70 1commit 4ac934837cf0043f9801867dc248265112fa7cee /git/dmt/commit/4ac934837cf0043f9801867dc248265112fa7cee.gph parazyd.org 70 hAuthor: parazyd URL:mailto:parazyd@dyne.org parazyd.org 70 iDate: Fri, 17 Nov 2017 22:12:45 +0100 Err parazyd.org 70 i Err parazyd.org 70 iimport freepbx-glue Err parazyd.org 70 i Err parazyd.org 70 iDiffstat: Err parazyd.org 70 i A LICENSE | 16 ++++++++++++++++ Err parazyd.org 70 i A freepbx-glue/README.md | 33 +++++++++++++++++++++++++++++++ Err parazyd.org 70 i A freepbx-glue/config.py | 13 +++++++++++++ Err parazyd.org 70 i A freepbx-glue/freepbx_glue.py | 69 ++++++++++++++++++++++++++++++ Err parazyd.org 70 i A freepbx-glue/globalvars.py | 7 +++++++ Err parazyd.org 70 i Err parazyd.org 70 i5 files changed, 138 insertions(+), 0 deletions(-) Err parazyd.org 70 i--- Err parazyd.org 70 1diff --git a/LICENSE b/LICENSE /git/dmt/file/LICENSE.gph parazyd.org 70 it@@ -0,0 +1,16 @@ Err parazyd.org 70 i+ISC License Err parazyd.org 70 i+ Err parazyd.org 70 i+Copyright 2017 Ivan J. Err parazyd.org 70 i+Copyright 2017 Err parazyd.org 70 i+ Err parazyd.org 70 i+Permission to use, copy, modify, and/or distribute this software for any Err parazyd.org 70 i+purpose with or without fee is hereby granted, provided that the above Err parazyd.org 70 i+copyright notice and this permission notice appear in all copies. Err parazyd.org 70 i+ Err parazyd.org 70 i+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES Err parazyd.org 70 i+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF Err parazyd.org 70 i+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR Err parazyd.org 70 i+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES Err parazyd.org 70 i+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN Err parazyd.org 70 i+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF Err parazyd.org 70 i+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Err parazyd.org 70 1diff --git a/freepbx-glue/README.md b/freepbx-glue/README.md /git/dmt/file/freepbx-glue/README.md.gph parazyd.org 70 it@@ -0,0 +1,33 @@ Err parazyd.org 70 i+freepbx-glue Err parazyd.org 70 i+============ Err parazyd.org 70 i+ Err parazyd.org 70 i+freepbx-glue is a simple python daemon designed to parse logs output by Err parazyd.org 70 i+Asterisk/FreePBX. Err parazyd.org 70 i+ Err parazyd.org 70 i+It currently handles three states: Err parazyd.org 70 i+ Err parazyd.org 70 i+* The receiver is ringing Err parazyd.org 70 i+* The receiver has answered Err parazyd.org 70 i+* The receiver has hung up Err parazyd.org 70 i+ Err parazyd.org 70 i+Whenever a daemon enters one of these states, it will issue a callback Err parazyd.org 70 i+to an HTTP API running on the calling station. Err parazyd.org 70 i+ Err parazyd.org 70 i+ Err parazyd.org 70 i+Dependencies Err parazyd.org 70 i+------------ Err parazyd.org 70 i+ Err parazyd.org 70 i+``` Err parazyd.org 70 i+python3-requests Err parazyd.org 70 i+``` Err parazyd.org 70 i+ Err parazyd.org 70 i+ Err parazyd.org 70 i+Deploying Err parazyd.org 70 i+--------- Err parazyd.org 70 i+ Err parazyd.org 70 i+On the FreePBX machine, this daemon can be executed by running the Err parazyd.org 70 i+following command as root: Err parazyd.org 70 i+ Err parazyd.org 70 i+``` Err parazyd.org 70 i+# tail -f /var/log/asterisk/full | ./freepbx_glue.py Err parazyd.org 70 i+``` Err parazyd.org 70 1diff --git a/freepbx-glue/config.py b/freepbx-glue/config.py /git/dmt/file/freepbx-glue/config.py.gph parazyd.org 70 it@@ -0,0 +1,13 @@ Err parazyd.org 70 i+# See LICENSE file for copyright and license details. Err parazyd.org 70 i+""" Err parazyd.org 70 i+Configuration file for the FreePBX log parser Err parazyd.org 70 i+""" Err parazyd.org 70 i+ Err parazyd.org 70 i+# SIP ID of the caller station Err parazyd.org 70 i+CALLER_ID = 'SIP/4005' Err parazyd.org 70 i+ Err parazyd.org 70 i+# SIP ID of the telephone Err parazyd.org 70 i+RECEIVER_ID = 'SIP/4004' Err parazyd.org 70 i+ Err parazyd.org 70 i+# API url of the caller station listener Err parazyd.org 70 i+STATION_API = 'http://10.20.30.31:8000' Err parazyd.org 70 1diff --git a/freepbx-glue/freepbx_glue.py b/freepbx-glue/freepbx_glue.py /git/dmt/file/freepbx-glue/freepbx_glue.py.gph parazyd.org 70 it@@ -0,0 +1,69 @@ Err parazyd.org 70 i+#!/usr/bin/env python3 Err parazyd.org 70 i+# See LICENSE file for copyright and license details. Err parazyd.org 70 i+""" Err parazyd.org 70 i+FreePBX/Asterisk log parser and handler Err parazyd.org 70 i+""" Err parazyd.org 70 i+ Err parazyd.org 70 i+import sys Err parazyd.org 70 i+import requests Err parazyd.org 70 i+ Err parazyd.org 70 i+import globalvars Err parazyd.org 70 i+from config import (CALLER_ID, RECEIVER_ID, STATION_API) Err parazyd.org 70 i+ Err parazyd.org 70 i+ Err parazyd.org 70 i+def handle_line(logline): Err parazyd.org 70 i+ """ Err parazyd.org 70 i+ Parses a single log line to make an according call Err parazyd.org 70 i+ """ Err parazyd.org 70 i+ if not logline: Err parazyd.org 70 i+ return Err parazyd.org 70 i+ Err parazyd.org 70 i+ parsed = logline.split() Err parazyd.org 70 i+ Err parazyd.org 70 i+ # We wait for a ring. Err parazyd.org 70 i+ if parsed[4].split('-')[0] == RECEIVER_ID: Err parazyd.org 70 i+ # stackno = parsed[4].split('-')[1] Err parazyd.org 70 i+ if parsed[6] == 'ringing': Err parazyd.org 70 i+ globalvars.weareringing = True Err parazyd.org 70 i+ print('We are ringing') Err parazyd.org 70 i+ return Err parazyd.org 70 i+ Err parazyd.org 70 i+ # When a call is answered, the receiver stackno is +1 in hex than Err parazyd.org 70 i+ # the caller's. Err parazyd.org 70 i+ Err parazyd.org 70 i+ # The phone is ringing. Err parazyd.org 70 i+ if globalvars.weareringing: Err parazyd.org 70 i+ if parsed[3] == 'app_dial:' and parsed[5] == 'answered': Err parazyd.org 70 i+ globalvars.weareringing = False Err parazyd.org 70 i+ globalvars.wehaveanswered = True Err parazyd.org 70 i+ print('We have answered') Err parazyd.org 70 i+ resp = requests.get(STATION_API+'/callanswered') Err parazyd.org 70 i+ if resp.status_code != 200: Err parazyd.org 70 i+ print('Something went wrong with the API call.') Err parazyd.org 70 i+ return Err parazyd.org 70 i+ Err parazyd.org 70 i+ # The phone has been picked up. Err parazyd.org 70 i+ if globalvars.wehaveanswered: Err parazyd.org 70 i+ if parsed[3] == 'pbx.c:': Err parazyd.org 70 i+ if parsed[6].startswith('Hangup("' + CALLER_ID): Err parazyd.org 70 i+ globalvars.wehaveanswered = False Err parazyd.org 70 i+ print('We hung up.') Err parazyd.org 70 i+ print('---') Err parazyd.org 70 i+ resp = requests.get(STATION_API+'/callended') Err parazyd.org 70 i+ if resp.status_code != 200: Err parazyd.org 70 i+ print('Something went wrong with the API call.') Err parazyd.org 70 i+ return Err parazyd.org 70 i+ Err parazyd.org 70 i+ Err parazyd.org 70 i+def main(): Err parazyd.org 70 i+ """ Err parazyd.org 70 i+ Main routine. Err parazyd.org 70 i+ Reads standard input line by line. Err parazyd.org 70 i+ """ Err parazyd.org 70 i+ while True: Err parazyd.org 70 i+ line = sys.stdin.readline() Err parazyd.org 70 i+ handle_line(line) Err parazyd.org 70 i+ Err parazyd.org 70 i+ Err parazyd.org 70 i+if __name__ == '__main__': Err parazyd.org 70 i+ main() Err parazyd.org 70 1diff --git a/freepbx-glue/globalvars.py b/freepbx-glue/globalvars.py /git/dmt/file/freepbx-glue/globalvars.py.gph parazyd.org 70 it@@ -0,0 +1,7 @@ Err parazyd.org 70 i+# See LICENSE file for copyright and license details. Err parazyd.org 70 i+""" Err parazyd.org 70 i+Global variables used to hold state of the log handler Err parazyd.org 70 i+""" Err parazyd.org 70 i+ Err parazyd.org 70 i+weareringing = False Err parazyd.org 70 i+wehaveanswered = False Err parazyd.org 70 .