2017-08-24 07:25:13 +02:00
|
|
|
#!/usr/bin/env python3.5
|
2017-08-24 11:43:23 +02:00
|
|
|
from flask import Flask, render_template, Response
|
|
|
|
import json
|
2017-09-11 14:53:06 +02:00
|
|
|
import redis
|
|
|
|
import configparser
|
2017-08-24 11:47:54 +02:00
|
|
|
from time import gmtime as now
|
|
|
|
from time import sleep, strftime
|
2017-09-11 14:53:06 +02:00
|
|
|
import os
|
|
|
|
|
|
|
|
configfile = os.path.join(os.environ['VIRTUAL_ENV'], '../config.cfg')
|
|
|
|
cfg = configparser.ConfigParser()
|
|
|
|
cfg.read(configfile)
|
2017-08-24 11:43:23 +02:00
|
|
|
|
2017-08-24 07:25:13 +02:00
|
|
|
app = Flask(__name__)
|
|
|
|
|
2017-09-11 14:53:06 +02:00
|
|
|
redis_server = redis.StrictRedis(
|
|
|
|
host=cfg.get('Redis', 'host'),
|
|
|
|
port=cfg.getint('Redis', 'port'),
|
|
|
|
db=cfg.getint('Redis', 'db'))
|
|
|
|
|
|
|
|
subscriber = redis_server.pubsub(ignore_subscribe_messages=True)
|
|
|
|
subscriber.psubscribe(cfg.get('Redis', 'channel'))
|
|
|
|
eventNumber = 0
|
|
|
|
|
|
|
|
class LogItem():
|
2017-08-24 11:43:23 +02:00
|
|
|
|
2017-09-11 14:53:06 +02:00
|
|
|
FIELDNAME_ORDER = [ 'time', 'level', 'source', 'name', 'message' ]
|
2017-08-24 11:43:23 +02:00
|
|
|
|
2017-09-11 14:53:06 +02:00
|
|
|
#def __init__(self, feed='', time='', level='level', src='source', name='name', message='wonderful meesage'):
|
|
|
|
def __init__(self, feed):
|
2017-08-24 11:43:23 +02:00
|
|
|
# Parse feed message
|
|
|
|
|
2017-09-11 14:53:06 +02:00
|
|
|
## Assign potential supplied values
|
|
|
|
#self.time = time if time != '' else strftime("%H:%M:%S", now())
|
|
|
|
#self.level = level
|
|
|
|
#self.source = src
|
|
|
|
#self.name = name
|
|
|
|
#self.message = message
|
|
|
|
|
|
|
|
self.time = strftime("%H:%M:%S", now())
|
|
|
|
self.level = 'level'
|
|
|
|
self.source = 'src'
|
|
|
|
self.name = 'name'
|
|
|
|
self.message = feed
|
2017-08-24 11:43:23 +02:00
|
|
|
|
|
|
|
def get_head_row(self):
|
|
|
|
to_ret = []
|
2017-09-11 14:53:06 +02:00
|
|
|
for fn in LogItem.FIELDNAME_ORDER:
|
|
|
|
to_ret.append(fn[0].upper()+fn[1:])
|
2017-08-24 11:43:23 +02:00
|
|
|
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():
|
2017-09-11 14:53:06 +02:00
|
|
|
# Suppose the event message is a json with the format {name: 'feedName', log:'logData'}
|
2017-08-24 11:43:23 +02:00
|
|
|
def __init__(self, msg):
|
2017-09-11 14:53:06 +02:00
|
|
|
msg = msg.decode('utf8')
|
|
|
|
try:
|
|
|
|
jsonMsg = json.loads(msg)
|
|
|
|
except json.JSONDecodeError:
|
|
|
|
jsonMsg = { 'name': "undefined" ,'log': msg }
|
2017-08-24 11:43:23 +02:00
|
|
|
|
2017-09-11 14:53:06 +02:00
|
|
|
self.feedName = jsonMsg['name']
|
|
|
|
self.feed = jsonMsg['log']
|
|
|
|
self.feed = LogItem(jsonMsg['log']).get_row()
|
2017-08-24 11:43:23 +02:00
|
|
|
|
2017-09-11 14:53:06 +02:00
|
|
|
#get type of message: log or feed, then create
|
|
|
|
#if self.isLog:
|
|
|
|
# self.feed = msg
|
|
|
|
# #FIXME do parser
|
|
|
|
# self.feed = LogItem(feed=msg).get_row()
|
|
|
|
#else:
|
|
|
|
# #FIXME do parser
|
|
|
|
# temp = []
|
|
|
|
# for feed in msg:
|
|
|
|
# temp.append(feed.name, feed.data)
|
|
|
|
# self.feed = temp
|
2017-08-24 11:43:23 +02:00
|
|
|
|
|
|
|
def to_json(self):
|
2017-09-11 14:53:06 +02:00
|
|
|
to_ret = { 'log': self.feed, 'feedName': self.feedName }
|
2017-08-24 11:43:23 +02:00
|
|
|
return 'data: {}\n\n'.format(json.dumps(to_ret))
|
|
|
|
|
2017-08-24 07:25:13 +02:00
|
|
|
@app.route("/")
|
|
|
|
def index():
|
2017-09-11 15:05:12 +02:00
|
|
|
return render_template('index.html',
|
|
|
|
graph_log_refresh_rate=cfg.getint('Dashboard' ,'graph_log_refresh_rate')
|
|
|
|
)
|
2017-08-24 07:25:13 +02:00
|
|
|
|
2017-08-24 11:43:23 +02:00
|
|
|
@app.route("/_logs")
|
|
|
|
def logs():
|
|
|
|
return Response(event_stream(), mimetype="text/event-stream")
|
|
|
|
|
|
|
|
@app.route("/_get_log_head")
|
|
|
|
def getLogHead():
|
2017-09-11 14:53:06 +02:00
|
|
|
return json.dumps(LogItem('').get_head_row())
|
2017-08-24 11:43:23 +02:00
|
|
|
|
|
|
|
def event_stream():
|
2017-09-11 14:53:06 +02:00
|
|
|
for msg in subscriber.listen():
|
|
|
|
content = msg['data']
|
|
|
|
yield EventMessage(content).to_json()
|
2017-08-24 07:25:13 +02:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
2017-09-11 14:53:06 +02:00
|
|
|
app.run(host='localhost', port=8000)
|