#!/bin/bash

#
#巡检S3关键服务
#所有节点执行检查,不同类型节点检查的关键服务有区别
#
#1.queue              所有节点检查
#2.memcache           所有几点检查
#3.osc                所有节点检查
#4.s3fs               所有节点检查
#5.s3fs_bill          所有节点检查
#6.dns                OMS节点检查
#7.dcm                主OMS节点检查
#8.poe                主OMS节点检查
#9.poe management ip  主OMS节点检查
#10.visitor           主OMS节点检查
#11.gaussdb           主OMS节点检查
#12.gaussdb float ip  主OMS节点检查

#daemon相关脚本
readonly OSC_MONITOR_SCRIPT="/opt/obs/service/osc/bin/osc_monitor.sh"
readonly QUEUE_MONITOR_SCRIPT="/opt/obs/service/queue/bin/queue_monitor.sh"
readonly MEMCACHE_SCRIPT="/opt/obs/service/memcache/bin/memcache.sh"
readonly UDS_S3FS_SCRIPT="/opt/obs/scripts/s3fs/uds_s3fs.sh"
readonly UDS_S3FS_BILL_SCRIPT="/opt/obs/scripts/s3fs/uds_s3fs_bill.sh"
readonly UDS_DNS="/opt/obs/scripts/dns/nsd_service.sh"
readonly UDS_DNS_STATMON="/opt/obs/scripts/dns/statmon_service.sh"

#ha 相关脚本
readonly MDC_DCM_HA_SCRIPT="/opt/huawei/ha/plugin/mdcdcm.sh"
readonly POE_HA_SCRIPT="/opt/huawei/ha/plugin/poe"
readonly VISITOR_HA_SCRIPT="/opt/huawei/ha/plugin/visitor"
readonly POE_MANAGEMENT_IP_SCRIPT="/opt/huawei/ha/plugin/bussinessfloatip.sh"
readonly GAUSSDB_MANAGEMENT_IP_SCRIPT="/opt/huawei/ha/plugin/upffloatip.sh"
readonly MDC_DB_HA_SCRIPT="/opt/huawei/ha/plugin/mdcdb.sh"
readonly GAUSSDB_HA_SCRIPT="/opt/huawei/ha/plugin/rcommgsdb"

DAEMON_PROCESSES_SCRIPTS=(    \
"${QUEUE_MONITOR_SCRIPT}"        \
"${MEMCACHE_SCRIPT}"             \
"${OSC_MONITOR_SCRIPT}"          \
"${UDS_S3FS_SCRIPT}"             \
"${UDS_S3FS_BILL_SCRIPT}"        \
)

#HA相关进程
HA_PROCESSES=(          \
"POE"                      \
"DCM"                      \
"visitor"                  \
"POE Management IP"        \
"GaussDB Management IP"    \
)

#受daemon监控的进程，dns只管理节点上启动，单独处理
DAEMON_PROCESSES=(   \
"queue"                 \
"memcache"              \
"osc"                   \
"s3fs"                  \
"s3fs_bill"             \
)

#CM_INI_PATH
readonly CM_INI_PATH="/opt/huawei/snas/etc/cm.ini"

NODE_TYPE=
isPass=0
errPro=""

readonly PRIMARY_TYPE="Primary"    #主
readonly STANDBY_TYPE="Standby"    #备
readonly BUSINESS_TYPE="Business"  #业务节点

# 数据库查询状态返回码
declare -i db_normal=0           #   正常运行
declare -i db_abnormal=1         #   运行异常    
declare -i db_stopped=2          #   停止         
declare -i db_unknown=3          #   状态未知    
declare -i db_starting=4         #   正在启动
declare -i db_stopping=5         #   正在停止
declare -i db_primary=6          #   主正常运行
declare -i db_standby=7          #   备正常运行
declare -i db_activating=8       #   正在升主 
declare -i db_deactivating=9     #   正在降备
declare -i db_notsupported=10    #   动作不存在
declare -i db_repairing=11       #   正在修复


#判断该节点是否需要检查,返回：1，需要检查；0，不需要检查
function isNotNeedCheck()
{
    local isNotNeedCheck=1
    #获取节点类型标识
    node_service_type=$(egrep '[[]|^'node_service_type'=' /opt/huawei/snas/etc/snas.ini | tr -d '\n' | grep -Po '(?<=[[]'NODE'[]]'node_service_type'=)[0-9]+')
    if [ "${node_service_type}" = "2" -o "${node_service_type}" = "3" ]; then
    
        NODE_TYPE="${BUSINESS_TYPE}"
        source /opt/obs/scripts/common/s3_config_utility.sh >> /dev/null 2>&1 
        #判断是否是s3管理节点
        is_s3_management_node > /dev/null
        if [ $? -eq 1 ];then
            localNID=$(grep -w NID ${CM_INI_PATH}|awk -F"=" '{print $2}')
            hainfo=$(grep -w "node id(${localNID})" /proc/monc_hamap)
            if [ "$hainfo" = "" ];then
                NODE_TYPE="${BUSINESS_TYPE}"
            else
                role=${hainfo##*role(}
                role=${role%%)status*}
                
                if [ "$role" = "1" ];then
                    NODE_TYPE="${PRIMARY_TYPE}"
                elif [ "$role" = "2" ];then
                    NODE_TYPE="${STANDBY_TYPE}"
                fi
            fi
        fi        
    else
        isNotNeedCheck=0      
    fi
    return $isNotNeedCheck
}

#===================================================
# 函数名称：s3_primary_node_ha_check
# 函数功能：检查S3主节点的HA相关进程
# 描述：
#===================================================
function s3_primary_node_ha_check()
{
    sh ${POE_HA_SCRIPT} status > /dev/null 2>&1
    [[ $? -ne 0 ]] && appendErrorPro "poe"
    
    sh ${MDC_DCM_HA_SCRIPT} status > /dev/null 2>&1
    [[ $? -ne 0 ]] && appendErrorPro "dcm"
    
    sh ${VISITOR_HA_SCRIPT} status > /dev/null 2>&1
    [[ $? -ne 0 ]] && appendErrorPro "visitor"
    
    sh ${POE_MANAGEMENT_IP_SCRIPT} status > /dev/null 2>&1
    [[ $? -ne 0 ]] && appendErrorPro "poe management ip"
    
    sh ${GAUSSDB_MANAGEMENT_IP_SCRIPT} status > /dev/null 2>&1
    [[ $? -ne 0 ]] && appendErrorPro "gaussdb management ip"

    sh ${GAUSSDB_HA_SCRIPT} status > /dev/null 2>&1
    [[ $? -ne ${db_primary} ]] && appendErrorPro "upfdb"
  
    sh ${MDC_DB_HA_SCRIPT} status  > /dev/null 2>&1
    [[ $? -ne ${db_primary} ]] && appendErrorPro "mdcdb"
}

#===================================================
# 函数名称：s3_standby_node_ha_check
# 函数功能：检查S3备节点的HA相关进程
# 描述：
#===================================================
function s3_standby_node_ha_check()
{
    sh ${GAUSSDB_HA_SCRIPT} status > /dev/null 2>&1
    [[ $? -ne ${db_standby} ]] && appendErrorPro "upfdb"

    sh ${MDC_DB_HA_SCRIPT} status  > /dev/null 2>&1
    [[ $? -ne ${db_standby} ]] && appendErrorPro "mdcdb"
}

#===================================================
# 函数名称：s3_daemon_process_check
# 函数功能：检查S3受daemon监控的进程
# 描述：
#===================================================
function s3_daemon_process_check()
{
    local count=${#S3_DAEMON_PROCESSES[@]}
    local i=0
    for (( i=0; i<count; i=i+1 ))
    do
        sh "${S3_DAEMON_PROCESSES_SCRIPTS[i]}" status > /dev/null 2>&1
        [[ $? -ne 0 ]] && appendErrorPro "DAEMON_PROCESSES[i]"
    done
}

#===================================================
# 函数名称：s3_dns_process_check
# 函数功能：检查管理节点上受daemon监控的dns
# 描述：    在检查主节点进程时调用
#===================================================
function s3_dns_process_check()
{
    sh ${UDS_DNS} status > /dev/null 2>&1
    [[ $? -ne 0 ]] && appendErrorPro "dns"
}

#===================================================                                                                                                                                    
# 函数名称：checkS3KeyService                                                                                                                                                      
# 函数功能: 检查S3关键服务主函数入口                                                                                                                                      
# 描述：                                                                                                                                                    
#===================================================
function checkS3KeyService()
{
    
    if [ "X${NODE_TYPE}" == "X${PRIMARY_TYPE}" ];then
       #poe,dcm,
       s3_primary_node_ha_check
       s3_dns_process_check
    elif [ "X${NODE_TYPE}" == "X${STANDBY_TYPE}" ];then
       s3_dns_process_check
    fi
    
    #queue,memcached,osc,s3fs,s3fs_bill
    s3_daemon_process_check 
    
    #打印
    echo "nodeType:${NODE_TYPE}"
    echo "isPass:${isPass}"
    echo "errPro:${errPro}" 
}

#===================================================                                                                                                                                    
# 函数名称：checkS3KeyService                                                                                                                                                      
# 函数功能: 检查S3关键服务主函数入口                                                                                                                                      
# 描述：                                                                                                                                                    
#===================================================
function appendErrorPro()
{
     if [ "X${errPro}" == "X" ];then
          errPro="$1"
     else
          errPro="${errPro},$1"
     fi
}

#如果不需要检查，则直接退出脚本执行,输出isCheck:0
if isNotNeedCheck;then
    echo "isCheck:0"
    exit 0;
fi

#开始检查S3关键服务
echo "isCheck:1"
checkS3KeyService
