This fixed the following dependency loop that could occur when the system was booting up: 1. NetworkManager configures a network interface and fires off the clatd dispatcher script. 2. The dispatcher scripts tries to restart `clatd.service`. 3. However, `clatd.service` cannot be (re)started at this point because its dependency `network-online.target` has not yet been reached. 4. Therefore, the `systemctl restart clatd.service` command in the dispatcher script blocks, waiting for `network-online.target` to be reached. 5. But that won't happen until the dispatcher scripts finishes... Adding `--no-block` allows the dispatcher script to finish immediately without waiting for the restart to complete (instead, systemd will do it in the background once `network-online.target` has been reached). Furthermore, since `clatd.service` may end up being restarted several times during a boot process (especially on a system with many network interfaces handled by NetworkManager), it is also at risk of inadvertently triggering the restart rate-limiting feature in systemd, so disable that while we're at it. Closes #22. Thanks to @patrakov for the report!
37 lines
1.3 KiB
Bash
37 lines
1.3 KiB
Bash
#!/bin/sh
|
|
#
|
|
# clatd dispatcher script for NetworkManager
|
|
#
|
|
# Install it to: /etc/NetworkManager/dispatcher.d/50-clatd
|
|
#
|
|
# Written by Tore Anderson <tore@fud.no>
|
|
#
|
|
|
|
# Newer NetworkManager versions will run the dispatcher scripts once
|
|
# a new unmanaged interface shows up, including the 'clat' interface
|
|
# created by clatd/TAYGA. So if we're being called due to our own
|
|
# interface showing up, do nothing, otherwise we will end up
|
|
# committing suicide from the restarts below
|
|
[ "$DEVICE_IFACE" = "clat" ] && exit 0
|
|
|
|
# We're only acting on interface "up" or "down" events. NM will run the
|
|
# dispatcher scripts for other events we're not interested in, like the
|
|
# hostname being set or a DHCP lease being renewed. Ignore those.
|
|
[ "$2" != "up" ] && [ "$2" != "down" ] && exit 0
|
|
|
|
# We simply restart clatd in all situations, as no matter if an interface
|
|
# goes up or down, it may mean that the PLAT device changes, it may mean
|
|
# native IPv4 appearing or disappearing, or it may mean that DNS64 became
|
|
# available or unavailable...it's far easier to simply restart always and
|
|
# start from scratch than to figure out if a restart is truly necessary
|
|
|
|
# systemd-based distros
|
|
if which systemctl &> /dev/null; then
|
|
systemctl --no-block restart clatd.service
|
|
fi
|
|
|
|
# upstart-based distros
|
|
if test -x /sbin/initctl; then
|
|
/sbin/initctl restart clatd
|
|
fi
|