Historically there were plenty of callback based implementations around ifupdown via /etc/network/if-up and similar. NetworkManager added the dispatcher [1] feature for such a kind of functionality. But so far a systemd-networkd (only) systemd had no means to handle those cases. This is solved by networkd-dispatcher which is currently available at least in ArchLinux and Ubuntu. It takes away the responsibility to listen on netlink events in each application and provides a more classic script-drop-in interface to respond to networkd events [3]. This commit makes the NM example compatible to be used by NetworkManager dispatcher as well as by networkd-dispatcher. That way we avoid too much code duplication and can from now on handle special cases in the beginning so that the tail can stay commonly used. After discussion on IRC the current check differs by checking the argument count (only in NetworkManager), if ever needed we could extend that to check for known custom environment vars (NetworkManager => CONNECTION_UUID; networkd-dispatcher => OperationalState). [1]: https://developer.gnome.org/NetworkManager/stable/NetworkManager.html [2]: https://github.com/craftyguy/networkd-dispatcher [3]: https://github.com/systemd/systemd/blob/master/src/systemd/sd-network.h#L86 Signed-off-by: Christian Ehrhardt <christian.ehrhardt@canonical.com>
41 lines
1.2 KiB
Bash
41 lines
1.2 KiB
Bash
#!/bin/sh
|
|
# This is a NetworkManager dispatcher / networkd-dispatcher script for
|
|
# chronyd to set its NTP sources online or offline when a network interface
|
|
# is configured or removed
|
|
|
|
export LC_ALL=C
|
|
|
|
# For NetworkManager consider only up/down events
|
|
[ $# -ge 2 ] && [ "$2" != "up" ] && [ "$2" != "down" ] && exit 0
|
|
|
|
# Note: for networkd-dispatcher routable.d ~= on and off.d ~= off
|
|
|
|
# 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
|
|
|
|
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
|