nixos/earlyoom: use the newly introduced systembus-notify option

Also some cleanups.
This commit is contained in:
Peter Hoeg 2021-07-12 15:36:22 +08:00
parent 27e32bbfde
commit 895090bf89

View file

@ -1,81 +1,73 @@
{ config, lib, pkgs, ... }: { config, lib, pkgs, ... }:
with lib;
let let
ecfg = config.services.earlyoom; cfg = config.services.earlyoom;
inherit (lib)
mkDefault mkEnableOption mkIf mkOption types
mkRemovedOptionModule
concatStringsSep optional;
in in
{ {
options = { options.services.earlyoom = {
services.earlyoom = { enable = mkEnableOption "Early out of memory killing";
enable = mkOption { freeMemThreshold = mkOption {
type = types.bool; type = types.ints.between 1 100;
default = false; default = 10;
description = '' description = ''
Enable early out of memory killing. Minimum of availabe memory (in percent).
''; If the free memory falls below this threshold and the analog is true for
}; <option>services.earlyoom.freeSwapThreshold</option>
the killing begins.
'';
};
freeMemThreshold = mkOption { freeSwapThreshold = mkOption {
type = types.int; type = types.ints.between 1 100;
default = 10; default = 10;
description = '' description = ''
Minimum of availabe memory (in percent). Minimum of availabe swap space (in percent).
If the free memory falls below this threshold and the analog is true for If the available swap space falls below this threshold and the analog
<option>services.earlyoom.freeSwapThreshold</option> is true for <option>services.earlyoom.freeMemThreshold</option>
the killing begins. the killing begins.
''; '';
}; };
freeSwapThreshold = mkOption { # TODO: remove or warn after 1.7 (https://github.com/rfjakob/earlyoom/commit/7ebc4554)
type = types.int; ignoreOOMScoreAdjust = mkOption {
default = 10; type = types.bool;
description = '' default = false;
Minimum of availabe swap space (in percent). description = ''
If the available swap space falls below this threshold and the analog Ignore oom_score_adjust values of processes.
is true for <option>services.earlyoom.freeMemThreshold</option> '';
the killing begins. };
'';
};
# TODO: remove or warn after 1.7 (https://github.com/rfjakob/earlyoom/commit/7ebc4554) enableDebugInfo = mkOption {
ignoreOOMScoreAdjust = mkOption { type = types.bool;
type = types.bool; default = false;
default = false; description = ''
description = '' Enable debugging messages.
Ignore oom_score_adjust values of processes. '';
''; };
};
enableDebugInfo = mkOption { enableNotifications = mkOption {
type = types.bool; type = types.bool;
default = false; default = false;
description = '' description = ''
Enable debugging messages. Send notifications about killed processes via the system d-bus.
'';
};
notificationsCommand = mkOption { WARNING: enabling this option (while convenient) should *not* be done on a
type = types.nullOr types.str; machine where you do not trust the other users as it allows any other
default = null; local user to DoS your session by spamming notifications.
description = ''
This option is deprecated and ignored by earlyoom since 1.6.
Use <option>services.earlyoom.enableNotifications</option> instead.
'';
};
enableNotifications = mkOption { To actually see the notifications in your GUI session, you need to have
type = types.bool; <literal>systembus-notify</literal> running as your user which this
default = false; option handles.
description = ''
Send notifications about killed processes via the system d-bus.
To actually see the notifications in your GUI session, you need to have
<literal>systembus-notify</literal> running as your user.
See <link xlink:href="https://github.com/rfjakob/earlyoom#notifications">README</link> for details. See <link xlink:href="https://github.com/rfjakob/earlyoom#notifications">README</link> for details.
''; '';
};
}; };
}; };
@ -83,37 +75,30 @@ in
(mkRemovedOptionModule [ "services" "earlyoom" "useKernelOOMKiller" ] '' (mkRemovedOptionModule [ "services" "earlyoom" "useKernelOOMKiller" ] ''
This option is deprecated and ignored by earlyoom since 1.2. This option is deprecated and ignored by earlyoom since 1.2.
'') '')
(mkRemovedOptionModule [ "services" "earlyoom" "notificationsCommand" ] ''
This option is deprecated and ignored by earlyoom since 1.6.
'')
]; ];
config = mkIf ecfg.enable { config = mkIf cfg.enable {
assertions = [ services.systembus-notify.enable = mkDefault cfg.enableNotifications;
{ assertion = ecfg.freeMemThreshold > 0 && ecfg.freeMemThreshold <= 100;
message = "Needs to be a positive percentage"; }
{ assertion = ecfg.freeSwapThreshold > 0 && ecfg.freeSwapThreshold <= 100;
message = "Needs to be a positive percentage"; }
];
# TODO: reimplement this option as -N after 1.7 (https://github.com/rfjakob/earlyoom/commit/afe03606)
warnings = optional (ecfg.notificationsCommand != null)
"`services.earlyoom.notificationsCommand` is deprecated and ignored by earlyoom since 1.6.";
systemd.services.earlyoom = { systemd.services.earlyoom = {
description = "Early OOM Daemon for Linux"; description = "Early OOM Daemon for Linux";
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
path = optional ecfg.enableNotifications pkgs.dbus; path = optional cfg.enableNotifications pkgs.dbus;
serviceConfig = { serviceConfig = {
StandardOutput = "null";
StandardError = "journal"; StandardError = "journal";
ExecStart = concatStringsSep " " ([ ExecStart = concatStringsSep " " ([
"${pkgs.earlyoom}/bin/earlyoom" "${pkgs.earlyoom}/bin/earlyoom"
"-m ${toString ecfg.freeMemThreshold}" "-m ${toString cfg.freeMemThreshold}"
"-s ${toString ecfg.freeSwapThreshold}" "-s ${toString cfg.freeSwapThreshold}"
] ++ optional ecfg.ignoreOOMScoreAdjust "-i" ]
++ optional ecfg.enableDebugInfo "-d" ++ optional cfg.ignoreOOMScoreAdjust "-i"
++ optional ecfg.enableNotifications "-n"); ++ optional cfg.enableDebugInfo "-d"
++ optional cfg.enableNotifications "-n"
);
}; };
}; };
environment.systemPackages = optional ecfg.enableNotifications pkgs.systembus-notify;
}; };
} }