Descomercializando a FreePBX

8 Dic

Noticias como la del día de ayer de que 3CX adquirió a Elastix nos tomaron a muchos por sorpresa, pues una de las distribuciones de código abierto de Asterisk más conocidas del mundo pasaba a ser propiedad de una empresa que, de entrada, cambió por mucho el alcance del proyecto al poner limitantes en cuanto al uso de la versión «gratuita» del nuevo Elastix 5.

Como resultado de lo que muchos llaman la muerte del proyecto Elastix como lo conocemos, las miradas empezaron a voltear hacia FreePBX: la interfaz gráfica de facto para Asterisk, y de las pocas (junto con IncrediblePBX y Xivo) que siguen operando bajo la modalidad libre.

FreePBX también pasó por lo mismo en enero de 2015, cuando Sangoma adquirió a Schmooze, la empresa que dirigía el proyecto original. Al hacerlo, Sangoma también se ganó los derechos de enfocar el código hacia su propia visión y comenzar a incluir varios (si no es que muchos) componentes comerciales en las nuevas versiones del software.

Esto último molestó a muchos (yo me incluyo), pues el feeling que me dejó es que un proyecto abierto pasaba a recibir comerciales, y si bien esta comercialización del producto es una de las cosas que mantiene viva a la empresa que le da mantenimiento (entiéndase: Sangoma), al ser un proyecto bajo licencia GPL el usuario final no está obligado a usar ninguno de estos módulos, que de hecho, son muy fáciles de retirar.

Si eres como yo y quieres quedarte con un producto que sea 100% de código abierto sin sentirte molestado por los módulos comerciales, simplemente ejecuta los siguientes comandos desde tu consola de FreePBX:

for i in $(fwconsole ma list|grep Commercial|grep -v 'Not Installed'|cut -d' ' -f 2); do fwconsole ma uninstall $i; done

Esta simple línea de código buscará todos los módulos comerciales que se encuentren instalados en el sistema y los eliminará, uno por uno. Si acaso el comando te da un error diciendo que no es posible desinstalar un módulo porque otros dependen de él, simplemente repite el comando 2 o 3 veces para que primero se desinstalen las dependencias base y después el módulo que necesitas.

Ya después de eso solo necesitas aplicar los cambios en el GUI para que todo funcione como antes, y tendrás un sistema FreePBX 100% descomercializado.

¡Suerte!

Asterisk 12

20 Ene

Hola, como muchos de ustedes ya se habrán dado cuenta desde el pasado Diciembre el grupo de desarrolladores de Asterisk liberó la primer versión  estable de Asterisk 12. A pesar de que no es un Branch LTS, Asterisk 12 será (en mi opinión) un parte-aguas con respecto al modo de trabajar y desarrollar soluciones basadas en Asterisk.

Se preguntarán: ¿Qué es lo que lo hace tan especial? Bueno, técnicamente hablando Asterisk 12 es la fusión del proyecto Asterisk y Asterisk SCF, lo cual da como resultado una nueva arquitectura, los desarrolladores están pensando en dejar de lado el «bugguiento» chan_sip (aún se puede usar en Asterisk 12) por el nuevo core de SIP que usa PJSIP; además de un nuevo modelo de desarrollo usando ARI (no confundir con la interfaz de usuario de FreePBX) y de STATSIS.

Siguiendo la línea técnica habrá mucho que aprender ya sea para desarrollar soluciones basadas en ARI (Asterisk REST Interface), familiarizarse con el bus de mensajes de STASIS, comprender los nuevos registros que generará el CDR, aunque el más importante será la migración a CHAN_PJSIP.

De este último podemos decir que la configuración cambia bastante con respecto al «viejo» CHAN_SIP, y es que ahora no solo basta con crear un peer y las definiciones que generalmente usamos como: secret, host, allow, disallow, qualify, context, etc. No, ahora necesitaremos: definir un tipo de transporte para ser usado por el endpoint, crear el endpoint, crear el AOR (Address Of Record) del endpoint, crear las autenticaciones del endpoint (auths), entre otras. Por ejemplo: si se tratase de una línea SIP o si hay que registrarse o si estamos fuera de la red. Suena complejo, ¿no? Lo cierto es que con el uso diario uno se va acostumbrando. Ejemplifico lo anterior:

Sintaxis para Asterisk 1.X, 10 y 11

[1000]
context=home
secret=mysupersecret
host=dynamic
disallow=all
allow=ulaw
allow=g729
callerid="Casa"<1000>
qualify=yes
....

Sintaxis para Asterisk 12:

;TRANSPORTE
[simpletrans]
type=transport
protocol=udp
bind=0.0.0.0

;Dispositivo 1000
[1000]
type=endpoint
context=casa
disallow=all
allow=ulaw
allow=g729
transport=simpletrans
auth=1000
aors=1000

;AUTH
[1000]
type=auth
auth_type=userpass
password=mysupersecret
username=1000

;AOR
[1000]
type=aor
max_contacts=5

Tuve la fortuna de probar las versiones alphas de Asterisk 12 cuando el CHAN_PJSIP se llamaba CHAN_GULP y una de las funciones más atractivas tanto para los desarrolladores como para los usuarios es la posibilidad de registrar más de un dispositivo SIP a la misma cuenta y llamarlas sin necesidad de usar el & en la aplicación Dial. Bueno, la primera vez que lo usas es como comer helado. Para poder hacer esto hay que especificar en la sección AOR cuantos contactos/dispositivos pueden «registrarse» usando la misma información, para el ejemplo anterior serán 5 los dispositivos capaces de usar la información del ENDPOINT 1000, o sea que podemos registrar el télefono IP de la oficina, el teléfono IP de la casa, el softphone del Celular y aún así nos quedan 2 libres para poder conectar un softphone basado en WS por ejemplo o un softphone en cualquier otro sitio de emergencia. Para llamar a todos los contactos registrados basta invocar esta línea en nuestro dialplan:

exten => 1000,1,Dial(${PJSIP_DIAL_CONTACTS(1000)})

Eso sí, tendremos que poner especial atención al CDR cuando llamemos a nuestros contactos porque los demás aparecerán como UNANSWERED.

Hablando de la Interfaz REST de Asterisk(ARI) surgen un sin fin de posibilidades para programar lo que se les ocurra en el lenguaje de programación que deseen, un ejemplo muy vistoso de como usar esta nueva interfaz esta en esta dirección http://ari.asterisk.org/ y usa swagger-ui como ‘core’ para crear la documentación interactiva. Para aquellos que estén muy familiarizados con las APIs REStfull y JSON se les hará pan comido, a su servidor le da dolores de cabeza. Actualmente existen proyectos dedicados a usar ARI para reemplazar las applicaciones Voicemail y APP_QUEUE de Asterisk, lo cual lo hace muy interesante, en el canal de Youtube de  Asterisk está la conferencia de Paul Belanger sobre esto.

Sobre el nuevo bus de mensajes llamado STASIS no tengo mucho que decir ya que aún lo sigo probando y tratando de entender, así que para que doy mala información, lo único que puedo decir es que con la aplicación STASIS podremos generar eventos bajo demanda de un canal para después obtener dichos eventos vía un Websocket. Útil para esas aplicaciones que necesitan estar monitoreando llamadas(y no, no es como AMI de hecho ni ARI ni STASIS están hechas para reemplazar AMI).

Desde la perspectiva del usuario no habrá mucho cambio, salvo que tendrá un sistema mas robusto y si usan PJSIP un canal mas estable con menos BUGS.

Desde la perspectiva del integrador o desarrollador, sólo es cuestión de leer y leer; pero seamos honestos en este mundo de Linux siempre estamos leyendo y leyendo, lo cuál hará  el proceso mas llevadero. Hablando de la instalación surgen nuevas dependencias como PJPROJECT, JANSSON, LibSRTP(esta última la deberías instalar con todos tus asterisk en realidad). Para aquellos que siempre quisieron un Asterisk enfocado a ‘multi-tennant’, Asterisk 12 será su mejor amigo. Y lo mejor de todo es que para aquellos que son FAN FAN de las WEB GUI de Asterisk, la excelente noticia es que FreePBX ha sacado ya una versión beta para usar Asterisk 12, ha sido un gran trabajo en conjunto con los desarrolladores de Digium y sólo como probadita te dejan escoger entre Asterisk 11 o Asterisk 12, si deseas usar sólo CHAN_SIP, o sólo CHAN_PJSIP o ambos.

Viene un camino largo por recorrer con Asterisk 12 y parafraseando a Elio Rojano, «Asterisk 12 es la maduración de un proyecto» que lleva ya 10 años(o más) de vida.

Les dejo estos enlaces para saber más de Asterisk 12:

Instalación y Configuración de Asterisk 12.

Iniciándose con ARI.

Especificaciones del CDR y CEL en Asterisk 12.

Ejemplo de ARI en ASTERISK usando Swagger-UI(necesitas tener un Asterisk12 corriendo y soportando ARI).

¿Quieres saber de Multi-tennant y más información de Asterisk 12? Elio Rojano te regala una presentación I:M:P:R:E:S:I:O:N:A:N:T:E

Desarollo de Paul Belanger para dejar de usar APP_QUEUE basado en ARI.

El github de Payload.

Video acerca de Payload.

Versión mejorada del mensaje “all circuits are busy” de Elastix/FreePBX (v4)

8 Abr

Actualización 2016-01-13: La liga de los archivos de sonido ya está disponible nuevamente.

Hace casi 2 años escribí un artículo sobre como mejorar los mensajes de código de error en llamadas por E1 para Elastix. El tiempo ha pasado y han habido cambios tanto en Asterisk como en Elastix, ocasionando que algunas partes de ese viejo post ya no funcionen, por lo que decidí reescribirlo y mejorarlo.

Este código les permitirá dar mensajes más descriptivos para los códigos de error Q931 que los enlaces digitales arrojan al momento en que una llamada sale mal. Con respecto del post anterior, estas son las mejoras:

  • Existen más códigos de error documentados.
  • Las voces son sintetizadas con acento neutro (para todos los que nos leen en América Latina, esto es más cómodo que el acento español que se tenía antes)
  • Ya solo se requiere meter el código en un único archivo .conf, no es necesario usar el .ael.

Según la versión de Elastix que estemos ocupando, el código debe insertarse en uno de los 2 archivos siguientes:

  • /etc/asterisk/extensions_override_elastix.conf
  • /etc/asterisk/extensions_override_freepbx.conf

Preferentemente usar el extensions_override_elastix.conf, pero si no existe, usar el otro. Coloquen este código al final del archivo:

[macro-outisbusy]
exten => s,1,Progress
exten => s,n,Set(MSG=all-circuits-busy-now&pls-try-call-later) ; Clausula default
exten => s,n,Goto(s-${HANGUPCAUSE},1)
 
; Numero no existe
exten => s-1,1,Set(MSG=no-existe)
; No hay una ruta para llegar a este equipo. Tratar como no existe
exten => s-2,1,Set(MSG=no-existe)
; Celular fuera de area de servicio
exten => s-20,1,Set(MSG=celular-no-disponible&intente-mas-tarde)
; Numero mal marcado
exten => s-28,1,Set(MSG=cannot-complete-as-dialed&check-number-dial-again)
; Numero fuera de servicio
exten => s-27,1,Set(MSG=fuera-servicio&intente-mas-tarde)
; Red fuera de servicio
exten => s-38,1,Set(MSG=fuera-servicio&intente-mas-tarde)
; Falla temporal en la red
exten => s-41,1,Set(MSG=falla-red&intente-nuevamente)
; Congestion por alta cantidad de trafico
exten => s-42,1,Set(MSG=alto-trafico&intente-mas-tarde)
; La central telefonica no dio respuesta
exten => s-102,1,Set(MSG=falla-red&intente-nuevamente)
; Problema de interconexion de carriers
exten => s-127,1,Set(MSG=no-proveedor&intente-mas-tarde)
 
exten => _s-.,n,Playback(${MSG},noanswer) ; Reproducir el mensaje
exten => _s-.n,Macro(hangupcall)

Los nuevos archivos de sonido pueden descargarse desde la liga Sonidos mejorados para Elastix. Recuerden que hay que desempaquetar el .zip y el contenido subirlo a la carpeta /var/lib/asterisk/sounds para que puedan reproducirse sin problemas.

¡Suerte!

Restringe el acceso a carpetas específicas usando Apache

18 Dic

url7[1]Nosotros nunca recomendamos exponer la interfaz web de tu conmutador (entiéndase: FreePBX/Elastix/Trixbox) bajo ningún motivo. Sin embargo, hay casos específicos en los cuales puede existir la necesidad de abrir el puerto HTTP/HTTPS para algunos servicios (ej. un CRM o alguna aplicación in house). Si esto debe de hacerse, es mejor hacerlo teniendo en cuenta algunas funciones básicas de seguridad.

Si aplicáramos lo que vimos en nuestros artículos del modelo de seguridad en Asterisk veremos que no es posible defender a nivel de firewall externo/iptables, ya que no hay una manera de permitir el paso solamente a ciertas carpetas. Para lograrlo, debemos hacer uso de la configuración de Apache la cual nos permite aplicar un mini firewall interno que solo permitirá a ciertas IPs ver ciertas páginas.

Primero, localicemos el archivo /etc/httpd/conf/httpd.conf (en algunos casos cambia de nombre a /etc/apache2/httpd.conf, así que hay que buscarlo con calma). Lo que buscamos es encontrar una directriz que permite el acceso por default a toda nuestra carpeta /var/www/html. El default en Elastix lo encuentran escrito así:

<Directory "/var/www/html">

#
# Possible values for the Options directive are "None", "All",
# or any combination of:
#   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important.  Please see
# http://httpd.apache.org/docs/2.2/mod/core.html#options
# for more information.
#
    Options Indexes FollowSymLinks

#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
#   Options FileInfo AuthConfig Limit
#
    AllowOverride None

#
# Controls who can get stuff from this server.
#
    Order allow,deny
    Allow from all

</Directory>

Haciendo a un lado los comentarios, quedamos con estas instrucciones:

<Directory "/var/www/html">
SymLinksifOwnerMatch ExecCGI MultiViews
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

Queremos ponerle atención a las lineas de Order allow,denyAllow from all. Explicamos lo que quiere decir:

  • Order allow,deny quiere decir que las instrucciones están declaradas como Permite primero, niega después.
  • Allow from all es una cláusula que permite que todos vean todo (default), lo cual le quita todas las restricciones a los usuarios.

El primer paso consiste en cerrar todo y permitir el paso solamente a direcciones IPs de confianza. Esto lo podemos conseguir con lo siguiente:

<Directory "/var/www/html">
SymLinksifOwnerMatch ExecCGI MultiViews
    Options Indexes FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 192.168.1.0/24
    Allow from 127
    Allow from 10.200.1.0/24
</Directory>

¿Notan la diferencia? Ahora estamos negando el paso a todo y permitiendo solamente que las redes de confianza 192.168.1.0/24, 10.200.1.0/24 y la de loopback tengan acceso completo al servidor. En otras palabras: solo las redes locales van a poder entrar a la administración web completa.

Para crear ahora carpetas sin restricción (ej. que cualquier usuario interno o externo las pueda ver), las agregamos como directrices nuevas:

<Directory "/var/www/html/vtigercrm" >
   Order deny,allow
   Allow from all
</Directory>

Y ahora estamos permitiendo el acceso completo a esa carpeta en particular (nuestro CRM). Por cada carpeta debemos crear una directiva <Directory> que permita el acceso.

Recuerden reiniciar el servicio de Apache:

/etc/init.d/httpd restart

# Según nuestra distro, el servicio se llama Apache2
/etc/init.d/apache2 restart

De esta manera, si abrimos http://<direccion ip publica>/vtigercrm podremos ver el CRM de nuestro equipo, pero si tratáramos de ver nuestra interfaz de administración con http://<direccion ip publica>/adminhttp://<direccion ip publica>

Advertencia: Siempre asegúrate de probar tu configuración de seguridad antes de ponerla en producción. Nosotros nunca recomendamos exponer el puerto HTTP/HTTPS, ya que aunque al usar esta configuración no permites el paso a otros usuarios, no quiere decir que no haya vulnerabilidades en tu código mostrado por Apache, así que acepta el riesgo de exponer tu equipo así. Lo mejor que puedes hacer es crear un nuevo equipo que hostee tu aplicación y exponer ese, sin que tengas abierto lo mismo en tu conmutador.

¡Suerte!

Permitiendo llamadas no autenticadas del exterior (con restricciones)

26 Abr

Fuente: http://www.datacenta.com/Pictures/stop.jpg

En este blog y en muchos otros se ha discutido el uso de aplicaciones como fail2ban para impedir ataques de fuerza bruta combinado junto con iptablespara denegar el acceso a fuentes no autorizadas. Existe un caso especial que es cuando tenemos que aceptar las llamadas anónimas del exterior sin importar desde donde se originen, y ese es el caso del que voy a comentar a continuación.

Recibir llamadas anónimas no es malo, pero hay que saber lo que se hace y tomar las precauciones necesarias. Al permitir las llamadas entrantes desde cualquier fuente estamos permitiendo que cualquiera nos contacte via IP, para que así el interesado no tenga que paga costos de LD, ni tampoco tenga que hacer algún setup muy elaborado en su conmutador. Ofrecer un peer de autenticación a cada usuario sería un poco difícil, ya que lo que se espera de estos escenarios es que la comunicación sea en un solo sentido (de afuera nos marcan a nosotros hacia adentro) y también, buscas hacerla lo más fácil de marcar para el usuario final.

En nuestro caso, nosotros permitimos llamadas provenientes del exterior pero solo hacia nuestras extensiones internas. De esta manera, no hay costos relacionados con ataques porque las llamadas nunca vuelven a salir hacia la PSTN. Solo pueden comunicarse a nuestras extensiones internas y DIDs. El único problema, es que a veces los equipos que atacan piensan que al no negar las llamadas, vamos a permitirlas salir, así que nos mandan intentos de ataques de unas 40 llamadas simultáneas, lo que hace que nuestros teléfonos comiencen a sonar una y otra vez.

Para evitar que nuestro conmutador se atiborre de llamadas que no deseamos, pero que al mismo paso permita las llamadas que si queremos, debemos permitir lo siguiente desde nuestro GUI:

  • Permitir llamadas anónimas: si

Y luego hacemos esta combicación de plan de llamadas personalizado y fail2ban (estamos usando FreePBX). Dentro del archivo extensions_custom.conf ponemos:

[ext-did-post-custom]
exten => _X.,1,Macro(contador,${SIPCHANINFO(peerip)},3)
exten => _X.,n,Goto(ext-did-catchall,${EXTEN},1)

[macro-contador]
exten => s,1,GotoIf($[${GROUP_COUNT(${ARG1})}<=${ARG2}]?Permite)
exten => s,n,Noop(LLAMADAS EXCEDIDAS POR ${ARG1}. BLOQUEANDO)
exten => s,n,Congestion()
exten => s,n(Permite),Set(GROUP(${CDR(uniqueid)})=${ARG1})

Lo que estoy haciendo aquí es que siempre que reciba una llamada en mi FreePBX que no esté especificada hacia una extensión y/o DID que tenga dado de alta, el contexto [ext-did-post-custom] lo procesará y hará un análisis del número máximo de llamadas simultáneas que debe permitir.

  • Si se exceden 3 llamadas de acuerdo al ejemplo, debo cortar el paso y enviar un mensaje a consola que diga «LLAMADAS EXCEDIDAS»
  • Si no se excede, permito el paso enviando la llamada hacia la cláusula default [ext-did-catchall]
  • Si recibo llamadas desde una fuente «no autorizada» hacia un número que si existe en mi sistema, el contexto [ext-did] lo procesará de manera normal
  • Si el origen ya fuera autorizado, caerá en el contexto que sea que yo le haya especificado y hará caso omiso de esta configuración

Tras hacer la modificación correspondiente y recargar, el mensaje de «LLAMADAS EXCEDIDAS» ya aparece en mis logs. Ahora debo modificar mi fail2ban para que tome en cuenta este texto y bloquee a nivel de firewall a aquellos que nos manden llamadas en bruto.

Basándome en el artículo de fail2ban anterior que publicamos hace unos meses, modifico el /etc/fail2ban/filter.d/asterisk.conf para que quede así:

failregex = Registration from '.*' failed for '(:[0-9]{1,5})?' - Wrong password
Registration from '.*' failed for '(:[0-9]{1,5})?' - No matching peer found
Registration from '.*' failed for '(:[0-9]{1,5})?' - Device does not match ACL
Registration from '.*' failed for '(:[0-9]{1,5})?' - Username/auth name mismatch
Registration from '.*' failed for '(:[0-9]{1,5})?' - Peer is not supposed to register
LLAMADAS EXCEDIDAS DESDE (:[0-9]{1,5})?
NOTICE.* failed to authenticate as '.*'$
NOTICE.* .*: No registration for peer '.*' (from )
NOTICE.* .*: Host failed MD5 authentication for '.*' (.*)
VERBOSE.* logger.c: -- .*IP/-.* Playing 'ss-noservice' (language '.*')
LLAMADAS EXCEDIDAS POR

Si el fail2ban atrapa estas líneas, bloqueará al host por el tiempo que le hayamos especificado en el archivo jail.conf.

Debo destacar que este es un caso muy especial que pocos querrán utilizar, pero es bueno saber que se puede ser precavido y a la vez, flexible con el uso de tu conmutador. Dado que permitir llamadas anónimas expone tu conmutador, la responsabilidad de este código recae en quien lo usa, por lo que no debes aplicarlo si no estas seguro de que es lo que hará.

¡Suerte!

Recuperar la contraseña de FreePBX

3 Oct

Muchos han pedido un tutorial de como recuperar la contraseña de FreePBX, lo cual es bastante sencillo una vez que tienes la contraseña de root de Linux. Asumiendo esto, el proceso a seguir es bastante fácil, solo hay que cambiar los passwords desde MySQL. Aquí pongo los comandos directos para hacerlo desde el CLI de Linux (estamos asumiendo que el password de root de MySQL es eLaStIx.2oo7)

Si tienes FreePBX 2.5 o inferior:

[codesyntax lang=»bash»]
echo «UPDATE asterisk.ampusers SET password=’minuevopass’ WHERE username = ‘admin'» | mysql -peLaStIx.2oo7 asterisk
[/codesyntax]

Si tienes FreePBX 2.6 o superior

[codesyntax lang=»bash»]

echo "UPDATE asterisk.ampusers SET password_sha1=SHA1('minuevopass') WHERE username = 'admin'" | mysql -peLaStIx.2oo7 asterisk

[/codesyntax]

Con FreePBX 2.6+ la contraseña se guarda como hash SHA1, por lo que no es posible recuperarla. Sin embargo, en versiones anteriores se guardaba en texto plano, por lo que un simple SELECT nos revelaria cual era la contraseña que teniamos.

OJO: obviamente es necesario cambiar «minuevopass» por lo que queramos que sea nuestra nueva contraseña

¡Suerte!

Respaldando la base de datos de configuración de Elastix/FreePBX por SSH

27 Jun

Una gran ventaja que tenemos en Linux es la facilidad de crear procesos automatizados que nos ayuden a ejecutar tareas cotidianas. Para nuestros usos comunes como administrador de equipos basados en Asterisk/Elastix/FreePBX, puede ser una labor cotidiana respaldar la configuración alojada en bases de datos de MySQL.

SSH nos permite ejecutar comandos en servidores Linux remotos y traernos el resultado al mismo tiempo, por lo que resulta ideal para realizar un respaldo en un equpo distante y almacenarlo en nuestro equipo Linux loca. El comando para hacerlo sería el siguiente (asumiendo que usamos la contraseña default de MySQL en nuestro equipo remoto):

[codesyntax lang=»bash»]

ssh 192.168.1.100 "mysqldump -peLaStIx.2oo7 --databases asterisk | gzip -9" > respaldo.sql.gz

[/codesyntax]

El comando de arriba se encargará de hacer un dump de la BD asterisk. Si quisiéramos traernos también el CDR, hariamos lo siguiente:

[codesyntax lang=»bash»]

ssh 192.168.1.100 "mysqldump -peLaStIx.2oo7 --databases asterisk cdr | gzip -9" > respaldo.sql.gz

[/codesyntax]

O si quisiéramos traernos TODAS las bases de datos:

[codesyntax lang=»bash»]

ssh 192.168.1.100 "mysqldump -peLaStIx.2oo7 --all-databases | gzip -9" > respaldo.sql.gz

[/codesyntax]

Hay que tomar en cuenta que estamos asumiendo lo siguiente:

  • La IP de nuestro servidor remoto es 192.168.1.100. Hay que reemplazar esta por la IP real de nuestro equipo del que queramos copiar el respaldo
  • El password default del usuario root del MySQL remoto es eLaStIx.2oo7. Nuevamente, hay que reemplazar este por el correspondiente al servidor

Adaptando este comando podemos prácticamente hacer cualquier tipo de respaldo remoto. Si agregamos la conexión mediante llaves públicas y privadas, podemos dejar estas actividades programadas en el cron para no tener que estar proporcionando la contraseña de SSH cada vez que nos conectamos.

¡Suerte!

Activar las grabaciones por default para todos los usuarios en Elastix/FreePBX

22 Jun

Algunas veces como profesionales llegamos a un conmutador que ya tiene alguna configuración cargada y se nos pide que hagamos modificaciones. Imaginen que de pronto llegan a un callcenter de 100 posiciones que hace uso de Elastix/FreePBX y les dicen: «Queremos que todas las llamadas de todos los usuarios se graben», pero analizando las extensiones se dan cuenta que todas (o ninguna) tiene la grabación habilitada, y que la mayoría se encuentran en modo de grabación «On Demand», cuando ustedes lo que quieres es que sea «Always»

¿Cómo lo hacen? Espero que no piensen en ir extensión por extensión haciendo el cambio…

Para solucionar esto rápidamente, necesitamos hacer 2 cosas:

  1. Modificar la tabla de MySQL asterisk.users
  2. Modificar el Asterisk DB para que coincida con los valores que necesitamos

Y ambas las logramos fácilmente con el siguiente código (desde el Linux CLI):

[codesyntax lang=»bash» tab_width=»3″]

# Primero nos hacemos cargo del AstDB. Este ciclo se encarga de cambiar
# a todos los usuarios que ya existen en el PBX
for i in `asterisk -rx "database show"|grep recording|cut -d/ -f3`
do
	asterisk -rx "database put AMPUSER $i/recording out=Always|in=Always"
done

# Y ahora actualizamos MySQL
echo "UPDATE asterisk.users SET recording='out=Always|in=Always'" | mysql -peLaStIx.2oo7

[/codesyntax]

Este, junto con cualquier otro tip que les dé no debe ser tomado como una «receta» de cocina, ya que si no hacemos las cosas bien, podemos echar a perder algo. Asegúrate que entiendes el ciclo que se propone arriba así como el query que te planteo. Si le piensas bien, esto te puede servir para modificar de manera grupal cualquier cosa que quieras dentro de Elastix/FreePBX, sin que tengas que ir extensión por extensión. Solo falta encontrar la tabla y el valor adecuado y lo demás es muy sencillo.

¡Suerte!

Balanceo de troncales en Elastix (round robin)

21 Jun

Este mini tutorial aplica para FreePBX/Trixbox/Elastix.

La idea tras de esta guía es crear un balanceador de carga. Es decir, tener una sola troncal que automáticamente rote una serie de troncales posibles por las cuales pueden salir las llamadas. Dichas troncales pueden ser DAHDI, IAX2 o SIP, así que esto le agrega flexibilidad.

El código sería algo así (la sintaxis está en AEL para hacer la programación más simple)

[codesyntax lang=»c» tab_width=»3″ blockstate=»expanded»]

// Archivo extensions.ael
context roundrobin {
	_X. => {
		Set(max=10);
		Set(n=0);
		repetir:
		Set(n=${n}+1);
		Set(last=$[(${DB(rr/last)}+1)%${max});
		Set(DB(rr/last)=${last});
		Dial(${DB(rr/trunk${last})}/${EXTEN},30,g);
		if (${DIALSTATUS}!="ANSWERED") {
			if (${n}<${max}) {
				// Repetir ciclo
				goto repetir;
			};
		};
		Hangup;
	};
};
[/codesyntax]

Nos faltan dos pasos:

  1. Inicializar el AstDB con el valor de la primer troncal. Esto es sencillo ejecutando el comando database put rr last 1 dentro del CLI de Asterisk
  2. El paso final es crear una troncal ‘Custom’ dentro de FreePBX/Elastix y agregarla como Local/{OUTNUM}@roundrobin/n. Esto hará uso del canal Local y nos permitirá balancear la carga entre nuestras troncales.

Todas las llamadas que vayan hacia esta troncal ‘Custom’ harán un balanceo de carga entre las lineas contratadas. Util si tienes varias lineas de diferentes proveedores y quieres que el consumo se haga equitativamente.

Suerte,

 

Recuperar la contraseña de Elastix/FreePBX

13 Jun

En ocasiones me he enfrentado a la tarea de apoderarme del control de algún servidor Elastix/FreePBX porque el cliente no ha quedado satisfecho con el servicio que su proveedor anterior le ofrecía, así que dado que el cliente no conoce los accesos y los que si lo conocen no me lo van a dar «por la buena», entonces tengo que recuperarlo yo.

Obtener las contraseñas de admin tanto para Elastix como para FreePBX no es complicado, lo único que se requiere es tener acceso de root por SSH (si no tenemos este acceso, podemos obtenerlo siguiendo una de tantas guías para recuperar el password de root que hay en internet). Ya adentro del sistema, podemos hacer lo siguiente desde el CLI de Linux:

echo "UPDATE acl_user SET md5_password='827ccb0eea8a706c4c34a16891f84e7b' WHERE name='admin';" | sqlite3 /var/www/db/acl.db

Con esto cambiamos el password de Elastix a admin/12345. Ahora, para FreePBX:

echo "UPDATE asterisk.ampusers SET password_sha1 = SHA1('12345') WHERE username = 'admin';" | mysql -peLaStIx.2oo7

(estoy asumiendo que tu versión de FreePBX ya ocupa passwords en SHA1 y que el password de root de MySQL sigue siendo el default)

Y con esto cambiamos también el password de FreePBX a admin / 12345. Está de más decir que la primera acción a ejecutar debe ser cambiar estas contraseñas por algo más seguro, pero para ello ya podemos hacerlo accediendo a las interfaces gráficas correspondientes.

Suerte a todos,