#!/bin/sh
#Copyright (C), 2020-2024, KylinSoft. Co., Ltd.
#File name: kylin-kms-docker
#Description:  for kylin-kms 2.5
#Author:	Kylin
#
#usage: $0 {start|stop|status|monitor|validate-all|meta-data}
#
##########################################################################
# Initialization:
: ${OCF_ROOT:=/usr/lib/ocf}
: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
#########################################################################
# Defaults
OCF_RESKEY_binpath_default=/usr/bin/docker-compose
OCF_RESKEY_ymlfile_default=/opt/kms2.5/docker-compose.yml
OCF_RESKEY_name_default="kms-daemon"
: ${OCF_RESKEY_binpath=${OCF_RESKEY_binpath_default}}
: ${OCF_RESKEY_ymlfile=${OCF_RESKEY_ymlfile_default}}
: ${OCF_RESKEY_name=${OCF_RESKEY_name_default}}
name="kms-daemon"

meta_data() {
	cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="$name">
<version>1.0</version>

<longdesc lang="en">
This script manages $name
</longdesc>
<shortdesc lang="en">OCF Resource Agent compliant $name.</shortdesc>

<parameters>
<parameter name="binpath">
<longdesc lang="en">
The docker-composer binary path.
For example, "/usr/bin/docker-compose"
</longdesc>
<shortdesc lang="en">The docker-composer binary path</shortdesc>
<content type="string" default="$OCF_RESKEY_binpath_default"/>
</parameter>

<parameter name="ymlfile">
<longdesc lang="en">
The docker-compose yaml file.
For example, "docker-compose.yml"
</longdesc>
<shortdesc lang="en">The docker compose yaml</shortdesc>
<content type="string" default="$OCF_RESKEY_ymlfile_default"/>
</parameter>

<parameter name="name">
<longdesc lang="en">
The docker process name.
</longdesc>
<shortdesc lang="en">The docker process</shortdesc>
<content type="string" default="$OCF_RESKEY_name_default"/>
</parameter>

</parameters>

<actions>
<action name="start"   timeout="50" />
<action name="stop"    timeout="60" />
<action name="monitor" depth="0"  timeout="30s" interval="20s" />
<action name="monitor" role="Master" depth="0" timeout="30s" interval="10s" />
<action name="monitor" role="Slave" depth="0" timeout="30s" interval="30s" />
<action name="validate-all"  timeout="30s" />
<action name="meta-data"  timeout="5s" />
</actions>
</resource-agent>
END
}

kms_check_state() {
  str=`curl http://localhost:8090/api/server/monitor`
  res=$(echo $str | grep "master")
  res1=$(echo $str | grep "slave")
  if [[ -n $res ]]; then
    return $OCF_RUNNING_MASTER
  elif [[ -n $res1 ]]; then
    return $OCF_SUCCESS
  fi
   
  return $OCF_ERR_GENERIC 
}

kms_status() 
{
  docker ps -f name=$OCF_RESKEY_name -f status=running|grep $OCF_RESKEY_name >/dev/null 2>&1
  ret=$?
  if [ $ret -eq 0 ]; then
	return $OCF_SUCCESS;
  else
	return $OCF_NOT_RUNNING;
  fi
}

kms_start()
{
  kms_status
  ret=$?
  if [ $ret -eq 0 ]; then
    ocf_log info "$name agent already running"
    return $OCF_SUCCESS
  fi

  #docker status
  systemctl status docker.service --no-pager >/dev/null 2>&1
  ret=$?
  if [ $ret -ne 0 ];then 
	 systemctl start docker.service >/dev/null 2>&1
	 ret=$?
	 if [ $ret -ne 0 ];then
		 ocf_log err "start: Unknown error starting docker.server"
		 return $OCF_ERR_GENERIC
	 fi
  fi
	  
  start_path="$OCF_RESKEY_binpath -f $OCF_RESKEY_ymlfile up -d daemon"
  $start_path >/dev/null 2>&1
  sleep 3
  ocf_promotion_score -v 5
  kms_monitor
  ret=$?
  if (( ret == OCF_SUCCESS )) || (( ret == OCF_RUNNING_MASTER )); then
    return $OCF_SUCCESS
  fi
  
  ocf_log err "start: Unknown error starting kms"
  return $ret
}

kms_stop()
{
  kms_status
  ret=$?
  if [ $ret -eq 7 ]; then
    ocf_log info "$name agent not running"
    return $OCF_SUCCESS
  fi
  ocf_promotion_score -D  
  stop_path="$OCF_RESKEY_binpath -f $OCF_RESKEY_ymlfile stop daemon"
  $stop_path >/dev/null 2>&1
  sleep 3 

  kms_status
  ret=$?
  if [ $ret -eq 7 ]; then
    ocf_promotion_score -D
    ocf_log info "$name agent stop ok"
    return $OCF_SUCCESS;
  else
    ocf_log info "$name agent stop failed"
    return $OCF_ERR_GENERIC;
  fi

  ocf_log err "stop: Unknown error stoping kms"
  return $ret
}

kms_monitor()
{
  kms_status
  ret=$?
  #ocf_log info $ret
  if [ $ret -eq 0 ]; then
    ocf_log info " $name is running!"
    sleep 3
    kms_check_state
    ret1=$?
    if (( ret1 == OCF_RUNNING_MASTER )); then
      return $OCF_RUNNING_MASTER
    elif (( ret1 == OCF_SUCCESS )); then
      return $OCF_SUCCESS
    else
      return $OCF_ERR_GENERIC
    fi
  elif [ $ret -eq 7 ]; then
    ocf_log info "$name is not running"
    return $OCF_NOT_RUNNING
  else
    ocf_log info "$name is failed"
    return $OCF_ERR_GENERIC
  fi
}

kms_promote(){
  kms_monitor
  status=$?

  if (( $status == OCF_RUNNING_MASTER )); then
	ocf_log info "promote: Already running as master"
	return $OCF_SUCCESS
  elif (( $status != OCF_SUCCESS )); then
	ocf_log err "promote: Failed to promote, kms not running."
	return $OCF_ERR_GENERIC
  fi
  
  str1=`curl http://localhost:8090/api/server/promote`
  res1=$(echo $str | grep "200")
  if [[ -n $res1 ]]; then
      ocf_log info "promote as master"
      ocf_promotion_score -v 10
      return $OCF_SUCCESS
  fi

  ocf_log err "promote: Unknown error while promoting to master"
  return $OCF_ERR_GENERIC
}

kms_demote(){
  kms_monitor
  status=$?

  if (( $status == OCF_SUCCESS )); then
	ocf_log info "demote: Already running as slave"
	return $OCF_SUCCESS
  elif (( $status == OCF_NOT_RUNNING )); then
	ocf_log err "demote: Failed to demote, kms not running."
	return $OCF_NOT_RUNNING
  fi

  if (( $status == OCF_RUNNING_MASTER )); then
    str1=`curl http://localhost:8090/api/server/demote`
    res1=$(echo $str | grep "200")
    if [[ -n $res1 ]]; then
      ocf_log info "demote as slave"
      ocf_promotion_score -v 5
      return $OCF_SUCCESS
    fi
  fi

  ocf_log err "demote: Unknown error while demoting to slave"
  return $OCF_ERR_GENERIC
}

kms_validate()
{
  return $OCF_SUCCESS
}

case $1 in
    start)	kms_start
		;;
	
    stop)	kms_stop
    		;;
		
    status)	kms_status
    		;;
		
    monitor)	kms_monitor
    		;;

    promote)	kms_promote
    		;;
		
    demote)	kms_demote
    		;;

    validate-all)	kms_validate
    			exit  $OCF_SUCCESS
    			;;
			
    meta-data)	meta_data
                exit  $OCF_SUCCESS
  		;;
    *)
                ocf_log err "$0 was called with unsupported arguments: $*"
                exit $OCF_ERR_UNIMPLEMENTED
                ;;
esac
exit $?
