From 01dbf03628fbddff46b60354407d23497c25a566 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 4 Apr 2017 14:18:49 +0200 Subject: network-link-*.service: Set stopIfChanged = false This reduces the time window during which IP addresses are gone during switch-to-configuration. A complication is that with stopIfChanged = true, preStop would try to delete the *new* IP addresses rather than the old one (since the preStop script now runs after the switch to the new configuration). So we now record the actually configured addresses in /run/nixos/network/addresses/. This is more robust in any case. Issue https://github.com/NixOS/nixops/issues/640. --- .../modules/tasks/network-interfaces-scripted.nix | 31 +++++++++++++--------- 1 file changed, 19 insertions(+), 12 deletions(-) (limited to 'nixos/modules/tasks') diff --git a/nixos/modules/tasks/network-interfaces-scripted.nix b/nixos/modules/tasks/network-interfaces-scripted.nix index f30906b84a24..720891d518a7 100644 --- a/nixos/modules/tasks/network-interfaces-scripted.nix +++ b/nixos/modules/tasks/network-interfaces-scripted.nix @@ -159,35 +159,42 @@ let after = [ "network-pre.target" ] ++ (deviceDependency i.name); serviceConfig.Type = "oneshot"; serviceConfig.RemainAfterExit = true; + # Restart rather than stop+start this unit to prevent the + # network from dying during switch-to-configuration. + stopIfChanged = false; path = [ pkgs.iproute ]; script = '' + # FIXME: shouldn't this be done in network-link? echo "bringing up interface..." ip link set "${i.name}" up - restart_network_interfaces=false + state="/run/nixos/network/addresses/${i.name}" + + mkdir -p $(dirname "$state") + '' + flip concatMapStrings (ips) (ip: let address = "${ip.address}/${toString ip.prefixLength}"; in '' - echo "checking ip ${address}..." + echo "${address}" >> $state if out=$(ip addr add "${address}" dev "${i.name}" 2>&1); then - echo "added ip ${address}..." + echo "added ip ${address}" elif ! echo "$out" | grep "File exists" >/dev/null 2>&1; then echo "failed to add ${address}" exit 1 fi ''); - preStop = flip concatMapStrings (ips) (ip: - let - address = "${ip.address}/${toString ip.prefixLength}"; - in - '' - echo -n "deleting ${address}..." - ip addr del "${address}" dev "${i.name}" >/dev/null 2>&1 || echo -n " Failed" - echo "" - ''); + preStop = '' + state="/run/nixos/network/addresses/${i.name}" + while read address; do + echo -n "deleting $address..." + ip addr del "$address" dev "${i.name}" >/dev/null 2>&1 || echo -n " Failed" + echo "" + done < "$state" + rm -f "$state" + ''; }; createTunDevice = i: nameValuePair "${i.name}-netdev" -- cgit 1.4.1