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

Reply via email to