jenkins-bot has submitted this change and it was merged. Change subject: Add a Python dev server for debugging purposes. ......................................................................
Add a Python dev server for debugging purposes. Change-Id: I11d57c399764a080adc8d3706c046e571f609dba --- A server/bin/eventlogging-devserver M server/setup.py 2 files changed, 123 insertions(+), 2 deletions(-) Approvals: Ori.livneh: Looks good to me, approved jenkins-bot: Verified diff --git a/server/bin/eventlogging-devserver b/server/bin/eventlogging-devserver new file mode 100755 index 0000000..2a76e28 --- /dev/null +++ b/server/bin/eventlogging-devserver @@ -0,0 +1,119 @@ +#!/usr/bin/env python +# -*- coding: utf8 -*- +""" + el-devserver + ------------ + + :copyright: (c) 2012 by Ori Livneh <[email protected]> + :license: GNU General Public Licence 2.0 or later + +""" +# pylint: disable=E0611 +from __future__ import print_function + +import argparse +import itertools + +from wsgiref.simple_server import make_server, WSGIRequestHandler + +import eventlogging +import jsonschema + +from pygments import highlight +from pygments.console import ansiformat +from pygments.formatters import TerminalFormatter +from pygments.lexers import JSONLexer + + +argparser = argparse.ArgumentParser() +argparser.add_argument('--host', default='0.0.0.0') +argparser.add_argument('--port', default=8080, type=int) +args = argparser.parse_args() + +lexer = JSONLexer() +formatter = TerminalFormatter() + +server_software = 'EventLogging/%s' % eventlogging.__version__ + +seq_ids = itertools.count() +parser = eventlogging.LogParser('%q %l %n %t %h') +log_fmt = ('?%(QUERY_STRING)s %(SERVER_NAME)s %(SEQ_ID)d ' + '%(TIME)s %(REMOTE_ADDR)s') + + +class EventLoggingHandler(WSGIRequestHandler): + """WSGI request handler; annotates environ dict with seq ID and + timestamp in NCSA Common Log Format.""" + + def get_environ(self): + environ = WSGIRequestHandler.get_environ(self) + environ.update(SEQ_ID=next(seq_ids), TIME=eventlogging.ncsa_utcnow()) + return environ + + def log_message(self, format, *args): # pylint: disable=W0621 + pass # We'll handle logging in the WSGI app. + + +def validate(log_line): + """Parse and validate a log line containing an encapsulated event. + Returns a tuple of (event, errors). If no object was decoded, + 'event' will be None.""" + try: + event = parser.parse(log_line) + except ValueError as err: + return None, [err] + + try: + scid = event['schema'], event['revision'] + except KeyError as err: + return event, [err] + + try: + schema = eventlogging.get_schema(scid, encapsulate=True) + except jsonschema.SchemaError as err: + return event, [err] + + validator = jsonschema.Draft3Validator(schema) + return event, list(validator.iter_errors(event)) + + +def handle_event(environ, start_response): + """WSGI app; parses, validates and pretty-prints incoming event + requests.""" + log_line = log_fmt % environ + event, errors = validate(log_line) + valid = not errors + + headers = [ + ('Server', server_software), + ('EventLogging-Valid', str(int(valid))) + ] + headers.extend(('EventLogging-Error', str(err)) for err in errors) + start_response('204 No Content', headers) + + print('── request ────────────') + print(log_line) + + print('── event ──────────────') + json = eventlogging.json.dumps(event, indent=2, sort_keys=True) + print(highlight(json, lexer, formatter), end='') + + print('── validation ──────────') + for error in errors: + print(ansiformat('red', '✘ Error:'), error) + if valid: + print(ansiformat('green', '✔ Valid.')) + + print('────────────────────────') + return [] + + +httpd = make_server(args.host, args.port, handle_event, + handler_class=EventLoggingHandler) + +print('EventLogging DevServer running on %s:%s...' % (args.host, args.port)) + +try: + httpd.serve_forever() +except KeyboardInterrupt: + pass diff --git a/server/setup.py b/server/setup.py index c066ca8..358991c 100644 --- a/server/setup.py +++ b/server/setup.py @@ -43,17 +43,19 @@ 'eventlogging', ), scripts=( - 'bin/sv-alerts', + 'bin/eventlogging-devserver', 'bin/json2sql', 'bin/log2json', + 'bin/seqmon', + 'bin/sv-alerts', 'bin/udp2zmq', 'bin/zmq2log', - 'bin/seqmon', 'bin/zmux', ), zip_safe=False, test_suite='tests', install_requires=( + "pygments>=1.5", "jsonschema>=0.7", "pyzmq>=2.1", "sqlalchemy>=0.7", -- To view, visit https://gerrit.wikimedia.org/r/49379 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I11d57c399764a080adc8d3706c046e571f609dba Gerrit-PatchSet: 2 Gerrit-Project: mediawiki/extensions/EventLogging Gerrit-Branch: master Gerrit-Owner: Ori.livneh <[email protected]> Gerrit-Reviewer: Ori.livneh <[email protected]> Gerrit-Reviewer: jenkins-bot _______________________________________________ MediaWiki-commits mailing list [email protected] https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits
