Bloccare la pubblicita’ senza plug-in

Linux Ad Block

Linux Ad Block

 

Negli ultimi anni i banner pubblicitari presenti nelle pagine di molti siti si sono trasformati in un mostro incontrollato e soprattutto molto invasivo e, a causa dell’abuso da parte di alcuni, sono finiti per diventare la bestia nera di Internet, inducendo numerosi utenti a trovare un modo per bloccarli con i metodi più disparati.

 

Tra questi figurano ad esempio due note estensioni per browser, ad esempio su Chrome tra i piu’ conosciuti possiamo trovare AdBlock e AdBlock Plus, che svolgono egregiamente il proprio lavoro modificando al volo il foglio di stile delle pagine web impedendone la visualizzazione. D’altra parte questo vantaggio ha un peso materiale: entrambe le estensioni finiscono per appesantire notevolmente il browser, il che potrebbe essere uno svantaggio per molti.

In questo breve articolo verra’ illustrato un metodo efficace per bloccare la visualizzazione dei banner pubblicitari dei più noti circuiti pubblicitari, usando una versione modificata del file /etc/hosts

 

Bloccare la pubblicità senza AdBlock 

Il criterio che utilizzeremo è di per se molto semplice, infatti il file /etc/hosts permette di associare manualmente host ad indirizzi IP senza affidarsi alla risoluzione tramite server DNS; grazie al lavoro ed alla costanza di alcuni sviluppatori, è possibile scaricare un file modificato ad-hoc affinché agli host dei più noti banner pubblicitari venga automaticamente associato l’indirizzo IP 127.0.0.1, ovvero l’indirizzo locale della propria macchina (localhost).  Risultato:
i banner non verranno più visualizzati!

Senza dilungarci in ulteriori spiegazioni procediamo alla modifica: andiamo innanzitutto a creare un backup del file /etc/hosts presente nel nostro sistema operativo, da ripristinare in caso di problemi, dopodiché, andremo a creare uno script per il download/upgrade automatico del file che inseriremo nel nostro crontab.

*Preparazione
Creamo innanzitutto un backup del nostro file /etc/hosts originale da ripristinare in caso di problemi: per farlo, da terminale, digitiamo

# sudo cp /etc/hosts /etc/hosts.bak

Adesso creiamo lo script che sara’ in grado di scaricare automaticamente il nuovo file host, concedendogli eventualmente una serie di tentativi qualora la connessione ad Internet non fosse subito disponibile, quindi dal nostro terminale digitiamo

# sudo vim /usr/local/bin/adblock.sh

All’interno del file appena creato inseriamo quanto segue:

#!/bin/bash

exec 2> /tmp/adblock.log
exec 1>&2
set -x
wget -q -O - 1 --retry-connrefused http://someonewhocares.org/hosts/hosts | grep -P "^(127.0.0.1 |::1 |# )" > /etc/hosts

chmod 644 /etc/hosts

Salviamo il file ed usciamo dall’editor, dopodiché renderlo eseguibile con il comando

# sudo chmod +x /usr/local/bin/adblock.sh

Ora facciamo in modo di aggiungere il nostro nuovo script nel crontab del sistema in modo da farlo eseguire, in automatico, almeno ogni 4 ore (la scelta ottimale sta a voi).

Per coloro che non sono soliti ad utilizzare la gestione del crontab facciamo un breve ripasso sulla sua sintassi :

Esempi di sintassi dei comandi cron

Il file crontab deve rispettare una sintassi ben precisa, diversamente il sistema non accetterà le impostazioni. Quello che segue è un esempio generico:

5 3 * * * /usr/bin/apt-get update

L’esempio precedente eseguirà il comando apt-get update ogni giorno di ogni mese alle ore 03:05 (l’orario viene indicato nel formato a 24 ore).

La prima parte della voce descrive quando l’azione deve essere effettuata. Ci sono cinque campi (nell’esempio precedente, «5 3 * * *»), separati da uno spazio, ognuno dei quali accetta un numero, un asterisco o un testo appropriato. I campi specificano, in ordine (tra parentesi l’abbreviazione standard):

  • minuti, da 0 a 59 («m»);
  • ore, da 0 a 23 («h»);
  • giorno del mese, da 1 a 31 («dom»);
  • mese, da 1 a 12 («mon»);
  • giorno della settimana, da 0 (domenica) a 6 (sabato) («dow»)

 

Quelle che seguono sono alcune varianti della precedente pianificazione d’esempio:

Stringa

Descrizione

«12 03 * * *»

tutte le mattine, più o meno alle 3

« 12 03 15 * *»

tutti i 15 del mese, alla stessa ora

«12 03 31 * *»

7 volte l’anno, alla stessa ora

«0 12 * * 0»

ogni domenica, a mezzogiorno

«2 0 * * *»

ogni giorno, più o meno a mezzanotte

«02 03 * * 1,5»

ogni lunedì e venerdì, alle 3 del mattino circa

Altri esempi per aiutarvi a capire le varie combinazioni :

  • Esempio 1
1-30 * * * * /comando/da/eseguire

il comando verrà eseguito ogni giorno, ogni ora e quando i minuti vanno da 1 a 30.

  • Esempio 2
30 * 1-7 * * /comando/da/eseguire

il comando verrà eseguito i primi sette giorni di ogni mese, ad ogni ora e quando i minuti valgono 30.

  • Esempio 3
00 */2 15 * * /comando/da/eseguire

il comando verrà eseguito il quindicesimo giorno di ogni mese, ogni due ore.

  • Esempio 4
00 1-9/2 1 5 * /comando/da/eseguire

il comando viene eseguito il primo maggio alle 1,00 – 3,00 – 5,00 – 7,00 – 9,00. Cioè ogni due ore dalle 1,00 alle 9,00.

  • Esempio 5
00 1-10/2 1 5 * /comando/da/eseguire

il comando viene eseguito il primo maggio alle 1,00 – 3,00 – 5,00 – 7,00 – 9,00. Cioè ogni due ore dalle 1,00 alle 10,00. Si noti come l’ultimo valore utile dell’intervallo non coincida, in questo caso, con l’ora in cui viene fatta partire l’ultima esecuzione giornaliera del comando.

  • Esempio 6
00 13 2,8,14 * * /comando/da/eseguire

il comando verrà eseguito il secondo, l’ottavo e il quattordicesimo giorno di ogni mese alle 13.00

  • Esempio 7
30 13 1-15 4,10 * /comando/da/eseguire

il comando verrà eseguito i primi quindici giorni di aprile e ottobre alle 13,30.

  • Esempio 8
*/30 13,20 * 1-7,9-12 1-5 /comando/da/eseguire

il comando verrà eseguito nei giorni feriali (da lunedì a venerdì) di tutti i mesi tranne agosto, alle 13,00 – 13,30 – 20,00 – 20,30.

  • Esempio 9
00 14,19 1-15 * 5 /comando/da/eseguire

il comando verrà eseguito alle 14,00 e alle 19,00 dei primi quindici giorni di ogni mese e anche ogni venerdì.

** Ora per tornare al nostro esempio possiamo editare il file del nostro crontab tramite il comando

# crontab -e

ed in base agli esempi appena visti la riga di configurazione per far si che lo script venga eseguito ogni 4 ore di ogni giorno dell’anno sara’ la seguente :

# 00 */4 * * *  /usr/local/bin/adblock.sh

una volta salvato ed usciti non rimarra’ altro da fare che riavviare il servizio per far si che la modifica diventi operativa

# sudo /etc/init.d/cron restart

per verificare che effettivamente la schedulazione sia stata inserita verifichiamo tramite il comando

# crontab -l

Se doveste riscontrare problemi nella gestione della navigazione e voleste tornare alla configurazione iniziale vi bastera’ rieditare il crontab eliminando la stringa inserita e ripristinare il file hosts iniziale di cui avevamo fatto il backup tramite il comando :

# sudo mv /etc/hosts.bak /etc/hosts

Buon Anno!

#linuxadblocksenzaplugin

Catturare il traffico di rete

redirectRedirect fai da te

Molte volte vi capitera’ (ed a me e’ capitato piu’ volte) di aver bisogno di gestire il traffico di rete ottimizzandolo, filtrandolo e redirezionandolo.
Si pensi, ad esempio, ai test di sviluppo effettuati sulle molte VM in cui si deve tenere conto della quantita’ di Server interessati e del carico di rete da gestire bilanciando quest’ultimo e gestendo le porte interessate.

In questo articolo illustrero’ alcuni dei migliori tra quelli da me usati in ambito OpenSource sono, Rinetd, LVS e Pound, ma l’elenco potrebbe ancora allungarsi, magari per un seguito.

PARTIAMO

rinetd

E’ il piu’ semplice dei tre, dunque partiremo da questo; esso permette di ridirigere una destinazione TCP, definita attraverso una coppia <indirizzo-ip>:<numero-di-porta>, presso un’altra coppia di questi valori. Lo scopo di questo può essere semplicemente quello di dirigere una porta locale verso un’altra porta locale, oppure si può arrivare a intercettare il traffico IP che attraversa un router in modo da ridirigere alcune coppie di indirizzi e porte presso altre destinazioni.

Tutto è composto semplicemente da un daemon, rinetd, che si avvale di un file di configurazione, /etc/rinetd.conf, nel quale si indicano semplicemente le ridirezioni da applicare.

La presenza in funzione di rinetd è incompatibile con altri daemon che stanno in ascolto delle stesse porte che devono essere ridirette, anche se queste sono intese appartenere a host differenti.

Il programma rinetd è il demone che si occupa di ridirigere il traffico TCP in base a quanto contenuto nel file di configurazione /etc/rinetd.conf
E' sufficiente avviarlo e, se il file di configurazione risultera'corretto, iniziare subito a lavorarci. All'avvio, dopo aver letto la configurazione, rinetd deve poter stare in ascolto dell'indirizzo da ridirigere e della porta relativa; qualunque sia l'indirizzo in questione, è necessario che non ci sia già un programma locale che fa la stessa cosa su quella stessa porta; per esempio, non si può tentare di ridirigere il servizio HTTP di un indirizzo qualunque, se questo è presente localmente.

Un esempio di configurazione del file rinetd.conf dovrebbe essere sufficiente a chiarire le idee su questo file. Supponiamo di voler dirottare il traffico diretto verso l’indirizzo IP 10.11.12.13 alla porta 80, in modo che questo vada verso l’indirizzo IP 192.168.1.7, alla porta 80.

120.121.122.123 80 192.168.1.7 80

L’indirizzo da ridirigere, può appartenere a un’interfaccia del nodo presso cui si trova in funzione il demone rinetd,
oppure no, purché i pacchetti diretti a tale indirizzo transitino attraverso il nodo che attua la ridirezione.
Se si vuole apprendere il funzionamento di rinetd senza disporre di una rete vera e propria, basta una direttiva di configurazione simile a quella seguente:

localhost 8888 localhost html

In questo modo, la porta locale 8888 viene ridiretta sulla porta del servizio HTTP (80). Se il servizio HTTP è attivo, si può verificare la ridirezione con un programma di navigazione qualunque, puntando all’URL

http://localhost:8888

Rispetto ai prossimi due tool rinetd non e’ in grado di fungere anche come LoadBalancer.


ipvsadm

Questo servizio aggiorna la tabella d’instradamento IPVS nel kernel. Il demone lvs imposta e gestisce Load Balancer Add-On richiamando ipvsadm per aggiungere, modificare e cancellare le voci all’interno della tabella d’instradamento IPVS. Inoltre ipvsadm fa parte del paccheto LVS  che è una soluzione di bilanciamento del carico avanzato per sistemi Linux.
Si tratta di un progetto open source avviato da Wensong Zhang nel lontano 1998. La missione del progetto è di costruire un server ad alte prestazioni e ad alta disponibilità per Linux utilizzando tecnologie di clustering, offrendo una buona scalabilità, affidabilità e facilità di manutenzione. L’opera principale del progetto LVS è ora quello di sviluppare un software avanzato di bilanciamento del carico IP (IPVS), ed un software di bilanciamento a livello dell’applicazione (KTCPVS), ed i componenti di gestione dei cluster.

Ipvs in pratica

IPVS (IP Virtual Server) implementa un bilanciatore di carico a livello Layer 4 della rete. IPVS in esecuzione su un host si comporta come un sistema di bilanciamento del carico di fronte ad un insieme di server reali in cluster, può indirizzare le richieste per servizi basati si TCP/UDP ai veri server, e fa apparire i servizi dei server reali come un unico servizio virtuale su un unico indirizzo IP.

La componente IPVS è presente in tutti i recenti Kernel, per installare la componente in user-space utilizzate il vostro gestore di pacchetti, ad esempio in Ubuntu:

aptitude install ipvsadm

a questo punto si può creare uno script da far avviare al boot. Io di solito inserisco i comandi all’interno del file
/etc/rc.local.

Prima di tutto dobbiamo resettare l’attuale configurazione con il comando:
ipvsadm -C
Dopodiché iniziamo a dare le regole con i comandi come nell’esempio qui sotto in cui diciamo che le chiamate TCP (parametro -t) all’indirizzo 192.168.10.100 sulla porta 5060 (quella per il protocollo SIP) debbano essere inoltrate alla stessa porta dell’indirizzo 192.168.10.250.  Per reindirizzare una chiamata UDP sostituire il -t con -u.
ipvsadm -A -t 192.168.10.100:5060 -s rr

ipvsadm -a -t 192.168.10.100:5060 -r 192.168.10.250:5060 -m

Naturalmente è possibile catturare il traffico su una porta e inoltrarla ad un’altra con un comando tipo questo:
ipvsadm -A -t 192.168.10.100:88 -s rr
ipvsadm -a -t 192.168.10.100:88 -r 192.168.10.250:80 -m
In questo caso non abbiamo fatto altro che prendere le chiamate alla porta 88 dell’indirizzo 192.168.10.100 e rinviarle al server web dell’IP 192.168.10.250 sulla normale porta 80

Metodi di bilanciamento utilizzati da LVS

In caso si desideri testare il funzionamento di LVS senza la necessita’ di monitorare i servizi e possibile aggiungere e rimuovere nodi con il comando ipvsadm:

ipvsadm -C
ipvsadm -A -t 10.2.1.164:8080 -s lc
ipvsadm -a -t 10.2.1.164:8080 -r 10.2.1.166 -g
ipvsadm -a -t 10.2.1.164:8080 -r 10.2.1.165 -g

Le opzioni utilizzate nelle linee di comando di ipvsadm per l’esempio riportato sono le seguenti:

-C, –clear: cancella la tabella del virtual server.
-A, –add-service: crea un servizio virtuale.
-a, –add-server: aggiunge un nodo ad un servizio virtuale.
-t, –tcp-service: specifica indirizzo ip e numero di porta tcp del servizio virtuale.
-s, –scheduler: specifica l’algoritmo di bilanciamento
-r, –real-server: specifica l’indirizzo ip del nodo reale
-g, –gatewaying: indica il metodo di forwarding direct routing (LVS-DR)

** algoritmi per il bilanciamento che possiamo usare con LVS.

Statici:

– Round Robin

– Weighted Round Robin

– Destination Hashing

– Source Hashing

Dinamici:

– Least-Connection

– Weighted least-connection

– Never queue

– Locality-based least-connection

– Locality-based least-connection with replication scheduling

– Shortest expected delay


pound

Pound è un proxy server di bilanciamento del carico inverso. Accetta richieste da HTTP / HTTPS clienti e li distribuisce a uno o più server web. Le richieste HTTPS vengono decifrati e passati al back-end come semplice protocollo HTTP.

Se più di un server back-end è definita, Pound sceglie uno di loro a caso, sulla base delle priorità definite. Per impostazione predefinita, Pound tiene traccia di associazioni tra client e server back-end (sessioni).

General Principles

In generale, Pound ha bisogno di tre tipi di oggetti definiti, al fine di funzione: ascoltatori , i servizi e back-end .

Ascoltatori
Un ascoltatore è una definizione di come Pound riceve le richieste dai client (browser). Due tipi di ascoltatori può essere definito: normale connessione HTTP ascoltatori e HTTPS (HTTP su SSL / TLS) ascoltatori . Per lo meno un ascoltatore deve definire l’indirizzo e la porta per l’ascolto su, con ulteriori requisiti per HTTPS ascoltatori .

Servizi
Un servizio è la definizione di come le domande trovano risposta. Il servizio può essere definito all’interno di un ascoltatore o al livello superiore (globale). Quando viene ricevuta una richiesta Pound tenta di far corrispondere a ciascun servizio , a sua volta, a partire dai servizi definiti nel ascoltatore stesso e, se necessario, di proseguire con l’ servizi definiti a livello globale. I servizi possono definire le proprie condizioni al quale le domande si può rispondere: in genere si tratta certo URL (solo foto, o un certo percorso) o intestazioni specifiche (come ad esempio l’intestazione Host). Un servizio può anche definire una sessione meccanismo: se definito le richieste future da un determinato cliente sarà sempre la stessa risposta da parte di back-end .

Back-end
Il back-end sono i server reale per il contenuto richiesto. Di per sé, Pound fornisce nessuna risposta – tutti i contenuti devono essere ricevuti da un vero e proprio “web server”. Il back-end definisce come il server dovrebbe essere contattato.

Tre tipi di back-end può essere definito: un “regolare” back-end che riceve le richieste e le risposte restituisce, un “redirect” back-end in questo caso, Pound risponde con una risposta redirect, senza l’accesso a qualsiasi back-end a tutti , o una “emergenza” back-end che sarà usato solo se tutti gli altri backend sono “morti”.

Multiple back-end può essere definito all’interno di un servizio , nel qual caso Pound sarà bilanciamento del carico tra i disponibili back-end .

Se un back-end non riesce a rispondere, sarà considerato “morto”, nel qual caso Pound si ferma l’invio di richieste ad esso. Dead indietro _ e NDS sono periodicamente controllate per la disponibilità, e una volta che rispondono ancora sono “resurected” e le richieste sono inviati di nuovo la loro strada. Se non back-end sono disponibili (nessuno è stato definito, o sono tutti “morti”), allora Pound risponderà con “503 Servizio non disponibile”, senza verificare ulteriori servizi .

Il collegamento tra Pound e il back end- è sempre via HTTP, a prescindere dal protocollo utilizzato tra Pound e il cliente.

Installazione

sudo apt-get install pound

La gestione completa del servizio avviene tramite la configurazione del file /etc/pound/pound.cfg
Esempio 1:

Semplice configurazione HTTP Proxy
Supponiamo di forwardare le richieste http che arrivano dall”IP pubblico 202.54.10.5 all’IP sulla LAN 192.168.1.5 su cui è configurato un web server Apache sulla porta 8080.
Editiamo il file di configurazione di pound di una distro Debian/Ubuntu:

vim /etc/pound/pound.cfg

Questo è l’aspetto del file:

ListenHTTP
Address  202.54.10.5
Port          80
Service
BackEnd
Address  192.168.1.5
Port           8080
End
End
End

Salvare e chiudere il file e restartare Pound:

/etc/init.d/pound restart

Esempio 2
Semplice configurazione HTTP & HTTPS Proxy
In questo esempio vediamo come “proxare” una richiesta http e https dallo stesso IP pubblico 202.54.10.5 a due web server 192.168.1.5 e 192.168.1.6, entrambi sulla porta 80:

ListenHTTP
Address  202.54.10.5
Port          80
End

ListenHTTPs
Address   202.54.10.5
Port           443
Cert           “/etc/ssl/local.server.pem” -–>percorso certificato ssl
End

Service
BackEnd
Address     192.168.1.5
Port              80
Priority       1
Backend
Address     192.168.1.6
Port              80
Priority       3
End
End

Salviamo il file di configurazione e restartiamo pound.

In questo esempio le richieste alla porta 80 all’ ip 202.54.10.5  vengono inoltrate alla porta 80 del webserver 192.168.1.5, mentre le richieste alla porta 443 dall’ ip 202.54.10.5 vengono inoltrate alla porta 80 del web server 192.168.1.6  e in questo caso pound gestisce il certificato ssl, che è possibile generarsi senza alcuna modifica nel backend del web server, che continua a gestire chiamate in http.

PS: e’ possibile inoltre impostare una priorità di inoltro del traffico differente, nel caso si disponga di più server web, cosi’ come indicato dalla voce “Priority” presente nella configurazione del secondo esempio; minore è la cifra, maggiore sarà la priorità assegnata al server.

Buon divertimento !

Grafici di rete con Vnstat

vnstat-php-frontend-screenshots

Controllare la banda

Sui server, come sui PC, è utile monitorare e raccogliere dati circa l’utilizzo della banda di rete. E’ possibile utilizzare vnstat per avere un monitoraggio in tempo reale della banda; questo piccolo programma ha qualcosa in più degli altri, oltre a mostrare statistiche in tempo reale, la caratteristica in cui brilla questo piccolo programma è la sua capacità di raccogliere dati su un lungo periodo di tempo. vnstat è un monitor di traffico di rete basata su console per Linux e BSD che mantiene un log del traffico di rete per l’interfaccia/e che gli indicherete nel file di conf. Utilizza le statistiche dell’interfaccia di rete fornite dal kernel come fonte di informazioni, ciò significa che vnstat non sta effettivamente sniffando il traffico, inoltre assicura anche un basso impatto sull’uso delle risorse di sistema.

In Linux, è richiesto almeno un kernel della serie 2.2, che vuol dire che tutti oggigiorno sono in grado di utilizzare questo piccolo programma.

Il programma è open source/GPL e può essere utilizzato sia come root che come utente non privilegiato.

INSTALLAZIONE

sudo apt-get install vnstat
                     vnstati
                     apache2
                     php5
                     php5-gd

Primo setup

Durante la prima esecuzione è necessario inizializzare ogni interfaccia che desiderate registrare su vnstat. Ad esempio per una interfaccia cablata con cavo di rete è necessario utilizzare il comando:

# vnstat -u -i eth0

o per una interfaccia wireless:

# vnstat -u -i wlan0

Quando si inizializza una interfaccia per la prima volta ci potrà essere un messaggio di errore che stamperà ‘unable to read database’. Se questo messaggio è seguito da un messaggio di informazioni che dice ‘a new database has been created’ l’interfaccia è stata aggiunta con successo.
Se questo non accade verificare che l’interfaccia specificata sia valida.

Per vedere tutte le interfacce del vostro sistema Linux, è possibile utilizzare il comando

 ip link show
 ... ora scarichiamo il pacchetto vnstat_php_frontend nel seguente modo :
# cd /tmp
# wget http://www.sqweek.com/sqweek/files/vnstat_php_frontend-1.5.1.tar.gz
scompattiamolo nel percorso dei file di Apache ( /var/www/html )
# sudo tar zxvf vnstat_php_frontend-1.5.1.tar.gz -C /var/www/html/

a questo punto non rimane altro che spostarci nel percorso sopra indicato in cui potremo trovare la nuova directory
# cd /var/www/html
** rinominiamo x maggiore comodita’ da “vnstat_php_frontend-1.5.1” a semplicemente vnstat
# sudo mv vnstat_php_frontend-1.5.1 vnstat

…. spostiamoci all’interno della Directory vnstat ed andiamo a fare alcune veloci modifiche che ci permetteranno di diventare subito operativi.

# cd vnstat
…effettuiamo come consuetudine un backup del file config.php prima di fare qualunque modifica
# cp config.php config.php.bck

ora possiamo passare ad editare il file in questione e ad apportare le seguenti modifiche :
# vim config.php

*** modifichiamo nel seguente modo
$locale = 'en_US.UTF-8';
$language = 'en';
$iface_list = array('eth0', 'eth1'); # nel mio caso ho modificato le interfacce con la mia wlan0 

$iface_title['wlan0'] = 'Internal';
// $iface_title['eth1'] = 'External'; # se non avete due o piu' interfacce da monitorare potete commentarla

…salvate ed uscite dal file; a questo punto bastera’ puntare il browser all’URL

http://localhost/vnstat/

 

da qui in avanti potrete tenere sotto controllo i consumi della/e vostra interfaccia di rete (ora,giorno,mese).

Introduzione a CouchDB

couchDBCouchDB e’ un database documentale NoSQL disponibile con l’ampia licenza Apache.
Apache CouchDB e’ un moderno documentale richiamabile semplicemente con l’HTTP e che al tempo stesso offre le piu’ avanzate funzionalita’ di replicazione dati e di ricerca in parallelo (Map/Reduce).

CouchDB (acronimo di Cluster Of Unreliable Commodity Hardware) e’ uno dei piu’ diffusi DB documentali Web grazie alla sua velocita’, alla flessibilita, alla semplicita’ di utilizzo ed al… prezzo!

Installazione

Installare CouchDB e cURL (che serve per accedere) e’ facile su Linux (eg. RedHat, Fedora, CentOS, Scientific Linux, …):

yum install couchdb curl -y
oppure
sudo aptitude install couchdb curl
Ora bisogna far partire il server CouchDB con il comando couchdb. Per verificare se funziona tutto basta un comando:
# curl http://127.0.0.1:5984
{“couchdb”:”Welcome”,”uuid”:”fd91d8b7b77c7f6d75d5937326a95ad2″,”version”:”1.5.0″,”vendor”:{“version”:”14.04″,”name”:”Ubuntu”}}

CouchDB e’ disponibile per tutti i sistemi UNIX-based ed anche sulle piattaforme MS-Windows e Mac OS X. Installare le versioni precedenti di CouchDB non era cosi’ semplice: bisognava partire dall’installazione del linguaggio di programmazione Erlang e ricompilare…

Utilizzo

CouchDB e’ accessibile esclusivamente attraverso un HTTP-based RESTful API, cio’ significa che, anziche’ collegarsi al DB server utilizzando un’applicazione client per interagire con il sistema, basta utilizzare un software in grado di interagire con un HTTP server web per fare richieste. CouchDB che a sua volta eseguira’ le azioni nel database, restituendo una risposta appropriata quando finito.
Quindi e’ possibile gestire il database semplicemente visitando gli URL nel browser web oppure utilizzando gli strumenti da riga di comando come curl o, cosa piu’ importante, attraverso qualsiasi linguaggio di programmazione che supporta richieste HTTP.
L’implementazione dell’interfaccia REST (Representational Transfer State) su CouchDB e’ molto completa poiche’ non si limita al CRUD (CREATE, READ, UPDATE, DELETE) ma ogni operazione svolta su CouchDB e’ richiamabile con l’HTTP.

Futon

CouchDB possiede una sua interfaccia web molto user friendly, Futon, dalla quale e’ possibile eseguire qualsiasi operazione per la gestione di un database, come l’inserimento, la visualizzazione, la modifica e la cancellazione dei dati. Inoltre Futon contiene anche le principali funzionalita’ di amministrazione di un database, come le impostazioni di configurazione, la replicazione dei dati, definizione dei ruoli e privilegi e uno strumento di testing.
Per accedere all’interfaccia web basta collegarsi da browser a localhost:5984/_utils

cURL

Per i piu’ affezionati alla linea di comando (come me per esempio), si puo’ usare curl, un ottimo tool utile per trasferire dati da/a un server utilizzando vari protocolli, tra cui HTTP, HTTPS, FTP. Il modo per farlo e’ digitando:

curl <opzioni> <ip_host>:5984/<database>/<record>.

Da notare che nel URL viene specificata la porta 5984, e’ quella usata dal processo di couchdb.
Tra le opzioni piu’ importanti: -X per specificare il tipo di richiesta http: GET per richiedere dati, PUT e POST per modificare dati o DELETE per cancellare. Inoltre -d permette di specificare i dati da includere nella richiesta, ad esempio per modificare documenti nel database.
Esempi:

# Crea il database "libri"
curl -X PUT http://127.0.0.1:5984/libri

# Visualizza il contenuto di "libri" (all'inizio e' vuoto)
curl -X GET http://127.0.0.1:5984/libri

# Crea il documento con _id "lafineeilmioinizio" dentro il database "libri"
curl -X PUT http://127.0.0.1:5984/libri/lafineeilmioinizio \
 -d '{"titolo":"La fine e il mio inizio", "autore":"Tiziano Terzani", 
      "casa_editrice":"Longanesi", "prezzo":"18.60"}'

# NB: Tutte le volte che un documento viene modificato riceve un revision number
# Modifica un documento aggiungendo come allegato un'immagine
curl -X PUT http://127.0.0.1:5984/libri/lafineeilmioinizio/cover.jpg?rev=1-XXX \
 --data-binary @images/budda.jpg -H "Content-Type: image/jpg"

# Crea un documento hungergames copiando il contenuto da un altro documento
curl -X COPY http://127.0.0.1:5984/libri/lafineeilmioinizio -H "Destination: hungergames"

# Cancella il documento con _id "hungergames"
curl -X DELETE http://127.0.0.1:5984/libri/hungergames?rev=1-YYY 

# Effettua un caricamento massivo di documenti da file
curl -X POST http://127.0.0.1:5984/libri/_bulk_docs -H "Content-type: application/json" -d @biblio.json

# Visualizza tutto il contenuto del database "libri" e il dettaglio dei documenti presenti
curl -X GET http://127.0.0.1:5984/libri/_all_docs?include_docs=true

Architettura

CouchDB e’ un database document-oriented. Cio’ significa che a differenza dei piu’ tradizionali DBMS (Database Management System) relazionali come Oracle e PostgreSQL, i dati non vengono memorizzati in tabelle (o se volete, relazioni), ma in “documenti”.

Su un database relazionale le tabelle hanno una struttura rigida, sono composte da campi definiti prima della effettiva memorizzazione dei dati. Le tabelle vanno dichiarate con gli opportuni statement DDL, prima di essere utilizzate. Ogni tabella e’ composta da tuple (ovvero le righe della tabella o i record) che contengono i dati. La gestione dei dati si effettua con statement DML. I comandi DDL e DML della stragrande maggioranza dei DB relazionali sono in SQL. Ora dimentichiamoci tutto questo…

In CouchDB il concetto di relazione o di tabella non esiste, l’elemento fondamentale e’ il documento che contiene al suo interno tutti i dati relativi, organizzati in modo eterogeneo. Si possono aggiungere e modificare i campi anche dopo l’effettivo inserimento dei dati. In questo modo record appartenenti alla stessa categoria di informazioni possono avere campi diversi tra di loro. La chiave primaria dei database relazionali viene tradotta nel campo univoco _id di CouchDB, creato automaticamente dall’engine del DBMS (ma che e’ anche possibile indicare in modo esplicito.

Dal punto di vista del sistema operativo CouchDB si presenta come un unico processo beam.smp in ascolto sulla porta TCP 5984 (6984 se e’ abilitato l’HTTPS). In realta’ all’interno del processo operano diversi thread con compiti specifici.
I file utilizzati da CouchDB su Linux si trovano in /etc/couchdb, i file di database su /var/lib/couchdb, i log su /var/log/couchdb.

Consistenza dei dati e replicazione

CouchDB non utilizza alcun meccanismo di locking ma sfrutta l’MVCC (Multiversion Concurrency Control), ogni modifica di un oggetto ne crea una nuova versione. Le versioni precedenti non vengono cancellate. Se due modifiche vanno in conflitto poiche’ accedono allo stesso documento, la seconda riceve un errore in save. L’applicazione deve riprendere l’ultima versione del documento e rieseguire l’UPDATE.
L’isolamento e’ mantenuto solo a livello di un singolo documento, questa e’ una notevole semplificazione, rispetto alla complessa logica transazionale di altri database, ma consente l’ottimizzazione, la parallelizzazione e la distribuzione dei dati in modo semplice. A livello di accesso al file di dati ogni singola modifica ad un documento rispetta le proprieta ACID (Atomic Consistent Isolated Durable) con la serializzazione delle modifiche sui documenti e la scrittura sincrona sul disco.

Piu’ database CouchDB possono essere collegati tra loro in modo molto semplice. I database vengono aggiornati tra loro con una replicazione peer-to-peer incrementale implementata nativamente nell’engine. CouchDB permette una replicazione bidirezionale asincrona, utilizza un meccanismo automatico di risoluzione dei conflitti e fornisce una eventual consistency tra i database. Se i database sono ospitati su nodi differenti si ottiene con questo la distribuzione dei dati.
La replicazione di CouchDB puo’ essere utilizzata sia per sincronizzare database locali che per complesse configurazioni con sharding dei dati.