]> www.infradead.org Git - users/dwmw2/vpnc-scripts.git/commitdiff
Add support for systemd-resolved
authorThiago Padilha <tpadilha84@gmail.com>
Thu, 20 Oct 2016 05:03:50 +0000 (02:03 -0300)
committerDavid Woodhouse <dwmw2@infradead.org>
Wed, 14 Dec 2016 13:14:05 +0000 (13:14 +0000)
Add support for modifying DNS information on systems using systemd-resolved.
The communication with systemd-resolved is done through dbus, which is
possible with the `busctl` program that comes with systemd version 229
and later.

Signed-off-by: Thiago de Arruda <tpadilha84@gmail.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
vpnc-script

index 8006a986f29924ff218d61bfda82cb397513b749..6302987fdee2df61469c932cbdc3b146f19a0f93 100755 (executable)
@@ -121,6 +121,9 @@ if [ -r /etc/openwrt_release ] && [ -n "$OPENWRT_INTERFACE" ]; then
        include /lib/network
        MODIFYRESOLVCONF=modify_resolvconf_openwrt
        RESTORERESOLVCONF=restore_resolvconf_openwrt
+elif [ -x /usr/bin/busctl ]; then  # For systemd-resolved (version 229 and above)
+       MODIFYRESOLVCONF=modify_resolved_manager
+       RESTORERESOLVCONF=restore_resolved_manager
 elif [ -x /sbin/resolvconf ]; then # Optional tool on Debian, Ubuntu, Gentoo and FreeBSD
        MODIFYRESOLVCONF=modify_resolvconf_manager
        RESTORERESOLVCONF=restore_resolvconf_manager
@@ -576,6 +579,60 @@ 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}
+}
+
+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}
+}
+
+modify_resolved_manager() {
+       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)
+       busctl_call RevertLink 'i' $if_index
+}
+
 # === resolv.conf handling via unbound =========
 
 modify_resolvconf_unbound() {