| #!/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() |