#!/usr/bin/python # Copyright (c) 2014 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """A shell for crbug_crawler. """ import crbug_crawler import cmd import logging import os import sys import common from autotest_lib.client.common_lib import global_config from autotest_lib.server.cros.dynamic_suite import reporting try: from oauth2client import file as oauth_file from oauth2client import client from oauth2client import tools except ImportError: logging.error('You do not have the appropriate oauth2client libraries' 'required for authorization. Run ./<autotest_checkout>/utils/\ ' 'build_externals.py or pip install the oauth2client.') sys.exit(1) def check_auth(): """Checks if valid oath credentials exist on the system. If valid credentials aren't found on the client they're generated, if possible, using the cliend_id and client_secret from the shadow_config. """ shadow_config = os.path.join(common.autotest_dir, 'shadow_config.ini') if not os.path.exists(shadow_config): logging.error('Cannot autorize without a shadow_config that contains' 'the appropriate client id for oauth. Contact ' 'chromeos-lab-infrastructure if you think this is a mistake.') sys.exit(1) auth_store = oauth_file.Storage(reporting.Reporter.get_creds_abspath()) creds = auth_store.get() if creds is None or creds.invalid: client_id = global_config.global_config.get_config_value( reporting.BUG_CONFIG_SECTION, 'client_id', default='') client_secret = global_config.global_config.get_config_value( reporting.BUG_CONFIG_SECTION, 'client_secret', default='') scope = global_config.global_config.get_config_value( reporting.BUG_CONFIG_SECTION, 'scope', default='') if not client_secret and not client_id: logging.error('Unable to generate oauth credentials, client_id ' 'is %s and client_secret %s. If you do not require oauth ' 'run this script with --noauth. This may or may not be ' 'implemented ATM ;).', client_id, client_secret) input_flow = client.OAuth2WebServerFlow(client_id=client_id, client_secret=client_secret, scope=scope) logging.warning('Running oauth flow, make sure you use your chromium ' 'account during autorization.') creds = tools.run(input_flow, auth_store) class CrBugShell(cmd.Cmd): def __init__(self, *args, **kwargs): cmd.Cmd.__init__(self, *args, **kwargs) self.queries = [] self.labels = [] if not kwargs.get('noauth'): check_auth() self.crawler = crbug_crawler.Crawler() def do_reap(self, line): self.crawler.filter_issues(queries='', labels=self.crawler.all_autofiled_label) if line: try: limit = int(line) except ValueError: logging.warning('Reap can only take an integer argument.') return else: limit = None self.crawler.dump_issues(limit=limit) def do_query_filter(self, query): print 'Adding query %s' % query self.queries.append(query) def do_label_filter(self, label): print 'Adding label %s' % label self.labels.append(label) def do_show_filters(self, line=''): print ('queries: %s, labels %s' % (self.queries, self.labels)) def do_reset(self, line): self.crawler.issues = None self.queries = [] self.labels = [] def do_run_filter(self, line): print 'running the following filter: %s' % self.do_show_filters() # Populate cached issues if this is a first time query. If we have # cached issues from an incremental search, filter those instead. if self.crawler.issues: self.crawler.issues = self.crawler.filter_labels( self.crawler.issues, self.labels) self.crawler.issues = self.crawler.filter_queries( self.crawler.issues, self.queries) else: self.crawler.filter_issues(queries=' '.join(self.queries), labels=' '.join(self.labels)) self.crawler.dump_issues() if __name__ == '__main__': CrBugShell().cmdloop()