2 # Replace distribution package.
4 # Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
6 # SPDX-License-Identifier: BSD-2-Clause-Patent
9 Replace a distribution package
14 from shutil
import rmtree
15 from traceback
import format_exc
16 from platform
import python_version
17 from sys
import platform
18 from Logger
import StringTable
as ST
19 from Logger
.ToolError
import UNKNOWN_ERROR
20 from Logger
.ToolError
import FatalError
21 from Logger
.ToolError
import ABORT_ERROR
22 from Logger
.ToolError
import CODE_ERROR
23 from Logger
.ToolError
import UPT_ALREADY_INSTALLED_ERROR
24 import Logger
.Log
as Logger
26 from Core
.DependencyRules
import DependencyRules
27 from Library
import GlobalData
28 from InstallPkg
import UnZipDp
29 from InstallPkg
import InstallDp
30 from RmPkg
import GetInstalledDpInfo
31 from RmPkg
import RemoveDist
33 ## Tool entrance method
35 # This method mainly dispatch specific methods per the command line options.
36 # If no error found, return zero value so the caller of this tool can know
37 # if it's executed successfully or not.
39 # @param Options: command Options
41 def Main(Options
= None):
42 ContentZipFile
, DistFile
= None, None
44 DataBase
= GlobalData
.gDB
45 WorkspaceDir
= GlobalData
.gWORKSPACE
46 Dep
= DependencyRules(DataBase
)
47 DistPkg
, ContentZipFile
, DpPkgFileName
, DistFile
= UnZipDp(WorkspaceDir
, Options
.PackFileToReplace
)
49 StoredDistFile
, OrigDpGuid
, OrigDpVersion
= GetInstalledDpInfo(Options
.PackFileToBeReplaced
, \
50 Dep
, DataBase
, WorkspaceDir
)
55 CheckReplaceDpx(Dep
, DistPkg
, OrigDpGuid
, OrigDpVersion
)
58 # Remove the old distribution
60 RemoveDist(OrigDpGuid
, OrigDpVersion
, StoredDistFile
, DataBase
, WorkspaceDir
, Options
.Yes
)
63 # Install the new distribution
65 InstallDp(DistPkg
, DpPkgFileName
, ContentZipFile
, Options
, Dep
, WorkspaceDir
, DataBase
)
68 except FatalError
as XExcept
:
69 ReturnCode
= XExcept
.args
[0]
70 if Logger
.GetLevel() <= Logger
.DEBUG_9
:
71 Logger
.Quiet(ST
.MSG_PYTHON_ON
% (python_version(),
72 platform
) + format_exc())
73 except KeyboardInterrupt:
74 ReturnCode
= ABORT_ERROR
75 if Logger
.GetLevel() <= Logger
.DEBUG_9
:
76 Logger
.Quiet(ST
.MSG_PYTHON_ON
% (python_version(),
77 platform
) + format_exc())
79 ReturnCode
= CODE_ERROR
83 ST
.ERR_UNKNOWN_FATAL_REPLACE_ERR
% (Options
.PackFileToReplace
, Options
.PackFileToBeReplaced
),
84 ExtraData
=ST
.MSG_SEARCH_FOR_HELP
,
87 Logger
.Quiet(ST
.MSG_PYTHON_ON
% (python_version(),
88 platform
) + format_exc())
91 Logger
.Quiet(ST
.MSG_REMOVE_TEMP_FILE_STARTED
)
95 ContentZipFile
.Close()
96 for TempDir
in GlobalData
.gUNPACK_DIR
:
98 GlobalData
.gUNPACK_DIR
= []
99 Logger
.Quiet(ST
.MSG_REMOVE_TEMP_FILE_DONE
)
102 Logger
.Quiet(ST
.MSG_FINISH
)
106 def CheckReplaceDpx(Dep
, DistPkg
, OrigDpGuid
, OrigDpVersion
):
108 for PkgInfo
in DistPkg
.PackageSurfaceArea
:
109 Guid
, Version
= PkgInfo
[0], PkgInfo
[1]
110 NewDpPkgList
.append((Guid
, Version
))
112 NewDpInfo
= "%s %s" % (DistPkg
.Header
.GetGuid(), DistPkg
.Header
.GetVersion())
113 OrigDpInfo
= "%s %s" % (OrigDpGuid
, OrigDpVersion
)
116 # check whether new distribution is already installed and not replacing itself
118 if (NewDpInfo
!= OrigDpInfo
):
119 if Dep
.CheckDpExists(DistPkg
.Header
.GetGuid(), DistPkg
.Header
.GetVersion()):
120 Logger
.Error("\nReplacePkg", UPT_ALREADY_INSTALLED_ERROR
,
121 ST
.WRN_DIST_PKG_INSTALLED
,
122 ExtraData
=ST
.MSG_REPLACE_ALREADY_INSTALLED_DP
)
125 # check whether the original distribution could be replaced by new distribution
127 Logger
.Verbose(ST
.MSG_CHECK_DP_FOR_REPLACE
%(NewDpInfo
, OrigDpInfo
))
128 DepInfoResult
= Dep
.CheckDpDepexForReplace(OrigDpGuid
, OrigDpVersion
, NewDpPkgList
)
129 Replaceable
= DepInfoResult
[0]
131 Logger
.Error("\nReplacePkg", UNKNOWN_ERROR
,
132 ST
.ERR_PACKAGE_NOT_MATCH_DEPENDENCY
)
135 # check whether new distribution could be installed by dependency rule
137 Logger
.Verbose(ST
.MSG_CHECK_DP_FOR_INSTALL
%str
(NewDpInfo
))
138 if not Dep
.ReplaceCheckNewDpDepex(DistPkg
, OrigDpGuid
, OrigDpVersion
):
139 Logger
.Error("\nReplacePkg", UNKNOWN_ERROR
,
140 ST
.ERR_PACKAGE_NOT_MATCH_DEPENDENCY
,
141 ExtraData
=DistPkg
.Header
.Name
)