#!/usr/bin/env bash

main() {

	local script_type="${1}"

	shift

	local dev="${1:-$dev}"

	shift

	if [[ -z "$script_type" ]]; then

		echo 'No script type specified'

		return 1

	elif [[ -z "$dev" ]]; then

		echo 'No device name specified'

		return 1

	else

		[ "$script_type" ] || exit 0
		[ "$dev" ] || exit 0

		resolvConfFile="/etc/resolv.conf"
		resolvConfBackupFile="/etc/resolv.conf.cyberghost"

		# detect whether systemd-resolved is the active resolver; if so the DNS
		# must be set via resolvectl, because nss-resolve queries systemd-resolved
		# directly and ignores /etc/resolv.conf (writing it has no effect)
		useResolved=0
		if command -v resolvectl > /dev/null 2>&1 && systemctl is-active --quiet systemd-resolved 2>/dev/null; then
			useResolved=1
		fi

		split_into_parts() {
			part1="$1"
			part2="$2"
			part3="$3"
		}

		case "$script_type" in
			up)
				NMSRVRS=""
				SRCHS=""
				for optionvarname in ${!foreign_option_*} ; do
					option="${!optionvarname}"
					split_into_parts $option
					if [ "$part1" = "dhcp-option" ] ; then
						if [ "$part2" = "DNS" ] ; then
							NMSRVRS="${NMSRVRS:+$NMSRVRS }$part3"
						elif [ "$part2" = "DOMAIN" ] ; then
							SRCHS="${SRCHS:+$SRCHS }$part3"
						fi
					fi
				done

				if [ "$useResolved" = "1" ]; then

					# point the tunnel interface at the VPN DNS and route ALL
					# lookups through it ("~." routing domain)
					if [ -n "$NMSRVRS" ]; then
						resolvectl dns "$dev" $NMSRVRS
					fi
					resolvectl domain "$dev" "~." $SRCHS
					resolvectl default-route "$dev" true 2>/dev/null || true

				else

					# fallback (no systemd-resolved): rewrite resolv.conf
					if [[ ! -f "${resolvConfBackupFile}" ]]; then
						if [[ ! -L "${resolvConfFile}" ]]; then
							cp "${resolvConfFile}" "${resolvConfBackupFile}"
						else
							mv "${resolvConfFile}" "${resolvConfBackupFile}"
						fi
					fi

					: > "${resolvConfFile}"

					for NS in $NMSRVRS ; do
						echo "nameserver $NS" >> "${resolvConfFile}"
					done
				fi
				;;

			down)

				if [ "$useResolved" = "1" ]; then

					# drop the tunnel interface's DNS settings
					resolvectl revert "$dev" 2>/dev/null || true

				else

					if [ -f "${resolvConfBackupFile}" ]; then
						if [ ! -L "${resolvConfBackupFile}" ]; then
							cp "${resolvConfBackupFile}" "${resolvConfFile}"
						else
							mv "${resolvConfBackupFile}" "${resolvConfFile}"
						fi
					fi
				fi
				;;
		esac

	fi
}

if [[ "${BASH_SOURCE[0]}" == "$0" ]] || [[ "$AUTOMATED_TESTING" == 1 ]]; then

	set -o nounset
	main "${script_type:-down}" "$@"
fi
