diff --git a/modules/sus-then-hib.nix b/modules/sus-then-hib.nix new file mode 100644 index 0000000..afabea5 --- /dev/null +++ b/modules/sus-then-hib.nix @@ -0,0 +1,38 @@ +{ 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 - 5)) ] ; then + systemctl hibernate + else + ${pkgs.utillinux}/bin/rtcwake -m no -s 1 + fi + ''; + serviceConfig.Type = "simple"; + }; +} + diff --git a/roles/laptop.nix b/roles/laptop.nix index f752828..26ecc91 100644 --- a/roles/laptop.nix +++ b/roles/laptop.nix @@ -4,6 +4,7 @@ ../modules/bluetooth.nix ../modules/networkmanager.nix ../modules/tlp.nix + ../modules/sus-then-hib.nix ]; }