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

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

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

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

# 初期処理
initialize


# フラグの初期化
FLAG=0


# 開始出力
CLEAR
msg_info  "${SECUREMATRIX} のアップデートファイルを展開します。" \
          "${SECUREMATRIX} のアップデートファイル展開には時間がかかります。" \
          "しばらくお待ちください。"
#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}
if [ ! -e ${LIST_FILE} ] ; then
  # TL10S 以外は以下を使用
  LIST_FILE=${INST_HOME}/${COMMON}/${LIST_FILE_NAME}
fi
# 得たシステム情報から読み込むディレクトリを選択し、配布不要ファイル情報を作成する
ESCAPE_LIST_FILE=${INST_HOME}/${COMMON}/${ESCAPE_LIST_FILE_NAME}

# バックアップ領域の作成
if [ ! -d $BACKUP_DIR ] ; then
  $mkdir $BACKUP_DIR > /dev/null 2>&1
  if [ $? -ne 0 ] ; then
    FLAG=1
    arize_err "dmy" "バックアップ領域の作成に失敗しました。"
  fi
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
#  CRT_DIR=`$pwd`
#  cd $MODULE_DIR > /dev/null
  $tar $ZX_OPT $MODULE_PKG_FILE > /dev/null 2>&1
  if [ $? -ne 0 ] ; then
    FLAG=1
    arize_err "dmy" "パッチファイルの展開に失敗しました。"
  fi
#  cd $CRT_DIR > /dev/null
fi


ORG_IFS=$IFS
IFS='
'

# パッチファイルリストからパッチファイル情報(ファイル名等)を読み込み
if [ $FLAG -eq 0 ] ; then
  if [ -s $LIST_FILE ] ; then
    
    # 初期化処理
    DEPLOY_ERR_FLAG=0                         # 配布に失敗した場合のフラグ
    $rm -f $DEPLOY_ERR_FILE > /dev/null 2>&1  # 配布失敗ファイル保持用一時ファイルの初期化
    echo "" > $ADDED_LIST_FILE                # 新規追加ファイル情報リストの初期化
    
    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
        # パッチファイルと配布先ファイルの比較 -> 不一致 -> 配布先は旧ファイルである -> 保管する
        # バックアップに既存であるならば、そちらを優先とする（※何もしない）
        # 既存であっても内容が不一致ならば、バックアップの方を優先とする（※何もしない）
        # バックアップに存在しないならば、新規に追加する
        ADD_FLAG=0    # 追加フラグ（初期値=OFF）
        if [ -f $BACKUP_PKG_FILE ] ; then
          # ここで比較に使うTARGET_FILEからは、先頭の「/」を除去する（tar -t の特性による補正）
          TARGET_FILE_SP=`echo "$TARGET_FILE" | $sed -e s/^'\/'/''/g`
          $tar $T_OPT $BACKUP_PKG_FILE | $grep "$TARGET_FILE_SP" > /dev/null 2>&1
          if [ $? -ne 0 ] ; then
            # バックアップに存在しない -> 新規に追加する
            ADD_FLAG=1
          fi
        else
          # バックアップファイルが存在しない -> 新規作成する
          ADD_FLAG=1
        fi
        
        # 追加フラグがONであり、且つ配布先ファイルが存在する場合はバックアップする
        if [ $ADD_FLAG -eq 1 -a -f $TARGET_FILE ] ; then
          $tar $U_OPT $BACKUP_PKG_FILE $TARGET_FILE > /dev/null 2>&1
          if [ $? -ne 0 ] ; then
            FLAG=1
            arize_err "dmy" "ファイルのバックアップに失敗しました。"
            arize_err "dmy" "$TARGET_FILE"
            break;
          fi
        fi
      else
        ## cmp の結果既にファイルが存在している場合は何もしない
        continue
      fi
      ##### バックアップ完了  #################################################
      
      
      # 配布しないファイルの処理 -> バックアップのみ行うファイルはここで終了
      if [ -f ${ESCAPE_LIST_FILE} ] ; then
        $cat $ESCAPE_LIST_FILE | grep -v '^#' | grep -v '^$' | grep $MODULE_FILE > /dev/null 2>&1
        if [ $? -eq 0 ] ; then
          continue
        fi
      fi
      
      # 新規追加ファイルかどうかの判別    #####################################
      # パッチ適用されるファイルが新規追加ファイルか否かの判別を行う        ###
      # 新規追加の場合はアンインストール時に削除をするので                  ###
      # ここでテキストファイルにその情報を残しておく                        ###
      # 更新ファイルの場合、アンインストールはバックアップした旧ファイルで  ###
      # 上書き処理（tar展開）を行うので、パッチファイルは上書きされる。     ###
      if [ ! -f $TARGET_FILE ] ; then
        # 既存のファイルとして存在しない -> このパッチファイルは新規追加である
        echo "$TARGET_FILE" >> $ADDED_LIST_FILE
      fi
      
      # パッチファイルの配布              #####################################
      # パッチファイルを$MODULE_DIRから配布する。                           ###
      # 配布した後に所有者を変更する。                                      ###
      CP_RET=0
      CHOWN_RET=0
      PERMIT_RET=0
      
      $cp -f $MODULE_DIR/$MODULE_FILE $TARGET_FILE > /dev/null 2>&1
      CP_RET=$?
#      CP_RET=1  #debug
      $chown $TARGET_OWNER $TARGET_FILE > /dev/null 2>&1
      CHOWN_RET=$?
#      CHOWN_RET=1 #debug
      $chmod $TARGET_PERMIT $TARGET_FILE > /dev/null 2>&1
      PERMIT_RET=$?
#      PERMIT_RET=1 #debug
      
      if [ $CP_RET -ne 0 -o $CHOWN_RET -ne 0 -o $PERMIT_RET -ne 0 ] ; then
        DEPLOY_ERR_FLAG=1
        echo "$TARGET_FILE" >> $DEPLOY_ERR_FILE
      fi
      
      echo_sp "."
      
    done
    
    # パッチファイルの配布に失敗している場合はエラーとする
    if [ $DEPLOY_ERR_FLAG -ne 0 ] ; then
      FLAG=1
      arize_err "dmy" "アップデートファイルの配布に失敗しました。"
      arize_err "dmy" "-----配布に失敗したファイル------------------------------------------------"
      for ERR_FILE in `$cat $DEPLOY_ERR_FILE | grep -v '^#' | grep -v '^$'`
      do
        arize_err "dmy" "$ERR_FILE"
      done
      arize_err "dmy" "---------------------------------------------------------------------------"
    fi
  else
    # SMXファイルリストが存在しない場合はエラーログを出力する
    FLAG=1
    arize_err "dmy" "予期せぬエラー：アップデート情報ファイルが存在しません。"
  fi
  
  
  # 新規追加ファイル情報リストもバックアップファイルに格納する
  # 古い「新規追加ファイル情報リスト」ファイルがtarの中にあることを考慮して、事前に削除を行う。
  # ※define.shで定義されているファイル名は頭に「/」がついているので除去すること
  ADDED_LIST_FILE_SP=`echo "$ADDED_LIST_FILE" | $sed -e s/^'\/'/''/g`
  $tar $DEL_OPT $BACKUP_PKG_FILE $ADDED_LIST_FILE_SP > /dev/null 2>&1
  $tar $U_OPT $BACKUP_PKG_FILE $ADDED_LIST_FILE > /dev/null 2>&1
  if [ $? -ne 0 ] ; then
    FLAG=1
    arize_err "dmy" "ファイルのバックアップに失敗しました。"
    arize_err "dmy" "$ADDED_LIST_FILE"
  fi

fi

IFS=$ORG_IFS


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


# 結果出力
if [ $FLAG -eq 0 ] ; then
  echo "完了"
  echo ""
  msg_dialog  "${SECUREMATRIX} のアップデートファイル展開に成功しました。" \
              " " \
              "<!> バックアップファイルを以下のディレクトリに保管してあります。" \
              "    アンアップデート実行時に必要になりますので、削除はしないでください。" \
              " " \
              "    $BACKUP_DIR" \
              " " \
              "処理を継続します。"
  write_log "${SECUREMATRIX} のアップデートファイル展開に成功しました。"
  WAIT_ENTER
else
  echo "エラー発生！"
  echo ""
  msg_err "${SECUREMATRIX} のアップデートファイル展開に失敗しました。" \
          "処理を中断します。" \
          " " \
          "<!> 予期せぬエラーです。サポートに連絡してください。"
  arize_err "dmy" "${SECUREMATRIX} のアップデートファイル展開に失敗しました。"
fi

exit $FLAG
