#!/bin/sh

#
# factory set -sn 22018C010005 -date 20200526 -mac 00:19:55:02:67:32 -hwver 3.0.0.1 -product WooLink2102-W-4G
# Set SN to 22018C010005
# set MAC to 00:19:55:02:67:32
# set DATE to 20200526
# set HWVER to 3.0.0.1
# set PRODUCT to WooLink2102-W-4G
# set PRODUCT to WLOSANY_LC100
# 
# factory get
# PRODUCT:	   WooLink2102-W-4G
# SN:		   22018C010005
# DATE:		   20200526
# HWVER:	   3.0.0.1
# MAC:		   00:19:55:02:67:32
#

export PATH=/opt/lnxall_app/bin:/opt/lnxall_app/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin

help() {
	cat <<_HELP_
Setup hardware information.
Usage: $0 {set|get} [-sn SN] [-date DATE ] [-mac MAC ] [-hwver HWVER ] [-product PRODUCT]
		-sn SN # board SN
		-date DATE # manufactory date
		-mac MAC # base MAC addr
		-hwver HWVER # hardware version
		-product PRODUCT # product name
Example:
	$0 set -sn 22018C010005 -date 20200526 -mac 00:19:55:02:67:32 -hwver 3.0.0.1 -product WooLink2102-W-4G
	$0 get 
_HELP_
}

G_ACTION=
G_SN=
G_DATE=
G_MAC=
G_HWVER=
G_PRODUCT=
G_DO_NETUCI=0
FACSET=set_facini
FACGET=get_facini

parse_json_file() {
	local jfile="$1"
	local jele="$2"

	local luacode="local cjson = require 'cjson' ; local fh = io.open('${jfile}', 'rb') ; if not fh then os.exit(1) end ; local fd = fh:read('*a'); if not fd then os.exit(2) end; local okay, fjdat = pcall(cjson.decode, fd); if not okay or type(fjdat) ~= 'table' then os.exit(3) end ; local result = fjdat['${jele}'] ; if type(result) == 'string' then io.stdout:write(result .. \"\n\") end; os.exit(0)"

	outval="$(lua -e "${luacode}")"
	if [ -n "${outval}" ] ; then
		return 0
	fi
	return 1
}

choose_factory_tool() {
	local fjson=/etc/facini/facini.json
	chattr -i ${fjson} 2>/dev/null
	if [ ! -f /usr/bin/fw_printenv ] ; then
		return 1
	fi

	local md5="$(md5sum /usr/bin/fw_printenv | awk '{print $1}')"
	if [ "${md5}" != '96b165f4ce64add72df027b34d3f6f4c' ] ; then
		return 2
	fi

	# use fw_setenv/fw_printenv
	FACSET=fw_setenv
	FACGET=fw_printenv
	if [ -s ${fjson} ] ; then
		# translate `facini.json to u-boot information

		local outval=''
		parse_json_file ${fjson} PRODUCT
		if [ $? -eq 0 ] ; then
			${FACSET} PRODUCT "${outval}"
			sync
		fi

		parse_json_file ${fjson} SN
		if [ $? -eq 0 ] ; then
			${FACSET} SN "${outval}"
			sync
		fi

		parse_json_file ${fjson} mac
		if [ $? -eq 0 ] ; then
			${FACSET} mac "${outval}"
			sync
		fi

		rm -rf ${fjson} ; sync
	fi
	return 0
}

choose_factory_tool
case "$1" in
	set) G_ACTION="$1" ;;
	get) G_ACTION="$1" ;;
	*) help ; exit 1 ;;
esac
shift 1

while [ -n "$1" ]; do
	case "$1" in
		-sn) G_SN="$2" ; shift 2 ;;
		-date) G_DATE="$2" ; shift 2 ;;
		-mac) G_MAC="$2" ; shift 2 ;;
		-hwver) G_HWVER="$2" ; shift 2 ;;
		-product) G_PRODUCT="$2" ; shift 2 ;;
		--) shift ; break ;;
		-*) help ; exit 1 ;;
		*) break ;;
	esac
done

set_sn() {
	echo "Set SN to $1"
	${FACSET} SN "$1"

	echo "$1" > /etc/hostname
}

set_mac() {
	echo "set MAC to $1"
	${FACSET} mac "$1"

	# specific for RK3568 gateway
	uci delete network.wan.macaddr >/dev/null 2>/dev/null
	uci delete network.wan.macaddr >/dev/null 2>/dev/null
	uci set "network.wan.macaddr=$1" && uci commit
	uci_set_mac wan1 "$1" 1
	G_DO_NETUCI=1
}

set_date() {
	echo "set DATE to $1"
	${FACSET} DATE "$1"
}

set_hwver() {
	echo "set HWVER to $1"
	${FACSET} HWVER "$1"
}

set_product() {
	echo "set PRODUCT to $1"
	${FACSET} PRODUCT "$1"
}

mainfunc() {
	if [ "${G_ACTION}" = "set" ] ; then
		[ -n "${G_SN}" ] && set_sn "${G_SN}"
		[ -n "${G_MAC}" ] && set_mac "${G_MAC}"
		[ -n "${G_DATE}" ] && set_date "${G_DATE}"
		[ -n "${G_HWVER}" ] && set_hwver "${G_HWVER}"
		[ -n "${G_PRODUCT}" ] && set_product "${G_PRODUCT}"

		# for any possibly modified network options in `/etc/config/network,
		# call netuci script to carry out the modifications:
		[ "${G_DO_NETUCI}" = "1" ] && netuci
		sync ; reboot -n 2
	elif [ "${G_ACTION}" = "get" ];then
		local product="$(${FACGET} -n PRODUCT 2>/dev/null)"
		local sn="$(${FACGET} -n SN 2>/dev/null)"
		local date="$(${FACGET} -n DATE 2>/dev/null)"
		local hwver="$(${FACGET} -n HWVER 2>/dev/null)"
		local mac="$(${FACGET} -n mac 2>/dev/null)"

		echo "PRODUCT=$product"
		echo "SN=$sn"
		echo "DATE=$date"
		echo "HWVER=$hwver"
		echo "MAC=$mac"
	else
		help
		exit 1
	fi
}

mainfunc
