#!/bin/sh
#
# 此程序用于对U盘重新创建分区，更改卷标，并格式化
# 使用前务必：
# 1. 备份U盘全部内容
# 2. 拔掉路由器上的其它全部U盘并重启路由器
# 3. 务必将该程序上传至路由器目录/tmp/，并在此位置运行
#
########## SET THE LABEL OF THE USB FLASH DRIVE ##########
#
# USB_DRIVE: USB flash drive
# 设置自定义变量USB_DRIVE为U盘
USB_DRIVE="$(nvram show 2> /dev/null | sed -E -n -e 's/^usb_path[[:digit:]]_act=([[:alnum:]]+).*/\1/p' | head -n 1)"
#
if [ -z "${USB_DRIVE}" ]
then
    echo -e "($(basename $0)): $$ \033[1;43;31mNOTICE\033[0m: USB FLASH DRIVE IS NOT FOUND"
    #
    exit 1
fi
#
# USB_DRIVE_PARTITION: Partition 1 of the USB flash drive
# 设置自定义变量USB_DRIVE_PARTITION为U盘第一分区
USB_DRIVE_PARTITION="/dev/${USB_DRIVE}1"
#
# USB_DRIVE_PARTITION_SCHEME: Partitioning scheme of the USB flash drive
# 设置自定义变量USB_DRIVE_PARTITION_SCHEME为U盘分区方案
USB_DRIVE_PARTITION_SCHEME="$(echo -ne "p\n" | fdisk "/dev/${USB_DRIVE}" | grep -i 'gpt')"
#
if [ -n "${USB_DRIVE_PARTITION_SCHEME}" ]
then
    echo -e "($(basename $0)): $$ \033[1;43;31mNOTICE\033[0m: CONVERT PARTITION SCHEME OF THE USB FLASH DRIVE FROM GPT TO MBR ON YOUR COMPUTER"
    #
    exit 2
fi
#
# USB_DRIVE_LABEL: Default label of the USB flash drive
# 设置自定义变量USB_DRIVE_LABEL为U盘默认卷标ASUS_ROUTER。可修改，但长度不可超过16字节
USB_DRIVE_LABEL="ASUS_ROUTER"
#
# USB_DRIVE_BRAND_MODEL: Brand and model of the USB flash drive
# 设置自定义变量USB_DRIVE_BRAND_MODEL为U盘品牌和型号
USB_DRIVE_BRAND_MODEL="$(sed -E 's/[[:space:]]+/ /g' "/proc/scsi/sg/device_strs")"
#
# KERNEL_VERSION: Version of kernel
# 设置自定义变量KERNEL_VERSION为内核版本号
KERNEL_VERSION="$(uname -r | sed -E -n -e 's/[^[:digit:]]*([[:digit:].]+)[^[:digit:]]*/\1/p')"
#
########## END ##########
#
#
########## LOAD FUNCTIONS ##########
#
checkSupportForExt4()
{
    # KERNEL_VERSION: Version of kernel
    # 设置自定义变量KERNEL_VERSION为内核版本号
    local KERNEL_VERSION="$(uname -r | sed -E -n -e 's/^[^[:digit:].]*([[:digit:].]+).*/\1/p')"
    #
    local KERNEL_VERSION_PART1="$(echo "${KERNEL_VERSION}" | sed -E -n -e 's/([[:digit:]]+)\.[[:digit:]]+\.[[:digit:]]+.*/\1/p')"
    local KERNEL_VERSION_PART2="$(echo "${KERNEL_VERSION}" | sed -E -n -e 's/[[:digit:]]+\.([[:digit:]]+)\.[[:digit:]]+.*/\1/p')"
    local KERNEL_VERSION_PART3="$(echo "${KERNEL_VERSION}" | sed -E -n -e 's/[[:digit:]]+\.[[:digit:]]+\.([[:digit:]]+).*/\1/p')"
    local PROC_FILESYSTEM="$(grep 'ext4' "/proc/filesystems")"
    #
    # EXT4 filesystem is only supported on the devices with kernel newer than 2.6.28
    # EXT4文件系统仅在内核版本大于2.6.28的设备上被支持
    # 
    if [ ${KERNEL_VERSION_PART1} -gt 2 ] && [ -n "${PROC_FILESYSTEM}" ]
    then
        echo "true"
    elif [ ${KERNEL_VERSION_PART1} -lt 2 ]
    then
        echo "false"
    else
        if [ ${KERNEL_VERSION_PART2} -gt 6 ] && [ -n "${PROC_FILESYSTEM}" ]
        then
            echo "true"
        elif [ ${KERNEL_VERSION_PART2} -lt 6 ]
        then
            echo "false"
        else
            if [ ${KERNEL_VERSION_PART3} -ge 28 ] && [ -n "${PROC_FILESYSTEM}" ]
            then
                echo "true"
            else
                echo "false"
            fi
        fi
    fi
}
#
########## END ##########
#
#
########## PREPARE THE USB FLASH DRIVE ##########
#
cd "/tmp"
#
# Unmount all partitions on the USB flash drive
# 卸载U盘上的全部分区
MAX_PARTNUM=$(echo -ne "p\n" | fdisk "/dev/${USB_DRIVE}" | sed -E -n -e 's/[[:space:]]*\/dev\/'"${USB_DRIVE}"'([[:digit:]]+)[[:space:]]+.*/\1/p' | tail -n 1)
#
while [ -n "${MAX_PARTNUM}" ] && [ ${MAX_PARTNUM} -gt 0 ]
do
    umount -f "/dev/${USB_DRIVE}${MAX_PARTNUM}" 2> /dev/null
    MAX_PARTNUM=$((${MAX_PARTNUM}-1))
    sleep 5
done
#
sleep 10
#
# Re-partition /dev/${USB_DRIVE}
# 重新分区/dev/${USB_DRIVE}
echo -e "($(basename $0)): $$ \033[1;44;37mINFO\033[0m: RE-PARTITION ${USB_DRIVE_BRAND_MODEL}"
echo -ne "u\np\no\nn\np\n1\n2048\n\np\nw\n" | fdisk "/dev/${USB_DRIVE}"
#
if [ ${?} -ne 0 ]
then
    echo -e "($(basename $0)): $$ \033[1;43;31mNOTICE\033[0m: CAN'T RE-PARTITION ${USB_DRIVE_BRAND_MODEL}"
    #
    exit 3
fi
#
sleep 10
#
# Format ${USB_DRIVE_PARTITION} with ${USB_DRIVE_LABEL}
# 格式化${USB_DRIVE_PARTITION}并创建卷标${USB_DRIVE_LABEL}
echo -e "($(basename $0)): $$ \033[1;44;37mINFO\033[0m: LABEL OF ${USB_DRIVE_BRAND_MODEL} IS ${USB_DRIVE_LABEL}"
umount -f "/dev/${USB_DRIVE}1" 2> /dev/null
#
if $(checkSupportForExt4)
then
    echo -e "($(basename $0)): $$ \033[1;44;37mINFO\033[0m: CREATE EXT4 FILESYSTEM"
    #
    nvram set usb_ext_opt="barrier=1,data=journal"
    nvram commit
    #
    mke2fs -FL "${USB_DRIVE_LABEL}" -t ext4 "${USB_DRIVE_PARTITION}"
    #
else
    echo -e "($(basename $0)): $$ \033[1;44;37mINFO\033[0m: CREATE EXT3 FILESYSTEM"
    #
    nvram set usb_ext_opt="barrier=1,data=ordered"
    nvram commit
    #
    mkfs.ext3 -FL "${USB_DRIVE_LABEL}" "${USB_DRIVE_PARTITION}"
fi
#
# Check if mkfs.ext3 returns 0
# 检查mkfs.ext3的返回值是否为0
if [ ${?} -ne 0 ]
then
    echo -e "($(basename $0)): $$ \033[1;43;31mNOTICE\033[0m: ${USB_DRIVE_BRAND_MODEL} IS NOT READY"
    #
    exit 4
fi
#
sleep 120
#
# Create mount point /tmp/mnt/${USB_DRIVE_LABEL}
# 创建挂载点/tmp/mnt/${USB_DRIVE_LABEL}
if [ ! -d "/tmp/mnt/${USB_DRIVE_LABEL}" ]
then
    mkdir -m 777 "/tmp/mnt/${USB_DRIVE_LABEL}"
fi
#
# Mount ${USB_DRIVE_PARTITION} to /tmp/mnt/${USB_DRIVE_LABEL}
# 挂载${USB_DRIVE_PARTITION}至/tmp/mnt/${USB_DRIVE_LABEL}
mount "${USB_DRIVE_PARTITION}" "/tmp/mnt/${USB_DRIVE_LABEL}" 2> /dev/null
#
sleep 30
#
echo -e "($(basename $0)): $$ \033[1;42;37mSUCCESS\033[0m: ${USB_DRIVE_BRAND_MODEL} IS READY"
#
exit 0
#
########## END ##########