]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/UPT.py
This patch is going to:
[mirror_edk2.git] / BaseTools / Source / Python / UPT / UPT.py
CommitLineData
4234283c
LG
1## @file\r
2#\r
3# This file is the main entry for UPT \r
4#\r
421ccda3 5# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
4234283c
LG
6#\r
7# This program and the accompanying materials are licensed and made available \r
8# under the terms and conditions of the BSD License which accompanies this \r
9# distribution. The full text of the license may be found at \r
10# http://opensource.org/licenses/bsd-license.php\r
11#\r
12# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14#\r
15\r
16'''\r
17UPT\r
18'''\r
19\r
20## import modules\r
21#\r
421ccda3 22from Core import FileHook\r
4234283c
LG
23import sys\r
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
421ccda3 41\r
4234283c
LG
42import MkPkg\r
43import InstallPkg\r
44import RmPkg\r
421ccda3
HC
45import InventoryWs\r
46import ReplacePkg\r
47from Library.Misc import GetWorkspace\r
4234283c
LG
48from Library import GlobalData\r
49from Core.IpiDb import IpiDatabase\r
2bcc713e 50from BuildVersion import gBUILD_VERSION\r
4234283c
LG
51\r
52##\r
53# Version and Copyright\r
54#\r
55#VersionNumber = "1.0"\r
56#__version__ = "Revision " + VersionNumber\r
57#__copyright__ = "Copyright (c) 2011 Intel Corporation All Rights Reserved."\r
58\r
59## CheckConflictOption\r
60#\r
61# CheckConflictOption\r
62#\r
63def CheckConflictOption(Opt):\r
421ccda3
HC
64 if (Opt.PackFileToCreate or Opt.PackFileToInstall or Opt.PackFileToRemove or Opt.PackFileToReplace) \\r
65 and Opt.InventoryWs:\r
66 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_L_OA_EXCLUSIVE)\r
67 elif Opt.PackFileToReplace and (Opt.PackFileToCreate or Opt.PackFileToInstall or Opt.PackFileToRemove):\r
68 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_U_ICR_EXCLUSIVE)\r
69 elif (Opt.PackFileToCreate and Opt.PackFileToInstall and Opt.PackFileToRemove):\r
4234283c
LG
70 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_REQUIRE_I_C_R_OPTION)\r
71 elif Opt.PackFileToCreate and Opt.PackFileToInstall:\r
72 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_I_C_EXCLUSIVE)\r
73 elif Opt.PackFileToInstall and Opt.PackFileToRemove:\r
74 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_I_R_EXCLUSIVE)\r
75 elif Opt.PackFileToCreate and Opt.PackFileToRemove:\r
76 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_C_R_EXCLUSIVE)\r
77\r
421ccda3
HC
78 if Opt.CustomPath and Opt.UseGuidedPkgPath:\r
79 Logger.Warn("UPT", ST.WARN_CUSTOMPATH_OVERRIDE_USEGUIDEDPATH)\r
80 Opt.UseGuidedPkgPath = False\r
81\r
4234283c
LG
82## SetLogLevel\r
83#\r
84def SetLogLevel(Opt):\r
85 if Opt.opt_verbose:\r
86 Logger.SetLevel(Logger.VERBOSE)\r
87 elif Opt.opt_quiet:\r
88 Logger.SetLevel(Logger.QUIET + 1)\r
89 elif Opt.debug_level != None:\r
90 if Opt.debug_level < 0 or Opt.debug_level > 9:\r
91 Logger.Warn("UPT", ST.ERR_DEBUG_LEVEL)\r
92 Logger.SetLevel(Logger.INFO)\r
93 else:\r
94 Logger.SetLevel(Opt.debug_level + 1)\r
95 elif Opt.opt_slient:\r
96 Logger.SetLevel(Logger.SILENT)\r
97 else:\r
98 Logger.SetLevel(Logger.INFO)\r
99\r
100## Main\r
101#\r
102# Main\r
103#\r
104def Main():\r
105 Logger.Initialize()\r
106\r
b36d134f 107 Parser = OptionParser(version=(MSG_VERSION + ' ' + gBUILD_VERSION), description=MSG_DESCRIPTION,\r
4234283c
LG
108 prog="UPT.exe", usage=MSG_USAGE)\r
109\r
110 Parser.add_option("-d", "--debug", action="store", type="int", dest="debug_level", help=ST.HLP_PRINT_DEBUG_INFO)\r
111\r
112 Parser.add_option("-v", "--verbose", action="store_true", dest="opt_verbose",\r
113 help=ST.HLP_PRINT_INFORMATIONAL_STATEMENT)\r
114\r
115 Parser.add_option("-s", "--silent", action="store_true", dest="opt_slient", help=ST.HLP_RETURN_NO_DISPLAY)\r
116\r
117 Parser.add_option("-q", "--quiet", action="store_true", dest="opt_quiet", help=ST.HLP_RETURN_AND_DISPLAY)\r
118\r
119 Parser.add_option("-i", "--install", action="store", type="string", dest="Install_Distribution_Package_File",\r
120 help=ST.HLP_SPECIFY_PACKAGE_NAME_INSTALL)\r
121\r
122 Parser.add_option("-c", "--create", action="store", type="string", dest="Create_Distribution_Package_File",\r
123 help=ST.HLP_SPECIFY_PACKAGE_NAME_CREATE)\r
124\r
125 Parser.add_option("-r", "--remove", action="store", type="string", dest="Remove_Distribution_Package_File",\r
126 help=ST.HLP_SPECIFY_PACKAGE_NAME_REMOVE)\r
127\r
128 Parser.add_option("-t", "--template", action="store", type="string", dest="Package_Information_Data_File",\r
129 help=ST.HLP_SPECIFY_TEMPLATE_NAME_CREATE)\r
130\r
131 Parser.add_option("-p", "--dec-filename", action="append", type="string", dest="EDK2_DEC_Filename",\r
132 help=ST.HLP_SPECIFY_DEC_NAME_CREATE)\r
133\r
134 Parser.add_option("-m", "--inf-filename", action="append", type="string", dest="EDK2_INF_Filename",\r
135 help=ST.HLP_SPECIFY_INF_NAME_CREATE)\r
136\r
421ccda3
HC
137 Parser.add_option("-l", "--list", action="store_true", dest="List_Dist_Installed",\r
138 help=ST.HLP_LIST_DIST_INSTALLED)\r
139\r
4234283c
LG
140 Parser.add_option("-f", "--force", action="store_true", dest="Yes", help=ST.HLP_DISABLE_PROMPT)\r
141\r
142 Parser.add_option("-n", "--custom-path", action="store_true", dest="CustomPath", help=ST.HLP_CUSTOM_PATH_PROMPT)\r
143\r
144 Parser.add_option("-x", "--free-lock", action="store_true", dest="SkipLock", help=ST.HLP_SKIP_LOCK_CHECK)\r
145\r
421ccda3
HC
146 Parser.add_option("-u", "--replace", action="store", type="string", dest="Replace_Distribution_Package_File",\r
147 help=ST.HLP_SPECIFY_PACKAGE_NAME_REPLACE)\r
148\r
149 Parser.add_option("-o", "--original", action="store", type="string", dest="Original_Distribution_Package_File",\r
150 help=ST.HLP_SPECIFY_PACKAGE_NAME_TO_BE_REPLACED)\r
151\r
152 Parser.add_option("--use-guided-paths", action="store_true", dest="Use_Guided_Paths", help=ST.HLP_USE_GUIDED_PATHS)\r
153\r
4234283c
LG
154 Opt = Parser.parse_args()[0]\r
155\r
156 Var2Var = [\r
157 ("PackageInformationDataFile", Opt.Package_Information_Data_File),\r
158 ("PackFileToInstall", Opt.Install_Distribution_Package_File),\r
159 ("PackFileToCreate", Opt.Create_Distribution_Package_File),\r
160 ("PackFileToRemove", Opt.Remove_Distribution_Package_File),\r
161 ("PackageFileList", Opt.EDK2_DEC_Filename),\r
421ccda3
HC
162 ("ModuleFileList", Opt.EDK2_INF_Filename),\r
163 ("InventoryWs", Opt.List_Dist_Installed),\r
164 ("PackFileToReplace", Opt.Replace_Distribution_Package_File),\r
165 ("PackFileToBeReplaced", Opt.Original_Distribution_Package_File),\r
166 ("UseGuidedPkgPath", Opt.Use_Guided_Paths),\r
4234283c 167 ]\r
421ccda3 168\r
4234283c
LG
169 for Var in Var2Var:\r
170 setattr(Opt, Var[0], Var[1])\r
171\r
172 try:\r
421ccda3 173 GlobalData.gWORKSPACE = GetWorkspace()\r
4234283c
LG
174 except FatalError, XExcept:\r
175 if Logger.GetLevel() <= Logger.DEBUG_9:\r
176 Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + format_exc())\r
177 return XExcept.args[0]\r
178\r
421ccda3
HC
179 # Start *********************************************\r
180 # Support WORKSPACE is a long path\r
181 # Only work well on windows\r
182 # Linux Solution TBD\r
183 if pf.system() == 'Windows':\r
184 os.system('@echo off\nsubst b: /D')\r
185 os.system('subst b: "%s"' % GlobalData.gWORKSPACE)\r
186 GlobalData.gWORKSPACE = 'B:\\'\r
187 # End ***********************************************\r
188\r
4234283c
LG
189 WorkspaceDir = GlobalData.gWORKSPACE\r
190\r
191 SetLogLevel(Opt)\r
192\r
421ccda3
HC
193 Mgr = FileHook.RecoverMgr(WorkspaceDir)\r
194 FileHook.SetRecoverMgr(Mgr)\r
195\r
196 GlobalData.gDB = IpiDatabase(os.path.normpath(os.path.join(WorkspaceDir, \\r
197 "Conf/DistributionPackageDatabase.db")), WorkspaceDir)\r
4234283c
LG
198 GlobalData.gDB.InitDatabase(Opt.SkipLock)\r
199\r
200 #\r
201 # Make sure the Db will get closed correctly\r
202 #\r
203 try:\r
204 ReturnCode = 0\r
205 CheckConflictOption(Opt)\r
206\r
207 RunModule = None\r
208 if Opt.PackFileToCreate:\r
209 if Opt.PackageInformationDataFile:\r
210 if not os.path.exists(Opt.PackageInformationDataFile):\r
211 if not os.path.exists(os.path.join(WorkspaceDir, Opt.PackageInformationDataFile)):\r
212 Logger.Error("\nUPT", FILE_NOT_FOUND, ST.ERR_NO_TEMPLATE_FILE % Opt.PackageInformationDataFile)\r
213 else:\r
214 Opt.PackageInformationDataFile = os.path.join(WorkspaceDir, Opt.PackageInformationDataFile)\r
215 else:\r
216 Logger.Error("UPT", OPTION_MISSING, ExtraData=ST.ERR_REQUIRE_T_OPTION)\r
217 if not Opt.PackFileToCreate.endswith('.dist'):\r
218 Logger.Error("CreatePkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToCreate)\r
219 RunModule = MkPkg.Main\r
220\r
221 elif Opt.PackFileToInstall:\r
222 if not Opt.PackFileToInstall.endswith('.dist'):\r
223 Logger.Error("InstallPkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToInstall)\r
421ccda3
HC
224\r
225 AbsPath = GetFullPathDist(Opt.PackFileToInstall, WorkspaceDir)\r
226 if not AbsPath:\r
4234283c
LG
227 Logger.Error("InstallPkg", FILE_NOT_FOUND, ST.ERR_INSTALL_DIST_NOT_FOUND % Opt.PackFileToInstall)\r
228\r
421ccda3 229 Opt.PackFileToInstall = AbsPath\r
4234283c
LG
230 setattr(Opt, 'PackageFile', Opt.PackFileToInstall)\r
231 RunModule = InstallPkg.Main\r
232\r
233 elif Opt.PackFileToRemove:\r
234 if not Opt.PackFileToRemove.endswith('.dist'):\r
235 Logger.Error("RemovePkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToRemove)\r
236 head, tail = os.path.split(Opt.PackFileToRemove)\r
237 if head or not tail:\r
238 Logger.Error("RemovePkg",\r
239 FILE_TYPE_MISMATCH,\r
240 ExtraData=ST.ERR_DIST_FILENAME_ONLY_FOR_REMOVE % Opt.PackFileToRemove)\r
241\r
242 setattr(Opt, 'DistributionFile', Opt.PackFileToRemove)\r
243 RunModule = RmPkg.Main\r
421ccda3
HC
244 elif Opt.InventoryWs:\r
245 RunModule = InventoryWs.Main\r
246\r
247 elif Opt.PackFileToBeReplaced and not Opt.PackFileToReplace:\r
248 Logger.Error("ReplacePkg", OPTION_MISSING, ExtraData=ST.ERR_REQUIRE_U_OPTION)\r
249\r
250 elif Opt.PackFileToReplace:\r
251 if not Opt.PackFileToReplace.endswith('.dist'):\r
252 Logger.Error("ReplacePkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToReplace)\r
253 if not Opt.PackFileToBeReplaced:\r
254 Logger.Error("ReplacePkg", OPTION_MISSING, ExtraData=ST.ERR_REQUIRE_O_OPTION)\r
255 if not Opt.PackFileToBeReplaced.endswith('.dist'):\r
256 Logger.Error("ReplacePkg",\r
257 FILE_TYPE_MISMATCH,\r
258 ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToBeReplaced)\r
259\r
260 head, tail = os.path.split(Opt.PackFileToBeReplaced)\r
261 if head or not tail:\r
262 Logger.Error("ReplacePkg",\r
263 FILE_TYPE_MISMATCH,\r
264 ExtraData=ST.ERR_DIST_FILENAME_ONLY_FOR_REPLACE_ORIG % Opt.PackFileToBeReplaced)\r
265\r
266 AbsPath = GetFullPathDist(Opt.PackFileToReplace, WorkspaceDir)\r
267 if not AbsPath:\r
268 Logger.Error("ReplacePkg", FILE_NOT_FOUND, ST.ERR_REPLACE_DIST_NOT_FOUND % Opt.PackFileToReplace)\r
269\r
270 Opt.PackFileToReplace = AbsPath\r
271 RunModule = ReplacePkg.Main\r
272\r
4234283c
LG
273 else:\r
274 Parser.print_usage()\r
275 return OPTION_MISSING\r
276\r
277 ReturnCode = RunModule(Opt)\r
278 except FatalError, XExcept:\r
279 ReturnCode = XExcept.args[0]\r
280 if Logger.GetLevel() <= Logger.DEBUG_9:\r
281 Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + \\r
282 format_exc())\r
283 finally:\r
421ccda3
HC
284 try:\r
285 if ReturnCode != 0:\r
286 Logger.Quiet(ST.MSG_RECOVER_START)\r
287 GlobalData.gDB.RollBack()\r
288 Mgr.rollback()\r
289 Logger.Quiet(ST.MSG_RECOVER_DONE)\r
290 else:\r
291 GlobalData.gDB.Commit()\r
292 Mgr.commit()\r
293 except StandardError:\r
294 Logger.Quiet(ST.MSG_RECOVER_FAIL)\r
4234283c 295 GlobalData.gDB.CloseDb()\r
421ccda3
HC
296 if pf.system() == 'Windows':\r
297 os.system('subst b: /D')\r
4234283c
LG
298\r
299 return ReturnCode\r
300\r
421ccda3
HC
301## GetFullPathDist\r
302#\r
303# This function will check DistFile existence, if not absolute path, then try current working directory,\r
304# then $(WORKSPACE),and return the AbsPath. If file doesn't find, then return None\r
305#\r
306# @param DistFile: The distribution file in either relative path or absolute path\r
307# @param WorkspaceDir: Workspace Directory\r
308# @return AbsPath: The Absolute path of the distribution file if existed, None else\r
309#\r
310def GetFullPathDist(DistFile, WorkspaceDir):\r
311 if os.path.isabs(DistFile):\r
312 if not (os.path.exists(DistFile) and os.path.isfile(DistFile)):\r
313 return None\r
314 else:\r
315 return DistFile\r
316 else:\r
317 AbsPath = os.path.normpath(os.path.join(os.getcwd(), DistFile))\r
318 if not (os.path.exists(AbsPath) and os.path.isfile(AbsPath)):\r
319 AbsPath = os.path.normpath(os.path.join(WorkspaceDir, DistFile))\r
320 if not (os.path.exists(AbsPath) and os.path.isfile(AbsPath)):\r
321 return None\r
322\r
323 return AbsPath\r
324\r
4234283c
LG
325if __name__ == '__main__':\r
326 RETVAL = Main()\r
327 #\r
328 # 0-127 is a safe return range, and 1 is a standard default error\r
329 #\r
330 if RETVAL < 0 or RETVAL > 127:\r
331 RETVAL = 1\r
332 sys.exit(RETVAL)\r