Index: command_wrapper/command_wrapper_web.py |
=================================================================== |
--- command_wrapper/command_wrapper_web.py (revision 0) |
+++ command_wrapper/command_wrapper_web.py (revision 0) |
@@ -0,0 +1,90 @@ |
+# Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import os |
+from google.appengine.api import users |
+from google.appengine.ext import db |
+from google.appengine.ext import webapp |
+from google.appengine.ext.webapp import template |
+from google.appengine.ext.webapp.util import run_wsgi_app |
+ |
+ |
+class CommandInvocation(db.Model): |
+ command_id = db.StringProperty() |
+ remote_addr = db.StringProperty() |
+ attempt = db.IntegerProperty() |
+ retries = db.IntegerProperty() |
+ cwd = db.StringProperty() |
+ command = db.StringProperty() |
+ returncode = db.IntegerProperty() |
+ stdout = db.StringProperty(multiline=True) |
+ stderr = db.StringProperty(multiline=True) |
+ runtime = db.FloatProperty() |
+ timestamp = db.DateTimeProperty(auto_now_add=True) |
+ uname_sysname = db.StringProperty() |
+ uname_nodename = db.StringProperty() |
+ uname_release = db.StringProperty() |
+ uname_version = db.StringProperty() |
+ uname_machine = db.StringProperty() |
+ uname_machine = db.StringProperty() |
+ |
+ |
+class LogHandler(webapp.RequestHandler): |
+ """Handle requests to log events.""" |
+ |
+ def post(self): |
+ ci = CommandInvocation() |
+ ci.remote_addr = self.request.remote_addr |
+ ci.command_id = str(self.request.get('command_id')) |
+ ci.attempt = int(self.request.get('attempt')) |
+ ci.retries = int(self.request.get('retries')) |
+ ci.cwd = str(self.request.get('cwd')) |
+ ci.command = str(self.request.get('command')) |
+ ci.returncode = int(self.request.get('returncode')) |
+ ci.stdout = str(self.request.get('stdout')) |
+ ci.stderr = str(self.request.get('stderr')) |
+ ci.runtime = float(self.request.get('runtime')) |
+ ci.uname_sysname = str(self.request.get('uname_sysname')) |
+ ci.uname_nodename = str(self.request.get('uname_nodename')) |
+ ci.uname_release = str(self.request.get('uname_release')) |
+ ci.uname_version = str(self.request.get('uname_version')) |
+ ci.uname_machine = str(self.request.get('uname_machine')) |
+ ci.put() |
+ |
+ |
+class ViewerHandler(webapp.RequestHandler): |
+ """View log info.""" |
+ |
+ def get(self): |
+ user = users.get_current_user() |
+ if not user: |
+ uri = self.request.uri |
+ if uri.startswith('http:'): |
+ uri = 'https:' + uri[5:] |
+ self.redirect(users.create_login_url(uri)) |
+ return |
+ # Only allow @google.com folks to look. |
+ if not user.email().endswith('@google.com'): |
+ return |
+ items = db.GqlQuery('SELECT * FROM CommandInvocation ' |
+ 'ORDER BY timestamp DESC LIMIT 100') |
+ template_values = { |
+ 'items': items, |
+ } |
+ path = os.path.join(os.path.dirname(__file__), 'viewer.html') |
+ self.response.out.write(template.render(path, template_values)) |
+ |
+ |
+APPLICATION = webapp.WSGIApplication([ |
+ ('/log', LogHandler), |
+ ('/', ViewerHandler), |
+], debug=False) |
+ |
+ |
+def main(): |
+ run_wsgi_app(APPLICATION) |
+ |
+ |
+if __name__ == '__main__': |
+ main() |
Property changes on: command_wrapper/command_wrapper_web.py |
___________________________________________________________________ |
Added: svn:eol |
+ LF |