#!/bin/sh
# SMX patch uninstall
# ---------------------------------------------- #

##### Function ###################################

##### Main routine ###############################

# Function読み込み
. ${INST_HOME}/function.sh

# 初期処理
initialize


# フラグの初期化
FLAG=0


# 開始出力
CLEAR
msg_info  "アップデート時に保管したバックアップファイルから復旧します。" \
          "バックアップファイルからの復旧には時間がかかります。" \
          "しばらくお待ちください。"
#echo ""
echo_sp "${SECUREMATRIX} ファイル復旧中."
write_log "${SECUREMATRIX} ファイル復旧開始"


# 現在のシステム情報を得る（NOW_SMX_DIST,NOW_SMX_SVR）
#getSMXINFO
#if [ "${NOW_SMX_DIST}" = "${UNKNOWN_WORD}" -o "${NOW_SMX_SVR}" = "${UNKNOWN_WORD}" ] ; then
#  FLAG=1
#  arize_err "dmy" "SMX情報の取得に失敗しました。予期せぬエラーです"
#fi
# 得たシステム情報から読み込むディレクトリを選択し、配布ファイル情報を作成する
#LIST_FILE=${INST_HOME}/${NOW_SMX_DIST}/${LIST_FILE_NAME}
LIST_FILE=${INST_HOME}/${COMMON}/${LIST_FILE_NAME}


# バックアップ領域の確認
# バックアップ領域が残っていない場合はエラーとする
if [ ! -f $BACKUP_PKG_FILE ] ; then
  FLAG=1
  arize_err "dmy" "バックアップファイルが残されておりません！"
  arize_err "dmy" "復旧を行うことができません。"
  arize_err "dmy" "サポートに連絡してください。"
fi

# パッチファイル展開領域の作成
#if [ ! -d $MODULE_DIR ] ; then
#  $mkdir $MODULE_DIR > /dev/null 2>&1
#  if [ $? -ne 0 ] ; then
#    FLAG=1
#    arize_err "dmy" "改変検知用のアップデートファイル展開領域の作成に失敗しました。"
#  fi
#fi

# パッチファイルの解凍
# パッチファイルをmodule_xxx.tar.gzから解凍する。
# 解凍する理由は、パッチ後の改変があったかどうかを判別するためである。
if [ ! -d $MODULE_DIR ] ; then
  $tar $ZX_OPT $MODULE_PKG_FILE > /dev/null 2>&1
  if [ $? -ne 0 ] ; then
    FLAG=1
    arize_err "dmy" "改変検知用のアップデートファイルの展開に失敗しました。"
  fi
fi

# バックアップファイルの解凍（非本体）
# ここで解凍する理由は、二重アンインストールをした際にサルベージ手違いを起こさせないためである。
# 解凍先はMODULE_DIRを間借りする。
if [ -d $MODULE_DIR ] ; then
  $tar $X_OPT $BACKUP_PKG_FILE -C $MODULE_DIR > /dev/null 2>&1
  if [ $? -ne 0 ] ; then
    FLAG=1
    arize_err "dmy" "改変検知用のバックアップファイルの展開に失敗しました。"
  fi
fi

# 新規追加ファイル情報リストの取得（バックアップからの解凍）
# ※define.shで定義されているファイル名は頭に「/」がついているので除去すること
#   解凍する時は「/」から解凍すること
ADDED_LIST_FILE_SP=`echo "$ADDED_LIST_FILE" | $sed -e s/^'\/'/''/g`
$tar $X_OPT $BACKUP_PKG_FILE -C / $ADDED_LIST_FILE_SP > /dev/null 2>&1
if [ $? -ne 0 ] ; then
  FLAG=1
  arize_err "dmy" "新規追加ファイル情報リストの展開に失敗しました。"
fi


ORG_IFS=$IFS
IFS='
'

# パッチファイルリストからパッチファイル情報(ファイル名等)を読み込み
# パッチで配布されたものは全て削除する
# 削除後にバックアップの圧縮ファイル(tar)から復旧を行う。
if [ $FLAG -eq 0 ] ; then
  if [ -s $LIST_FILE ] ; then
    
    # サルベージフラグの初期化（初期値=OFF。1つでもサルベージされたらONになる。）
    SALVAGE_FLAG=0
    
    for LINE in `$cat $LIST_FILE | grep -v '^#' | grep -v '^$'`
    do
      MODULE_FILE=`echo "$LINE" | $awk '{print $1}'`
      TARGET_OWNER=`echo "$LINE" | $awk '{print $2}'`
      TARGET_PERMIT=`echo "$LINE" | $awk '{print $3}'`
      TARGET_FILE=`echo "$LINE" | $awk '{print $4}'`
      
      
      # 改変ファイルのサルベージ          #####################################
      # パッチ適用後にカスタムで改変されたファイルを保管する。              ###
      # 現状のファイルとパッチファイルが異なる場合を、改変とみなす。        ###
      # また、二重アンインストールを考慮して、                              ###
      # 現状のファイルがバックアップと同じ場合は、非サルベージとする。      ###
      $cmp $MODULE_DIR/$MODULE_FILE $TARGET_FILE > /dev/null 2>&1
      if [ $? -ne 0 ] ; then
        # パッチのファイルと、現状のファイルが異なる -> 改変されている -> サルベージする(可能性がある)
        if [ -f $MODULE_DIR/$TARGET_FILE -a -f $TARGET_FILE ] ; then
          $cmp $MODULE_DIR/$TARGET_FILE $TARGET_FILE > /dev/null 2>&1
          if [ $? -ne 0 ] ; then
            # バックアップから復元したファイルと、現状のファイルが異なる -> 二重アンインストールではない -> サルベージする
            $tar $U_OPT $SALVAGE_PKG_FILE $TARGET_FILE > /dev/null 2>&1
            if [ $? -ne 0 ] ; then
              FLAG=1
              arize_err "dmy" "改変ファイルの救済に失敗しました。"
              arize_err "dmy" "$TARGET_FILE"
              break;
            else
              SALVAGE_FLAG=1
#              echo "$TARGET_FILE" >> $SALVAGE_LIST_FILE
            fi
          fi
        fi
      fi
      
      # パッチファイルの削除              #####################################
      # パッチファイルを配布先から削除する。                                ###
      # ただし、削除するファイルは新規追加されたファイルのみである。        ###
      # パッチで更新されたファイルはバックアップの展開で上書きされるので    ###
      # 特に問題なくパッチ適用前に復旧できるからである。                    ###
      $grep "$TARGET_FILE" $ADDED_LIST_FILE > /dev/null 2>&1
      if [ $? -eq 0 ] ; then
        # 新規追加ファイル情報リストにファイル名が存在した -> 新規追加されたファイルだ！ -> 削除する
        $rm -f $TARGET_FILE > /dev/null 2>&1
        if [ $? -ne 0 ] ; then
          FLAG=1
          arize_err "dmy" "配布済みのパッチファイルの削除に失敗しました！"
          break;
        fi
      fi
      
      echo_sp "."
      
    done
    
  else
    # SMXファイルリストが存在しない場合はエラーログを出力する
    FLAG=1
    arize_err "dmy" "予期せぬエラー：パッチ情報ファイルが存在しません。"
  fi
  
fi

IFS=$ORG_IFS


# 展開したパッチファイルを削除する。（圧縮ファイルは残る）
if [ -d $MODULE_DIR ] ; then
  $rm -rf $MODULE_DIR > /dev/null 2>&1
fi


# バックアップファイルを展開する
if [ -f $BACKUP_PKG_FILE ] ; then
#  CRT_DIR=`$pwd`
#  cd / > /dev/null                # 解凍は「/」から行う
#  $tar $X_OPT $BACKUP_PKG_FILE > /dev/null 2>&1
  $tar $X_OPT $BACKUP_PKG_FILE -C / > /dev/null 2>&1
  if [ $? -ne 0 ] ; then
    FLAG=1
    arize_err "dmy" "バックアップファイルからの復旧に失敗しました。"
  fi
#  cd $CRT_DIR > /dev/null
fi


# 結果出力
if [ $FLAG -eq 0 ] ; then
  echo "完了"
  echo ""
  if [ $SALVAGE_FLAG -eq 0 ] ; then
    msg_dialog  "${SECUREMATRIX} のバックアップファイルからの復旧に成功しました。" \
                " " \
                "処理を継続します。"
    write_log "${SECUREMATRIX} のバックアップファイルからの復旧に成功しました。"
  else
    msg_dialog  "${SECUREMATRIX} のバックアップファイルからの復旧に成功しました。" \
                " " \
                "<!> アップデート後に改変されたファイルを救済しました。" \
                "    以下のファイルに圧縮保存してあります。ご確認ください。" \
                " " \
                "$SALVAGE_PKG_FILE" \
                " " \
                "処理を継続します。"
    write_log "${SECUREMATRIX} のバックアップファイルからの復旧に成功しました。"
    write_log "アップデート後に改変されたファイルを救済しました。"
  fi
  WAIT_ENTER
else
  echo "エラー発生！"
  echo ""
  msg_err "${SECUREMATRIX} のバックアップファイルからの復旧に失敗しました。" \
          "処理を中断します。"
  arize_err "dmy" "バックアップファイルからの復旧に失敗しました。"
fi

exit $FLAG
