Common Gateway Interface 1

Il modello Client/Server sulla rete internet.

Client/Server
Quando con il nostro browser preferito digitiamo un indirizzo, ad esempio http://hobbytron.altervista.org, in realta' scateniamo un meccanismo che prevede una richiesta (request) da parte del browser, che risiede sulla macchina client, mentre dall'altra parte, dal server, viene fornita una risposta (response) alla richiesta del browser/client. Se per esempio stiamo utilizzando il servizio HTTP (Hyper Text Transfer Protocol), il server risponde alla richiesta del client inviandogli, come risposta, una pagina scritta in HTML (Hyper Text Markup Language) che il browser interpretera' e mostrera' sul monitor.
Fin qui niente di nuovo.


Il meccanismo del Common Gateway Interface

CGI
C'e' la possibilita', attraverso il cosiddetto meccanismo del Common Gateway Interface, di innescare l'esecuzione di un programma (.exe) residente sul server, da parte di un browser client.

Il programma in questione si occupera' di svolgere determinate operazioni ed elaborazioni e rispondera' al browser con una pagina Html non residente sul disco rigido del server, ma costruita in base al risultato delle elaborazioni che il programma ha effettuato

Per esempio supponiamo di visitare, sempre attraverso il browser di una macchina client, un sito nel quale ad un certo punto si giunge ad una pagina dove ci viene chiesto, attraverso un form, di inserire la nostra data di nascita

Supponiamo che inoltre la pagina in questione ci dica che inviando la nostra data di nascita ci verra' risposto con il numero di secondi trascorsi dalla nostra data di nascita alla data odierna.
Sembra una banalita' ma in realta' un sistema del genere racchiude un meccanismo non proprio elementare. Analizzando nello specifico quello che avviene possiamo dire che attraverso la freccia 1 avviene la solita request dal client al server. In questo caso pero' non viene fatto riferimento ad una pagina web statica, bensi ad uno specifico programma che qualcuno avra' appositamente inserito nella directory cgi-bin del server e che si occupa di effettuare il calcolo di cui sopra.

A questo punto possiamo dire che attaverso la request il client invia anche dei parametri al server, nel nostro caso la nostra data di nascita.

Il server a questo punto si accorge che la richiesta non e' una normale request di una pagina web statica ma fa riferimento ad un programma.
Quindi il server, attraverso la freccia 2 passa i parametri che gli aveva mandato il client al programma e ne innseca il funzionamento.

Il programma fara' le sue elaborazioni e rispondera' al server generando dinamnicamente un codice Html di risposta, attraverso la freccia 3.
Attraverso la freccia 4 il server rispondera' al client il quale visualizzera' il risultato ottenuto.

Non e' detto che in tutti i casi ci sia un passaggio di parametri dal client al server, ci possono essere infatti delle applicazioni che non prevedono questo passaggio.
Ad esempio, se scriviamo un programma cgi che ci restituisca l'ora del server, da parte del client non c'e' bisogno di passare alcun parametro ma solo il comando di innesco del programma che si occupera' di andare a leggere l'ora del server.

Va posta particolare attenzione ed interesse al fatto che il programma cgi, oltre che svolgere delle elaborazioni, si occupa anche di "costruire" una pagina web di risposta attraverso la costruzione del corrispondenze codice Html.

Giusto per fare un esempio se vogliamo che sulla pagina di risposta ad un certo punto appaia una linea orizzontale nel programma cgi dovremo scrivere :

printf("<hr>");

E' molto intuitivo capire cosa fa il programma cgi, fa un print di quello che trova fra le apicette che in Html significa metti una linea orizzontale, <hr> appunto.


Controllare dispositivi attraverso internet

CGI con il mondo esterno
Nulla ci vieta di pensare che oltre a fare determinate operazioni, per esempio leggere l'ora del server o calcolare i secondi dalla data di nascita, un programma cgi possa anche accedere alle porte del pc, per esempio alla parallela o alla seriale.

E qui nasce un discorso estremamente interessante perche' attraverso questo meccanismo possiamo controllare dei dispositivi a distanza, attraverso una semplice pagina web opportunamente costruita.


Prendiamo un attimo in esame il diagramma riportato qui sopra. Supponiamo di avere un server web nella nostra azienda e di avere la necessita' di mantenere costantemente monitorata la temperatura di alcuni uffici, per esempio 8.

Nello schema vediamo che sulla porta parallela del server e' collegato un sistema di acquisizione dati a 8 canali.

Possiamo quindi pensare che potremmo collegare ciascuno dei sensori di temperatura, opportunamente condizionati, ad ogni canale del convertitore.

Se si fa riferimento al progetto 8AdcCh abbiamo gia' per le mani un sistema che si occupa di convertire tensioni analogiche in dati binari e dei programmi che ne gestiscono il funzionamento.

Non ci resta che modificare i programmi in modo che generino output in codice Html e realizzare una o piu' semplici pagine web che consentano di scegliere quale canale convertire piuttosto che leggere un log file con tutte le temperature del giorno o fare qualsiasi altra cosa.

In pratica dobbiamo installare un programma che faccia il server sul pc al quale collegheremo l'interfaccia e dobbiamo attivare un servizio di riconoscimento dinamico del IP del server attraverso un Url che abbiamo scelto noi.

Siccome non sono un esperto del settore ci metterei una vita a spiegare come si fa, mentre a questo indirizzo www.andrearusso.it trovate una meravigliosa e comprensibilissima spiegazione di come fare, tutto gratuitamente.
Su questo sito trovate anche tante altre cose utili che hanno a che fare con tutto cio' che e' il www.

Vi consiglio di fare riferimento al sito che ho indicato, vedrete che troverete spiegazioni molto esaurienti e in qualche minuto verrete in possesso di tutti gli strumenti che vi servono per trasformare il vostro pc in un server, attraverso il quale controllare il mondo esterno, tramite internet.


La sicurezza
E qui vengono le dolenti note. Come gia' spiegato sulla home page di questo sito, tutti i progetti ed i programmi ivi contenuti, nonche il sito stesso in generale, hanno il solo scopo di condividere esperienze con altri appassionati del settore.

Lo scopo unicamente didattico del sito fa si che in esso vengano presentati sistemi che non sono del tutto completi come se dovessero essere commercializzati.

Se per esempio nel mio laboratorio sto sperimentando l'accensione di una lampadina via internet non mi preoccupo certamente di inserire nei vari codici (html per la pagina web, c per il cgi), dei particolari sistemi di sicurezza. Sono nel mio laboratorio e solo io so quale e' l'url del mio server, non mi preoccupo di inserire password o cose del genere.

Al limite qualcuno mi spegnera' la lampadina, non succede niente.

Il discorso cambia se volessi qualche cosa che deve essere esclusivamente manipolabile da me perche' ho intenzione di farne un uso professionale per esempio.

Internet e' intrinsecamente insicura da questo punto di vista, possiamo mettere tutte le password e i firewall che vogliamo ma i dati viaggiano a pacchetti in giro per il mondo.

E i pacchetti possono essere intercettati da qualcuno.

A buon intenditore....

Si possono fare tante belle cose ma stando attenti. Diciamo pure che sperimentare e' bello, passare alla realta', in questo settore, puo' essere pericoloso. Tutto comunque dipende dal grado di importanza di cio' che stiamo controllando.

Leggermente diverso e' il discorso per le intranet, le reti aziendali, piu' o meno isolate da internet. In questo caso, con un buon proxy-firewall, pagine web e cgi ben congegnati e un system administrator astuto si puo' viaggiare un pochino piu' tranquilli.

Vedete voi, l'argomento e' incredibilmente affascinante... e pericoloso.

Ultima nota. collegare una web cab ad un server web, motorizzarla con un passo passo e creare un applicazione cgi che consenta di tenere sottocontrollo una stanza via internet non e' fantascienza.

Il giovanotto rampante in spiaggia con la fidanzata estrae il portatile munito di bluetooth e tramite telefonino si connette al server della sua fabbrichetta dove e' installato un cgi che si occupa di ruotare una webcam e di spedire le immagini della cassaforte...

Fin qui' tutto bene... ma se il giovanotto puntasse la webcam verso qualcos'altro, per esempio i dipendenti che stanno lavorando, non andiamo altrettanto bene.

Tutto questo per dirvi che, se si intende realizzare un sistema di questo genere, bisogna sapere che ci sono tante leggi che non permettono di invadere la privacy o di controllare a distanza l'operato di qualcuno.


Documentazione
Se volete cimentarvi nella realizzazione di automi Cgi vi consiglio di fare riferimento alla numerosa e ricca documentazione che si puo' reperire in rete.


Gli automi Cgi che ho realizzato
Ho cominciato con dei programmini semplicissimi, tipo scrivere la stessa frase con diverse dimensioni per poi andare via via verso sistemi un po' piu' complessi, quelli che controllano il mondo esterno. Per questi ultimi fate riferimento alle sezioni progetti e teoria (tutorial sui motori passo passo).
Preciso, probabilmente a causa del fatto che non scrivo molto chiarmante, che in questa pagina non vedrete funzionare gli automi, ne troverete solo una descrizione dalla quale poi potrete realizzare i vostri.
Questo principalmente perche' questo sito non risiede sul server di casa mia ma su uno spazio gratuito concesso da un intenet provider che ovviamente non permettera' mai che girino degli eseguibili sulle sue macchine.
E men che meno ci sono i dispositivi che voglio controllare attaccati a quel server (!), di cui non conosco nemmeno l'ubicazione.



Hello : cgi che scrive una frase con diverse grandezze.



Visualizza la pagina di output.


Servertime : Visualizza l'ora del server e i secondi trascorsi dal 1/1/70 ad oggi.



Visualizza la pagina di output.


Environment : Visualizza il contenuto delle variabili ambiente



Visualizza la pagina di output.


Environment2 : controllo stringa trasmessa da form.

Con questo cgi potrete controllare il contenuto dei parametri trasmessi, da un form, al cgi, attraverso la stampa del contenuto della variabile ambiente QUERY_STRING.
Il sorgente del cgi e' identico a quello appena descritto sopra.
Il form in oggetto ha questo tipo di struttura.

Giorno :
Mese   :
Anno   :

Il codice html relativo a questo form e' il seguente :

Non vi resta che visualizzare la pagina di output prestando particolare attenzione all'ultima riga.

Come potete vadere dalla pagina di output, il formato della stringa trasmessa al cgi, sulla variabile ambiente QUERY_STRING e' di questo tipo : giorno=31&mese=Marzo&anno=1998.
Per estrapolare i parametri il cgi dovra' quindi effettuare un parsing della stringa ed una successiva trasformazione di alcune stringhe in interi, nonche' l'eliminazione di caratteri come & che durante il parsing sono preziosissimi perche' fungono da separatori.
Quando si costruisce un form, piu' o meno complesso, conviene sempre rendersi conto delle stringhe che trasmette attraverso un cgi che mostra le variabili ambiente.


Lettura di un file residente sul server.

Alle volte puo' essere utile avere la possibilita' di leggere un logfile residente sul server e rappresentarlo su una pagina web. Ad esempio se vogliamo costruire una pagina sulla quale vengano postati dei commenti potremmo predisporre un form che si occupi di inviarli ad un cgi che faccia un append dei commenti sul logfile.
Con un altro cgi potremmo invece leggere il logfile e mostrarlo agli utenti (client) che lo richiedono.
Supponiamo infatti che il server sia dotato di un sistema che ogni tanto legge un dato binario da una apposita interfaccia lo salva su un logfile che ha il seguente formato :

0 Sun Apr 20 18:17:48 2003
0 Sun Apr 20 18:17:59 2003
1 Sun Apr 20 18:18:07 2003
80 Sun Apr 20 18:18:21 2003

Vediamo subito che ogni riga e' una stringa costituita da 6 sottostringhe, supponiamo che la pagina web debba mostrare le varie righe con questo formato piu' leggibile :

Received 0 on Sun 20 Apr 2003 @ 18:17:48
Received 0 on Sun 20 Apr 2003 @ 18:17:59
Received 1 on Sun 20 Apr 2003 @ 18:18:07
Received 80 on Sun 20 Apr 2003 @ 18:18:21

Dovremo per prima cosa estrarre le 6 sottostringhe e modificarne la posizione in modo che l'output sia quello voluto. Questo di seguito e' il codice del cgi.




Stampa la pagina