#!/bin/bash # Impostazioni varie: # dove salvo il file con l'elenco dei files da backuppare listfile="/tmp/pve-remote-backup-filelist.txt" # dove monto il disco dello storage removibile # e relativo nome del device e password di sblocco mountpoint="/usbdisk" encrypted_device_name="/dev/disk/by-partlabel/usb-backup-encrypted" unlocked_device_name="usb-backup-unlocked" password="PASSWORD DEL DISCO USB CRITTATO" # dove vengono creati gli hard link che verranno poi usati # da un sistema di backup pull remoto (backuppc / rsnapshot) # NOTA BENE: il path deve essere nello stesso disco fisico dove si trovano # i backup di PVE, deve esistere, ed e` meglio che sia diverso da quello # che contiene i backup (che di solito e` "dumps") # Se non voglio usare questa funzione lo imposto a "NONE" o commento via la riga #hardlink="/mnt/pve/backup8tb/hardlinks" hardlink="NONE" # Se il backup non viene fatto sullo storage specificato # Allora NON FACCIO NULLA ED ESCO if [ "$STOREID" != "backup8tb" ]; then exit 0 fi # all'inizio del job, mi assicuro di cancellare # la lista dei files if [ "$1" == "job-start" ]; then echo "JOB-START: cancello la lista dei files" [ -f $listfile ] && rm $listfile exit 0 fi # alla fine del singolo backup mi segno il nome # del file che e` stato creato, mi servirà dopo per # sapere cosa devo copiare. if [ "$1" == "backup-end" ]; then echo "BACKUP-END: salvo il nome del file" echo $TARGET >> $listfile # echo $TARFILE >> $listfile fi # alla fine del job, # se la funzione hardlink è richiesta, la eseguo, poi # monto lo storage remoto, ruoto i vecchi backup se necessario, # e copio tutti i files del backup attuale sullo storage remoto if [ "$1" == "job-end" ]; then # se la variabile hardlink non e` vuota, non contiene la stringa "NONE" # ed e` una directory che esiste, allora procediamo a creare gli hard link if [ ! -z $hardlink ] && [ "$hardlink" != "NONE" ] && [ -d $hardlink ] ; then echo "JOB-END: Creo i link per il backup a mezzo di rsnapshot" while IFS= read -r line do nopath=`echo $line | awk 'END{ n=split ($NF,a,"/"); print a[n]}'` destination=`echo $nopath | awk -F[-.] '{ print $1 "-" $2 "-" $3 "." $6 "." $7}'` if [[ -z "${line// }" ]] ; then echo "JOB-END: ERRORE, trovata una linea vuota nell'elenco di input - la ignoro" else echo "JOB-END: creo hardlink da $line su $hardlink/$destination" ln -f $line $hardlink/$destination fi done <"$listfile" fi # fine della procedura degli hard link, procediamo con le copie sullo storage remoto echo "JOB-END: Monto il disco USB" if mountpoint -q $mountpoint; then echo "JOB-END: ERRORE, $mountpoint e' gia' montata" exit 1 fi # montiamo il disco crittato echo -n "$password" | cryptsetup open $encrypted_device_name $unlocked_device_name - mount /dev/mapper/$unlocked_device_name $mountpoint if mountpoint -q $mountpoint; then echo "JOB-END: Disco USB montato" # Leggo la lista dei files da copiare e li copio rinominandoli # in modo da togliere il timestamp. while IFS= read -r line do nopath=`echo $line | awk 'END{ n=split ($NF,a,"/"); print a[n]}'` destination=`echo $nopath | awk -F[-.] '{ print $1 "-" $2 "-" $3 "." $6 "." $7}'` if [[ -z "${line// }" ]] ; then echo "JOB-END: ERRORE, trovata una linea vuota nell'elenco di input - la ignoro" else echo "JOB-END: Salvo lo storico per $mountpoint/$destination" if [[ $(date +%u) -eq 7 ]] ; then # se e` domenica salvo in weekly e ne tengo 4 savelog -c4 -l -r weekly $mountpoint/$destination else # se e` un altro giorno salvo in daily e ne tengo 6 savelog -c6 -l -r daily $mountpoint/$destination fi echo "JOB-END: Copio $line su $mountpoint/$destination" cp $line $mountpoint/$destination fi done <"$listfile" # Fine della copia, smonto e ho finito. echo "JOB-END: Smonto il disco USB" umount $mountpoint cryptsetup close $unlocked_device_name exit 0 else echo "JOB-END: ERRORE, storage remoto non accessibile" exit 1 fi fi