VoIP and Hacking | Consulenza Documentazione

Integrazione tra Asterisk e Motion

by admin on May.25, 2010, under Asterisk, Hacking, Linux, Sicurezza, Telefonia

Nell’ambito di una soluzione di video/tele/sorveglianza un server Motion ed uno Asterisk rappresentano un connubio ideale, per la semplicità dell’integrazione, che pure implica una comunicazione bidirezionale.
Ognuno dei due processi server deve essere in grado, al verificarsi di eventi preprogrammati, di agire in modo specifico sull’altro processo.

In particolare, e per quanto riguarda la interazione Asterisk —-> Motion, al verificarsi da parte del server telefonico della circostanza di una chiamata (autenticata), si tratta della attivazione/disattivazione/interrogazione del server Motion.

L’accesso alla applicazione è quantomai opportuno che sia sottoposto ad autenticazione e contemporaneamente attuabile solo a partire da determinati terminali telefonici fissi o mobili.
L’utilizzo incrociato di questi due criteri di sbarramento, non esattamente insormontabili, finisce per diventare una soluzione accettabile, per la sicurezza, quando la si accompagni con una rigenerazione periodica delle chiavi numeriche.

Tutto sommato, per tagliare la testa al toro, ovvero alla possibilità che un sistema di sorveglianza si trasformi in un elemento vulnerabile, la funzionalità di disattivazione (intendo quella attraverso interfaccia telefonica) la si può anche, piuttosto saggiamente, escludere del tutto.

Nel dialplan del server Asterisk potremmo in pratica utilizzare l’applicazione Authenticate, il cui scopo è quello di autenticare l’accesso al sistema telefonico tramite l’introduzione di una password numerica (in questo caso specifico 24759213). L’accesso, inoltre, può venire ristretto ad uno o più numeri chiamanti specificati (in questo caso specifico il numero 0438984234):

[motion_handle]
exten => 0438984564,1,Ringing
exten => 0438984564,n,Wait(2)
exten => 0438984564/0438984234,n,Authenticate(24759213)
exten => 0438984564/0438984234,n,System(/usr/local/bin/start_mot.sh)
exten => 0438984564/0438984234,n,NoOp(${SYSTEMSTATUS})
exten => 0438984564,n,Hangup

L’autenticazione con esito positivo causa l’utilizzo del comando System (che non è altro che una chiamata alla omonima funzione C), passandogli come argomento il pathname di uno script bash.

Lo script (bash start_mot.sh) è semplicissimo:

#!/bin/bash
echo "VERBOSE"
P=`ps -ef | grep motion | grep -v grep`
if [ "x$P" == "x" ];
then su -c “/usr/bin/motion” ;
fi

Effettua un semplicissimo (e rozzo) controllo sulla eventuale presenza di un processo “motion” nella lista dei processi in esecuzione, dopodiché, in caso di esito negativo semplicemente lo avvia.

Per simulare il comportamento di una chiamata dall’esterno su 0438984564 da parte di 0438984234 (entrambi numeri di fantasia) è stato sufficiente attribuire al peer SIP il parametro callerid=0438984234 nella propria sezione di sip.conf

Questo il riscontro in console:

-- Executing [0438984564@motion_handle:1] Ringing(”SIP/snom-00000002″, “”) in new stack
– Executing [0438984564@motion_handle:2] Wait(”SIP/snom-00000002″, “2″) in new stack
– Executing [0438984564@motion_handle:3] Authenticate(”SIP/snom-00000002″, “24759213″) in new stack
– Playing ‘agent-pass.gsm’ (language ‘en’)
– Playing ‘auth-incorrect.gsm’ (language ‘en’)
– Playing ‘auth-thankyou.gsm’ (language ‘en’)
– Executing [0438984564@motion_handle:4] System(”SIP/snom-00000002″, “/usr/local/bin/start_mot.sh”) in new stack
– Executing [0438984564@motion_handle:5] NoOp(”SIP/snom-00000002″, “SUCCESS”) in new stack
– Executing [0438984564@motion_handle:6] Hangup(”SIP/snom-00000002″, “”) in new stack

L’esempio è volutamente ridotto all’osso, ma può essere utilizzato come base per ulteriori sviluppi: ad esempio un menu vocale che permetta la scelta, ad autenticazione avvenuta, fra la semplice verifica sullo stato attuale del servizio (operativo/non operativo) con conseguente emissione di un messaggio informativo, e la sua attivazione; e che tuttavia preveda una verifica dell’avvenuta operazione più accurata della semplice restituzione della variabile ${SYSTEMSTATUS}, che di per sè stessa, anche quando vale “SUCCESS”, non offre alcuna garanzia che il server motion sia stato realmente avviato, ma solo che si sia mandato in esecuzione lo script.

Passiamo ora ad esaminare l’interazione inversa, ovvero l’interazione Motion —-> Asterisk.

Si tratta semplicemente di fare in modo che, al verificarsi della rilevazione di un movimento, corrisponda una chiamata telefonica che notifichi l’evento.
In particolare, nella sezione External Commands del file motion.conf, il parametro on_event_start sembrerebbe essere il posto più adatto per generarla:

on_event_start /usr/local/bin/asterisk_alarm.sh

asterisk_alarm.sh dovrebbe essere uno script che avvia la chiamata informativa utilizzando una delle tecniche possibili con Asterisk: l’interfaccia manager (sulla porta TCP 5038) oppure un call-file nello spool (outgoing).
Vediamo un esempio di quest’ultimo tipo:

# cat /usr/local/bin/asterisk_alarm.sh
#!/bin/bash
echo "Channel: SIP/snom" >/tmp/ast_alarm.txt
echo "Context: motion_alarm" >>/tmp/ast_alarm.txt
echo "Extension: s" >>/tmp/ast_alarm.txt
echo "MaxRetries: 1" >>/tmp/ast_alarm.txt
echo "RetryTime: 10" >>/tmp/ast_alarm.txt
mv /tmp/ast_alarm.txt /var/spool/asterisk/outgoing/ast_alarm.call

Lo script fa riferimento, nel dialplan, ad una sezione del genere:

[motion_alarm]
exten => s,1,Wait(1)
exten => s,n,Answer()
exten => s,n,Playback(alarm/motion_detected)
exten => s,n(end),Hangup()

e questo il riscontro sulla console di Asterisk:

-- Attempting call on SIP/snom for s@motion_alarm:1 (Retry 1)
== Using SIP RTP CoS mark 5
== Using SIP VRTP CoS mark 6
-- Executing [s@motion_alarm:1] Wait(”SIP/snom-00000006″, “1″) in new stack
– Executing [s@motion_alarm:2] Answer(”SIP/snom-00000006″, “”) in new stack
– Executing [s@motion_alarm:3] Playback(”SIP/snom-00000006″, “alarm/motion_detected”) in new stack
– Playing ‘alarm/motion_detected.gsm’ (language ‘en’)
– Executing [s@motion_alarm:4] Hangup(”SIP/snom-00000006″, “”) in new stack
== Spawn extension (motion_alarm, s, 4) exited non-zero on ‘SIP/snom-00000006′

Anche in questo caso l’esempio è ridotto al minimo, ma puntualmente funzionante, anche se, nella realtà, non andrà utilizzata una destinazione SIP, ma più opportunamente un channel Dahdi (ad es. Channel: Dahdi/g1/3485648238), per questioni di reperibilità del destinatario.

Send post as PDF to PDF | PDF Creator | PDF Converter
:, , , , , , ,

Comments are closed.

Cerchi qualcosa in particolare?

Usa il form qui sotto per cercare nel sito:

Blogroll!

Alcuni links...

Archives

Tutte le entries, in ordine cronologio...