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