Copie intelligenti

Mi è sempre piaciuta l’idea di avere copie “intelligenti”, ossia

  • una copia al giorno per una settimana
  • una copia alla settimana per un mese
  • una copia al mese per un anno
  • una copia all’anno per la parte vecchia.

E mi son sempre arrovellato su come implementarlo nel mio umile scriptino bash con cui facevo alcune copie di sicurezza. 1(che poi nemmeno era uno scriptino, ma addirittura una riga di cron! mount $QNAP; if cd $QNAP/Calcestruzzo/;then mv qualita.tar.bz2 qualita.old.tar.bz2; tar -acf qualita.tar.bz2 $QUALITA/*; else echo Errore;fi )

E la pigrizia vinceva e mi tenevo solo gli ultimi due. Poi, complice una quasi perdita di dati 2(una pirlata da pivello totale da cui mi son salvato solo perché prima della serrata ho fatto su un disco esterno delle copie manuali del tutto) durante la serrata per l’emergenza sanitaria mi sono accorto che esistono arnesi (strumenti, o “tool”) come rdiff-backup che offrono contemporaneamente una copia intera dell’ultima versione dei dati e retrodifferenze che permettono di ricostruire la storia dei backup.

E non so più cosa usare, tipo asino di buridano. Perché l’idea di rdiff-backup è davvero valida, ma non ti permette di mantere uno storico “selettivo” come piacerebbe a me. Tanto più che c’è un modo facilissimo per ottenere quelle copie intelligenti (vedi How to keep: daily backups for a week, weekly for a month, monthly for a year, and yearly after that ): basta tenere separata in una cartella diversa ogni categoria (quotidiana, settimanale, mensile, annuale). Così:

  • Every day:
    • make a backup, put into daily directory
    • remove everything but the last 7 daily backups
  • Every week:
    • make a backup, put into weekly directory
    • remove everything but the last 5 weekly backups
  • Every month:
    • make a backup, put into monthly directory
    • remove everything but the last 12 monthly backups
  • Every year:
    • make a backup, put into yearly directory

Cavolo, è l’uovo di Colombo! Roba che si implementa con un cronjob da 4 righe ed uno script bash che si fa prima a leggerlo che a spiegarlo!

@daily /home/paolo/bin/copie-qualita.sh quotidiane
@weekly /home/paolo/bin/copie-qualita.sh settimanali
@monthly /home/paolo/bin/copie-qualita.sh mensili
@yearly /home/paolo/bin/copie-qualita.sh annuali
#!/bin/bash

QUALITA=/home/qualita
QNAP=/mnt/qnap/Public

QUOTIDIANE=$QNAP/Calcestruzzo/qualita/quotidiane
SETTIMANALI=$QNAP/Calcestruzzo/qualita/settimanali
MENSILI=$QNAP/Calcestruzzo/qualita/mensili
ANNUALI=$QNAP/Calcestruzzo/qualita/annuali

case $FREQUENZA in
  quotidiane)
    DESTINAZIONE=$QUOTIDIANE/qualita-$( date +%F ).tar.bz2 
    DELENDA=$QUOTIDIANE
    MANTENENDA=7
    ;;
  settimanali)
    DESTINAZIONE=$SETTIMANALI/qualita-$(date +%F).tar.bz2 
    DELENDA=$SETTIMANALI
    MANTENENDA=4
     ;;
  mensili)
    DESTINAZIONE=$MENSILI/qualita-$(date +%F).tar.bz2 
    DELENDA=$MENSILI
    MANTENENDA=12
     ;;
  annuali)
    DESTINAZIONE=$ANNUALI/qualita-$(date +%F).tar.bz2 
    ;;
  *)
    echo "Usage: $0 (quotidiane|settimanali|mensili|annuali)"
    exit 5
esac

echo Copie $FREQUENZA da $QUALITA a $DESTINAZIONE
mount $QNAP && 
  tar --auto-compress --create --file $DESTINAZIONE $QUALITA/* &&
  if [[ $FREQUENZA != "annuali" ]]
  then
    echo In $DELENDA conservo gli ultimi $MANTENENDA file
    rm --verbose --force $( ls $DELENDA | head --lines=-$MANTENENDA )
  fi

Poi Va bene, va bene, i percorsi sono codificati nello script e non in un file di configurazione. Ma accipuffa, in prima battuta l’avevo scritta in una riga!

mount $QNAP &&  tar --auto-compress --create --file $DESTINAZIONE $QUALITA/* &&  rm --verbose --force $( ls $DELENDA | head --lines=-$MANTENENDA )

Credo che per un po’ lo affiancherò a rdiff-backup

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.