#!/bin/bash

GATEWAY_IP="192.168.5.1"
PING_DELAY_S=30
RECONNECT_ATTEMPTS=10
RECONNECT_DELAY=60
WG_INTERFACE="home"
REBOOT_AFTER_FAILED_ATTEMPTS=true

FAILED_ATTEMPTS=0

function is_host_reachable() {
	for i in {1..5}; do
		if ping -c 1 "$1" > /dev/null; then
			return 0
		fi
		echo "WARNING: Failed to ping $GATEWAY_IP"
	done
	return 1
}

while : ; do
	if ! wg show "$WG_INTERFACE" > /dev/null; then
		echo "INFO: WG interface $WG_INTERFACE is not active, not doing anything"
		sleep "$PING_DELAY_S"
		continue
	fi

	if ! is_host_reachable "$GATEWAY_IP" > /dev/null; then
		echo "ERROR: ($GATEWAY_IP) is not reachable. Restarting interface $WG_INTERFACE"

		FAILED_ATTEMPTS=$(( FAILED_ATTEMPTS + 1))
		if (( FAILED_ATTEMPTS > RECONNECT_ATTEMPTS )); then
			echo "WARNING: Failed $FAILED_ATTEMPTS times to recover connection..."
			if $REBOOT_AFTER_FAILED_ATTEMPTS; then
				echo "INFO: Rebooting..."
				reboot
			else
				echo "INFO: Will continue trying..."
				FAILED_ATTEMPTS=$(( 0 ))
			fi
		fi

		wg-quick down "$WG_INTERFACE"
		echo "INFO: Stopped WG interface $WG_INTERFACE"
		sleep "$RECONNECT_DELAY"
		if ! wg-quick up "$WG_INTERFACE"; then
			echo "WARNING: Failed starting the interface..."
		else
			echo "INFO: Started WG interface $WG_INTERFACE"
		fi
	fi
	sleep "$PING_DELAY_S"

done

