| Index: appengine_apps/chromium_status/appengine_module/chromium_status/breakpad.py
|
| diff --git a/appengine_apps/chromium_status/appengine_module/chromium_status/breakpad.py b/appengine_apps/chromium_status/appengine_module/chromium_status/breakpad.py
|
| deleted file mode 100644
|
| index 8943c07235f4692c7fe3dcf79c3fc2a42faae4da..0000000000000000000000000000000000000000
|
| --- a/appengine_apps/chromium_status/appengine_module/chromium_status/breakpad.py
|
| +++ /dev/null
|
| @@ -1,118 +0,0 @@
|
| -# Copyright (c) 2011 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.
|
| -
|
| -"""Error reporting service, aka Breakpad for Python."""
|
| -
|
| -import datetime
|
| -import json
|
| -
|
| -from google.appengine.api import taskqueue
|
| -from google.appengine.api import xmpp
|
| -from google.appengine.ext import db
|
| -from google.appengine.ext import webapp
|
| -
|
| -from appengine_module.chromium_status.base_page import BasePage
|
| -from appengine_module.chromium_status import utils
|
| -
|
| -
|
| -class Report(db.Model):
|
| - date = db.DateTimeProperty(auto_now_add=True)
|
| - user = db.StringProperty()
|
| - stack = db.TextProperty()
|
| - args = db.TextProperty()
|
| - exception = db.TextProperty()
|
| - host = db.StringProperty()
|
| - cwd = db.StringProperty()
|
| - version = db.StringProperty(multiline=True)
|
| -
|
| - def asDict(self):
|
| - return {
|
| - 'date': self.date.isoformat(),
|
| - 'user': self.user,
|
| - 'stack': self.stack,
|
| - 'args': self.args,
|
| - 'exception': self.exception,
|
| - 'host': self.host,
|
| - 'cwd': self.cwd,
|
| - 'version': self.version,
|
| - }
|
| -
|
| -
|
| -class Admins(db.Model):
|
| - user = db.UserProperty()
|
| - # When set to 0, doesn't sent IMs.
|
| - nb_lines = db.IntegerProperty(default=5)
|
| -
|
| -
|
| -class BreakPad(BasePage):
|
| - @utils.requires_write_access
|
| - def get(self):
|
| - limit = int(self.request.get('limit', 30))
|
| - reports = Report.gql('ORDER BY date DESC LIMIT %d' % limit)
|
| - if self.request.get('json'):
|
| - data = [report.asDict() for report in reports]
|
| - self.response.headers.add_header("content-type", 'text/plain')
|
| - self.response.out.write(json.dumps(data, indent=2, sort_keys=True))
|
| - else:
|
| - page_value = {'reports': reports}
|
| - template_values = self.InitializeTemplate('Breakpad reports')
|
| - template_values.update(page_value)
|
| - self.DisplayTemplate('breakpad.html', template_values)
|
| -
|
| - def post(self):
|
| - """Adds a new breakpad report.
|
| -
|
| - Anyone can add a stack trace.
|
| - """
|
| - user = self.request.get('user')
|
| - stack = self.request.get('stack')
|
| - args = self.request.get('args')
|
| - exception = self.request.get('exception')
|
| - host = self.request.get('host')
|
| - cwd = self.request.get('cwd')
|
| - version = self.request.get('version')
|
| - # Cheap blacklisting to keep me sane.
|
| - if ('twisted.spread.pb.DeadReferenceError: Calling Stale Broker' in
|
| - exception):
|
| - self.response.out.write('Ignored.')
|
| - return
|
| - if user and stack and args:
|
| - Report(user=user, stack=stack, args=args, exception=exception, host=host,
|
| - cwd=cwd, version=version).put()
|
| - params = {'user': user, 'stack': stack}
|
| - taskqueue.add(url='/restricted/breakpad/im', params=params)
|
| - self.response.out.write('A stack trace has been sent to the maintainers.')
|
| -
|
| -
|
| -class SendIM(webapp.RequestHandler):
|
| - """A taskqueue."""
|
| - @utils.requires_work_queue_login
|
| - def post(self):
|
| - user = self.request.get('user')
|
| - stack = self.request.get('stack')
|
| - stacks = stack.split('\n')
|
| - for i in Admins.all():
|
| - if not i.nb_lines or not i.user or not i.user.email():
|
| - continue
|
| - stack_text = '\n'.join(stacks[-min(len(stacks), i.nb_lines):])
|
| - text = '%s:\n%s' % (user, stack_text)
|
| - xmpp.send_message(i.user.email(), text)
|
| -
|
| -
|
| -class Cleanup(webapp.RequestHandler):
|
| - """A cron job."""
|
| - @utils.requires_work_queue_login
|
| - def get(self):
|
| - """Delete reports older than 31 days."""
|
| - cutoff = datetime.datetime.now() - datetime.timedelta(days=31)
|
| - # Will only delete 1000 reports at a time max. Shouldn't be a problem unles
|
| - # we get more than 1000 reports/day. I hope not!
|
| - for report in db.Query(Report, keys_only=True).filter('date <', cutoff):
|
| - db.delete(report)
|
| -
|
| -
|
| -def bootstrap():
|
| - if db.GqlQuery('SELECT __key__ FROM Admins').get() is None:
|
| - # Insert a dummy Admins so it can be edited through the admin console
|
| - Admins().put()
|
|
|