#!/bin/bash

. ./tool/hiperiso_lib.sh

print_usage() {    
    echo 'Usage:  sudo bash HiperisoPlugson.sh [OPTION] /dev/sdX'
    echo '  OPTION: (optional)'
    echo '   -H x.x.x.x  http server IP address (default is 127.0.0.1)'
    echo '   -P PORT     http server PORT (default is 24681)'
    echo '   -h          print this help'
    echo ''
}

uid=$(id -u)
if [ $uid -ne 0 ]; then
    echo "Please use sudo or run the script as root."
    exit 1
fi

if [ "$1" = "__vbash__" ]; then
    shift
else
    if readlink /bin/sh | grep -q bash; then
        :
    else
        exec /bin/bash $0 "__vbash__" "$@"
    fi
fi

OLDDIR=$(pwd)

machine=$(uname -m)
if echo $machine | grep -E -q 'aarch64|arm64'; then
    TOOLDIR=aarch64
elif echo $machine | grep -E -q 'x86_64|amd64'; then
    TOOLDIR=x86_64
elif echo $machine | grep -E -q 'mips64'; then
    TOOLDIR=mips64el
elif echo $machine | grep -E -q 'i[3-6]86'; then
    TOOLDIR=i386
else
    echo "Unsupported machine type $machine"    
    exit 1
fi


if ! [ -f "$OLDDIR/tool/$TOOLDIR/Plugson" ]; then
    echo "Please run under the correct directory!" 
    exit 1
fi

echo "############# HiperisoPlugson $* [$TOOLDIR] ################" >> ./HiperisoPlugson.log
date >> ./HiperisoPlugson.log

echo "decompress tools" >> ./HiperisoPlugson.log
cd ./tool/$TOOLDIR

ls *.xz > /dev/null 2>&1
if [ $? -eq 0 ]; then
    [ -f ./xzcat ] && chmod +x ./xzcat

    for file in $(ls *.xz); do
        echo "decompress $file" >> ./HiperisoPlugson.log
        xzcat $file > ${file%.xz}
        [ -f ./${file%.xz} ] && chmod +x ./${file%.xz}
        [ -f ./$file ] && rm -f ./$file
    done
fi

cd ../../
chmod +x -R ./tool/$TOOLDIR

if ! [ -f "$OLDDIR/tool/$TOOLDIR/Plugson" ]; then
    echo "$OLDDIR/tool/$TOOLDIR/Plugson does not exist!" 
    exit 1
fi


PATH=./tool/$TOOLDIR:$PATH

HOST="127.0.0.1"
PORT=24681

while [ -n "$1" ]; do
    if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
        print_usage
        exit 0
    elif [ "$1" = "-H" ]; then
        shift
        if echo $1 | grep -q '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*'; then
            HOST="$1"
        else
            echo "Invalid host $1"
            exit 1
        fi
    elif [ "$1" = "-P" ]; then
        shift
        if [ $1 -gt 0 -a $1 -le 65535 ]; then
            PORT="$1"
        else
            echo "Invalid port $1"
            exit 1
        fi
    else
        DISK=$1
    fi
    
    shift
done

if [ -z "$DISK" ]; then
    print_usage
    exit 0
fi

if ps -ef | grep "tool/$TOOLDIR/Plugson.*$HOST.*$PORT" | grep -q -v grep; then
    echo "Another hiperiso server is running now, please close it first."
    exit 1
fi

if echo $DISK | grep -q "[a-z]d[a-z][1-9]"; then
    DISK=${DISK:0:-1}
fi

if echo $DISK | grep -E -q "/dev/nvme|/dev/mmcblk/dev/nbd"; then
    if echo $DISK | grep -q "p[1-9]$"; then
        DISK=${DISK:0:-2}
    fi
fi


if [ ! -b "$DISK" ]; then
    echo "$DISK does NOT exist."
    exit 1
fi


version=$(get_disk_hiperiso_version $DISK)
if [ $? -eq 0 ]; then
    echo "Hiperiso version in Disk: $version"
    
    vtPart1Type=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e  '1/1 "%02X"')
    if [ "$vtPart1Type" = "EE" ]; then            
        echo "Disk Partition Style  : GPT"
        partstyle=1
    else
        echo "Disk Partition Style  : MBR"
        partstyle=0
    fi

    if check_disk_secure_boot $DISK; then
        echo "Secure Boot Support   : YES"
        secureboot=1
    else
        echo "Secure Boot Support   : NO"
        secureboot=0
    fi
else
    echo "$DISK is NOT Hiperiso disk."
    exit 1
fi

PART1=$(get_disk_part_name $DISK 1)

if grep -q "^$PART1 " /proc/mounts; then
    mtpnt=$(grep "^$PART1 " /proc/mounts | awk '{print $2}' | sed 's/\\040/ /g')
    fstype=$(grep "^$PART1 " /proc/mounts | awk '{print $3}')
    
    if echo $fstype | grep -q -i 'fuse'; then
        if hexdump -C -n 16 $PART1 | grep -q -i "EXFAT"; then
            fstype="exFAT"
        elif hexdump -C -n 16 $PART1 | grep -q -i "NTFS"; then
            fstype="NTFS"       
        fi
    fi
    
    echo "$PART1 is mounted at $mtpnt $fstype"
else
    echo "$PART1 is NOT mounted, please mount it first!"
    exit 1
fi

if [ -d "$mtpnt/hiperiso" ]; then
    echo "hiperiso directory exist OK"
else
    echo "create hiperiso directory"
    mkdir -p "$mtpnt/hiperiso"
    if [ -d "$mtpnt/hiperiso" ]; then
        chmod -R 0755 "$mtpnt/hiperiso"
    else
        echo "Failed to create directory $mtpnt/hiperiso"
        exit 1
    fi
fi


#change current directory to Hiperiso disk
cd "$mtpnt"
"$OLDDIR/tool/$TOOLDIR/Plugson" "$HOST" "$PORT" "$OLDDIR" "$DISK" $version "$fstype" $partstyle $secureboot   &
wID=$!
sleep 1

if [ -f /proc/$wID/maps ]; then
    echo ""
    echo "==============================================================="
    if [ "$LANG" = "zh_CN.UTF-8" ]; then
        echo "  Hiperiso Plugson Server 已经启动 ..."
        echo "  请打开浏览器，访问 http://${HOST}:${PORT}"
    else
        echo "  Hiperiso Plugson Server is running ..."
        echo "  Please open your browser and visit http://${HOST}:${PORT}"
    fi
    echo "==============================================================="
    echo ""
    echo "################## Press Ctrl + C to exit #####################"
    echo ""

    wait $wID
fi


if [ -n "$OLDDIR" ]; then 
    CURDIR=$(pwd)
    if [ "$CURDIR" != "$OLDDIR" ]; then
        cd "$OLDDIR"
    fi
fi
