| #!/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) |