Asterisk Voip

Business Applications Asterisk, un sistema PBX Open Source Usare un sistema in grado di gestire il voice over IP e le l...

0 downloads 259 Views 448KB Size
Business Applications

Asterisk, un sistema PBX Open Source Usare un sistema in grado di gestire il voice over IP e le linee telefoniche convenzionali, gestire la posta vocale ed eseguire applicazioni tipo CGI per gli utenti del sistema telefonico di Brett Schwarz

A

llora, avete deciso di implementare un sistema PBX (Private Branch eXchange) per la vostra piccola azienda. Oppure, avete bisogno di un sistema di posta vocale da usare sulla vostra macchina Linux di casa. Che ne dite di un sistema IVR (interactive voice response) per l’automazione domestica? Non sarebbe male disporre anche delle capacità VoIP (Voice over IP). Cosa si può fare? Una soluzione molto interessante e potente è rappresentata da Asterisk: si tratta di un sistema PBX GPLed creato su Linux, in grado di colmare i vuoti esistenti tra la telefonia tradizionale (come la vostra linea telefonica) e la tecnologia VoIP. Asterisk supporta inoltre una serie di ulteriori funzionalità, che lo rendono una soluzione particolarmente attraente. In questo articolo analizzeremo alcune di queste funzionalità e vi forniremo una quantità di informazioni sufficiente per iniziare, senza bisogno di acquistare nessun hardware speciale.

bero avere IAX, SIP, H.323 e una normale linea telefonica connessa tramite Asterisk (vedere la figura 1 - gentilmente fornita da Digium). Lo sviluppatore può estendere Asterisk lavorando con la API C, oppure usando gli AGI - che sono analoghi agli script CGI. Gli AGI si possono sviluppare in qualsiasi linguaggio e vengono eseguiti da un processo esterno. Rappresentano il modo più semplice e più flessibile per estendere le capacità di Asterisk (vedere il listato 1). Per cominciare

Una release ufficiale non è disponibile ormai da un certo tempo, ma secondo alcune voci ce n’è una in arrivo. Attualmente, il modo migliore per procurarsi Asterisk è tramite CVS: export CVSROOT=\ :pserver:[email protected]:/usr/cvsroot cvs login (password is “anoncvs”) cvs co asterisk

Se prevedete di usare una scheda PCI di Digium, è opportuno dare un’occhiata anche a zaptel. Se prevedete di avere la connettività, è opportuno controllare libpri. Dal momento che non esiste nessuno script di configurazione, si usa semplicemente make. Per compilare Asterisk in modo appropriato è necessario avere anche readline, OpenSSL e Linux 2.4.x con installati i sorgenti del kernel:

Un po’ di storia

Asterisk è un progetto open source sponsorizzato da Digium. Il suo manutentore principale è Mark Spencer, ma la comunità ha contribuito a numerose patch. Nel momento in cui scriviamo, il sistema funziona soltanto su Linux per Intel; in ogni caso, in passato è stato ottenuto un certo successo con Linux PPC ed è in corso il lavoro per portare Asterisk su *BSD. Digium commercializza anche vari componenti hardware in grado di operare con Asterisk (vedere il riquadro Risorse). Questi componenti sono delle schede PCI che permettono di connettere al computer le normali linee telefoniche analogiche. Viene supportato anche altro hardware, come i dispositivi prodotti da Dialogic e Quicknet. Asterisk dispone di un proprio protocollo VoIP chiamato IAX, ma supporta anche il SIP e l’H.323. Tutto ciò ci porta a una delle funzionalità più potenti di Asterisk: la capacità di connettere diverse tecnologie all’interno dello stesso ambiente particolarmente ricco di funzionalità. Per esempio, si potreb-

36



MAGGIO 2004 - www.linuxjournal.it - www.hitechshop.it

cd asterisk make clean install samples

Figura 1. Asterisk può connettere le normali linee telefoniche e molteplici standard VoIP.

Questo comando compila Asterisk, lo installa e installa anche i file di configurazione esemplificativi. L’ultimo target sovrascrive tutti i file di configurazione eventualmente esistenti; di conseguenza, se desiderate mantenerli, saltate questo target oppure effettuate il backup di tutti i file di configurazione preesistenti. Se usate zaptel o ISDN, compilateli prima di compilare Asterisk. Per default, Asterisk viene installato in /usr/sbin/, mentre i file di configurazione sono contenuti in /etc/asterisk/. I messaggi di posta vocale vengono archiviati in /var/spool/asterisk/voicemail/. I CDR per la fatturazione e i file di log si trovano sotto /var/log/asterisk/. È possibile avviare Asterisk digitando asterisk sulla linea di comando. In ogni caso, il modo migliore di usare Asterisk nella fase di testing consiste nell’eseguirlo con le opzioni vvvc. L’opzione -vvv è relativa a un output extra-verboso, mentre l’opzione -c fornisce un prompt a console che permette di interagire con il processo Asterisk. Per esempio, è possibile impartire dei comandi ad Asterisk - come i comandi di gestione e di stato. L’operatività e la funzionalità di Asterisk sono basate su vari file di configurazione. In questo articolo ne prenderemo in considerazione soltanto tre, ma ne esistono molti altri. In Listato 1. Script AGI esemplificativo per l’ID del chiamante #!/bin/sh # \ exec tclsh “$0” ${1+”$@”} set port 10000 set hosts [list 192.168.123.166 192.168.123.168] ## ## Sends the info to the hosts ## proc sendInfo {ip_ port_ callerid_} { if {[catch {socket $ip_ $port_} sock]} { return } fconfigure $sock -buffering line puts $sock $callerid_ close $sock return } ## ## We get all of the variables from stdin; ## they start with “agi_”; and populate ## an array with the values. ## while {[gets stdin l] > 0} { if {[regexp {^agi_([\w]+):[\s]+(.*)} $l -> k v]} { set AGI($k) $v } } ## ## Send the callerid info to each host ## that we have listed ## foreach H $hosts { sendInfo $H $port $AGI(callerid) }

questo caso intendiamo configurare Asterisk in modo che gli utenti possano chiamarsi reciprocamente tramite IAX. Andremo inoltre a configurare la posta vocale e forniremo agli utenti un modo per gestire i messaggi di posta vocale. Il dialplan

Prima di addentrarci nella configurazione di Asterisk, è opportuno avere una conoscenza generica del dialplan. Questo elemento è particolarmente flessibile e potente, ma potrebbe anche confondere le idee. Il dialplan viene usato per definire le traduzioni dei numeri e il routing; di conseguenza, rappresenta il centro di Asterisk. Il dialplan definisce i contesti, che sono dei container per le estensioni (pattern di cifre) in grado di fornire funzionalità specifiche. Per esempio, potrebbe essere necessario fornire un contesto alle persone che sono in ufficio oppure a casa, in modo che abbiano certi privilegi di chiamata. È possibile anche configurare un contesto esterno o guest, che consente unicamente delle capacità di chiamata limitate (per esempio, soltanto urbane). I nomi dei contesti sono racchiusi tra parentesi ([]). Le estensioni associate al contesto seguono il nome. Ciascuna estensione può avere varie fasi (priorità) associate. Il flusso della chiamata prosegue sequenzialmente fino a quando un’applicazione restituisce -1, la chiamata viene conclusa, oppure l’applicazione ridirige il flusso della chiamata. La sintassi di un elemento di estensione ha l’aspetto seguente: exten => ,,

Ecco un paio di esempi: exten => 9911,1,Wait(1) exten => 9911,2,Dial(Zap/1/${EXTEN:1})

Un’estensione viene denotata attraverso l’uso di exten =>. In questo esempio, 9911 è l’estensione; 1 e 2 sono le priorità o gli ‘step number’ (che devono essere sequenziali); Wait e Dial sono le applicazioni. Asterisk usa le applicazioni per elaborare ogni fase all’interno di un’estensione. È possibile ottenere aiuto sulle diverse applicazioni dalla console Asterisk, digitando show applications per elencare le applicazioni supportate, oppure show application per visualizzare il messaggio di aiuto. Il confronto tra le estensioni può essere effettuato sui numeri chiamati, oltre che sul numero chiamante. Ciò permette di ottenere una maggiore flessibilità quando si elaborano le chiamate. Si possono usare anche i pattern, che vengono preceduti dal carattere di sottolineatura (_): • • • •

N - singolo numero compreso tra 2 e 9. X - singolo numero compreso tra 0 e 9. [12-4] - qualsiasi numero racchiuso tra le parentesi. . - wild card.

www.hitechshop.it - www.linuxjournal.it - MAGGIO 2004 ■

37

Business Applications

Per esempio, l’estensione_NXX5551212 corrisponde a qualsiasi numero di informazioni, indipendentemente dal prefisso. Le estensioni possono essere costituite da qualsiasi stringa alfanumerica. Alcuni caratteri speciali sono integrati: •

s - comincia qui se non viene ricevuto nessun numero composto, come nel caso di una chiamata in arrivo da una linea analogica. t - usato in presenza di un timeout. i - usato per i numeri composti non validi. o - estensione dell’operatore. h - estensione di chiusura della comunicazione.

• • • •

Creare gli utenti IAX

Il primo file che andremo a creare è iax.conf (vedere il Listato 2). Questo file controlla l’uso del protocollo IAX e definisce i suoi utenti. Il protocollo è caratterizzato da due versioni: quella vecchia è IAX, mentre quella nuova è IAX2. La prima sezione del file di configurazione è la sezione general, che definisce i parametri relativi al protocollo IAX. Vengono elencati quattro parametri, ma se ne possono definire anche altri. Il parametro port indica il numero di porta attraverso cui comunica il protocollo IAX. Il valore di default è 5036; di conseguenza, strettamente parlando, questo elemento non è necessario. È possibile usare il parametro bindaddr per indicare ad Asterisk che deve legarsi a un indirizzo IP specifico - nel caso di macchine con molteplici schede Ethernet. Un bindaddr di 0.0.0.0 cerca di legarsi a tutti gli indirizzi IP. I parametri amaflags e accountcode vengono usati per i CDR. Quando vengono definiti nella sezione Listato 2. Il file iax.conf. [general] port=5036 bindaddr=0.0.0.0 amaflags=default accountcode=home [brett] type=friend host=dynamic secret=brettsecret context=cg1 callerid=”brett <111>”

general, questi parametri vengono usati come valori di default. È possibile definirli anche per ogni singolo utente. I valori che amaflags può accettare sono billing, documentation, omit e default. accountcode può essere un valore arbitrario. Per questa configurazione, abbiamo usato home per gli utenti locali nella nostra LAN e external per gli utenti esterni alla LAN. Sono stati omessi molti altri parametri, la maggior parte dei quali è tuttavia legata alle prestazioni. Le sezioni rimanenti sono delle definizioni dell’utente. Abbiamo tre utenti: brett, maria e niko. La definizione type ha tre valori possibili: un pari può ricevere chiamate, un utente può effettuare chiamate e un amico può compiere entrambe le operazioni. Abbiamo definito tutti gli host come dinamici; in ogni caso, se qualche host ha un indirizzo IP statico, è possibile specificare quello. secret è la password che l’utente dovrà fornire quando si connette a questo server Asterisk. In questo file vengono usati due contesti per gli utenti: [cg1] e [cg2]. Li analizzeremo in maggiore dettaglio quando passeremo a esaminare il file extensions.conf; in ogni caso, questi contesti attivano i privilegi di chiamata per ogni utente. Configurare la posta vocale

Il file successivo è voicemail.conf (Listato 3). Anche in questo caso, il file dispone di una sezione general che gestisce i parametri generali o globali per la posta vocale. Il primo parametro, format, elenca il formato audio dei messaggi. I due parametri successivi vengono usati per la notifica via email: serveremail è l’indirizzo e-mail sorgente (campo from), mentre attach indica ad Asterisk che deve allegare il messaggio all’e-mail. Nel nostro esempio non desideriamo che il messaggio venga allegato. Anche in questo caso sono stati omessi alcuni parametri. è il numero usato per salvare e accedere ai messaggi per ogni utente. Viene usato in extensions.conf anche per dirigere il flusso della chiamata verso la casella di posta vocale appropriata. L’uso del parametro si rende necessario quando si controllano i messaggi. è il nome dell’utente. e sono gli indirizzi email e che vengono usati per inviare le notifiche dei messagListato 3. Il file voicemail.conf.

[maria] type=friend host=dynamic secret=mariasecret context=cg1 callerid=”maria <222>”

[general] format=gsm|wav49|wav serveremail=asterisk attach=no maxmessage=180 maxgreet=60

[niko] type=friend host=dynamic secret=nikosecret context=cg2 accountcode=external callerid=”Niko <333>”

; ; Voicemail box definitions. ; mbox# => password,name,email,pager/mobile ; [cg1] 111 => 1111,Brett,[email protected] 222 => 2222,Maria,[email protected],[email protected]

38



MAGGIO 2004 - www.linuxjournal.it - www.hitechshop.it

gi. L’indirizzo e-mail pager è caratterizzato da un messaggio più breve, dal momento che deve venire letto su dispositivi più piccoli (cercapersone e telefoni cellulari). Molti provider di servizi mobili e cercapersone dispongono di gateway email in grado di fornire il messaggio al dispositivo. Definire le estensioni

L’ultimo file che prendiamo in considerazione è rappresentato da extensions.conf (Listato 4). Si tratta di uno dei file più complessi, dal momento che contiene il dialplan. Nel nostro esempio, il dialplan è piuttosto semplice rispetto alle capacità che offre. Il file dispone di una sezione general e di una sezione global. La sezione general è simile a quella dei file precedenti e definisce i parametri generici. In questo esempio non viene definito nessun parametro generico. La sezione global viene usata per definire le variabili globali. È possibile accedere a queste variabili nel dialplan usando la sintassi ${VARIABLE}. Abbiamo definito una variabile: TIMEOUT è il timeout di risposta. All’interno del dialplan si possono usare anche delle variabili integrate, come CONTEXT, EXTEN e CALLERID. Tutte le altre sezioni sono definizioni dei contesti. Un contesto è semplicemente un raggruppamento di pattern di cifre. Qui abbiamo definito vari contesti, che definiscono gli scenari di chiamata: voicemail, iax e afterhours. Si può pensare a questi elementi come a mini-dialplan o dialplan individuali. Successivamente, andiamo a definire due contesti che vengono assegnati agli utenti. Tramite la parola chiave include, essi ereditano le capacità degli altri contesti che abbiamo già definito. Il primo contesto, voicemail, elenca i pattern di cifre che consentono all’utente di accedere ai suoi messaggi di posta vocale. Gli utenti possono comporre 6245 per fare in modo che l’applicazione VoicemailMain2 chieda di inserire il numero e la password della casella di posta. Gli utenti potranno quindi gestire (ascoltare, cancellare e così via) i messaggi nella loro casella di posta. Il contesto iax viene usato per le chiamate PBX tra utenti IAX. Abbiamo definito varie estensioni per ciascuno degli utenti. Un elemento con il nome dell’utente (maria) effettua una ridirezione sull’elemento extension number. Per l’estensione 111 viene effettuata una corrispondenza anche sul cal-

lerid. Se il callerid corrisponde, ne viene cambiato il nome in modo che assuma un significato relativo. Per esempio, se l’estensione digitata è 111 e il callerid è 222, il nome del callerid viene cambiato in “it’s your wife!”. Questo messaggio viene visualizzato sul mio client ogni volta che chiama mia moglie (tralascererò la spiegazione di come usarlo a mio vantaggio). L’ultimo contesto di pattern di cifre viene usato per le chiamate che arrivano a tarda ora. Dal momento che non desideriamo venire disturbati di notte da utenti esterni, facciamo corrispondere qualsiasi numero composto (_.). Dopo un’attesa di un secondo, il sistema risponde alla chiamata. Successivamente alla risposta, viene riprodotto un messaggio in modo che il chiamante possa scegliere a quale persona a lasciare il suo messaggio (“for brett, press 1”). Di conseguenza, se il chiamante preme 1 la chiamata procede all’elemento 1,1,Voicemail2(111), che invia l’utente alla casella di posta 111. Questa è una semplice illustrazione di come sia possibile costruire un sistema IVR. Listato 4. Il file extensions.conf [globals] TIMEOUT=12 [misc] exten => exten => exten => exten =>

t,1,PlayBack(timeout) t,2,Hangup() i,1,PlayBack(invalid) i,2,Hangup()

; voicemail management [voicemail] include => misc exten => 6245,1,VoiceMailMain2() exten => 6245,2,Hangup [iax] include => misc exten => 111/222,1,SetCIDName(“it’s your wife!”) exten => 111/222,2,agi(callerid.agi) exten => 111/222,3,Dial(IAX/brett/s,${TIMEOUT}) exten => 111/222,4,Voicemail2(111) exten => 111,1,agi(callerid.agi) exten => 111,2,Dial(IAX/brett/s,${TIMEOUT}) exten => 111,3,Voicemail2(111) exten => 222,1,Dial(IAX/maria/s,${TIMEOUT}) exten => 222,2,Voicemail2(222) exten => maria,1,Goto(iax,222,1) exten => 333,1,Dial(IAX/niko/s,${TIMEOUT}) [afterhours] include => misc exten => _.,1,Wait(1) exten => _.,2,Answer exten => _.,3,Background(vm-menu) exten => 1,1,Voicemail2(111) exten => 2,1,Voicemail2(222) exten => 3,1,Voicemail2(333) [cg1] include => iax include => voicemail

Figura 2. Un’applicazione GUI mostra le informazioni sull’ID del chiamante per le chiamate in entrata.

[cg2] include => afterhours|1:00-6:00|*|*|* include => iax

www.hitechshop.it - www.linuxjournal.it - MAGGIO 2004 ■

39

Business Applications

I contesti [cg1] e [cg2] includono una funzionalità che è stata già definita all’interno di altri contesti. Ciò permette di creare con facilità diversi gruppi di utenti. Per esempio, [cg1] dispone di tutte le capacità che abbiamo già definito, mentre [cg2] dispone soltanto delle capacità iax e in tarda ora viene diretto alla posta vocale. È possibile creare delle potenti capacità di chiamata utilizzando la flessibilità del dialplan di Asterisk. Il nostro esempio vi ha consentito soltanto di farvi un’idea delle possibilità offerte. È possibile semplificare il dialplan anche usando le macro, ma lasceremo ai lettori questo esercizio. Usare AGI

Nel file extensions.conf, un elemento chiamato callerid.agi chiama uno script AGI. Si tratta di un semplice esempio che illustra l’interfaccia AGI. Lo script si trova nella directory /var/lib/ asterisk/agi-bin/ e viene invocato da Asterisk come processo esterno. AGI e Asterisk comunicano tramite stdin, stdout e stderr. Le variabili vengono passate ad AGI attraverso stdin, mentre AGI può ripassare le informazioni ad Asterisk attraverso stdout. I messaggi destinati alla console Asterisk vengono scritti su stderr. Ad AGI vengono passati sempre due parametri: il path completo di AGI e gli argomenti che vengono passati ad AGI tramite l’elemento exten. AGI raccoglie il callerid e lo invia a un’applicazione GUI in funzione su un’altra macchina. Questa applicazione GUI si può ottenere presso il nostro sito Web (vedere la Figura 2). Gli script AGI si possono usare anche per recuperare informazioni. Se è necessario interrogare un database per ottenere informazioni sulla chiamata o sull’utente, potete usare anche l’interfaccia AGI.

Figura 3. Gnophone di Digium è un client telefonico software che si può usare con Asterisk

40



MAGGIO 2004 - www.linuxjournal.it - www.hitechshop.it

Effettuare una chiamata

Adesso che cosa possiamo fare? Dopo avere creato i file di configurazione di cui sopra e avviato Asterisk (asterisk -vvvc), possiamo provare a effettuare alcune chiamate. Attualmente, la disponibilità di client soft IAX è limitata. Sono disponibili anche dei client soft SIP - tra cui kphone e xten - e alcuni client hard di Cisco, SNOM e altri produttori che funzionano con Asterisk; in ogni caso, in questo articolo ci concentreremo sull’uso di IAX. Gnophone (Figura 3) è il client più vecchio, sviluppato da Digium. È stato effettuato del lavoro anche su un client interpiattaforma, oltre che su un client Windows. Presso SourceForge è disponibile un ulteriore client, che appartiene al tel Project. Abbiamo modificato l’interfaccia utente di questo client (Figura 4). Pur trattandosi di software ancora in fase alfa, è funzionante. In effetti, abbiamo usato questo client per instaurare una chiamata tra la Germania (Reinhard Max), l’Australia (Steve Landers) e gli USA (chi scrive). Qualunque sia il client utilizzato, bisogna definire il proprio nome-utente, la password e il contesto per ogni server Asterisk al quale si desidera connettersi. Successivamente si potrà chiamare chiunque sia definito nel file iax.conf (se il dialplan è configurato correttamente). Di conseguenza, se voglio chiamare mia moglie posso digitare semplicemente 222, oppure posso digitare maria (dal momento che ho definito questo elemento nel dialplan). Se desidero controllare i miei messaggi di posta vocale, posso digitare 6245. Conclusioni

Figura 4. Software alfa, ma funzionante: una versione modificata del client del tel Project.

Abbiamo soltanto effettuato una veloce carrellata su alcune delle capacità di Asterisk, ma l’articolo dovrebbe fornire al lettore un’idea delle sue potenzialità. Asterisk scala bene dalle piccole configurazioni a quelle più grandi e complesse. Per esempio, è possibile connettere i server Asterisk in ubicazioni diverse tramite il protocollo IAX, creando un PBX virtuale. Dal momento che questo software funziona su Linux, è possibile sfruttare i tool già esistenti per migliorare l’interfaccia e la gestione di Asterisk. Per

esempio, si potrebbe avere l’accesso Web a CDR, file di configurazione e posta vocale. In effetti, Asterisk viene fornito con uno script CGI che consente di accedere ai messaggi di posta vocale usando un browser Web. Incoraggiamo i lettori a esplorare ulteriormente Asterisk e sfruttare le sue potenti funzionalità.

Risorse Informazioni su AGI: home.cogeco.ca/~camstuff/agi.html “Asterisk: A Bare-Bones VoIP Example” di John Todd (configurazione di Asterisk e SIP): www.onlamp.com/pub/a/onlamp/2003/07/03/asterisk.html

Ringraziamenti

Client Asterisk: tel.sf.net

Vorremmo ringraziare Digium, Reinhard Max e Steve Landers per la loro assistenza alla stesura di questo articolo.

Forum Asterisk: www.pbxtech.info/forumdisplay.php?f=113 Asterisk HOWTO (Beta): megaglobal.net/docs/asterisk/html

L’autore Brett Schwarz vive vicino a Seattle, Washington. Pur avendo familiarità con varie piattaforme, la sua piattaforma preferita è Linux. Può contare su molti anni di esperienza di lavoro sui sistemi di telecomunicazione. È possibile contattarlo tramite la sua home page, all’indirizzo www.bschwarz.com.

Asterisk Wiki: www.voip-info.org/wiki-Asterisk Sito Web di
On Demand Per il download della versione originale inglese: www.dossier.duke.it codice documento: L118-6769

Note su Asterisk: asterisk.drunkcoder.com Moduli Perl per Asterisk e altre informazioni: asterisk.gnuinter.net Client IAX per Windows: laser.com/dante/diax/diax.html

Dossier On Demand Un’informazione rapida, completa ed efficiente su questi temi? Enterprise Application Integration Storage Systems

www.eai.duke.it www.storage.duke.it

Blackout - Disaster Prevention

www.blackout.duke.it

Soluzioni gestionali avanzate

www.gestionali.duke.it

Atti convegno iSeries World Security e Web security

www.iseriesworld.duke.it www.security.duke.it

www.hitechshop.it - www.linuxjournal.it - MAGGIO 2004 ■

41