diff --git a/nixos/lib/systemd-lib.nix b/nixos/lib/systemd-lib.nix index 03d0705b3e92..43bbd518134e 100644 --- a/nixos/lib/systemd-lib.nix +++ b/nixos/lib/systemd-lib.nix @@ -349,6 +349,15 @@ rec { ) ); + settingsToSections = + settings: + concatStringsSep "\n" ( + mapAttrsToList (section_name: section_attrs: '' + [${section_name}] + ${attrsToSection section_attrs} + '') settings + ); + generateUnits = { allowCollisions ? true, @@ -723,10 +732,7 @@ rec { commonUnitText = def: lines: - '' - [Unit] - ${attrsToSection def.unitConfig} - '' + (settingsToSections { Unit = def.unitConfig; }) + lines + optionalString (def.wantedBy != [ ]) '' @@ -744,10 +750,7 @@ rec { enable overrideStrategy ; - text = '' - [Unit] - ${attrsToSection def.unitConfig} - ''; + text = (settingsToSections { Unit = def.unitConfig; }); }; serviceToUnit = def: { @@ -831,10 +834,9 @@ rec { enable overrideStrategy ; - text = commonUnitText def '' - [Timer] - ${attrsToSection def.timerConfig} - ''; + text = commonUnitText def (settingsToSections { + Timer = def.timerConfig; + }); }; pathToUnit = def: { @@ -847,10 +849,9 @@ rec { enable overrideStrategy ; - text = commonUnitText def '' - [Path] - ${attrsToSection def.pathConfig} - ''; + text = commonUnitText def (settingsToSections { + Path = def.pathConfig; + }); }; mountToUnit = def: { @@ -863,10 +864,9 @@ rec { enable overrideStrategy ; - text = commonUnitText def '' - [Mount] - ${attrsToSection def.mountConfig} - ''; + text = commonUnitText def (settingsToSections { + Mount = def.mountConfig; + }); }; automountToUnit = def: { @@ -879,10 +879,9 @@ rec { enable overrideStrategy ; - text = commonUnitText def '' - [Automount] - ${attrsToSection def.automountConfig} - ''; + text = commonUnitText def (settingsToSections { + Automount = def.automountConfig; + }); }; sliceToUnit = def: { @@ -895,10 +894,9 @@ rec { enable overrideStrategy ; - text = commonUnitText def '' - [Slice] - ${attrsToSection def.sliceConfig} - ''; + text = commonUnitText def (settingsToSections { + Slice = def.sliceConfig; + }); }; # Create a directory that contains systemd definition files from an attrset diff --git a/nixos/modules/system/boot/systemd.nix b/nixos/modules/system/boot/systemd.nix index 26ee1c46caf4..4409b11aeec6 100644 --- a/nixos/modules/system/boot/systemd.nix +++ b/nixos/modules/system/boot/systemd.nix @@ -24,7 +24,7 @@ let mountToUnit automountToUnit sliceToUnit - attrsToSection + settingsToSections ; upstreamSystemUnits = [ @@ -599,10 +599,7 @@ in upstreamWants = upstreamSystemWants; }; - "systemd/system.conf".text = '' - [Manager] - ${attrsToSection cfg.settings.Manager} - ''; + "systemd/system.conf".text = settingsToSections cfg.settings; "systemd/sleep.conf".text = '' [Sleep] diff --git a/nixos/modules/system/boot/systemd/initrd.nix b/nixos/modules/system/boot/systemd/initrd.nix index 3493f5f9a1a5..6d93f5e15686 100644 --- a/nixos/modules/system/boot/systemd/initrd.nix +++ b/nixos/modules/system/boot/systemd/initrd.nix @@ -22,7 +22,7 @@ let timerToUnit mountToUnit automountToUnit - attrsToSection + settingsToSections ; cfg = config.boot.initrd.systemd; @@ -484,10 +484,7 @@ in "/init".source = "${cfg.package}/lib/systemd/systemd"; "/etc/systemd/system".source = stage1Units; - "/etc/systemd/system.conf".text = '' - [Manager] - ${attrsToSection cfg.settings.Manager} - ''; + "/etc/systemd/system.conf".text = settingsToSections cfg.settings; # We can use either ! or * to lock the root account in the # console, but some software like OpenSSH won't even allow you diff --git a/nixos/modules/system/boot/systemd/logind.nix b/nixos/modules/system/boot/systemd/logind.nix index 2eff86008e65..d0878542514d 100644 --- a/nixos/modules/system/boot/systemd/logind.nix +++ b/nixos/modules/system/boot/systemd/logind.nix @@ -1,7 +1,6 @@ { config, lib, - pkgs, utils, ... }: @@ -62,10 +61,8 @@ "user-runtime-dir@.service" ]; - environment.etc."systemd/logind.conf".text = '' - [Login] - ${utils.systemdUtils.lib.attrsToSection config.services.logind.settings.Login} - ''; + environment.etc."systemd/logind.conf".text = + utils.systemdUtils.lib.settingsToSections config.services.logind.settings; # Restarting systemd-logind breaks X11 # - upstream commit: https://cgit.freedesktop.org/xorg/xserver/commit/?id=dc48bd653c7e101 diff --git a/nixos/modules/system/boot/systemd/oomd.nix b/nixos/modules/system/boot/systemd/oomd.nix index 252758c6bcf6..82a87f00e97b 100644 --- a/nixos/modules/system/boot/systemd/oomd.nix +++ b/nixos/modules/system/boot/systemd/oomd.nix @@ -1,4 +1,9 @@ -{ config, lib, ... }: +{ + config, + lib, + utils, + ... +}: let cfg = config.systemd.oomd; @@ -10,6 +15,7 @@ in [ "systemd" "oomd" "enableUserServices" ] [ "systemd" "oomd" "enableUserSlices" ] ) + (lib.mkRenamedOptionModule [ "systemd" "oomd" "extraConfig" ] [ "systemd" "oomd" "settings" "OOM" ]) ]; options.systemd.oomd = { @@ -23,20 +29,18 @@ in enableSystemSlice = lib.mkEnableOption "oomd on the system slice (`system.slice`)"; enableUserSlices = lib.mkEnableOption "oomd on all user slices (`user@.slice`) and all user owned slices"; - extraConfig = lib.mkOption { - type = - with lib.types; - attrsOf (oneOf [ - str - int - bool - ]); - default = { }; - example = lib.literalExpression ''{ DefaultMemoryPressureDurationSec = "20s"; }''; + settings.OOM = lib.mkOption { description = '' - Extra config options for `systemd-oomd`. See {command}`man oomd.conf` - for available options. + Settings option for systemd-oomd. + See {manpage}`oomd.conf(5)` for available options. ''; + type = lib.types.submodule { + freeformType = lib.types.attrsOf utils.systemdUtils.unitOptions.unitOption; + }; + default = { }; + example = { + DefaultMemoryPressureLimit = "60%"; + }; }; }; @@ -52,11 +56,7 @@ in ]; systemd.services.systemd-oomd.wantedBy = [ "multi-user.target" ]; - environment.etc."systemd/oomd.conf".text = lib.generators.toINI { } { - OOM = cfg.extraConfig; - }; - - systemd.oomd.extraConfig.DefaultMemoryPressureDurationSec = lib.mkDefault "20s"; # Fedora default + environment.etc."systemd/oomd.conf".text = utils.systemdUtils.lib.settingsToSections cfg.settings; users.users.systemd-oom = { description = "systemd-oomd service user";