#!/bin/bash
#####+++
# スクリプト名      - atp_ctl.bash
# 機能名            - Autonomous Transaction Processing 起動 or 停止 or 状態確認
# 作成環境          - Red Hat Enterprise Linux 7.6
#                     oci 2.6.8
# 入力引数          - $1 : リージョン名    ex) us-ashburn-1
#                     $2 : インスタンス名
#                     $3 : 実行処理            start | stop | status
#                     $4 : 処理の完了まで待機  wait | check （起動・停止の処理で指定）
# 入力ファイル      - N/A
# 出力ファイル      - Log File  : /unyo/log/<スクリプト名>_<インスタンス名>_<実行処理>_YYYYMMDD_HHMMSS.log
# 戻り値            - 正常終了  0
#                     警告終了  1
#                     異常終了  2
# 修正履歴
#   日付          バージョン  作成者／修正者      履歴
#    2019/10/31    1.0         xxxxxxxxx           初期
#####---
#--------+---------+---------+---------+---------+---------+---------+---------+
# 変数定義
#--------+---------+---------+---------+---------+---------+---------+---------+
CNF_NM=$1
INSTNM=$2
EXECOP=$3
EXWAIT=$4

SHNAME=`basename $0 |cut -d. -f1`
YYMMDD=`date +%Y%m%d_%H%M%S`
OUTPUT=${SHNAME}_${INSTNM}_${EXECOP}_${YYMMDD}.log
C_TIME=60
CHKFLG=15
CHKCNT=0

HTPROXY=http://xx.xx.xx.xx:yyyy
SCTDIR=/unyo/script
LGPATH=/unyo/log
CMDDIR=/u01/app/oci/bin
OCICNF=/u01/app/oci/config


#--------+---------+---------+---------+---------+---------+---------+---------+
# 事前処理
#--------+---------+---------+---------+---------+---------+---------+---------+
#-- 引数のチェック
if [[ $# -ne 3 && $# -ne 4 ]];then
  echo "引数が正しくありません"
  exit 2
fi

#-- configファイルの確認
if [[ ! -f ${OCICNF}/${CNF_NM} ]];then
  echo "ATP config ファイルが見つかりません"
  exit 2
fi

#-- インスタンス情報ファイルの確認
if [[ ! -f ${OCICNF}/${CNF_NM}.list ]];then
  echo "インスタンス情報のリストファイルが見つかりません"
  exit 2
fi


#--------+---------+---------+---------+---------+---------+---------+---------+
# 関数定義
#--------+---------+---------+---------+---------+---------+---------+---------+
#-- インスタンスの起動
function EXEC_START () {
  FLWAIT=$1
  
  NOWSTAT=`${CMDDIR}/oci db autonomous-database get \
    --autonomous-database-id "${ATPOCID}" \
    --config-file ${OCICNF}/${CNF_NM} \
    |grep lifecycle-state \
    |awk '{print $2}' \
    |cut -d\" -f2`

  #-- 処理終了するまでプロンプトを待機させる場合
  if [[ "${NOWSTAT}" != "AVAILABLE" && ${FLWAIT} == "wait" ]];then
    ${CMDDIR}/oci db autonomous-database ${EXECOP} \
      --autonomous-database-id "${ATPOCID}" \
      --config-file ${OCICNF}/${CNF_NM} \
      --wait-for-state AVAILABLE
      > /dev/null 2>&1

    if [[ $? -ne 0 ]];then
      echo "[Error] [Exec ] `date +%Y/%m/%d\ %H:%M:%S` ATP Instance (${INSTNM}) インスタンス起動" \
        >> ${LGPATH}/${OUTPUT}
      exit 2
    fi
  #-- 処理後、稼働状況をチェックして指定した時間を超過する場合は警告で終了させる場合
  elif [[ "${NOWSTAT}" != "AVAILABLE" && ${FLWAIT} == "check" ]];then
    ${CMDDIR}/oci db autonomous-database ${EXECOP} \
      --autonomous-database-id "${ATPOCID}" \
      --config-file ${OCICNF}/${CNF_NM} \
      > /dev/null 2>&1

    #-- インスタンスの状態をチェック
    echo "[Info ] [Check] `date +%Y/%m/%d\ %H:%M:%S` ATP Instance (${INSTNM}) インスタンス状態チェック" \
      >> ${LGPATH}/${OUTPUT}

    while true
    do
      sleep ${C_TIME}

      EXEC_STATUS
      if [[ "${NOWSTAT}" == "AVAILABLE" ]];then
        break
      else
        if [[ ${CHKFLG} -le ${CHKCNT} ]];then
          echo "[Warn ] [Exec ] `date +%Y/%m/%d\ %H:%M:%S` ATP Instance (${INSTNM}) Could not Start in Time   " \
            >> ${LGPATH}/${OUTPUT}
          exit 1
        else
          CHKCNT=`expr ${CHKCNT} + 1`
        fi
      fi
    done
  fi
}

#-- インスタンスの停止
function EXEC_STOP () {
  FLWAIT=$1
  
  NOWSTAT=`${CMDDIR}/oci db autonomous-database get \
    --autonomous-database-id "${ATPOCID}" \
    --config-file ${OCICNF}/${CNF_NM} \
    |grep lifecycle-state \
    |awk '{print $2}' \
    |cut -d\" -f2`

  #-- 処理終了するまでプロンプトを待機させる場合
  if [[ "${NOWSTAT}" != "STOPPED" && ${FLWAIT} == "wait" ]];then
    ${CMDDIR}/oci db autonomous-database ${EXECOP} \
      --autonomous-database-id "${ATPOCID}" \
      --config-file ${OCICNF}/${CNF_NM} \
      --wait-for-state STOPPED
      > /dev/null 2>&1

    if [[ $? -ne 0 ]];then
      echo "[Error] [Exec ] `date +%Y/%m/%d\ %H:%M:%S` ATP Instance (${INSTNM}) インスタンス停止" \
        >> ${LGPATH}/${OUTPUT}
      exit 2
    fi
  #-- 処理後、稼働状況をチェックして指定した時間を超過する場合は警告で終了させる場合
  elif [[ "${NOWSTAT}" != "STOPPED" && ${FLWAIT} == "check" ]];then
    ${CMDDIR}/oci db autonomous-database ${EXECOP} \
      --autonomous-database-id "${ATPOCID}" \
      --config-file ${OCICNF}/${CNF_NM} \
      > /dev/null 2>&1

    #-- インスタンスの状態をチェック
    echo "[Info ] [Check] `date +%Y/%m/%d\ %H:%M:%S` ATP Instance (${INSTNM}) インスタンス状態チェック" \
      >> ${LGPATH}/${OUTPUT}

    while true
    do
      sleep ${C_TIME}

      EXEC_STATUS
      if [[ "${NOWSTAT}" == "STOPPED" ]];then
        break
      else
        if [[ ${CHKFLG} -le ${CHKCNT} ]];then
          echo "[Warn ] [Exec ] `date +%Y/%m/%d\ %H:%M:%S` ATP Instance (${INSTNM}) Could not Stop in Time" \
            >> ${LGPATH}/${OUTPUT}
          exit 1
        else
          CHKCNT=`expr ${CHKCNT} + 1`
        fi
      fi
    done
  fi
}

#-- インスタンスの状態をチェック
function EXEC_STATUS () {
  NOWSTAT=`${CMDDIR}/oci db autonomous-database get \
    --autonomous-database-id "${ATPOCID}" \
    --config-file ${OCICNF}/${CNF_NM} \
    |grep lifecycle-state \
    |awk '{print $2}' \
    |cut -d\" -f2`
}


#--------+---------+---------+---------+---------+---------+---------+---------+
# メイン処理
#--------+---------+---------+---------+---------+---------+---------+---------+
echo "[Info ] [Start] `date +%Y/%m/%d\ %H:%M:%S` ATP Instance (${INSTNM}) 開始処理" \
  >> ${LGPATH}/${OUTPUT}

#-- プロキシ環境の場合、Pythonを実行する為に定義
export HTTPS_PROXY=${HTPROXY}

#-- 対象インスタンスのOCID取得
ATPOCID=`grep ${INSTNM} ${OCICNF}/${CNF_NM}.list |awk '{print $2}'`
if [[ ${ATPOCID} == "" ]];then
  echo "[Error] [Check] 対象インスタンスのOCIDが見つかりません   " \
    >> ${LGPATH}/${OUTPUT}
  exit 2
fi

#-- スクリプト内で権限関連の余計なメッセージを抑制
export OCI_CLI_SUPPRESS_FILE_PERMISSIONS_WARNING=True

echo "[Info ] [Exec ] `date +%Y/%m/%d\ %H:%M:%S` ATP Instance (${INSTNM}) メイン処理" \
  >> ${LGPATH}/${OUTPUT}

case ${EXECOP} in
  start)
    #-- インスタンスの起動
    EXEC_START ${EXWAIT}
    ;;
  stop)
    #-- インスタンスの停止
    EXEC_STOP ${EXWAIT}
    ;;
  status)
    #-- インスタンスの状態をチェック
    EXEC_STATUS
    echo "[Info ] [Check] `date +%Y/%m/%d\ %H:%M:%S` ATP Instance (${INSTNM}) ステータス ====> ${NOWSTAT}" \
      | tee -a ${LGPATH}/${OUTPUT}
    ;;
  *)
    echo "[Error] [Exec ] `date +%Y/%m/%d\ %H:%M:%S` ATP Instance (${INSTNM}) 実行処理が不明" \
      >> ${LGPATH}/${OUTPUT}
    exit 2
    ;;
esac


#--------+---------+---------+---------+---------+---------+---------+---------+
# 事後処理
#--------+---------+---------+---------+---------+---------+---------+---------+
echo "[Info ] [End  ] `date +%Y/%m/%d\ %H:%M:%S` ATP Instance (${INSTNM}) 終了処理" \
  >> ${LGPATH}/${OUTPUT}

exit 0
