#!/bin/bash

function split_brain()
{
echo "================ 脑裂状态检测 =========================="
    #检测集群是否运行
    is_cluster_service_running
    if [ $? -eq 1 ];then
	log "集群没有运行" >> $ha_check_log
	error_exit "集群没有运行"
    fi

    #检测iptables是否安装
    which iptables &> /dev/null
    if [ $? -ne 0 ]; then
	log "没有安装iptables"  >> $ha_check_log
	error_exit "没有安装iptables"
    fi

    #检测fence是否启用
    is_fence_enabled
    if [ $? -eq 1 ];then
	log "集群没有启用stonith" >> $ha_check_log
	error_exit "集群没有启用stonith"
    fi

    active_fence=$(pcs stonith | grep "Started")
    if [ -z "$active_fence" ]; then
	log "集群中没有正在运行的stonith资源" >> $ha_check_log
	error_exit "集群中没有正在运行的stonith资源"
    fi

    #计算集群中正在运行的节点数量,小与3则无法进行脑裂检测
    node_count=$(expr `pcs status nodes | grep -A1 "Pacemaker Nodes" | grep "Online" | awk -F' ' '{print NF}'` - 1)
    if [ $node_count -lt 3 ]; then
	log "集群至少需要3个节点在线才能进行脑裂状态检测，当前只有一个节点在线" >> $ha_check_log
        error_exit "集群至少需要3个节点在线才能进行脑裂状态检测，当前只有一个节点在线"
    fi

    fence_timeout=$(pcs property config --all | grep "stonith-timeout" | awk '{print $2}')
    fence_action=$(pcs property config --all | grep "stonith-action" | awk '{print $2}')

    echo "预期结果:     	集群中任意一个节点被fence"
    echo "fence超时时间:	$fence_timeout"
    echo "fence操作:    	$fence_action"

    local_node=$(hostname)
    node_list=($(pcs status nodes | grep -A1 "Pacemaker Nodes" | grep "Online" | awk -F'Online:' '{print $2}'))

    for i in ${node_list[*]} ; do
	check_ssh_free_login $i
	if [ $? -eq 1 ];then
	    log "请完成ssh免密通信配置后，再进行脑裂检测" >> $ha_check_log
	    error_exit "请完成ssh免密通信配置后，再进行脑裂检测"
	fi
    done

    node_num=$(expr $(($RANDOM%$node_count+1)) - 1 )
    node=${node_list[$node_num]}

    if [[ "$node" = "$local_node" ]];then
	echo "正在尝试fence当前节点$node...如果当前节点被重启或关机，则脑裂检测成功"
	log "正在尝试fence当前节点$node...如果当前节点被重启或关机，则脑裂检测成功" >> $ha_check_log
	iptables -A OUTPUT -p udp --dport 1:59999 -j REJECT
    else
	echo "正在尝试fence节点$node..."
	log "正在尝试fence节点$node..." >> $ha_check_log
	ssh $node  "iptables -A OUTPUT -p udp --dport 1:59999 -j REJECT"
    fi

    echo "等待fence执行中..."
    count=0
    while [ $count -le 100 ]; do
        fenced_node=`crm_mon -1 | grep -A1 "Pending Fencing Actions:" | grep "pending"| awk -F'of' '{print $2}' | awk '{print $1}'`
        if [ -n "$fenced_node" ];then
	    echo "节点$node已被fence成功"
	    log "节点$node已被fence成功" >> $ha_check_log
            break
        fi

        sleep 0.1
        let count+=1
    done

    if [ -z "$fenced_node" ];then
	sleep $fence_timeout
	ping -c 5 -W 20 $node &> /dev/null
	if [ $? -eq 0 ];then
	    echo "Fence失败，请检查stonith资源配置是否正确..."
	    log "Fence失败，请检查stonith资源配置是否正确..." >> $ha_check_log
	    ssh $node "iptables -D OUTPUT -p udp --dport 1:59999 -j REJECT"
	else
	    echo "Fence失败，与节点$node通信失败"
	    log "Fence失败，与节点$node通信失败" >> $ha_check_log
	fi
    fi

}
