Los pasos 1, 2 y 4 son relativamente sencillos y pueden realizarse con launchd
(o cron
) para llamar a un script.
Mi solución implica un poco de configuración, tomada de esta entrada del blog :
Abrir Keychain Access
( ⌘Space Keychain Access
), haga clic en Password
entonces + para crear una nueva contraseña. Usuario restic
para el Keychain Item Name
y para el Account Name
. Introduzca la contraseña que pretende utilizar en el Password
(es decir, introduzca la misma contraseña que utilizó cuando ejecutó restic init
). Por último, haga clic en Add
para completar el proceso de configuración.
-
launchd
(o cron
) se ejecuta cada 24 horas y simplemente llama a un shell script 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, se comprueba la existencia del archivo /Users/user/data
y se detiene si el directorio no existe (¡no puede hacer una copia de seguridad de un directorio inexistente!) Si el volumen de la copia de seguridad está montado y el directorio de origen existe, pasa al paso 3...
-
Si la variable de entorno RESTIC_PASSWORD
Restic utilizará su valor en lugar de solicitar una contraseña . restic-backup.sh
se fijará RESTIC_PASSWORD
utilizando el security
y algunos ruby
mágico:
RESTIC_PASSWORD=$(security 2>&1 >/dev/null find-generic-password -ga restic |ruby -e 'print $1 if STDIN.gets =~ /^password: "(.*)"$/')
Con RESTIC_PASSWORD
establecer el script puede ahora ejecutar la copia de seguridad:
restic -r /Volumes/usb-storage-name/restic-backups backup /Users/user/data
-
El launchd
/ cron
El trabajo del paso 1 debe ejecutarse cada 24 horas, cubriendo también el paso 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}"