Bien, ahora vamos a tocar algo del dialplan. Entendemos como dialplan, el plan de numeración y lo que queremos que nuestros terminales realicen cuando marcamos ciertos caracteres o números, así como que hacer cuando una llamada entrante aparece en un troncal, como enviarla a una extensión o al contestador de voz.
Es interesante porque desde aquí podemos, desde determinar si queremos realizar llamadas a teléfonos móviles, por ejemplo, como evitar llamadas inoportunas aplicando una lista negra o blacklist, o incluso implementando un horario de llamadas.
En mi caso, voy a plasmar el dialplan que tengo funcionando, pero por supuesto es adaptable a cada caso, así que… a disfrutar creando!
Lo primero de todo es saber que archivo compone nuestro dialplan, en este caso es el extensions.conf
Vemos entonces, que como siempre tenemos una parte general
[general]
static=yes
writeprotect=yes
autofallthrough=yes
language=es
extenpatternmatchnew=yes
clearglobalvars=no
Ahora vamos a definir que hacer con las numeraciones:
Recibir lo que no tiene un contexto definido y rechazarlo por seguridad.
[default]
exten => _X.,1,hangup(21)
exten => s,1,hangup(21)
Ahora declaramos el contexto extensiones que contendrá lo que hacer con las llamadas internas (ya sean las entrantes desde el troncal, las internas entre extensiones y los servicios propios)
[extensiones]
include => internas
include => externas
include => echo
include => ring-group
include => contestador
include => contestador_ext
Definimos el contexto para las llamadas salientes por el troncal pjsip de movistar:
[externas]
include => fijos
include => moviles
include => especiales
include => informacion
include => emergencias
include => internacionales
include => sociales
include => nomadas
include => info_Telefonica
Ahora definimos las llamadas con origen y destino interno del contexto extensiones:
; ############### Llamadas origen y destino interno ##########
[internas] ; Llamadas internas
exten => _30[1-5]00,1,NoOp(Llamada entre extensiones)
same => n,Dial(PJSIP/${EXTEN},30,Tti)
same => n,Voicemail(${EXTEN}@default)
same => n,Hangup()
[ring-group] ; Grupo de timbrado, cuando la llamada entra por el troncal suenan todas las extensiones
exten => 30000,1,Log(NOTICE, Call group All in rin-group context)
exten => 30000,2,Set(ringgroup=PJSIP/28100&PJSIP/28200&PJSIP/28300&PJSIP/28400&PJSIP/28500)
exten => 30000,n,Dial(${ringgroup},60)
exten => 30000,n,Voicemail(28100@default)
exten => 30000,n,Hangup()
[echo] ; Prueba de eco
exten => 30999,1,Answer(500)
exten => 30999,n,Playback(es/demo-echotest)
exten => 30999,n,Echo()
exten => 30999,n,Playback(es/demo-echodone)
exten => 30999,n,Goto(s,6)
[contestador] ; Contestador desde el mismo numero desde el que se llama
exten => *97,1,Answer()
exten => *97,n,VoiceMailMain(${CALLERID(num)}@default)
exten => *97,n,Hangup()
[contestador_ext] ; Contestador de otra extensión
exten => *98,1,Answer()
exten => *98,n,VoiceMailMain(@default)
exten => *98,n,Hangup()
Definimos las llamadas salientes por el troncal:
; ######### Llamadas origen interno destino externo ##########
[fijos]
exten => _[89]ZXXXXXXX,1,NoOp(Llamada salida fijo)
same => n,Dial(PJSIP/Telefonica_endpoint/sip:${EXTEN}@telefonica.net:5070,60)
same => n,hangup
[moviles]
exten => _[67]XXXXXXXX,1,NoOp(Llamada a moviles)
same => n,Dial(PJSIP/Telefonica_endpoint/sip:${EXTEN}@telefonica.net:5070,60)
same => n,hangup()
[especiales]
exten => _[89]0XXXXXXX,1,NoOp(Llamadas a numeros de tarificacion especial)
same => n,Dial(PJSIP/Telefonica_endpoint/sip:${EXTEN}@telefonica.net:5070,60)
same => n,hangup()
[informacion]
exten => _11XXX,1,NoOp(Números de información)
same => n,Dial(PJSIP/Telefonica_endpoint/sip:${EXTEN}@telefonica.net:5070,60)
same => n,hangup()
[emergencias]
exten => _112,1,Dial(PJSIP/Telefonica_endpoint/sip:${EXTEN}@telefonica.net:5070,60)
exten => _0XX,1,Dial(PJSIP/Telefonica_endpoint/sip:${EXTEN}@telefonica.net:5070,60)
[internacionales]
exten => _00XXXXXX.,1,NoOp(Llamadas internacionales)
same => n,Dial(PJSIP/Telefonica_endpoint/sip:${EXTEN}@telefonica.net:5070,60)
same => n,hangup()
[nomadas]
exten => _051XXXXXXXXX,1,NoOp(Numeros nómadas VoIP)
same => n,Dial(PJSIP/Telefonica_endpoint/sip:${EXTEN}@telefonica.net:5070,60)
same => n,hangup()
[sociales]
exten => _10[012689][0-7],1,NoOp(Servicios de valor social)
same => n,Dial(PJSIP/Telefonica_endpoint/sip:${EXTEN}@telefonica.net:5070,60)
same => n,hangup()
[info_Telefonica]
exten => _1565,1,Dial(PJSIP/Telefonica_endpoint/sip:${EXTEN}@telefonica.net:5070,60)
same => n,hangup()
Y ahora como broche final definimos las llamadas que van a entrar a través del troncal. En mi caso, y como sera en muchos de los usuarios, tras contratar un alta nueva, empece a sufrir acoso telefónico de la venta de deuda a otras empresas de cobro, que por supuesto serian del cliente anterior (ya sabemos, esas facturas que nos quieren obligar a pagar por un servicio no cumplido o una baja que según ellos no corresponde y esas cosas varias)
Como no funcionaba el decir que esa persona no era yo (y era cierto que no lo era), opte por realizar un bloqueo selectivo de llamadas.
Cuando una llamada entra, lo primero que comprobamos es si esta en la lista negra, en cuyo caso, una bonita grabación les indica a estas maravillosas empresas que están en la lista negra y les cuelga (pero para ello antes debemos meterlos en lista negra y hasta que no llaman al menos una vez no sabemos el numero desde el cual llaman) por tanto pasamos a la segunda opción, crear una lista blanca para aquellas personas de nuestro entorno, en la cual si el numero esta incluido directamente, hará el envío de llamada al grupo de timbrado. Si no esta en esta lista pasamos a realizar una comprobación de horario, en este caso todas las llamadas que no estando en lista negra, ni blanca entren fuera de hora, serán rechazadas con una bonita grabación que os recomiendo la escuchéis. Allá vamos:
; ############## Llamadas entrantes Movistar #################
[Telefonica]
exten => s,1,NoOp(Llamada entrante Telefonica de ${CALLERID(num))
same => n,GotoIf(${BLACKLIST()}?black)
same => n,GotoIf(${DB_EXISTS(whitelist/${CALLERID(num)})}?permit)
same => n,GotoIfTime(08:30-21:30|mon-sat|1-31|jan-dec?notime)
same => n,Dial(Local/30000@extensiones,30,Tti)
same => n,Voicemail(30100@default)
same => n,Hangup()
same => n(notime),Answer()
same => n,Playback(es/timewarp)
same => n,Voicemail(30100@default)
same => n,Hangup()
same => n(black),Answer()
same => n,Playback(es/privacy-you-are-blacklisted)
same => n,Hangup()
same => n(permit),Dial(Local/28000@extensiones,30,Tti)
same => n,Voicemail(30100@default)
same => n,Hangup()
Un ultimo detalle seria como introducir números en las listas blancas o negras, que se hará desde dentro de la consola CLI>
Aunque existen comandos para poderlo hacer desde el una extensión, yo dejare solo esta forma.
Introducir un numero en la lista negra:
database put blacklist XXXXXXXXX 1
Introducir un numero en la lista blanca:
database put whitelist XXXXXXXXX 1
Borrar un numero de la lista negra/blanca:
database del blacklist/whitelist XXXXXXXXX
Mostrar listado de lista negra/blanca:
database show blacklist/whitelist