From e5d58c807ddff1b5ba77f091e71069416333fe98 Mon Sep 17 00:00:00 2001 From: = Date: Thu, 24 Aug 2017 11:43:23 +0200 Subject: [PATCH] Log feed is displayed in the Browser --- server.py | 83 +++++++++++++++++++++++- static/js/index.js | 150 +++++++++++++++++++++++++++++++++++++++++++ templates/index.html | 23 +++---- 3 files changed, 242 insertions(+), 14 deletions(-) create mode 100644 static/js/index.js diff --git a/server.py b/server.py index 826c202..0d49da5 100755 --- a/server.py +++ b/server.py @@ -1,11 +1,92 @@ #!/usr/bin/env python3.5 -from flask import Flask, render_template +from flask import Flask, render_template, Response +import json +from time import time as now +from time import sleep + app = Flask(__name__) +FIELDNAME = { + 'time': 'Time', + 'level': 'Level', + 'source': 'Source', + 'name': 'Name', + 'message': 'Message' + } + +FIELDNAME_ORDER = [ 'time', 'level', 'source', 'name', 'message' ] + +class LogRow(): + def __init__(self, feed='', time='', level='level', src='source', name='name', message='wonderful meesage'): + # Parse feed message + + # Assign potential supplied values + self.time = time if time != '' else now() + self.level = level + self.source = src + self.name = name + self.message = message + + def get_head_row(self): + to_ret = [] + for fn in FIELDNAME_ORDER: + to_ret.append(FIELDNAME[fn]) + return to_ret + + def get_row(self): + to_ret = {} + #Number to keep them sorted (jsonify sort keys) + to_ret[1] = self.time + to_ret[2] = self.level + to_ret[3] = self.source + to_ret[4] = self.name + to_ret[5] = self.message + return to_ret + + +class EventMessage(): + def __init__(self, msg): + self.feed = None + self.isLog = EventMessage.is_log(msg) + + #get type of message: log or feed, then create + if self.isLog: + self.feed = msg + #FIXME do parser + self.feed = LogRow(feed=msg).get_row() + else: + self.feed = {feed.name: feed.data} + + def is_log(msg): + return True + + def to_json(self): + if self.isLog: + to_ret = { 'log': self.feed, 'chart': "" } + else: + to_ret = { 'log': "", 'chart': self.feed } + return 'data: {}\n\n'.format(json.dumps(to_ret)) + @app.route("/") def index(): return render_template('index.html') +@app.route("/_logs") +def logs(): + return Response(event_stream(), mimetype="text/event-stream") + +@app.route("/_get_log_head") +def getLogHead(): + return json.dumps(LogRow().get_head_row()) + +def event_stream(): + #for msg in pubsub: + for i in range(3): + msg = now() + sleep(0.3) + print('sending', EventMessage(msg).to_json()) + yield EventMessage(msg).to_json() + if __name__ == '__main__': app.run(host='localhost', port=8000, debug=True) diff --git a/static/js/index.js b/static/js/index.js new file mode 100644 index 0000000..1bd35b1 --- /dev/null +++ b/static/js/index.js @@ -0,0 +1,150 @@ + +var updateInterval = 30; // 30ms +var numPoint = 10; +var emptyArray = []; +for(i=0; i logSel.options[logSel.options.selectedIndex].value){ + while (tableBody.rows.length != logSel.options[logSel.options.selectedIndex].value){ + tableBody.deleteRow(0); + } + } + +} + +function slide(orig, newData) { + var slided = orig; + slided.slice(newData.length); + slided.concat(newData); + return slided +} + +function createRow(tableBody, log) { + var tr = document.createElement('TR'); + var action = document.createElement('TD'); + + for (var key in log) { + if (log.hasOwnProperty(key)) { + var td = document.createElement('TD'); + td.appendChild(document.createTextNode(log[key])); + tr.appendChild(td); + } + } + + // level + if( log.level == "INFO" ){ + tr.className = "info"; + } + else if ( log.level == "WARNING" ){ + tr.className = "warning"; + } + else if ( log.level == "CRITICAL"){ + tr.className = "danger" + } + + // action + action.appendChild(document.createTextNode("ACTION")); + tr.appendChild(action); + + tableBody.appendChild(tr); + +} + +function createHead(callback) { + if (document.getElementById('table_log_head').childNodes.length > 1) + return + $.getJSON( urlForHead, function( data ) { + var tr = document.createElement('TR'); + for (head of data) { + var th = document.createElement('TH'); + th.appendChild(document.createTextNode(head)); + tr.appendChild(th); + } + var action = document.createElement('TH'); + action.appendChild(document.createTextNode("Actions")); + tr.appendChild(action); + document.getElementById('table_log_head').appendChild(tr); + callback(); + }); +} diff --git a/templates/index.html b/templates/index.html index fa98b7c..19bf58e 100644 --- a/templates/index.html +++ b/templates/index.html @@ -78,20 +78,9 @@
- - - - - - - - - - - - + - +
TimeChannelLevelScript NameSourceDatePaste nameMessageActions
@@ -113,8 +102,16 @@ + + + + +