#!/usr/bin/env python r""" This module provides functions which are useful for running plug-ins. """ import sys import os import glob import gen_print as gp import gen_misc as gm # Some help text that is common to more than one program. plug_in_dir_paths_help_text = \ 'This is a colon-separated list of plug-in directory paths. If one' +\ ' of the entries in the list is a plain directory name (i.e. no' +\ ' path info), it will be taken to be a native plug-in. In that case,' +\ ' %(prog)s will search for the native plug-in in the "plug-ins"' +\ ' subdirectory of each path in the PATH environment variable until it' +\ ' is found. Also, integrated plug-ins will automatically be appended' +\ ' to your plug_in_dir_paths list. An integrated plug-in is any plug-in' +\ ' found using the PATH variable that contains a file named "integrated".' mch_class_help_text = \ 'The class of machine that we are testing (e.g. "op" = "open power",' +\ ' "obmc" = "open bmc", etc).' PATH_LIST = gm.return_path_list() def get_plug_in_base_paths(): r""" Get plug-in base paths and return them as a list. This function searches the PATH_LIST (created from PATH environment variable) for any paths that have a "plug_ins" subdirectory. All such paths are considered plug_in_base paths. """ global PATH_LIST plug_in_base_path_list = [] for path in PATH_LIST: candidate_plug_in_base_path = path + "plug_ins/" if os.path.isdir(candidate_plug_in_base_path): plug_in_base_path_list.append(candidate_plug_in_base_path) return plug_in_base_path_list # Define global plug_in_base_path_list and call get_plug_in_base_paths to set its value. plug_in_base_path_list = get_plug_in_base_paths() def find_plug_in_package(plug_in_name): r""" Find and return the normalized directory path of the specified plug in. This is done by searching the global plug_in_base_path_list. Description of arguments: plug_in_name The unqualified name of the plug-in package. """ global plug_in_base_path_list for plug_in_base_dir_path in plug_in_base_path_list: candidate_plug_in_dir_path = os.path.normpath(plug_in_base_dir_path + plug_in_name) + \ os.sep if os.path.isdir(candidate_plug_in_dir_path): return candidate_plug_in_dir_path return "" def validate_plug_in_package(plug_in_dir_path, mch_class="obmc"): r""" Validate the plug in package and return the normalized plug-in directory path. Description of arguments: plug_in_dir_path The "relative" or absolute path to a plug in package directory. mch_class The class of machine that we are testing (e.g. "op" = "open power", "obmc" = "open bmc", etc). """ gp.dprint_executing() if os.path.isabs(plug_in_dir_path): # plug_in_dir_path begins with a slash so it is an absolute path. candidate_plug_in_dir_path = os.path.normpath(plug_in_dir_path) +\ os.sep if not os.path.isdir(candidate_plug_in_dir_path): gp.print_error_report("Plug-in directory path \"" + plug_in_dir_path + "\" does not exist.\n") exit(1) else: # The plug_in_dir_path is actually a simple name (e.g. "OBMC_Sample")... candidate_plug_in_dir_path = find_plug_in_package(plug_in_dir_path) if candidate_plug_in_dir_path == "": global PATH_LIST gp.print_error_report("Plug-in directory path \"" + plug_in_dir_path + "\" could not be found" + " in any of the following directories:\n" + gp.sprint_var(PATH_LIST)) exit(1) # Make sure that this plug-in supports us... supports_file_path = candidate_plug_in_dir_path + "supports_" + mch_class if not os.path.exists(supports_file_path): gp.print_error_report("The following file path could not be" + " found:\n" + gp.sprint_varx("supports_file_path", supports_file_path) + "\nThis file is necessary to indicate that" + " the given plug-in supports the class of" + " machine we are testing, namely \"" + mch_class + "\".\n") exit(1) return candidate_plug_in_dir_path def return_integrated_plug_ins(mch_class="obmc"): r""" Return a list of integrated plug-ins. Integrated plug-ins are plug-ins which are selected without regard for whether the user has specified them. In other words, they are "integrated" into the program suite. The programmer designates a plug-in as integrated by putting a file named "integrated" into the plug-in package directory. Description of arguments: mch_class The class of machine that we are testing (e.g. "op" = "open power", "obmc" = "open bmc", etc). """ global plug_in_base_path_list integrated_plug_ins_list = [] DEBUG_SKIP_INTEGRATED = int(os.getenv('DEBUG_SKIP_INTEGRATED', '0')) if DEBUG_SKIP_INTEGRATED: return integrated_plug_ins_list for plug_in_base_path in plug_in_base_path_list: # Get a list of all plug-in paths that support our mch_class. mch_class_candidate_list = glob.glob(plug_in_base_path + "*/supports_" + mch_class) for candidate_path in mch_class_candidate_list: integrated_plug_in_dir_path = os.path.dirname(candidate_path) +\ os.sep integrated_file_path = integrated_plug_in_dir_path + "integrated" if os.path.exists(integrated_file_path): plug_in_name = \ os.path.basename(os.path.dirname(candidate_path)) if plug_in_name not in integrated_plug_ins_list: # If this plug-in has not already been added to the list... integrated_plug_ins_list.append(plug_in_name) return integrated_plug_ins_list def return_plug_in_packages_list(plug_in_dir_paths, mch_class="obmc"): r""" Return a list of plug-in packages given the plug_in_dir_paths string. This function calls validate_plug_in_package so it will fail if plug_in_dir_paths contains any invalid plug-ins. Description of arguments: plug_in_dir_path The "relative" or absolute path to a plug in package directory. mch_class The class of machine that we are testing (e.g. "op" = "open power", "obmc" = "open bmc", etc). """ if plug_in_dir_paths != "": plug_in_packages_list = plug_in_dir_paths.split(":") else: plug_in_packages_list = [] # Get a list of integrated plug-ins (w/o full path names). integrated_plug_ins_list = return_integrated_plug_ins(mch_class) # Put both lists together in plug_in_packages_list with no duplicates. NOTE: This won't catch # duplicates if the caller specifies the full path name of a native plug-in but that should be rare # enough. plug_in_packages_list = plug_in_packages_list + integrated_plug_ins_list plug_in_packages_list = \ list(set([validate_plug_in_package(path, mch_class) for path in plug_in_packages_list])) return plug_in_packages_list