#!/bin/sh
# ---------------------------------------------- #

##### タイトル定義 ###############################
SECUREMATRIX="SECUREMATRIX"

##### 環境変数の設定 #############################
# 環境変数の読み込み
. ${INST_HOME}/define.sh

LANG=C;LANGUAGE=C;
export LANG LANGUAGE


##### Function ###################################
#----- 画面クリア -------------------------------#
CLEAR(){
  $clear
}

#----- ENTER入力待ち ----------------------------#
WAIT_ENTER(){
  $echo "<<< Enterキーを押してください >>>"
  read enter
}

#----- 中断処理 ---------------------------------#
quit(){
UN=""
if [ "${1}" != "install" ] ; then
  UN="アン"
fi
$echo "
*********** ${SECUREMATRIX} の${UN}アップデートを中断しました。 *************
"
  exit 1
}

#----- root権限チェック -------------------------#
check_root(){
  RTC=/tmp/rootchecker
  touch $RTC > /dev/null 2>&1
  chown root:root $RTC > /dev/null 2>&1
  if [ $? = 1 ] ; then
    $rm -f $RTC > /dev/null 2>&1
    $echo ""
    $echo "警告：アップデートはroot権限で実行してください。"
    $echo ""
    exit 1
#    quit
  fi
  $rm -f $RTC > /dev/null 2>&1
}

#----- 初期処理 ---------------------------------#
initialize(){
  if [ -z "`$echo -n`" ] ; then
      ECHO_SP1=-n
      ECHO_SP2=
  else
      ECHO_SP1=
      ECHO_SP2='\c'
  fi
  
  # パッチインストーラ情報の読み込み
  getPII
}

#----- 入力待ち型出力 ---------------------------#
echo_sp(){
    $echo $ECHO_SP1 "$@" $ECHO_SP2
}

#----- エラー発生処理 ---------------------------#
# インストーラ用と同じ引数を受け、処理内容を変えている。（オーバーロード）
arize_err(){        # args:エラーコード,追加文言
  add_msg=$2                                  # 文言
  DATE=`$date`
  $echo "[${DATE}] ${add_msg}" >> $ERR_LOG_FILE
}

#----- ログ出力 ---------------------------------#
# インストーラ用と同じ引数を受け、処理内容を変えている。（オーバーロード）
write_log(){        # args:ログ出力文
  MSG=$1
  DATE=`date`
  $echo "[${DATE}] ${MSG}" >> $LOG_FILE
#  $echo "${MSG}" >> $LOG_FILE
}

#----- 一時ファイル削除 -------------------------#
CLEAR_FILE () {
  $rm -f ${TMP_FILE}
}

#----- 入力値を変数に保持(ｎ択式) ---------------#
read_response_n_select(){   # args:戻値変数名,質問文,ログ出力文,解１,解２,...,解ｎ
  
  RETURN=$1
  QUESTION=$2
  LOG_NAME=$3
  declare -a ANS
  
  # 解ｎ個を取得する
  ANS_CNT=0
  PRM_NUM=4                       # 4番目からが解である。
  while [ $PRM_NUM -ne 0 ] ; do
    eval ANS_VAL="\${$PRM_NUM}"
    if [ -n "$ANS_VAL" ] ; then
      ANS[$ANS_CNT]=${ANS_VAL}
      ANS_CNT=`expr $ANS_CNT + 1`
      PRM_NUM=`expr $PRM_NUM + 1`
#debug"      echo "ANS=${ANS[$ANS_CNT]}"
    else
      PRM_NUM=0
    fi
  done
  
  eval DEFAULT_RESPONSE=\${$1}
  
  INPUT=""
  while [ -z "$INPUT" ]; do
      $echo "$QUESTION"
      echo_sp "[$DEFAULT_RESPONSE] : "
      read INPUT
      if [ -z "$INPUT" ]; then
          INPUT=$DEFAULT_RESPONSE
      fi
      ANS_CHECK_FLAG=0
      for ANS_CHECK in ${ANS[*]}
      do
#debug#        echo "ANS_CHECK = $ANS_CHECK"
        if [ "$INPUT" = "$ANS_CHECK" ] ; then
          # 用意した解ｎの値と一致した入力ならばフラグを立てる->入力を有効と認める
          ANS_CHECK_FLAG=1
        fi
      done
      if [ $ANS_CHECK_FLAG -eq 0 ] ; then
        INPUT=""
      fi
      if [ ! -z "$INPUT" ]; then
          RESPONSE=$INPUT
      fi
  done
  $echo ""
  eval $RETURN=$RESPONSE
  
  # ログ出力（ログ出力文がnullの場合は出力しない)
  if [ "$LOG_NAME" != "" ] ; then
    write_log "Input : $LOG_NAME = [$RESPONSE]"
  fi
}

#----- 設定ファイルのバックアップ ---------------#
backup_file(){  # args:original_file,backup_file
  
  ORG_FILE=$1
  BAK_FILE=$2
  
  if [ -r $ORG_FILE ] ; then
    write_log "File backup. [$ORG_FILE -> $BAK_FILE]"
    
    $cp $ORG_FILE $BAK_FILE > /dev/null 2>&1
    RET=$?
    if [ $RET -eq 1 ] ; then
      # バックアップに失敗した場合はログにそれを書き記しておく
      # バックアップに失敗しても処理は継続させたいため
      write_log "!!! Failed in file backup. !!!"
      exit 1
    fi
  fi
}

#----- パラメータ設定用プロパティファイルから読み込み --------------#
load_setup_properties(){
  
ORG_IFS=$IFS
IFS='
'
  LOAD_FILE=$SETUP_PROPERTIES_FILE
  
  if [ -s $LOAD_FILE ] ; then
    for LINE in `$cat $LOAD_FILE | grep -v '^#' | grep -v '^$'`
    do
      eval $LINE > /dev/null 2>&1
      if [ $? -ne 0 ] ; then
        arize_err "FNC002" "File. [$LOAD_FILE]"
        $echo ""
        msg_err "設定情報ファイルの読み込みに失敗しました。" "処理を中断します。" " " "[ 読み込みに失敗した設定ファイル ]" "---------------------------------------------------------------------------" "${LOAD_FILE}"
        exit 1
      fi
    done
  else
    # 設定ファイルが存在しない場合はログにその旨を出力する
    write_log "!!! Not exist setup properties file. [$LOAD_FILE] !!!"
  fi
IFS=$ORG_IFS
}

#----- パッチインストーラ情報の読み込み ----------------------------#
getPII(){
  # バージョン情報は define.sh から取得
  NOW_SMX_DETAIL_VERSION="${TO_VER}"
  
  # サーバ情報は SMX_INFO から取得
  eval `$cat ${INST_HOME}/SMX_INFO | $grep SVR_FULL` ;
  NOW_SMX_SVR_FULL="${SVR_FULL}"
}

#----- msg_***系処理の動的文言出力 ---------------------------------#
echo_for_msg(){   # args:文言,枠線の文字
  MSG="$1"
  LINE_CHAR="$2"
  
  if [ -n "$MSG" -a "$MSG" != "" ] ; then     # 文言が有る場合のみ表示する
    WC=`$echo "$MSG" | $wc -c`                 # 文言の長さ(WorcCount...実際の長さより1大きい)
    SP_NUM=`expr 76 - $WC`                    # 必要な余白(Space)の数(79文字-左端2文字-WC-1)
    SP_CNT=0
    SP_STR=""
    while [ $SP_NUM -gt $SP_CNT ]
    do
      SP_STR=${SP_STR}" "                               # 余白生成
      SP_CNT=`expr $SP_CNT + 1`
    done
    $echo "${LINE_CHAR} ${MSG}${SP_STR} ${LINE_CHAR}"    # 出力
  fi
}

#----- 標準メッセージ出力 ------------------------------------------#
msg_info(){  # args:message(1-8)
#  echo ""
  $echo "+-----------------------------------------------------------------------------+"
  echo_for_msg "${SECUREMATRIX} Updater  /  ${NOW_SMX_SVR_FULL}  /  Version ${NOW_SMX_DETAIL_VERSION}" "|"
  $echo "|-----------------------------------------------------------------------------|"
  i=1
  while [ $i -le 21 ]                           # 最大21行まで対応可能
  do
    eval MSG=\${$i}
    echo_for_msg "$MSG" "|"
    i=`expr $i + 1`
  done
  $echo "+-----------------------------------------------------------------------------+"
  $echo ""
}

#----- エラーメッセージ出力 ----------------------------------------#
msg_err(){  # args:message(1-8)
#  echo ""
  $echo "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *"
  echo_for_msg "${SECUREMATRIX} Error!! / ${NOW_SMX_SVR_FULL} / Version ${NOW_SMX_DETAIL_VERSION}" "*"
  $echo "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *"
  i=1
  while [ $i -le 18 ]                           # 最大18行まで対応可能
  do
    eval MSG=\${$i}
    echo_for_msg "$MSG" "*"
    i=`expr $i + 1`
  done
  
  $echo "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *"
  $echo ""
  
}

#----- 標準ダイアログ出力 ------------------------------------------#
msg_dialog(){  # args:message(1-8)
#  echo ""
  $echo "+-----------------------------------------------------------------------------+"
  i=1
  while [ $i -le 12 ]                           # 最大12行まで対応可能
  do
    eval MSG=\${$i}
    echo_for_msg "$MSG" "|"
    i=`expr $i + 1`
  done
  $echo "+-----------------------------------------------------------------------------+"
  $echo ""
}

#----- エラーダイアログ出力 ----------------------------------------#
msg_warn(){  # args:message(1-8)
#  echo ""
  $echo "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *"
  i=1
  while [ $i -le 12 ]                           # 最大12行まで対応可能
  do
    eval MSG=\${$i}
    echo_for_msg "$MSG" "*"
    i=`expr $i + 1`
  done
  $echo "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *"
  $echo ""
}



#----- ディストリビューション選択 ---------------#
read_response_distribution(){
  
  declare -a DISTRIBUTE_KIND
  declare -a DISTRIBUTE_SHORT
  
  DISTRIBUTE_KIND[1]="Red Hat Linux 7.3"                 ;DISTRIBUTE_SHORT[1]="RH73";
  DISTRIBUTE_KIND[2]="Red Hat Linux 9"                   ;DISTRIBUTE_SHORT[2]="RH9";
  DISTRIBUTE_KIND[3]="Red Hat Enterprise Linux AS 2.1"   ;DISTRIBUTE_SHORT[3]="RHAS21";
  DISTRIBUTE_KIND[4]="Red Hat Enterprise Linux ES 2.1"   ;DISTRIBUTE_SHORT[4]="RHES21";
  DISTRIBUTE_KIND[5]="Red Hat Enterprise Linux AS 3.0"   ;DISTRIBUTE_SHORT[5]="RHELAS30";
  DISTRIBUTE_KIND[6]="Red Hat Enterprise Linux ES 3.0"   ;DISTRIBUTE_SHORT[6]="RHELES30";
  DISTRIBUTE_KIND[7]="Turbolinux 8 Server"               ;DISTRIBUTE_SHORT[7]="TL8S";
  
  read_response_n_select DISTRIBUTE "◆ パッチを適用するディストリビューションを選択してください $LF　 (1) ${DISTRIBUTE_KIND[1]} $LF　 (2) ${DISTRIBUTE_KIND[2]} $LF　 (3) ${DISTRIBUTE_KIND[3]} $LF　 (4) ${DISTRIBUTE_KIND[4]} $LF　 (5) ${DISTRIBUTE_KIND[5]} $LF　 (6) ${DISTRIBUTE_KIND[6]} $LF　 (7) ${DISTRIBUTE_KIND[7]}" "DISTRIBUTE" "1" "2" "3" "4" "5" "6" "7"
  
  DISTRIBUTE_NAME="${DISTRIBUTE_KIND[$DISTRIBUTE]}"     # 入力値の確認用に表示する文字列
  DISTRIBUTE_DIR="${DISTRIBUTE_SHORT[$DISTRIBUTE]}"     # ディストリビューションに対応したディレクトリ名
  
#  case "$DISTRIBUTE" in
#    "1")
#        DISTRIBUTE_NAME="${DISTRIBUTE_KIND[1]}"         # 入力値の確認用に表示する文字列
#        DISTRIBUTE_DIR="${DISTRIBUTE_SHORT[1]}"         # ディストリビューションに対応したディレクトリ名
#        ;;
#    "2")
#        DISTRIBUTE_NAME="${DISTRIBUTE_KIND[2]}"         # 入力値の確認用に表示する文字列
#        DISTRIBUTE_DIR="${DISTRIBUTE_SHORT[2]}"         # ディストリビューションに対応したディレクトリ名
#        ;;
#    "3")
#        DISTRIBUTE_NAME="${DISTRIBUTE_KIND[3]}"         # 入力値の確認用に表示する文字列
#        DISTRIBUTE_DIR="${DISTRIBUTE_SHORT[3]}"         # ディストリビューションに対応したディレクトリ名
#        ;;
#    "4")
#        DISTRIBUTE_NAME="${DISTRIBUTE_KIND[4]}"         # 入力値の確認用に表示する文字列
#        DISTRIBUTE_DIR="${DISTRIBUTE_SHORT[4]}"         # ディストリビューションに対応したディレクトリ名
#        ;;
#  esac
  
}

#----- ディストリビューション出力 ---------------#
echo_response_distribution(){
  
  $echo "[ ディストリビューション ]"
  $echo "+------------+----------------------------------------------------------------+"
  $echo "             | ${DISTRIBUTE_NAME}"
  
}

#----- パラメータ入力(ディストリビューション) ----------------------#
select_distribute(){
  
  write_log "Input parameter."
  
  # パラメータ入力
  CLEAR
  msg_info "${SECUREMATRIX}のパラメータ入力を開始します。"
  
  # ディストリビューションの情報入力   ########################################
  msg_dialog "ディストリビューション : 情報入力"
  read_response_distribution
  #############################################################################
  
  
  CLEAR
  
  # 入力結果確認
  msg_info "${SECUREMATRIX}パラメータ : 入力内容を確認してください。"
  echo_response_distribution
  $echo ""
  
  msg_dialog "入力内容に問題がなければ次の処理に進みます。" "入力内容はよろしいですか？"
  
  response="hoge"
  while [ ! -z "$response" -a "$response" != y -a "$response" != n ]
  do
    echo_sp "次へ進む:[y]es / 入力に戻る:(n)o : "
    read response
  done
  
  if [ -z "$response" -o "$response" = y ]; then
    FLAG=1
  elif [ "$response" = n ]; then
    FLAG=0
    write_log "Retry parameter input."
  fi
}

#----- パッチ展開可能バージョン情報取得 ----------------------------#
get_patch_scope(){    # args : MSG_CHAR , HEADER_CHAR
  MSG_CHAR="$1"        # 頭に空白が無いとうまくいかない
  HEADER_CHAR=" $2"     # 頭に空白が無いとうまくいかない
  RESPONSE_STR=""
  
  AWKNUM=`$echo $SCOPE_VER | awk '{print NF}'`
#debug#  echo $AWKNUM
  CNT=0
  while [ $CNT -ne $AWKNUM ]
  do
    CNT=`expr $CNT + 1`
    if [ $CNT -eq 1 ] ; then
      TMP_VER_STR=`$echo $SCOPE_VER | awk '{print $'$CNT'}'`
      RESPONSE_STR="${MSG_CHAR}Ver-${TMP_VER_STR}"
    else
      TMP_VER_STR=`$echo $SCOPE_VER | awk '{print $'$CNT'}'`
      RESPONSE_STR="${RESPONSE_STR}${HEADER_CHAR}Ver-${TMP_VER_STR}"
    fi
  done
  $echo "$RESPONSE_STR"
}

#----- 初期処理 ---------------------------------#
init_install(){
  # install.iniの初期化
  $echo > ${INSTALL_INI}
}

#----- securematrix_infomartion.txt の読み込み ---------------------#
getSMXINFO(){
  if [ -f ${SMX_INFO_TXT_FILE} ] ; then
    eval `$cat ${SMX_INFO_TXT_FILE} | grep DISTRIBUTION_MINI`
    getSItmp=${DISTRIBUTION_MINI}
    NOW_SMX_DIST=`$echo ${getSItmp}`
    
    eval `$cat ${SMX_INFO_TXT_FILE} | grep SVR_MINI`
    getSItmp=${SVR_MINI}
    NOW_SMX_SVR=`$echo ${getSItmp}`
  else
    # file no exist -> unexpected error! -> set value "UNKNOWN"
    NOW_SMX_DIST="${UNKNOWN_WORD}"
    NOW_SMX_SVR="${UNKNOWN_WORD}"
  fi
}


#----- admin.properties から認証サーバの FQDN を取得する -----------#
getFQDN(){
  if [ -f ${ADMIN_PROPERTIES_FILE} ] ; then
    PriFQDN=`$cat ${ADMIN_PROPERTIES_FILE} | $grep ^"AUTH1_FQDN" | $awk -F'=' '{print $NF}'`
    SecFQDN=`$cat ${ADMIN_PROPERTIES_FILE} | $grep ^"AUTH2_FQDN" | $awk -F'=' '{print $NF}'`
    ownFQDN=`$cat ${ADMIN_PROPERTIES_FILE} | $grep ^"ADMIN_FQDN" | $awk -F'=' '{print $NF}'`
    if [ "${ownFQDN}" = "${PriFQDN}" ] ; then
      brsFQDN="${SecFQDN}"
    else
      brsFQDN="${PriFQDN}"
    fi
  else
    write_log "ERROR : No file exist! [ ${ADMIN_PROPERTIES_FILE} ]"
    msg_err "設定情報ファイルの読み込みに失敗しました。" \
            "処理を中断します。" \
            " " \
            "[ 読み込みに失敗した設定ファイル ]" \
            "---------------------------------------------------------------------------" \
            "${ADMIN_PROPERTIES_FILE}"
    exit 1
  fi
}

#----- クラスタ状態確認 --------------------------------------------#
get_auth_cluster_mode(){
  # admin.properties の FQDN から認証サーバのクラスタの有無を返す
  # 戻り値：1=シングル構成の場合 , 2=クラスタ構成の場合
  getFQDN
  if [ -z "${SecFQDN}" ] ; then
    # セカンダリのFQDNが null -> 1台構成である
    return 1
  else
    # その逆は 2台構成である
    return 2
  fi
}

#----- プライマリ判別 ----------------------------------------------#
isPrimaryAuth(){
  # admin.properties の FQDN から認証サーバのクラスタの有無を返す
  # 自分自身がプライマリか否かの判別をする
  # 戻り値：0=自分はプライマリである , 1=自分はセカンダリである
  getFQDN
  if [ "${ownFQDN}" = "${PriFQDN}" ] ; then
    # AdminFQDN = PrimaryFQDN -> 自分がプライマリ
    return 0
  else
    # その逆は セカンダリ
    return 1
  fi
}

#----- Radius 使用判別 ---------------------------------------------#
isUseRadius(){
  # service_list から Radius サーバの使用の有無を返す
  # 戻り値：0=使用する , 1=使用しない
  $cat ${SMX_SERVICE_LIST_FILE} | $grep ^'Radius' > /dev/null 2>&1
  if [ $? -eq 0 ] ; then
    # Radius の行がコメントアウトされていない -> 使用する
    return 0
  else
    # 使用しない
    return 1
  fi
}

#----- 機能別パッチインストール済みチェック -------------------------#
already_patch(){
  # 既存ファイル(REALFILE)から既に値(CHECK_VALUE)が適用されているかチェック
  # return : 0=未適用 , 1=適用済み
  REALFILE=$1
  CHECK_VALUE=$2
  $cat ${REALFILE} | $grep ${CHECK_VALUE} > /dev/null 2>&1 
  if [ $? -eq 0 ] ; then
    # 適用する
    return 0
  else
    # 適用しない
    return 1
  fi
}

#----- インストール失敗モジュール戻し ------------------------------#
back_module(){
  # バックアップファイルを展開し、インストール前の状態に戻す
  if [ -f $BACKUP_PKG_FILE ] ; then
    $echo "モジュールをアップデート前の状態に戻します。" | $tee -a ${ERR_LOG_FILE}
    $tar $X_OPT $BACKUP_PKG_FILE -C / > /dev/null 2>&1
    if [ $? -ne 0 ] ; then
      $echo "バックアップファイルの解凍に失敗しました。" | $tee -a ${ERR_LOG_FILE}
      $echo "<!> 予想外のエラーです。サポートに御連絡ください。" | $tee -a ${ERR_LOG_FILE}
      return 1
    fi
    ## 新規追加ファイルの削除
    # 新規追加ファイル情報リストの取得（バックアップからの解凍）
    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
      $echo "新規追加ファイル情報リストの展開に失敗しました。" | $tee -a ${ERR_LOG_FILE}
      $echo "<!> 予想外のエラーです。サポートに御連絡ください。" | $tee -a ${ERR_LOG_FILE}
      return 1
    fi
    IFS_ORG=$IFS
    IFS='
'
    for DEL_FILE in `$cat /${ADDED_LIST_FILE_SP} | grep -v '^#' | grep -v '^$'`
    do
      # 新規追加ファイル情報リストにファイル名が存在した -> 新規追加されたファイルだ！ -> 削除する
      arize_err "dmy" "[ ${DEL_FILE} ] 削除"
      $rm -f $DEL_FILE > /dev/null 2>&1
      if [ $? -ne 0 ] ; then
        $echo "新規追加ファイルの削除に失敗しました。" | $tee -a ${ERR_LOG_FILE}
        $echo "<!> 予想外のエラーです。サポートに御連絡ください。" | $tee -a ${ERR_LOG_FILE}
        return 1
      fi
    done
    IFS=$IFS_ORG
    if [ -f ${BACKUP_DELETE_FILE} ] ; then
      $tar $X_OPT $BACKUP_DELETE_FILE -C / > /dev/null 2>&1
      if [ $? -ne 0 ] ; then
        $echo "バックアップ DELETE FILE の解凍に失敗しました。" | $tee -a ${ERR_LOG_FILE}
        $echo "<!> 予想外のエラーです。サポートに御連絡ください。" | $tee -a ${ERR_LOG_FILE}
        return 1
      fi
    fi
  else
    $echo "バックアップファイルが存在しません。" | $tee -a ${ERR_LOG_FILE}
    $echo "<!> 予想外のエラーです。サポートに御連絡ください。" | $tee -a ${ERR_LOG_FILE}
    return 1
  fi
}

#----- jsch 戻し -----------------------------------------------#
jsch_restore(){
  TYPE=${1}
  if [ "${TYPE}" = "error" ] ; then
    arize_err "dmy" "EasySetup モジュール戻し"
  else
    write_log "EasySetup モジュール戻し"
  fi
  if [ -f "${INST_HOME}/${JSCH_FLG}" ] ; then
    if [ "${TYPE}" = "error" ] ; then
      arize_err "dmy" "EasySetup パッチモジュールがインストールされていた事を確認したのでスキップします。"
    else
      write_log "EasySetup パッチモジュールがインストールされていた事を確認したのでスキップします。"
    fi
    $rm -f ${INST_HOME}/${JSCH_FLG}
  else
    # シンボリックリンクを削除する
    rm -f ${oldJschFile} > /dev/null 2>&1
  
    # アップデート前に古いファイルがあった場合、新ファイルを削除する
    if [ -f ${bak2JschFile} -o -f ${bakJschFile} ] ; then
      rm -f ${newJschFile} > /dev/null 2>&1

      #バックアップから戻す
      if [ -f ${bak2JschFile} ] ; then
        cp -p ${bak2JschFile} ${old2JschFile} > /dev/null 2>&1
        BAK_FLG=$?
      else
        cp -p ${bakJschFile} ${oldJschFile} > /dev/null 2>&1
        BAK_FLG=$?
      fi
  
      if [ ${BAK_FLG} -ne 0 ] ; then
        arize_err "dmy" "${SECUREMATRIX} EasySetup のバックアップモジュールの復旧に失敗しました。"
        echo "エラー発生！"
        echo ""
        msg_err "${SECUREMATRIX} EasySetup のモジュール復旧に失敗しました。" \
                "処理を中断します。" \
                " " \
                "<!> 予期せぬエラーです。サポートに連絡してください。"
        return 1
      fi

      # 0.1.37 パッチが当たっていた場合はシンボリックリンクを張り直す
      if [ -f ${old2JschFile} ] ; then
        $ln -s ${old2JschFile} ${oldJschFile} > /dev/null 2>&1
      fi
  
      # 最後に、バックアップは削除する
      if [ -f ${bak2JschFile} ] ; then
        rm -f ${bak2JschFile} > /dev/null 2>&1
      else
        rm -f ${bakJschFile} > /dev/null 2>&1
      fi
    fi
  fi

  if [ "${TYPE}" = "error" ] ; then
    arize_err "dmy" "EasySetup モジュール戻し完了"
  else
    write_log "EasySetup モジュール戻し完了"
  fi
}

#----- アップデート失敗 DB 戻し ------------------------------------#
back_db(){
  # DB のバックアップファイルを展開し、アップデート前の DB 状態に戻す
  $echo "DB をアップデート前の状態に戻します。" | $tee -a ${ERR_LOG_FILE}
  $echo "DB プロセスを停止します。" | $tee -a ${ERR_LOG_FILE}
  # クラスタ構成チェック
  if [ ${CLUSTER} -eq 1 ] ; then
    $PGPOOL_STOP > /dev/null 2>&1
  fi
  $PGSQL_STOP > /dev/null 2>&1
  sleep 3
  $tar ${ZX_OPT} ${BACKUP_DIR}/var_opt_cse.tar.gz -C / > /dev/null 2>&1
  if [ $? -ne 0 ] ; then
    $echo "予想外のエラーが発生しました。[DB ロールバック]" | $tee -a ${ERR_LOG_FILE}
    $echo "サポートまで御連絡ください。" | $tee -a ${ERR_LOG_FILE}
    return 1
  fi
  $echo "DB をアップデート前の状態に戻しました。" | $tee -a ${ERR_LOG_FILE}
  return 0
}


# new_win_module に対になる winlogon 設定処理戻し
win_restore(){
  ERROR_FLG=${1}
  # delete XP&VISTA directory
  if [ "${ERROR_FLG}" = "error" ] ; then
    arize_err "dmy" "windows ログオンモジュール設定戻し"
  else
    write_log "windows ログオンモジュール設定戻し"
  fi
  $rm -rf ${WIN_XP_FILE_PATH} > /dev/null 2>&1
  $rm -rf ${WIN_VISTA_FILE_PATH} > /dev/null 2>&1
  $rm -f ${WIN_DOWNLOAD_PATH}/${WIN_XP_DOWNLOAD_MODULE} > /dev/null 2>&1
  $rm -f ${WIN_DOWNLOAD_PATH}/${WIN_VISTA_DOWNLOAD_MODULE} > /dev/null 2>&1
  # backup_module restore
  $tar $ZX_OPT ${BACKUP_WIN} -C / > /dev/null 2>&1
  if [ "${ERROR_FLG}" = "error" ] ; then
    arize_err "dmy" "windows ログオンモジュール設定戻し完了"
  else
    write_log "windows ログオンモジュール設定戻し完了"
  fi
}

#----- backup.sh の退避(アップデート完了finalize 後に消す) -----#
file_swap(){
  BACKUPSH=backup.sh
  BACKUPLIST=backup.list
  if [ ! -d ${BACKUP_TMP_DIR} ] ; then
    $mkdir ${BACKUP_TMP_DIR}
  fi
  $cp -p ${BACKUP_BIN}/* ${BACKUP_TMP_DIR}
  PWD_NOW=`$pwd`
  cd ${BACKUP_TMP_DIR}
  BAK_PWD=`$pwd`
  $cp -p ${BACKUPSH} BACKTMP > /dev/null 2>&1
  $cat BACKTMP | $sed -e s/'\/backup\/bin'/'\/home\/smxd\/ver-3_3_0\/backup_tmp'/g > ${BACKUPSH}
  $cp -p ${BACKUPLIST} BACKLIST > /dev/null 2>&1
  $cat BACKLIST | $grep '\/var\/opt\/cse' > ${BACKUPLIST}
  cd $PWD_NOW
}

#----- プロパティの不要行を削除する ------#
props_line_delete(){
  PROPS=${1}
  DELKEY=${2}
  $cat ${PROPS} | $grep -v ${DELKEY} > TMP_PROPS
  $cp -f TMP_PROPS ${PROPS} > /dev/null 2>&1
  $chmod 644 ${PROPS}
  $chown smxd:smxd ${PROPS}
  $rm -f TMP_PROPS > /dev/null 2>&1
}

#----- 汎用性のない Ver-3.3.0 専用特殊処理 -----#
#----- web.xml 等の行削除に使用 ----------------#
session_timeout_keep(){
  # param web.xml fullpath
  STK=`$cat ${1} | $grep "<session-timeout>"`
}

#----- エラー時のファイル書き換え処理の戻し ----#
reverse_param(){
  # reverse_parse_param.sh の silent モードを作成
  # LOG_FILE の指定
  LOG_FILE=$ERR_LOG_FILE
  arize_err "dmy" "パラメータを戻します。"
  ${INST_HOME}/reverse_parse_param.sh ${1} "silent"
  if [ $? -eq 1 ] ; then
    arize_err "dmy" "パラメータの戻しに失敗しました。"
    # モジュール戻し
    back_module
    # Win 情報の書き戻し
    win_restore "error"
    # 中断
    quit "install"
  fi
}

#----- DB 戻し発生時の中断処理 -------------------------------#
quit_sp(){
UN=""
if [ "${1}" != "install" ] ; then
  UN="アン"
fi

## クラスタ構成時は同期がずれるので、clusterManager.sh で復旧してもらう
msg_info  "${SECUREMATRIX} の${UN}アップデートを中断しました。" \
          " " \
          "バックアップしておいたファイルからデータ復旧をしているため、" \
          "プライマリ認証サーバ及びセカンダリ認証サーバ間におけるデータベースの" \
          "整合性が一致していない可能性があります。" \
          " " \
          "プライマリ認証サーバ及びセカンダリ認証サーバの" \
          "中断処理が両方完了した後に以下のコマンドを実行してください。" \
          " " \
          "${CLUSTER_MAN_CMD}" \
          " " \
          "復旧(3) -> 起動(1) の順番で実行し、データベースの整合性を合わせてください。" \
          " " \
          "<!> データベースの整合性を合わせた後にプライマリ認証サーバ及び" \
          "    セカンダリ認証サーバにおいて以下のコマンドを忘れずに実行してください。" \
          " " \
          "   （コマンドは、root権限で実行してください。）"

  exit 1
}

#----- Ver-3.3 専用 ISB プロミスキャスモード対応 --------#
isbpromisc(){
  CONF_TMP=conf_tmp
  ISB_PRO_FLAG=0
  PATCH_FLAG=0

  # isbshconf.cfg に追記処理を行う
  write_log "isbpromisc_write start"
  $cat $CONFIGFILE > $CONF_TMP
  CNT=`eval "$grep -c $PROMISC_STR $CONF_TMP"`
  if [ $CNT -eq 0 ]; then
     `eval "$echo $PROMISC_STR $PROMISC_OFF >> $CONF_TMP"`
     if [ $? -ne 0 ]; then
        msg_err "<!> エラー発生"
                "ISB プロミスキャス設定に失敗しました。"
        arize_err "dmy" "ISB プロミスキャス設定に失敗しました。"
        ISB_PRO_FLAG=1
     else
       $cp -f $CONF_TMP $CONFIGFILE > /dev/null 2>&1
     fi
  else
    PATCH_FLAG=1
  fi

  if [ $ISB_PRO_FLAG -eq 0 ] ; then
    $cat $INST_CONFIGFILE > $CONF_TMP
    CNT1=`eval "$grep -c $PROMISC_STR $CONF_TMP"`
    if [ $CNT1 -eq 0 ]; then
       `eval "$echo $PROMISC_STR $PROMISC_OFF >> $CONF_TMP"`
       if [ $? -ne 0 ]; then
          msg_err "<!> エラー発生"
                  "ISB プロミスキャス設定に失敗しました。"
          arize_err "dmy" "ISB プロミスキャス設定に失敗しました。"
          ISB_PRO_FLAG=1
       else
         $cp -f $CONF_TMP $INST_CONFIGFILE > /dev/null 2>&1
       fi
    fi
  else
    PATCH_FLAG=1
  fi
  $rm $CONF_TMP
  if [ $ISB_PRO_FLAG -eq 0 ] ; then
    write_log "isbpromisc_write end"
    # アンアップデート用のフラグファイルを作成
    # パッチ対応済みの場合と区別付けるため
    if [ $PATCH_FLAG -eq 0 ] ; then
      if [ ! -d "${BACKUP_DIR}" ] ; then
        $mkdir ${BACKUP_DIR} > /dev/null 2>&1
      fi
      $touch $BACKUP_DIR/isbpromisc_flg
    fi
  else
    # 中途半端な設定を想定して戻す
    isbpromisc_back
    # 中断
    quit "install"
  fi
}

#------  Ver-3.3 専用 ISB プロミスキャスモード対応 --------#
isbpromisc_back(){
  CONF_TMP=conf_tmp
  ISB_PRO_FLAG=0
  if [ -f "$BACKUP_DIR/isbpromisc_flg" ] ; then
	  # isbshconf.cfg に追記処理を行う
	  write_log "isbpromisc_back start"
	  $cat $CONFIGFILE | $grep -v $PROMISC_STR > $CONF_TMP
	  $cp -f $CONF_TMP $CONFIGFILE > /dev/null 2>&1
	
	  $cat $INST_CONFIGFILE | $grep -v $PROMISC_STR > $CONF_TMP
	  $cp -f $CONF_TMP $INST_CONFIGFILE > /dev/null 2>&1

	  write_log "isbpromisc_back end"
  else
    write_log "isbpromisc_back skip"
  fi
}
