Truelite Phone Server¶
Avvertenze¶
Questo è un pacchetto fittizio, non esiste una pacchettizazione di Asterisk, restano associate a questa voce solo della documentazione tecnica relativa ad Asterisk.
Introduzione¶
Documentazione tecnica che descrive la realizzazione dell'attuale centralino VoIP presente in sede truelite a Firenze.
Risorse Utilizzate¶
Configurazione Hardware¶
- Server Dell
- Scheda Digium TM400P per connessione con la telefonia analogica.
- Telefoni IP basati su chip PA168S con firmware v 1.53 "h3. Configurazione Software
- Debian GNU/Linux 3.1 (Sarge)
- Kernel 2.6.8-3-686-smp
- Asterisk 1.2.10-BRIstuffed-0.3.0-PRE-1q
Requisiti Individuati (analisi macroscopica)¶
1. Realizzazione del traffico voce interno.
1. Realizzazione del servizio di vocemail personale e azienndale.
1. Realizzazione di un menu IVR per lo smistamento delle chiamate
1. Integrazione con il servizio di telefonia [[VoIP]] di eutelia.
1. Integrazione con il servizio di telefonia PSTN di telecom italia.
1. Integrazione con i telefoni analogici esistenti.
1. Integrazione con i directory services aziendali (rubrica LDAP).
Configurazioni del sistema operativo¶
zaptel.conf¶
Configurazione di zaptel per la gestione della scheda Digium TM400P.
# Questi parametri rispecchiano i moduli installati nella scheda: # 1,2 FXS e 3,4 FXO. Viene specificato il tipo di signalling # per ogni tipologia di porta. fxsks=1-2 fxoks=3-4 # E@poi possibile pre-caricare le impostazioni per una zona #(it in questo caso) ed impostarla come default loadzone = it defaultzone = it
...*aggiungere note di Christopher sul kernel*...
Configurazioni di Asterisk¶
La versione di asterisk presente in sarge non è una delle ultime, quindi e' il caso di aggiungere un backport dei pacchetti della 1.2 e va quindi aggiunta al file /etc/apt/sources.list
la seguente riga:
deb http://www.backports.org/debian/ sarge-backports main
Le seguenti righe invece vanno aggiunte al file /etc/apt/preferences
per evitare che vengano aggiornati tutti i pacchetti presenti nel repository dei backport:
Package: * Pin: release a=sarge-backports Pin-Priority: 200 Package: asterisk Pin: release a=sarge-backports Pin-Priority: 999
A questo punto è possibile installare asterisk:
apt-get install asterisk asterisk-config asterisk-sounds-main
zapata.conf¶
Questo file di configurazione contiene i parametri per utilizzare chan_zap, il canale di asterisk dedicato a zaptel. In questo file vengono specificate le opzioni relative la scheda Digium TM400P.
Questa scheda gestisce il collegamento con la borchia ISDN (in modalità analogica) e il collegamento con i telefoni analogici cordless. Bisogna quindi configurare il contesto channels
in cui si impostano i parametri relativi ai vari canali della scheda Digium.
[channels] ;; specifico la lingua di default language=it ;; configuro i canali con signaling FXO ;; associati alle porte cui attacchiamo i telefoni signalling=fxo_ks ;; abilito la cancellazione dell'eco echocancel=yes echocancelwhenbridged=yes ;; specifico il numero di millisecondi (400) ;; utilizzati da asterisk per correggere l'eco echotraining=400 ;; definisco un gruppo di canali group=1 ;; specifico a che context (vedi extensions.conf) ;; vengono redirette le chiamate provenienti da questi canali context=truelite-firenze ;; definisco un callerid unico per tutte le chiamate ;; provenienti da questi canali callerid=<101> ;; definisco la casella vocale predefinita per questi canali mailbox = 101 ;; definisco i canali zaptel appartenenti al gruppo ;; solo uno nel nostro caso. channel => 4 ;; configuro i canali con signaling FXS ;; associati alle porte cui attacchiamo la borchia ISDN signalling=fxs_ks ;; imposto una sensibilita@ minore ai DTMF ;; per farli riconoscere meglio relaxdtmf=yes ;; abilito la cancellazione dell'eco echocancel=yes echocancelwhenbridged=yes ;; definisco un gruppo di canali group=2 ;; definisco il volume sul segnale in ricezione rxgain=6.0 ;; specifico a che context (vedi extensions.conf) ;; vengono inoltrate le chiamate provenienti da questi canali context=incoming-pstn ;; abilito il monitoring della chiamata ;; da parte di asterisk callprogress=yes ;; questo aiuta a capire se la telefonata ;; e@ finita e libera il canale busydetect=yes ;; tento di mantenere il callerid esterno callerid=asreceived usecallerid=yes hidecallerid=no ;; abilito la chiamata a 3 threewaycalling=yes ;; abilito il trasferimento di chiamata transfer=yes ;; specifico i canali membri del gruppo ;; due in questo caso channel => 1-2
iax.conf¶
Questo file contiene le configurazioni di IAX, il protocollo per le comunicazioni Inter Asterisk.
Per ora non abbiamo trovato un modo per integrare l'autenticazione con LDAP, quindi anche gli utenti sono stati creati qui. Di conseguenza i telefoni IP dovranno utilizzare un firmware capace di supportare il protocollo IAX.
[general] ; Imposta il linguaggio per tutti gli account language=it ; Con allow e disallow e@ possibile scegliere ; quali codec autorizzare allow=all disallow=g723.1 ;codec proprietari disallow=g729 ;codec proprietari ; I bit del TOS vanno impostati per la minima latenza tos=lowdelay ; A seguire vengono aggiunti gli account per i telefoni iax2 [cgabriel] ; Il tipo friend permette al telefono di ricevere ; ed effettuare chiamate type=friend ; Questa direttiva permette di utilizzare il telefono ; senza un ip fisso host=dynamic ; Nome utente per l'autenticazione username=cgabriel ; Password per l'autenticazione del telefono secret=antani ; La mailbox associata a questo telefono mailbox=102 ; Il contesto predefinito per il telefono context=truelite-firenze ; Questa direttiva specifica le reti da cui e@ autorizzato ; l'uso del telefono permit=0.0.0.0/0.0.0.0 [csurchi] type=friend host=dynamic username=csurchi secret=antani mailbox=103 context=truelite-firenze permit=0.0.0.0/0.0.0.0 [piccardi] type=friend host=dynamic username=piccardi secret=antani mailbox=104 context=truelite-firenze permit=0.0.0.0/0.0.0.0 [chiara] type=friend host=dynamic username=chiara secret=antani mailbox=105 context=truelite-firenze permit=0.0.0.0/0.0.0.0
sip.conf¶
Questo file contiene le configurazioni del protocollo SIP. In particolare esso viene utilizzato per la sottoscrizione di account con eutelia. Il gestore telefonico infatti fornisce numerazioni nazionali gratuite gestibili tramite VoIP dal nostro PBX.
Inoltre sip.conf
contiene le definizioni degli account sip interni utilizzabili dai client in maniera del tutto analoga a quanto avviene per il protocollo IAX.
[general] ; Con allow e disallow e' possibile scegliere quali codec autorizzare allow=all disallow=g723.1 ;codec proprietari disallow=g729 ;codec proprietari ; facciamoci riconoscere useragent=Truelite Phone Server defaultexpiry=300 maxexpiry=300 ;; il nostro context di default context = incoming-eutelia ;musicclass = default ;; configurazioni della rete. port = 5060 bindaddr=192.168.1.2 nat=1 externip = 217.133.96.194 localnet=192.168.0.0/255.255.0.0; All RFC 1918 addresses are local networks localnet=10.0.0.0/255.0.0.0 ; Also RFC1918 localnet=172.16.0.0/12 ; Another RFC1918 with CIDR notation localnet=169.254.0.0/255.255.0.0 ;Zero conf local network ;; qui definiamo le sottoscrizioni con eutelia. ; christopher privato register => 0553986920:xxxxx@voip.eutelia.it/3000 ; truelite su bolzano register => 04711885142:xxxxx@voip.eutelia.it/4000 ; truelite su firenze register => 0555357742:xxxxx@voip.eutelia.it/5000 ; christopher privato parma register => 05211856113:xxxxx@voip.eutelia.it/6000 [csurchi] type=friend mailbox=103 username=csurchi secret=antani host=dynamic context=truelite-firenze [iacopo] type=friend mailbox=106 username=iacopo secret=antani host=dynamic context=truelite-firenze
ldap.conf¶
Questo file di configurazione contiene le direttive per il supporto di LDAP. In particolare specifica l'effetto delle chiamate LDAPget()
presenti in extensions.conf
. LDAP viene utilizzato per cercare il mittente della chiamata tra i contatti in rubrica. Sono stati specificati qui due contesti diversi corrispondenti a query LDAP diverse, una per le chiamate interne, uno per quelle esterne.
[interno] host = localhost version = 3 user = pass = base = ou=Contacts,dc=truelite,dc=it filter = (&(objectClass=person)(companyPhone=%s)) attribute = cn convert = UTF-8, ISO-8859-1 [esterno] host = localhost version = 3 user = pass = base = ou=Contacts,dc=truelite,dc=it filter = (&(objectClass=person)(|(telephoneNumber=*%s)(mobile=*%s)(fax=*%s))) attribute = cn convert = UTF-8, ISO-8859-1
indications.conf¶
Questo file specifica il tipo di toni di controllo da utilizzare. Essi variano di nazione in nazione. Essendo presenti le configurazoni per tutti i paesi supportati da asterisk basta specificare country=it
nel conesto [general]
e verra` attivata la lista di toni per l'Italia.
musiconhold.conf¶
Il musiconhold contiene le direttive per la gestione della musica d'attesa. La musica parte in qualsiasi situazione ci sia attesa, quindi per il trasferimento, per l'attesa in una "coda" o per un semplice "hold" della chiamata. Si specifica qui la directory dove sono contenuti i files da riprodurre in ordine casuale.
[default] mode=files directory=/usr/share/asterisk/moh-native random=yes
queues.conf¶
Queues.conf contiene le direttive relative le code. Esse sono liste di chiamate la cui priorita@ si basa sull'ordine di arrivo. Le chiamate sono prelevate dalle code da uno qualsiasi degli account membri liberi.
[general] ;; i membri non cambiano persistentmembers = yes ;; nome della coda [tutti] ;; fa suonare tutti gli account membri strategy = ringall ;; timeout in secondi timeout = 15 ;; elenco degli account membri che possono prelevare ;; chiamate dalla coda member = IAX2/cgabriel member = IAX2/csurchi member = IAX2/piccardi member = IAX2/chiara member = Zap/4 [centralino] strategy = ringall timeout = 15 member = IAX2/cgabriel member = IAX2/csurchi member = IAX2/piccardi member = IAX2/chiara member = Zap/4 [sistemi] strategy = ringall timeout = 15 member = IAX2/piccardi [amministrazione] strategy = ringall timeout = 15 member = IAX2/chiara [commerciale] strategy = ringall timeout = 15 member = IAX2/csurchi
extensions.conf¶
Il file di extensions va considerato il piu' importante nella configurazione di asterisk. Esso implementa l'organizzazione delle chiamate. Qui sono state definite delle direttive di base per fornire il servizio di fonia interna e sono state poi implementate delle funzioni (macro in gergo asterisk) utili per riutilizzare porzioni di configurazione. Potremmo dire che il file di extensions descrive come deve avvenire il routing delle chiamate.
La forma delle direttive è la seguente:
exten => numero, step di esecuzione, azione
Con numero intendiamo quello che viene richiesto da un membro di quel contesto. Step di esecuzione è un intero che ordina l'esecuzione delle direttive con numero uguale. Azione è la funzione standard di asterisk o la marco definita dall'utente che vogliamo sia invocata selezionando quel numero. In altre parole, se un client SIP o IAX digita sulla sua tastiera il numero 666 e appartiene al contesto pippo, la direttiva in [pippo]
della forma:
exten => 666,1,Dial(SIP/pluto)
definisce l'azione da intraprendere se viene selezionato il numero 666 (in questo caso chiamare l'account sip con nome utente pluto). Se poi successivamente viene inserita una direttiva:
exten => 666,2,Hangup()
allora quando la funzione Dial()
dello step 1 ritorna, verrà eseguita la funzione Hangup()
. Per evitare noiosi riordinamenti delle direttive, soprattutto nel caso dei configurazioni piu' complesse, è disponibile lo step wildcard 'n' utilizzabile dal secondo in poi (cioè dev'esserci sempre uno step 1 iniziale).
Caso specifico è costituito dalle macro. Esse sono invocate come normali funzioni con la seguente sintassi:
Macro(nomemacro,parametro1,parametro2,...)
con un numero a piacere di parametri.
Quando la macro viene definita, deve gestire i parametri formali che le vengono passati. La sua definizione, che avviene con una direttiva di contesto, ha questa sintassi:
[macro-nomemacro] exten => ..... exten => .....
Bisogna citare infine le direttive di inclusione. Esse permettono di dare visibilità al namespace degli altri contesti. Cioè permettono ai client membri di utilizzare direttive configurate altrove. L'inclusione di truelite-padova
in truelite-firenze
, per esempio, permette a chi utilizza come contesto di default truelite-firenze
, di raggiungere le direttive configurate in truelite-padova
.
;; come ogni file di configurazione di asterisk, anche ;; extensions.conf e@ organizzato per contesti. ;; general contiene le direttive globali. [general] static=yes ; These two lines prevent the command-line interface writeprotect=yes ; from overwriting the config file. Leave them here. ;; iniziamo con il configurare i contesti relativi agli account voip ;; sottoscritti con eutelia (skypho). ;; In sip.conf sono state rimappate tutte le chiamate ai numeri eutelia ;; a specifici numeri interni, cosi@ da poter essere gestiti da asterisk. ;;;;;;;;;;;;;;;;;;;;;;;;; ; INGRESSO VOIP EUTELIA ; ;;;;;;;;;;;;;;;;;;;;;;;;; [incoming-eutelia] ; account eutelia personale di Christopher su firenze exten => 3000,1,Macro(rubrica-esterna,102,IAX2/cgabriel) exten => 3000,n,Hangup() ; account eutelia Truelite di Bolzano ;exten => 4000,1,Macro(squilla-tutti,101,centralino) exten => 4000,1,Answer() exten => 4000,2,Ringing exten => 4000,3,wait(2) exten => 4000,4,Goto(mainmenu,s,1) exten => 4000,n,Hangup() ; account eutelia Truelite di Firenze ;exten => 5000,1,Macro(squilla-tutti,101,centralino) exten => 5000,1,Answer() exten => 5000,2,Ringing exten => 5000,3,wait(2) exten => 5000,4,Goto(mainmenu,s,1) exten => 5000,n,Hangup() ; account eutelia personale di Christopher su parma exten => 6000,1,Macro(rubrica-esterna,102,IAX2/cgabriel) exten => 6000,n,Hangup() ;; nel context successivo sono configurate le direttive per ;; ricevere le telefonate provenienti dalla linea analogica. ;; questo context riceve richieste direttamente e solamente ;; dal modulo zaptel, utilizzato dalla scheda Digium. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; INGRESSO PSTN BORCHIA TELECOM ; ; (055-7879597) ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; [incoming-pstn] ; redirige tutte le chiamate al menu IVR (interactive voice response) ;exten => s,1,Macro(squilla-tutti,101,centralino) exten => s,1,Goto(mainmenu,s,1) exten => s,2,Hangup() ;; qui vengono configurati gli interni dell'ufficio di firenze. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; CONTEXT DEGLI INTERNI FIRENZE ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; [truelite-firenze] ; inclusione del context implicito per le ; chiamate in park (vedi features.conf) include => parkedcalls include => truelite-padova ;mapping degli interni e degli account exten => 101,1,Macro(rubrica-interna,101,Zap/4|20,t) ; cordless exten => 102,1,Macro(rubrica-interna,102,IAX2/cgabriel) ; phone-01 exten => 103,1,Macro(rubrica-interna,103,SIP/csurchi) ; phone-02 exten => 104,1,Macro(rubrica-interna,104,IAX2/piccardi) ; phone-03 exten => 105,1,Macro(rubrica-interna,105,IAX2/chiara) ; phone-04 exten => 106,1,Macro(rubrica-interna,106,SIP/iacopo) ; Iacopo softphone exten => 107,1,Macro(rubrica-interna,106,SIP/cgabriel2) ; Cgabriel softphone ; Accesso alle caselle di voicemail exten => 000,1,VoiceMailMain(@default) ; Accesso al registratore exten => 001,1,Goto(registratore,s,1) exten => 002,1,Goto(mainmenu,s,1) ; Accesso alla linea esterna VOIP di eutelia con il prepend del numero 9 ;exten => _9.,1,ChanIsAvail(SIP/0555357742:@voip.eutelia.it) ;exten => _9.,2,Dial(SIP/${EXTEN:1}@eutelia-fi-out,20,tTr) ;exten => _9.,102,Playback(/usr/share/asterisk/sounds/custom/busy-lines) ;exten => _9.,103,Hangup ; Accesso alla linea esterna PSTN di telecom con il prepend del numero 0 exten => _0.,1,ChanIsAvail(Zap/1) exten => _0.,2,Dial(Zap/1/${EXTEN:1}|20,t) ;uno 0 preposto al numero da chiamare usa il gateway PSTN exten => _0.,102,Playback(/usr/share/asterisk/sounds/custom/busy-lines) exten => _0.,103,Hangup ; In caso di timeout riaggancia exten => t,1,Hangup() [truelite-padova] ;inclusione del context implicito per le chiamate in park (vedi features.conf) include => parkedcalls ;include => truelite-firenze ;mapping degli interni e degli account ;exten => 201,1,Macro(rubrica-interna,201,SIP/0497967279@eutelia-fi-out) ; dido ;exten => 202,1,Macro(rubrica-interna,202,SIP/0498592021@eutelia-fi-out) ; luba
Essendo che il file di configurazione delle extensions è molto lungo e sarebbe inutile riportarlo qui per intero, dato che in varie parti ripete concetti già' esperessi, riporterò ora la configurazione del menu IVR.
;; definisce il blcco di configurazione del menu [mainmenu] ;; 's' indica che questi step vanno eseguiti subito ;; per ogni extension richiesta. diciamo che quello ;; che viene specificato con 's' accade per ogni chiamata ;; che arriva a mainmenu. ;; risponde alla chiamata exten => s,1,Answer ;; definisce variabili locali: il timeout tra le cifre dei toni ;; e il timeout di attesa di una scelta. exten => s,2,Set(TIMEOUT(digit)=5) exten => s,3,Set(TIMEOUT(response)=5) ;; riproduce dei messaggi registrati in background ;; mantenendo possibile effettuare una scelta durante l'ascolto exten => s,4,Background(/usr/share/asterisk/sounds/custom/menu-welcome) exten => s,5,Background(/usr/share/asterisk/sounds/custom/menu-choose) ;; gestisce la scelta di menu (1 2 o 3) exten => 1,1,Macro(scelta-menu,1001,commerciale) exten => 2,1,Macro(scelta-menu,1002,sistemi) exten => 3,1,Macro(scelta-menu,1003,amministrazione) ;; cazzate giusto per divertirsi exten => 42,1,PlayBack(/usr/share/asterisk/sounds/custom/menu-haicapitotutto) exten => 69,1,PlayBack(/usr/share/asterisk/sounds/custom/i-want-a-new-drug) ;; se invece di una scelta di menu, conosciamo l'interno desiderato ;; instrada la chiamata all'interno richiesto. exten => 101,1,Macro(rubrica-esterna,101,Zap/4) exten => 102,1,Macro(rubrica-esterna,102,IAX2/cgabriel) exten => 103,1,Macro(rubrica-esterna,103,SIP/csurchi) exten => 104,1,Macro(rubrica-esterna,104,IAX2/piccardi) exten => 105,1,Macro(rubrica-esterna,105,IAX2/chiara) exten => 106,1,Macro(rubrica-esterna,106,SIP/iacopo) exten => 107,1,Macro(rubrica-esterna,106,SIP/cgabriel2) ;; con 't' si configura l'azione da intraprendere ;; in caso di timeout. Se non scegli, passa a ringall exten => t,1,Macro(squilla-tutti,101,tutti) exten => t,2,Hangup ;; con 'i' si configura l'azione da intraprendere in caso ;; di errore. exten => i,1,Playback(/usr/share/asterisk/sounds/custom/menu-invalid) exten => i,2,Goto(s,5) ; "That's not valid, try again"
Concludo riportando le configurazioni delle macro principali. Esse sono una buona pratica, in quanto permettono una facile organizzazione delle configurazioni e il riuso del codice. Scrivere esplicitamente tutte le direttive supportete dalle macro comporterebbe la redazione di un extensions.conf
di qualche megabyte.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; MACRO CHIAMATA CON RUBRICA ESTERNA ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; nome della macro [macro-rubrica-esterna] ;; ricerca il numero del chiamante in ldap. exten => s,1,LDAPget(CIDNAME=esterno/${CALLERIDNUM},${CALLERIDNUM},${CALLERIDNUM}) ;; utilizza il risultato trovato nella variabile exten => s,2,Set(CALLERID(name)=${CIDNAME}) ;; effettua la chiamata. exten => s,3,Macro(chiamata-standard,${ARG1},${ARG2}) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; MACRO CHE GESTISCE LA SELEZIONE DEL MENU ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; nome della macro [macro-scelta-menu] ;; cerca il numero del chiamante in rubrica exten => s,1,LDAPget(CIDNAME=esterno/${CALLERIDNUM},${CALLERIDNUM},${CALLERIDNUM}) exten => s,2,Set(CALLERID(name)=${CIDNAME}) ;; chiama la coda scelta dal menu (secondo parametro passato) exten => s,3,Queue(${ARG2}|t|||30) ;; se non risponde nessuno inoltra a un'altra coda exten => s,4,Queue(tutti|t|||30) ;; se non risponde nessuno manda la chiamata in segreteria ;; alla casella specificata dal primo parametro passato. exten => s,5,Macro(segreteria,${ARG1}) ;; se va in timeout, riaggancia. exten => t,1,Hangup() ;;;;;;;;;;;;;;;;;;;;;;;;;;; ; MACRO CHIAMATA STANDARD ; ;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; nome della macro [macro-chiamata-standard] ;; inoltra la chiamata all'account specificato ;; nel secondo parametro passato exten => s,1,Dial(${ARG2},20,tT) ;; se non risponde nessuno passa alla segreteria ;; specificata nel primo parametro passato exten => s,2,Macro(segreteria,${ARG1}) ;; se va in timeout, riaggancia exten => t,1,Hangup() ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; MACRO SEGRETERIA TELEFONICA ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; nome della macro [macro-segreteria] ;; in base allo stato della chiamata, ;; vai al punto corretto. ;; (NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER) exten => s,1,Goto(s-${DIALSTATUS},1) ; exten ...
Updated by Simone Piccardi almost 12 years ago · 31 revisions