#!/bin/sh

start_fn ()
{
	local sleep_interval_default=360
	local sleep_interval_current=${sleep_interval_default}

	sleep ${sleep_interval_default} # wait just in case system is not yet ready

	local i2c_err_path=/var/local/telem/errors/i2c-bus
	local net_err_path=/var/local/telem/errors/usb-net

	local is_lan_pwr_toggled=false

	# get should be physical interfaces count
	local eth_interfaces_path=/var/local/telem/ordercode/eth_interfaces

	local eth_interfaces_path_err_msg_sent=false
	while true; do
		if [[ ! -e ${eth_interfaces_path} ]]; then
			if ${eth_interfaces_path_err_msg_sent}; then # log this error only once
				eth_interfaces_path_err_msg_sent=true
				logger -s -p "user.err" -t "$0" "${eth_interfaces_path} does not exist"
			fi
		else
			break;
		fi
		sleep ${sleep_interval_default}
	done

	local eth_interfaces_estimate_count="$(cat ${eth_interfaces_path})"

	while true; do
		if [[ -e ${net_err_path} ]]; then
			logger -s -p "user.info" -t "$0" "net error indicated by other process and probably is already being resolved"
			logger -s -p "user.info" -t "$0" "defer program execution for ${sleep_interval_default} seconds"
			sleep ${sleep_interval_default}
		fi

		while true; do
			# get current physical interfaces count
			local eth_interfaces_current_count="$(ifconfig | awk '/^(lan)?eth[0-9] /{print $1}' | wc -l)"
			if [[ "${eth_interfaces_current_count}" -lt "${eth_interfaces_estimate_count}" ]]; then
				logger -s -p "user.err" -t "$0" "current number of interfaces = ${eth_interfaces_current_count}, but has to be ${eth_interfaces_estimate_count}"

				if [[ -e ${i2c_err_path} ]]; then
					logger -s -p "user.info" -t "$0" "i2c error indicated by other process and probably is already being resolved"
					logger -s -p "user.info" -t "$0" "defer program execution for ${sleep_interval_default} seconds"
					sleep ${sleep_interval_default}
				fi

				if [[ -e ${i2c_err_path} ]]; then
					logger -s -p "user.err"  -t "$0" "possible i2c malfunction(s), skip lan power toggling"
					logger -s -p "user.info" -t "$0" "issue reboot"
					reboot # watchdog will assume this was a user initiated reboot. not good.
				fi

				if ${is_lan_pwr_toggled}; then
					logger -s -p "user.info" -t "$0" "toggling lan power did not resolve the issue"
					logger -s -p "user.info" -t "$0" "issue reboot and setup reload"
					touch /var/local/telem/reload_setup_on_boot # S11telem-config will unpack and apply the current setup after reboot
					reboot # watchdog will assume this was a user initiated reboot. not good.
					exit 1
				fi

				logger -s -p "user.info" -t "$0" "toggle lan power"
				/usr/local/bin/telem/gpio.sh -t LAN_BOARD_PWR OFFON
				is_lan_pwr_toggled=true
				sleep_interval_current=15
			elif ${is_lan_pwr_toggled}; then
				sleep_interval_current=${sleep_interval_default}
				is_lan_pwr_toggled=false
				logger -s -p "user.info" -t "$0" "toggling lan power seems to resolve the issue"
				break;
			fi
			sleep ${sleep_interval_current}
		done
		sleep ${sleep_interval_default}
	done
}

start() {
	# run in background
	start_fn &
}

case "$1" in
	start)
		start
		;;
	stop)
		: # do nothing
		;;
	*)
		echo "Usage: $0 start" >&2
		exit 1
		;;
esac
