blob: d6ab0a658e75a258de4ecf9e205c9262622d7fc1 [file] [log] [blame]
George Keishinge7e91712021-09-03 11:28:44 -05001#!/usr/bin/env python3
Michael Walsh7423c012016-10-04 10:27:21 -05002
3r"""
4This module provides functions which are useful for running plug-ins.
5"""
6
George Keishinge635ddc2022-12-08 07:38:02 -06007import glob
Patrick Williams20f38712022-12-08 06:18:26 -06008import os
9import sys
Michael Walsh7423c012016-10-04 10:27:21 -050010
George Keishinge635ddc2022-12-08 07:38:02 -060011import gen_misc as gm
Patrick Williams20f38712022-12-08 06:18:26 -060012import gen_print as gp
Michael Walsh7423c012016-10-04 10:27:21 -050013
14# Some help text that is common to more than one program.
Patrick Williams20f38712022-12-08 06:18:26 -060015plug_in_dir_paths_help_text = (
16 "This is a colon-separated list of plug-in directory paths. If one"
17 + " of the entries in the list is a plain directory name (i.e. no"
18 + " path info), it will be taken to be a native plug-in. In that case,"
19 + ' %(prog)s will search for the native plug-in in the "plug-ins"'
20 + " subdirectory of each path in the PATH environment variable until it"
21 + " is found. Also, integrated plug-ins will automatically be appended"
22 + " to your plug_in_dir_paths list. An integrated plug-in is any plug-in"
23 + ' found using the PATH variable that contains a file named "integrated".'
24)
Michael Walsh7423c012016-10-04 10:27:21 -050025
Patrick Williams20f38712022-12-08 06:18:26 -060026mch_class_help_text = (
27 'The class of machine that we are testing (e.g. "op" = "open power",'
28 + ' "obmc" = "open bmc", etc).'
29)
Michael Walsh7423c012016-10-04 10:27:21 -050030
31PATH_LIST = gm.return_path_list()
32
33
Michael Walsh7423c012016-10-04 10:27:21 -050034def get_plug_in_base_paths():
Michael Walsh7423c012016-10-04 10:27:21 -050035 r"""
36 Get plug-in base paths and return them as a list.
37
Michael Walsh410b1782019-10-22 15:56:18 -050038 This function searches the PATH_LIST (created from PATH environment variable) for any paths that have a
39 "plug_ins" subdirectory. All such paths are considered plug_in_base paths.
Michael Walsh7423c012016-10-04 10:27:21 -050040 """
41
42 global PATH_LIST
43
44 plug_in_base_path_list = []
45
46 for path in PATH_LIST:
47 candidate_plug_in_base_path = path + "plug_ins/"
48 if os.path.isdir(candidate_plug_in_base_path):
49 plug_in_base_path_list.append(candidate_plug_in_base_path)
50
51 return plug_in_base_path_list
52
Gunnar Mills096cd562018-03-26 10:19:12 -050053
Michael Walsh410b1782019-10-22 15:56:18 -050054# Define global plug_in_base_path_list and call get_plug_in_base_paths to set its value.
Michael Walsh7423c012016-10-04 10:27:21 -050055plug_in_base_path_list = get_plug_in_base_paths()
56
57
Michael Walsh7423c012016-10-04 10:27:21 -050058def find_plug_in_package(plug_in_name):
Michael Walsh7423c012016-10-04 10:27:21 -050059 r"""
Michael Walsh410b1782019-10-22 15:56:18 -050060 Find and return the normalized directory path of the specified plug in. This is done by searching the
61 global plug_in_base_path_list.
Michael Walsh7423c012016-10-04 10:27:21 -050062
63 Description of arguments:
Michael Walsh410b1782019-10-22 15:56:18 -050064 plug_in_name The unqualified name of the plug-in package.
Michael Walsh7423c012016-10-04 10:27:21 -050065 """
66
67 global plug_in_base_path_list
68 for plug_in_base_dir_path in plug_in_base_path_list:
Patrick Williams20f38712022-12-08 06:18:26 -060069 candidate_plug_in_dir_path = (
70 os.path.normpath(plug_in_base_dir_path + plug_in_name) + os.sep
71 )
Michael Walsh7423c012016-10-04 10:27:21 -050072 if os.path.isdir(candidate_plug_in_dir_path):
73 return candidate_plug_in_dir_path
74
75 return ""
76
Michael Walsh7423c012016-10-04 10:27:21 -050077
Patrick Williams20f38712022-12-08 06:18:26 -060078def validate_plug_in_package(plug_in_dir_path, mch_class="obmc"):
Michael Walsh7423c012016-10-04 10:27:21 -050079 r"""
Michael Walsh410b1782019-10-22 15:56:18 -050080 Validate the plug in package and return the normalized plug-in directory path.
Michael Walsh7423c012016-10-04 10:27:21 -050081
82 Description of arguments:
Michael Walsh410b1782019-10-22 15:56:18 -050083 plug_in_dir_path The "relative" or absolute path to a plug in package directory.
84 mch_class The class of machine that we are testing (e.g. "op" = "open power",
85 "obmc" = "open bmc", etc).
Michael Walsh7423c012016-10-04 10:27:21 -050086 """
87
88 gp.dprint_executing()
89
90 if os.path.isabs(plug_in_dir_path):
91 # plug_in_dir_path begins with a slash so it is an absolute path.
Patrick Williams20f38712022-12-08 06:18:26 -060092 candidate_plug_in_dir_path = (
93 os.path.normpath(plug_in_dir_path) + os.sep
94 )
Michael Walsh7423c012016-10-04 10:27:21 -050095 if not os.path.isdir(candidate_plug_in_dir_path):
Patrick Williams20f38712022-12-08 06:18:26 -060096 gp.print_error_report(
97 'Plug-in directory path "'
98 + plug_in_dir_path
99 + '" does not exist.\n'
100 )
Michael Walsh7423c012016-10-04 10:27:21 -0500101 exit(1)
102 else:
Michael Walsh410b1782019-10-22 15:56:18 -0500103 # The plug_in_dir_path is actually a simple name (e.g. "OBMC_Sample")...
Michael Walsh7423c012016-10-04 10:27:21 -0500104 candidate_plug_in_dir_path = find_plug_in_package(plug_in_dir_path)
105 if candidate_plug_in_dir_path == "":
106 global PATH_LIST
Patrick Williams20f38712022-12-08 06:18:26 -0600107 gp.print_error_report(
108 'Plug-in directory path "'
109 + plug_in_dir_path
110 + '" could not be found'
111 + " in any of the following directories:\n"
112 + gp.sprint_var(PATH_LIST)
113 )
Michael Walsh7423c012016-10-04 10:27:21 -0500114 exit(1)
115 # Make sure that this plug-in supports us...
116 supports_file_path = candidate_plug_in_dir_path + "supports_" + mch_class
117 if not os.path.exists(supports_file_path):
Patrick Williams20f38712022-12-08 06:18:26 -0600118 gp.print_error_report(
119 "The following file path could not be"
120 + " found:\n"
121 + gp.sprint_varx("supports_file_path", supports_file_path)
122 + "\nThis file is necessary to indicate that"
123 + " the given plug-in supports the class of"
124 + ' machine we are testing, namely "'
125 + mch_class
126 + '".\n'
127 )
Michael Walsh7423c012016-10-04 10:27:21 -0500128 exit(1)
129
130 return candidate_plug_in_dir_path
131
Michael Walsh7423c012016-10-04 10:27:21 -0500132
Michael Walsh7423c012016-10-04 10:27:21 -0500133def return_integrated_plug_ins(mch_class="obmc"):
Michael Walsh7423c012016-10-04 10:27:21 -0500134 r"""
Michael Walsh410b1782019-10-22 15:56:18 -0500135 Return a list of integrated plug-ins. Integrated plug-ins are plug-ins which are selected without regard
136 for whether the user has specified them. In other words, they are "integrated" into the program suite.
137 The programmer designates a plug-in as integrated by putting a file named "integrated" into the plug-in
138 package directory.
Michael Walsh7423c012016-10-04 10:27:21 -0500139
140 Description of arguments:
Michael Walsh410b1782019-10-22 15:56:18 -0500141 mch_class The class of machine that we are testing (e.g. "op" = "open power",
142 "obmc" = "open bmc", etc).
Michael Walsh7423c012016-10-04 10:27:21 -0500143 """
144
145 global plug_in_base_path_list
146
147 integrated_plug_ins_list = []
148
Patrick Williams20f38712022-12-08 06:18:26 -0600149 DEBUG_SKIP_INTEGRATED = int(os.getenv("DEBUG_SKIP_INTEGRATED", "0"))
Michael Walsh6cd9cbe2017-06-30 16:59:36 -0500150
151 if DEBUG_SKIP_INTEGRATED:
152 return integrated_plug_ins_list
153
Michael Walsh7423c012016-10-04 10:27:21 -0500154 for plug_in_base_path in plug_in_base_path_list:
155 # Get a list of all plug-in paths that support our mch_class.
Patrick Williams20f38712022-12-08 06:18:26 -0600156 mch_class_candidate_list = glob.glob(
157 plug_in_base_path + "*/supports_" + mch_class
158 )
Michael Walsh7423c012016-10-04 10:27:21 -0500159 for candidate_path in mch_class_candidate_list:
Patrick Williams20f38712022-12-08 06:18:26 -0600160 integrated_plug_in_dir_path = (
161 os.path.dirname(candidate_path) + os.sep
162 )
Michael Walsh7423c012016-10-04 10:27:21 -0500163 integrated_file_path = integrated_plug_in_dir_path + "integrated"
164 if os.path.exists(integrated_file_path):
Patrick Williams20f38712022-12-08 06:18:26 -0600165 plug_in_name = os.path.basename(
166 os.path.dirname(candidate_path)
167 )
Michael Walsh7423c012016-10-04 10:27:21 -0500168 if plug_in_name not in integrated_plug_ins_list:
169 # If this plug-in has not already been added to the list...
170 integrated_plug_ins_list.append(plug_in_name)
171
172 return integrated_plug_ins_list
173
Michael Walsh7423c012016-10-04 10:27:21 -0500174
Patrick Williams20f38712022-12-08 06:18:26 -0600175def return_plug_in_packages_list(plug_in_dir_paths, mch_class="obmc"):
Michael Walsh7423c012016-10-04 10:27:21 -0500176 r"""
Michael Walsh410b1782019-10-22 15:56:18 -0500177 Return a list of plug-in packages given the plug_in_dir_paths string. This function calls
178 validate_plug_in_package so it will fail if plug_in_dir_paths contains any invalid plug-ins.
Michael Walsh7423c012016-10-04 10:27:21 -0500179
180 Description of arguments:
Michael Walsh410b1782019-10-22 15:56:18 -0500181 plug_in_dir_path The "relative" or absolute path to a plug in package directory.
182 mch_class The class of machine that we are testing (e.g. "op" = "open power",
183 "obmc" = "open bmc", etc).
Michael Walsh7423c012016-10-04 10:27:21 -0500184 """
185
186 if plug_in_dir_paths != "":
187 plug_in_packages_list = plug_in_dir_paths.split(":")
188 else:
189 plug_in_packages_list = []
190
191 # Get a list of integrated plug-ins (w/o full path names).
192 integrated_plug_ins_list = return_integrated_plug_ins(mch_class)
Michael Walsh410b1782019-10-22 15:56:18 -0500193 # Put both lists together in plug_in_packages_list with no duplicates. NOTE: This won't catch
194 # duplicates if the caller specifies the full path name of a native plug-in but that should be rare
195 # enough.
Michael Walsh7423c012016-10-04 10:27:21 -0500196
197 plug_in_packages_list = plug_in_packages_list + integrated_plug_ins_list
198
Patrick Williams20f38712022-12-08 06:18:26 -0600199 plug_in_packages_list = list(
200 set(
201 [
202 validate_plug_in_package(path, mch_class)
203 for path in plug_in_packages_list
204 ]
205 )
206 )
Michael Walsh7423c012016-10-04 10:27:21 -0500207
208 return plug_in_packages_list