Como exportar el AstDB (Asterisk Database)

11 Ene

En algunas ocasiones nos hemos topado con clientes cuyo sistema empieza a hacer cosas… raras. Resulta que el call forward deja de funcionar correctamente, o que las llamadas se ciclan después de entrar al IVR y apuntar hacia alguna dirección. Esto lo hemos visto en casos con FreePBX/Elastix donde el equipo por alguna error (a veces falla de hardware) se traba y es necesario reiniciarlo físicamente, haciendo que archivos como el astdb se corrompan y queden incompletos. Esto ocasione que nuevos valores no puedan ser guardados en el astdb, o que valores viejos no puedan ser modificados.

Un síntoma típico de estos problemas es cambiar algún valor desde el GUI que ocasione que el AstDB cambie. Ejemplo: un nuevo speeddial del addressbook o activar/desactivar el call-waiting de alguna extensión. Si nos hemos preguntado: ¿por qué Asterisk no está guardando los valores que le doy? Esta es una probabilidad…

La solución más radical es la siguiente:

  1. Detener Asterisk
  2. Eliminar el archivo /var/lib/asterisk/astdb
  3. Reiniciar Asterisk

Con esto, Asterisk creará una nueva astdb desde cero, pero habremos perdido cualquier valor que ya existiera allí. Cualquier campo personalizado se perdió tras este paso.

¿Cómo podemos exportar los valores del astdb, a manera que podamos restaurarla en una nueva recién creada que no tiene estos errores?

Una respuesta a este problema fue crear un script que se conecte por el AMI y haga un dump en código bash que después se pueda usar para aplicarlo en cualquier otro momento. Este dump seria una serie de comandos que harían una conexión a Asterisk indicándole recrear los valores. El código es el siguiente:

[codesyntax lang=»php» title=»/var/lib/asterisk/agi-bin/astdb.php»]

#!/usr/bin/php -q
<?php
include «phpagi-asmanager.php»;

$user = ‘admin’;
$pass = ‘elastix456’;

$agi = new AGI_AsteriskManager();
$agi->connect(‘127.0.0.1’,$user,$pass);

$r = $agi->database_show();
$x = array();
echo «#!/bin/bashn»;
foreach ($r as $k => $v) {
echo «asterisk -rx ‘database put «.substr($k,1,strpos($k,’/’,2)-1) . ‘ ‘ .
substr($k,strpos($k,’/’,2)+1) . ‘ ‘.
«»$v»‘».
«n»;
}

?>

Hay que notar que en el código estoy incluyendo al archivo phpagi-asmanager.php el cual es un componente de la clase PHPAGI que existe en todas las distribuciones de FreePBX (y eso incluye a Elastix/Trixbox). Yo recomiendo colocar este código en un archivo como /var/lib/asterisk/agi-bin/astdb.php, ya que esa carpeta ya contiene la librería arriba mencionada.

Invocarlo es muy sencillo. Lo hacemos ejecutale y lo corremos:»

[codesyntax lang=»bash»]

chmod 755 /var/lib/asterisk/agi-bin/astdb.php
/var/lib/asterisk/agi-bin/astdb.php > /tmp/astdb.sh

[/codesyntax]

Tras ejectutar el comando anterior, tendremos un archivo astdb.sh dentro de la carpeta /tmp. Este archivo tendrá un contenido parecido al que sigue:

[codesyntax lang=»bash» title=»/tmp/astdb.sh»]

#!/bin/bash
asterisk -rx 'database put AMPUSER 100/cidname "Juan Perez"'
asterisk -rx 'database put AMPUSER 100/cidnum "100"'
asterisk -rx 'database put AMPUSER 100/device "100"'
asterisk -rx 'database put AMPUSER 100/followme/changecid "default"'
asterisk -rx 'database put AMPUSER 100/followme/ddial "DIRECT"'
asterisk -rx 'database put AMPUSER 100/followme/fixedcid ""'
asterisk -rx 'database put AMPUSER 100/followme/grpconf "DISABLED"'
asterisk -rx 'database put AMPUSER 100/followme/grplist "815#"'
asterisk -rx 'database put AMPUSER 100/followme/grptime "20"'
asterisk -rx 'database put AMPUSER 100/followme/prering "15"'
asterisk -rx 'database put AMPUSER 100/language "es"'

[/codesyntax]

Estos son una serie de comandos que podemos ejecutar para hacer que el nuevo Asterisk importe el contenido del AstDB anterior para tener acceso a la misma información que el anterior. ¿Por que no simplemente respaldamos el archivo /var/lib/asterisk/astdb? Porque al reemplazar el nuevo archivo sobreescribiríamos todo, y perderiamos cualquier personalización que hubiera en el viejo sistema. Además, si respaldamos un archivo dañado, lo único que conseguiríamos seria copiar el daño de nuevo.

Espero esto les sirva. A nosotros nos resolvió el problema de un cliente que no le permitía guardar nueva información (sus speeddials no podían ser editados ni podiamos agregar nuevos).

¡Suerte!

Christian Cabrera

Soy ingeniero en comunicaciones con especial interés en el área de voz sobre IP y tecnologías sobre información. He usado Asterisk de manera diaria desde hace más de 18 años. En el 2011 co-fundé Enlaza Comunicaciones, una empresa que se especializa en brindar servicios profesionales de consultoría sobre voz sobre IP basadas en Asterisk, así como servicios de interpretación simultánea y traducción.