#!/bin/bash

#############################
#
# error code:
# 1: parameter error
# 2: block device isn't exist
#
#############################
# get parameter list
. /etc/tos/scripts/scripts

usage="Usage:$(basename $0) [/dev/vg0/lv0|/dev/mapper/vg0-lv0]"
[ -z "$1" -o ! -b "$1" ] && {
    echo $usage
    exit 1
}
script_get_lock >/dev/null
[ $? -ne 0 ] && exit 1

#lv_path=$(readlink -f "$1")
lv_path=$1
# volumeGroup isn't exists
vg_name=$(lvs -o vg_name $lv_path --noheadings 2>/dev/null | sed s/[[:space:]]//g)
if [ $? -ne 0 ]; then
    echo $usage
    script_put_lock >/dev/null
    exit 2
fi

TOS_UUID=$(GetDeviceUUID $lv_path)
TOS_VOLUME_ROOT=/tmp/volume
[ ! -e $TOS_VOLUME_ROOT ] && mkdir $TOS_VOLUME_ROOT

lv_name=$(lvs -o lv_name $lv_path --noheadings 2>/dev/null | sed s/[[:space:]]//g)
DEVSORT=$(GetVolumeSort $lv_path) #device sort
statusFile="$TOS_VOLUME_ROOT/${lv_name}"
logFile="$TOS_VOLUME_ROOT/stopLvm_${lv_name}_$(date +"%Y%m%d")"
#get mntpoint
MNTPOINT=$(getmntpoint "$lv_path")
mntInfo=$(df-json | grep -E "$lv_path|$MNTPOINT")
mntOPTS=$(GetMountOpts "$lv_path" "$TOS_UUID")

clearStatus() {
    rm $statusFile >> $logFile 2>&1
}

mountBtrfsRootSubvolume(){
    # mount btrfs root subvolume /var/subvols/xxxx
    local btrfsRoot=$(echo -e "$mntInfo" | grep "/var/subvols/")
    local filesystem=$(echo -e "$btrfsRoot" | awk '{print $2}')
    if [ $filesystem == "btrfs" ]; then
        local source=$(echo -e "$btrfsRoot" | awk '{print $1}')
        local target=$(echo -e "$btrfsRoot" | awk '{print $8}')
        local btrfsSubvolName=$(iniparse -c -f $TOS_DEFAULT_CONFIG -s filesystem -k btrfs_subvolName)
        if echo -e "$mntOPTS" | grep -q "subvol=$btrfsSubvolName"; then
            local opts=$(echo "$mntOPTS" | sed "s/subvol=$btrfsSubvolName,//")
        else
            local opts=$mntOPTS
        fi
        echo "$(date +"%Y/%m/%d %H:%M:%S") stopLvm rollBack: mount -t $filesystem -o $opts $source $target" >> $logFile
        mount -t $filesystem -o $mntOPTS $source $target >> $logFile 2>&1
        if [ $? -eq 0 -a $opts == $mntOPTS ]; then
            # check btrfs mount opts,if there is a root subvolume mount,need to add "subvol=@" for the volume mount. 
            mntOPTS="subvol=${btrfsSubvolName},$mntOPTS"
        fi
    fi
}

mountVolume(){
    # mount /Volume (if filesystem is btrfs,will mount subvolume(@) to '/Volume1' )
    volumeLine=$(echo -e "$mntInfo" | grep "$MNTPOINT$")
    filesystem=$(echo -e "$volumeLine" | awk '{print $2}')
    source=$(echo -e "$volumeLine" | awk '{print $1}')
    target=$(echo -e "$volumeLine" | awk '{print $8}')
    echo "$(date +"%Y/%m/%d %H:%M:%S") stopLvm rollBack: mount -t $filesystem -o $mntOPTS $source $target" >> $logFile
    mount -t $filesystem -o $mntOPTS $source $target >> $logFile 2>&1
}

rollBack() {
    # mount btrfs root subvolume /var/subvols/xxxx
    mountBtrfsRootSubvolume
    # mount /Volume (if filesystem is btrfs,will mount subvolume(@) to '/Volume1' )
    mountVolume
    # mount other 
    echo -e "$mntInfo" | grep -vE "/var/subvols/|$MNTPOINT$" | while read -r line;do
        source=$(echo -e "$line" | awk '{print $1}')
        target=$(echo -e "$line" | awk '{print $8}')
        echo "$(date +"%Y/%m/%d %H:%M:%S") stopLvm rollBack: mount $source $target" >> $logFile
        mount $source $target >> $logFile 2>&1
    done
    echo "$(date +"%Y/%m/%d %H:%M:%S") stopLvm rollBack: add $TOS_UUID to volume.conf" >> $logFile
    iniparse -a -f /etc/volume/volume.conf -s $TOS_UUID -system >> $logFile 2>&1
}

checkLvStatus() {
  lvName=$(lvs -o lv_name $lv_path --noheadings 2>/dev/null)
  if [ $? -eq 0 ]; then
      rollBack
      echo "$(date +"%Y/%m/%d %H:%M:%S") stopLvm: $lv_path Failed *************************" >> $logFile
      clearStatus
      script_put_lock >/dev/null
      exit 2
  fi
}

process=0
echo "stopLVM:$lv_path:$TOS_UUID:0:$process" >$statusFile
echo "$(date +"%Y/%m/%d %H:%M:%S") stopLvm: $lv_path start *************************" >> $logFile

# 10
process=10
echo "stopLVM:$lv_path:$TOS_UUID:0:$process" >$statusFile
echo "$(date +"%Y/%m/%d %H:%M:%S") stopLvm: process $process" >> $logFile


# 20
process=20
echo "stopLVM:$lv_path:$TOS_UUID:0:$process" >$statusFile
echo "$(date +"%Y/%m/%d %H:%M:%S") stopLvm: process $process" >> $logFile
# remove the flashcache
DEVFLAC=/dev/mapper/fc${DEVSORT}
[ -b $DEVFLAC ] && /etc/tos/scripts/flashcache remove $lv_path >/dev/null

# 30
process=30
echo "stopLVM:$lv_path:$TOS_UUID:0:$process" >$statusFile
echo "$(date +"%Y/%m/%d %H:%M:%S") stopLvm: process $process" >> $logFile

if [ ! -z "$MNTPOINT" ]; then
    check_main_raid "$MNTPOINT"
    if [ $? -eq 0 ]; then
        echo "$(date +"%Y/%m/%d %H:%M:%S") stopLvm: [main_service_stop] start" >> $logFile
        main_service_stop
    else
        echo "$(date +"%Y/%m/%d %H:%M:%S") stopLvm: [ter_service $MNTPOINT stop] start" >> $logFile
        ter_service $MNTPOINT stop
    fi
    service_stop

    # 40
    process=40
    echo "stopLVM:$lv_path:$TOS_UUID:0:$process" >$statusFile
    echo "$(date +"%Y/%m/%d %H:%M:%S") stopLvm: process $process" >> $logFile
    umountAll "$MNTPOINT"
    umountAll "$lv_path"

    df-json | grep "${MNTPOINT}$" >/dev/null
    if [ $? -eq 0 ]; then
        process=50
        echo "stopLVM:$lv_path:$TOS_UUID:1:$process" >$statusFile
        echo "$(date +"%Y/%m/%d %H:%M:%S") stopLvm: process $process - umount failed!!" >> $logFile
        checkLvStatus
        clearStatus
        script_put_lock >/dev/null
        exit 1
    fi

    # 60
    process=60
    echo "stopLVM:$lv_path:$TOS_UUID:0:$process" >$statusFile
    umountAll "$lv_path"
    sleep 1
    #remove lvm
    echo "$(date +"%Y/%m/%d %H:%M:%S") stopLvm: process $process - lvremove after umount" >> $logFile
    lvremove -f -y $lv_path >> $logFile 2>&1
    /etc/tos/scripts/mntvfs >> $logFile 2>&1
    public_dir=$(readlink -f /mnt/public)
    if [ -z "$public_dir" ]; then
        df-json | awk '/\/mnt\/md[0-9]+$/ {print $8}' | sort | while read line; do
            [ -z "$line" ] && continue
            /etc/init.d/nas/mkbase $line
            public_dir=$(readlink -f /mnt/public)
            break
        done
    fi
    if [ ! -z "$public_dir" ]; then
        for svrname in $MUSTAPP; do
            ter_service $svrname start >/dev/null 2>&1
        done
        for svrname in $(ls /etc/sc.d/); do
            [ "$svrname" = "nginx" ] && continue
            in_Array "$svrname"
            [ $? -eq 0 ] && continue

            if [ "$svrname" = "msg" ]; then
                [ -e "/root/.msgcenter.label" ] && rm -r /root/.msgcenter.label
            fi
            ter_service $svrname start >/dev/null 2>&1
        done
    fi
else
    # 60
    process=60
    echo "stopLVM:$lv_path:$TOS_UUID:0:$process" >$statusFile
    echo "$(date +"%Y/%m/%d %H:%M:%S") stopLvm: process $process - lvremove" >> $logFile
    sleep 1
    #remove lvm
    lvremove -f -y $lv_path >> $logFile 2>&1
fi
checkLvStatus
process=90
#remove volume config
echo "$(date +"%Y/%m/%d %H:%M:%S") stopLvm: process $process - remove $TOS_UUID from volume.conf " >> $logFile
iniparse -d -f /etc/volume/volume.conf -s "$TOS_UUID" >> $logFile 2>&1
clearStatus
# 100
process=100
echo "stopLVM:$lv_path:$TOS_UUID:0:$process" >$statusFile
echo "$(date +"%Y/%m/%d %H:%M:%S") stopLvm: $lv_path Success *************************" >> $logFile
script_put_lock >/dev/null
echo "VolumeGroup:$vg_name"
exit 0
