Skip to content

Commit

Permalink
nixos/systemd: Allow to override serviceConfig
Browse files Browse the repository at this point in the history
This has been reported by @qknight in his Stack Overflow question:

https://stackoverflow.com/q/50678639

The correct way to override a single value would be to use something
like this:

systemd.services.nagios.serviceConfig.Restart = lib.mkForce "no";

However, this doesn't work because the check is applied for the attrsOf
type and thus the attribute values might still contain the attribute set
created by mkOverride.

The unitOption type however did already account for this, but at this
stage it's already too late.

So now the actual value is unpacked while checking the values of the
attribute set, which should allow us to override values in
serviceConfig.

Signed-off-by: aszlig <aszlig@nix.build>
Cc: @edolstra, @qknight
(cherry picked from commit 0e7c945)
Reason: Another user has hit this problem on Discourse[1] and I thought
        I had already backported it to 18.03, apparently I didn't. Given
        the time of the original commit I think this had enough testing
        already so it shouldn't break anything and rather make things
        less annoying.
[1]: https://discourse.nixos.org/t/is-there-a-universal-way-to-enable-a-service-auto-restart/592/3
  • Loading branch information
aszlig committed Aug 16, 2018
1 parent 8b4ed61 commit da9efe9
Showing 1 changed file with 10 additions and 4 deletions.
14 changes: 10 additions & 4 deletions nixos/modules/system/boot/systemd-lib.nix
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,16 @@ rec {
optional (badFields != [ ])
"Systemd ${group} has extra fields [${concatStringsSep " " badFields}].";

checkUnitConfig = group: checks: v:
let errors = concatMap (c: c group v) checks; in
if errors == [] then true
else builtins.trace (concatStringsSep "\n" errors) false;
checkUnitConfig = group: checks: attrs: let
# We're applied at the top-level type (attrsOf unitOption), so the actual
# unit options might contain attributes from mkOverride that we need to
# convert into single values before checking them.
defs = mapAttrs (const (v:
if v._type or "" == "override" then v.content else v
)) attrs;
errors = concatMap (c: c group defs) checks;
in if errors == [] then true
else builtins.trace (concatStringsSep "\n" errors) false;

toOption = x:
if x == true then "true"
Expand Down

0 comments on commit da9efe9

Please sign in to comment.