From 4795dd05b79c3bd18f2909faa8baf9cd559864d8 Mon Sep 17 00:00:00 2001 From: Daniel Barlow Date: Wed, 3 Apr 2024 23:07:56 +0100 Subject: [PATCH] unconditionally restart trigger services on liminix-rebuild We call s6-rc -u -p default to restart/start the base services on a rebuild, otherwise services that are only in the new configuration won't come up. However, this stops any service started by a trigger. So, workaround is to restart the trigger service and expect it to restart the services it manages if they're needed --- modules/ifwait/ifwait.nix | 1 + pkgs/liminix-tools/services/builder.sh | 2 +- pkgs/liminix-tools/services/default.nix | 2 ++ pkgs/s6-rc-database/default.nix | 9 +++++++-- pkgs/systemconfig/restart-services.fnl | 7 +++++-- 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/modules/ifwait/ifwait.nix b/modules/ifwait/ifwait.nix index 4c28b52..ee5d957 100644 --- a/modules/ifwait/ifwait.nix +++ b/modules/ifwait/ifwait.nix @@ -9,6 +9,7 @@ let in longrun { name = "ifwait.${interface.name}"; buildInputs = [ service ]; + isTrigger = true; run = '' ${ifwait}/bin/ifwait -s ${service.name} $(output ${interface} ifname) ${state} ''; diff --git a/pkgs/liminix-tools/services/builder.sh b/pkgs/liminix-tools/services/builder.sh index 744a86e..5edfa5d 100644 --- a/pkgs/liminix-tools/services/builder.sh +++ b/pkgs/liminix-tools/services/builder.sh @@ -11,7 +11,7 @@ test -n "$contents" && for d in $contents; do touch $out/${name}/contents.d/$d done -for i in timeout-up timeout-down run notification-fd up down consumer-for producer-for pipeline-name ; do +for i in timeout-up timeout-down run notification-fd up down consumer-for producer-for pipeline-name restart-on-upgrade; do test -n "$(printenv $i)" && (echo "$(printenv $i)" > $out/${name}/$i) done diff --git a/pkgs/liminix-tools/services/default.nix b/pkgs/liminix-tools/services/default.nix index 881fea0..34c9b7e 100644 --- a/pkgs/liminix-tools/services/default.nix +++ b/pkgs/liminix-tools/services/default.nix @@ -36,12 +36,14 @@ let , dependencies ? [] , contents ? [] , buildInputs ? [] + , isTrigger ? false } @ args: stdenvNoCC.mkDerivation { # we use stdenvNoCC to avoid generating derivations with names # like foo.service-mips-linux-musl inherit name serviceType up down run notification-fd producer-for consumer-for pipeline-name timeout-up timeout-down; + restart-on-upgrade = isTrigger; buildInputs = buildInputs ++ dependencies ++ contents; dependencies = builtins.map (d: d.name) dependencies; contents = builtins.map (d: d.name) contents; diff --git a/pkgs/s6-rc-database/default.nix b/pkgs/s6-rc-database/default.nix index 1fabe41..49ef99c 100644 --- a/pkgs/s6-rc-database/default.nix +++ b/pkgs/s6-rc-database/default.nix @@ -21,11 +21,16 @@ in stdenvNoCC.mkDerivation { if test -d $i; then for j in $i/* ; do if test -f $j/type ; then + if test -e $j/restart-on-upgrade; then + flag=force-restart + else + unset flag + fi case $(cat $j/type) in longrun|oneshot) - # s6-rc-update only wants oneshots in its + # s6-rc-update only wants atomics in its # restarts file - echo $(basename $j) " " $i >> $out/hashes + echo $(basename $j) " " ''${flag-$i} >> $out/hashes ;; *) ;; diff --git a/pkgs/systemconfig/restart-services.fnl b/pkgs/systemconfig/restart-services.fnl index 04c3300..69a5452 100644 --- a/pkgs/systemconfig/restart-services.fnl +++ b/pkgs/systemconfig/restart-services.fnl @@ -12,8 +12,11 @@ new-hashes (hashes-from-file new)] (with-open [f (io.open "/tmp/restarts" :w)] (each [n h (pairs old-hashes)] - (when (not (= h (. new-hashes n))) - (f:write (.. n " restart\n"))))))) + (let [new (. new-hashes n)] + (when (or (= h "force-restart") + (= new "force-restart") + (not (= h new))) + (f:write (.. n " restart\n")))))))) (fn exec [text command] (io.write (.. text ": "))