about summary refs log tree commit diff
path: root/nixos
diff options
context:
space:
mode:
authorSimonas Kazlauskas <git@kazlauskas.me>2024-02-10 13:43:31 +0200
committerSimonas Kazlauskas <git@kazlauskas.me>2024-02-10 13:48:40 +0200
commit74eeb75af1ea94c2f639a843172ee2fc82f5cf54 (patch)
tree15e180fc37e7d44a01f9ae659b84d9c5ae13bfa0 /nixos
parentdb19b7f93980e3be9f5cfbe3299bea000ed79c62 (diff)
downloadnixlib-74eeb75af1ea94c2f639a843172ee2fc82f5cf54.tar
nixlib-74eeb75af1ea94c2f639a843172ee2fc82f5cf54.tar.gz
nixlib-74eeb75af1ea94c2f639a843172ee2fc82f5cf54.tar.bz2
nixlib-74eeb75af1ea94c2f639a843172ee2fc82f5cf54.tar.lz
nixlib-74eeb75af1ea94c2f639a843172ee2fc82f5cf54.tar.xz
nixlib-74eeb75af1ea94c2f639a843172ee2fc82f5cf54.tar.zst
nixlib-74eeb75af1ea94c2f639a843172ee2fc82f5cf54.zip
systemd: add support for upholds and upheldBy
Diffstat (limited to 'nixos')
-rw-r--r--nixos/lib/systemd-lib.nix10
-rw-r--r--nixos/lib/systemd-unit-options.nix23
2 files changed, 32 insertions, 1 deletions
diff --git a/nixos/lib/systemd-lib.nix b/nixos/lib/systemd-lib.nix
index 347ee7303936..c9cca619ed70 100644
--- a/nixos/lib/systemd-lib.nix
+++ b/nixos/lib/systemd-lib.nix
@@ -242,7 +242,7 @@ in rec {
             ln -sfn '${name}' $out/'${name2}'
           '') (unit.aliases or [])) units)}
 
-      # Create .wants and .requires symlinks from the wantedBy and
+      # Create .wants, .upholds and .requires symlinks from the wantedBy, upheldBy and
       # requiredBy options.
       ${concatStrings (mapAttrsToList (name: unit:
           concatMapStrings (name2: ''
@@ -252,6 +252,12 @@ in rec {
 
       ${concatStrings (mapAttrsToList (name: unit:
           concatMapStrings (name2: ''
+            mkdir -p $out/'${name2}.upholds'
+            ln -sfn '../${name}' $out/'${name2}.upholds'/
+          '') (unit.upheldBy or [])) units)}
+
+      ${concatStrings (mapAttrsToList (name: unit:
+          concatMapStrings (name2: ''
             mkdir -p $out/'${name2}.requires'
             ln -sfn '../${name}' $out/'${name2}.requires'/
           '') (unit.requiredBy or [])) units)}
@@ -289,6 +295,8 @@ in rec {
           { Requires = toString config.requires; }
         // optionalAttrs (config.wants != [])
           { Wants = toString config.wants; }
+        // optionalAttrs (config.upholds != [])
+          { Upholds = toString config.upholds; }
         // optionalAttrs (config.after != [])
           { After = toString config.after; }
         // optionalAttrs (config.before != [])
diff --git a/nixos/lib/systemd-unit-options.nix b/nixos/lib/systemd-unit-options.nix
index 9c69bda471bb..9a0fedeb0b2d 100644
--- a/nixos/lib/systemd-unit-options.nix
+++ b/nixos/lib/systemd-unit-options.nix
@@ -74,6 +74,15 @@ in rec {
       '';
     };
 
+    upheldBy = mkOption {
+      default = [];
+      type = types.listOf unitNameType;
+      description = lib.mdDoc ''
+        Keep this unit running as long as the listed units are running. This is a continuously
+        enforced version of wantedBy.
+      '';
+    };
+
     wantedBy = mkOption {
       default = [];
       type = types.listOf unitNameType;
@@ -147,6 +156,20 @@ in rec {
         '';
       };
 
+      upholds = mkOption {
+        default = [];
+        type = types.listOf unitNameType;
+        description = lib.mdDoc ''
+          Configures dependencies similar to Wants=, but as long as this unit is up, all units
+          listed in Upholds= are started whenever found to be inactive or failed, and no job is
+          queued for them. While a Wants= dependency on another unit has a one-time effect when
+          this units started, a Upholds= dependency on it has a continuous effect, constantly
+          restarting the unit if necessary. This is an alternative to the Restart= setting of
+          service units, to ensure they are kept running whatever happens. The restart happens
+          without delay, and usual per-unit rate-limit applies.
+        '';
+      };
+
       after = mkOption {
         default = [];
         type = types.listOf unitNameType;