1# 2# Copyright 2008 Google Inc. All Rights Reserved. 3# 4"""Command line interface for autotest 5 6This module contains the generic CLI processing 7 8See topic_common.py for a High Level Design and Algorithm. 9 10This file figures out the topic and action from the 2 first arguments 11on the command line and imports the <topic> module. 12 13It then creates a <topic>_<action> object, and calls it parses), 14execute() and output() methods. 15""" 16 17__author__ = 'jmeurin@google.com (Jean-Marc Eurin)' 18 19import os, sys, re, traceback 20 21import common 22from autotest_lib.cli import topic_common 23from autotest_lib.client.common_lib import lsbrelease_utils 24from autotest_lib.server import utils 25 26 27def main(): 28 """ 29 The generic syntax is: 30 atest <topic> <action> <options> 31 atest-<topic> <action> <options> 32 atest --help 33 """ 34 _disallow_root_user_on_moblab() 35 cli = os.path.basename(sys.argv[0]) 36 syntax_obj = topic_common.atest() 37 38 # Normalize the various --help, -h and help to -h 39 sys.argv = [re.sub('--help|help', '-h', arg) for arg in sys.argv] 40 41 match = re.search('^atest-(\w+)$', cli) 42 if match: 43 topic = match.group(1) 44 else: 45 if len(sys.argv) > 1: 46 topic = sys.argv.pop(1) 47 else: 48 syntax_obj.invalid_syntax('No topic argument') 49 50 51 if topic == '-h': 52 sys.argv.insert(1, '-h') 53 syntax_obj.parse() 54 55 # Import the topic specific file 56 cli_dir = os.path.abspath(os.path.dirname(__file__)) 57 if not os.path.exists(os.path.join(cli_dir, '%s.py' % topic)): 58 syntax_obj.invalid_syntax('Invalid topic %s' % topic) 59 topic_module = common.setup_modules.import_module(topic, 60 'autotest_lib.cli') 61 62 # If we have a syntax error now, it should 63 # refer to the topic class. 64 topic_class = getattr(topic_module, topic) 65 topic_obj = topic_class() 66 67 if len(sys.argv) > 1: 68 action = sys.argv.pop(1) 69 70 if action == '-h': 71 action = 'help' 72 sys.argv.insert(1, '-h') 73 else: 74 topic_obj.invalid_syntax('No action argument') 75 76 # Any backward compatibility changes? 77 action = topic_obj.backward_compatibility(action, sys.argv) 78 79 # Instantiate a topic object 80 try: 81 action_class = getattr(topic_module, topic + '_' + action) 82 except AttributeError: 83 topic_obj.invalid_syntax('Invalid action %s' % action) 84 85 action_obj = action_class() 86 87 action_obj.parse() 88 try: 89 try: 90 results = action_obj.execute() 91 except topic_common.CliError: 92 pass 93 except Exception, err: 94 traceback.print_exc() 95 action_obj.generic_error("Unexpected exception: %s" % err) 96 else: 97 try: 98 action_obj.output(results) 99 except Exception: 100 traceback.print_exc() 101 finally: 102 return action_obj.show_all_failures() 103 104 105def _disallow_root_user_on_moblab(): 106 """Running these tools as root interferes with moblab services""" 107 if lsbrelease_utils.is_moblab(): 108 utils.verify_not_root_user() 109