From 9d8a8126e982e8aacfcd76d07abb947cb60d7f21 Mon Sep 17 00:00:00 2001 From: aszlig Date: Mon, 31 Mar 2014 12:23:27 +0200 Subject: [PATCH] systemd: Add support for path units. This allows to define systemd.path(5) units, for example like this: { systemd = let description = "Set Key Permissions for xyz.key"; in { paths.set-key-perms = { inherit description; before = [ "network.target" ]; wantedBy = [ "multi-user.target" ]; pathConfig.PathChanged = "/run/keys/xyz.key"; }; services.set-key-perms = { inherit description; serviceConfig.Type = "oneshot"; script = "chown myspecialkeyuser /run/keys/xyz.key"; }; }; } The example here is actually useful in order to set permissions for the NixOps keys target to ensure those permisisons aren't reset whenever the key file is reuploaded. Signed-off-by: aszlig --- .../system/boot/systemd-unit-options.nix | 17 +++++++++++++++++ nixos/modules/system/boot/systemd.nix | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/nixos/modules/system/boot/systemd-unit-options.nix b/nixos/modules/system/boot/systemd-unit-options.nix index 113990814efa..d9dc6549f365 100644 --- a/nixos/modules/system/boot/systemd-unit-options.nix +++ b/nixos/modules/system/boot/systemd-unit-options.nix @@ -321,6 +321,23 @@ in rec { }; + pathOptions = unitOptions // { + + pathConfig = mkOption { + default = {}; + example = { PathChanged = "/some/path"; Unit = "changedpath.service"; }; + type = types.attrsOf unitOption; + description = '' + Each attribute in this set specifies an option in the + [Path] section of the unit. See + systemd.path + 5 for details. + ''; + }; + + }; + + mountOptions = unitOptions // { what = mkOption { diff --git a/nixos/modules/system/boot/systemd.nix b/nixos/modules/system/boot/systemd.nix index 49502b3e6851..72d724024093 100644 --- a/nixos/modules/system/boot/systemd.nix +++ b/nixos/modules/system/boot/systemd.nix @@ -304,6 +304,15 @@ let ''; }; + pathToUnit = name: def: + { inherit (def) wantedBy requiredBy enable; + text = commonUnitText def + + '' + [Path] + ${attrsToSection def.pathConfig} + ''; + }; + mountToUnit = name: def: { inherit (def) wantedBy requiredBy enable; text = commonUnitText def + @@ -472,6 +481,13 @@ in description = "Definition of systemd timer units."; }; + systemd.paths = mkOption { + default = {}; + type = types.attrsOf types.optionSet; + options = [ pathOptions unitConfig ]; + description = "Definition of systemd path units."; + }; + systemd.mounts = mkOption { default = []; type = types.listOf types.optionSet; @@ -657,6 +673,7 @@ in // mapAttrs' (n: v: nameValuePair "${n}.service" (serviceToUnit n v)) cfg.services // mapAttrs' (n: v: nameValuePair "${n}.socket" (socketToUnit n v)) cfg.sockets // mapAttrs' (n: v: nameValuePair "${n}.timer" (timerToUnit n v)) cfg.timers + // mapAttrs' (n: v: nameValuePair "${n}.path" (pathToUnit n v)) cfg.paths // listToAttrs (map (v: let n = escapeSystemdPath v.where; in nameValuePair "${n}.mount" (mountToUnit n v)) cfg.mounts)