#! /bin/bash

. opts.sh

[ $? -ne 0 -o -z "$gpod" ] && { echo "No storage pods are running..." ; exit 1 ; }
[ -z "$1" ] && { echo "Usage: $0 <info|heal|migrate> <vol|all> [src] [dst]" ; exit 1 ; }
action=$1
shift


function info {
    vol=$1

    status=$(gluster volume info "$vol" | grep -P 'Status' | awk '{ print $2 }' | tr -d '\r\n')
    bricks=$(gluster volume info "$vol"  | grep -P 'Number of Bricks' | awk '{ print $NF }' | tr -d '\r\n')
    avail=$(gluster volume status "$vol" detail | grep Brick | wc -l)
    online=$(gluster volume status "$vol" detail | grep Online | grep Y | wc -l)
    
    echo "Volume $vol: $status (Bricks: $bricks, Available: $avail, Online: $online)"
}

function heal {
    vol=$1

    distributed=0
    gluster volume info "$vol" | grep "Type:" | grep -i "Distribute" &> /dev/null
    [ $? -eq 0 ] && distributed=1

    echo "Healing volume $vol"
    echo "-------------------"
    gluster volume heal "$vol" full
    gluster volume heal "$vol" info
    
    if [ $distributed -eq 1 ]; then
        echo "Rebalancing distributed volume $vol"
        gluster volume rebalance "$vol" fix-layout start
    fi
    
    
    gluster volume status "$vol"
}

function migrate {
    vol=$1
    src=$2
    dst=$3
    
    [ -z "$src" -o -z "$dst" ] && { echo "Source and destination servers are required" ; exit 1 ; }

    src_brick=$(gluster volume info $vol | grep -P '^Brick\d+:' | awk '{ print $2 }' | grep -P "^$src" | tr -d '\r\n' )
    dst_brick=${src_brick/$src/$dst}

    [ -z "$src_brick" -o -z "$dst_brick" ] && return 0

    echo "Volume $vol: migrating failed brick"
    echo "             from $src_brick"
    echo "               to $dst_brick"
    echo "Press enter to continue"
    read
    [ $? -ne 0 ] && exit

    gluster volume replace-brick $vol "$src_brick" "$dst_brick"  commit force
    heal $vol
}
    

function transport {
    vol=$1
    transport=${2:-tcp,rdma}
    echo "Changing $vol to transport $transport"
    gluster volume stop "$vol"
    gluster volume set "$vol" config.transport "$transport"
    gluster volume start "$vol"
}



function restart {
    vol=$1

    echo $vol
    bricks=$(gluster volume info "$vol"  | grep -P 'Number of Bricks' | awk '{ print $NF }' | tr -d '\r\n')
    online=$(gluster volume status "$vol" detail | grep Online | grep Y | wc -l)

    if [ "$bricks" -ne "$online" ]; then
        echo "Restarting $vol ($online bricks of $bricks are/is online)"
        gluster --mode=script volume stop "$vol" 
        gluster --mode=script volume start "$vol"
    fi
}    

function delete_failed {
    vol=$1

    bricks=$(gluster volume info "$vol"  | grep -P 'Number of Bricks' | awk '{ print $NF }' | tr -d '\r\n')
    online=$(gluster volume status "$vol" detail | grep Online | grep Y | wc -l)

    if [ "$online" == "0" ]; then
        echo "Deleting $vol ($online bricks of $bricks are/is online)"
#        gluster --mode=script volume stop "$vol" 
        gluster --mode=script volume delete "$vol" 
    fi
}


function lvm_clean {
    used_bricks=`gluster volume info | grep "/brick_" | sed -r  -e 's/.*brick_(.*)\/brick/\1/'`
    
    for ip in $(seq 1 3); do
        echo "Node $ip"
        echo "========"
        lvm_bricks=`node $ip lvscan | grep brick  | sed -r -e 's/.*brick_([0-9a-z]*)[^0-9a-z].*/\1/'`
    
        diff=$(echo $used_bricks $lvm_bricks | tr -d '\r' | tr ' ' '\n' | sort | uniq -u)
        remove=$(echo "$diff $lvm_bricks" | tr -d '\r' | tr ' ' '\n' | sort | uniq -d)

        for id in $remove; do
            echo "Removing ---------------------------------------------"
            node $ip lvs -o name,time,size -S "'name =~ $id'"
            echo "Removing ---------------------------------------------"
            node $ip lvremove -y -S "'name =~ $id'"
        done
    done    
    
    
}

function lvm_remove_today {
    for ip in $(seq 1 3); do
        node $ip hostname
#lvdisplay -o name,time -S 'time since "2018-03-16"'
    done
}


function heketi_cmd {
    heketi "$@"
}

function heketi_clean {
    heketi_vols=`heketi topology info | grep "Name: vol_" | sed -r  -e 's/.*(vol_[0-9a-z]+)\s*$/\1/'`
    gluster_vols=`gluster volume info | grep "Name: vol_" | sed -r  -e 's/.*(vol_[0-9a-z]+)\s*$/\1/'`
    echo $heketi_vols
    
    diff=$(echo $gluster_vols $heketi_vols | tr -d '\r' | tr ' ' '\n' | sort | uniq -u)
    remove=$(echo "$diff $gluster_vols" | tr -d '\r' | tr ' ' '\n' | sort | uniq -d)

    for vol in $remove; do
        echo "Stopping and deleting volume $vol"
        echo "---------------------------------"
        gluster --mode=script volume stop "$vol" 
        gluster --mode=script volume delete "$vol"
    done
}

if [[ "$action" =~ ^heketi ]]; then
    eval "$action" "$@"
elif [[ "$action" =~ ^lvm ]]; then
    eval "$action" "$@"
elif [[ -z "$1" || "$1" =~ ^all ]]; then
    all=0
    [ "$1" == "all_heketi" ] && all=1
    [[ "$1" =~ ^all ]] && shift

    vols=$(gluster volume info | grep -P '^Volume Name' | awk '{ print $NF }' | tr '\r\n' '  ')
    for vol in $vols; do
        if [ $all -eq 0 ]; then
            [[ "$vol" =~ [0-9] ]] && continue
            [[ "$vol" =~ ^vol_ ]] && continue
            [[ "$vol" =~ ^heketi ]] && continue
        fi

        eval "$action" "$vol" "$@"
    done
else
    eval "$action" "$@"
fi
