Pfsense captive portal: inviare vouchers via sms e mantenere il log

Per offrire un servizio internet a vari utenti (nel mio caso un centro di accoglienza diurno) è necessario mantenere il log degli accessi e dell’identità degli utenti, in maniera tale da mettere i dati a disposizione dell’autorità giudiziaria, se richiesto.

Pfsense già supporta il logging sul captive portal, e lo associa al singolo voucher, quindi se siete in grado di assegnare i voucher manualmente, di identificare i vari utenti e di collegare ogni voucher ad un utente siete a posto, potete smettere di leggere. Nel mio caso, però, gli operatori hanno già troppo da fare per poter gestire anche i voucher, e quindi c’era bisogno di qualcosa di automatico. In particolare l’idea era di far spedire i voucher via sms ai cellulari, come fanno molti provider commerciali. Questo ha due vantaggi: il primo che la distribuzione dei vouchers è automatica, il secondo che si può collegare ogni singolo voucher al numero di cellulare corrispondente. Se i cellulari sono italiani questo risponde anche all’obbligo di identificazione, poiché ad ogni sim è comunque collegata una identità verificata dall’operatore.

Ho scoperto che qualcosa del genere già esiste, liberamente disponibile su Sourceforge, e sichiama Vouchergenerator. Attualmente è alla versione 1.6, potete scaricarlo direttamente da Sourceforge. Ne allego anche una copia qui, just in case. Grazie a eagle2 per averlo creato e messo a disposizione di tutti.

Il software è in lingua tedesca ed inglese, qui mi riferisco sempre alla versione inglese. Non ha alcuna interazione con Pfsense, sarete voi che manualmente dovrete generare i vouchers ed esportarli in formato CSV per poi caricare il file esportato su Vouchergenerator. Il pacchetto si installa in un normale server LAMP (Linux, Apache, Mysql, Php), in una qualsiasi sottodirectory de vostro sito web. Potete seguire le istruzioni allegate al file zip. Unico accorgimento, la posizione delle directories che estrarrete dal file zip vanno leggermente modificate. In particolare se il vostro sito per generare i vouchers via sms si trova nella posizione www.miosito.org/sms/ allora la directory /sms/ dovrà contenere le directories smsrequest_en, smsrequest_de e tutto il contenuto della cartella vouchergenerator1.6 (il contenuto della cartella, non la cartella stessa!) Seguite le istruzioni fornite ed il software si installerà. Create il database dei vouchers importando il file CSV generato da Pfsense, come richiesto. Fate attenzione che nel tab Settings il valore Voucher table for text message deve corrispondere alla table name del campo databasetables, come indicato nella figura che segue (in questo caso voucher02), altrimenti avrete una serie di warnings quando provate a generare l’sms, e ci perdete svariate ore di sonno per fare il debugging (fatto!).

 

Prima di avere un sistema utilizzabile, però, vanno fatte delle modifiche. Il creatore del software è tedesco e quindi il software è pensato per i numeri telefonici tedeschi e si appoggia ad un service provider di sms tedesco, ovvero smsflatrate. Poiché probabilmente siete interessati invece a mandare, come me, i vouchers via sms a delle sim italiane, dovrete fare alcune modifiche al codice php. Le modifiche che vi descrivo sotto sono per mandare sms a sim italiane utilizzando il servizio sms del provider Aruba.  Se preferite altri providers dovrete cambiare il codice php di conseguenza, a condizione che il provider scelto offra una API HTTP con il metodo GET.

Cominciamo dalla prima modifica, ovvero cambiare i prefissi tedeschi con i prefissi italiani.
Nel file include/sms_api.php, linea 22, dovete cambiare la linea da

$dest="00491" . $empf;

in

$dest="%2b393" . $empf;

ovverosia si inserisce il prefisso +39 ed il 3 che è la prima cifra di tutti i numeri cellulari italiani.

La seconda modifica è da fare alla linea 25, che va modificata da:

$fileOpenTRI = "https://www.smsflatrate.net/schnittstelle.php?key=" . $settings['sms_gtwkey'] . "&to=" . $dest . "&text=" . $text . "&type=3";

a

$fileOpenTRI = "http://admin.sms.aruba.it/sms/send.php?" . $settings['sms_gtwkey'] . "&rcpt=" . $dest . "&data=" . $text . "&sender=null&qty=ll";

Bisogna ora fare in modo che siano selezionabili i prefissi italiani. La modifica che segue va fatta sia nel file sms.php che nel file smsrequest_en/index.php. In entrambi i file troverete una blocco di questo tipo:

<select name="handyvorwahl">
<option value="50">0150</option>
<option value="51">0151</option>
<option value="52">0152</option>
<option value="57">0157</option>
<option value="59">0159</option>
<option value="60">0160</option>
<option value="61">0161</option>
<option value="62">0162</option>
<option value="63">0163</option>
<option value="64">0164</option>
<option value="70">0170</option>
<option value="71">0171</option>
<option value="72">0172</option>
<option value="73">0173</option>
<option value="74">0174</option>
<option value="75">0175</option>
<option value="76">0176</option>
<option value="77">0177</option>
<option value="78">0178</option>
<option value="79">0179</option>
</select>

Il blocco va modificato come segue (i prefissi vengono da Wikipedia ):

 

<select name="handyvorwahl">
<option value="20">320</option>
<option value="24">324</option>
<option value="27">327</option>
<option value="28">328</option>
<option value="29">329</option>
<option value="30">330</option>
<option value="31">331</option>
<option value="33">333</option>
<option value="34">334</option>
<option value="35">335</option>
<option value="36">336</option>
<option value="37">337</option>
<option value="38">338</option>
<option value="39">339</option>
<option value="40">340</option>
<option value="42">342</option>
<option value="44">344</option>
<option value="45">345</option>
<option value="46">346</option>
<option value="47">347</option>
<option value="48">348</option>
<option value="49">349</option>
<option value="50">350</option>
<option value="51">351</option>
<option value="53">353</option>
<option value="60">360</option>
<option value="66">366</option>
<option value="68">368</option>
<option value="70">370</option>
<option value="71">371</option>
<option value="73">373</option>
<option value="75">375</option>
<option value="77">377</option>
<option value="80">380</option>
<option value="84">384</option>
<option value="85">385</option>
<option value="88">388</option>
<option value="89">389</option>
<option value="91">391</option>
<option value="92">392</option>
<option value="93">393</option>
</select>

A questo punto l’ultima cosa da fare prima di poter mandare il primo sms è inserire i propri dati identificativi del servizio sms di Aruba.  Lo potete fare nel tab Settings, nel campo smsflatrate.net-Gateway-Key . Poiché stiamo utilizzando Aruba e non Smsflatrate dovremo inserire non la loro gateway-key ma user e password assegnataci da Aruba, nel formato:

user=Sms12345&pass=qwerty89

Ovviamente dovrete modificare i dati con i vostri dati di accesso al servizio sms di Aruba.

A questo punto il sistema dovrebbe funzionare, attraverso la pagina www.miosito.org/sms/ sarete in grado di amministrare il sistema, mentre alla pagina www.miosito.org/sms/smsrequest_en i vostri utenti potranno richiedere il voucher (ricordate di inserire questo link nella white list del vostro captive portal). Il software che avete installato ha avarie altre features, tipo la generazione di un pdf con i vouchers da distribuire manualmente. tenete presente che se un voucher è stampato non può essere inviato per sms e viceversa. In pratica stampare o inviare un voucher lo toglie da quelli disponibili. Inoltre ogni numero telefonico può richiedere massimo un voucher al giorno. La durata dei vouchers ovviamente la definite voi in fase di generazione.

L’ultima cosa da fare è attivare il logging dei vouchers associati al numero telefonico richiedente. Per far questo dovrete inserire nel file include/sms_api.php, subito dopo la linea 25, le seguenti linee:

 

$logfile='/var/www/www.miosito.org/sms/logs/'.date('Ymd').'_vouchers.txt';
$logentry=$data."\t"."3".$empf."\t".date('d-m-Y_H:i')."\n";
file_put_contents($logfile, $logentry, FILE_APPEND | LOCK_EX);

Tenete presente che la directory /logs/ deve esistere con i permessi appropriati e che il path deve essere assoluto. Nell’esempio è come apparirebbe in un sistema Ubuntu, ma naturalmente può variare. Consultate la documentazione di Apache, se avete problemi.

Se tutto funziona ogni voucher inviato via sms viene registrato sul file di log del giorno corrente. Ogni giorno viene creato un nuovo file di log con un nuovo nome.  A questo punto se avete salvato log di Pfsense e dovete fornire delle informazioni al riguardo analizzando i due file del giorno in questione siete in grado di sapere quale utente (corrispondente ad una data sim) ha fatto cosa.