summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Børgesen <philip.borgesen@gmail.com>2023-11-19 00:52:02 +0100
committerPhilip Børgesen <philip.borgesen@gmail.com>2024-10-24 06:13:11 +0200
commitf737259769ef4722ed956bcaaab67509b96c23cc (patch)
tree3e28e1842df802d083d339079b229bb04a1e4277
parent5907cbbb31d9de387349efb825864a9ee598e6ba (diff)
power,sleep: Add options to control restart and sleep behavior
-rw-r--r--modules/module-list.nix2
-rw-r--r--modules/power/default.nix47
-rw-r--r--modules/power/sleep.nix80
-rw-r--r--modules/system/activation-scripts.nix1
-rw-r--r--tests/power-restart.nix12
-rw-r--r--tests/power-sleep.nix16
6 files changed, 158 insertions, 0 deletions
diff --git a/modules/module-list.nix b/modules/module-list.nix
index 6604eb9..effdff7 100644
--- a/modules/module-list.nix
+++ b/modules/module-list.nix
@@ -51,6 +51,8 @@
./environment
./fonts
./launchd
+ ./power
+ ./power/sleep.nix
./services/activate-system
./services/aerospace
./services/autossh.nix
diff --git a/modules/power/default.nix b/modules/power/default.nix
new file mode 100644
index 0000000..a99905f
--- /dev/null
+++ b/modules/power/default.nix
@@ -0,0 +1,47 @@
+{ config, lib, ... }:
+
+let
+ cfg = config.power;
+
+ types = lib.types;
+
+ onOff = cond: if cond then "on" else "off";
+in
+
+{
+ options = {
+ power.restartAfterPowerFailure = lib.mkOption {
+ type = types.nullOr types.bool;
+ default = null;
+ description = ''
+ Whether to restart the computer after a power failure.
+ '';
+ };
+
+ power.restartAfterFreeze = lib.mkOption {
+ type = types.nullOr types.bool;
+ default = null;
+ description = ''
+ Whether to restart the computer after a system freeze.
+ '';
+ };
+ };
+
+ config = {
+
+ system.activationScripts.power.text = ''
+ echo "configuring power..." >&2
+
+ ${lib.optionalString (cfg.restartAfterPowerFailure != null) ''
+ systemsetup -setRestartPowerFailure \
+ '${onOff cfg.restartAfterPowerFailure}' &> /dev/null
+ ''}
+
+ ${lib.optionalString (cfg.restartAfterFreeze != null) ''
+ systemsetup -setRestartFreeze \
+ '${onOff cfg.restartAfterFreeze}' &> /dev/null
+ ''}
+ '';
+
+ };
+}
diff --git a/modules/power/sleep.nix b/modules/power/sleep.nix
new file mode 100644
index 0000000..ab5862c
--- /dev/null
+++ b/modules/power/sleep.nix
@@ -0,0 +1,80 @@
+{ config, lib, ... }:
+
+let
+ cfg = config.power.sleep;
+
+ types = lib.types;
+
+ onOff = cond: if cond then "on" else "off";
+in
+
+{
+ options = {
+ power.sleep.computer = lib.mkOption {
+ type = types.nullOr (types.either types.ints.positive (types.enum ["never"]));
+ default = null;
+ example = "never";
+ description = ''
+ Amount of idle time (in minutes) until the computer sleeps.
+
+ `"never"` disables computer sleeping.
+
+ The system might not be considered idle before connected displays sleep, as
+ per the `power.sleep.display` option.
+ '';
+ };
+
+ power.sleep.display = lib.mkOption {
+ type = types.nullOr (types.either types.ints.positive (types.enum ["never"]));
+ default = null;
+ example = "never";
+ description = ''
+ Amount of idle time (in minutes) until displays sleep.
+
+ `"never"` disables display sleeping.
+ '';
+ };
+
+ power.sleep.harddisk = lib.mkOption {
+ type = types.nullOr (types.either types.ints.positive (types.enum ["never"]));
+ default = null;
+ example = "never";
+ description = ''
+ Amount of idle time (in minutes) until hard disks sleep.
+
+ `"never"` disables hard disk sleeping.
+ '';
+ };
+
+ power.sleep.allowSleepByPowerButton = lib.mkOption {
+ type = types.nullOr types.bool;
+ default = null;
+ description = ''
+ Whether the power button can sleep the computer.
+ '';
+ };
+ };
+
+ config = {
+
+ system.activationScripts.power.text = lib.mkAfter ''
+ ${lib.optionalString (cfg.computer != null) ''
+ systemsetup -setComputerSleep '${toString cfg.computer}' &> /dev/null
+ ''}
+
+ ${lib.optionalString (cfg.display != null) ''
+ systemsetup -setDisplaySleep '${toString cfg.display}' &> /dev/null
+ ''}
+
+ ${lib.optionalString (cfg.harddisk != null) ''
+ systemsetup -setHardDiskSleep '${toString cfg.harddisk}' &> /dev/null
+ ''}
+
+ ${lib.optionalString (cfg.allowSleepByPowerButton != null) ''
+ systemsetup -setAllowPowerButtonToSleepComputer \
+ '${onOff cfg.allowSleepByPowerButton}' &> /dev/null
+ ''}
+ '';
+
+ };
+}
diff --git a/modules/system/activation-scripts.nix b/modules/system/activation-scripts.nix
index 8325199..da8eb5c 100644
--- a/modules/system/activation-scripts.nix
+++ b/modules/system/activation-scripts.nix
@@ -67,6 +67,7 @@ in
${cfg.activationScripts.nix-daemon.text}
${cfg.activationScripts.time.text}
${cfg.activationScripts.networking.text}
+ ${cfg.activationScripts.power.text}
${cfg.activationScripts.keyboard.text}
${cfg.activationScripts.fonts.text}
${cfg.activationScripts.nvram.text}
diff --git a/tests/power-restart.nix b/tests/power-restart.nix
new file mode 100644
index 0000000..ade9851
--- /dev/null
+++ b/tests/power-restart.nix
@@ -0,0 +1,12 @@
+{ config, pkgs, ... }:
+
+{
+ power.restartAfterPowerFailure = true;
+ power.restartAfterFreeze = true;
+
+ test = ''
+ echo checking restart power settings in /activate >&2
+ grep "systemsetup -setRestartPowerFailure 'on'" ${config.out}/activate
+ grep "systemsetup -setRestartFreeze 'on'" ${config.out}/activate
+ '';
+}
diff --git a/tests/power-sleep.nix b/tests/power-sleep.nix
new file mode 100644
index 0000000..5d779a6
--- /dev/null
+++ b/tests/power-sleep.nix
@@ -0,0 +1,16 @@
+{ config, pkgs, ... }:
+
+{
+ power.sleep.computer = "never";
+ power.sleep.display = 15;
+ power.sleep.harddisk = 5;
+ power.sleep.allowSleepByPowerButton = false;
+
+ test = ''
+ echo checking power sleep settings in /activate >&2
+ grep "systemsetup -setComputerSleep 'never'" ${config.out}/activate
+ grep "systemsetup -setDisplaySleep '15'" ${config.out}/activate
+ grep "systemsetup -setHardDiskSleep '5'" ${config.out}/activate
+ grep "systemsetup -setAllowPowerButtonToSleepComputer 'off'" ${config.out}/activate
+ '';
+}