From 0e8666d46d353dd8db3d7060485a44d332bf6dc5 Mon Sep 17 00:00:00 2001 From: Daniel Lenski Date: Tue, 8 Sep 2020 19:23:35 -0700 Subject: [PATCH] leave support for older systemd-resolved (v229-v238) in place Signed-off-by: Daniel Lenski --- vpnc-script | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/vpnc-script b/vpnc-script index 6cae9cf..ac67c37 100755 --- a/vpnc-script +++ b/vpnc-script @@ -131,9 +131,13 @@ if [ -r /etc/openwrt_release ] && [ -n "$OPENWRT_INTERFACE" ]; then MODIFYRESOLVCONF=modify_resolvconf_openwrt RESTORERESOLVCONF=restore_resolvconf_openwrt elif [ -x /usr/bin/resolvectl ] && [ ${RESOLVEDENABLED} = 1 ]; then - # For systemd-resolved (version 229 and above) + # For systemd-resolved (version 239 and above) MODIFYRESOLVCONF=modify_resolved_manager RESTORERESOLVCONF=restore_resolved_manager +elif [ -x /usr/bin/busctl ] && [ ${RESOLVEDENABLED} = 1 ]; then + # For systemd-resolved (version 229 and above) + MODIFYRESOLVCONF=modify_resolved_manager_old + RESTORERESOLVCONF=restore_resolved_manager_old elif [ -x /sbin/resolvconf ]; then # Optional tool on Debian, Ubuntu, Gentoo and FreeBSD MODIFYRESOLVCONF=modify_resolvconf_manager @@ -699,12 +703,33 @@ restore_resolvconf_manager() { /sbin/resolvconf -d $TUNDEV } +AF_INET=2 + get_if_index() { local link link="$(ip link show dev "$1")" || return $? echo ${link} | awk -F: '{print $1}' } +busctl_call() { + local dest node + dest=org.freedesktop.resolve1 + node=/org/freedesktop/resolve1 + busctl call "$dest" "${node}" "${dest}.Manager" "$@" +} + +busctl_set_nameservers() { + local if_index addresses args addr + if_index=$1 + shift + addresses="$@" + args="$if_index $#" + for addr in ${addresses}; do + args="$args ${AF_INET} 4 $(echo $addr | sed 's/[.]/ /g')" + done + busctl_call SetLinkDNS 'ia(iay)' ${args} +} + resolvectl_set_nameservers() { local if_index addresses if_index=$1 @@ -713,6 +738,18 @@ resolvectl_set_nameservers() { /usr/bin/resolvectl dns $if_index $addresses } +busctl_set_search() { + local if_index domains args domain + if_index=$1 + shift + domains="$@" + args="$if_index $#" + for domain in ${domains}; do + args="$args ${domain} false" + done + busctl_call SetLinkDomains 'ia(sb)' ${args} +} + resolvectl_set_search() { local if_index domains if_index=$1 @@ -731,12 +768,27 @@ modify_resolved_manager() { fi } +modify_resolved_manager_old() { + local if_index + if_index=$(get_if_index $TUNDEV) + busctl_set_nameservers $if_index $INTERNAL_IP4_DNS + if [ -n "$CISCO_DEF_DOMAIN" ]; then + busctl_set_search $if_index $CISCO_DEF_DOMAIN + fi +} + restore_resolved_manager() { local if_index if_index=$(get_if_index $TUNDEV) /usr/bin/resolvectl revert $if_index } +restore_resolved_manager_old() { + local if_index + if_index=$(get_if_index $TUNDEV) + busctl_call RevertLink 'i' $if_index +} + # === resolv.conf handling via unbound ========= modify_resolvconf_unbound() { -- 2.50.1