[Altro] Script di backup con supporto ad FTP e MEGA

Ciao a tutti.
Per motivi miei ho avuto la necessità di creare uno script che esegua in automatico il backup di directory prestabilite, ed essendo venuto bene lo pubblico anche qui.

Lo script è scritto in Python 3 ed è disponibile nel mio profilo Gist.
Supporta la creazione di backup di directory differenti in archivi differenti con un unica chiamata allo script, e può salvare o nel filesystem locale o in un server remoto tramite il protocollo FTP.
Dispone anche del supporto per l'upload diretto sul proprio profilo MEGA.
Inoltre dispone di una funzionalità di rotazione dei backup integrata, in modo da mantenere salvati solo gli ultimi backup, eliminando quelli vecchi. La rotazione è eseguita prima di effettuare i backup, e funziona anche su MEGA e con il protocollo FTP senza eseguire script sul server di backup.
Il backup viene salvato compresso come .tar.gz (sia perché è meglio sia perché lo zip può dare problemi con archivi superiori ai 4GB).

Installazione delle dipendenze
Lo script funziona senza il supporto a MEGA su Python 2.7, 3.2, 3.3 e 3.4.

Per installarlo su Debian/Ubuntu basta usare apt-get:
Codice:
sudo apt-get install python

Per avere il supporto a Python 2.6 (presente su CentOS 6) è necessario installare il python package argparse, tramite pip (seguire questa guida per installare pip):
Codice:
sudo pip install argparse

Invece per avere il supporto a MEGA è necessario utilizzare Python 2.6 o 2.7 (non 3.x) ed installare il python package mega.py, tramite pip (seguire questa guida per installare pip):
Codice:
sudo pip install mega.py


Download dello script
Per prima cosa posizionatevi nella cartella in cui volete far risiedere lo script (sarebbe buona cosa creare una cartella scripts da qualche parte che contiene tutti quelli che usate).
Poi scaricate lo script con wget:
Codice:
wget https://gist.githubusercontent.com/pietroalbini/43ffebf9a8dfbe3e6f94/raw/31aa9994fd2902ebd23a8aa45bedc209d0e4c124/backup.py


Utilizzo dello script
Lo script è strutturato per essere usato da linea di comando passandogli parametri.

Per richiamare lo script posizionarsi nella cartella contenente lo script ed eseguire il seguente comando:
Codice:
python backup.py [parametri]
A [parametri] è necessario sostituire i parametri che si vogliono fornire con lo script.

Parametri disponibili:
-d <directory> <name> Una directory su cui effettuare il backup ed il nome del backup stesso. Può essere usato più volte.
-t <destinazione> La directory in cui salvare il file. Deve esistere e non deve essere assoluta in caso di invio tramite MEGA o FTP. Il valore predefinito è la directory corrente.
-p {local|ftp|mega} Il metodo di salvataggio, può essere local (valore di default) per il filesystem locale, ftp per un server FTP remoto e mega per MEGA (può non essere disponibile se il python package mega.py non è installato).
-k <numero> Numero di backup da mantenere durante la rotazione. Se non fornito la rotazione non avverrà.
--ftp-host <host>, --ftp-user <username>, --ftp-password <password> ed --ftp-port <port> servono per configurare i dati di accesso al server FTP. Bisogna fornirli solo se il metodo di salvataggio è ftp.
--mega-email <email> e --mega-password <password> contengono i dati di accesso all'account MEGA. Bisogna fornirli solo se il metodo di salvataggio è mega.

Esempi di comandi validi:
Codice:
# Fare il backup in locale della directory my_server, chiamando il backup server,
# mantenendo 4 vecchi backup e salvandoli nella directory backups/:
python backup.py -d my_server server -k 4 -t backups

# Fare il backup in locale contemporaneamente delle directory server_1 (chiamando il backup first)
# e server_2 (chiamando il backup second), senza cancellare i vecchi backup e salvandoli nella
# directory corrente
python backup.py -d server_1 first -d server_2 second

# Fare un backup della directory my_server (chiamando il backup server) caricando il risultato su un
# server tramite ftp (host: my.ftp.it, user: me, password: fammientrare, porta: 21), senza rotazione
# dei vecchi backup e salvandoli nella directory corrente
python backup.py -d my_server server -p ftp --ftp-host my.ftp.it --ftp-user me \
--ftp-password fammientrare --ftp-port 21

# Fare un backup della directory my_server (chiamando il backup server) caricando il risultato sul
# proprio account MEGA (email steve@mojang.com, password: herobrine), salvando i backup nella directory
# my/backups e mantenendo 10 vecchie copie dei backup
python backup.py -d my_server server -p mega --mega-email "steve@mojang.com" \
--mega-password herobrine -t my/backups -k 10


Eseguire lo script automaticamente con cron
Per eseguire automaticamente lo script con cron bisogna per prima cosa vedere dove è locato l'eseguibile di Python:
Codice:
which python
Copiarsi il risultato del comando.

Poi bisogna modificare il file di cron, con il comando:
Codice:
crontab -e

Lì aggiungere la seguente linea:
Codice:
0 4 * * * /usr/bin/python /percorso/allo/script/backup.py [parametri] >/dev/null 2>&1
Sostituire /usr/bin/python con l'output del comando sopra, /percorso/allo/script/backup.py con il percorso allo script e [parametri] con i parametri scelti (vedi sopra). Usare sempre e solo percorsi assoluti.
Questa riga esegue lo script alle quattro di mattina, per cambiare ora sostituire quel 4 nello script, ma se volete un cron più avanzato e non si conosce la sintassi consiglio di usare questo sito.

Festeggiare
Ed ora dovrebbe funzionare tutto!

FAQ

Funziona con Windows?
Boh, non ne ho la più pallida idea. Non dovrebbero esserci incompatibiltà, ma non posso e non ho voglia di provarlo.

Funziona con Mac?
Al 99% si (è sempre unix), ma non posso e non ho voglia di provarlo.

Perché mi restituisce tante scritte incomprensibili?
È un errore, postalo qui sul forum che lo sistemo.


Lo script è rilasciato sotto licenza GNU/GPL v3, ed è stato realizzato interamente da me (Pietro Albini).
Script aggiornato il 2/09/2014. (Modificato 30/04/2015, 22:13 da pietro98th.)
5 utenti apprezzano questo post
09/07/2014, 10:27pietro98th ha scritto: Ciao a tutti.
Per motivi miei ho avuto la necessità di creare uno script che esegua in automatico il backup di directory prestabilite, ed essendo venuto bene lo pubblico anche qui.

Lo script è scritto in Python 3 ed è disponibile nel mio profilo Gist.
Supporta la creazione di backup di directory differenti in archivi differenti con un unica chiamata allo script, e può salvare o nel filesystem locale o in un server remoto tramite il protocollo FTP.
Inoltre dispone di una funzionalità di rotazione dei backup integrata, in modo da mantenere salvati solo gli ultimi backup, eliminando quelli vecchi. La rotazione è eseguita prima di effettuare i backup, e funziona anche con il protocollo FTP senza eseguire script sul server di backup.
Il backup viene salvato compresso come .tar.gz (sia perché è meglio sia perché lo zip può dare problemi con archivi superiori ai 4GB).

Installazione delle dipendenze
Lo script necessita esclusivamente di Python 3.2 (o maggiore) installato.

Per installarlo su Debian/Ubuntu basta usare apt-get:
Codice:
sudo apt-get install python3

Su CentOS invece è necessario compilarlo dai sorgenti, in quanto non è presente nei repository.
Potete seguire questa guida per installarlo (ricordatevi di installare il 3.3.3, non il 2.7.6!).
Comunque non vi spaventate, l'installazione dai sorgenti non è complicata!

Download e configurazione dello script
Per prima cosa posizionatevi nella cartella in cui volete far risiedere lo script (sarebbe buona cosa creare una cartella scripts da qualche parte che contiene tutti quelli che usate).
Poi scaricate lo script con wget:
Codice:
wget https://gist.githubusercontent.com/pietroalbini/a90982f7ff5b0a3d29fc/raw/8261def9533813731e70bd69c2757ba24e7dfb68/backup.py

Ora aprite lo script con il vostro editor preferito (per esempio nano): dopo la licenza sono disponibili le variabili di configurazione.
Modificatele secondo le vostre esigenze.
SAVE_IN indica la directory in cui i backup andranno salvati; è fortemente consigliato (ma non obbligatorio) utilizzare percorsi assoluti.
KEEP_OLD_BACKUPS indica quanti backup tenere durante la rotazione
USE_FTP indica se usare il protocollo FTP per salvare i backup; Può essere True in caso affermativo (ftp) o False in caso negativo (filesystem locale).
FTP_* indicano i parametri di connessione al server FTP; se USE_FTP è impostato su False si possono mettere valori casuali.

Per decidere su quali directory effettuare il backup ed il nome del backup aggiungere sotto DIRECTORIES = dict() questa linea per ogni directory:
Codice:
DIRECTORIES['nome_del_backup'] = '/percorso/della/directory'
Sostituire nome_del_backup con il nome del backup e /percorso/della/directory con il percorso assoluto della directory di cui effettuare il backup.

Verificare che tutto funzioni
Per verificare che tutto funzioni posizionarsi nella cartella contenente lo script ed eseguire il seguente comando:
Codice:
python3 backup.py
Se tutto va bene dovreste vedere nella destinazione specificata nella configurazione i file .tar.gz contenenti i backup.

Eseguire lo script automaticamente con cron
Per eseguire automaticamente lo script con cron bisogna per prima cosa vedere dove è locato l'eseguibile di Python:
Codice:
which python3
Copiarsi il risultato del comando.

Poi bisogna modificare il file di cron, con il comando:
Codice:
crontab -e

Lì aggiungere la seguente linea:
Codice:
0 4 * * * /usr/bin/python3 /percorso/allo/script/backup.py >/dev/null 2>&1
Sostituire /usr/bin/python3 con l'output del comando sopra e /percorso/allo/script/backup.py con il percorso allo script. Usare sempre e solo percorsi assoluti.
Questa riga esegue lo script alle quattro di mattina, per cambiare ora sostituire quel 4 nello script, ma se volete un cron più avanzato e non si conosce la sintassi consiglio di usare questo sito.

Festeggiare
Ed ora dovrebbe funzionare tutto!

FAQ

Funziona con Windows?
Boh, non ne ho la più pallida idea. Non dovrebbero esserci incompatibiltà, ma non posso e non ho voglia di provarlo.

Funziona con Mac?
Al 99% si (è sempre unix), ma non posso e non ho voglia di provarlo.

Perché mi restituisce tante scritte incomprensibili?
È un errore, postalo qui sul forum che lo sistemo.


Lo script è rilasciato sotto licenza GNU/GPL v3, ed è stato realizzato interamente da me (Pietro Albini).
I miei complimenti, è un ottimo script, utilissimo per chi amministra un server Wink
Codice:
#ifndef Risveglio_h
#define Risveglio_h

class Risveglio
{
 public:
   Risveglio();

   void GiudizioRisveglio(unsigned int oreRiposo = 1, unsigned int nEpisodi = 0, unsigned int nMadonneTirate = 10);

 private:
    unsigned int _oreRiposo;
    unsigned int _nEpisodi;
    unsigned int _nMadonneTirate;

#endif
Dì la verità, aspettavi solo che gamehosting perdesse i dati di una macchina xD

Comunque molto utile Wink
My Config:
    MotherBoard: GigaByte 990 FX A-UD3 Ultra Durable
    CPU: AMD FX-8350 (8 core, 4.00GHz)
    Dissipatore: ThermalRight Macho HR-02 Rev.a
    RAM: Corsair Vengeance 8GB 4GBx2
    GPU: nVidia GTX 780 Asus OC
    PSU: Corsair CX 750M
    Case: Cooler Master 690 III Midi
    SSD 256GB
    HHD 1TB
    Masterizzatore
09/07/2014, 11:12xXSkiFire13Xx ha scritto: Dì la verità, aspettavi solo che gamehosting perdesse i dati di una macchina xD

Comunque molto utile Wink
Ovvio!
Scherzo, questo script è l'ampliamento di un'altro che avevo creato un mese fa per il mio server, quello precedente supportava solo i salvataggi in locale ed era scritto alla bene e meglio.
Ieri sera mi ero ricordato che SoYouStart ti da un server di backup da 100GB, quindi ho provveduto ad aggiungere il supporto all'ftp e ho riscritto 4/5 del codice.
E visto che non era venuto male l'ho pubblicato.
Ottimo! Ma visto che 99% dei server sono unix per una maggior compatibilità (e meno roba da installare) l'avrei fatto in sh/bash o al massimo perl che c'è su tutti gli unix Smile
Ho aggiornato lo script con il supporto a MEGA!
Ho però anche cambiato il modo in cui lo script viene eseguito, quindi se già lo usate ri-configuratelo da capo.
Discussioni simili
Risposta di ReNext
09/09/2018, 20:48
Risposta di jefuhr
03/09/2018, 21:38
Risposta di Alcatraz34
15/08/2018, 12:15

Utente(i) che stanno guardando questa discussione: 1 Ospite(i)