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