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
46 from BuildVersion
import gBUILD_VERSION
49 # Version and Copyright
51 #VersionNumber = "1.0"
52 #__version__ = "Revision " + VersionNumber
53 #__copyright__ = "Copyright (c) 2011 Intel Corporation All Rights Reserved."
55 ## CheckConflictOption
59 def CheckConflictOption(Opt
):
60 if (Opt
.PackFileToCreate
and Opt
.PackFileToInstall
and Opt
.PackFileToRemove
):
61 Logger
.Error("UPT", OPTION_CONFLICT
, ExtraData
=ST
.ERR_REQUIRE_I_C_R_OPTION
)
62 elif Opt
.PackFileToCreate
and Opt
.PackFileToInstall
:
63 Logger
.Error("UPT", OPTION_CONFLICT
, ExtraData
=ST
.ERR_I_C_EXCLUSIVE
)
64 elif Opt
.PackFileToInstall
and Opt
.PackFileToRemove
:
65 Logger
.Error("UPT", OPTION_CONFLICT
, ExtraData
=ST
.ERR_I_R_EXCLUSIVE
)
66 elif Opt
.PackFileToCreate
and Opt
.PackFileToRemove
:
67 Logger
.Error("UPT", OPTION_CONFLICT
, ExtraData
=ST
.ERR_C_R_EXCLUSIVE
)
73 Logger
.SetLevel(Logger
.VERBOSE
)
75 Logger
.SetLevel(Logger
.QUIET
+ 1)
76 elif Opt
.debug_level
!= None:
77 if Opt
.debug_level
< 0 or Opt
.debug_level
> 9:
78 Logger
.Warn("UPT", ST
.ERR_DEBUG_LEVEL
)
79 Logger
.SetLevel(Logger
.INFO
)
81 Logger
.SetLevel(Opt
.debug_level
+ 1)
83 Logger
.SetLevel(Logger
.SILENT
)
85 Logger
.SetLevel(Logger
.INFO
)
94 Parser
= OptionParser(version
=(MSG_VERSION
+ ' ' + gBUILD_VERSION
), description
=MSG_DESCRIPTION
,
95 prog
="UPT.exe", usage
=MSG_USAGE
)
97 Parser
.add_option("-d", "--debug", action
="store", type="int", dest
="debug_level", help=ST
.HLP_PRINT_DEBUG_INFO
)
99 Parser
.add_option("-v", "--verbose", action
="store_true", dest
="opt_verbose",
100 help=ST
.HLP_PRINT_INFORMATIONAL_STATEMENT
)
102 Parser
.add_option("-s", "--silent", action
="store_true", dest
="opt_slient", help=ST
.HLP_RETURN_NO_DISPLAY
)
104 Parser
.add_option("-q", "--quiet", action
="store_true", dest
="opt_quiet", help=ST
.HLP_RETURN_AND_DISPLAY
)
106 Parser
.add_option("-i", "--install", action
="store", type="string", dest
="Install_Distribution_Package_File",
107 help=ST
.HLP_SPECIFY_PACKAGE_NAME_INSTALL
)
109 Parser
.add_option("-c", "--create", action
="store", type="string", dest
="Create_Distribution_Package_File",
110 help=ST
.HLP_SPECIFY_PACKAGE_NAME_CREATE
)
112 Parser
.add_option("-r", "--remove", action
="store", type="string", dest
="Remove_Distribution_Package_File",
113 help=ST
.HLP_SPECIFY_PACKAGE_NAME_REMOVE
)
115 Parser
.add_option("-t", "--template", action
="store", type="string", dest
="Package_Information_Data_File",
116 help=ST
.HLP_SPECIFY_TEMPLATE_NAME_CREATE
)
118 Parser
.add_option("-p", "--dec-filename", action
="append", type="string", dest
="EDK2_DEC_Filename",
119 help=ST
.HLP_SPECIFY_DEC_NAME_CREATE
)
121 Parser
.add_option("-m", "--inf-filename", action
="append", type="string", dest
="EDK2_INF_Filename",
122 help=ST
.HLP_SPECIFY_INF_NAME_CREATE
)
124 Parser
.add_option("-f", "--force", action
="store_true", dest
="Yes", help=ST
.HLP_DISABLE_PROMPT
)
126 Parser
.add_option("-n", "--custom-path", action
="store_true", dest
="CustomPath", help=ST
.HLP_CUSTOM_PATH_PROMPT
)
128 Parser
.add_option("-x", "--free-lock", action
="store_true", dest
="SkipLock", help=ST
.HLP_SKIP_LOCK_CHECK
)
130 Opt
= Parser
.parse_args()[0]
133 ("PackageInformationDataFile", Opt
.Package_Information_Data_File
),
134 ("PackFileToInstall", Opt
.Install_Distribution_Package_File
),
135 ("PackFileToCreate", Opt
.Create_Distribution_Package_File
),
136 ("PackFileToRemove", Opt
.Remove_Distribution_Package_File
),
137 ("PackageFileList", Opt
.EDK2_DEC_Filename
),
138 ("ModuleFileList", Opt
.EDK2_INF_Filename
)
141 setattr(Opt
, Var
[0], Var
[1])
145 except FatalError
, XExcept
:
146 if Logger
.GetLevel() <= Logger
.DEBUG_9
:
147 Logger
.Quiet(ST
.MSG_PYTHON_ON
% (python_version(), platform
) + format_exc())
148 return XExcept
.args
[0]
150 GlobalData
.gWORKSPACE
= os
.path
.normpath(environ
["WORKSPACE"])
151 WorkspaceDir
= GlobalData
.gWORKSPACE
155 GlobalData
.gDB
= IpiDatabase(os
.path
.normpath(os
.path
.join(WorkspaceDir
, "Conf/DistributionPackageDatabase.db")))
156 GlobalData
.gDB
.InitDatabase(Opt
.SkipLock
)
159 # Make sure the Db will get closed correctly
163 CheckConflictOption(Opt
)
166 if Opt
.PackFileToCreate
:
167 if Opt
.PackageInformationDataFile
:
168 if not os
.path
.exists(Opt
.PackageInformationDataFile
):
169 if not os
.path
.exists(os
.path
.join(WorkspaceDir
, Opt
.PackageInformationDataFile
)):
170 Logger
.Error("\nUPT", FILE_NOT_FOUND
, ST
.ERR_NO_TEMPLATE_FILE
% Opt
.PackageInformationDataFile
)
172 Opt
.PackageInformationDataFile
= os
.path
.join(WorkspaceDir
, Opt
.PackageInformationDataFile
)
174 Logger
.Error("UPT", OPTION_MISSING
, ExtraData
=ST
.ERR_REQUIRE_T_OPTION
)
175 if not Opt
.PackFileToCreate
.endswith('.dist'):
176 Logger
.Error("CreatePkg", FILE_TYPE_MISMATCH
, ExtraData
=ST
.ERR_DIST_EXT_ERROR
% Opt
.PackFileToCreate
)
177 RunModule
= MkPkg
.Main
179 elif Opt
.PackFileToInstall
:
180 if not Opt
.PackFileToInstall
.endswith('.dist'):
181 Logger
.Error("InstallPkg", FILE_TYPE_MISMATCH
, ExtraData
=ST
.ERR_DIST_EXT_ERROR
% Opt
.PackFileToInstall
)
184 # check file existence, if not absolute path, then try current working directory, then $(WORKSPACE)
187 if os
.path
.isabs(Opt
.PackFileToInstall
):
188 if not (os
.path
.exists(Opt
.PackFileToInstall
) and os
.path
.isfile(Opt
.PackFileToInstall
)):
191 AbsPath
= os
.path
.normpath(os
.path
.join(os
.getcwd(), Opt
.PackFileToInstall
))
192 if not (os
.path
.exists(AbsPath
) and os
.path
.isfile(AbsPath
)):
193 AbsPath
= os
.path
.normpath(os
.path
.join(WorkspaceDir
, Opt
.PackFileToInstall
))
194 if not (os
.path
.exists(AbsPath
) and os
.path
.isfile(AbsPath
)):
198 Opt
.PackFileToInstall
= AbsPath
201 Logger
.Error("InstallPkg", FILE_NOT_FOUND
, ST
.ERR_INSTALL_DIST_NOT_FOUND
% Opt
.PackFileToInstall
)
203 setattr(Opt
, 'PackageFile', Opt
.PackFileToInstall
)
204 RunModule
= InstallPkg
.Main
206 elif Opt
.PackFileToRemove
:
207 if not Opt
.PackFileToRemove
.endswith('.dist'):
208 Logger
.Error("RemovePkg", FILE_TYPE_MISMATCH
, ExtraData
=ST
.ERR_DIST_EXT_ERROR
% Opt
.PackFileToRemove
)
209 head
, tail
= os
.path
.split(Opt
.PackFileToRemove
)
211 Logger
.Error("RemovePkg",
213 ExtraData
=ST
.ERR_DIST_FILENAME_ONLY_FOR_REMOVE
% Opt
.PackFileToRemove
)
215 setattr(Opt
, 'DistributionFile', Opt
.PackFileToRemove
)
216 RunModule
= RmPkg
.Main
219 return OPTION_MISSING
221 ReturnCode
= RunModule(Opt
)
222 except FatalError
, XExcept
:
223 ReturnCode
= XExcept
.args
[0]
224 if Logger
.GetLevel() <= Logger
.DEBUG_9
:
225 Logger
.Quiet(ST
.MSG_PYTHON_ON
% (python_version(), platform
) + \
228 GlobalData
.gDB
.CloseDb()
232 if __name__
== '__main__':
235 # 0-127 is a safe return range, and 1 is a standard default error
237 if RETVAL
< 0 or RETVAL
> 127: