In questo tutorial vediamo come creare uno script CGI, sul Raspberry PI. L’utilità di uno script del genere possono essere molteplici. Presentare dati generici sul sistema: temperatura, orario, stato dei download, dischi montati. Oppure monitorare particolari sensori collegati tramite Pin GPIO alla nostra board.
Se avete installato wiringPi, potete usare i comandi GPIO per controllare i pin GPIO direttamente dagli script in bash.

Raspberry Pi e CGI

La CGI è la common gateway interface, offerta ormai dai più comuni web server. Nel nostro caso ipotizziamo l’uso di Apache. Il web server per eccellenza. Se non lo avete installato sul vostro Raspberry Pi, potete farlo con il comando:

sudo apt-get install apache2

Servire file HTML statici, si sa, è un’operazione non interattiva. Gli script rendono i siti web più dinamici e flessibili, e gli permettono di comunicare con dispositivi fisicamente connessi al server ad esempio, interagendo ad un livello che sconfina dalla solita cartella www.

Gli script CGI, se installate Apache su Linux (in questo caso Raspbian), vengono memorizzati nella cartella /usr/lib/cgi-bin, e devono avere i permessi d’esecuzione (guida rapida ai permessi in UNIX).

Gli script vengono eseguiti quando richiamati da Browser. Qualsiasi cosa presentata sullo stdout (standard output) viene mostrata sul browser, gli script possono generare HTML e presentare i dati in maniera strutturata.

Scripting CGI in Bash

Per definizione, la CGI funga da interfaccia per programmi di scripting esterni al web server. Potenzialmente potremmo usarla per eseguire da remoto script in python e ottenere la risposta su browser. In questa guida, creeremo un semplice script in Bash. Il linguaggio di scripting per il terminale di Linux.

Creiamo lo script cgi

Il primo passo è quello di creare lo script hello.cgi, possiamo farlo utilizzando l’editor nano, già presente in Raspbian:

sudo nano /usr/lib/cgi-bin/hello.cgi

E incolliamoci questo:

#!/bin/bash
 
echo -e "Content-type: text/html\n\n"
 
echo "<h1>Ciao Mondo!</h1>"

Salviamo a questo punto: Ctrl+O e poi usciamo dall’editor con Ctrl+X

Andiamo a spiegare le 3 stringhe di codice:

– La prima linea dello script indica che il file dev’essere interpretato da bash. Questa riga non viene inviata al browser che richiede la pagina. Se volessimo scrivere uno script in python, l’intestazione apparirebbe in questo modo (su linux): #!/usr/bin/python

– La seconda riga è un header HTTP. L’header viene stampato su stdout, quindi inviato al browser. In questo esempio l’header comunica semplicemente al browser che il testo dev’essere interpretato come HTML. Gli Header HTTP possono contenere anche altre informazioni, come il tempo che dovrebbe stare una pagina in cache etc. Anche i cookie possono essere impostati da header con i comandi set cookie. Notare che il doppio \n\n alla fine dell’header è molto importante. Questo inserisce una riga vuota dopo l’header. Questa riga vuota comunica al browser che l’header della pagina è terminato e che il resto è testo HTML.

– L’ultima riga dello script usa la funzione echo per stampare un semplice contenuto HTML sulla pagina. E’ anche possibile salvarsi file in formato HTML e stamparne il contenuto sulla pagina usando il comando cat.

Diamo al file i permessi d’esecuzione

Verificato che il file sia stato creato, diamogli i permessi d’esecuzione:

sudo chmod +x /usr/lib/cgi-bin/hello.cgi

Verifichiamo che funzioni

Supponendo che 192.168.1.79 sia l’IP della Board, richiamiamo da browser lo script cgi a quest’indirizzo:

http://192.168.1.79/cgi-bin/hello.cgi

Dovreste vedere a grandi lettere la scritta “Ciao Mondo!” sul browser.

Se non è raggiungibile, verificate con un netstat -na che la porta 80 sia aperta e che dunque il web server apache sia attivo. Se state effettuando quest’operazione da remoto, verificate che il Raspberry sia raggiungibile, con un ping.

Variabili d’ambiente in CGI

Quando viene ricevuta una richiesta HTTP, diverse variabili d’ambiente vengono impostate dal web server e passate allo script. Potete trovare una lista di queste variabili su wikipedia.

Una variabile d’ambiente particolarmente importante è QUERY_STRING, che contiene tutti gli argomenti che vengono passati allo script. La variabile REQUEST_METHOD ci dice invece quale meccanismo è stato usato per fare la richiesta, GET oppure POST. La variabile REMOTE_ADDR contiene l’indirizzo IP del computer che ha fatto la richiesta.