3 # This file is the main entry for UPT
5 # Copyright (c) 2011, 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.
24 from os
import environ
25 from sys
import platform
26 from optparse
import OptionParser
27 from traceback
import format_exc
28 from platform
import python_version
30 from Logger
import StringTable
as ST
31 import Logger
.Log
as Logger
32 from Logger
.StringTable
import MSG_VERSION
33 from Logger
.StringTable
import MSG_DESCRIPTION
34 from Logger
.StringTable
import MSG_USAGE
35 from Logger
.ToolError
import FILE_NOT_FOUND
36 from Logger
.ToolError
import OPTION_MISSING
37 from Logger
.ToolError
import FILE_TYPE_MISMATCH
38 from Logger
.ToolError
import OPTION_CONFLICT
39 from Logger
.ToolError
import FatalError
43 from Library
.Misc
import CheckEnvVariable
44 from Library
import GlobalData
45 from Core
.IpiDb
import IpiDatabase
48 # Version and Copyright
50 #VersionNumber = "1.0"
51 #__version__ = "Revision " + VersionNumber
52 #__copyright__ = "Copyright (c) 2011 Intel Corporation All Rights Reserved."
54 ## CheckConflictOption
58 def CheckConflictOption(Opt
):
59 if (Opt
.PackFileToCreate
and Opt
.PackFileToInstall
and Opt
.PackFileToRemove
):
60 Logger
.Error("UPT", OPTION_CONFLICT
, ExtraData
=ST
.ERR_REQUIRE_I_C_R_OPTION
)
61 elif Opt
.PackFileToCreate
and Opt
.PackFileToInstall
:
62 Logger
.Error("UPT", OPTION_CONFLICT
, ExtraData
=ST
.ERR_I_C_EXCLUSIVE
)
63 elif Opt
.PackFileToInstall
and Opt
.PackFileToRemove
:
64 Logger
.Error("UPT", OPTION_CONFLICT
, ExtraData
=ST
.ERR_I_R_EXCLUSIVE
)
65 elif Opt
.PackFileToCreate
and Opt
.PackFileToRemove
:
66 Logger
.Error("UPT", OPTION_CONFLICT
, ExtraData
=ST
.ERR_C_R_EXCLUSIVE
)
72 Logger
.SetLevel(Logger
.VERBOSE
)
74 Logger
.SetLevel(Logger
.QUIET
+ 1)
75 elif Opt
.debug_level
!= None:
76 if Opt
.debug_level
< 0 or Opt
.debug_level
> 9:
77 Logger
.Warn("UPT", ST
.ERR_DEBUG_LEVEL
)
78 Logger
.SetLevel(Logger
.INFO
)
80 Logger
.SetLevel(Opt
.debug_level
+ 1)
82 Logger
.SetLevel(Logger
.SILENT
)
84 Logger
.SetLevel(Logger
.INFO
)
93 Parser
= OptionParser(version
=MSG_VERSION
, description
=MSG_DESCRIPTION
,
94 prog
="UPT.exe", usage
=MSG_USAGE
)
96 Parser
.add_option("-d", "--debug", action
="store", type="int", dest
="debug_level", help=ST
.HLP_PRINT_DEBUG_INFO
)
98 Parser
.add_option("-v", "--verbose", action
="store_true", dest
="opt_verbose",
99 help=ST
.HLP_PRINT_INFORMATIONAL_STATEMENT
)
101 Parser
.add_option("-s", "--silent", action
="store_true", dest
="opt_slient", help=ST
.HLP_RETURN_NO_DISPLAY
)
103 Parser
.add_option("-q", "--quiet", action
="store_true", dest
="opt_quiet", help=ST
.HLP_RETURN_AND_DISPLAY
)
105 Parser
.add_option("-i", "--install", action
="store", type="string", dest
="Install_Distribution_Package_File",
106 help=ST
.HLP_SPECIFY_PACKAGE_NAME_INSTALL
)
108 Parser
.add_option("-c", "--create", action
="store", type="string", dest
="Create_Distribution_Package_File",
109 help=ST
.HLP_SPECIFY_PACKAGE_NAME_CREATE
)
111 Parser
.add_option("-r", "--remove", action
="store", type="string", dest
="Remove_Distribution_Package_File",
112 help=ST
.HLP_SPECIFY_PACKAGE_NAME_REMOVE
)
114 Parser
.add_option("-t", "--template", action
="store", type="string", dest
="Package_Information_Data_File",
115 help=ST
.HLP_SPECIFY_TEMPLATE_NAME_CREATE
)
117 Parser
.add_option("-p", "--dec-filename", action
="append", type="string", dest
="EDK2_DEC_Filename",
118 help=ST
.HLP_SPECIFY_DEC_NAME_CREATE
)
120 Parser
.add_option("-m", "--inf-filename", action
="append", type="string", dest
="EDK2_INF_Filename",
121 help=ST
.HLP_SPECIFY_INF_NAME_CREATE
)
123 Parser
.add_option("-f", "--force", action
="store_true", dest
="Yes", help=ST
.HLP_DISABLE_PROMPT
)
125 Parser
.add_option("-n", "--custom-path", action
="store_true", dest
="CustomPath", help=ST
.HLP_CUSTOM_PATH_PROMPT
)
127 Parser
.add_option("-x", "--free-lock", action
="store_true", dest
="SkipLock", help=ST
.HLP_SKIP_LOCK_CHECK
)
129 Opt
= Parser
.parse_args()[0]
132 ("PackageInformationDataFile", Opt
.Package_Information_Data_File
),
133 ("PackFileToInstall", Opt
.Install_Distribution_Package_File
),
134 ("PackFileToCreate", Opt
.Create_Distribution_Package_File
),
135 ("PackFileToRemove", Opt
.Remove_Distribution_Package_File
),
136 ("PackageFileList", Opt
.EDK2_DEC_Filename
),
137 ("ModuleFileList", Opt
.EDK2_INF_Filename
)
140 setattr(Opt
, Var
[0], Var
[1])
144 except FatalError
, XExcept
:
145 if Logger
.GetLevel() <= Logger
.DEBUG_9
:
146 Logger
.Quiet(ST
.MSG_PYTHON_ON
% (python_version(), platform
) + format_exc())
147 return XExcept
.args
[0]
149 GlobalData
.gWORKSPACE
= os
.path
.normpath(environ
["WORKSPACE"])
150 WorkspaceDir
= GlobalData
.gWORKSPACE
154 GlobalData
.gDB
= IpiDatabase(os
.path
.normpath(os
.path
.join(WorkspaceDir
, "Conf/DistributionPackageDatabase.db")))
155 GlobalData
.gDB
.InitDatabase(Opt
.SkipLock
)
158 # Make sure the Db will get closed correctly
162 CheckConflictOption(Opt
)
165 if Opt
.PackFileToCreate
:
166 if Opt
.PackageInformationDataFile
:
167 if not os
.path
.exists(Opt
.PackageInformationDataFile
):
168 if not os
.path
.exists(os
.path
.join(WorkspaceDir
, Opt
.PackageInformationDataFile
)):
169 Logger
.Error("\nUPT", FILE_NOT_FOUND
, ST
.ERR_NO_TEMPLATE_FILE
% Opt
.PackageInformationDataFile
)
171 Opt
.PackageInformationDataFile
= os
.path
.join(WorkspaceDir
, Opt
.PackageInformationDataFile
)
173 Logger
.Error("UPT", OPTION_MISSING
, ExtraData
=ST
.ERR_REQUIRE_T_OPTION
)
174 if not Opt
.PackFileToCreate
.endswith('.dist'):
175 Logger
.Error("CreatePkg", FILE_TYPE_MISMATCH
, ExtraData
=ST
.ERR_DIST_EXT_ERROR
% Opt
.PackFileToCreate
)
176 RunModule
= MkPkg
.Main
178 elif Opt
.PackFileToInstall
:
179 if not Opt
.PackFileToInstall
.endswith('.dist'):
180 Logger
.Error("InstallPkg", FILE_TYPE_MISMATCH
, ExtraData
=ST
.ERR_DIST_EXT_ERROR
% Opt
.PackFileToInstall
)
183 # check file existence, if not absolute path, then try current working directory, then $(WORKSPACE)
186 if os
.path
.isabs(Opt
.PackFileToInstall
):
187 if not (os
.path
.exists(Opt
.PackFileToInstall
) and os
.path
.isfile(Opt
.PackFileToInstall
)):
190 AbsPath
= os
.path
.normpath(os
.path
.join(os
.getcwd(), Opt
.PackFileToInstall
))
191 if not (os
.path
.exists(AbsPath
) and os
.path
.isfile(AbsPath
)):
192 AbsPath
= os
.path
.normpath(os
.path
.join(WorkspaceDir
, Opt
.PackFileToInstall
))
193 if not (os
.path
.exists(AbsPath
) and os
.path
.isfile(AbsPath
)):
197 Opt
.PackFileToInstall
= AbsPath
200 Logger
.Error("InstallPkg", FILE_NOT_FOUND
, ST
.ERR_INSTALL_DIST_NOT_FOUND
% Opt
.PackFileToInstall
)
202 setattr(Opt
, 'PackageFile', Opt
.PackFileToInstall
)
203 RunModule
= InstallPkg
.Main
205 elif Opt
.PackFileToRemove
:
206 if not Opt
.PackFileToRemove
.endswith('.dist'):
207 Logger
.Error("RemovePkg", FILE_TYPE_MISMATCH
, ExtraData
=ST
.ERR_DIST_EXT_ERROR
% Opt
.PackFileToRemove
)
208 head
, tail
= os
.path
.split(Opt
.PackFileToRemove
)
210 Logger
.Error("RemovePkg",
212 ExtraData
=ST
.ERR_DIST_FILENAME_ONLY_FOR_REMOVE
% Opt
.PackFileToRemove
)
214 setattr(Opt
, 'DistributionFile', Opt
.PackFileToRemove
)
215 RunModule
= RmPkg
.Main
218 return OPTION_MISSING
220 ReturnCode
= RunModule(Opt
)
221 except FatalError
, XExcept
:
222 ReturnCode
= XExcept
.args
[0]
223 if Logger
.GetLevel() <= Logger
.DEBUG_9
:
224 Logger
.Quiet(ST
.MSG_PYTHON_ON
% (python_version(), platform
) + \
227 GlobalData
.gDB
.CloseDb()
231 if __name__
== '__main__':
234 # 0-127 is a safe return range, and 1 is a standard default error
236 if RETVAL
< 0 or RETVAL
> 127: