import logging import json from flask import request, Blueprint, abort, Response from flask.ext.login import current_user from auth.auth import require_session_login from endpoints.common import route_show_if from app import app, userevents from auth.permissions import SuperUserPermission from data.userevent import CannotReadUserEventsException import features import psutil import time logger = logging.getLogger(__name__) realtime = Blueprint('realtime', __name__) @realtime.route("/ps") @route_show_if(features.SUPER_USERS) @require_session_login def ps(): if not SuperUserPermission().can(): abort(403) def generator(): while True: build_status = {} try: builder_data = app.config['HTTPCLIENT'].get('http://localhost:8686/status', timeout=1) if builder_data.status_code == 200: build_status = json.loads(builder_data.text) except: pass try: data = { 'count': { 'cpu': psutil.cpu_percent(interval=1, percpu=True), 'virtual_mem': psutil.virtual_memory(), 'swap_mem': psutil.swap_memory(), 'connections': len(psutil.net_connections()), 'processes': len(psutil.pids()), 'network': psutil.net_io_counters() }, 'build': build_status } except psutil.AccessDenied: data = {} json_string = json.dumps(data) yield 'data: %s\n\n' % json_string time.sleep(1) try: return Response(generator(), mimetype="text/event-stream") except: pass @realtime.route("/user/") @require_session_login def index(): debug_template = """

Server sent events

""" return(debug_template) @realtime.route("/user/test") @require_session_login def user_test(): evt = userevents.get_event(current_user.db_user().username) evt.publish_event_data('test', {'foo': 2}) return 'OK' @realtime.route("/user/subscribe") @require_session_login def user_subscribe(): def wrapper(listener): yield 'data: %s\n\n' % json.dumps({}) for event_id, data in listener.event_stream(): message = {'event': event_id, 'data': data} json_string = json.dumps(message) yield 'data: %s\n\n' % json_string events = request.args.get('events', '').split(',') if not events: abort(404) try: listener = userevents.get_listener(current_user.db_user().username, events) except CannotReadUserEventsException: abort(504) return Response(wrapper(listener), mimetype="text/event-stream")