Cómo mover las grabaciones de llamadas de Asterisk guardadas en RAM

Este artículo recoge un script mejorado para poder mover archivos (en este caso llamadas telefónicas realizadas a través de Asterisk) sin mover los archivos abiertos (las llamadas en curso). Es muy típico tener que realizar grabaciones de llamadas de Asterisk en un Call Center por ejemplo.

Para hacer este script he utilizado como base uno que encontré aquí, gracias a su autor.

Recordaros antes de empezar lo que significan los colores en Aplicaciones y Sistemas:

Textos escrito en la línea de comandos: Azul
Salida por la línea de comandos: Verde
Nombres de archivos y contenido de archivo: Marrones

Justificación

Asterisk es un software de telefonía (muy utilizado en VoIP) que permite construir una centralita telefónica con múltiples funcionalidades, entre ellas la grabación de llamadas. Normalmente, por cuestiones de rendimiento, las grabaciones de llamadas las realizamos sobre una unidad RAM, o disco RAM (si queréis saber cómo crear uno podéis seguir este enlace), para luego, al cabo de ciertos intervalos de tiempo, almacenarlas definitivamente en una unidad de disco, por ejemplo, en un servidor NAS. De esta forma, también evitamos el deterioro que supone en la unidad de disco el continuo esfuerzo de escritura por la grabación de múltiples llamadas.

Claro que esto supone un riesgo; una falla eléctrica y se pierden las grabaciones. Por eso conviene guardar de cuando en cuando esas grabaciones en un lugar definitivo.

Este script lo he adaptado a mis necesidades. Todas las grabaciones se guardan en un subdirectorio que se crea cada día, con la fecha del mismo, en formato gsm. El script va buscando inicialmente ese subdirectorio, mira dentro de él los archivos que no están siendo utilizados, y finalmente los mueve a su ubicación definitiva.

Si no tuviésemos la precaución de mirar primero si están siendo utilizados o no, se podrían mover archivos incompletos, con la pérdida de información que ello supone.

Desarrollo

El script que propongo y que a mí me funciona 😉 es el siguiente:


#!/bin/bash
# Para mover las llamadas grabadas en una unidad RAM
# Revisa el contenido de esa unidad y lo pasa a un disco duro
# tenemos un directorio en esa unidad,
# con subdirectorios que se generan diariamente
## Variables con los directorios a utilizar
RAMDIR="/tmp/discoram"
ALMACEN="/mnt/servidor_almacen" #unidad remota, previamente montada, almacén definitivo
cd $RAMDIR
ls -1d */ > listado.borrable
while read dia #cada línea un directorio diario, se extrae del archivo "listado_borrable"
do # aquí empieza la parte de mover archivos en sí, solo los de sonido formato gsm
for i in $(ls -1 $RAMDIR/$dia/*.gsm) ; do
lsof  $i #comprueba los archivos abiertos para no moverlos todavía
valor=$? #estado de salida, si es 0 el archivo está abierto
if [ $valor -ne 0 ] ; then
if [ -d $ALMACEN/$dia ] ; then
echo carpeta de grabaciones comprobada
else
mkdir $ALMACEN/$dia
#solo crea la carpeta si es necesario
fi
mv $i $ALMACEN/$dia
fi
done
rmdir $dia 2> /dev/null #si queda vacía la borramos
done < listado.borrable #aqui termina el while

Lo podéis descargar de aquí si os es más cómodo.

No olvidéis opinar y aportar vuestras soluciones personalizadas, siempre se puede mejorar.