From ae82bbbacecec56e1f893fd038ca10323f8760f0 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Thu, 3 Aug 2017 16:13:05 +0200 Subject: [PATCH] examples: improve NetworkManager dispatcher script When no default route is configured, check each source if it has a route. If the system has multiple network interfaces, this prevents setting local NTP servers to offline when they can still be reached over one of the interfaces. --- examples/chrony.nm-dispatcher | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/examples/chrony.nm-dispatcher b/examples/chrony.nm-dispatcher index 084aed6..51d7fa2 100644 --- a/examples/chrony.nm-dispatcher +++ b/examples/chrony.nm-dispatcher @@ -1,17 +1,35 @@ #!/bin/sh # This is a NetworkManager dispatcher script for chronyd to set its NTP sources -# online/offline when a default route is configured/removed on the system. +# online or offline when a network interface is configured or removed export LC_ALL=C -if [ "$2" = "up" ]; then - /sbin/ip route list dev "$1" | grep -q '^default' && - /usr/bin/chronyc online > /dev/null 2>&1 +# Check if there is a default route + +if /sbin/ip route list 2> /dev/null | grep -q '^default'; then + chronyc online > /dev/null 2>&1 + exit 0 fi -if [ "$2" = "down" ]; then - /sbin/ip route list | grep -q '^default' || - /usr/bin/chronyc offline > /dev/null 2>&1 -fi +sources=$(chronyc -c -n sources 2> /dev/null) + +[ $? -ne 0 ] && exit 0 + +# Check each configured source if it has a route + +echo "$sources" | while IFS=, read mode state address rest; do + [ "$mode" != '^' ] && [ "$mode" != '=' ] && continue + + /sbin/ip route get "$address" > /dev/null 2>&1 && command="online" || command="offline" + + # Set priority of sources so that the selected source is set as + # last if offline to avoid unnecessary reselection + [ "$state" != '*' ] && priority=1 || priority=2 + + echo "$priority $command $address" + +done | sort | while read priority command address; do + echo "$command $address" +done | chronyc > /dev/null 2>&1 exit 0