#!/bin/sh

cat <<'EOF' >/etc/init.d/uboot-upgrade 2>/dev/null
#!/bin/sh /etc/rc.common

start() {
	MATCHED=0
	MODELS="
	routerich,ax3000
	routerich,ax3000-v1
	routerich,be7200
	"

	BOARD_NAME=$(ubus call system board | jsonfilter -e '@.board_name')
	MODEL_NAME=$(ubus call system board | jsonfilter -e '@.model' | tr 'A-Z' 'a-z' | awk '{print $2}')

	verify_file() {
		local file="$1"
		local md5_file="$file.md5"

		[ ! -f "$file" ] && return 1

		if [ ! -f "$md5_file" ]; then
			echo "uboot-upgrade: ${file##*.} md5 missing" > /dev/kmsg
			rm -f "$file"*
			return 1
		fi

		local expected actual
		expected=$(awk '{print $1}' "$md5_file")
		actual=$(md5sum "$file" | awk '{print $1}')

		if [ "$actual" != "$expected" ]; then
			echo "uboot-upgrade: ${file##*.} bad checksum" > /dev/kmsg
			rm -f "$file"*
			return 1
		fi

		return 0
	}

	check_spi() {
		spi=$(dmesg | grep -i "spi nand was found" | awk -F': ' '{print $2}' | awk '{print $1}' | tr 'A-Z' 'a-z')
		echo "$spi" | grep -Eq '^(winbond|esmt|fudan)$' || exit 0
	}

	flash_file() {
		local file="$1"
		local mtd="$2"

		echo "uboot-upgrade: checking ${file##*.}..." > /dev/kmsg

		insmod mtd-rw i_want_a_brick=1

		if mtd verify "$file" "$mtd" 2>&1 | grep -qi 'failed'; then
			insmod mtd-rw i_want_a_brick=1
			mtd write "$file" "$mtd" >/dev/null 2>&1
			echo "uboot-upgrade: upgrade ${file##*.} successful" > /dev/kmsg
		else
			echo "uboot-upgrade: no update required for ${file##*.}" > /dev/kmsg
		fi

		rmmod mtd-rw

		rm -f "$file"*

		return 0
	}

	for model in $MODELS; do
		[ "$BOARD_NAME" = "$model" ] && MATCHED=1 && break
	done

	[ "$MATCHED" -eq 0 ] && exit 0

	# check_spi

	bl2_file="/usr/share/routerich/uboot/routerich_$MODEL_NAME.bl2"
	fip_file="/usr/share/routerich/uboot/routerich_$MODEL_NAME.fip"

	bl2_mtd="/dev/$(grep -i bl2 /proc/mtd | awk '{print $1}' | tr -d ':')"
	fip_mtd="/dev/$(grep -i fip /proc/mtd | awk '{print $1}' | tr -d ':')"

	local has_bl2=0 has_fip=0
	verify_file "$bl2_file" && has_bl2=1
	verify_file "$fip_file" && has_fip=1

	if [ "$has_bl2" -eq 1 ] || [ "$has_fip" -eq 1 ]; then
		[ "$has_bl2" -eq 1 ] && flash_file "$bl2_file" "$bl2_mtd"
		[ "$has_fip" -eq 1 ] && flash_file "$fip_file" "$fip_mtd"
	fi
}
EOF

chmod +x /etc/init.d/uboot-upgrade
rm -f /etc/rc.d/S99uboot-upgrade
ln -s ../init.d/uboot-upgrade /etc/rc.d/S99uboot-upgrade
/etc/init.d/uboot-upgrade restart

exit 0
