#!/bin/sh

# Created by jiaqiang.ye@lnxall.com
# Lnxall initialization for System
# 2023/03/07

# IMPORTANT: DO NOT CREATE RUNNING PROCESSES WHICH
# CONTINUES TO RUN AFTER THE SCRIPT'S TERMINATION.
# PLEASE DO EXIT SCRIPT WITH ZERO STATUS

create_sysinfo() {
	local retv=0
	local sysdir='/tmp/sysinfo'

	# create /tmp/sysinfo directory
	mkdir -p -m 0755 ${sysdir} ; retv=$?
	[ $retv -ne 0 ] && return 1

	# write board_name file
	if [ ! -f "${sysdir}/board_name" ] ; then
		echo 'WLOSANY_LC100' > "${sysdir}/board_name"
		retv=$?
		chmod 644 "${sysdir}/board_name"
		[ $retv -ne 0 ] && return 2
	fi

	# write model file
	if [ ! -f "${sysdir}/model" ] ; then
		echo 'WLOSANY_MODEL' > "${sysdir}/model"
		retv=$?
		chmod 644 "${sysdir}/model"
	fi
	return $retv
}

create_dir() {
	local dirp="$1"
	if [ -d "${dirp}" ] ; then
		# already created, just return
		return 0
	fi

	[ -e "${dirp}" ] && rm -rf "${dirp}"
	mkdir -p "${dirp}"
	return $?
}

# TODO: to be removed platform dependent function.
# setup tty serial device for Ubuntu 20.04
setup_ttyserial() {
	if [ ! -c '/dev/ttylnx1' ] ; then
		ln -sv /dev/ttyACM1 /dev/ttylnx1
		ln -sv /dev/ttyACM2 /dev/ttylnx2
		ln -sv /dev/ttyACM0 /dev/ttylnx3
		ln -sv /dev/ttyACM3 /dev/ttylnx4
		ln -sv /dev/ttymxc1 /dev/ttylnx5
		ln -sv /dev/ttymxc2 /dev/ttylnx6
		ln -sv /dev/ttymxc3 /dev/ttylnx7
		ln -sv /dev/ttymxc4 /dev/ttylnx8
		return $?
	fi
	return 0
}

setup_can() {
	map="
can0:lnxcan1;
can1:lnxcan2;
"
	echo "$map" | while IFS= read -r line; do
		[ -z "$line" ] && continue
		#
		old_name=$(echo "$line" | cut -d':' -f1)
		new_name=$(echo "$line" | cut -d':' -f2 | cut -d';' -f1)
		#
		if ip -br link show "$old_name" > /dev/null 2>&1; then
			ip link set $old_name down && ip link set $old_name name $new_name
			if [ $? -ne 0 ]; then
				echo "Failed to rename $old_name to $new_name"
			else
				echo "Successfully renamed $old_name to $new_name"
			fi
		else
			echo "$old_name does not exist"
		fi
	done

	return 0
}

# modify GW_SN in /app/config/fac.ini
modify_gwsn() {
	local facini='/app/config/fac.ini'
	if [ ! -f "${facini}" ] ; then
		echo "Warning, file not found: '${facini}'" 1>&2
		return 0
	fi
	sed -e 's/21012C00FFFF/202303080917/g' -i "${facini}"
	return 0
}

# in order for br-lan to work on iMX6UL
# 1, /proc/sys/net/ipv4/ip_forward should be 1;
# 2, NAT should be enabled with iptables.
brlan_setup() {
	if [ "$(cat /proc/sys/net/ipv4/ip_forward)" != "1" ] ; then
		echo 1 > /proc/sys/net/ipv4/ip_forward
	fi

	# wait until kernel module `iptable_nat is inserted
	if [ -e '/lib/modules/4.1.0/iptable_nat.ko' ] ; then
		local wcnt=0
		local lsmo="$(lsmod | grep -e iptable_nat)"
		while [ -z "${lsmo}" ] ; do
			sleep 1
			wcnt=$((wcnt + 1))
			[ ${wcnt} -ge 16 ] && break
			lsmo="$(lsmod | grep -e iptable_nat)"
		done
	fi

	local masq="$(iptables-legacy -t nat -L POSTROUTING | grep -e MASQUERADE | wc -l)"
	[ -z "${masq}" ] && masq=0
	if [ ${masq} -le 1 ] ; then
		# does this have any other side effects?
		iptables-legacy -t nat -A POSTROUTING -o eth1     -j MASQUERADE
		iptables-legacy -t nat -A POSTROUTING -o usb0     -j MASQUERADE
	fi
	return 0
}

update_wan1lan_mac() {
	local wanmac="$(uci get network.wan.macaddr)"
	[ -z "${wanmac}" ] && wanmac="$(factory get | awk -F= '/MAC=/{print $2}')"
	if [ ${#wanmac} -eq 17 ] ; then
		local donet=0
		uci_set_mac lan "${wanmac}" 2 && donet=1
		uci_set_mac wan1 "${wanmac}" 1 && donet=1
		[ ${donet} -eq 1 ] && nothup /bin/sh -c 'sleep 6 ; netuci'
	fi
	return 0
}

mainfunc() {
	local rval=0
	if [ -e /opt/lnxall_app/bin/dynnat.lua ] ; then
		nothup lua /opt/lnxall_app/bin/dynnat.lua
	else
		brlan_setup
	fi
	mkdir -p /var/crash/coredumps
	# update linux kernel coredump pattern
	echo '/var/crash/coredumps/%E-%t-%p-%s.core' > /proc/sys/kernel/core_pattern

	create_dir '/var/run/lnxall' ; rval=$?
	if [ ${rval} -ne 0 ] ; then
		echo "Error, failed to create /var/run/lnxall directory!" 1>&2
		return 1
	fi

	create_sysinfo ; rval=$?
	if [ ${rval} -ne 0 ] ; then
		echo "Error, function has failed: create_info: ${rval}" 1>&2
		return 2
	fi

	setup_can
	setup_ttyserial ; retv=$?
	#modify_gwsn
	update_wan1lan_mac
	return $retv
}

mainfunc ; exit $?

