#!/bin/sh

URL=http://ppa.linuxfactory.or.kr/mastering
IMAGE=android-odroidn2-20210930
TARGET=/dev/mmcblk0

BASEDIR=/tmp/mastering

cleanup() {
	fw_setenv petitboot,mastering $1
}

panic() {
	echo "E: $1"
	cleanup
	/usr/bin/figlet FAILED!!
	sleep 10
	exit 1
}

reboot() {
	echo 1 > /proc/sys/kernel/sysrq
	echo b > /proc/sysrq-trigger
}

wait_for_device() {
        n=1
        echo "W: waiting for "${1}"..."
        while [ ${n} -le 5 ]; do
                [ -e ${1} ] && return 0
                n=$((n + 1))
                sleep 1
        done

        return 1
}

setup_network() {
	NET_IPTYPE=$(fw_printenv -n iptype 2>/dev/null)
	NET_IPADDR=$(fw_printenv -n ipaddr 2>/dev/null)
	NET_GATEWAY=$(fw_printenv -n gatewayip 2>/dev/null)
	NET_DNS1=$(fw_printenv -n dns1 2>/dev/null)
	NET_DNS2=$(fw_printenv -n dns2 2>/dev/null)

	if [ "$NET_IPTYPE" = "static" ]; then
		echo "Use static IP address"
		ifconfig eth0 $NET_IPADDR
		route add default gw $NET_GATEWAY dev eth0
		rm -f /etc/resolv.conf
		[ -n "$NET_DNS1" ] \
			&& echo "nameserver $NET_DNS1" >> /etc/resolv.conf
		[ -n "$NET_DNS2" ] \
			&& echo "nameserver $NET_DNS2" >> /etc/resolv.conf
	else
		echo "Use dynamic IP address"
		udhcpc 2>/dev/null
	fi

	echo "---------------------------------------"
	echo "IP : $(ip a show eth0 | grep inet | awk '{print $2}')"
	echo "Gateway : $(ip r | grep default | awk '{print $3}')"
	echo "---------------------------------------"
}

download() {
	wget ${1} -O ${2} \
		|| panic "failed to download ${1}"
}

setup_network

# Ensure the target device to flash is present
wait_for_device ${TARGET} || panic "device ${TARGET} not found"

mkdir -p ${BASEDIR}

# Take download details from a server
for f in BLKSIZE FILES MD5SUM; do
	download ${URL}/${IMAGE}/${f} ${BASEDIR}/${f}
done

BLKSIZE=$(cat ${BASEDIR}/BLKSIZE)

prev=$(fw_printenv -n petitboot,mastering 2>/dev/null)

SIGNATURE=$(md5sum ${BASEDIR}/MD5SUM | awk '{print $1}')
if [ "$prev" = "$SIGNATURE" ]; then
	figlet "Up to date"
	sleep 1
	exit 0
fi

for f in $(cat ${BASEDIR}/FILES); do
	next=$(echo ${f} | cut -d'.' -f2)

	if [ "x${prev}" != "x" ]; then
		[ $(expr ${next} \<= ${prev}) -eq 1 ] && continue
	fi

	download ${URL}/${IMAGE}/${f} ${BASEDIR}/${f}

	HASH1=$(md5sum ${BASEDIR}/${f} | awk '{print $1}')
	HASH2=$(cat ${BASEDIR}/MD5SUM | grep ${f} | awk '{print $1}')

	[ ${HASH1} = ${HASH2} ] \
		|| panic "${f} has invalid hash ${HASH1}, expected ${HASH2}"

	echo "zcat ${f} | dd conv=fsync bs=${BLKSIZE} seek=${next} of=${TARGET}"
	zcat ${BASEDIR}/${f} \
		| dd conv=fsync bs=${BLKSIZE} seek=${next} of=${TARGET} \
		|| panic "failed to flash a block with ${f}"

	fw_setenv petitboot,mastering ${next}
	prev=${next}

	rm -f ${BASEDIR}/${f}
done

cleanup $SIGNATURE

/usr/bin/figlet SUCCESS

sleep 5
reboot
