diff --git a/backup.nix b/backup.nix index eda4a72..9c8e113 100644 --- a/backup.nix +++ b/backup.nix @@ -11,30 +11,7 @@ let runtimeInputs = [ pkgs.restic ]; - text = '' - if [ -z "$BACKUP_HELPER_DIRS" ]; then - echo "BACKUP_HELPER_DIRS is not set" - exit 1; - fi - exit_code=0; - for i in ''${BACKUP_HELPER_DIRS//,/ }; do - echo "Starting backup of $i"; - if ! output=$(restic backup "$i"); then - exit_code=1; - echo "Backup of $i failed with exit code $?:" - echo "$output" - else - echo "Backup of $i successful:" - echo "$output" - fi - done - if [ "$BACKUP_FORGET" -eq 1 ]; then - echo "Removing old backups" - output=$(restic forget -d 7 -w 4 -m 6 --keep-within 1d --prune) - echo "$output" - fi - exit "$exit_code"; - ''; + text = (builtins.readFile ./backup.sh); }; in { @@ -50,6 +27,11 @@ in default = [ ]; description = "Directories to be backed up."; }; + backup-commands = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = [ ]; + description = "Backup the stdout of commands. Format strings like key:command"; + }; schedule = lib.mkOption { type = lib.types.str; default = "*-*-* 00:00:00"; @@ -83,6 +65,9 @@ in } // lib.attrsets.optionalAttrs (builtins.hasAttr "password-file" cfg) { RESTIC_PASSWORD_FILE = cfg.password-file; + } + // lib.attrsets.optionalAttrs (cfg.backup-commands != [ ]) { + BACKUP_HELPER_COMMANDS = lib.strings.concatStringsSep ";" cfg.backup-commands; }; serviceConfig = { Type = "oneshot"; diff --git a/backup.sh b/backup.sh new file mode 100644 index 0000000..ea34f60 --- /dev/null +++ b/backup.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash + +# If neither of BACKUP_HELPER_DIRS and BACKUP_HELPER_COMMANDS not set. Exit +if [ -z "$BACKUP_HELPER_DIRS" ] && [ -z "$BACKUP_HELPER_COMMANDS" ]; then + echo "BACKUP_HELPER_DIRS is not set" + exit 1; +fi +exit_code=0; + +# Backup directories +if [ -n "$BACKUP_HELPER_DIRS" ]; then + for i in ${BACKUP_HELPER_DIRS//,/ }; do + echo "Starting backup of $i"; + if ! output=$(restic backup "$i"); then + exit_code=1; + echo "Backup of $i failed with exit code $?:" + echo "$output" + else + echo "Backup of $i successful:" + echo "$output" + fi + done +fi + +# Backup command outputs +if [ -n "$BACKUP_HELPER_COMMANDS" ]; then + IFS=";" read -r -a pairs <<< "$BACKUP_HELPER_COMMANDS" + + for pair in "${pairs[@]}"; do + IFS=":" read -r key value <<< "$pair" + + if ! output=$(restic backup --stdin-filename "$key" --stdin-from-command -- "$value"); then + exit_code=1; + echo "Backup of $i failed with exit code $?:" + echo "$output" + else + echo "Backup of $i successful:" + echo "$output" + fi + + done +fi + +if [ "$BACKUP_FORGET" -eq 1 ]; then + echo "Removing old backups" + output=$(restic forget -d 7 -w 4 -m 6 --keep-within 1d --prune) + echo "$output" +fi +exit "$exit_code"