diff --git a/configuration.nix b/configuration.nix index 076115a..442aa4d 100644 --- a/configuration.nix +++ b/configuration.nix @@ -10,6 +10,7 @@ imports = [ # Include the results of the hardware scan. ./hardware-configuration.nix + ./suspend-and-hibernate.nix inputs.home-manager.nixosModules.default ]; @@ -122,6 +123,7 @@ clang-tools alejandra libnotify + gnomeExtensions.hibernate-status-button ]; # Some programs need SUID wrappers, can be configured further or are diff --git a/suspend-and-hibernate.nix b/suspend-and-hibernate.nix new file mode 100644 index 0000000..432378c --- /dev/null +++ b/suspend-and-hibernate.nix @@ -0,0 +1,41 @@ +{ + config, + pkgs, + ... +}: let + hibernateEnvironment = { + HIBERNATE_SECONDS = "3600"; + HIBERNATE_LOCK = "/var/run/autohibernate.lock"; + }; +in { + systemd.services."awake-after-suspend-for-a-time" = { + description = "Sets up the suspend so that it'll wake for hibernation"; + wantedBy = ["suspend.target"]; + before = ["systemd-suspend.service"]; + environment = hibernateEnvironment; + script = '' + curtime=$(date +%s) + echo "$curtime $1" >> /tmp/autohibernate.log + echo "$curtime" > $HIBERNATE_LOCK + ${pkgs.utillinux}/bin/rtcwake -m no -s $HIBERNATE_SECONDS + ''; + serviceConfig.Type = "simple"; + }; + systemd.services."hibernate-after-recovery" = { + description = "Hibernates after a suspend recovery due to timeout"; + wantedBy = ["suspend.target"]; + after = ["systemd-suspend.service"]; + environment = hibernateEnvironment; + script = '' + curtime=$(date +%s) + sustime=$(cat $HIBERNATE_LOCK) + rm $HIBERNATE_LOCK + if [ $(($curtime - $sustime)) -ge $HIBERNATE_SECONDS ] ; then + systemctl hibernate + else + ${pkgs.utillinux}/bin/rtcwake -m no -s 1 + fi + ''; + serviceConfig.Type = "simple"; + }; +}