{ config, pkgs, ... }: let backup-source = "rootNas"; # The "stay-awake" file is located at `${backup-source}:${stay-awake-file}`. stay-awake-file = "${config.networking.hostName}.stay-awake"; in { # Suspend: # sudo systemctl suspend # Suspend for 60 seconds: # sudo rtcwake -m mem -s 60 # Power consumption: # 2.4W powered off, with 1 RAM, 1 SSD # 2.6W suspended, with 1 RAM, 1 SSD # 2.6W suspended, with 1 RAM, 1 SSD, 2 HDDs # 18.9W idle, with 1 RAM, 1 SSD, 2 HDDs # journalctl -u daily-backup-and-suspend assertions = [{ assertion = config.services.openssh.enable; message = "systemd service daily-backup-and-suspend requires SSH."; } { assertion = config.services.journalwatch.enable; message = "systemd service daily-backup-and-suspend requires journalwatch."; }]; systemd.timers."daily-backup-and-suspend" = { wantedBy = [ "multi-user.target" ]; timerConfig = { OnCalendar = [ # Daily "*-*-* 00:00:05" ]; WakeSystem = true; }; }; systemd.services."daily-backup-and-suspend" = { # Packages required for this script. # For `ssh` and `journalwatch`, there are assertions above. path = with pkgs; [ # Provides `echo`, `sleep`, `printf`. coreutils # Provides `ssh` openssh ]; # Script to execute as main process. script = '' set -eu -o pipefail printf '%s\n' 'Starting backup script.' # TODO: Backup: Pull BTRFS snapshots from ${backup-source}. # Don't suspend as long as `${backup-source}:${stay-awake-file}` exists. while :; do result="$(ssh ${backup-source} 'ls ${stay-awake-file} 2>&1')" case "$${result}" in *"No such file or directory") break ;; "${stay-awake-file}") printf '%s\n' 'Delaying suspend due to ${stay-awake-file} file.' ;; *) printf '%s\n' 'Delaying suspend due to SSH connectivity problems.' ;; esac sleep 10s done # Wait until no BTRFS scrub service is running. while systemctl list-units --type=service --plain --quiet | awk '{ print $1 }' | grep '^btrfs-scrub'; do printf '%s\n' 'Delaying suspend due to running BTRFS scrub service.' sleep 60s done # Send filtered journal by email. systemctl start journalwatch.service ||: # Short delay to let sendmail send the email. sleep 15s printf '%s\n' 'Finished backup script.' # Suspend to save power. # TODO #systemctl suspend ''; }; }