From 57077af7f7d60edba5685e0331add3bd23803df4 Mon Sep 17 00:00:00 2001 From: Ben Brown Date: Tue, 10 Sep 2024 20:48:10 +0100 Subject: [PATCH] upower: Support Suspend and Ignore CriticalPowerActions --- nixos/modules/services/hardware/upower.nix | 43 ++++++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/nixos/modules/services/hardware/upower.nix b/nixos/modules/services/hardware/upower.nix index 43604b17e8486c..7b2ae8e8eee45a 100644 --- a/nixos/modules/services/hardware/upower.nix +++ b/nixos/modules/services/hardware/upower.nix @@ -179,13 +179,31 @@ in ''; }; + allowRiskyCriticalPowerAction = lib.mkOption { + type = lib.types.bool; + default = false; + description = '' + Enable the risky critical power actions "Suspend" and "Ignore". + ''; + }; + criticalPowerAction = lib.mkOption { - type = lib.types.enum [ "PowerOff" "Hibernate" "HybridSleep" ]; + type = lib.types.enum [ + "PowerOff" + "Hibernate" + "HybridSleep" + "Suspend" + "Ignore" + ]; default = "HybridSleep"; description = '' The action to take when `timeAction` or `percentageAction` has been reached for the batteries - (UPS or laptop batteries) supplying the computer + (UPS or laptop batteries) supplying the computer. + + When set to `Suspend` or `Ignore`, + {option}`services.upower.allowRiskyCriticalPowerAction` must be set + to `true`. ''; }; @@ -193,10 +211,28 @@ in }; - ###### implementation config = lib.mkIf cfg.enable { + assertions = [ + { + assertion = + let + inherit (builtins) elem; + riskyActions = [ + "Suspend" + "Ignore" + ]; + riskyActionEnabled = elem cfg.criticalPowerAction riskyActions; + in + riskyActionEnabled -> cfg.allowRiskyCriticalPowerAction; + message = '' + services.upower.allowRiskyCriticalPowerAction must be true if + services.upower.criticalPowerAction is set to + '${cfg.criticalPowerAction}'. + ''; + } + ]; environment.systemPackages = [ cfg.package ]; @@ -218,6 +254,7 @@ in TimeLow = cfg.timeLow; TimeCritical = cfg.timeCritical; TimeAction = cfg.timeAction; + AllowRiskyCriticalPowerAction = cfg.allowRiskyCriticalPowerAction; CriticalPowerAction = cfg.criticalPowerAction; }; };