initial artemis application commit

Change-Id: I01967b1e8e8df08cf95a2865566423a4aeb34ea9
diff --git a/tools/tutorials/artemis/server.py b/tools/tutorials/artemis/server.py
new file mode 100755
index 0000000..a5947b9
--- /dev/null
+++ b/tools/tutorials/artemis/server.py
@@ -0,0 +1,80 @@
+#!/usr/bin/python3
+
+async_mode = 'threading'
+
+import time
+from flask import Flask, render_template, abort
+import socketio
+from sys import stdin, stdout, stderr
+import json
+import time
+from netaddr import IPNetwork, IPAddress
+
+sio = socketio.Server(logger=False, async_mode=async_mode)
+app = Flask(__name__)
+app.wsgi_app = socketio.Middleware(sio, app.wsgi_app)
+app.config['SECRET_KEY'] = 'secret!'
+thread = None
+clients = {}
+
+
+def message_parser(line):
+    try:
+        temp_message = json.loads(line)
+        if temp_message['type'] == 'update':
+            for origin in temp_message['neighbor']['message']['update']['announce']['ipv4 unicast']:
+                message = {
+                    'type': 'A',
+                    'timestamp': temp_message['time'],
+                    'peer': temp_message['neighbor']['ip'],
+                    'host': 'exabgp',
+                    'path': temp_message['neighbor']['message']['update']['attribute']['as-path'],
+                }
+                for prefix in temp_message['neighbor']['message']['update']['announce']['ipv4 unicast'][origin]:
+                    message['prefix'] = prefix
+                    for sid in clients.keys():
+                        try:
+                            if IPAddress(str(prefix).split('/')[0]) in clients[sid][0]:
+                                print('Sending exa_message to ' +
+                                      str(clients[sid][0]), file=stderr)
+                                sio.emit(
+                                    'exa_message', message, room=sid, namespace='/onos')
+                        except:
+                            print('Invalid format received from %s'.format(str(sid)))
+    except Exception as e:
+        print(str(e), file=stderr)
+
+
+def exabgp_update_event():
+    while True:
+        line = stdin.readline().strip()
+        messages = message_parser(line)
+
+
+@app.route('/')
+def index():
+    abort(404)
+
+
+@sio.on('connect', namespace='/onos')
+def onos_connect(sid, environ):
+    global thread
+    if thread is None:
+        thread = sio.start_background_task(exabgp_update_event)
+
+
+@sio.on('disconnect', namespace='/onos')
+def onos_disconnect(sid):
+    if sid in clients:
+        del clients[sid]
+
+
+@sio.on('exa_subscribe', namespace='/onos')
+def onos_exa_subscribe(sid, message):
+    try:
+        clients[sid] = [IPNetwork(message['prefix']), True]
+    except:
+        print('Invalid format received from %s'.format(str(sid)))
+
+if __name__ == '__main__':
+    app.run(host='0.0.0.0', threaded=True)