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