Gestire la scrittura o lettura dei CID da file di testo

Per fare integrazione con certi programmi mesozoici o che non riescono a usare un database, puo` essere utile scrivere e leggere informazioni da files di testo. Qui ci sono due esempi per scrivere e leggere da files di testo informazioni riguardanti le chiamate entranti e uscenti.

Scrivere le informazioni sulle chiamate entranti in un file di testo

Metodo per scrivere su un file il CID della chiamata entrante. Il CID viene scritto quando un interno risponde, e il nome del file e` il numero dell'interno che ha risposto. Il trucco e` che funziona anche se il dial chiama tanti interni (e ovviamente uno solo risponde). In questo modo un programma di terza parte puo` sapere quale interno ha risposto a quale numero.

Il trucco si svolge in due parti: la prima parte e` passare al comando Dial che chiama l'interno il parametro "M(writefile)" che significa: esegui la macro con nome "writefile". La seconda parte e` scrivere una macro "writefile" che scrive su un file di testo i dati che ci interessano.

[macro-DialInterno]
; # Chiama un interno e dopo un timeout di X secondi passa alla segreteria.
; # Se l'interno e` occupato, passa alla segreteria. Va bene per le chiamate
; # entranti da fuori, non e` molto utile se gli interni si chiamano fra di loro.
; # I parametri sono: Interno (o lista di interni),timeout, parametri numero e context della voice m
ailbox.
; # per esempio: 101,30,sb1@default

exten => s,1,Dial(${ARG1},${ARG2},M(writefile))
exten => s,n,Voicemail(${ARG3})       ; segreteria se non risponde nessuno dopo il timeout
exten => s,n,Hangup(16)
exten => s,102,Voicemail(${ARG3})     ; segreteria se tutti gli interni sono occupati
exten => s,103,Hangup



[macro-writefile]
; ### per gestire le chiamate in corso dal sofware gestionale, scrivo un file
; ### dentro a /var/spool/asterisk/incoming che ha il nome dell'interno che ha risposto
; ### o che ha originato la chiamata e contiene il callerid del remoto.
; # viene chiamata dal comando Dial in macro-dialinterno
exten => s,1,System(/bin/echo -e "${CALLERID(num)}">/var/spool/asterisk/incoming/${CHANNEL:4:2})


Leggere da un file CSV il numero per associarvi il nome

Questa funzione permette di mostrare il nome di chi chiama oltre al numero sul display del telefono, usando uno script che legge un file CSV (in tempo reale, quindi non e` efficientissimo se avete 10.000 nomi) e associa il numero con il nome.

Il formato del file CSV deve essere banalmente nome e numero, uno per riga, separati da una virgola (excel li separa con il punto e virgola, si puo` modificare lo script ovviamente per usare il punto e virgola) e senza virgolette. Consentiti gli spazi nel nome. VIETATE LE VIRGOLE O I PUNTOEVIRGOLA NEL NOME, o tantomeno nel numero.

nome,numero
pippo pippo,051123456
paperino,3351111111

Il file lo salvate dove volete voi, avendo cura che sia leggibile da Asterisk.

Fatto questo, dovete creare uno script (ho usato bash) che faccia il lookup. Il numero cosi` come ricevuto da Asterisk (occhio ad eventuali zeri in testa tolti o messi) viene passato allo script come parametro e lui cerca di estrarre il nome dal file CSV. Se ci riesce, lo passa come output ad Asterisk. Notare che per ridurre eventuali errori cerco il numero come stringa completa (grep -w) e quindi il numero di zeri che ci sono in testa al numero e` importante. Lo script che mostro qui va messo nel percorso /usr/share/asterisk/agi-bin, deve essere eseguibile e deve essere dell'utente che fa girare Asterisk. DEVE, altrimenti non va.

# se non ho il parametro in ingresso, esco senza fare nulla.
if [ "${1}" == "" ]; then  exit 0; fi

# dove e` il file CSV:
input_file="/path/vostro/RubricaVOIP.csv"


#lookup: prendo il primo parametro (numero) e lo lookuppo
nome=`grep -w ${1} ${input_file} | awk  -F\, '{print($1)}'`

#lookup: se al primo colpo non trovo niente, provo con uno zero davanti
if [ "$nome" == "" ];
then
        nome=`grep -w 0${1} ${input_file} | awk  -F\, '{print($1)}'`
fi

# riporto ad asterisk una variabile con il nome dentro
# (potrebbe essere vuota se non trovo niente)
echo "SET VARIABLE __nome \"${nome}\""

Per finire nel dialplan (extensions.conf) nella funzione che riceve le chiamate entranti dovete fare una chiamata allo script AGI appena fatto, e poi usare la variabile che mi riporta, questo modo. La prima riga esegue lo script e la seconda imposta il nome del callerid CALLERID(name) al valore della variabile "nome" che e` stata riportata dallo script. Notare che chiamo lo script senza indicare il path nel quale si trova: e` il path di default di Asterisk per gli script AGI e quindi lo cerca li`.

; ###########################################
; Chiamate entranti da Ehiweb
; ###########################################

[ehiweb]
exten=> 051xxxxxxx,n,AGI(lookupcid.agi,${CALLERID(num)})
exten=> 051xxxxxxx,n,Set(CALLERID(name)=${nome})

Asterisk/CidSuFile (last edited 2020-03-17 13:51:29 by Kurgan)