]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/UPT.py
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / BaseTools / Source / Python / UPT / UPT.py
CommitLineData
4234283c
LG
1## @file\r
2#\r
f7496d71 3# This file is the main entry for UPT\r
4234283c 4#\r
f7496d71 5# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
4234283c 6#\r
2e351cbe 7# SPDX-License-Identifier: BSD-2-Clause-Patent\r
4234283c
LG
8#\r
9\r
10'''\r
11UPT\r
12'''\r
13\r
14## import modules\r
15#\r
09e27ac5 16import locale\r
4234283c 17import sys\r
174a9d3c 18from imp import reload\r
1ccc4d89
LG
19encoding = locale.getdefaultlocale()[1]\r
20if encoding:\r
21 reload(sys)\r
22 sys.setdefaultencoding(encoding)\r
09e27ac5 23from Core import FileHook\r
4234283c 24import os.path\r
4234283c 25from sys import platform\r
421ccda3 26import platform as pf\r
4234283c
LG
27from optparse import OptionParser\r
28from traceback import format_exc\r
29from platform import python_version\r
30\r
31from Logger import StringTable as ST\r
32import Logger.Log as Logger\r
33from Logger.StringTable import MSG_VERSION\r
34from Logger.StringTable import MSG_DESCRIPTION\r
35from Logger.StringTable import MSG_USAGE\r
36from Logger.ToolError import FILE_NOT_FOUND\r
37from Logger.ToolError import OPTION_MISSING\r
38from Logger.ToolError import FILE_TYPE_MISMATCH\r
39from Logger.ToolError import OPTION_CONFLICT\r
40from Logger.ToolError import FatalError\r
af0c61ae 41from Logger.ToolError import UPT_ALREADY_INSTALLED_ERROR\r
fb0f8067 42from Common.MultipleWorkspace import MultipleWorkspace as mws\r
421ccda3 43\r
4234283c
LG
44import MkPkg\r
45import InstallPkg\r
46import RmPkg\r
421ccda3
HC
47import InventoryWs\r
48import ReplacePkg\r
6cf99034 49import TestInstall\r
421ccda3 50from Library.Misc import GetWorkspace\r
4234283c
LG
51from Library import GlobalData\r
52from Core.IpiDb import IpiDatabase\r
2bcc713e 53from BuildVersion import gBUILD_VERSION\r
4234283c 54\r
4234283c
LG
55## CheckConflictOption\r
56#\r
57# CheckConflictOption\r
58#\r
59def CheckConflictOption(Opt):\r
421ccda3
HC
60 if (Opt.PackFileToCreate or Opt.PackFileToInstall or Opt.PackFileToRemove or Opt.PackFileToReplace) \\r
61 and Opt.InventoryWs:\r
62 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_L_OA_EXCLUSIVE)\r
63 elif Opt.PackFileToReplace and (Opt.PackFileToCreate or Opt.PackFileToInstall or Opt.PackFileToRemove):\r
64 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_U_ICR_EXCLUSIVE)\r
65 elif (Opt.PackFileToCreate and Opt.PackFileToInstall and Opt.PackFileToRemove):\r
4234283c
LG
66 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_REQUIRE_I_C_R_OPTION)\r
67 elif Opt.PackFileToCreate and Opt.PackFileToInstall:\r
68 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_I_C_EXCLUSIVE)\r
69 elif Opt.PackFileToInstall and Opt.PackFileToRemove:\r
70 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_I_R_EXCLUSIVE)\r
71 elif Opt.PackFileToCreate and Opt.PackFileToRemove:\r
72 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_C_R_EXCLUSIVE)\r
6cf99034
HC
73 elif Opt.TestDistFiles and (Opt.PackFileToCreate or Opt.PackFileToInstall \\r
74 or Opt.PackFileToRemove or Opt.PackFileToReplace):\r
75 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_C_R_EXCLUSIVE)\r
4234283c 76\r
421ccda3
HC
77 if Opt.CustomPath and Opt.UseGuidedPkgPath:\r
78 Logger.Warn("UPT", ST.WARN_CUSTOMPATH_OVERRIDE_USEGUIDEDPATH)\r
79 Opt.UseGuidedPkgPath = False\r
80\r
4234283c
LG
81## SetLogLevel\r
82#\r
83def SetLogLevel(Opt):\r
84 if Opt.opt_verbose:\r
85 Logger.SetLevel(Logger.VERBOSE)\r
86 elif Opt.opt_quiet:\r
87 Logger.SetLevel(Logger.QUIET + 1)\r
4231a819 88 elif Opt.debug_level is not None:\r
4234283c
LG
89 if Opt.debug_level < 0 or Opt.debug_level > 9:\r
90 Logger.Warn("UPT", ST.ERR_DEBUG_LEVEL)\r
91 Logger.SetLevel(Logger.INFO)\r
92 else:\r
93 Logger.SetLevel(Opt.debug_level + 1)\r
94 elif Opt.opt_slient:\r
95 Logger.SetLevel(Logger.SILENT)\r
96 else:\r
97 Logger.SetLevel(Logger.INFO)\r
98\r
99## Main\r
100#\r
101# Main\r
102#\r
103def Main():\r
104 Logger.Initialize()\r
105\r
45258285 106 Parser = OptionParser(version=(MSG_VERSION + ' Build ' + gBUILD_VERSION), description=MSG_DESCRIPTION,\r
4234283c
LG
107 prog="UPT.exe", usage=MSG_USAGE)\r
108\r
109 Parser.add_option("-d", "--debug", action="store", type="int", dest="debug_level", help=ST.HLP_PRINT_DEBUG_INFO)\r
110\r
111 Parser.add_option("-v", "--verbose", action="store_true", dest="opt_verbose",\r
112 help=ST.HLP_PRINT_INFORMATIONAL_STATEMENT)\r
113\r
114 Parser.add_option("-s", "--silent", action="store_true", dest="opt_slient", help=ST.HLP_RETURN_NO_DISPLAY)\r
115\r
116 Parser.add_option("-q", "--quiet", action="store_true", dest="opt_quiet", help=ST.HLP_RETURN_AND_DISPLAY)\r
117\r
56636814 118 Parser.add_option("-i", "--install", action="append", type="string", dest="Install_Distribution_Package_File",\r
4234283c
LG
119 help=ST.HLP_SPECIFY_PACKAGE_NAME_INSTALL)\r
120\r
121 Parser.add_option("-c", "--create", action="store", type="string", dest="Create_Distribution_Package_File",\r
122 help=ST.HLP_SPECIFY_PACKAGE_NAME_CREATE)\r
123\r
124 Parser.add_option("-r", "--remove", action="store", type="string", dest="Remove_Distribution_Package_File",\r
125 help=ST.HLP_SPECIFY_PACKAGE_NAME_REMOVE)\r
126\r
127 Parser.add_option("-t", "--template", action="store", type="string", dest="Package_Information_Data_File",\r
128 help=ST.HLP_SPECIFY_TEMPLATE_NAME_CREATE)\r
129\r
130 Parser.add_option("-p", "--dec-filename", action="append", type="string", dest="EDK2_DEC_Filename",\r
131 help=ST.HLP_SPECIFY_DEC_NAME_CREATE)\r
132\r
133 Parser.add_option("-m", "--inf-filename", action="append", type="string", dest="EDK2_INF_Filename",\r
134 help=ST.HLP_SPECIFY_INF_NAME_CREATE)\r
135\r
421ccda3
HC
136 Parser.add_option("-l", "--list", action="store_true", dest="List_Dist_Installed",\r
137 help=ST.HLP_LIST_DIST_INSTALLED)\r
138\r
4234283c
LG
139 Parser.add_option("-f", "--force", action="store_true", dest="Yes", help=ST.HLP_DISABLE_PROMPT)\r
140\r
141 Parser.add_option("-n", "--custom-path", action="store_true", dest="CustomPath", help=ST.HLP_CUSTOM_PATH_PROMPT)\r
142\r
143 Parser.add_option("-x", "--free-lock", action="store_true", dest="SkipLock", help=ST.HLP_SKIP_LOCK_CHECK)\r
144\r
421ccda3
HC
145 Parser.add_option("-u", "--replace", action="store", type="string", dest="Replace_Distribution_Package_File",\r
146 help=ST.HLP_SPECIFY_PACKAGE_NAME_REPLACE)\r
147\r
148 Parser.add_option("-o", "--original", action="store", type="string", dest="Original_Distribution_Package_File",\r
149 help=ST.HLP_SPECIFY_PACKAGE_NAME_TO_BE_REPLACED)\r
150\r
151 Parser.add_option("--use-guided-paths", action="store_true", dest="Use_Guided_Paths", help=ST.HLP_USE_GUIDED_PATHS)\r
152\r
6cf99034
HC
153 Parser.add_option("-j", "--test-install", action="append", type="string",\r
154 dest="Test_Install_Distribution_Package_Files", help=ST.HLP_TEST_INSTALL)\r
155\r
4234283c
LG
156 Opt = Parser.parse_args()[0]\r
157\r
158 Var2Var = [\r
159 ("PackageInformationDataFile", Opt.Package_Information_Data_File),\r
160 ("PackFileToInstall", Opt.Install_Distribution_Package_File),\r
161 ("PackFileToCreate", Opt.Create_Distribution_Package_File),\r
162 ("PackFileToRemove", Opt.Remove_Distribution_Package_File),\r
163 ("PackageFileList", Opt.EDK2_DEC_Filename),\r
421ccda3
HC
164 ("ModuleFileList", Opt.EDK2_INF_Filename),\r
165 ("InventoryWs", Opt.List_Dist_Installed),\r
166 ("PackFileToReplace", Opt.Replace_Distribution_Package_File),\r
167 ("PackFileToBeReplaced", Opt.Original_Distribution_Package_File),\r
168 ("UseGuidedPkgPath", Opt.Use_Guided_Paths),\r
6cf99034 169 ("TestDistFiles", Opt.Test_Install_Distribution_Package_Files)\r
4234283c 170 ]\r
421ccda3 171\r
4234283c
LG
172 for Var in Var2Var:\r
173 setattr(Opt, Var[0], Var[1])\r
174\r
175 try:\r
fb0f8067 176 GlobalData.gWORKSPACE, GlobalData.gPACKAGE_PATH = GetWorkspace()\r
5b0671c1 177 except FatalError as XExcept:\r
4234283c
LG
178 if Logger.GetLevel() <= Logger.DEBUG_9:\r
179 Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + format_exc())\r
180 return XExcept.args[0]\r
181\r
421ccda3 182 # Support WORKSPACE is a long path\r
c03f5b2c 183 # Only works for windows system\r
421ccda3 184 if pf.system() == 'Windows':\r
c03f5b2c
HC
185 Vol = 'B:'\r
186 for Index in range(90, 65, -1):\r
187 Vol = chr(Index) + ':'\r
188 if not os.path.isdir(Vol):\r
189 os.system('subst %s "%s"' % (Vol, GlobalData.gWORKSPACE))\r
190 break\r
191 GlobalData.gWORKSPACE = '%s\\' % Vol\r
421ccda3 192\r
4234283c
LG
193 WorkspaceDir = GlobalData.gWORKSPACE\r
194\r
195 SetLogLevel(Opt)\r
196\r
421ccda3
HC
197 Mgr = FileHook.RecoverMgr(WorkspaceDir)\r
198 FileHook.SetRecoverMgr(Mgr)\r
199\r
200 GlobalData.gDB = IpiDatabase(os.path.normpath(os.path.join(WorkspaceDir, \\r
201 "Conf/DistributionPackageDatabase.db")), WorkspaceDir)\r
4234283c
LG
202 GlobalData.gDB.InitDatabase(Opt.SkipLock)\r
203\r
204 #\r
205 # Make sure the Db will get closed correctly\r
206 #\r
207 try:\r
208 ReturnCode = 0\r
209 CheckConflictOption(Opt)\r
210\r
211 RunModule = None\r
212 if Opt.PackFileToCreate:\r
213 if Opt.PackageInformationDataFile:\r
214 if not os.path.exists(Opt.PackageInformationDataFile):\r
215 if not os.path.exists(os.path.join(WorkspaceDir, Opt.PackageInformationDataFile)):\r
216 Logger.Error("\nUPT", FILE_NOT_FOUND, ST.ERR_NO_TEMPLATE_FILE % Opt.PackageInformationDataFile)\r
217 else:\r
218 Opt.PackageInformationDataFile = os.path.join(WorkspaceDir, Opt.PackageInformationDataFile)\r
219 else:\r
220 Logger.Error("UPT", OPTION_MISSING, ExtraData=ST.ERR_REQUIRE_T_OPTION)\r
221 if not Opt.PackFileToCreate.endswith('.dist'):\r
222 Logger.Error("CreatePkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToCreate)\r
223 RunModule = MkPkg.Main\r
224\r
225 elif Opt.PackFileToInstall:\r
56636814
HC
226 AbsPath = []\r
227 for Item in Opt.PackFileToInstall:\r
228 if not Item.endswith('.dist'):\r
229 Logger.Error("InstallPkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Item)\r
230\r
231 AbsPath.append(GetFullPathDist(Item, WorkspaceDir))\r
232 if not AbsPath:\r
233 Logger.Error("InstallPkg", FILE_NOT_FOUND, ST.ERR_INSTALL_DIST_NOT_FOUND % Item)\r
4234283c 234\r
421ccda3 235 Opt.PackFileToInstall = AbsPath\r
4234283c
LG
236 setattr(Opt, 'PackageFile', Opt.PackFileToInstall)\r
237 RunModule = InstallPkg.Main\r
238\r
239 elif Opt.PackFileToRemove:\r
240 if not Opt.PackFileToRemove.endswith('.dist'):\r
241 Logger.Error("RemovePkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToRemove)\r
242 head, tail = os.path.split(Opt.PackFileToRemove)\r
243 if head or not tail:\r
244 Logger.Error("RemovePkg",\r
245 FILE_TYPE_MISMATCH,\r
246 ExtraData=ST.ERR_DIST_FILENAME_ONLY_FOR_REMOVE % Opt.PackFileToRemove)\r
247\r
248 setattr(Opt, 'DistributionFile', Opt.PackFileToRemove)\r
249 RunModule = RmPkg.Main\r
421ccda3
HC
250 elif Opt.InventoryWs:\r
251 RunModule = InventoryWs.Main\r
252\r
253 elif Opt.PackFileToBeReplaced and not Opt.PackFileToReplace:\r
254 Logger.Error("ReplacePkg", OPTION_MISSING, ExtraData=ST.ERR_REQUIRE_U_OPTION)\r
255\r
256 elif Opt.PackFileToReplace:\r
257 if not Opt.PackFileToReplace.endswith('.dist'):\r
258 Logger.Error("ReplacePkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToReplace)\r
259 if not Opt.PackFileToBeReplaced:\r
260 Logger.Error("ReplacePkg", OPTION_MISSING, ExtraData=ST.ERR_REQUIRE_O_OPTION)\r
261 if not Opt.PackFileToBeReplaced.endswith('.dist'):\r
262 Logger.Error("ReplacePkg",\r
263 FILE_TYPE_MISMATCH,\r
264 ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToBeReplaced)\r
265\r
266 head, tail = os.path.split(Opt.PackFileToBeReplaced)\r
267 if head or not tail:\r
268 Logger.Error("ReplacePkg",\r
269 FILE_TYPE_MISMATCH,\r
270 ExtraData=ST.ERR_DIST_FILENAME_ONLY_FOR_REPLACE_ORIG % Opt.PackFileToBeReplaced)\r
271\r
272 AbsPath = GetFullPathDist(Opt.PackFileToReplace, WorkspaceDir)\r
273 if not AbsPath:\r
274 Logger.Error("ReplacePkg", FILE_NOT_FOUND, ST.ERR_REPLACE_DIST_NOT_FOUND % Opt.PackFileToReplace)\r
275\r
276 Opt.PackFileToReplace = AbsPath\r
277 RunModule = ReplacePkg.Main\r
278\r
6cf99034
HC
279 elif Opt.Test_Install_Distribution_Package_Files:\r
280 for Dist in Opt.Test_Install_Distribution_Package_Files:\r
281 if not Dist.endswith('.dist'):\r
282 Logger.Error("TestInstall", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Dist)\r
283\r
284 setattr(Opt, 'DistFiles', Opt.Test_Install_Distribution_Package_Files)\r
285 RunModule = TestInstall.Main\r
286\r
4234283c
LG
287 else:\r
288 Parser.print_usage()\r
289 return OPTION_MISSING\r
290\r
291 ReturnCode = RunModule(Opt)\r
5b0671c1 292 except FatalError as XExcept:\r
4234283c
LG
293 ReturnCode = XExcept.args[0]\r
294 if Logger.GetLevel() <= Logger.DEBUG_9:\r
295 Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + \\r
296 format_exc())\r
297 finally:\r
421ccda3 298 try:\r
af0c61ae 299 if ReturnCode != 0 and ReturnCode != UPT_ALREADY_INSTALLED_ERROR:\r
421ccda3
HC
300 Logger.Quiet(ST.MSG_RECOVER_START)\r
301 GlobalData.gDB.RollBack()\r
302 Mgr.rollback()\r
303 Logger.Quiet(ST.MSG_RECOVER_DONE)\r
304 else:\r
305 GlobalData.gDB.Commit()\r
306 Mgr.commit()\r
92beb1e4 307 except Exception:\r
421ccda3 308 Logger.Quiet(ST.MSG_RECOVER_FAIL)\r
4234283c 309 GlobalData.gDB.CloseDb()\r
c03f5b2c 310\r
421ccda3 311 if pf.system() == 'Windows':\r
ccaa7754 312 os.system('subst %s /D' % GlobalData.gWORKSPACE.replace('\\', ''))\r
4234283c
LG
313\r
314 return ReturnCode\r
315\r
421ccda3
HC
316## GetFullPathDist\r
317#\r
318# This function will check DistFile existence, if not absolute path, then try current working directory,\r
319# then $(WORKSPACE),and return the AbsPath. If file doesn't find, then return None\r
320#\r
321# @param DistFile: The distribution file in either relative path or absolute path\r
322# @param WorkspaceDir: Workspace Directory\r
323# @return AbsPath: The Absolute path of the distribution file if existed, None else\r
324#\r
325def GetFullPathDist(DistFile, WorkspaceDir):\r
326 if os.path.isabs(DistFile):\r
327 if not (os.path.exists(DistFile) and os.path.isfile(DistFile)):\r
328 return None\r
329 else:\r
330 return DistFile\r
331 else:\r
332 AbsPath = os.path.normpath(os.path.join(os.getcwd(), DistFile))\r
333 if not (os.path.exists(AbsPath) and os.path.isfile(AbsPath)):\r
334 AbsPath = os.path.normpath(os.path.join(WorkspaceDir, DistFile))\r
335 if not (os.path.exists(AbsPath) and os.path.isfile(AbsPath)):\r
336 return None\r
337\r
338 return AbsPath\r
339\r
4234283c
LG
340if __name__ == '__main__':\r
341 RETVAL = Main()\r
342 #\r
343 # 0-127 is a safe return range, and 1 is a standard default error\r
344 #\r
345 if RETVAL < 0 or RETVAL > 127:\r
346 RETVAL = 1\r
347 sys.exit(RETVAL)\r