#!/bin/bash
# Date: 2021-11-18
# Author: Lixin
# Email: lixinb@uniontech.com
# Description: Tool for checking the Basic Functions of the Cluster
# Version: 1.0

#配置日志
LOG_DIR="/var/log/ha-check"
ha_check_log="/var/log/ha-check/ha-check.log"

RED="\033[31m"
YELLOW="\033[33m"
GREEN="\033[32m"
END="\033[0m"

TIME=`date +'%F %T'`

function log() {
    echo "`date +'%F %T'` $@"
}

function error_exit()
{
    echo "$@"
    exit 1
}

# 主机名解析检测
#########################################################
function check_hostname() 
{
    LOCAL_IP=$(ifconfig |grep inet|grep -v "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.1" |grep -v inet6 | awk '{print $2}')
    HOSTNAME=$(hostname)
    if [ "$HOSTNAME" = "localhost.localdomain" ] ;then
            echo -e "[$TIME]主机名解析检测$RED[失败]$END"
            echo "主机名未修改"
            return 0
    fi
    for IP in $LOCAL_IP; do
        node_name=$(cat /etc/hosts | grep $IP | awk '{print $2}')
        if [ "$node_name" = "$HOSTNAME" ]; then
            echo -e "[$TIME]主机名解析检测$GREEN[成功]$END"
            echo "主机名: $HOSTNAME解析成功"
            log "主机名: $HOSTNAME解析成功" >> $ha_check_log
            break
        else
            echo -e "[$TIME]主机名解析检测$RED[失败]$END"
            echo "无法解析主机名: $HOSTNAME"
            log "无法解析主机名: $HOSTNAME" >> $ha_check_log
        fi
    done
}

# 检测IP地址合法性
##########################################################
function check_ip()
{
    IP=$1
    # IP地址需由4部分数字组成，每个部分以点分割且不能大于255
    if [[ $IP =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
        FIELD1=$(echo $IP|cut -d. -f1)
        FIELD2=$(echo $IP|cut -d. -f2)
        FIELD3=$(echo $IP|cut -d. -f3)
        FIELD4=$(echo $IP|cut -d. -f4)
        if [ $FIELD1 -le 255 -a $FIELD2 -le 255 -a $FIELD3 -le 255 -a $FIELD4 -le 255 ]; then
	    echo -e "[$TIME]主机名解析检测$GREEN[成功]$END"
	    log "主机名$HOSTNAME解析成功" >> $ha_check_log
        else
	    echo -e "[$TIME]主机名解析检测$RED[失败]$END"
            echo "无效的IP地址: $IP !"
	    log "无效的IP地址: $IP !" >> $ha_check_log
        fi
    else
	echo -e "[$TIME]主机名解析检测$RED[失败]$END"
        echo "IP格式错误"
	log "IP格式错误" >> $ha_check_log
    fi
}

# 检测时间同步
##########################################################
function check_NTP_service()
{
    TIME_SERVICE="chronyd.service"
    
    check_service_available $TIME_SERVICE
    if [ $? -eq 0 ];then
	echo -e "[$TIME]时间同步服务检测$GREEN[成功]$END"
	echo "$SERVICE_NAME服务可用"
	log "$SERVICE_NAME服务可用" >> $ha_check_log
	
	check_service_enabled $TIME_SERVICE
	if [ $? -eq 0 ];then
           echo "$SERVICE_NAME已启用开机启动"
           log "$SERVICE_NAME已启用开机启动" >> $ha_check_log
        else
           echo -e "$YELLOW警告$END:$SERVICE_NAME禁用了开机启动"
           log "$SERVICE_NAME禁用了开机启动" >> $ha_check_log
        fi

	check_service_active $TIME_SERVICE
	if [ $? -eq 0 ];then
	    echo "$SERVICE_NAME正在运行"
            log "$SERVICE_NAME正在运行" >> $ha_check_log
	else
            echo -e "$YELLOW警告$END:$SERVICE_NAME没有运行"
            log "$SERVICE_NAME没有运行" >> $ha_check_log
	fi

    else
	echo -e "[$TIME]时间同步服务检测$RED[失败]$END"
	echo -e "$RED错误$END:$TIME_SERVICE,找不到chronyd服务，请检查是否安装了chrony"
    fi
   
}

#检测服务是否可用
##########################################################
function check_service_available()
{
    local rc
    SERVICE_NAME=$1
    
    rc=$(systemctl list-unit-files | grep $SERVICE_NAME )
    if [[ -n $rc ]]; then
	return 0
    fi
	return 1
}


#检测服务是否开机启动
##########################################################
function check_service_enabled()
{
    local rc
    SERVICE_NAME=$1

    rc=$(systemctl is-enabled $SERVICE_NAME)
    if [ "$rc" = "enabled" ]; then
	return 0
    else
	return 1
    fi
}

#检测服务是否运行
##########################################################
function check_service_active()
{
    SERVICE_NAME=$1
    
    svc_state=$(systemctl is-active $SERVICE_NAME)
    if [ "$svc_state" = "active" ]; then
	return 0
    else
	return 1
    fi
}

#检测防火墙
##########################################################
function check_firewall()
{
    FIREWALL_SERVICE="firewalld.service"
    
    check_service_active $FIREWALL_SERVICE
    if [ $? -eq 0 ]; then
	echo -e "[$TIME]防火墙检测$GREEN[开启]$END"
	check_service_enabled $FIREWALL_SERVICE
	if [ $? -eq 0 ]; then
	    echo "$FIREWALL_SERVICE已启用开机启动"
	    log "$FIREWALL_SERVICE已启用开机启动" >> $ha_check_log
	else
	    echo "$FIREWALL_SERVICE已禁用开机启动"
	    log "$FIREWALL_SERVICE已禁用开机启动" >> $ha_check_log
	fi
	
        check_port_available

    else
    	echo -e "[$TIME]防火墙检测$YELLOW[关闭]$END"
    fi

}

function check_port_available()
{
    local rc
    pcsd_port="2224/tcp"
    pacemaker_port="3121/tcp"

    echo "检测端口状态:"

    rc=$(firewall-cmd --query-port=$pacemaker_port)
    if [ "$rc" == "yes" ];then
        echo -e "pacemaker端口: $pacemaker_port已开启$GREEN[开启]$END"
	log "pacemaker端口: $pacemaker_port已开启" >> $ha_check_log
    else
        echo -e "pacemaker端口: $pacemaker_port已关闭$RED[关闭]$END"
	log "pacemaker端口: $pacemaker_port已关闭" >> $ha_check_log
    fi

    rc=$(firewall-cmd --query-port=$pcsd_port)
    if [ "$rc" == "yes" ];then
	echo -e "pcsd端口: $pcsd_port已开启$GREEN[开启]$END"
	log "pcsd端口: $pcsd_port已开启" >> $ha_check_log
    else
	echo -e "pcsd端口: $pcsd_port已关闭$RED[关闭]$END"
	log "pcsd端口: $pcsd_port已关闭" >> $ha_check_log
    fi
}


function is_cluster_service_running()
{
    local rc
    rc=0
    cluster_service="pacemaker corosync"

    for svc in $cluster_service; do
       check_service_active $cluster_service
       if [ $? -ne 0 ]; then
           rc=1
       fi
    done

    if [ $rc -eq 1 ]; then
	log "集群没有在本节点运行" >> $ha_check_log
	return 1
    fi
}

function check_ssh_free_login()
{
    ssh -o NumberOfPasswordPrompts=0 -o PasswordAuthentication=no -o StrictHostKeyChecking=no -o ConnectTimeout=3 root@$1 "ls" &>/dev/null
    if [ $? -ne 0 ];then
        echo "本节点没有与$1配置免密通信"
	log "本节点没有与$1配置免密通信" >> $ha_check_log
        return 1
    fi
}


# Initiate ha-log
##########################################################
if [ ! -d "$LOG_DIR" ]; then
    mkdir /var/log/ha-check/
fi

if [ ! -f "$ha_check_log" ];then
    touch /var/log/ha-check/ha-check.log
    log "新建$ha_check_log完成"
else
    log "$ha_check_log已存在" >> $ha_check_log
    echo "" > $ha_check_log
    log "$ha_check_log已清空" >> $ha_check_log
fi

