Mostrando entradas con la etiqueta Asterisk. Mostrar todas las entradas
Mostrando entradas con la etiqueta Asterisk. Mostrar todas las entradas

sábado, 3 de julio de 2021

Cómo configurar FreePBX para Masmovil

Después de conseguir el acceso al router Sercomm FG824CD y obtener los datos de acceso al servidor SIP no quedaba otra que configurar mi FreePBX para tirar de este servidor. Así podría quitar (o no) el ATA LinkSys SPA3102.

A pesar de que ya lo he hecho para otros servicios, incluyendo el ATA, el conseguir hacer el "register" me costó mucho tiempo. Accediendo a la consola de asterisk tenía activado el debug:

# asterisk -r
sip set debug [on | trunkName ]


Según el instante lo puse tanto probando con on como con el nombre del trunk entrante (inbound trunk) .
Uno de los manuales principales que me ha guiado ha sido el de ADSLZone. No obstante, como ya decía, no acaba de funcionar del todo.

*** Register ***

Con respecto al register existen distintos formatos:

register => user[:secret[:authuser]]@host[:port][/extension]
register => fromuser@fromdomain:secret@host
register => fromuser@fromdomain:secret:authuser@host:port/extension


Lo siguiente es tener claro cuáles de los todos los valores que fuimos obteniendo se corresponden con esos valores. Porque, y aquí está donde me hice el lío (y la verdad, posiblemente me lo siga haciendo. Pero sabré por dónde van los tiros).
  • DigestUserName: e34[teléfono]@evisemad.yoigo.com.
  • fromuser@fromdomain: +34[teléfono]@ims.masmovil.com. Como podéis ver, esto es el DigestUserName.
  • fromuser: +34[teléfono].
  • fromdomain: ims.masmovil.com.
Este es el ejemplo genérico que ponen en el manual:

"DigestUserName":"AuthPassword":"DigestUserName"@[proxy]/[TEL]

Por lo que quedaría algo así:

+34[teléfono]@ims.masmovil.com:[p@$$W0rd]:e34[teléfono]@evimsemad.yoigo.com:5060/+34[teléfono]~3600

Si supierais la de combinaciones que hice pensando que el resultado que me devolvía era un error... Aunque catalogué cada formato no lo hice con los mensajes. Eran los mismos:

[2021-05-30 11:27:39] NOTICE[445]: chan_sip.c:15828 sip_reregister: -- Re-registration for +34[teléfono]@evimsemad.yoigo.com

[2021-05-30 11:27:39] NOTICE[30765]: app_queue.c:9096 reload_queue_rules: queuerules.conf has not changed since it was last loaded. Not taking any action.

[2021-05-30 11:27:39] NOTICE[445]: chan_sip.c:24840 handle_response_register: Outbound Registration: Expiry for evimsemad.yoigo.com is 2390 sec (Scheduling reregistration in 2375 s)


Estas líneas no significaban que el register estuviese mal. Y yo emperrado en que sí.

Lo dicho: tirad del formato que os pongo y os hará que el register funcione.

*** Outbound trunk ***

Esta configuración es la que está relacionada con las llamadas salientes. Aquí la muestra de un error que cometí:
  1. fromuser=e34[teléfono]@ims.masmovil.com
  2. fromuser=+34[teléfono]
Con la primera opción intenté hacer una llamada que no funcionó. El debug me devolvió el siguiente mensaje de error:

[2021-05-30 11:41:35] WARNING[445][C-0000001c]: chan_sip.c:24304 handle_response_invite: Received response: "Forbidden" from '<sip:e34[teléfono]%40ims.masmovil.com@ims.masmovil.com>;tag=XXXXXXXXX'

Por lo que hice alguna prueba más cambiando ese parámetro en concreto. Así es como en mi caso tengo la siguiente configuración. ¿Qué se podría hacer mejor? Seguro que sí. Pero de momento cumple su función:

type=peer
timeout=3600
sendrpid=yes
secret=[password]
registertimeout=3600
qualify=no
port=5060
outboundproxyport=5060
outboundproxy=evimsemad.yoigo.com
nat=force_rport,comedia
insecure=port,invite
host=ims.masmovil.com
fromuser=+34[teléfono]
fromdomain=ims.masmovil.com
dtmfmode=rfc2833
disallow=all
directmedia=no
defaultuser=+34[teléfono]@ims.masmovil.com
context=from-pstn
authname=+34[teléfono]@ims.masmovil.com
auth=+34[teléfono]@ims.masmovil.com
allow=alaw,gsm



*** Inbound trunk ***

En este caso empecé con los parámetros que se muestran en el manual pero después revisando el debug conseguí no tener que configurar un nuevo trunk.

Hice una prueba muy aproximada de lo que tenían en el manual:

username=+34[teléfono]
type=peer
trustrpid=yes
timeout=3600
sendrpid=yes
secret=[password]
registertimeout=3600
qualify=no
port=5060
outboundproxyport=5060
outboundproxy=evimsemad.yoigo.com
nat=force_rport,comedia
keepalive=30
insecure=port,invite
host=ims.masmovil.com
;host=evimsemad.yoigo.com
fromuser=+34[teléfono]
fromdomain=evimsemad.yoigo.com
dtmfmode=rfc2833
disallow=all
directmedia=no
context=from-pstn
allow=alaw,gsm


Y me devolvio el siguiente error:

[2021-06-04 21:22:13] NOTICE[445][C-00000028]: chan_sip.c:26605 handle_request_invite: Failed to authenticate device <sip:[unMóvil]@[IPAsterisk]>;tag=XXXXXXXXXXXXXXXX

[2021-06-04 21:22:16] WARNING[3337][C-00000027]: app_dial.c:2507 dial_exec_full: Unable to create channel of type 'SIP' (cause 20 - Subscriber absent)


La verdad no recuerdo si encontré otros mensajes diferentes. Pero acabé haciendo otros cambios:

username=+34[teléfono]
authname=+34[teléfono]@ims.masmovil.com
auth=+34[teléfono]@ims.masmovil.com
callerid=+34[teléfono]
type=peer
trustrpid=yes
timeout=3600
sendrpid=yes
secret=[password]
registertimeout=3600
qualify=no
port=5060
nat=force_rport,comedia
keepalive=30
insecure=port,invite
host=evimsemad.yoigo.com
fromuser=+34[teléfono]
fromdomain=evimsemad.yoigo.com
dtmfmode=rfc2833
disallow=all
directmedia=no
context=from-pstn
allow=alaw,gsm


Y ya estaría. Como decía con esta configuración ya no hace falta crear otro trunk adicional tal y como indican en el manual.

Como comentario adicional: he visto este mensaje con la corrección que ahora os contaré. Pero sólo con un teléfono de esos de spam, algo raro porque con mi móvil conseguí que no saliera.

Sólo hay una cosa curiosa que sucede cuando llegan unas llamadas y que tendré que buscar qué parámetro tengo que añadir o qué valor tengo que darle (si es que ya lo tengo en mi configuración). Cuando llegan las llamadas el origen llega con un formato como el siguiente:

[miMóvil];phone-context=+34

También es otra rara: he visto que el teléfono que os decía aparecía sin este formato. 

*** Otros ***

Algunas de las correcciones o búsquedas que hice, además de activar el debug para ver en directo qué mostraba la consola de asterisk al entrar la llamada hice una comparáción desde Wireshark de un tcpdump desde la centralita a la hora de hacer el register con otro .pcap generado por el propio router.

También quisiera comentar que he tenido configurado uno de los teléfonos IP conectados al servicio de VoIP de la operadora y a mi asterisk a la vez. Evidentemente el sistema se liaba: empezaba con la centralita y a los dos segundos saltaba el teléfono y la centralita no acababa de mostrar que se había producido esa llamada. 

jueves, 9 de mayo de 2019

Grandstream GXP1405 I: Prensentación

Recientemente me hice con un teléfono VoIP Grandstram GXP 1405, ya deprecated, para incluirlo en mi centralita Asterisk.

Grandstream GXP 1405
Grandstream GXP 1405

Como se puede ver es muy sencillo. Tiene para configurar dos líneas, típico botón de poner el altavoz para manos libres, PoE (si bien también trae una fuente de alimentación), permite conectarle una diadema para hablar por micrófono, la (típica) posibilidad de usarlo de switch para ponerle el PC... Vamos, lo más típico que uno se puede encontrar en un trasto de este tipo en una oficina.

Seguro que puede apreciar en la pantalla LCD hay tres llamadas perdidas de unas cuantas pruebas que estuve haciendo. Eso es porque ya lo tengo configurado. Entre otras opciones permite configuración vía http(s). Desconozco por qué pero ayer mismo me dio problemas y tuve que tirar de https, cuyo certificado no está reconocido, pero para el caso, me sirve. 

La configuración manual de la línea 1, que es la que se corresponde con el usuario de la centralita que le he creado, no fue del todo complicada. La recuerdo muy sencilla, a pesar de que para cada línea ofrece muchas opciones.

Yendo a general settings:

Grandstream GXP 1405 - Menú para acceder a General settings
Grandstream GXP 1405 - Menú para acceder a General settings
Y la configuración es muy sencilla: poner la dirección IP, el nombre de usuario (o extensión), contraseña y listo:

Grandstream GXP 1405 - General settings
Grandstream GXP 1405 - General settings

Una vez apliquemos los cambios y volvamos a la sección de inicio, veremos el resultado que tenemos en el pantallazo: una línea conectada y la otra no. Si hubiese algún problema cuando inicie sesión, evidentemente, se quedará en rojo. 

Como apenas he jugado con el aparato, mientras estaba escribiendo este post me he encontrado con algunas cosas que me las estudiaré para ver si merece la pena escribir sobre ellas.

Además del servidor web tiene otro ssh, pero la shell es un simple menú que apenas deja tres cambios que prácticamente serán para acceder vía web.

Grandstream GXP 1405 - Configuración vía SSH
Grandstream GXP 1405 - Configuración vía SSH
Y así es como tengo un juguetito más que, al menos las pruebas que hice, funciona bastante bien. Esperemos que en un caso real también lo haga. 

martes, 24 de enero de 2017

Asterisk y CLI: I

He estado jugando un poco con mi Asterisk. Y me puse a buscar cómo hacer algunas cosas como, por ejemplo, marcar un número desde la consola (lo que en ocasiones se le llama CLI). Para acceder a la consola, en mi caso, tengo que ser root y ejecutar:

# asterisk -r

Aunque el prompt es

nombreSistema*CLI>

no lo voy a poner en el post.

Uno de los comandos que me encontré era

console list devices.

Y me llamó la atención que me mostró unos datos que no había visto nunca:

 === Configured Devices ======================================
 =============================================================
 ===
 === ---------------------------------------------------------
 === Device Name: default
 === ---> Active:           Yes
 === ---> Input Device:     default
 === ---> Output Device:    default
 === ---> Context:          default
 === ---> Extension:        s
 === ---> CallerID Num:     extensiónRara
 === ---> CallerID Name:    nombreRaro
 === ---> MOH Interpret:    default
 === ---> Language:         en
 === ---> Parkinglot:
 === ---> Muted:            No
 === ---> Auto-Answer:      No
 === ---> Override Context: No
 === ---------------------------------------------------------
 ===
 ===========================================================

Además, si intentaba hacer una llamada a una de mis extensiones con el comando:

console dial extensionCreadaPorMi

se recibe una llamada procedente del numeroRaro. Eso sí, no me ha dejado llamar a mi móvil.

Vamos a buscar qué significa esa configuración y si puedo cambiarla a mi gusto.

En efecto: esta configuración se encuentra en console.conf.  Incluso en mi caso tiene exactamente esta misma configuración, por lo que podría cambiarla evitando tener valores por defecto no deseados. Que será lo que haga:

;
; Any configuration context defined beyond the [general] section configures
; specific devices for use.
;

[default]
input_device = default       ; When configuring an input device and output device,
output_device = default      ; use the name that you see when you run the "console
                             ; list available" CLI command.  If you say "default", the
                             ; system default input and output devices will be used.
autoanswer = yes/no
context = default
extension = s
callerid = nombreRaro <(extensionLargaLarga>
language = en/es/fr...
overridecontext = yes/no
mohinterpret = default
active = yes/no                 ; This option should only be set for one console.
                             ; It means that it is the active console to be
                             ; used from the Asterisk CLI.

Además, me puse a cambiar algunos de los filtros del trunk, restringiendo ciertas llamadas, En algún momento lo mejoraré aún más, para las que he forzado que no se hagan, vayan por otro camino.

 Una prueba que hice que no me funcionó fue

console send text "hello world"

pero como era una pequeña chorrada tampoco es cuestión de dedicarle mucho tiempo.

Otra de las pruebas  que hice era para, en teoría, forzar a una extensión ejecutar una de las aplicaciones de asterisk. Por ejemplo:

channel originate SIP/{channel} extension wait(5)

con un resultado inesperado. Si no tengo ningún canal activo en esa extensión (y aun teniéndolo también me lo hace) se inicia una comunicación con una locución indicando que se ha producido un error. Me da dos opciones para pulsar: una de ellas darme un mensaje que no está definido, y la otra llamar a una centralita Digium. El SIP/ {channel} se puede obtener a partir de

core show channels

y tiene que haber al menos una llamada en curso en la centralita.

Así, poco a poco pude jugar un poco con la consola y las llamadas en curso. Hacía tiempo que no me ponía a toquetear con estas cosas. Espero que pueda volver a darle mucho más partido a este sistema.


lunes, 18 de enero de 2016

Asterisk: Estaba en inglés, ahora en español

En todo el tiempo que llevo con la centralita de Asterisk instalado no le he cambiado los mensajes de sonido del inglés al español de manera definitiva. Lo intenté en una ocasión pero no funcionaba: el sistema dejaba de funcionar. Por lo que volvía otra vez a la configuración inicial.

Voy a volver a probar. Lo primero, es buscar los ficheros de audio. He encontrado varias fuentes:

  • http://www.voipnovatos.es
  • http://www.asterisksounds.org
De hecho, voy a usar la segunda fuente. De esta usaremos los dos ficheros que nos ofrecen: http://www.asterisksounds.org/es-es/download.

Lo primero es saber dónde lo vamos a guardar. Será en una carpeta con el nombre es dentro de /var/lib/asterisk/sounds

mkdir /var/lib/asterisk/sounds/es

Ahí es donde lo vamos a descargar. Como estas descargas son en formato .zip, hay que acordarse de tenerlo instalado. Además, al bajarlo en un Linux, hay que pasarle el parámetro -a que permita al unzip extraerlo acorde al sistema:

unzip -a core.zip
unzip -a extra.zip

Una vez extraído, hay que cambiarle los dueños (tanto el usuario como el grupo) y los permisos de los subdirectorios:

chown -R asterisk.asterisk /var/lib/asterisk/sounds/es
find /var/lib/asterisk/sounds/es -type d -exec chmod 0775 {} \;

En teoría, sólo con esto debería de ser suficiente. Pero como los audios están en formato sln16, y nosotros trabajamos con gsm729ulaw y alaw, hay que reconvertirlos. Según las instrucciones, se puede usar este script, que habrá que guardar en un fichero y asignarle permisos de ejecución:

#!/bin/bash
for a in $(find . -name '*.sln16'); do
  sox -t raw -e signed-integer -b 16 -c 1 -r 16k $a -t gsm -r 8k `echo $a|sed "s/.sln16/.gsm/"`;\
  sox -t raw -e signed-integer -b 16 -c 1 -r 16k $a -t raw -r 8k -e a-law `echo $a|sed "s/.sln16/.alaw/"`;\
  sox -t raw -e signed-integer -b 16 -c 1 -r 16k $a -t raw -r 8k -e mu-law `echo $a|sed "s/.sln16/.ulaw/"`;\
done

Ojo, que le costará hacerlo un tiempecillo. Además, os habréis fijado que falta la conversión de uno de los formatos indicados: g729. Al ser un formato propietario, hay que hacerlo de otra forma. Aunque lo he intentado hacer, no lo he conseguido. Y aún así no lo estaba usando. De todas formas, si quieres probar, el comando sería:

asterisk -rx "file convert fichero.wav fichero.g729"

La siguiente acción es indicarle al sistema que utilice estos audios. Si se busca en Internet encontraremos que nos indican que se configura en el menú Settings --> Asterisk Sip Settings. Pero ya no está ahí. Al menos, en la versión 13. Tendremos que utilizar el módulo Sound Languages

Módulo Sound languages en FreePBX - Sección global
Módulo Sound languages en FreePBX - Sección global
Hay dos opciones: indicarle que se descargue distintos paquetes de idiomas. Si os preguntáis por qué descargarlos... No lo sé. Cogí los de español también porque no conseguí que sonasen los descargados antes:

Módulo Sound languages en FreePBX - Language packs
Módulo Sound languages en FreePBX - Language packs
Nos descargaremos los idiomas que nos hagan falta y para os codecs que tengamos configurados. Aún así, en español no tenemos el paquete extras. 

Y, por último, la sección custom languages, que es la que nos permite indicarle los paquetes con los que empezamos este post

Módulo Sound languages en FreePBX - Custom languages
Módulo Sound languages en FreePBX - Custom languages
Como se puede apreciar esta es la última configuración que he utilizado. Como he encontrado en alguna documentación que alguien tuInstavo ejecutar el comando 

amportal restart

Aunque es el que he ejecutado, recordemos que está deprecated. Habría que usar fwconsole

Espero que os sirva y sea de utilidad. Si tenéis alguna otra forma de hacer esta configuración, bienvenida sea.

De todas formas, si tenéis dudas, también podéis ver los enlaces de donde he conseguido los audios y parte de las instrucciones que he intentado seguir:


lunes, 11 de enero de 2016

RasPBX: De Asterisk 11 a Asterisk 13

Hoy voy a escribir un post muy rápido. Como voy a hacer una serie de ajustes a mi centralita a la que la versión de Asterisk podría afectar, he decidido actualizarla. Eso sí, no sin antes hacer los backups que creí necesarios: si sigues estas instrucciones, hazlo bajo tu responsabilidad.

Lo primero de todo: por defecto al instalar RasPBX viene con Asterisk 11. Pero existe la posibilidad de actualizar a Asterisk 13. Lo primero que se hace es buscar en la documentación de FreePBX. Y dicen que se lance el script:

asterisk-version-switch

Pero no hay forma de detectarlo. Según explican, si la distribución instalada fuera 100 % FreePBX debería de existir. Pero, parece ser que al ser un port para ARM éste no se encuentra. Por lo que toca buscar en la documentación, que, por cierto, está algo desactualizada. Indican que hay que ejecutar una serie de comandos, que serían los siguientes:

raspbx-upgrade
apt-get update
amportal stop
apt-get purge asterisk11
apt-get install asterisk13
amportal start
Pero, amportal ya no "existe". Ahora, hay que usar fwconsole, que, fundamentalmente es cambiar el nombre del comando y alguna detalle más.

raspbx-upgrade
apt-get update
fwconsole stop
apt-get purge asterisk11
apt-get install asterisk13
fwconsole start
Y así ya lo tendríamos actualizado. Los siguientes pasos ya son las configuraciones que nos mejoren la nueva versión.


viernes, 30 de octubre de 2015

Comando System en Asterisk: Systemstatus devuelve APPERROR

Llevaba tiempo sin publicar. Además, como donde estoy ahora no tengo disponible mi centralita, voy a intentar contarlo lo mejor posible. estaba no tenía disponible la centralita. Después de terminar de escribirlo, he llegado a ella y todo lo que tenía aquí expuesto estaba bien, excepto alguna sintáxis. Sobretodo el poner (o no) comillas, como si de cadenas se trataran, en las llamadas a las funciones de Asterisk

Ahora, tenemos en nuestro home: /home/myUser/ un script, dateFile.sh que hace:

date >> fileDate.log

Con unos permisos:

-rwxr--r-- myUser asterisk

A la hora de trabajar en los contextos en Asterisk, además de usar sus propios comandos, se pueden hacer llamadas al sistema o a scripts que tengamos en él. Por lo que, podríamos tener algo similar a lo siguiente:

[mi_contexto]
exten => s,1,Playback(hello-world)
exten => s,n,System(/home/myUser/dateFile.sh)
exten => s,n,Playback(thank-you-for-calling)
exten => s,n,Hangup

Después, resulta, que miras en los logs y te dice que se ha ejecutado (o, a veces, ni eso), pero mirando en la misma carpeta donde se encuentra el script te encuentras con que no se ha obtenido ningún resultado. Por lo tanto, buscando, te encuentras que el resultado de la operación se guarda en la variable SYSTEMSTATUS.

Por lo tanto, volviendo al contexto (siempre me sale el nombre de ámbito [scope]):

[mi_contexto]
exten => s,1,Playback(hello-world)
exten => s,n,System(/home/myUser/dateFile.sh)
exten => s,n,NoOp("Systemstatus is: " ${SYSTEMSTATUS})
exten => s,n,Playback(thank-you-for-calling)
exten => s,n,Hangup

Y volvemos a pasar el mismo. Ahora, después de lanzarlo, nos devuelve que el resultado es: APPERROR. No es SUCCESS. No es FAILURE.

Resulta, que al buscar qué significa ese error, todos terminan diciendo, más o menos que está indocumentado y que devuelve un resultado distinto de 0 (cero).

¿Y qué hago? No he visto resultados cuando Asterisk ha llamado al script. ¿Y si lo lanzo desde consola? Es importante saber que va a funcionar. Y en efecto, así es. Desde la misma consola funciona.

Bien: para resumir dónde puede estar el problema, volvamos a los permisos asignados. Porque ahí es donde radica el quid de la cuestión.

Nuestro usuario tiene permisos para ejecutar ese script. Asterisk no puede hacerlo. No sólo es cuestión de mirar a qué usuario pertenece dicho fichero, o el grupo al que quieres asignarlo, sino también los permisos de lectura, ejecución, ¿escritura? que quieras asignarle.

Si en vez de tener los permisos de arriba, tuviese:

-rwxr-xr-- myUser asterisk

Y volviésemos a ejecutarlo, ahora ya no nos devolvería ese error tan raro que no da ninguna información. La única pega que alguien podría poner es que lo asigne al grupo de asterisk, en vez de permitir que sean otros. A parte de eso, creo que esto es algo seguro, y, lo más importante de todo: ya hemos obtenido la respuesta de una de las posibles causas de este error.