#!/bin/ash

# 0 -- client
# 1 -- ap
cmp -s /etc/config/wireless /etc/config/wireless_client
CURRENT_MODE=$?

# The following two functions assume that the mode WILL BE changed with their call:
ap_mode() {
	logger -t NETWORK_MODE_CHANGE "Changing wireless configuration to AP mode."
	wifi down
	sleep 10
	cp /etc/config/wireless_ap /etc/config/wireless
	cp /etc/config/firewall_ap /etc/config/firewall
	# Firewall gets reloaded automatically
	wifi
	CURRENT_MODE=1
}

client_mode() {
	logger -t NETWORK_MODE_CHANGE "Changing wireless configuration to client mode."
	wifi down
	sleep 10
	cp /etc/config/wireless_client /etc/config/wireless
	cp /etc/config/firewall_client /etc/config/firewall
	# Firewall gets reloaded automatically
	wifi
	CURRENT_MODE=0
}

# Wait for DHCP to run on Ethernet after boot
sleep 60

while true; do
	# Network mode value meaning explained in /etc/network_mode/README
	NETWORK_MODE=$(cat /etc/network_mode/value)

	if [[ $NETWORK_MODE == 0 ]]; then
        if [[ $CURRENT_MODE == 0 ]]; then
            ap_mode
        fi
	elif [[ $NETWORK_MODE == 1 ]]; then
        # Force a renew state
        kill -s SIGUSR1 `pidof udhcpc`
        sleep 30

		# Check if default route is via Ethernet
		ip r list 0/0 | grep eth0.1 > /dev/null
		NO_CABLE_ROUTE=$?

		if [[ $CURRENT_MODE == 1 -a $NO_CABLE_ROUTE == 1 ]]; then
			client_mode
		elif [[ $CURRENT_MODE == 0 -a $NO_CABLE_ROUTE == 0 ]]; then
			ap_mode
		fi
	else
		logger -t NETWORK_MODE_CHANGE "Unknown network mode, check the configuration"
	fi

	sleep 5m
done
