Home | History | Annotate | Download | only in UPT
      1 ## @file

      2 # Replace distribution package.

      3 #

      4 # Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>

      5 #

      6 # This program and the accompanying materials are licensed and made available 

      7 # under the terms and conditions of the BSD License which accompanies this 

      8 # distribution. The full text of the license may be found at 

      9 # http://opensource.org/licenses/bsd-license.php

     10 #

     11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,

     12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

     13 #

     14 """
     15 Replace a distribution package
     16 """
     17 ##

     18 # Import Modules

     19 #

     20 from shutil import rmtree
     21 from traceback import format_exc
     22 from platform import python_version
     23 from sys import platform
     24 from Logger import StringTable as ST
     25 from Logger.ToolError import UNKNOWN_ERROR
     26 from Logger.ToolError import FatalError
     27 from Logger.ToolError import ABORT_ERROR
     28 from Logger.ToolError import CODE_ERROR
     29 from Logger.ToolError import UPT_ALREADY_INSTALLED_ERROR
     30 import Logger.Log as Logger
     31 
     32 from Core.DependencyRules import DependencyRules
     33 from Library import GlobalData
     34 from InstallPkg import UnZipDp
     35 from InstallPkg import InstallDp
     36 from RmPkg import GetInstalledDpInfo
     37 from RmPkg import RemoveDist
     38 
     39 ## Tool entrance method

     40 #

     41 # This method mainly dispatch specific methods per the command line options.

     42 # If no error found, return zero value so the caller of this tool can know

     43 # if it's executed successfully or not.

     44 #

     45 # @param  Options: command Options

     46 #

     47 def Main(Options = None):
     48     ContentZipFile, DistFile = None, None
     49     try:
     50         DataBase = GlobalData.gDB
     51         WorkspaceDir = GlobalData.gWORKSPACE
     52         Dep = DependencyRules(DataBase)
     53         DistPkg, ContentZipFile, DpPkgFileName, DistFile = UnZipDp(WorkspaceDir, Options.PackFileToReplace)
     54         
     55         StoredDistFile, OrigDpGuid, OrigDpVersion = GetInstalledDpInfo(Options.PackFileToBeReplaced, \
     56                                                                        Dep, DataBase, WorkspaceDir)
     57         
     58         #

     59         # check dependency

     60         #

     61         CheckReplaceDpx(Dep, DistPkg, OrigDpGuid, OrigDpVersion)
     62         
     63         #

     64         # Remove the old distribution

     65         #

     66         RemoveDist(OrigDpGuid, OrigDpVersion, StoredDistFile, DataBase, WorkspaceDir, Options.Yes)
     67         
     68         #

     69         # Install the new distribution

     70         #

     71         InstallDp(DistPkg, DpPkgFileName, ContentZipFile, Options, Dep, WorkspaceDir, DataBase)
     72         ReturnCode = 0
     73         
     74     except FatalError, XExcept:
     75         ReturnCode = XExcept.args[0]
     76         if Logger.GetLevel() <= Logger.DEBUG_9:
     77             Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(),
     78                 platform) + format_exc())
     79     except KeyboardInterrupt:
     80         ReturnCode = ABORT_ERROR
     81         if Logger.GetLevel() <= Logger.DEBUG_9:
     82             Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(),
     83                 platform) + format_exc())
     84     except:
     85         ReturnCode = CODE_ERROR
     86         Logger.Error(
     87                     "\nReplacePkg",
     88                     CODE_ERROR,
     89                     ST.ERR_UNKNOWN_FATAL_REPLACE_ERR % (Options.PackFileToReplace, Options.PackFileToBeReplaced),
     90                     ExtraData=ST.MSG_SEARCH_FOR_HELP,
     91                     RaiseError=False
     92                     )
     93         Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(),
     94             platform) + format_exc())
     95 
     96     finally:
     97         Logger.Quiet(ST.MSG_REMOVE_TEMP_FILE_STARTED)
     98         if DistFile:
     99             DistFile.Close()
    100         if ContentZipFile:
    101             ContentZipFile.Close()
    102         if GlobalData.gUNPACK_DIR:
    103             rmtree(GlobalData.gUNPACK_DIR)
    104             GlobalData.gUNPACK_DIR = None
    105         Logger.Quiet(ST.MSG_REMOVE_TEMP_FILE_DONE)        
    106 
    107     if ReturnCode == 0:
    108         Logger.Quiet(ST.MSG_FINISH)
    109     
    110     return ReturnCode
    111 
    112 def CheckReplaceDpx(Dep, DistPkg, OrigDpGuid, OrigDpVersion):
    113     NewDpPkgList = []
    114     for PkgInfo in DistPkg.PackageSurfaceArea:
    115         Guid, Version = PkgInfo[0], PkgInfo[1]
    116         NewDpPkgList.append((Guid, Version))
    117 
    118     NewDpInfo = "%s %s" % (DistPkg.Header.GetGuid(), DistPkg.Header.GetVersion())
    119     OrigDpInfo = "%s %s" % (OrigDpGuid, OrigDpVersion)
    120 
    121     #

    122     # check whether new distribution is already installed and not replacing itself

    123     #

    124     if (NewDpInfo != OrigDpInfo):
    125         if Dep.CheckDpExists(DistPkg.Header.GetGuid(), DistPkg.Header.GetVersion()):
    126             Logger.Error("\nReplacePkg", UPT_ALREADY_INSTALLED_ERROR,
    127                 ST.WRN_DIST_PKG_INSTALLED,
    128                 ExtraData=ST.MSG_REPLACE_ALREADY_INSTALLED_DP)    
    129 
    130     #

    131     # check whether the original distribution could be replaced by new distribution

    132     #    

    133     Logger.Verbose(ST.MSG_CHECK_DP_FOR_REPLACE%(NewDpInfo, OrigDpInfo))
    134     DepInfoResult = Dep.CheckDpDepexForReplace(OrigDpGuid, OrigDpVersion, NewDpPkgList)
    135     Replaceable = DepInfoResult[0]
    136     if not Replaceable:
    137         Logger.Error("\nReplacePkg", UNKNOWN_ERROR,
    138             ST.ERR_PACKAGE_NOT_MATCH_DEPENDENCY)
    139     
    140     #

    141     # check whether new distribution could be installed by dependency rule

    142     #

    143     Logger.Verbose(ST.MSG_CHECK_DP_FOR_INSTALL%str(NewDpInfo))
    144     if not Dep.ReplaceCheckNewDpDepex(DistPkg, OrigDpGuid, OrigDpVersion):
    145         Logger.Error("\nReplacePkg", UNKNOWN_ERROR,
    146             ST.ERR_PACKAGE_NOT_MATCH_DEPENDENCY,
    147             ExtraData=DistPkg.Header.Name)
    148 
    149