#!/bin/bash
# 预先测试部分配置是否可行


if pcs status; then
    # 已经有集群在正常运行
    exit 1
fi


if [ -z "$SSH" ];then
    source /unas/sbin/dualcontroller/config/prepare
fi

log_file="/tmp/unas_dc"
echo 0 $STATUS_START > $log_file

CONFFILE=/tmp/dualcontroller

if [ -z "$CLUSTER" ];then
    # Example:
    # CLUSTER=unas_cluster
    # CLUSTER_IP=(192.168.0.250 192.168.0.251)
    # HOSTS=(UNASHRX1DTP4V UNAS18Q71DTVZV)
    # IPS=(192.168.0.117 192.168.0.28)
    # HB_IPS=(10.0.0.117 10.0.0.28)
    # PASSES=(password password)
    # DISK=(/dev/nas/data /dev/nas/data2)
    # IPMIIP=(192.168.0.240 192.168.0.241)
    # IPMIUSER=(ADMIN ADMIN)
    # IPMIPASS=(PASSWORD PASSWORD)
    # SMB=1
    # NFS=1
    # FTP=1
    # AFP=1
    # ISCSI=1
    if [ -f $CONFFILE ];then
        source $CONFFILE
    else
        exit 1
    fi
fi

array_length=${#HOSTS[@]}

for ip in "${CLUSTER_IP[@]}";do
    # 服务ip不能被占用
    if $PING "$ip";then
        echo $PROCESS_CHECK $STATUS_FAILED "$ip" >> $log_file
        exit 1
    fi
done

for ip in "${IPS[@]}";do
    # 设备ip必须能通
    if ! $PING "$ip";then
        echo $PROCESS_CHECK $STATUS_FAILED "$ip" >> $log_file
        exit 1
    fi
done

for ip in "${HB_IPS[@]}";do
    # 心跳ip必须能通
    if ! $PING "$ip";then
        echo $PROCESS_CHECK $STATUS_FAILED "$ip" >> $log_file
        exit 1
    fi
done

for (( i=0; i<$array_length; i+=1 ))
do
    # IPMI必须能通
    # 只是检查能通，无法检查是否对应设备
    ip="${IPMIIP[$i]}"
    user="${IPMIUSER[$i]}"
    pass="${IPMIPASS[$i]}"
    if ! $PING "$ip";then
        echo $PROCESS_CHECK $STATUS_FAILED "$ip" >> $log_file
        exit 1
    fi
    if ! ipmitool -I lanplus -C "$(IPMI_CIP)" -H "$ip" -U "$user" -P "$pass" chassis power status;then
        echo $PROCESS_CHECK $STATUS_FAILED IPMI "$user@$ip" >> $log_file
        exit 1
    fi
done

valid_disk() {
    local disk=$1
    if [ -b "$disk" ] || lvs "$disk" || zfs list "$disk" > /dev/null 2>&1;then
        return 0
    else
        return 1
    fi
}

if ! valid_disk "$CONFDISK";then
    echo $PROCESS_CHECK $STATUS_FAILED Disk "$CONFDISK" >> $log_file
    exit 1
fi

for disk in "${DISK[@]}";do
    lvchange -ay $disk
    if ! valid_disk "$disk";then
        echo $PROCESS_CHECK $STATUS_FAILED Disk "$disk" >> $log_file
        exit 1
    fi
done
