Backup semplici e automatici di spazi ftp con python e wget

In questi giorni ho avuto il compito di creare un piccolo sistema di backup per una serie di siti web caricati su server senza servizio di backup e con il solo accesso ftp per i file. Naturalmente non potevo risolvere eseguendo la copia a mano di ogni singolo sito, è qualcosa che porta via molto tempo ed è noioso, quindi ho realizzato un piccolo script Python che si appoggia a wget per automatizzare il tutto.

Visto che parliamo di backup semplici, non sono coinvolti programmi per registrare le differenze ai file o cose simili. Mi limito solamente a creare una directory per ogni dominio e riversare il contenuto del sito in un file compresso opportunamente nominato secondo la data corrente. Ovviamente non è un approccio molto efficiente ma svolge bene il suo lavoro.

Giusto per non farmi mancare nulla, a fine processo, spedisco una mail con i log per essere informato riguardo eventuali errori.

Per fare il backup di eventuali database mi affido a una serie di script caricati sul server. Questi script se richiamati tramite un url particolare, eseguono il dump di tutto il database in una parte specifica dello spazio ftp non accessibile tramite browser.

Se per caso sorge la necessità di confrontare due backup, si procede alla decompressione dei dati e si passa all’analisi delle differenze con un programma come winmerge oppure meld.

Di seguito il codice dello script Python, solitamente wget è già installato su qualsiasi sistema gnu/linux, in caso contrario fate riferimento al gestore pacchetti della vostra distro.

#!/bin/python2
# -*- coding: utf-8 -*-

import os, datetime, tarfile, shutil
from smtplib import SMTP

# di seguito la gestione degli account, l'importante è popolare i primi 3 campi.
# Avete già capito come specificare i dati, non sto qui a spiegarvi come fare ;)

siti = [
# dominio, username, password, eventuale sottodirectory dello spazio ftp e url per il dump del db
    ["dominio1.com","user1","password1","public_html/","http://dominio1.com/dumpdb.php"],
    ["dominio2.com","user2","password2","",""],

    ]

dirbackup = "/home/infrid/backupsiti/"
oggi = datetime.datetime.now().strftime("%Y-%m-%d")
logfile = dirbackup+oggi+".log"

for dominio,user,password,subdir,pagina in siti:
    destinazione = dirbackup + dominio + "/" + oggi

    print "eseguo il backup di",dominio,"dentro",destinazione
    if not os.path.exists(destinazione):
        os.makedirs(destinazione)

    if pagina:
        print "visito la pagina",pagina
        os.system("wget %s -O %s/pagina.html" % (pagina,destinazione) )

    comando = "wget --mirror --no-verbose --no-follow-ftp --append-output=%s --user=%s --password=%s --directory-prefix=%s ftp://%s/%s" %(logfile, user,password,destinazione,dominio,subdir)
    print "esecuzione"
    print comando
    print
    os.system(comando)
    print "comprimo", destinazione,
    tar = tarfile.open(destinazione+".tar.bz2", "w:bz2")
    tar.add(destinazione)
    tar.close()
    print "e rimuovo la directory"
    shutil.rmtree(destinazione)

messaggio = """Subject: log del backup avvenuto il %s
\n\r
%s
""" % (oggi, open(logfile).read())

s = SMTP()
s.connect('mail.tuodominio.com')
s.login('mail_user','password')
s.sendmail("mittente@tuodominio.com", ["destinatario1@tuodominio.com","destinatario2@tuodominio.com"], messaggio)
s.quit()

Lo script come avete intuito è pensato su ambiente gnu/Linux, per usarlo su Windows ovviamente dovete installare python 2.x e scaricare wget. Successivamente dovete cambiare i percorsi alle seguenti righe:

dirbackup = "/home/infrid/backupsiti/"

# ...

os.system("wget %s -O %s/pagina.html" % (pagina,destinazione) )

che diventano diventano

dirbackup = "c:/backupsiti/"</pre>

# ...

os.system("c:/percorso/wget.exe %s -O %s/pagina.html" % (pagina,destinazione) )

Notate che non vengono usati backslash, ora salvate ed eseguite il file.

Lo script non pretende di essere esauriente e di venire in contro a tutte le esigenze di backup, non supporta copie incrementali e tanto meno la ripresa di un backup interrotto. Per qualsiasi dubbio o problema mandatemi una mail o scrivetemi su twitter.