#!/bin/bash -

# Copyright (C) MOXA Inc. All rights reserved.
# This software is distributed under the terms of the MOXA SOFTWARE NOTICE.
# See the file MOXA-SOFTWARE-NOTICE for details.
#
# Name:
#	MOXA Bootloader Log Utility
#
# Description:
#	Get MOXA Bootloader Log
#
# Copyright (C) Moxa, Inc. All rights reserved.
# Copyright (C) 2022	Henry LC Chen	<HenryLC.Chen@moxa.com>

BASENAME="mx-bootloader-log-tool"
INTERFACE_NAME="mx-bootloader-mgmt log"

if [ -f "/proc/device-tree/model" ]; then
	device_tree_model_name="$(tr -d '\0' < /proc/device-tree/model)"
fi

if echo "${device_tree_model_name}" | grep -q "ioThinx"; then
	DEFAULT_LOG_DEV=/dev/mmcblk2boot1
	DEFAULT_LOG_START_ADDRESS_HEX=0x100000
	DEFAULT_LOG_START_ADDRESS=$(printf "%d" "$DEFAULT_LOG_START_ADDRESS_HEX")
	
else
	DEFAULT_LOG_PARTITION_LABEL="syslog"
	DEFAULT_LOG_DEV=/dev/$(grep "$DEFAULT_LOG_PARTITION_LABEL" < /proc/mtd | awk '{print $1}' | sed 's/[[:punct:]]//g')
	DEFAULT_LOG_START_ADDRESS_HEX=0x0
	DEFAULT_LOG_START_ADDRESS=$(printf "%d" "$DEFAULT_LOG_START_ADDRESS_HEX")
fi

DEFAULT_LOG_SHIFT_ADDRESS_HEX=0x20
DEFAULT_LOG_SHIFT_ADDRESS=$(printf "%d" "$DEFAULT_LOG_SHIFT_ADDRESS_HEX")
DEFAULT_LOG_LENGTH_HEX=0x100000
DEFAULT_LOG_LENGTH=$(printf "%d" "$DEFAULT_LOG_LENGTH_HEX")

_logger() {
	echo "$1"
	logger -i -t $BASENAME "$1"
}

usage() {
	echo "Get Bootloader Audit Log"
	echo
	echo "USAGE:"
	echo "    $INTERFACE_NAME [SUBCOMMAND]"
	echo
	echo "FLAGS:"
	echo "    -h, --help                 Display the help menu"
	echo
	echo "SUBCOMMANDS:"
	echo "    print                      Print the bootloader log"
	echo
}

_echo_log_data(){

	local dev=$1
	local dev_address=$2
	local log_data_shift=$3
	local dev_total_length=$4

	local block_size=32
	local each_log_size=256
	local each_log_size_no_header=240

	local read_address=$dev_address
	read_address=$(( "$read_address" + "$log_data_shift" ))

	while [ "$read_address" -le $(( "$dev_address" + "$dev_total_length" )) ]; do
		dd if="$dev" bs=$(( 1 * "$block_size" )) skip=$(( "$read_address" / "$block_size" )) count=$(( "$each_log_size_no_header" / "$block_size" )) status=none
		read_address=$(( "$read_address" + "$each_log_size"))
	done

}

print(){
	_logger "Bootloader log:"
	_echo_log_data "$DEFAULT_LOG_DEV" "$DEFAULT_LOG_START_ADDRESS" "$DEFAULT_LOG_SHIFT_ADDRESS" "$DEFAULT_LOG_LENGTH"
}

parsing_options() {
	while [ -n "$1" ]; do
		case "$1" in
		-p | --print | print)
			action=print
			shift
			;;
		-h | --help | help)
			usage
			exit 0
			;;
		*)
			usage
			exit 1
		esac
	done

	if [ -z "$action" ]; then
		return 1
	fi

	return 0
}

main() {
	if ! parsing_options "$@"; then
		usage
		exit 1
	fi

	case "$action" in
	print)
		print
		;;
	*)
		;;
	esac

	return 0
}

main "$@"
