nix/host/x86_64-linux/home/Backup.nix

104 lines
2.3 KiB
Nix

{ pkgs, util, __findFile, ... } @args: let
bash = import <home/program/bash> args;
script = pkgs.writeText "backupScript" ''
source ${bash.modulesFile}
function report() {
echo "''${*}"
notify "''${*}"
}
# Define constants.
path_src="/storage/hot"
path_mount="/storage/cold_1"
path_backup="''${path_mount}/backup"
path_container="''${path_backup}/home"
path_media="/storage/cold_1/media /storage/cold_2/media"
# Check if backup drive is mounted.
if [ ! -f "''${path_mount}"/.mount ]; then
report "Backup : ''${path_mount} not mounted!"
exit 1
fi
# Check if hot storage is mounted.
if [ ! -f "''${path_src}"/.mount ]; then
report "Backup : ''${path_src} not mounted!"
exit 1
fi
# Cd to src storage.
cd "''${path_src}"
# Save media list.
find ''${path_media} -type d > ''${path_backup}/cold/ColdMedia.txt || report "Backup : Failed to save media list!"
cd ''${path_backup}/cold/
archive ColdMedia.txt && rm ColdMedia.txt || report "Backup : Failed to archive media list!"
cd -
# Backup containers.
container=$(archive container/)
bupsize=$(tdu ''${container} | awk '{print $1}')
mv ''${container} ''${path_container}/ || report "Backup : Failed to save containers!"
# Backup some media.
cd ''${path_src}/media/
paper=$(archive paper/)
mv ''${paper} ''${path_backup}/paper/ || report "Backup : Failed to save paper!"
cd -
# Prune media copies.
cd ''${path_backup}/paper/
archive_prune Paper 7
cd -
cd ''${path_backup}/cold/
archive_prune ColdMediaTxt 30
cd -
# Prune old container copies.
cd ''${path_container}
archive_prune Container 7
cd -
# Prune game saves.
cd "''${path_backup}/save/"
archive_prune
cd -
# Sync writes.
sync
# Notify completion & size.
notify_silent "Backup : Complete ''${bupsize}."
echo "Backup : Complete ''${bupsize}."
'';
in {
systemd.services.backup = util.mkStaticSystemdService {
enable = true;
description = "Home system backup.";
serviceConfig.Type = "oneshot";
path = with pkgs; [
bashInteractive
curl
gawk
gnutar
procps
pv
xz
];
script = ''
${pkgs.bashInteractive}/bin/bash ${script}
'';
};
systemd.timers.backup = {
timerConfig = {
OnCalendar = "*-*-* 06:00:00";
Persistent = true;
Unit = "backup.service";
};
wantedBy = [ "timers.target" ];
};
}