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

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

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

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


#--------+---------+---------+---------+---------+---------+---------+---------+
# 関数定義
#--------+---------+---------+---------+---------+---------+---------+---------+
#-- インスタンスの起動
function EXEC_START () {
  FLWAIT=$1

  NOWSTAT=`${CMDDIR}/psm AUTOANALYTICSINST service -s ${INSTNM} |grep Status |grep Ready |wc -l`

  #-- 処理終了するまでプロンプトを待機させる場合
  if [[ ${NOWSTAT} -eq 0 && ${FLWAIT} == "wait" ]];then
    ${CMDDIR}/psm AUTOANALYTICSINST start-service -s ${INSTNM} -wc true

    if [[ $? -ne 0 ]];then
      echo "[Error] [Exec ] `date +%Y/%m/%d\ %H:%M:%S` OAC Instance (${INSTNM}) インスタンス起動" \
        >> ${LGPATH}/${OUTPUT}
      exit 2
    fi
  #-- 処理後、稼働状況をチェックして指定した時間を超過する場合は警告で終了させる場合
  elif [[ ${NOWSTAT} -eq 0 && ${FLWAIT} == "check" ]];then
    ${CMDDIR}/psm AUTOANALYTICSINST start-service -s ${INSTNM}

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

    while true
    do
      sleep ${CNT_TM}

      EXEC_STATUS
      if [[ "${NOWSTAT}" == "AVAILABLE" ]];then
        break
      else
        if [[ ${CHKFLG} -le ${CHKCNT} ]];then
          echo "[Warn ] [Exec ] `date +%Y/%m/%d\ %H:%M:%S` OAC 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}/psm AUTOANALYTICSINST service -s ${INSTNM} |grep Status |grep stopped |wc -l`

  #-- 処理終了するまでプロンプトを待機させる場合
  if [[ ${NOWSTAT} -eq 0 && ${FLWAIT} == "wait" ]];then
    ${CMDDIR}/psm AUTOANALYTICSINST stop-service -s ${INSTNM} -wc true

    if [[ $? -ne 0 ]];then
      echo "[Error] [Exec ] `date +%Y/%m/%d\ %H:%M:%S` OAC Instance (${INSTNM}) インスタンス停止" \
        >> ${LGPATH}/${OUTPUT}
      exit 2
    fi
  #-- 処理後、稼働状況をチェックして指定した時間を超過する場合は警告で終了させる場合
  elif [[ ${NOWSTAT} -eq 0 && ${FLWAIT} == "check" ]];then
    ${CMDDIR}/psm AUTOANALYTICSINST stop-service -s ${INSTNM}

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

    while true
    do
      sleep ${CNT_TM}

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

#-- インスタンスの状態をチェック
function EXEC_STATUS () {
  CHKSTAT=`${CMDDIR}/psm AUTOANALYTICSINST service -s ${INSTNM} |grep Status |cut -d: -f2`

  if [[ `echo ${CHKSTAT} |grep Ready |wc -l` -eq 1 ]];then
    NOWSTAT="AVAILABLE"
  elif [[ `echo ${CHKSTAT} |grep stopped |wc -l` -eq 1 ]];then
    NOWSTAT="STOPPED"
  elif [[ `echo ${CHKSTAT} |grep Starting |wc -l` -eq 1 ]];then
    NOWSTAT="STARTING"
  elif [[ `echo ${CHKSTAT} |grep maintenance |wc -l` -eq 1 ]];then
    NOWSTAT="STOPPING"
  else
    echo "[Error] [Exec ] `date +%Y/%m/%d\ %H:%M:%S` OAC Instance (${INSTNM}) インスタンス状態が不明" \
      >> ${LGPATH}/${OUTPUT}
    exit 2
  fi 
}


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

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

echo "[Info ] [Exec ] `date +%Y/%m/%d\ %H:%M:%S` OAC 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` OAC Instance (${INSTNM}) ステータス ====> ${NOWSTAT}" \
      | tee -a ${LGPATH}/${OUTPUT}
    ;;
  *)
    echo "[Error] [Exec ] `date +%Y/%m/%d\ %H:%M:%S` OAC Instance (${INSTNM}) 実行処理が不明" \
      >> ${LGPATH}/${OUTPUT}
    exit 2
    ;;
esac


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

exit 0
