From 83719ec59c0bc8a5e4d2a681517b5f52f3c1863f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torjus=20H=C3=A5kestad?= Date: Wed, 27 Mar 2024 10:22:24 +0100 Subject: [PATCH] Improve backup-home --- home/services/backup-home.nix | 55 ++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/home/services/backup-home.nix b/home/services/backup-home.nix index 0072cbe..7d390bb 100644 --- a/home/services/backup-home.nix +++ b/home/services/backup-home.nix @@ -1,22 +1,27 @@ { pkgs, config, ... }: let # Backup home script - backup-home = pkgs.writeShellScriptBin "backup-home.sh" - '' + backup-home = pkgs.writeShellApplication { + name = "backup-home"; + runtimeInputs = with pkgs; [ + coreutils + curl + jq + libnotify + restic + ]; + text = '' echo "========== BACKUP HOME STARTING ==========" export RESTIC_PASSWORD="gunter.home.2rjus.net" export RESTIC_REPOSITORY="rest:http://10.69.12.52:8000/gunter.home.2rjus.net" GOTIFY_TOKEN=$(<"$XDG_RUNTIME_DIR/secrets/gotify_backup_home") - echo "DEBUG: GOTIFY_TOKEN=$GOTIFY_TOKEN" - echo "DEBUG: BUSADDR=$DBUS_SESSION_BUS_ADDRESS" - if [ -z "$GOTIFY_TOKEN" ]; then - ${pkgs.libnotify}/bin/notify-send -u critical "Backup issue" "No Gotify token found" + notify-send -u critical "Backup issue" "No Gotify token found" fi # Send start notification - ${pkgs.libnotify}/bin/notify-send -e -t 3000 "Backup started" "Backup of /home/torjus started" + notify-send -e -t 3000 "Backup started" "Backup of /home/torjus started" retval=$? if [ $retval -ne 0 ]; then echo "Failed to send notification" @@ -25,46 +30,46 @@ let # Do the backup echo "========== BACKUP TASK STARTING ==========" SECONDS=0 - ${pkgs.restic}/bin/restic backup /home/torjus \ + restic backup /home/torjus \ --exclude '/home/torjus/.cache' \ --exclude '/home/torjus/.local/share/Steam' \ --exclude '/home/torjus/.local/share/containers' \ --exclude '/home/torjus/git/nixpkgs' retval=$? if [ $retval -ne 0 ]; then - ${pkgs.libnotify}/bin/notify-send -u critical "Backup failed" "Backup of /home/torjus failed" + notify-send -u critical "Backup failed" "Backup of /home/torjus failed" retval=$? if [ $retval -ne 0 ]; then - # TODO: put token in sops - ${pkgs.curl}/bin/curl "https://gotify.t-juice.club/message?token=$GOTIFY_TOKEN" \ + curl "https://gotify.t-juice.club/message?token=$GOTIFY_TOKEN" \ -F "title=Backup of home@gunter failed!" \ -F "message=Please check status of backup-home service" fi fi + BACKUP_DURATION="$SECONDS" echo "========== BACKUP TASK COMPLETE ==========" # Remove old snapshots and prune echo "========== PRUNE TASK STARTING ==========" - ${pkgs.restic}/bin/restic forget -d 7 -w 4 -m 6 --keep-within 1d --prune + restic forget -d 7 -w 4 -m 6 --keep-within 1d --prune echo "========== PRUNE TASK COMPLETE ==========" # Gather statistics echo "========== STATS TASK STARTING ==========" - stats=$(${pkgs.restic}/bin/restic stats --json) - stats_raw=$(${pkgs.restic}/bin/restic stats --mode=raw-data --json) + stats=$(restic stats --json) + stats_raw=$(restic stats --mode=raw-data --json) - raw_size=$(${pkgs.jq}/bin/jq -r '.total_size' <<< $stats_raw \ - | ${pkgs.coreutils}/bin/numfmt --to=iec --suffix=B --format="%.2f") - total_size=$(${pkgs.jq}/bin/jq -r '.total_size' <<< $stats \ - | ${pkgs.coreutils}/bin/numfmt --to=iec --suffix=B --format="%.2f") - total_files=$(${pkgs.jq}/bin/jq -r '.total_file_count' <<< $stats \ - | ${pkgs.coreutils}/bin/numfmt --to=iec) - total_snapshots=$(${pkgs.jq}/bin/jq -r '.snapshots_count' <<< $stats) + raw_size=$(jq -r '.total_size' <<< "$stats_raw" \ + | numfmt --to=iec --suffix=B --format="%.2f") + total_size=$(jq -r '.total_size' <<< "$stats" \ + | numfmt --to=iec --suffix=B --format="%.2f") + total_files=$(jq -r '.total_file_count' <<< "$stats" \ + | numfmt --to=iec) + total_snapshots=$(jq -r '.snapshots_count' <<< "$stats") message="$total_files files\n$total_snapshots snapshots\n$raw_size ($total_size)" echo "========== STATS TASK COMPLETE ==========" # Send completion notification - ${pkgs.libnotify}/bin/notify-send -i checkmark -e -t 10000 \ - "Backup of /home/torjus completed in ''${SECONDS}s" "$message" + notify-send -i checkmark -e -t 10000 \ + "Backup of /home/torjus completed in ''${BACKUP_DURATION}s (''${SECONDS}s total)" "$message" retval=$? if [ $retval -ne 0 ]; then echo "Failed to send notification" @@ -72,8 +77,10 @@ let fi echo "========== BACKUP HOME COMPLETE ==========" ''; + }; in { + sops.secrets."gotify_backup_home" = { }; systemd.user.services.backup-home = { @@ -83,7 +90,7 @@ in }; Service = { Type = "oneshot"; - ExecStart = "${backup-home}/bin/backup-home.sh"; + ExecStart = "${backup-home}/bin/backup-home"; }; }; systemd.user.timers.backup-home = {