#!/bin/sh

# Created by jiaqiang.ye@lnxall.com
# Format Solid State Drive for EM1000
# 2023/11/28
export PATH=/opt/lnxall_app/bin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

BLKDEV=""
FORCING=0
MNTDIR='/mnt/ssd'
find_ssd() {
	local BDEV=/dev/nvme0
	if [ ! -c "${BDEV}" ] ; then
		echo "Error: No SSD character device found."
		return 1
	fi

	BDEV=/dev/nvme0n1 # block partition
	if [ ! -b "${BDEV}" ] ; then
		echo "Error, SSD block partition not found: '${BDEV}'." 1>&2
		return 2
	fi

	# force umount in case it is mounted:
	if [ ${FORCING} -ge 2 ] ; then
		umount "${BDEV}" >/dev/null 2>/dev/null
	fi

	# check if already mounted
	if mountpoint -q "${MNTDIR}" ; then
		echo "Error, SSD block device is mounted, cannot format." 1>&2
		return 3
	fi

	BLKDEV="${BDEV}"
	return 0
}

fmt_usage() {
	echo "Usage: ssd_format.sh -f      # format SSD if not mounted"
	echo "       ssd_format.sh -f -f   # format SSD even if mounted"
	exit 1
}

check_args() {
	while [ -n "$1" ] ; do
		case "$1" in
		'-f') FORCING=$((FORCING + 1)) ;;
		'-h' | 'help' | '--help') fmt_usage ;;
		*)
			echo "Error, invalid argument: '$1'"
			fmt_usage ;;
		esac
		shift 1
	done

	[ ${FORCING} -eq 0 ] && fmt_usage
	return 0
}

format_ssd() {
	mkfs.ext4 -F -t ext4 "${BLKDEV}"
	local ret=$?
	if [ ${ret} -ne 0 ] ; then
		echo "Error, failed to format SSD for EM1000: ${ret}" 1>&2
	else
		echo "INFO: SSD has been formatted for EM1000."
	fi
	return ${ret}
}

mount_ssd() {
	if [ ! -d "${MNTDIR}" ] ; then
		rm -rf "${MNTDIR}" # in case it is a file
		mkdir -p "${MNTDIR}"
	fi

	# check again for mount directory
	if [ ! -d "${MNTDIR}" ] ; then
		echo "Error, ssd mount directory not found: '${MNTDIR}'" 1>&2
		return 1
	fi

	# to prevent any suspicious, umount it first:
	umount "${MNTDIR}" >/dev/null 2>/dev/null
	mount -orw -t ext4 ${BLKDEV} "${MNTDIR}"
	if [ $? -ne 0 ] ; then
		echo "Error, failed to mount SSD. you might need to format it first." 1>&2
		return 2
	fi
	echo "INFO: SSD has been mounted to ${MNTDIR}"
	return 0
}

check_args "$@"
find_ssd
[ -z "${BLKDEV}" ] && exit 1
format_ssd || exit 2
mount_ssd ; exit $?
