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
41 from Logger
.ToolError
import UPT_ALREADY_INSTALLED_ERROR
48 from Library
.Misc
import GetWorkspace
49 from Library
import GlobalData
50 from Core
.IpiDb
import IpiDatabase
51 from BuildVersion
import gBUILD_VERSION
54 # Version and Copyright
56 #VersionNumber = "1.0"
57 #__version__ = "Revision " + VersionNumber
58 #__copyright__ = "Copyright (c) 2011 Intel Corporation All Rights Reserved."
60 ## CheckConflictOption
64 def CheckConflictOption(Opt
):
65 if (Opt
.PackFileToCreate
or Opt
.PackFileToInstall
or Opt
.PackFileToRemove
or Opt
.PackFileToReplace
) \
67 Logger
.Error("UPT", OPTION_CONFLICT
, ExtraData
=ST
.ERR_L_OA_EXCLUSIVE
)
68 elif Opt
.PackFileToReplace
and (Opt
.PackFileToCreate
or Opt
.PackFileToInstall
or Opt
.PackFileToRemove
):
69 Logger
.Error("UPT", OPTION_CONFLICT
, ExtraData
=ST
.ERR_U_ICR_EXCLUSIVE
)
70 elif (Opt
.PackFileToCreate
and Opt
.PackFileToInstall
and Opt
.PackFileToRemove
):
71 Logger
.Error("UPT", OPTION_CONFLICT
, ExtraData
=ST
.ERR_REQUIRE_I_C_R_OPTION
)
72 elif Opt
.PackFileToCreate
and Opt
.PackFileToInstall
:
73 Logger
.Error("UPT", OPTION_CONFLICT
, ExtraData
=ST
.ERR_I_C_EXCLUSIVE
)
74 elif Opt
.PackFileToInstall
and Opt
.PackFileToRemove
:
75 Logger
.Error("UPT", OPTION_CONFLICT
, ExtraData
=ST
.ERR_I_R_EXCLUSIVE
)
76 elif Opt
.PackFileToCreate
and Opt
.PackFileToRemove
:
77 Logger
.Error("UPT", OPTION_CONFLICT
, ExtraData
=ST
.ERR_C_R_EXCLUSIVE
)
79 if Opt
.CustomPath
and Opt
.UseGuidedPkgPath
:
80 Logger
.Warn("UPT", ST
.WARN_CUSTOMPATH_OVERRIDE_USEGUIDEDPATH
)
81 Opt
.UseGuidedPkgPath
= False
87 Logger
.SetLevel(Logger
.VERBOSE
)
89 Logger
.SetLevel(Logger
.QUIET
+ 1)
90 elif Opt
.debug_level
!= None:
91 if Opt
.debug_level
< 0 or Opt
.debug_level
> 9:
92 Logger
.Warn("UPT", ST
.ERR_DEBUG_LEVEL
)
93 Logger
.SetLevel(Logger
.INFO
)
95 Logger
.SetLevel(Opt
.debug_level
+ 1)
97 Logger
.SetLevel(Logger
.SILENT
)
99 Logger
.SetLevel(Logger
.INFO
)
108 Parser
= OptionParser(version
=(MSG_VERSION
+ ' ' + gBUILD_VERSION
), description
=MSG_DESCRIPTION
,
109 prog
="UPT.exe", usage
=MSG_USAGE
)
111 Parser
.add_option("-d", "--debug", action
="store", type="int", dest
="debug_level", help=ST
.HLP_PRINT_DEBUG_INFO
)
113 Parser
.add_option("-v", "--verbose", action
="store_true", dest
="opt_verbose",
114 help=ST
.HLP_PRINT_INFORMATIONAL_STATEMENT
)
116 Parser
.add_option("-s", "--silent", action
="store_true", dest
="opt_slient", help=ST
.HLP_RETURN_NO_DISPLAY
)
118 Parser
.add_option("-q", "--quiet", action
="store_true", dest
="opt_quiet", help=ST
.HLP_RETURN_AND_DISPLAY
)
120 Parser
.add_option("-i", "--install", action
="store", type="string", dest
="Install_Distribution_Package_File",
121 help=ST
.HLP_SPECIFY_PACKAGE_NAME_INSTALL
)
123 Parser
.add_option("-c", "--create", action
="store", type="string", dest
="Create_Distribution_Package_File",
124 help=ST
.HLP_SPECIFY_PACKAGE_NAME_CREATE
)
126 Parser
.add_option("-r", "--remove", action
="store", type="string", dest
="Remove_Distribution_Package_File",
127 help=ST
.HLP_SPECIFY_PACKAGE_NAME_REMOVE
)
129 Parser
.add_option("-t", "--template", action
="store", type="string", dest
="Package_Information_Data_File",
130 help=ST
.HLP_SPECIFY_TEMPLATE_NAME_CREATE
)
132 Parser
.add_option("-p", "--dec-filename", action
="append", type="string", dest
="EDK2_DEC_Filename",
133 help=ST
.HLP_SPECIFY_DEC_NAME_CREATE
)
135 Parser
.add_option("-m", "--inf-filename", action
="append", type="string", dest
="EDK2_INF_Filename",
136 help=ST
.HLP_SPECIFY_INF_NAME_CREATE
)
138 Parser
.add_option("-l", "--list", action
="store_true", dest
="List_Dist_Installed",
139 help=ST
.HLP_LIST_DIST_INSTALLED
)
141 Parser
.add_option("-f", "--force", action
="store_true", dest
="Yes", help=ST
.HLP_DISABLE_PROMPT
)
143 Parser
.add_option("-n", "--custom-path", action
="store_true", dest
="CustomPath", help=ST
.HLP_CUSTOM_PATH_PROMPT
)
145 Parser
.add_option("-x", "--free-lock", action
="store_true", dest
="SkipLock", help=ST
.HLP_SKIP_LOCK_CHECK
)
147 Parser
.add_option("-u", "--replace", action
="store", type="string", dest
="Replace_Distribution_Package_File",
148 help=ST
.HLP_SPECIFY_PACKAGE_NAME_REPLACE
)
150 Parser
.add_option("-o", "--original", action
="store", type="string", dest
="Original_Distribution_Package_File",
151 help=ST
.HLP_SPECIFY_PACKAGE_NAME_TO_BE_REPLACED
)
153 Parser
.add_option("--use-guided-paths", action
="store_true", dest
="Use_Guided_Paths", help=ST
.HLP_USE_GUIDED_PATHS
)
155 Opt
= Parser
.parse_args()[0]
158 ("PackageInformationDataFile", Opt
.Package_Information_Data_File
),
159 ("PackFileToInstall", Opt
.Install_Distribution_Package_File
),
160 ("PackFileToCreate", Opt
.Create_Distribution_Package_File
),
161 ("PackFileToRemove", Opt
.Remove_Distribution_Package_File
),
162 ("PackageFileList", Opt
.EDK2_DEC_Filename
),
163 ("ModuleFileList", Opt
.EDK2_INF_Filename
),
164 ("InventoryWs", Opt
.List_Dist_Installed
),
165 ("PackFileToReplace", Opt
.Replace_Distribution_Package_File
),
166 ("PackFileToBeReplaced", Opt
.Original_Distribution_Package_File
),
167 ("UseGuidedPkgPath", Opt
.Use_Guided_Paths
),
171 setattr(Opt
, Var
[0], Var
[1])
174 GlobalData
.gWORKSPACE
= GetWorkspace()
175 except FatalError
, XExcept
:
176 if Logger
.GetLevel() <= Logger
.DEBUG_9
:
177 Logger
.Quiet(ST
.MSG_PYTHON_ON
% (python_version(), platform
) + format_exc())
178 return XExcept
.args
[0]
180 # Start *********************************************
181 # Support WORKSPACE is a long path
182 # Only work well on windows
184 if pf
.system() == 'Windows':
185 os
.system('@echo off\nsubst b: /D')
186 os
.system('subst b: "%s"' % GlobalData
.gWORKSPACE
)
187 GlobalData
.gWORKSPACE
= 'B:\\'
188 # End ***********************************************
190 WorkspaceDir
= GlobalData
.gWORKSPACE
194 Mgr
= FileHook
.RecoverMgr(WorkspaceDir
)
195 FileHook
.SetRecoverMgr(Mgr
)
197 GlobalData
.gDB
= IpiDatabase(os
.path
.normpath(os
.path
.join(WorkspaceDir
, \
198 "Conf/DistributionPackageDatabase.db")), WorkspaceDir
)
199 GlobalData
.gDB
.InitDatabase(Opt
.SkipLock
)
202 # Make sure the Db will get closed correctly
206 CheckConflictOption(Opt
)
209 if Opt
.PackFileToCreate
:
210 if Opt
.PackageInformationDataFile
:
211 if not os
.path
.exists(Opt
.PackageInformationDataFile
):
212 if not os
.path
.exists(os
.path
.join(WorkspaceDir
, Opt
.PackageInformationDataFile
)):
213 Logger
.Error("\nUPT", FILE_NOT_FOUND
, ST
.ERR_NO_TEMPLATE_FILE
% Opt
.PackageInformationDataFile
)
215 Opt
.PackageInformationDataFile
= os
.path
.join(WorkspaceDir
, Opt
.PackageInformationDataFile
)
217 Logger
.Error("UPT", OPTION_MISSING
, ExtraData
=ST
.ERR_REQUIRE_T_OPTION
)
218 if not Opt
.PackFileToCreate
.endswith('.dist'):
219 Logger
.Error("CreatePkg", FILE_TYPE_MISMATCH
, ExtraData
=ST
.ERR_DIST_EXT_ERROR
% Opt
.PackFileToCreate
)
220 RunModule
= MkPkg
.Main
222 elif Opt
.PackFileToInstall
:
223 if not Opt
.PackFileToInstall
.endswith('.dist'):
224 Logger
.Error("InstallPkg", FILE_TYPE_MISMATCH
, ExtraData
=ST
.ERR_DIST_EXT_ERROR
% Opt
.PackFileToInstall
)
226 AbsPath
= GetFullPathDist(Opt
.PackFileToInstall
, WorkspaceDir
)
228 Logger
.Error("InstallPkg", FILE_NOT_FOUND
, ST
.ERR_INSTALL_DIST_NOT_FOUND
% Opt
.PackFileToInstall
)
230 Opt
.PackFileToInstall
= AbsPath
231 setattr(Opt
, 'PackageFile', Opt
.PackFileToInstall
)
232 RunModule
= InstallPkg
.Main
234 elif Opt
.PackFileToRemove
:
235 if not Opt
.PackFileToRemove
.endswith('.dist'):
236 Logger
.Error("RemovePkg", FILE_TYPE_MISMATCH
, ExtraData
=ST
.ERR_DIST_EXT_ERROR
% Opt
.PackFileToRemove
)
237 head
, tail
= os
.path
.split(Opt
.PackFileToRemove
)
239 Logger
.Error("RemovePkg",
241 ExtraData
=ST
.ERR_DIST_FILENAME_ONLY_FOR_REMOVE
% Opt
.PackFileToRemove
)
243 setattr(Opt
, 'DistributionFile', Opt
.PackFileToRemove
)
244 RunModule
= RmPkg
.Main
245 elif Opt
.InventoryWs
:
246 RunModule
= InventoryWs
.Main
248 elif Opt
.PackFileToBeReplaced
and not Opt
.PackFileToReplace
:
249 Logger
.Error("ReplacePkg", OPTION_MISSING
, ExtraData
=ST
.ERR_REQUIRE_U_OPTION
)
251 elif Opt
.PackFileToReplace
:
252 if not Opt
.PackFileToReplace
.endswith('.dist'):
253 Logger
.Error("ReplacePkg", FILE_TYPE_MISMATCH
, ExtraData
=ST
.ERR_DIST_EXT_ERROR
% Opt
.PackFileToReplace
)
254 if not Opt
.PackFileToBeReplaced
:
255 Logger
.Error("ReplacePkg", OPTION_MISSING
, ExtraData
=ST
.ERR_REQUIRE_O_OPTION
)
256 if not Opt
.PackFileToBeReplaced
.endswith('.dist'):
257 Logger
.Error("ReplacePkg",
259 ExtraData
=ST
.ERR_DIST_EXT_ERROR
% Opt
.PackFileToBeReplaced
)
261 head
, tail
= os
.path
.split(Opt
.PackFileToBeReplaced
)
263 Logger
.Error("ReplacePkg",
265 ExtraData
=ST
.ERR_DIST_FILENAME_ONLY_FOR_REPLACE_ORIG
% Opt
.PackFileToBeReplaced
)
267 AbsPath
= GetFullPathDist(Opt
.PackFileToReplace
, WorkspaceDir
)
269 Logger
.Error("ReplacePkg", FILE_NOT_FOUND
, ST
.ERR_REPLACE_DIST_NOT_FOUND
% Opt
.PackFileToReplace
)
271 Opt
.PackFileToReplace
= AbsPath
272 RunModule
= ReplacePkg
.Main
276 return OPTION_MISSING
278 ReturnCode
= RunModule(Opt
)
279 except FatalError
, XExcept
:
280 ReturnCode
= XExcept
.args
[0]
281 if Logger
.GetLevel() <= Logger
.DEBUG_9
:
282 Logger
.Quiet(ST
.MSG_PYTHON_ON
% (python_version(), platform
) + \
286 if ReturnCode
!= 0 and ReturnCode
!= UPT_ALREADY_INSTALLED_ERROR
:
287 Logger
.Quiet(ST
.MSG_RECOVER_START
)
288 GlobalData
.gDB
.RollBack()
290 Logger
.Quiet(ST
.MSG_RECOVER_DONE
)
292 GlobalData
.gDB
.Commit()
294 except StandardError:
295 Logger
.Quiet(ST
.MSG_RECOVER_FAIL
)
296 GlobalData
.gDB
.CloseDb()
297 if pf
.system() == 'Windows':
298 os
.system('subst b: /D')
304 # This function will check DistFile existence, if not absolute path, then try current working directory,
305 # then $(WORKSPACE),and return the AbsPath. If file doesn't find, then return None
307 # @param DistFile: The distribution file in either relative path or absolute path
308 # @param WorkspaceDir: Workspace Directory
309 # @return AbsPath: The Absolute path of the distribution file if existed, None else
311 def GetFullPathDist(DistFile
, WorkspaceDir
):
312 if os
.path
.isabs(DistFile
):
313 if not (os
.path
.exists(DistFile
) and os
.path
.isfile(DistFile
)):
318 AbsPath
= os
.path
.normpath(os
.path
.join(os
.getcwd(), DistFile
))
319 if not (os
.path
.exists(AbsPath
) and os
.path
.isfile(AbsPath
)):
320 AbsPath
= os
.path
.normpath(os
.path
.join(WorkspaceDir
, DistFile
))
321 if not (os
.path
.exists(AbsPath
) and os
.path
.isfile(AbsPath
)):
326 if __name__
== '__main__':
329 # 0-127 is a safe return range, and 1 is a standard default error
331 if RETVAL
< 0 or RETVAL
> 127: