#!/bin/bash

source /etc/tos/scripts/scripts

SCANDIR="/tmp/fc"
RAIDCFG="/etc/mdadm.conf"
LOGFILE="/var/log/mntfc.log"
TEMPDIR=/tmp/databack

#parameters:
#1 scan /dev/sd[a-z][1]
[ ! -d $TEMPDIR ] && mkdir $TEMPDIR

scan_comm_md() {
    local HASDISK=1
    [ -z $1 ] && return 1
    COMMDIR=$SCANDIR
    SIGN=${TOS_FC_SIGN}

    [ ! -d "$COMMDIR" ] && mkdir -p $COMMDIR
    [ ! -z "$COMMDIR" ] && rm -rf $COMMDIR/*
    local loop=1
    while [ 1 ]; do
        local break_while=0
        for blk in /dev/sd*[!0-9]$1; do
            [ ! -b $blk ] && continue
            mdadm -E ${blk} | grep "${SIGN}" >/dev/null
            [ $? -ne 0 ] && continue
            HASDISK=0
            local UUID=$(mdadm -E ${blk} | grep " Array UUID :")
            UUID=${UUID#*: }
            mkdir $COMMDIR/$UUID
            touch $COMMDIR/$UUID/$(basename $blk)
            local totaldisks=$(mdadm -E ${blk} | sed s/[[:space:]]//g | awk -F: '/RaidDevices:/ {print $2}')
            local realdisks=$(ls -1 $COMMDIR/$UUID | wc -l)
            [ $totaldisks -eq $realdisks ] && let break_while=break_while+1
        done
        [ $loop -ge 20 ] && break
        [ $break_while -eq $(ls -1 $COMMDIR | wc -l) ] && break
        #wait disk for about (10 * 2s)
        let loop=loop+1
        sleep 2
    done
    echo "$COMMDIR-------------$HASDISK" >>$LOGFILE
    [ $HASDISK -eq 1 ] && return 1
    return 0
}

loadconf() {
    local uuid=$1
    if [ -f ${RAIDCFG} ]; then
        local ret=$(cat ${RAIDCFG} | grep "$uuid" | awk '{print $2}')
        echo ${ret}
    else
        echo ""
    fi
    return 0
}

make_raid_name() {
    local BLKNO=0
    local RAID_FC=""
    while [ 1 ]; do
        RAID_FC="/dev/md${BLKNO}"
        [ "$RAID_FC" = "$TOS_RAID_CORE" -o "$RAID_FC" = "$TOS_RAID_SWAP" ] && continue
        [ ! -b $RAID_FC ] && break
        let BLKNO=BLKNO+1
    done
    echo $RAID_FC
}

initfc() {
    # init with auto scan
    for id in $(ls $SCANDIR/); do
        local TOS_RAID_FC=$(loadconf $id)
        [ "X${TOS_RAID_FC}" = "X" ] && TOS_RAID_FC=$(make_raid_name)

        local INITBLKS=""
        for blk in $(ls $SCANDIR/$id/); do
            INITBLKS="${INITBLKS}/dev/$blk "
        done
        # inituser with INITBLKS
        if [ ! -b $TOS_RAID_FC ]; then
            mdadm -A $TOS_RAID_FC $INITBLKS --force
            mdadm_result=$?
            echo "mdadm -A $TOS_RAID_FC $INITBLKS --force [ $mdadm_result ]" >>$LOGFILE
            sleep 1
            if [ $mdadm_result -ne 0 ]; then
                mdadm -S $TOS_RAID_FC >/dev/null
                continue
            fi
        fi
        if [ -b $TOS_RAID_FC ]; then
            echo "$TOS_RAID_FC is mdadm -A successful!!!" >>$LOGFILE
            # check for fix
            local mdname=$(basename $TOS_RAID_FC)
            cat /proc/mdstat | grep $mdname | grep -w active >/dev/null
            [ $? -ne 0 ] && continue
            for key in $INITBLKS; do
                [ -z "$key" ] && continue
                mdadm --misc -D ${TOS_RAID_FC} | grep $key >/dev/null
                if [ $? -ne 0 ]; then
                    local tmp_name=$(basename "$key")
                    cat /proc/mdstat | grep $mdname | grep ${tmp_name} >/dev/null
                    [ $? -eq 0 ] && mdadm -r ${TOS_RAID_FC} ${tmp_name} >/dev/null
                    mdadm -a ${TOS_RAID_FC} ${key} >/dev/null
                fi
            done
        fi
    done
    mdadm -Ds >${RAIDCFG}
    return 0
}

initFlashCache() {
    scan_comm_md 1
    [ $? -ne 0 ] && return 1

    initfc
    [ $? -ne 0 ] && return 1
}

main() {
    # trap signal
    trap '' SIGSEGV SIGTERM SIGINT SIGHUP SIGQUIT

    [ ! -f $LOGFILE ] && touch $LOGFILE
    TIME=$(date)
    echo "${TIME}" >>$LOGFILE
    script_get_lock
    # optimization sync speed limit
    sysctl -w dev.raid.speed_limit_max=200000
    sysctl -w dev.raid.speed_limit_min=100000

    # mount flashcache storage which contain
    initFlashCache

    # call up raid monitor
    script_put_lock
    echo -e "${TIME}\n" >>$LOGFILE
    exit 0
}

# run main process...
main
