]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/ReplacePkg.py
BaseTools: Remove './SecMain' from 'run' target
[mirror_edk2.git] / BaseTools / Source / Python / UPT / ReplacePkg.py
CommitLineData
421ccda3
HC
1## @file\r
2# Replace distribution package.\r
3#\r
f7496d71 4# Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>\r
421ccda3 5#\r
2e351cbe 6# SPDX-License-Identifier: BSD-2-Clause-Patent\r
421ccda3
HC
7#\r
8"""\r
9Replace a distribution package\r
10"""\r
11##\r
12# Import Modules\r
13#\r
14from shutil import rmtree\r
15from traceback import format_exc\r
16from platform import python_version\r
17from sys import platform\r
18from Logger import StringTable as ST\r
19from Logger.ToolError import UNKNOWN_ERROR\r
20from Logger.ToolError import FatalError\r
21from Logger.ToolError import ABORT_ERROR\r
22from Logger.ToolError import CODE_ERROR\r
23from Logger.ToolError import UPT_ALREADY_INSTALLED_ERROR\r
24import Logger.Log as Logger\r
25\r
26from Core.DependencyRules import DependencyRules\r
27from Library import GlobalData\r
28from InstallPkg import UnZipDp\r
29from InstallPkg import InstallDp\r
30from RmPkg import GetInstalledDpInfo\r
31from RmPkg import RemoveDist\r
32\r
33## Tool entrance method\r
34#\r
35# This method mainly dispatch specific methods per the command line options.\r
36# If no error found, return zero value so the caller of this tool can know\r
37# if it's executed successfully or not.\r
38#\r
39# @param Options: command Options\r
40#\r
41def Main(Options = None):\r
42 ContentZipFile, DistFile = None, None\r
43 try:\r
44 DataBase = GlobalData.gDB\r
45 WorkspaceDir = GlobalData.gWORKSPACE\r
46 Dep = DependencyRules(DataBase)\r
47 DistPkg, ContentZipFile, DpPkgFileName, DistFile = UnZipDp(WorkspaceDir, Options.PackFileToReplace)\r
f7496d71 48\r
421ccda3
HC
49 StoredDistFile, OrigDpGuid, OrigDpVersion = GetInstalledDpInfo(Options.PackFileToBeReplaced, \\r
50 Dep, DataBase, WorkspaceDir)\r
f7496d71 51\r
421ccda3
HC
52 #\r
53 # check dependency\r
54 #\r
55 CheckReplaceDpx(Dep, DistPkg, OrigDpGuid, OrigDpVersion)\r
f7496d71 56\r
421ccda3
HC
57 #\r
58 # Remove the old distribution\r
59 #\r
60 RemoveDist(OrigDpGuid, OrigDpVersion, StoredDistFile, DataBase, WorkspaceDir, Options.Yes)\r
f7496d71 61\r
421ccda3
HC
62 #\r
63 # Install the new distribution\r
64 #\r
65 InstallDp(DistPkg, DpPkgFileName, ContentZipFile, Options, Dep, WorkspaceDir, DataBase)\r
66 ReturnCode = 0\r
f7496d71 67\r
5b0671c1 68 except FatalError as XExcept:\r
421ccda3
HC
69 ReturnCode = XExcept.args[0]\r
70 if Logger.GetLevel() <= Logger.DEBUG_9:\r
71 Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(),\r
72 platform) + format_exc())\r
73 except KeyboardInterrupt:\r
74 ReturnCode = ABORT_ERROR\r
75 if Logger.GetLevel() <= Logger.DEBUG_9:\r
76 Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(),\r
77 platform) + format_exc())\r
78 except:\r
79 ReturnCode = CODE_ERROR\r
80 Logger.Error(\r
81 "\nReplacePkg",\r
82 CODE_ERROR,\r
83 ST.ERR_UNKNOWN_FATAL_REPLACE_ERR % (Options.PackFileToReplace, Options.PackFileToBeReplaced),\r
c1387446 84 ExtraData=ST.MSG_SEARCH_FOR_HELP % ST.MSG_EDKII_MAIL_ADDR,\r
421ccda3
HC
85 RaiseError=False\r
86 )\r
87 Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(),\r
88 platform) + format_exc())\r
89\r
90 finally:\r
91 Logger.Quiet(ST.MSG_REMOVE_TEMP_FILE_STARTED)\r
92 if DistFile:\r
93 DistFile.Close()\r
94 if ContentZipFile:\r
95 ContentZipFile.Close()\r
56636814
HC
96 for TempDir in GlobalData.gUNPACK_DIR:\r
97 rmtree(TempDir)\r
98 GlobalData.gUNPACK_DIR = []\r
f7496d71 99 Logger.Quiet(ST.MSG_REMOVE_TEMP_FILE_DONE)\r
421ccda3
HC
100\r
101 if ReturnCode == 0:\r
102 Logger.Quiet(ST.MSG_FINISH)\r
f7496d71 103\r
421ccda3
HC
104 return ReturnCode\r
105\r
106def CheckReplaceDpx(Dep, DistPkg, OrigDpGuid, OrigDpVersion):\r
107 NewDpPkgList = []\r
108 for PkgInfo in DistPkg.PackageSurfaceArea:\r
109 Guid, Version = PkgInfo[0], PkgInfo[1]\r
110 NewDpPkgList.append((Guid, Version))\r
111\r
112 NewDpInfo = "%s %s" % (DistPkg.Header.GetGuid(), DistPkg.Header.GetVersion())\r
113 OrigDpInfo = "%s %s" % (OrigDpGuid, OrigDpVersion)\r
114\r
115 #\r
116 # check whether new distribution is already installed and not replacing itself\r
117 #\r
118 if (NewDpInfo != OrigDpInfo):\r
119 if Dep.CheckDpExists(DistPkg.Header.GetGuid(), DistPkg.Header.GetVersion()):\r
120 Logger.Error("\nReplacePkg", UPT_ALREADY_INSTALLED_ERROR,\r
121 ST.WRN_DIST_PKG_INSTALLED,\r
f7496d71 122 ExtraData=ST.MSG_REPLACE_ALREADY_INSTALLED_DP)\r
421ccda3
HC
123\r
124 #\r
125 # check whether the original distribution could be replaced by new distribution\r
f7496d71 126 #\r
421ccda3
HC
127 Logger.Verbose(ST.MSG_CHECK_DP_FOR_REPLACE%(NewDpInfo, OrigDpInfo))\r
128 DepInfoResult = Dep.CheckDpDepexForReplace(OrigDpGuid, OrigDpVersion, NewDpPkgList)\r
129 Replaceable = DepInfoResult[0]\r
130 if not Replaceable:\r
131 Logger.Error("\nReplacePkg", UNKNOWN_ERROR,\r
132 ST.ERR_PACKAGE_NOT_MATCH_DEPENDENCY)\r
f7496d71 133\r
421ccda3
HC
134 #\r
135 # check whether new distribution could be installed by dependency rule\r
136 #\r
137 Logger.Verbose(ST.MSG_CHECK_DP_FOR_INSTALL%str(NewDpInfo))\r
138 if not Dep.ReplaceCheckNewDpDepex(DistPkg, OrigDpGuid, OrigDpVersion):\r
139 Logger.Error("\nReplacePkg", UNKNOWN_ERROR,\r
140 ST.ERR_PACKAGE_NOT_MATCH_DEPENDENCY,\r
141 ExtraData=DistPkg.Header.Name)\r
142\r