From 9b615d90c932b4bf68c74612adaf2091c38080c0 Mon Sep 17 00:00:00 2001 From: buildplan Date: Thu, 11 Sep 2025 19:50:36 +0100 Subject: [PATCH 01/11] delete specific snapshot --- restic-backup.sh | 74 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 72 insertions(+), 2 deletions(-) diff --git a/restic-backup.sh b/restic-backup.sh index d9fe9f9..2a3a041 100644 --- a/restic-backup.sh +++ b/restic-backup.sh @@ -1,14 +1,14 @@ #!/usr/bin/env bash # ================================================================= -# Restic Backup Script v0.25 - 2025.09.11 +# Restic Backup Script v0.26 - 2025.09.11 # ================================================================= set -euo pipefail umask 077 # --- Script Constants --- -SCRIPT_VERSION="0.25" +SCRIPT_VERSION="0.26" SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) CONFIG_FILE="${SCRIPT_DIR}/restic-backup.conf" LOCK_FILE="/tmp/restic-backup.lock" @@ -252,6 +252,7 @@ display_help() { printf " ${C_GREEN}%-20s${C_RESET} %s\n" "--init" "Initialize a new restic repository (one-time setup)." printf " ${C_GREEN}%-20s${C_RESET} %s\n" "--diff" "Show a summary of changes between the last two snapshots." printf " ${C_GREEN}%-20s${C_RESET} %s\n" "--snapshots" "List all available snapshots in the repository." + printf " ${C_GREEN}%-20s${C_RESET} %s\n" "--snapshots-delete" "Interactively select and permanently delete specific snapshots." printf " ${C_GREEN}%-20s${C_RESET} %s\n" "--check" "Verify repository integrity by checking a subset of data." printf " ${C_GREEN}%-20s${C_RESET} %s\n" "--forget" "Manually apply the retention policy and prune old data." printf " ${C_GREEN}%-20s${C_RESET} %s\n" "--unlock" "Forcibly remove stale locks from the repository." @@ -875,6 +876,71 @@ run_restore() { rm -f "$restore_log" } +run_snapshots_delete() { + echo -e "${C_BOLD}--- Interactively Delete Snapshots ---${C_RESET}" + echo -e "${C_BOLD}${C_RED}WARNING: This operation is permanent and cannot be undone.${C_RESET}" + echo + + # List available snapshots for the user + echo "Available snapshots:" + if ! restic snapshots --compact; then + echo -e "${C_RED}❌ Could not list snapshots. Aborting.${C_RESET}" >&2 + return 1 + fi + echo + + # Prompt user for snapshot IDs + local -a ids_to_delete + read -p "Enter snapshot ID(s) to delete, separated by spaces: " -a ids_to_delete + + if [ ${#ids_to_delete[@]} -eq 0 ]; then + echo "No snapshot IDs entered. Aborting." + return 1 + fi + + # Final confirmation + echo -e "\nYou have selected the following ${C_YELLOW}${!#ids_to_delete[@]} snapshot(s)${C_RESET} for deletion:" + for id in "${ids_to_delete[@]}"; do + echo " - $id" + done + echo + + read -p "Are you absolutely sure you want to PERMANENTLY delete these snapshots? (Type 'yes' to confirm): " confirm + if [[ "$confirm" != "yes" ]]; then + echo "Confirmation not received. Aborting deletion." + return 0 + fi + + # Execute the forget command + echo -e "${C_BOLD}--- Deleting Snapshots ---${C_RESET}" + log_message "User initiated deletion of snapshots: ${ids_to_delete[*]}" + + if restic forget "${ids_to_delete[@]}"; then + log_message "Successfully forgot snapshots: ${ids_to_delete[*]}" + echo -e "${C_GREEN}✅ Snapshots successfully deleted.${C_RESET}" + else + log_message "ERROR: Failed to forget snapshots: ${ids_to_delete[*]}" + echo -e "${C_RED}❌ Failed to delete snapshots.${C_RESET}" >&2 + return 1 + fi + + # Offer to run prune + read -p "Would you like to run 'prune' now to reclaim disk space? (y/n): " prune_confirm + if [[ "${prune_confirm,,}" == "y" || "${prune_confirm,,}" == "yes" ]]; then + echo -e "${C_BOLD}--- Pruning Repository ---${C_RESET}" + log_message "Running prune after manual forget" + if run_with_priority restic prune; then + log_message "Prune completed successfully." + echo -e "${C_GREEN}✅ Repository pruned.${C_RESET}" + else + log_message "ERROR: Prune failed after manual forget." + echo -e "${C_RED}❌ Prune failed.${C_RESET}" >&2 + fi + else + echo -e "${C_CYAN}ℹ️ Skipping prune. Run '--forget' or 'restic prune' later to reclaim space.${C_RESET}" + fi +} + # ================================================================= # MAIN SCRIPT EXECUTION # ================================================================= @@ -957,6 +1023,10 @@ case "${1:-}" in run_preflight_checks "diff" "quiet" run_diff ;; + --snapshots-delete) + run_preflight_checks "backup" "quiet" + run_snapshots_delete + ;; --unlock) run_preflight_checks "unlock" "quiet" run_unlock From a04cd40478062052eb12fb8f6a92bdcd93398544 Mon Sep 17 00:00:00 2001 From: buildplan Date: Thu, 11 Sep 2025 19:53:18 +0100 Subject: [PATCH 02/11] add new flag --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6886e61..183b13a 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ This script automates encrypted, deduplicated backups of local directories to a - `sudo ./restic-backup.sh --diff` - Show a summary of changes between the last two snapshots. - `sudo ./restic-backup.sh --unlock` - Forcibly remove stale locks from the repository. - `sudo ./restic-backup.sh --snapshots` - List all available snapshots in the repository. + - `sudo ./restic-backup.sh --snapshots-delete` - Permanently delete specific snapshots. - `sudo ./restic-backup.sh --init` - (One-time setup) Initialize the remote repository. - `sudo ./restic-backup.sh --help` - Displays help and all the flags. From f0a80427d8c482bf468f58914f4a994a7a249f09 Mon Sep 17 00:00:00 2001 From: buildplan Date: Thu, 11 Sep 2025 20:24:18 +0100 Subject: [PATCH 03/11] refactor backup command --- restic-backup.sh | 51 ++++++++++++++++++++++-------------------------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/restic-backup.sh b/restic-backup.sh index 2a3a041..9037319 100644 --- a/restic-backup.sh +++ b/restic-backup.sh @@ -275,6 +275,22 @@ log_message() { fi } +build_backup_command() { + local cmd=(restic) + [ "${LOG_LEVEL:-1}" -le 0 ] && cmd+=(--quiet) + [ "${LOG_LEVEL:-1}" -ge 2 ] && cmd+=(--verbose) + [ "${LOG_LEVEL:-1}" -ge 3 ] && cmd+=(--verbose) + cmd+=(backup) + [ -n "${BACKUP_TAG:-}" ] && cmd+=(--tag "$BACKUP_TAG") + [ -n "${COMPRESSION:-}" ] && cmd+=(--compression "$COMPRESSION") + [ -n "${PACK_SIZE:-}" ] && cmd+=(--pack-size "$PACK_SIZE") + [ "${ONE_FILE_SYSTEM:-false}" = "true" ] && cmd+=(--one-file-system) + [ -n "${EXCLUDE_FILE:-}" ] && [ -f "$EXCLUDE_FILE" ] && cmd+=(--exclude-file "$EXCLUDE_FILE") + [ -n "${EXCLUDE_TEMP_FILE:-}" ] && cmd+=(--exclude-file "$EXCLUDE_TEMP_FILE") + cmd+=("${BACKUP_SOURCES[@]}") + printf "%s\n" "${cmd[@]}" +} + run_diff() { echo -e "${C_BOLD}--- Generating Backup Summary ---${C_RESET}" log_message "Generating backup summary (diff)" @@ -284,7 +300,7 @@ run_diff() { return 1 fi local path_args=() - for p in $BACKUP_SOURCES; do + for p in "${BACKUP_SOURCES[@]}"; do path_args+=(--path "$p") done local snapshot_json @@ -656,21 +672,10 @@ run_backup() { local start_time=$(date +%s) echo -e "${C_BOLD}--- Starting Backup ---${C_RESET}" - log_message "Starting backup of: $BACKUP_SOURCES" - - # Build and execute backup command - backup_cmd=(restic) - [ "${LOG_LEVEL:-1}" -le 0 ] && backup_cmd+=(--quiet) - [ "${LOG_LEVEL:-1}" -ge 2 ] && backup_cmd+=(--verbose) - [ "${LOG_LEVEL:-1}" -ge 3 ] && backup_cmd+=(--verbose) - backup_cmd+=(backup) - [ -n "${BACKUP_TAG:-}" ] && backup_cmd+=(--tag "$BACKUP_TAG") - [ -n "${COMPRESSION:-}" ] && backup_cmd+=(--compression "$COMPRESSION") - [ -n "${PACK_SIZE:-}" ] && backup_cmd+=(--pack-size "$PACK_SIZE") - [ "${ONE_FILE_SYSTEM:-false}" = "true" ] && backup_cmd+=(--one-file-system) - [ -n "${EXCLUDE_FILE:-}" ] && [ -f "$EXCLUDE_FILE" ] && backup_cmd+=(--exclude-file "$EXCLUDE_FILE") - [ -n "${EXCLUDE_TEMP_FILE:-}" ] && backup_cmd+=(--exclude-file "$EXCLUDE_TEMP_FILE") - backup_cmd+=($BACKUP_SOURCES) + log_message "Starting backup of: ${BACKUP_SOURCES[*]}" + + local backup_cmd=() + mapfile -t backup_cmd < <(build_backup_command) local backup_log=$(mktemp) local backup_success=false @@ -983,18 +988,8 @@ case "${1:-}" in --dry-run) echo -e "${C_BOLD}--- Dry Run Mode ---${C_RESET}" run_preflight_checks "backup" "quiet" - backup_cmd=(restic) - [ "${LOG_LEVEL:-1}" -le 0 ] && backup_cmd+=(--quiet) - [ "${LOG_LEVEL:-1}" -ge 2 ] && backup_cmd+=(--verbose) - [ "${LOG_LEVEL:-1}" -ge 3 ] && backup_cmd+=(--verbose) - backup_cmd+=(backup) - [ -n "${BACKUP_TAG:-}" ] && backup_cmd+=(--tag "$BACKUP_TAG") - [ -n "${COMPRESSION:-}" ] && backup_cmd+=(--compression "$COMPRESSION") - [ -n "${PACK_SIZE:-}" ] && backup_cmd+=(--pack-size "$PACK_SIZE") - [ "${ONE_FILE_SYSTEM:-false}" = "true" ] && backup_cmd+=(--one-file-system) - [ -n "${EXCLUDE_FILE:-}" ] && [ -f "$EXCLUDE_FILE" ] && backup_cmd+=(--exclude-file "$EXCLUDE_FILE") - [ -n "${EXCLUDE_TEMP_FILE:-}" ] && backup_cmd+=(--exclude-file "$EXCLUDE_TEMP_FILE") - backup_cmd+=($BACKUP_SOURCES) + local backup_cmd=() + mapfile -t backup_cmd < <(build_backup_command) backup_cmd+=(--dry-run) run_with_priority "${backup_cmd[@]}" ;; From b2f7ae24a6a9888918d20e885bc7ea2a02a4c363 Mon Sep 17 00:00:00 2001 From: buildplan Date: Thu, 11 Sep 2025 20:30:54 +0100 Subject: [PATCH 04/11] improved --- restic-backup.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/restic-backup.conf b/restic-backup.conf index 4bde894..30f041f 100644 --- a/restic-backup.conf +++ b/restic-backup.conf @@ -12,8 +12,8 @@ RESTIC_PASSWORD_FILE="/root/.restic-password" # --- Source Directories --- # Space-separated list of directories to backup -# if file name has a space add parentheses, like "/home/user/My Docs" -BACKUP_SOURCES="/home/user_files" +# if there are spaces in the files name add parentheses +BACKUP_SOURCES="/home/user_files "/home/user/my docs" # --- Backup Options --- # Backup tag to identify snapshots From 21b935f92c1108f402bcdae89293dd4254ec86d2 Mon Sep 17 00:00:00 2001 From: buildplan Date: Thu, 11 Sep 2025 20:47:59 +0100 Subject: [PATCH 05/11] fix syntax --- restic-backup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/restic-backup.sh b/restic-backup.sh index 9037319..72670ae 100644 --- a/restic-backup.sh +++ b/restic-backup.sh @@ -904,7 +904,7 @@ run_snapshots_delete() { fi # Final confirmation - echo -e "\nYou have selected the following ${C_YELLOW}${!#ids_to_delete[@]} snapshot(s)${C_RESET} for deletion:" + echo -e "\nYou have selected the following ${C_YELLOW}${#ids_to_delete[@]} snapshot(s)${C_RESET} for deletion:" for id in "${ids_to_delete[@]}"; do echo " - $id" done From 8f9fd84195d6453c539ea01211f171f67d87ff53 Mon Sep 17 00:00:00 2001 From: buildplan Date: Thu, 11 Sep 2025 20:59:57 +0100 Subject: [PATCH 06/11] fix directory paths --- restic-backup.conf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/restic-backup.conf b/restic-backup.conf index 30f041f..61ef8a7 100644 --- a/restic-backup.conf +++ b/restic-backup.conf @@ -11,9 +11,9 @@ RESTIC_REPOSITORY="sftp:storagebox:/home/vps" RESTIC_PASSWORD_FILE="/root/.restic-password" # --- Source Directories --- -# Space-separated list of directories to backup -# if there are spaces in the files name add parentheses -BACKUP_SOURCES="/home/user_files "/home/user/my docs" +# Use Bash array syntax for paths, especially if they contain spaces. +# Each full path should be a separate, quoted element inside the parentheses. +BACKUP_SOURCES=("/home/user_files" "/home/user/my docs") # --- Backup Options --- # Backup tag to identify snapshots From dde329fe1c658936faf3caeec17b7dc2b93a3d34 Mon Sep 17 00:00:00 2001 From: buildplan Date: Thu, 11 Sep 2025 21:43:38 +0100 Subject: [PATCH 07/11] check for BACKUP_SOURCES --- restic-backup.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/restic-backup.sh b/restic-backup.sh index 72670ae..85f0ff1 100644 --- a/restic-backup.sh +++ b/restic-backup.sh @@ -583,6 +583,13 @@ run_preflight_checks() { # Backup Sources if [[ "$mode" == "backup" || "$mode" == "diff" ]]; then if [[ "$verbosity" == "verbose" ]]; then echo -e "\n ${C_DIM}- Checking Backup Sources${C_RESET}"; fi + if ! declare -p BACKUP_SOURCES 2>/dev/null | grep -q "declare -a"; then + echo -e "[${C_RED} FAIL ${C_RESET}]" + echo -e "${C_RED}Configuration Error: BACKUP_SOURCES is not a valid array.${C_RESET}" >&2 + echo -e "${C_YELLOW}Use the correct Bash array syntax in your restic-backup.conf file.${C_RESET}" >&2 + echo -e "Example: ${C_GREEN}BACKUP_SOURCES=(\"/path/one\" \"/path with spaces/two\")${C_RESET}" >&2 + exit 1 + fi for source in "${BACKUP_SOURCES[@]}"; do if [[ "$verbosity" == "verbose" ]]; then printf " %-65s" "Source directory ('$source')..."; fi if [ ! -d "$source" ] || [ ! -r "$source" ]; then From d4b8b1d8cc6d0218ab5c2f43ea5bcb94692c6b79 Mon Sep 17 00:00:00 2001 From: buildplan Date: Thu, 11 Sep 2025 22:05:21 +0100 Subject: [PATCH 08/11] notifications for preflight checks --- restic-backup.sh | 43 ++++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/restic-backup.sh b/restic-backup.sh index 85f0ff1..414d94b 100644 --- a/restic-backup.sh +++ b/restic-backup.sh @@ -504,6 +504,19 @@ run_preflight_checks() { local mode="${1:-backup}" local verbosity="${2:-quiet}" + # Helper function for failure + handle_failure() { + local error_message="$1" + local notification_title="Pre-flight Check FAILED: $HOSTNAME" + local full_error_message="ERROR: $error_message" + log_message "$full_error_message" + [[ "$verbosity" == "verbose" ]] && echo -e "[${C_RED} FAIL ${C_RESET}]" + echo -e "${C_RED}$full_error_message${C_RESET}" >&2 + send_notification "$notification_title" "x" \ + "${NTFY_PRIORITY_FAILURE}" "failure" "$error_message" + exit 1 + } + if [[ "$verbosity" == "verbose" ]]; then echo -e "${C_BOLD}--- Running Pre-flight Checks ---${C_RESET}" fi @@ -516,9 +529,7 @@ run_preflight_checks() { local required_cmds=(restic curl flock) for cmd in "${required_cmds[@]}"; do if ! command -v "$cmd" &>/dev/null; then - [[ "$verbosity" == "verbose" ]] && echo -e "[${C_RED} FAIL ${C_RESET}]" - echo -e "${C_RED}ERROR: Required command '$cmd' not found${C_RESET}" >&2 - exit 10 + handle_failure "Required command '$cmd' not found." fi done if [[ "$verbosity" == "verbose" ]]; then echo -e "[${C_GREEN} OK ${C_RESET}]"; fi @@ -528,27 +539,21 @@ run_preflight_checks() { if [[ "$verbosity" == "verbose" ]]; then printf " %-65s" "Password file ('$RESTIC_PASSWORD_FILE')..."; fi if [ ! -r "$RESTIC_PASSWORD_FILE" ]; then - [[ "$verbosity" == "verbose" ]] && echo -e "[${C_RED} FAIL ${C_RESET}]" - echo -e "${C_RED}ERROR: Password file not found or not readable: $RESTIC_PASSWORD_FILE${C_RESET}" >&2 - exit 11 + handle_failure "Password file not found or not readable: $RESTIC_PASSWORD_FILE" fi if [[ "$verbosity" == "verbose" ]]; then echo -e "[${C_GREEN} OK ${C_RESET}]"; fi if [ -n "${EXCLUDE_FILE:-}" ]; then if [[ "$verbosity" == "verbose" ]]; then printf " %-65s" "Exclude file ('$EXCLUDE_FILE')..."; fi if [ ! -r "$EXCLUDE_FILE" ]; then - [[ "$verbosity" == "verbose" ]] && echo -e "[${C_RED} FAIL ${C_RESET}]" - echo -e "${C_RED}ERROR: The specified EXCLUDE_FILE is not readable: ${EXCLUDE_FILE}${C_RESET}" >&2 - exit 14 + handle_failure "The specified EXCLUDE_FILE is not readable: ${EXCLUDE_FILE}" fi if [[ "$verbosity" == "verbose" ]]; then echo -e "[${C_GREEN} OK ${C_RESET}]"; fi fi if [[ "$verbosity" == "verbose" ]]; then printf " %-65s" "Log file writability ('$LOG_FILE')..."; fi if ! touch "$LOG_FILE" >/dev/null 2>&1; then - [[ "$verbosity" == "verbose" ]] && echo -e "[${C_RED} FAIL ${C_RESET}]" - echo -e "${C_RED}ERROR: The log file or its directory is not writable: ${LOG_FILE}${C_RESET}" >&2 - exit 15 + handle_failure "The log file or its directory is not writable: ${LOG_FILE}" fi if [[ "$verbosity" == "verbose" ]]; then echo -e "[${C_GREEN} OK ${C_RESET}]"; fi @@ -561,9 +566,7 @@ run_preflight_checks() { if [[ "$verbosity" == "verbose" ]]; then echo -e "[${C_YELLOW} SKIP ${C_RESET}] (OK for --init mode)"; fi return 0 fi - [[ "$verbosity" == "verbose" ]] && echo -e "[${C_RED} FAIL ${C_RESET}]" - echo -e "${C_RED}ERROR: Cannot access repository. Check credentials or run --init first.${C_RESET}" >&2 - exit 12 + handle_failure "Cannot access repository. Check credentials or run --init first." fi if [[ "$verbosity" == "verbose" ]]; then echo -e "[${C_GREEN} OK ${C_RESET}]"; fi @@ -584,18 +587,12 @@ run_preflight_checks() { if [[ "$mode" == "backup" || "$mode" == "diff" ]]; then if [[ "$verbosity" == "verbose" ]]; then echo -e "\n ${C_DIM}- Checking Backup Sources${C_RESET}"; fi if ! declare -p BACKUP_SOURCES 2>/dev/null | grep -q "declare -a"; then - echo -e "[${C_RED} FAIL ${C_RESET}]" - echo -e "${C_RED}Configuration Error: BACKUP_SOURCES is not a valid array.${C_RESET}" >&2 - echo -e "${C_YELLOW}Use the correct Bash array syntax in your restic-backup.conf file.${C_RESET}" >&2 - echo -e "Example: ${C_GREEN}BACKUP_SOURCES=(\"/path/one\" \"/path with spaces/two\")${C_RESET}" >&2 - exit 1 + handle_failure "Configuration Error: BACKUP_SOURCES is not a valid array. Example: BACKUP_SOURCES=('/path/one' '/path/two')" fi for source in "${BACKUP_SOURCES[@]}"; do if [[ "$verbosity" == "verbose" ]]; then printf " %-65s" "Source directory ('$source')..."; fi if [ ! -d "$source" ] || [ ! -r "$source" ]; then - [[ "$verbosity" == "verbose" ]] && echo -e "[${C_RED} FAIL ${C_RESET}]" - echo -e "${C_RED}ERROR: Source directory not found or not readable: $source${C_RESET}" >&2 - exit 13 + handle_failure "Source directory not found or not readable: $source" fi if [[ "$verbosity" == "verbose" ]]; then echo -e "[${C_GREEN} OK ${C_RESET}]"; fi done From 2fed23af4cdb5bdf2d416ed3f574f3caa352aa2a Mon Sep 17 00:00:00 2001 From: buildplan Date: Thu, 11 Sep 2025 22:21:20 +0100 Subject: [PATCH 09/11] sha256 for v0.26 --- restic-backup.sh.sha256 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/restic-backup.sh.sha256 b/restic-backup.sh.sha256 index fc5390a..d3f8f2a 100644 --- a/restic-backup.sh.sha256 +++ b/restic-backup.sh.sha256 @@ -1 +1 @@ -5dfa4a4d4f6a05e22aaf01b6292146ac47280a08f5786684a395bdb2fefc9b63 restic-backup.sh +ddd9ec789a7560060a1b9f9c08352a218e674f8395ff8b435b0610dd4bace1ab restic-backup.sh From 17d9bdda8d2fbea91bac6a5d6a16a8862e82b163 Mon Sep 17 00:00:00 2001 From: buildplan Date: Thu, 11 Sep 2025 22:27:09 +0100 Subject: [PATCH 10/11] fix for shellcheck --- restic-backup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/restic-backup.sh b/restic-backup.sh index 414d94b..82324c2 100644 --- a/restic-backup.sh +++ b/restic-backup.sh @@ -992,7 +992,7 @@ case "${1:-}" in --dry-run) echo -e "${C_BOLD}--- Dry Run Mode ---${C_RESET}" run_preflight_checks "backup" "quiet" - local backup_cmd=() + backup_cmd=() mapfile -t backup_cmd < <(build_backup_command) backup_cmd+=(--dry-run) run_with_priority "${backup_cmd[@]}" From 791a1c6c0b51c027725c4ac77e92d7223c9ebe8b Mon Sep 17 00:00:00 2001 From: buildplan Date: Thu, 11 Sep 2025 22:27:25 +0100 Subject: [PATCH 11/11] sha256 for v0.26 --- restic-backup.sh.sha256 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/restic-backup.sh.sha256 b/restic-backup.sh.sha256 index d3f8f2a..cea9c4b 100644 --- a/restic-backup.sh.sha256 +++ b/restic-backup.sh.sha256 @@ -1 +1 @@ -ddd9ec789a7560060a1b9f9c08352a218e674f8395ff8b435b0610dd4bace1ab restic-backup.sh +0be741aeb52b448cd5cffbf976d76d06161642a33b8ec7781752a882c7e02ecb restic-backup.sh