Fare il backup dei propri dati è una questione fondamentale. Ancora più fondamentale diventa se si tratta di dati di colleghi d’ufficio, conservati ed utilizzati da diversi anni. Avere l’accortezza di prevedere un sistema di backup su in un posto sicuro è importantissimo. A queste esigenze vengono in contro sistemi come supporti ottici, hardisk esterni, chiavette usb, o meglio ancora NAS o altri storage di rete. Spesso però non si dispongono di questi dispositivi, ed allora bisogna inventarsi un sistema che possa garantire un minimo di garanzia, il cosiddetto fault tolerance. Salvare i dati in un’altra directory o in un’altra partizione non ci leva dai guai, a volte può non essere sufficiente neanche spostare periodicamente i dati su di un altro hardisk interno, dato che un fattore elettrico o un trauma fisico può comunque danneggiare tutti i dischi presenti all’interno del computer. Per questo motivo può essere più sicuro (ma non privo da rischi) il backup ad anello su di altri computer della stessa rete Lan.
Il principio sul quale si basa questo sistema è quello di immaginare gruppi di computer appartenenti alla stessa rete, che possono andare da 2 ad n, disposti virtualmente a cerchio e collegati tra di loro come a formare un anello.


La copia dei dati viene fatta seguendo sempre lo stesso senso lungo l’anello, ogni computer copia i propri dati sul computer successivo, e così via fino a fare il giro completo. La copia dei dati può essere suddivisa in 2 fasi:

  1. Compressione dei dati da copiare
  2. Invio dei file compressi al computer successivo.

Per la compressione possiamo affidarci a svariati tool, meglio se funzionano da riga di comando. Il mio preferito è 7-zip, che funziona egregiamente da linea di comando (i codici batch di esempio faranno riferimento esclusivamente a questo programma). Dopo aver scaricato su tutti i computer il programma di compressione preferito, è necessario predisporre una cartella di backup da condividere con gli altri computer dell’anello, facendo attenzione di concedere i permessi di scrittura al computer che precede il computer corrente. Tenete ben a mente che con questo sistema non è possibile salvare tutto l’hardisk, esula dal suo scopo, piuttosto è mirato a salvare solo parti dell’hardisk, come per esempio la cartella della posta elettronica, il desktop, i documenti, o altre directory di fondamentale importanza per l’utente.

[adrotate banner=”2″]

Chiariti questi concetti passiamo ora a considerare i vari batch che entrano in gioco in questo meccanismo.

Il primo è il batch di compressione:

[cc lang=”text”]:BEGIN_COMP
@ECHO off
COLOR 3F
SET RBCOMPVERS=1.6.5
SET LOGFILE=C:\batch\backup.log
ECHO {INIZIO BACKUP} > %LOGFILE%

:CHECK_SEMAFORO
:: Il semaforo 001 controlla l’esecuzione della compressione
IF EXIST 001.SEM GOTO END_COMP

TITLE COMPRESSIONE DATI
CLS
ECHO Batch RingBackup_Compressione v%RBCOMPVERS%
ECHO Batch RingBackup_Compressione v%RBCOMPVERS% >> %LOGFILE%
ECHO. >> %LOGFILE%
ECHO.
ECHO ================================
ECHO === COMPRESSIONE DATI ===
ECHO ================================

:LOG_START_COMP
ECHO [%time:~0,5%] Inizio Compressione Dati >> %LOGFILE%
SET TODAY=%date:~-2%%date:~3,2%%date:~0,2%
:: Formato yymmdd

SET GIORNO=%date:~0,2%
SET MESE=%date:~3,2%
SET ANNO=%date:~-2%

::Prima di cancellare i vecchi backup provo a fare una nuova compressione se riesce vado avanti sennò salto alla fine
:COMP_POSTA
7z a -r c:\batch\posta_%TODAY%.zip “%POSTAPATH%”
IF NOT EXIST c:\batch\posta_%TODAY%.zip ECHO [%time:~0,5%] ERROR: File posta_%TODAY%.zip non generato >> %LOGFILE%

:COMP_PERSONAL
IF EXIST rb_comp_pers.bat CALL rb_comp_pers.bat

IF %GIORNO% LSS 07 GOTO CALCOLO_MESE_PREC
SET /A GIORNO=%GIORNO%-7
GOTO REMOVE_OLD_BACKUP

:CALCOLO_MESE_PREC
SET /A MESE=%MESE%-1
IF %MESE% LSS 10 SET MESE=0%MESE%
IF %MESE% == 01 SET /A GIORNO=31-(7-%GIORNO%)
IF %MESE% == 02 SET /A GIORNO=28-(7-%GIORNO%)
IF %MESE% == 03 SET /A GIORNO=31-(7-%GIORNO%)
IF %MESE% == 04 SET /A GIORNO=30-(7-%GIORNO%)
IF %MESE% == 05 SET /A GIORNO=31-(7-%GIORNO%)
IF %MESE% == 06 SET /A GIORNO=30-(7-%GIORNO%)
IF %MESE% == 07 SET /A GIORNO=31-(7-%GIORNO%)
IF %MESE% == 08 SET /A GIORNO=31-(7-%GIORNO%)
IF %MESE% == 09 SET /A GIORNO=30-(7-%GIORNO%)
IF %MESE% == 10 SET /A GIORNO=31-(7-%GIORNO%)
IF %MESE% == 11 SET /A GIORNO=30-(7-%GIORNO%)
IF %MESE% == 00 SET /A GIORNO=31-(7-%GIORNO%)
IF %MESE% == 00 SET MESE=12
IF %MESE% == 12 SET /A ANNO=%ANNO%-1

:REMOVE_OLD_BACKUP
IF %GIORNO% GEQ 10 FOR /L %%v IN (10,1,%GIORNO%) DO DEL *_%ANNO%%MESE%%%v.zip 2>NUL
IF %GIORNO% GEQ 10 FOR /L %%v IN (1,1,9) DO DEL *_%ANNO%%MESE%0%%v.zip 2>NUL
IF %GIORNO% LEQ 9 FOR /L %%v IN (1,1,%GIORNO%) DO DEL *_%ANNO%%MESE%0%%v.zip 2>NUL

:LOG_END_COMP
ECHO [%time:~0,5%] Fine Compressione Dati >> %LOGFILE%:COMP_TEST

ECHO Scrittura risultato test archivi. Attendere…
ECHO. >> %LOGFILE%
ECHO [%time:~0,5%] Controllo Archivi: >> %LOGFILE%
7z t *%TODAY%.zip > c:\batch\7z_test.log
findstr /I /C:”Archives:” 7z_test.log >> %LOGFILE%
findstr /I /C:”Archive Errors:” 7z_test.log >> %LOGFILE%
ECHO. >> %LOGFILE%

:SHOW_FILES
ECHO [%time:~0,5%] File archivio presenti: >> %LOGFILE%
dir *.zip /B /O >> %LOGFILE%
ECHO. >> %LOGFILE%

:END_COMP
ECHO.
ECHO ================================
ECHO === FINE COMPRESSIONE DATI ===
ECHO ================================[/cc]

Non sto a spiegare tutti i comandi utilizzati all’interno del batch (vi rimando alla lettura della libreria TechNet di Microsoft), ma andiamo ad esaminare quelli che lo particolarizzano per i nostri fini.

La prima cosa da notare è l’impostazione di due variabili (righe 4 e 5). La prima determina la versione del batch correntemente utilizzata, la seconda specifica quale sia il file da utilizzare per memorizzare le informazioni di log.

Successivamente troviamo la verifica del semaforo 001.SEM (riga 10), che in caso della sua presenza blocca il batch evitando la compressione dei dati e quindi l’immediata uscita (vedremo più avanti come gestire tali semafori).

Le righe 31-34 eseguono la compressione della cartella del client di posta. Da notare che in questo caso non ho utilizzato settare una variabile direttamente sul file batch, ma sono andato ad impostarla direttamente tra le variabili di ambiente. Proprio per mantenere il file batch indipendente dal tipo di client di posta utilizzato.

Subito sotto troviamo il richiamo ad un altro batch esterno, che effettua la compressione delle cartelle personali dell’utente, operazioni queste a parte dato che generalmente non sono uguali per tutti gli altri. Quindi se esiste il file viene effettuata la compressione anche di questi percorsi, altrimenti andrà avanti.

In seguito viene preparato il terreno per la cancellazione dei vecchi archivi compressi localmente e mai trasferiti al nodo successivo per qualche problema. Viene fatto il controllo se il giorno corrente è inferiore a 7 (diciamo che ho pensato ad una conservazione dei singoli archivi fino ad un max di 7 giorni), se il giorno corrente è compreso tra 1 e 6, si effettua anche il calcolo del giorno precedente, altrimenti si procede direttamente (ndr. jump) alla cancellazione dei vecchi backup.

Viene poi fatto anche un test (opzionale) degli archivi appena creati e l’output del test scritto sul file di log. E con quest’ultimo passaggio si conclude la fase di compressione degli archivi.

Il secondo batch è il trasferimento degli archivi:

[cc lang=”text”]@ECHO off
COLOR 3F
SET RBCOPYVERS=1.4.5
SET LOGFILE=C:\batch\backup.log

:BEGIN_COPY

:CHECK_SEMAFORO
:: Il semaforo 002 controlla l’esecuzione della copia
IF EXIST 002.SEM GOTO END_COPY

TITLE COPIA DATI
CLS
ECHO Batch RingBackup_Copia v%RBCOPYVERS%
ECHO Batch RingBackup_Copia v%RBCOPYVERS% >> %LOGFILE%
ECHO. >> %LOGFILE%
ECHO.
ECHO =========================
ECHO === INIZIO COPIA DATI ===
ECHO =========================
ECHO.
ECHO Attendere prego…

ECHO [%time:~0,5%] Inizio Copia Dati >> %LOGFILE%
SET DATA=%date% %time:~0,5%
ECHO %DATA% >> %LOGFILE%
SET TODAY=%date:~-2%%date:~3,2%%date:~0,2%
:: Formato yymmdd

SET GIORNO=%date:~0,2%
SET MESE=%date:~3,2%
SET ANNO=%date:~-2%

:COPY_MAIL
ECHO.
IF NOT EXIST c:\batch\posta_%TODAY%.zip GOTO NO_COPY_MAIL
ECHO Copia file posta_%TODAY%.zip in corso…
MOVE /Y c:\batch\posta_%TODAY%.zip %DESTBACKUP%
GOTO COPY_PERS

:NO_COPY_MAIL
ECHO [%time:~0,5%] ERROR: File posta_%TODAY%.zip non trovato >> %LOGFILE%

:COPY_PERS
IF EXIST rb_copy_pers.bat CALL rb_copy_pers.bat

IF %GIORNO% LSS 07 GOTO CALCOLO_MESE_PREC
SET /A GIORNO=%GIORNO%-7
GOTO REMOVE_OLD_BACKUP

:CALCOLO_MESE_PREC
SET /A MESE=%MESE%-1
IF %MESE% LSS 10 SET MESE=0%MESE%
IF %MESE% == 01 SET /A GIORNO=31-(7-%GIORNO%)
IF %MESE% == 02 SET /A GIORNO=28-(7-%GIORNO%)
IF %MESE% == 03 SET /A GIORNO=31-(7-%GIORNO%)
IF %MESE% == 04 SET /A GIORNO=30-(7-%GIORNO%)
IF %MESE% == 05 SET /A GIORNO=31-(7-%GIORNO%)
IF %MESE% == 06 SET /A GIORNO=30-(7-%GIORNO%)
IF %MESE% == 07 SET /A GIORNO=31-(7-%GIORNO%)
IF %MESE% == 08 SET /A GIORNO=31-(7-%GIORNO%)
IF %MESE% == 09 SET /A GIORNO=30-(7-%GIORNO%)
IF %MESE% == 10 SET /A GIORNO=31-(7-%GIORNO%)
IF %MESE% == 11 SET /A GIORNO=30-(7-%GIORNO%)
IF %MESE% == 00 SET /A GIORNO=31-(7-%GIORNO%)
IF %MESE% == 00 SET MESE=12
IF %MESE% == 12 SET /A ANNO=%ANNO%-1

:REMOVE_OLD_BACKUP
REM echo %GIORNO%
IF %GIORNO% GEQ 10 FOR /L %%v IN (10,1,%GIORNO%) DO DEL %DESTBACKUP%\*_%ANNO%%MESE%%%v.zip 2>NUL
IF %GIORNO% GEQ 10 FOR /L %%v IN (1,1,9) DO DEL %DESTBACKUP%\*_%ANNO%%MESE%0%%v.zip 2>NUL
IF %GIORNO% LEQ 9 FOR /L %%v IN (1,1,%GIORNO%) DO DEL %DESTBACKUP%\*_%ANNO%%MESE%0%%v.zip 2>NUL

:LOG_END_COPY
ECHO. >> %LOGFILE%
ECHO [%time:~0,5%] Fine Copia Dati >> %LOGFILE%
ECHO.
ECHO =======================
ECHO === FINE COPIA DATI ===
ECHO =======================
ECHO.

:END_COPY
ECHO {FINE BACKUP} >> %LOGFILE%
[/cc]

Anche questo batch inizia con il controllo di un semaforo, il nome stavolta è 002.SEM. Differenziati appositamente per gestire indipendentemente le fasi di compressione e di copia degli archivi.

Poco dopo abbiamo l’istruzione move /Y che effettua lo spostamento del file della posta, senza richiesta di conferma, verso la directory di destinazione, che in questo caso è remota. Noterete che anche in questo caso si tratta di una variabile d’ambiente non settata all’interno del file, ma direttamente tra le variabili dal sistema operativo, per lo stesso motivo per il quale abbiamo impostato il path dei file di posta.

Viene fatto il controllo se vi sono altri archivi personalizzati da passare, e successivamente vengono cancellati gli archivi obsoleti presenti sul computer remoto. La selezione di questi archivi avviene allo stesso modo di quello utilizzato in fase di compressione.

Il terzo batch controlla i batch sui computer dei vari anelli:

[cc lang=”text”]:BEGIN
@ECHO OFF
COLOR 3F
CLS
ECHO *******************************************************************************
ECHO * Questo batch blocca o fa ripartire l’esecuzione dei vari batch sui vari *
ECHO * ring-client. *
ECHO *******************************************************************************
ECHO.

ECHO.
ECHO.
ECHO 1) Blocca Compressione
ECHO 2) Blocca Copia
ECHO.
ECHO 5) Sblocca Compressione
ECHO 6) Sblocca Copia
ECHO.
ECHO Q) QUIT
ECHO.
ECHO.
choice /N /C:1256Q

IF %ERRORLEVEL% == 1 goto BLOCCA_COMPRESSIONE
IF %ERRORLEVEL% == 2 goto BLOCCA_COPIA
IF %ERRORLEVEL% == 3 goto SBLOCCA_COMPRESSIONE
IF %ERRORLEVEL% == 4 goto SBLOCCA_COPIA
IF %ERRORLEVEL% == 5 goto END
goto END

:BLOCCA_COMPRESSIONE
ECHO “” > \\indirizzoip-pc1\batch\001.SEM
ECHO “” > \\indirizzoip-pc2\batch\001.SEM
ECHO “” > c:\batch\001.SEM
ECHO Blocco ccompressione su tutti i clients effettuato.
GOTO END

:SBLOCCA_COMPRESSIONE
DEL \\indirizzoip-pc1\batch\001.SEM 2>nul
DEL \\indirizzoip-pc2\batch\001.SEM 2>nul
DEL c:\batch\001.SEM 2>nul
ECHO Sblocco compressione su tutti i clients effettuato.
GOTO END

:BLOCCA_COPIA
ECHO “” > \\indirizzoip-pc1\batch\002.SEM
ECHO “” > \\indirizzoip-pc2\batch\002.SEM
ECHO “” > c:\batch\002.SEM
ECHO Blocco copia su tutti i clients effettuato.
GOTO END

:SBLOCCA_COPIA
DEL \\indirizzoip-pc1\batch\002.SEM 2>nul
DEL \\indirizzoip-pc2\batch\002.SEM 2>nul
DEL c:\batch\002.SEM 2>nul
ECHO Sblocco copia su tutti i clients effettuato.
GOTO END

:END
ECHO.
ECHO.
PAUSE
IF NOT %ERRORLEVEL% == 5 goto BEGIN[/cc]

Questo batch viene utilizzato per attivare/disattivare la copia sui vari client (chiamati ring-client). Fa uso del programma choice.com utilizzato per eseguire un basilare menu interattivo. Choice.com è un programma introdotto con Ms-Dos e non presente nelle versioni di Windows XP. Quindi per usare quest’ultimo strumento, si rende necessario scaricarlo da internet o, per i più temerari, copiarlo da un sistema dotato di Ms-Dos (se ne trovate ancora qualcuno in giro). Una volta ottenuto il programma, va inserito in una directory inclusa nella vostra variabile di ambiente PATH, come system32 per esempio.

[adrotate banner=”1″]