#!/bin/bash

. /etc/functions

TRACE_FUNC

mobile_tethering()
{
	TRACE_FUNC
	#Tethering over USB for Mobile phones supporting CDC (Android Pixel 6a+, Librem phone, etc.)
	if [ -e /lib/modules/cdc_ether.ko ]; then
		#prompt user if he wants to enable USB tethering and skip if not
		echo ""
		echo "USB tethering support is available for mobile phones supporting CDC NCM/EEM tethering"
		read -p "Do you want to enable USB tethering now? (Y/n)" -n 1 -r REPLY
		echo ""
		if [[ $REPLY =~ ^[Nn]$ ]]; then
			echo "USB tethering not enabled, skipping..."
			return 0
		fi

		#first enable USB controllers
		enable_usb

		echo ""
		echo "Please connect your mobile phone to a USB port and enable internet connection sharing."
		echo "* Android: Select the 'Charging this device via USB' notification and enable tethering."
		echo "* Linux: Set the wired connection's IPv4 method on the mobile phone to 'Shared to other computers'."
		echo "Heads supports CDC-NCM and CDC-EEM.  Android phones using RNDIS and Apple phones are not supported."
		echo ""
		read -p "Press Enter to continue..." -n 1 -r

		network_modules="mii usbnet cdc_ether cdc_ncm cdc_eem"
		for module in $(echo $network_modules); do
			if [ -f /lib/modules/$module.ko ]; then
				insmod /lib/modules/$module.ko
			fi
		done

		if ! [ -e /sys/class/net/usb0 ]; then
			echo ""
			echo "No tethering network interface was found."
			echo "* Make sure the phone supports CDC-NCM or CDC-EEM.  Many, but not all, Android and Linux phones support these."
			echo "* Android phones requiring RNDIS and Apple phones are not supported."
			echo "* Make sure the cable used works with data and that the phone has tethering enabled."
			echo ""
			read -p "Press Enter to continue..." -n 1 -r
		fi
	fi
}

ethernet_activation()
{
	TRACE_FUNC
	#Prompt user if he wants to enable ethernet and skip if not
	read -p "Do you want to enable Ethernet now? (Y/n)" -n 1 -r REPLY
	echo ""
	if [[ $REPLY =~ ^[Nn]$ ]]; then
		echo "Ethernet not enabled, skipping..."
		return 0
	fi

	echo "Loading Ethernet network modules..."
	network_modules="e1000 e1000e igb sfc mdio mlx4_core mlx4_en"
	for module in $(echo $network_modules); do
		if [ -f /lib/modules/$module.ko ]; then
			insmod /lib/modules/$module.ko
		fi
	done
}

# bring up the ethernet interface
ifconfig lo 127.0.0.1

mobile_tethering
ethernet_activation

if [ -e /sys/class/net/usb0 ]; then
	dev=usb0
	echo "USB tethering network interface detected as $dev"
elif [ -e /sys/class/net/eth0 ]; then
	dev=eth0
	echo "Ethernet network interface detected as $dev"
else
	echo "No network interface detected, please check your hardware and board configuration"
	exit 1
fi

if [ -n "$dev" ]; then
	
	#Randomize MAC address for maximized boards
	if echo "$CONFIG_BOARD" | grep -q maximized; then
		ifconfig $dev down
		echo "Generating random MAC address..."
		mac=$(generate_random_mac_address)
		echo "Assigning randomly generated MAC: $mac to $dev..."
		ifconfig $dev hw ether $mac
		ifconfig $dev up
	fi

	# Set up static IP if configured in board config
	if [ ! -z "$CONFIG_BOOT_STATIC_IP" ]; then
		echo "Setting static IP: $CONFIG_BOOT_STATIC_IP"
		ifconfig $dev $CONFIG_BOOT_STATIC_IP
		echo "No NTP sync with static IP: no DNS server nor gateway defined, set time manually"
	# Set up DHCP if no static IP
	elif [ -e /sbin/udhcpc ]; then
		echo "Getting IP from first DHCP server answering. This may take a while..."
		if udhcpc -T 1 -i $dev -q; then
			if [ -e /sbin/ntpd ]; then
				DNS_SERVER=$(grep nameserver /etc/resolv.conf | awk -F " " {'print $2'})
				killall ntpd 2 &>1 >/dev/null
				echo "Attempting to sync time with NTP server: $DNS_SERVER..."
				if ! ntpd -d -N -n -q -p $DNS_SERVER; then
					echo "NTP sync unsuccessful with DNS server"
					echo "Attempting NTP time sync with pool.ntp.org..."
					if ! ntpd -d -d -N -n -q -p pool.ntp.org; then
						echo "NTP sync unsuccessful."
					else
						echo "NTP time sync successful."
					fi
				fi
				echo "Syncing hardware clock with system time in UTC/GMT timezone..."
				hwclock -w
				echo ""
				date=$(date "+%Y-%m-%d %H:%M:%S %Z")
				echo "Time: $date"
			fi
		fi
	fi

	if [ -e /bin/dropbear ]; then
		# Set up the ssh server, allow root logins and log to stderr
		if [ ! -d /etc/dropbear ]; then
			mkdir /etc/dropbear
		fi
		echo "Starting dropbear ssh server..."
		# Make sure dropbear is not already running
		killall dropbear > /dev/null 2>&1 || true
		# Start dropbear with root login and log to stderr
		# -B background
		# -R create host keys
		dropbear -B -R
	fi
	echo ""
	echo "Network setup complete:"
	ifconfig $dev
fi
