Los pasos 1, 2 y 4 son relativamente sencillos y se pueden realizar utilizando launchd
(o cron
) para llamar a un script.
Mi solución implica una configuración, tomada de esta publicación de blog :
Abra Keychain Access
( ⌘ Espacio Keychain Access
), haga clic en Password
, luego + para crear una nueva contraseña. Usuario restic
para el Keychain Item Name
y para el Account Name
. Ingrese la contraseña que pretende usar en el campo Password
(es decir, ingrese la misma contraseña que usó cuando ejecutó restic init
). Finalmente, haga clic en Add
para completar el proceso de configuración.
El trabajo -
launchd
(o cron
) se ejecuta cada 24 horas y simplemente llama a un script de shell restic-backup.sh
-
restic-backup.sh
comprueba si /Volumes/usb-storage-name
está montado y se detiene si no lo está. Si la unidad está montada, verifica la existencia del directorio /Users/user/data
y se detiene si el directorio no existe (¡no puede hacer una copia de seguridad de un directorio que no existe!) Si el volumen de copia de seguridad está montado y el directorio de origen existe, luego pasa al paso 3 ...
-
Si la variable de entorno RESTIC_PASSWORD
está establecida, Restic usará su valor en lugar de solicitando una contraseña . restic-backup.sh
establecerá RESTIC_PASSWORD
usando el comando security
y algunos 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
establecido, el script ahora puede ejecutar la copia de seguridad:
restic -r /Volumes/usb-storage-name/restic-backups backup /Users/user/data
-
El trabajo launchd
/ cron
del paso 1 debe ejecutarse cada 24 horas, cubriendo el paso 4 también.
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}"