martes, 27 de octubre de 2009

Implantación de passwords para realizar llamadas externas

Bueno un día de estos me tocó que un cliente me pidió implementar passwords para todos los usuario para realizar llamadas externas a números celulares, convencionales e internacionales, esto facilmente lo podemos lograr usando la aplicación VMAuthenticate(). Pero además el cliente quería que se guardaran los registros para hacer un costeo de llamadas, la idea es si la persona usa otro telefono o extensión que el * le pida un usuario y password que solo la persona sabe, con esto hay que alterar el callerid o editar el CDR(), aqui pongo los pasos que use, esto puede variar, se podria usar nada mas el usuario ingresado y sustituir la variable callerid(all) por "usuario <usuario>" (en este caso son iguales a extensiones), pero para poder usar el nombre del peer vamos a usar la base de datos de asterisk, en internet hay ejemplos usando mysql pero mejor no forzar más el procesador. Bueno a los hechos:

voicemail.conf

[contexto a usar]

1323 => 45754,Juan Perez

...

...

...

extensions.conf

exten => _8.,1,Playback(digiteusuario)

exten => _8.,2,Read(user,,6,2,10) ; aqui la función read, asigna el valor digitado a la variable user,el maximo de la palabra debe ser de 6 letras, se puede equivocar dos veces, y tendrá 10 segs de tiempo para digitarlo
exten => _8.,n,VMAuthenticate(${user}@default)  ; aqui pide el password
exten => _8.,n,Set(NAME=${DB(${user}/name)}  ; sacamos el callerid, esto se mostrará luego
exten => _8.,n,Set(CALLERID(all)=${NAME} <${user}>)
exten => _8.,n,NoOp(${CALLERID(all)})
exten => _8.,n,ChanIsAvail(Dahdi/2&Dahdi/6&Dahdi/7&Dahdi/8,j)   ; verifico que los canales esten libres
exten => _8.,n,Dial(${AVAILORIGCHAN}/${EXTEN:${TRUNKMSD}},60,wWTt)
exten => _8.,n,Busy(3)
exten => _8.,102,Playback(lineasocupadas)

===============================================================================



Ahora mi idea que se me ocurrió fue sacar todos los callerids del sip.conf y del chan_dahdi.conf y guardalos en la BD de asterisk para utilizarlo cada vez que lo ocupe:

Para tomar los CallerIds

Explicación: realizamos un grep a los archivos, con sed eliminamos callerid=,<,> y el " y lo guardamos en callerids.txt
grep callerid sip.conf | sed "s/callerid=//g" | sed -e 's/<//g' | sed -e 's/>//g' | sed -e 's/"//g' >> callerids.txt
grep callerid chan_dahdi.conf | sed "s/callerid=//g" | sed -e 's/<//g' | sed -e 's/>//g' | sed -e 's/"//g' >> callerids.txt

Ahora editamos el archivo callerids.txt para eliminar las pocas lineas que no ocupo

Luego creamos el script para insertarlo en la bd, en este caso use la conexión AMI(Asterisk Manager Interface) vía BASH:

vim crearDBNames
#!/bin/sh

echo "#!/bin/sh" > addAsterisk_name.sh
echo "#" >> addAsterisk_name.sh
echo "echo \"open localhost 5038\"" >> addAsterisk_name.sh
echo "sleep 1" >> addAsterisk_name.sh
echo "echo \"Action: Login\"" >> addAsterisk_name.sh

#El usuario y password son los que ponemos en manager.conf

echo "echo \"UserName: usuario\"" >> addAsterisk_name.sh
echo "echo \"Secret: password\"" >> addAsterisk_name.sh
echo "echo" >> addAsterisk_name.sh

#creamos un bucle while que lee cada línea del archivo callerids.txt
while read calleridname
do
usuario=`echo $calleridname |awk '{print $1}'`
echo "echo \"Action: DBPut\"" >> addAsterisk_name.sh
echo "echo \"Family: $usuario\"" >> addAsterisk_name.sh
echo "echo \"Key: name\"" >> addAsterisk_name.sh
echo "echo \"Val: $calleridname\"" >> addAsterisk_name.sh
echo "echo" >> addAsterisk_name.sh
done < callerids.txt
#Le damos permisos de ejecución al script
chmod +x addAsterisk_name.sh
./addAsterisk_name.sh |telnet

#FIN ARCHIVO

Luego chmod +x crearDBNames

./crearDBNames


NOTA: No debemos dejar espacios en blanco, al terminar un DBPut y empezar otro se separa por un "echo"

Espero que les sirva, hasta la próxima

1 comentario:

  1. Wahrsagen Kostenlos Online24 de febrero de 2010, 4:38 p.m.

    It looks like you are a true expert. Did ya study about the topic? *lol*

    ResponderBorrar