mirror of
https://github.com/nix-community/home-manager.git
synced 2025-03-31 04:04:32 +00:00
126 lines
5.4 KiB
Nix
126 lines
5.4 KiB
Nix
{ pkgs, lib, ... }:
|
|
let backups = import ./backup-configs.nix { inherit pkgs; };
|
|
in {
|
|
services.restic = {
|
|
enable = true;
|
|
inherit backups;
|
|
};
|
|
|
|
nmt.script = ''
|
|
backups=(
|
|
${lib.concatLines (lib.attrNames backups)}
|
|
)
|
|
|
|
serviceFiles=./home-files/.config/systemd/user
|
|
defaultPruneOpts=("forget" "prune" "keep-daily" "2" "keep-weekly" "1" "keep-monthly" "1" "keep-yearly" "99")
|
|
inhibitString=("systemd-inhibit" "mode" "block" "who" "restic" "what" "sleep" "why" "Scheduled backup inhibit-sleep")
|
|
sftpStrings=("sftp.command=" "ssh" "backup@host" "/etc/nixos/secrets/backup-private-key" "sftp")
|
|
|
|
# General prelim tests
|
|
for backup in ''${backups[@]};
|
|
do
|
|
serviceFile=$serviceFiles/restic-backups-"$backup".service
|
|
|
|
# these two are the only ones without pruneOpts
|
|
if [ "$backup" != "local-backup" ] && [ "$backup" != "remote-backup" ]; then
|
|
assertFileRegex $serviceFile "ExecStart=.*unlock"
|
|
assertFileRegex $serviceFile "ExecStart=.*forget.*--prune"
|
|
assertFileRegex $serviceFile "ExecStart=.*check"
|
|
fi
|
|
|
|
if [ "$backup" != "prune" ]; then
|
|
assertFileRegex $serviceFile "ExecStart=.*--exclude-file"
|
|
assertFileRegex $serviceFile "ExecStart=.*--files-from"
|
|
fi
|
|
|
|
assertFileExists $serviceFile
|
|
assertFileRegex $serviceFile "CacheDirectory=restic-backups-$backup"
|
|
assertFileRegex $serviceFile "Environment=.*PATH=.*openssh.*/bin"
|
|
assertFileRegex $serviceFile "ExecStartPre"
|
|
assertFileRegex $serviceFile "ExecStart=.*restic"
|
|
assertFileRegex $serviceFile "ExecStopPost"
|
|
assertFileRegex $serviceFile "Description=Restic backup service"
|
|
done
|
|
|
|
backup=local-backup
|
|
serviceFile=$serviceFiles/restic-backups-"$backup".service
|
|
assertFileRegex $serviceFile "Environment=RESTIC_REPOSITORY=/mnt/backup-hdd"
|
|
assertFileRegex $serviceFile "Environment=RESTIC_PASSWORD_FILE"
|
|
|
|
backup=remote-backup
|
|
serviceFile=$serviceFiles/restic-backups-"$backup".service
|
|
assertFileRegex $serviceFile "Environment=RESTIC_REPOSITORY=sftp:backup@host:/backups/home"
|
|
assertFileRegex $serviceFile "Environment=RESTIC_PASSWORD_FILE"
|
|
assertFileRegex $serviceFile "ExecStart=.*"
|
|
for part in ''${sftpStrings[@]}; do
|
|
assertFileRegex $serviceFile "ExecStart=.*$part"
|
|
done
|
|
|
|
backup=no-timer
|
|
serviceFile=$serviceFiles/restic-backups-"$backup".service
|
|
assertFileRegex $serviceFile "Environment=RESTIC_REPOSITORY=/root/restic-backup"
|
|
assertFileRegex $serviceFile "Environment=RESTIC_PASSWORD_FILE"
|
|
assertFileRegex $serviceFile "ExecStart=.*$defaultPruneOpts"
|
|
for part in ''${defaultPruneOpts[@]}; do
|
|
assertFileRegex $serviceFile "ExecStart=.*$part"
|
|
done
|
|
# TODO: assertFileNotExists
|
|
timerUnit=$serviceFiles/timers.target.wants/restic-backups-"$backup".timer
|
|
if [ -f $(_abs $timerUnit) ]; then
|
|
fail "restic backup config: \"$backup\" made a timer unit: $timerUnit when \`timerConfig = null\`"
|
|
fi
|
|
|
|
backup=repo-file
|
|
serviceFile=$serviceFiles/restic-backups-"$backup".service
|
|
assertFileRegex $serviceFile "Environment=RESTIC_REPOSITORY_FILE=.*repositoryFile"
|
|
assertFileRegex $serviceFile "Environment=RESTIC_PASSWORD_FILE"
|
|
assertFileRegex $serviceFile "ExecStart=.*$defaultPruneOpts"
|
|
for part in ''${defaultPruneOpts[@]}; do
|
|
assertFileRegex $serviceFile "ExecStart=.*$part"
|
|
done
|
|
|
|
backup=inhibit-sleep
|
|
serviceFile=$serviceFiles/restic-backups-"$backup".service
|
|
assertFileRegex $serviceFile "Environment=RESTIC_REPOSITORY=/root/restic-backup"
|
|
assertFileRegex $serviceFile "Environment=RESTIC_PASSWORD_FILE"
|
|
assertFileRegex $serviceFile "ExecStart=.*$defaultPruneOpts"
|
|
for part in ''${defaultPruneOpts[@]}; do
|
|
assertFileRegex $serviceFile "ExecStart=.*$part"
|
|
done
|
|
for part in ''${inhibitStrings[@]}; do
|
|
assertFileRegex $serviceFile "ExecStart=.*$part"
|
|
done
|
|
|
|
backup=noinit
|
|
serviceFile=$serviceFiles/restic-backups-"$backup".service
|
|
assertFileRegex $serviceFile "Environment=RESTIC_REPOSITORY=/root/restic-backup"
|
|
assertFileRegex $serviceFile "Environment=RESTIC_PASSWORD_FILE"
|
|
assertFileRegex $serviceFile "ExecStart=.*$defaultPruneOpts"
|
|
for part in ''${defaultPruneOpts[@]}; do
|
|
assertFileRegex $serviceFile "ExecStart=.*$part"
|
|
done
|
|
|
|
backup=rclone
|
|
serviceFile=$serviceFiles/restic-backups-"$backup".service
|
|
assertFileRegex $serviceFile "Environment=RESTIC_REPOSITORY=rclone:local:/root/restic-rclone-backup"
|
|
assertFileRegex $serviceFile "Environment=RESTIC_PASSWORD_FILE"
|
|
assertFileRegex $serviceFile "ExecStart=.*$defaultPruneOpts"
|
|
for part in ''${defaultPruneOpts[@]}; do
|
|
assertFileRegex $serviceFile "ExecStart=.*$part"
|
|
done
|
|
|
|
backup=prune
|
|
serviceFile=$serviceFiles/restic-backups-"$backup".service
|
|
assertFileRegex $serviceFile "Environment=RESTIC_REPOSITORY=/root/restic-backup"
|
|
assertFileRegex $serviceFile "Environment=RESTIC_PASSWORD_FILE"
|
|
assertFileRegex $serviceFile "ExecStart=.*--prune --keep-last 1"
|
|
|
|
backup=custom-package
|
|
serviceFile=$serviceFiles/restic-backups-"$backup".service
|
|
assertFileRegex $serviceFile "Environment=RESTIC_REPOSITORY=some-fake-repository"
|
|
assertFileRegex $serviceFile "Environment=RESTIC_PASSWORD_FILE"
|
|
assertFileRegex $serviceFile "ExecStart=.*forget --prune --keep-last 1"
|
|
assertFileRegex $serviceFile "ExecStart=.*my-cool-restic"
|
|
assertFileRegex $serviceFile "ExecStart=.*check --some-check-option"
|
|
'';
|
|
}
|