#! /bin/sh

# Implementation idea for Ubuntu 18.04 is from: 
# https://blog.simos.info/how-to-use-lxd-container-hostnames-on-the-host-in-ubuntu-18-04/

LXDINTERFACE=lxdbr0
SEARCH_DOMAIN='lxd'
ROUTE_DOMAIN="~$SEARCH_DOMAIN"
resolved_real_resolv_conf='/run/systemd/resolve/resolv.conf'
OS_ID=$(. /etc/os-release && echo "${ID}"-"${VERSION_ID}")

die() {
	echo >&2 "$@"
	exit 1
}

# We need to create our own resolv.conf with "lxd" in the search list
calc_search() {
	sed -n 's/^search\s*//p' "$resolved_real_resolv_conf" |
		tr -s ' ' '\n' |
		grep -v "^$SEARCH_DOMAIN\$" |
		tr -s '\n' ' '
}

gen_resolv_conf() {
	echo "nameserver 127.0.0.53"
	echo "search $SEARCH_DOMAIN $(calc_search)"
}

show_resolv_conf() {
	ls -l /etc/resolv.conf >&2
	sed -e '/^\s*$/d' -e '/^#/d' -e 's/^/ | /' < /etc/resolv.conf >&2
}

[ "$#" -eq 1 ] || die "Usage: $0 {set|unset|show}"
action="$1"
shift

case "$action" in
set)
	LXDDNSIP="$(ip -4 addr show $LXDINTERFACE | grep -Po 'inet \K[\d.]+')"
	[ "$LXDDNSIP" != "" ] || die "E: Cannot find ip of '$LXDINTERFACE'"
	echo >&2 "Setting '$LXDINTERFACE' DNS to '$LXDDNSIP' for domain '$ROUTE_DOMAIN'"
	if [ "$OS_ID" = 'ubuntu-24.04' ]; then
		resolvectl dns "$LXDINTERFACE" "$LXDDNSIP"
		resolvectl domain "$LXDINTERFACE" "$ROUTE_DOMAIN"
	else
		/usr/bin/systemd-resolve --interface "$LXDINTERFACE" --set-dns "$LXDDNSIP" --set-domain "$ROUTE_DOMAIN"
		if gen_resolv_conf > "/etc/resolv.conf.tmp" && [ -s "/etc/resolv.conf.tmp" ]; then
			rm -f /etc/resolv.conf
			mv /etc/resolv.conf.tmp /etc/resolv.conf
		fi
		show_resolv_conf
	fi
	;;
unset)
	echo >&2 "Unsetting '$LXDINTERFACE' DNS"
	if [ "$OS_ID" = 'ubuntu-24.04' ]; then
		resolvectl revert "$LXDINTERFACE" 
	else
		ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
		/usr/bin/systemd-resolve --interface "$LXDINTERFACE" --revert
	fi
	show_resolv_conf
	;;
show)
	if [ "$OS_ID" = 'ubuntu-24.04' ]; then
		resolvectl status "$LXDINTERFACE"
	else
		/usr/bin/systemd-resolve --status "$LXDINTERFACE"
	fi
	show_resolv_conf
	;;
*)
	die "E: Unkown action '$action'"
	;;
esac
