sabato 24 novembre 2007

ZoneMinder, Ubuntu Gutsy e ProxyPass

Il lavoro in ufficio procede, e come procede il lavoro procede anche l'installazione di molte altre macchine (dopo la Sun) che dovranno gestire alcuni servizi interni e/o esterni (un po' per fare pratica con questi sistemi, un po' perche' mi tornano utili anche per pubblicizzare determinati servizi con i miei clienti).

Il punto della questione e' quello che in questi giorni sto combattendo con il server ZoneMinder.
Ho installato su una macchina non eccezionale (un dual celeron 466 con 256 Mb di ram ECC) XUbuntu 7.10 e la mia vecchia scheda TV Brooketree BT878, e quindi sono passato all'installazione di ZoneMinder.
Qui devo dire che le installazioni pacchettizzate di Ubuntu in certi versi sono utili perche' con un "sudo apt-get" si installa qualsiasi cosa senza dover pensare alle varie dipendenze, ma dall'altra parte critico la gestione di certe dipendenze: capisco che ZoneMinder abbia bisogno del server apache+php installati in locale, ma per quale motivo *PRETENDE* di installare localmente anche MySQL? E se io avessi un database server bello, dedicato, pronto & veloce? Ma transeat, quantomeno con le installazioni pacchettizzate posso gestire in maniera migliore gli aggiornamenti.

Ora pero' si pone un problema: l'unica macchina disponibile sulla rete locale in DMZ e' il nodo herbert, che ospita peraltro il sito web interno, l'area ftp pubblica (per il momento) e tutta un'altra serie di cosucce simpatiche e utili. Per far funzionare ZoneMinder dall'esterno, la sua interfaccia web dovrebbe essere, per l'appunto, raggiungibile dall'esterno, ma non posso mettere in DMZ anche il nodo seth... E mi sembra "sporca" la soluzione di impostare il webserver di seth su un'altra porta; potrei giocare con i virtual-server ma dato che herbert e' di prossima reinstallazione/aggiornamento ho pensato, temporaneamente, ad una soluzione piu' veloce ed affidabile: il proxy di Apache.
Questo anche perche' il nodo herbert monta sia la scheda della LAN (192.168.1.x, dietro robusto firewall e proxy squid) che quella della DMZ (192.168.2.x), per cui l'idea di fondo era semplice: ho installato su seth ZoneMinder (il metodo pacchettizzato lo mette sotto /zm e /cgi-bin rispetto alla home-page), ed ho aggiunto (sotto /ps) il PHPSysInfo (dopo aver installato lm-sensors e hddtemp) per avere sotto controllo da remoto anche lo stato della macchina e delle varie temperature/ventoline [ed infatti su herbert un ventolone a lato dell'hard disk lo tiene costantemente sotto ai 40 gradi, mentre su seth, che gliene devo montare uno... ora stiamo sui 48 gradi O-: ].
E fin qui, tutto a posto, due righe (all'incirca) sul file /etc/apache2/sites-available/default e attivo il proxy:
# ZONEMINDER su Seth
<Location /zm>
  ProxyPass http://192.168.2.2/zm
  ProxyPassReverse http://192.168.2.2/zm
</Location>
<Location /cgi-bin>
  ProxyPass http://192.168.2.2/cgi-bin
  ProxyPassReverse http://192.168.2.2/cgi-bin
</Location>

# PHPSYSINFO su Seth
<Location /ps>
  ProxyPass http://192.168.2.2/ps
  ProxyPassReverse http://192.168.2.2/ps
</Location>
A questo punto i miei test effettuati sulla rete interna rivelano che tutto funziona perfettamente, salvo il momento in cui provo a visionare da fuori rete una telecamera di test che ho posto in laboratorio: chiunque si trova su internet ed apre la pagina del monitor, guarda un bel buco quadrato bianco al posto delle immagini...

Ma cos'e', ma cosa non e'? Finalmente nella serata mentre sono da un cliente provo ad aprire io la telecamera ed ecco svelato l'arcano: chiedo infatti di visionare il sorgente della pagina (in realta' del frame che contiene lo stream video) e mi si piazza davanti una cosuccia simpatica:
<img src="http://192.168.2.2/cgi-bin/nph-zms?mode=jpeg&monitor=1&scale=100&maxfps=5&rand=1195887199" alt="Laboratorio" border="0" width="352" height="288">
Oh, ma guarda un po', certo che nessuno vede dall'esterno le immagini della telecamera: cerca di caricarle dal nodo 192.168.2.2!
Uhm. Ravano nei sorgenti di ZoneMinder, e scopro l'arcano di cui sopra nel file zm.php (link simbolico con "index.php) nella cartella /usr/share/zoneminder: intorno alla riga 60 compare una riga:
else
{
  $protocol = 'http';
}
define ( "ZM_BASE_URL", $protocol.'://'.$_SERVER['HTTP_HOST'] );
if ( $_GET['format'] )
ed io subito ho proveduto a tritarla, in questo modo:
else
{
  $protocol = 'http';
}

##### MODIFICA DI GRIZZLY #####
#define( "ZM_BASE_URL", $protocol.'://'.$_SERVER['HTTP_HOST'] );
define ( "ZM_BASE_URL", '');
##### MODIFICA DI GRIZZLY #####

if ( $_GET['format'] )
ed ecco che, magicamente, quando ZoneMinder offre l'immagine non la carica da http://indirizzo-host/cgi-bin/..." ma solo da "/cgi-bin/..." e funziona perfettamente dall'esterno ((-:

1 commenti:

Grizzly ha detto...

Dimenticavo: se il server di destinazione del ProxyPass non e' raggiungibile (ad esempio perche' spento) Apache risponde generando un errore 502, che puo' essere gestito dalla direttiva ErrorDocument sia generica che della Location, con una riga del tipo:

# Notate la virgoletta iniziale
ErrorDocument 502 "Il server e' al momento spento o non raggiungibile