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.

Diffida da chi utilizza il “blocco note” per programmare

Ricordo quando ero piccino e mi confrontavo con gente che ritenevo più esperta di me (gente che lavorava, non coetanei), a volte sentivo l’espressione uso il blocco note per programmare. Nel sentire quelle parole, avendo in mente le limitazioni del programma, pensavo “è un grande!” perché dopotutto riusciva a cavarsela con strumenti inzuficienti (cit).

Col tempo mi resi conto che no, non si poteva lavorare davvero con una cosa simile, è davvero troppo limitato quel programma. È quasi un insulto ai 35 anni di carriera di emacs e vi, senza parlare di tutte le soluzioni come eclipse e $tuo_editor_preferito.

Leggendo il codice al monitor devi avere qualche tipo di sintassi evidenziata. Devi perché è più facile orientarsi e gettare lo sguardo dove serve, con una lunga riga di testo nero magari perdi anche qualche diottria.

Lavorando con i codici sorgente hai inoltre bisogno di aprire più file contemporaneamente, cosa fai col blocco note? Ti riempi la taskbar di sessioni notepad.exe?

Come ti comporti se devi lavorare con file di grandi dimensioni? Apri Microsoft Word perché blocco note va in crash? Anche se riesci ad aprirlo, come navighi nel testo? Ricordiamo che parliamo di una schermata fitta senza sintassi evidenziata, dove se muovi la scrollbar di un pixel passi avanti di 30 schermate…

Con un editor vero hai delle scorciatoie da tastiera per muoverti avanti e indietro in modo granulare; per riga, parola o paragrafo. Se durante la navigazione trovi un carattere strano non fai altro che selezionare la codifica file corretta, non devi accontentarti.

Preferisco l’ingenuità del ragazzo che installa 4GB di visual studio per fare i compitini, e poi non sa dove mettere mano nei menu, piuttosto dello sborone che va in giro a millantare la sua pseudo-professionalità attraverso l’uso del blocco note.

Non spariamo cazzate, col blocco note non puoi fare nulla che non sia leggere un readme e modificare qualche file di configurazione. Magari alla fine della fiera non lo usi nemmeno il blocco note, è solo che vuoi stupire gli altri. Ma puoi fregare solo quello che è alle prime armi, il professionista ti manda a quel paese.

Diffidate da colui che dice e sopratutto si vanta di usare il blocco note, costui è un incompetente.

La mia sui libri di testo in ibooks

Non mi interesso dei prodotti Apple, ma devo dire la mia su ibooks e della possibilità di comprare anche libri di testo al prezzo massimo di 15$. A quella cifra non ti danno solo qualche versione del PDF del testo, l’idea è quello di arricchire il libro con animazioni, video e quiz interattivi. Questo unito al prezzo molto basso per un libro della categoria rende tutto molto appetibile in apparenza, ma vediamo i pro e i contro per uno studente medio.

Prima barriera: devi avere un ipad. Un ipad costa soldi, tanti soldi anche se di seconda mano. Solitamente per quella cifra uno studente prende un computer portatile più che decente, e non stiamo ad elencarne i vantaggi sopra un tablet.

Altre motivazioni che sembrano retorica di un articolo ebook vs pbook sono di carattere pratico; quando superi il corso oppure finisce il semestre (a seconda di cosa frequenti) del libro te ne fai poco. Puoi tenertelo in rari casi ma spesso cerchi di fare una cosa: rivenderlo per comprare altri libri.

Se il libro costa davvero tanto prendi la versione fotocopiata, riuscirai a cavartela con 15-20 euro. Non è raro piratare i libri nelle università; vai in copisteria ed effettui la tua ordinazione, è il segreto di pulcinella quindi non scandalizziamoci. Certi libri davvero costano uno sproposito, e dipende le tue finanze (o quelle dei tuoi genitori) è una spesa non indifferente.

Spesso non c’è un solo libro per materia, c’è bisogno di più testi da cui attingere: c’è l’eserciziario, quello dove studiare i teoremi e quel testo stronzo che non si trova mai in biblioteca. Non vuoi comprarlo perché c’è poco materiale che ti interessa e non vale la pena, vuoi solo averlo per fotocopiarti quei 2 capitoletti che sicuramente saranno sopra la soglia del 15% di tutto il testo.

In alternativa puoi studiare dagli appunti presi a lezione, non saranno eccezionali ma presto ti rendi conto che devi integrare con il libro. A volte è meglio evitare di prendere appunti, certi professori non sanno spiegare, si perdono nei loro discorsi oppure propinano test di esami che rendono le lezioni fine a se stessi. Potresti anche lavorare e non frequentare le lezioni, in questi casi i testi diventano fondamentali.

Sopra i libri ci passi molto tempo, i tuoi occhi sono sempre su quel teorema o su quella formula che non sai proprio da dove viene tirata fuori. Il display dell’ipad non mi sembra fatto per reggere lunghe sessioni di lettura, ti porta ad affaticarti gli occhi come qualsiasi altri schermo LCD/LED.

In oltre posso disporre della biblioteca, le dispense e tanto materiale che posso trovare su internet accedendo col portatile. Quindi che vantaggi mi porta studiare con l’ipad? Che valore aggiunto posso avere dalla piattaforma?

La mia risposta è nessuno. Non mi troverò bene a leggere per lunghe ore su quello schermo, non potrò inserire tra le pagine del libro i miei appunti. Forse i miei post-it e qualche altra cosa, ma non ha l’immediatezza di prendere un pezzo di carta e buttarlo dentro le pagine.

Sei vincolato con i dispositivi venduti da loro, con i loro formati e le loro decisioni commerciali di esclusività. Perché diciamolo: Apple non è una onlus (e nemmeno le case editrici), è una azienda nata per fare profitto come tutte le altre. Non è una nostra amica e non ha a cuore il nostro futuro, rido quando mi propongono lo sconto da studente per 10 euro su un macbook che ne costa 1000.

La piattaforma potrebbe essere uno specchietto per le allodole rivolto alle case editrici. Un po’ come l’uscita del primo ipad; sembrava il dispositivo definitivo alla crisi di giornali e riviste. Una piattaforma che fa da ponte tra il nuovo e il loro vecchio modello di business. Ma le cose sono andate diversamente, i problemi finanziari rimangono e l’ipad rimane una sorta di nicchia.

Io ho anche a che far con libri stampati decenni fa, realizzati con le macchine a caratteri mobili. Sono presenti addirittura i listati basic per disegnare i grafici al calcolatore elettronico, come farà a sopravvivere così a lungo un testo nell’ecosistema ibooks?

Se compro una copia stampata, questa rimane a me, posso tenerla nel mio scaffale per decenni e con qualche accorgimento si mantiene benissimo. Un ebook si mantiene anche meglio visto che non è soggetto a degrado, basta fare le copie ogni tanto, distribuirlo nella rete perché si mantenga.

Se per qualche motivo un testo non è più in vendita, una copia potrebbe essere in una biblioteca a disposizione di tutti. Se è un libro molto richiesto puoi trovarlo in copisteria, e praticamente hai risolto il problema della reperibilità.

Con ibooks non è detto che hai la stessa flessibilità, hai un file dentro un dispositivo chiuso dove l’utente finale non deve mettere mano. Pensando a lunghissimo termine, per ovviare all’obsolescenza tecnologia del tuo dispositivo devi comprare modelli nuovi. In questi modelli devi sperare che il software per l’ebook sia sempre supportato, che il tuo testo comprato 10 anni fa sia sempre disponibile sul tuo account pronto ad essere scaricato sui nuovi apparecchi.

L’alternativa è lasciare invecchiare i dispositivi, cercare ripararli quando si rompono ed essere sempre dipendenti, vincolati dalla tecnologia su cui il tuo ebook è nato. Invece utilizzando formati e sistemi aperti, non si è più vincolati dalla piattaforma del fornitore. Puoi cambiare formato e metterlo dove ti pare, masterizzarlo e archiviarlo. Potresti anche condividerlo su internet e farlo scaricare gratis, che in sostanza è la stessa cosa che andare a comprare il libro fotocopiato. In quel caso paghi la carta e il toner per la stampa, mentre per il download paghi la banda e il supporto su cui registri i file.

Fino a quando la pirateria e il mercato di seconda mano offriranno una alternativa migliore non c’è ragione di prendere un libro su itunes. In oltre la carta stampata offre più vantaggi che qualche centinaio di mb fruibile da una tavoletta che costa 400 euro.

Apparizioni mistiche

Con la crisi in atto la gente scende a compromessi, mette a tacere la propria coscienza per andare avanti, anche al costo di invitare me ai podcast e permettermi di scrivere qualche pezzo per il loro sito.

Ed ecco che ho partecipato per la prima volta ad un paio di podcast, quello di unseen64, e devi ammettere che nel primo episodio sono un po’ nervoso. Tratta di videogiochi scomparsi o quasi, di lavori dell’industria videoludica che per un motivo o per un altro sono andati perduti o pesantemente modificati. In questo podcast parliamo dell’evoluzione della saga di Perfect Dark, gioco a cui ho donato molte ore della mia vita. Trovate gli episodi 1.8 e 1.9 nella pagina dedicata sul sito.

Recentemente ho scritto un articolo per Italian Web Design per parlare dei software di controllo versione. Spiego a grandi linee i vantaggi che portano questi software, come fanno risparmiare tempo e del perché sono degli strumenti irrinunciabili. Eccovi uno spezzone:

Un software di controllo versione è un programma per tenere traccia dei cambiamenti che avvengono dentro un albero di sorgenti. Vi aiuta a monitorare lo stato dei file, modifica dopo modifica avendo così l’intera storia del vostro progetto. Ogni software di una certa dimensione utilizza un sistema di questo tipo, perché oltre ad avere la storia permette di sapere quali modifiche sono state effettuate, su quali file e l’autore delle stesse. Conoscere un software di controllo versione (da adesso in poi abbreviato scv) fa crescere professionalmente, è un importante elemento nella vostra metodologia di lavoro, se lavorate da soli avrete solo da guadagnarci e se siete in gruppo diventerà quasi indispensabile.

Non mi resta che augurarvi buon ascolto e buona lettura.

Appunti sullo scanrip

All’università circolano molte fotocopie tra libri e appunti, c’è molto materiale che viene fotocopiato diverse volte. Non è insolito avere a che fare con fotocopie poco leggibili, anche in grandi volumi, su cui bisogna spendere molte ore di studio.

Come se non bastasse, in facoltà abbiamo una copisteria privata che si occupa di raccogliere tutte le dispense dei professori per poi vendere le copie agli studenti. Invece di affidare a terzi questo volume di materiale, si potrebbe creare una sezione sul sito web dell’università dedicata al download di tale materiale. Invece sei costretto a mobilitarti, recarti in facoltà, prendere il turno per prenotare le fotocopie e attendere che le stampino. In realtà c’è una sorta di sezione download per i corsi, ma quasi nessun professore la utilizza, ma questa è un’altra storia.

Mi capita quando studio fuori casa di aver bisogno di alcune dispense che non sono con me, perché le dimentico a casa oppure le presto in giro. Per evitare di ritrovarmi in questa situazione ho cercato di scannerizzare le diepense, per poi portarle con me sulla penna usb. Ma i file che ottenevo erano esageratamente grandi, e la loro pesantezza rendeva goffa la consultazione con un lettore pdf.

Preso atto di questo mi sono rimboccato le maniche per sapere come fare delle buone scansioni, che occupassero poco spazio su disco e al tempo stesso conservando una ottima leggibilità. Riuscendo dove è possibile, a migliorare anche la resa visiva.

Il processo di scansione

Lo scanner che uso è quello di una stampante multiuso, ha la particolarità di avere il doc feeder, così non devo aprire il piano e rieseguire le scansioni. Il software in dotazione con lo scanner fa schifo, è la prima cosa che ho messo da parte. I motivi sono la velocità di scansione e l’alterazione dei colori.

Se siete su Windows vi consiglio di procurarvi vue scan, riesce a compiere un buon lavoro senza troppe pretese, per GNU/linux potete sempre rivolgervi a sane.

La risoluzione di scansione che ho impostata è dannatamente alta: 600dpi. Serve soprattutto per lavorare con i contorni dei caratteri, una media-bassa risoluzione rischierebbe di creare una marmellata di pixel.

Per velocizzare l’acquisizione seleziono una scansione in scala grigi, ma per qualche motivo il software si ostina a creare una immagine a colori molto sbiaditi. Questo poi lo correggerò nel filtraggio dell’immagine utilizzando ImageMagick, un ottimo prodotto a riga di comando che può lavorare su grandi quantità di file.

Visto che solitamente le fotocopie sono in bianco e nero, cercherò di filtrare le immagini per renderle tali risparmiando spazio su disco.

I difetti delle fotocopie

Ci sono principalmente due tipi di dispense fotocopiate, quelli scritte al computer e quelli redatti a mano. Ognuno ha un tipo di problemi da affrontare che si risolvono piuttosto semplicemente con lo stesso metodo.

Solitamente gli appunti si prendono su pagine a righe oppure a quadri, l’ideale sarebbe eliminarle e lasciare solo il testo che interessa a noi. Si risparmia inchiostro nella stampa e si ottengono immagini più pulite. Alcune persone usano anche l’evidenziatore e circondano il testo con riquadri colorati.

Fortunatamente abbiamo accesso agli originali per quanto riguarda gli appunti dei colleghi, e non abbiamo a che fare con brutte fotocopie della copisteria riciclate chissà quante volte. Spesso sono sporche e deformate perché durante la scansione non si tiene il foglio perfettamente fermo, e i rulli della fotocopiatrice imbrattano ulteriormente il foglio. Questo a lungo andare rende i caratteri sempre meno leggibili.

Trattamento

Il nostro obiettivo è ottenere immagini nitide in bianco e nero, il più possibile pulite. Per bianco e nero si intende immagini composte da due soli colori; appunto bianco e nero. La scala grigi non è contemplata, così facendo riduciamo enormemente lo spazio occupato sul disco.

Uso principalmente due parametri per ImageMagick, gaussian-blur e threshold. Il primo serve a sfocare l’immagine leggermente mentre il secondo serve per dare un taglio netto ai colori passando tutto in bianco e nero. Occasionalmente utilizzo anche il contrasto per rimuovere le righe dagli appunti. Per esempio con questo comando otteniamo:

convert -colorspace gray +contrast +contrast prima.tif dopo.tif
/images/scanrip1.png

Ora dobbiamo rendere tutto in bianco e nero, se utilizziamo direttamente la soglia i contorni dei caratteri risulteranno troppo seghettati e non regolari. Possiamo in un certo senso ammorbidire l’immagine con la sfocatura gaussiana e poi filtrare il tutto con la soglia, in questo modo grazie all’alta risoluzione rendiamo morbidi i contorni che risulteranno più regolari.

convert -gaussian-blu 3.0 threshold 90% prima.tif dopo.tif

Di seguito potete vedere l’immagine a sinistra senza l’opzione –gaussian-blur, mentre a destra quella con l’opzione abilitata.

/images/scanrip2.png

In realtà possiamo eliminare le righe semplicemente ignorandole, la sfocatura e la soglia elimineranno anche quelle dall’immagine.

Il colore dell’evidenziatore e i riquadri colorati vanno trattati allo stesso modo, basta saper giocare con i giusti valori. Eccezionalmente possiamo trattare le singole immagini con un editor come the gimp se il lavoro è poco.

Questo è un esempio di testo dentro un riquadro e dei vari tentativi che si possono fare per rendere chiara e pulita l’immagine.

/images/scanrip3.png

Le macchie minori e il colore dominante vanno via, perché rese “deboli” dalla sfumatura e poi scartate dalla soglia. Quello che otteniamo è una buona copia delle nostre fotocopie, ottenete delle immagini perfettamente bianco e nero e nella stampa non verrà sprecato inchiostro.

Automatizzare il tutto

Ora che abbiamo trovato la nostra combinazione di opzioni andiamo ad automatizzare il tutto, possiamo anche utilizzare solo ImageMagick dal terminale per processare le pagine dei nostri appunti, oppure usare un piccolo script per fare anche alcune operazioni di conversione finale in DJVU.

Il formato DJVU potrebbe essere inteso come il PDF degli scanrip. Mentre il PDF per conservare le pagine non fa altro che memorizzare una immagine in formato PNG o jpg/jpg2000 a prescindere del contenuto, il formato DJVU scompone la pagina e impiega particolari algoritmi che separano le figure dal testo. Quest’ultimo viene anch’esso scomposto in immagini più piccole, in piccole unità (solitamente i caratteri) che andranno ad essere riutilizzati per tutto il foglio. Questa tecnica permette di avere una pagina pressoché identica all’immagine filtrata ma infinitamente più piccola, siamo nell’ordine di qualche KB. Possiamo avere tutte le nostre dispense su disco in qualche MB!

Ho scritto un piccolo programma in python che prende l’immagine originale, la filtra e la converte in DJVU tutto tramite ImageMagick e la suite djvulibre. Alla fine del processo ho un unico DJVU pronto da mettere su penna usb. Si assume che le immagini abbiamo un nome sequenziale, qualcosa del tipo scan01.tif, scan02.tif e così via e che siano raccolte in due gruppi, latoA e latoB.

import os

somma=" "
npagine = 100

for x in range(npagine):
        a = 'latoA%03d' % x
        os.system('convert -colorspace gray -gaussian-blur 3.0 -threshold 90% originali/%s.tif filtrati/%s.tif' %(a,a))
        os.system('cjb2 -dpi 600 -verbose -lossy filtrati/%s.tif %s.djvu' % (a,a))
        a = a+'.djvu '

        b = 'latoB%03d' % x
        os.system('convert -colorspace gray -gaussian-blur 3.0 -threshold 90% originali/%s.tif filtrati/%s.tif' %(b,b))
        os.system('cjb2 -dpi 600 -verbose -lossy filtrati/%s.tif %s.djvu' % (b,b))
        b = b+'.djvu '

        somma = somma + a + b

os.system('djvm -c scansione.djvu ' + somma)

Come si vede dallo script eseguo prima il filtraggio, dopo converto in DJVU e copio il nome dentro una variabile. A fine ciclo eseguo DJVM che crea il mio file finale. Può sembrare macchinoso all’inizio, ma il procedimento regala ottimi risultati.