3 # This file is the main entry for UPT
5 # Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>
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
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.
22 from Core
import FileHook
25 from sys
import platform
27 from optparse
import OptionParser
28 from traceback
import format_exc
29 from platform
import python_version
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
47 from Library
.Misc
import GetWorkspace
48 from Library
import GlobalData
49 from Core
.IpiDb
import IpiDatabase
50 from BuildVersion
import gBUILD_VERSION
53 # Version and Copyright
55 #VersionNumber = "1.0"
56 #__version__ = "Revision " + VersionNumber
57 #__copyright__ = "Copyright (c) 2011 Intel Corporation All Rights Reserved."
59 ## CheckConflictOption
63 def CheckConflictOption(Opt
):
64 if (Opt
.PackFileToCreate
or Opt
.PackFileToInstall
or Opt
.PackFileToRemove
or Opt
.PackFileToReplace
) \
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
)
78 if Opt
.CustomPath
and Opt
.UseGuidedPkgPath
:
79 Logger
.Warn("UPT", ST
.WARN_CUSTOMPATH_OVERRIDE_USEGUIDEDPATH
)
80 Opt
.UseGuidedPkgPath
= False
86 Logger
.SetLevel(Logger
.VERBOSE
)
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
)
94 Logger
.SetLevel(Opt
.debug_level
+ 1)
96 Logger
.SetLevel(Logger
.SILENT
)
98 Logger
.SetLevel(Logger
.INFO
)
107 Parser
= OptionParser(version
=(MSG_VERSION
+ ' ' + gBUILD_VERSION
), description
=MSG_DESCRIPTION
,
108 prog
="UPT.exe", usage
=MSG_USAGE
)
110 Parser
.add_option("-d", "--debug", action
="store", type="int", dest
="debug_level", help=ST
.HLP_PRINT_DEBUG_INFO
)
112 Parser
.add_option("-v", "--verbose", action
="store_true", dest
="opt_verbose",
113 help=ST
.HLP_PRINT_INFORMATIONAL_STATEMENT
)
115 Parser
.add_option("-s", "--silent", action
="store_true", dest
="opt_slient", help=ST
.HLP_RETURN_NO_DISPLAY
)
117 Parser
.add_option("-q", "--quiet", action
="store_true", dest
="opt_quiet", help=ST
.HLP_RETURN_AND_DISPLAY
)
119 Parser
.add_option("-i", "--install", action
="store", type="string", dest
="Install_Distribution_Package_File",
120 help=ST
.HLP_SPECIFY_PACKAGE_NAME_INSTALL
)
122 Parser
.add_option("-c", "--create", action
="store", type="string", dest
="Create_Distribution_Package_File",
123 help=ST
.HLP_SPECIFY_PACKAGE_NAME_CREATE
)
125 Parser
.add_option("-r", "--remove", action
="store", type="string", dest
="Remove_Distribution_Package_File",
126 help=ST
.HLP_SPECIFY_PACKAGE_NAME_REMOVE
)
128 Parser
.add_option("-t", "--template", action
="store", type="string", dest
="Package_Information_Data_File",
129 help=ST
.HLP_SPECIFY_TEMPLATE_NAME_CREATE
)
131 Parser
.add_option("-p", "--dec-filename", action
="append", type="string", dest
="EDK2_DEC_Filename",
132 help=ST
.HLP_SPECIFY_DEC_NAME_CREATE
)
134 Parser
.add_option("-m", "--inf-filename", action
="append", type="string", dest
="EDK2_INF_Filename",
135 help=ST
.HLP_SPECIFY_INF_NAME_CREATE
)
137 Parser
.add_option("-l", "--list", action
="store_true", dest
="List_Dist_Installed",
138 help=ST
.HLP_LIST_DIST_INSTALLED
)
140 Parser
.add_option("-f", "--force", action
="store_true", dest
="Yes", help=ST
.HLP_DISABLE_PROMPT
)
142 Parser
.add_option("-n", "--custom-path", action
="store_true", dest
="CustomPath", help=ST
.HLP_CUSTOM_PATH_PROMPT
)
144 Parser
.add_option("-x", "--free-lock", action
="store_true", dest
="SkipLock", help=ST
.HLP_SKIP_LOCK_CHECK
)
146 Parser
.add_option("-u", "--replace", action
="store", type="string", dest
="Replace_Distribution_Package_File",
147 help=ST
.HLP_SPECIFY_PACKAGE_NAME_REPLACE
)
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
)
152 Parser
.add_option("--use-guided-paths", action
="store_true", dest
="Use_Guided_Paths", help=ST
.HLP_USE_GUIDED_PATHS
)
154 Opt
= Parser
.parse_args()[0]
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
),
170 setattr(Opt
, Var
[0], Var
[1])
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]
179 # Start *********************************************
180 # Support WORKSPACE is a long path
181 # Only work well on windows
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 ***********************************************
189 WorkspaceDir
= GlobalData
.gWORKSPACE
193 Mgr
= FileHook
.RecoverMgr(WorkspaceDir
)
194 FileHook
.SetRecoverMgr(Mgr
)
196 GlobalData
.gDB
= IpiDatabase(os
.path
.normpath(os
.path
.join(WorkspaceDir
, \
197 "Conf/DistributionPackageDatabase.db")), WorkspaceDir
)
198 GlobalData
.gDB
.InitDatabase(Opt
.SkipLock
)
201 # Make sure the Db will get closed correctly
205 CheckConflictOption(Opt
)
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
)
214 Opt
.PackageInformationDataFile
= os
.path
.join(WorkspaceDir
, Opt
.PackageInformationDataFile
)
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
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
)
225 AbsPath
= GetFullPathDist(Opt
.PackFileToInstall
, WorkspaceDir
)
227 Logger
.Error("InstallPkg", FILE_NOT_FOUND
, ST
.ERR_INSTALL_DIST_NOT_FOUND
% Opt
.PackFileToInstall
)
229 Opt
.PackFileToInstall
= AbsPath
230 setattr(Opt
, 'PackageFile', Opt
.PackFileToInstall
)
231 RunModule
= InstallPkg
.Main
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
)
238 Logger
.Error("RemovePkg",
240 ExtraData
=ST
.ERR_DIST_FILENAME_ONLY_FOR_REMOVE
% Opt
.PackFileToRemove
)
242 setattr(Opt
, 'DistributionFile', Opt
.PackFileToRemove
)
243 RunModule
= RmPkg
.Main
244 elif Opt
.InventoryWs
:
245 RunModule
= InventoryWs
.Main
247 elif Opt
.PackFileToBeReplaced
and not Opt
.PackFileToReplace
:
248 Logger
.Error("ReplacePkg", OPTION_MISSING
, ExtraData
=ST
.ERR_REQUIRE_U_OPTION
)
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",
258 ExtraData
=ST
.ERR_DIST_EXT_ERROR
% Opt
.PackFileToBeReplaced
)
260 head
, tail
= os
.path
.split(Opt
.PackFileToBeReplaced
)
262 Logger
.Error("ReplacePkg",
264 ExtraData
=ST
.ERR_DIST_FILENAME_ONLY_FOR_REPLACE_ORIG
% Opt
.PackFileToBeReplaced
)
266 AbsPath
= GetFullPathDist(Opt
.PackFileToReplace
, WorkspaceDir
)
268 Logger
.Error("ReplacePkg", FILE_NOT_FOUND
, ST
.ERR_REPLACE_DIST_NOT_FOUND
% Opt
.PackFileToReplace
)
270 Opt
.PackFileToReplace
= AbsPath
271 RunModule
= ReplacePkg
.Main
275 return OPTION_MISSING
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
) + \
286 Logger
.Quiet(ST
.MSG_RECOVER_START
)
287 GlobalData
.gDB
.RollBack()
289 Logger
.Quiet(ST
.MSG_RECOVER_DONE
)
291 GlobalData
.gDB
.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')
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
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
310 def GetFullPathDist(DistFile
, WorkspaceDir
):
311 if os
.path
.isabs(DistFile
):
312 if not (os
.path
.exists(DistFile
) and os
.path
.isfile(DistFile
)):
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
)):
325 if __name__
== '__main__':
328 # 0-127 is a safe return range, and 1 is a standard default error
330 if RETVAL
< 0 or RETVAL
> 127: