#!/bin/sh
# SMX RPM install for patch uninstall
# ---------------------------------------------- #

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

# メモリリークパッチ対策フラグが存在していれば、pgpool-3.4.1.1-1 に戻す
# フラグが存在しなければ、pgpool-2.7-1 に戻す
already_memory(){
  if [ -f ${BACKUP_DIR}/MEMOL_FLAG ] ; then
    NEW_RPM=`$echo $NEW_RPM | $awk -F ',' '{print $2}'`
  else
    NEW_RPM=`$echo $NEW_RPM | $awk -F ',' '{print $1}'`
  fi
}

##### 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
# 得たシステム情報から読み込むディレクトリを選択し、配布ファイル情報を作成する
# アンインストール用のファイルを読み込む
RPM_FILE=${INST_HOME}/${NOW_SMX_DIST}/${INSTALL_RPM4UNINST_FILENAME}
if [ ! -e ${RPM_FILE} ] ; then
  # TL10S 以外は全て下記(Ver3.3.0では何もしないが、処理として残す)
  RPM_FILE=${INST_HOME}/${COMMON}/${INSTALL_RPM4UNINST_FILENAME}
fi


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

# アップデートモジュールの解凍
# RPMファイルを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


ORG_IFS=$IFS
IFS='
'

# RPMパッチリストを解析する
# APPLY_VER : 適用バージョン情報
# TYPE1      : 新規インストール(i)、既存アップグレード(U)
# NEW_RPM   : 新バージョンRPMファイル名
# NEW_PKG   : 新バージョンRPMパッケージ名
# OLD_RPM   : 旧バージョンRPMファイル名
# OLD_PKG   : 旧バージョンRPMパッケージ名
# SPE_NUM   : 特殊ケースな番号
#             ※ 1:メモリリークがインストール済みであったか確認する
if [ $FLAG -eq 0 ] ; then
  if [ -s $RPM_FILE ] ; then
    for LINE in `$cat $RPM_FILE | $grep -v '^#' | $grep -v '^$'`
    do
      APPLY_VER=`echo "$LINE" | $awk '{print $1}'`
      TYPE1=`echo "$LINE" | $awk '{print $2}'`
      NEW_RPM=`echo "$LINE" | $awk '{print $3}'`
      NEW_PKG=`echo "$LINE" | $awk '{print $4}'`
      OLD_RPM=`echo "$LINE" | $awk '{print $5}'`
      OLD_PKG=`echo "$LINE" | $awk '{print $6}'`
      SPE_NUM=`echo "$LINE" | $awk '{print $7}'`
      # ダウングレード用のTYPE
      TYPE2=""
      
      # 実行適用バージョンであるかを判別する -> 適用可能バージョンであれば処理を実行する
      # 現在のバージョンは、install.iniから抽出する(OLD_VERSION=*.*.*)
      eval `$cat ${INSTALL_INI} | $grep "OLD_VERSION"`

      # 対象バージョンを１つずつ分解
      # OLD_VERSION と完全一致した THIS_VER のみ RPM 戻し
      APP_FLG=0
      BFO_IFS=$IFS
      IFS=','
      for THIS_VER in "${APPLY_VER}"
      do
        $echo $THIS_VER | $grep -w $OLD_VERSION > /dev/null 2>&1
        if [ $? -eq 0 ] ; then
          APP_FLG=1
          break;
        fi
      done
      IFS=$BFO_IFS

      if [ $APP_FLG -eq 1 ] ; then
        # 新バージョンがインストール済みか否かをチェックする
        if [ "$NEW_PKG" != "" -a -n "$NEW_PKG" ] ; then
          # TL10 はバージョンアップした過程によって、pgpool のバージョンが
          # 異なるので、2種類の pgpool バージョンをチェックする
          # grep に成功する時 G_FLG=0 となる
          G_FLG=1
          for PKG_LINE in `$echo $NEW_PKG | $awk -F ',' '{for (j=1; j<=NF; j++) print $j}'`
            do
              $rpm -qa | $grep "$PKG_LINE" > /dev/null 2>&1
              if [ $? -eq 0 ] ; then
                G_FLG=0
                break;
              fi
            done
          if [ $G_FLG -eq 0 ] ; then
            # 新バージョンが既にインストールされている -> パッチインストール中断
            FLAG=1
            arize_err "dmy" "既にパッチが適用されています。"
            break;
          fi
        else
          # 新バージョンのパッケージ名が得られない場合はエラーとする
          FLAG=1
          arize_err "dmy" "アップデートモジュール情報ファイルに不具合があります。"
          break;
        fi
        
        # タイプ別処理
        if [ "$TYPE1" = "U" ] ; then
          # 既存アップグレードの場合は、旧バージョンの有無をチェックする
          if [ "$OLD_PKG" != "" -a -n "$OLD_PKG" ] ; then
            $rpm -qa | $grep "$OLD_PKG" > /dev/null 2>&1
            if [ $? -ne 0 ] ; then
              # 旧バージョンがインストールされていない -> パッチインストール中断
              FLAG=1
              arize_err "dmy" "アップグレード対象のミドルウェアがインストールされていません。"
              break;
            fi
          else
            # 旧バージョンのパッケージ名が得られない場合はエラーとする
            FLAG=1
            arize_err "dmy" "アップデートモジュール情報ファイルに不具合があります。"
            break;
          fi
        elif [ "$TYPE1" = "O" ] ; then
          # ダウングレードの場合は、新バージョンの有無をチェックする
          if [ "$OLD_PKG" != "" -a -n "$OLD_PKG" ] ; then
            $rpm -qa | $grep "$OLD_PKG" > /dev/null 2>&1
            if [ $? -ne 0 ] ; then
              # 新バージョンがインストールされていない -> パッチインストール中断
              FLAG=1
              arize_err "dmy" "ダウングレード対象のミドルウェアがインストールされていません。"
              break;
            fi
          else
            # 新バージョンのパッケージ名が得られない場合はエラーとする
            FLAG=1
            arize_err "dmy" "アップデートモジュール情報ファイルに不具合があります。"
            break;
          fi
          # ダウングレードの形に直す
          TYPE1="U"
          TYPE2="--oldpackage"
        fi

        # TL10 はアップデートした過程によって、元のバージョンが異なるので
        # 以下のチェック処理を行う。
        # メモリリークパッチ対策フラグが存在していれば、pgpool-3.4.1.1-1 に戻す
        # フラグが存在しなければ、pgpool-2.7-1 に戻す
        # SPE_NUM=1 の時だけ実行される
        if [ "$SPE_NUM" != "" ] ; then
          if [ $SPE_NUM -eq 1 ] ; then
            already_memory
          fi
        fi

        # RPMパッケージを展開する
        if [ -f "$MODULE_DIR/$NEW_RPM" ] ; then
          $rpm -$TYPE1 $TYPE2 $MODULE_DIR/$NEW_RPM > /dev/null 2>&1
          if [ $? -ne 0 ] ; then
            FLAG=1
            arize_err "dmy" "RPMパッケージのダウングレードに失敗しました。"
            break;
          fi
        else
          # 新バージョンファイルが存在しない -> エラーとする
          FLAG=1
          arize_err "dmy" "ミドルウェアパッチのRPMファイルが存在しません。"
          break;
        fi
        
      else
        write_log "RPM の変更が不要の為、スキップします。"
      fi
      
      echo_sp "."
      
    done
  else
#    FLAG=1
#    arize_err "dmy" "パッチモジュール情報ファイルが存在しません。"
    # ファイルが存在しない場合はRPM更新が発生しない
    write_log "No exist update RPM."
  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} のミドルウェアパッチ展開に成功しました。" \
              " " \
              "処理を継続します。"
  write_log "${SECUREMATRIX} のミドルウェアパッチ展開に成功しました。"
  WAIT_ENTER
else
  echo "エラー発生！"
  echo ""
  msg_err "${SECUREMATRIX} のミドルウェアパッチ展開に失敗しました。" \
          "処理を中断します。"
  arize_err "dmy" "ミドルウェアパッチ展開に失敗しました。"
fi

exit $FLAG
