I passaggi 1, 2 e 4 sono relativamente semplici e possono essere eseguiti utilizzando launchd
(o cron
) per chiamare uno script.
La mia soluzione implica alcune impostazioni, prese da questo post del blog :
Apri Keychain Access
( ⌘ Spazio Keychain Access
), fai clic su Password
, quindi su + per creare una nuova password. Utente restic
per Keychain Item Name
e per Account Name
. Inserisci la password che intendi utilizzare nel campo Password
(ad esempio, inserisci la stessa password che hai utilizzato quando hai eseguito restic init
). Infine, fai clic su Add
per completare la procedura di configurazione.
Il processo -
launchd
(o cron
) viene eseguito ogni 24 ore e chiama semplicemente uno script di shell restic-backup.sh
-
restic-backup.sh
controlla se /Volumes/usb-storage-name
è montato e si ferma se non lo è. Se l'unità è montata, verifica l'esistenza della directory /Users/user/data
e si blocca se la directory non esiste (non può eseguire il backup di una directory inesistente!) Se il volume di backup è montato e la directory di origine Esiste quindi passa al passaggio 3 ...
-
Se la variabile di ambiente RESTIC_PASSWORD
è impostata su Restic userà il suo valore invece di richiesta di una password . restic-backup.sh
imposterà RESTIC_PASSWORD
usando il comando security
e alcuni ruby
magic:
RESTIC_PASSWORD=$(security 2>&1 >/dev/null find-generic-password -ga restic |ruby -e 'print $1 if STDIN.gets =~ /^password: "(.*)"$/')
Con RESTIC_PASSWORD
impostato lo script ora può eseguire il backup:
restic -r /Volumes/usb-storage-name/restic-backups backup /Users/user/data
-
Il processo launchd
/ cron
del passaggio 1 deve essere eseguito ogni 24 ore, coprendo anche il passaggio 4.
restic-backup.sh
:
#!/bin/bash
# USER CONFIGURATION:
resticuser=restic
srcdir=/Users/user/data
backupvolume=/Volumes/usb-storage-name
backupdir=${backupvolume}/restic-backups
# Script vars:
longname=$0
shortname=$(/usr/bin/basename "${longname}")
printf '%s %s (%s) running...\n' "$(date -u "+%Y-%m-%d %H:%M:%S")" "${shortname}" "${longname}"
if [[ ! -d "${srcdir}" ]]; then
printf '%s %s does NOT exist.' "$(date -u "+%Y-%m-%d %H:%M:%S")" "${srcdir}" >&2
exit 1
else
if [[ $(mount | grep "${backupvolume}") ]]; then
# See: http://blog.macromates.com/2006/keychain-access-from-shell/
# Parse output of 'security' and set RESTIC_PASSWORD:
export RESTIC_PASSWORD=$(security 2>&1 >/dev/null find-generic-password -ga ${resticuser} |ruby -e 'print $1 if STDIN.gets =~ /^password: "(.*)"$/')
# Run backup, capturing output in case of error:
output=$(restic -r ${backupdir} backup "${srcdir}")
error=$?
if [[ "${error}" == "0" ]]; then
printf '%s Restic backup completed successfully.\n' "$(date -u "+%Y-%m-%d %H:%M:%S")"
else
printf '%s Restic backup failed: error code: %s, error: %s\n' \
"$(date -u "+%Y-%m-%d %H:%M:%S")" "${error}" "${output}" >&2
fi
else
printf '%s %s is NOT mounted.' "$(date -u "+%Y-%m-%d %H:%M:%S")" "${backupvolume}" >&2
exit 1
fi
fi
printf '%s %s ended.\n' "$(date -u "+%Y-%m-%d %H:%M:%S")" "${shortname}"