Get Firefox

Firefox 4.0

stopsoftwarepatents.eu petition banner Manifiesto por la liberación de la cultura 
No a la traza privada
Últimos cambios
Últimos Cambios
Vote for Public Maps - Reject INSPIRE! Geocaching
Mi estado actual en Jabber/XMPP: - jabberES - jabber.org

Estadísticas de Conexiones RADIUS y MRTG

Última Actualización: 28 de Diciembre de 2.000 - Jueves

15/Ene/03: Este proyecto está abandonado; ya no me resulta necesario, ni se ve interés por parte de otras personas.

En esta página se describe una librería software cuyo fin es analizar los ficheros de detalle generados por un servidor RADIUS y extraer información útil: tráfico generado, número de llamadas, duración de las llamadas, números de teléfono, etc. La librería se ha ampliado para obtener datos de otras fuentes no RADIUS, como archivos de logs MRTG.

Los ISPs que utilicen MRTG para obtener estadísticas deberían leer mi página web sobre el truncado de datos que realiza este programa.

Esta librería puede invocarse tanto como CGI como desde la línea de comando. En cualquier caso, su salida es en formato HTML.


Lista de Correo

15/Ene/03: Esta lista está cerrada; el proyecto ya no me resulta necesario, ni se ve interés por parte de otras personas.

La librería conexiones dispone de una lista de correo de muy bajo tráfico, para intercambio de trucos, sugerencias, bugs, etc. En dicha lista se publican, también novedades como la aparición de una nueva versión o la corrección de algún problema importante.


Invocación

Esta librería puede invocarse de varias formas:


Configuración y Enlazado

Versión 19

La configuración de la librería se realiza enlazándola con la configuración que deseamos utilizar. Por conveniencia se va a describir el caso más habitual, si bien la librería es más flexible y pueden adoptarse otros esquemas.

Una vez descomprimida, debemos irnos al directorio de la librería y editar el fichero "conf.c". En ese fichero hay que definir varios valores que serán utilizados por la librería. No deben modificarse los parámetros que no se indiquen. En orden de aparición:

Una vez configurado adecuadamente el fichero "conf.c" escribimos make config y procedemos a responder a las preguntas que se nos van planteando:

Podemos reconfigurar el sistema tantas veces como sea necesario repitiendo los pasos anteriores.

Una vez completada la instalación, ejecutamos "make". Si queremos instalar el CGI, ejecutamos "make install". Debemos comprobar que, una vez instalado, el CGI tiene permisos de ejecución para el usuario bajo cuyo UserID se ejecuta el servidor web.


Pruebas de funcionamiento

Antes de instalar la librería de forma que sea accesible desde Internet, como CGI, es conveniente que todo está funcionando como debe:


Configuración avanzada

Una vez que tenemos la librería funcionando, es el momento de sacarle el máximo partido. Para ello procedemos a instalar en un "cron" el script "diario", que se encarga de:

  1. Generar archivos históricos mensuales de nuestros usuarios, que luego serán accesibles a través del CGI.

  2. Rotar los logs de forma diaria, de manera que sean más sencillos y rápidos de tratar y procesar gracias al empleo de la tecnología caché desplegada en la versión 19 de la librería.

El tema más complicado y proclive a errores en esta etapa es el tema de los permisos en los ficheros, y del usuario bajo el cual se va a ejecutar el script "diario". Evidentemente dicho script, que se ejecuta con un "cron", debe tener la capacidad de realizar su trabajo. Ello puede implicar, incluso, algunos riesgos de seguridad que el administrador de sistemas debe conocer para poder valorar adecuadamente las variables puestas en juego.

El script "diario" está diseñado para ser ejecutado de forma diaria, a las 0:00 de cada día (en el cambio de día). Está diseñado para ser ejecutado desde un "cron", no desde la línea de comandos, pero es seguro ejecutarlo desde la línea de comandos EXCEPTO que estemos en el día 1 de un mes cualquiera. Eso es así porque el script trata de un modo especial los día 1, al intentar regenerar los archivos históricos de los usuarios. La ejecución del script en cualquier otro momento tiene efectos secundarios "seguros". Ello nos permitirá comprobar su correcto funcionamiento antes de pasarlo al "cron", que se encargará de ejecutarlo todas las medianoches.

cc


Comandos y opciones disponibles


Interioridades

Interfaz lee_log:

Esta interfaz es la utilizada por todos los módulos que proporcionan datos de entrada a la librería. Ajustándose a esta interfaz, cualquier programador puede dotar a la librería de entradas arbitrarias, ajustadas a sus necesidades.

Los tipos de datos t_log, registro_log y log_estado se definen en "lee_log.h".

Interfaz lee_log_cache:

Esta interfaz es un superconjunto de la anterior, y está diseñada para poder utilizar un sistema caché intermedio, con los archivos de registro preprocesados. De esta forma la librería es más rápida.

Interfaz salida:

Esta interfaz proporciona diferentes posibilidades de visualización. Cada módulo es un formato de salida diferente.

Los tipos de datos t_salida_cabecera y t_salida_conexiones se definen en "salida.h".

Interfaz salida_grafico:

Los módulos de este tipo proporcionan una visualización gráfica, no de texto.

Interfaz called_id:

Esta interfaz devuelve el nombre asociado a un número de teléfono concreto. Consta de una única estructura del tipo t2n, declarada en called_id2.h.

Rutinas lee_log

Rutinas tiempo

Permiten fijar intervalos a la hora de elegir qué registros nos interesan. Dan valores a las variables globales "time_t tiempo_inicial" y "time_t tiempo_final"

Rutinas version

El fin de estas rutinas es proporcionar información sobre la versión que se está ejecutando de la librería.

Rutinas util

Diversas rutinas optimizadas. Se redefinen las rutinas estándar para que la librería emplee las rutinas optimizadas, usando #undef y #define.


Caller ID

En la distribución se incluye un programa en C y un script que, usando las funcionalidades de la librería "CONEXIONES", realiza un listado de usuarios que conectan a través de varios números de teléfono diferentes. Ello puede indicar, por ejemplo, que una misma cuenta de acceso está siendo empleada por varias personas distintas. Debe compilarse el programa en C con algo similar a

gcc conexiones_solaris_sparc.o caller_id.c -o caller_id (Solaris/Sparc)
gcc conexiones_linux_x86.o caller_id.c -o caller_id (Linux/x86)

Para obtener el listado se ejecutará el script "caller_id.sh".


Versión 14

La configuración de este módulo se realiza enlazando la librería con los datos concretos de cada instalación en particular. Los cambios respecto a la versión 13 son muy numerosos, tanto en posibilidades de configuración como en su estructura. Por ejemplo, numerosas variables que en la versión 13 sólo podían contener un valor, ahora son matrices de tamaño ilimitado. Los valores que se pueden configurar son los siguientes:

La librería se distribuye con un fichero "Makefile". Por lo tanto basta con teclear "make" para generar la librería y un par de ejecutables de demostración.


Versión 13

La configuración de este módulo se realiza enlazando la librería con los datos concretos de cada instalación en particular. Los valores que se pueden configurar son los siguientes:

En la distribución se incluye un archivo "conex_conf.c", con una configuración de ejemplo. Copie dicho fichero a otro llamado, por ejemplo, "radius.c", adáptelo a sus necesidades y enlace todos los modulos con un comando similar al siguiente:

gcc conexiones_solaris_sparc.o radius.c -o conexiones (Solaris/Sparc)
gcc conexiones_linux_x86.o radius.c -o conexiones (Linux/x86)

Por último, el fichero se instala en el directorio CGI correspondiente, y se comprueba que el UserID que lo ejecute desde el servidor web, tendrá permisos para acceder a los ficheros RADIUS y a los archivos históricos.


Configuraciones Especiales

Todas las configuraciones locales se definen a través de un fichero como el "conex_conf.c" que se incluye de ejemplo. Dichas configuraciones son lo bastante flexibles como para poder emplear la librería en entornos muy variados.

En algunos casos, no obstante, la adaptación a un problema en particular no es obvia.


Archivos Históricos

Una de las características interesantes de la librería "CONEXIONES" es su capacidad para generar estadísticas históricas, generalmente mes a mes. Para ello se van almacenando las estadísticas, usuario a usuario, en el directorio que se haya configurado. Cada usuario es un fichero, cuyo nombre coincide con su UserID.

Analizando la salida HTML de la librería, se observa la intercalación de etiquetas "<!mensual>". Dichas etiquetas aparecen siempre solas en una línea de la salida, y delimitan las zonas "interesantes" de las puramente anecdóticas. De esta forma, si se pasa la salida de la librería a través de un script apropiado, se filtraran los datos irrelevantes, y el resultado puede concatenarse con lo que ya existiese en el archivo histórico.

Una vez al mes, o con la periodicidad que se estime oportuno, se realizan los siguientes pasos:

  1. Generación de un listado de usuarios con acceso RADIUS
  2. Para cada uno de esos usuarios, ejecutar la librerí sobre él
  3. Filtramos los datos irrelevantes
  4. Concatenamos el resultado con el archivo histórico de dicho usuario
  5. Una vez completados todos los usuarios, rotamos los logs RADIUS para que las estadísticas empiecen de cero con el nuevo mes

A continuación se incluye un script para cubrir esa necesidad. El script se ejecuta con el cambio de mes, vía CRON. Hay que tener mucho cuidado para que el proceso tenga permiso de escritura en el directorio histórico.

# Guarda los logs antiguos y empieza desde cero otra vez
#
# Jesús Cea Avión
# jcea@argo.es
#
# 21/May/97
#
# 26/Jun/97 Añadidos CSIV de Bilbao y Sevilla
#
# 10/Dic/97 Guarda las estadísticas mensuales de cada usuario
#
# 16/Ene/98 Corrige fallos en el script: ENE->JAN, y que en ese
#           mes ponga el AÑO anterior. Además, se invoca el AWK con
#           el PATH completo, ya que desde el CRON pillaba el antiguo (no GNU).
#
# 05/May/98 Corrije un fallo con la fecha que se grababa
#
# 30/Sep/98 Si en el fichero RADIUS se define "password=" sin espacio
#           entre el "password" y el "=", no se reconocía el usuario.
#           CAMBIO esa parte por otra, menos proclible a problemas y más rápida.
#

# Guarda las estadísticas de cada usuario

#cat /etc/raddb/usuarios_INFOVIA | sed 's/=/ /g' | awk '$2=="Password" {print $1}' | \
#        sed 's/@.*//g' >/tmp/conexiones.$$

grep "@" /etc/raddb/usuarios_INFOVIA | sed 's/@.*//g' >/tmp/conexiones.$$

cd /export/home/argo/infovia/usuarios/

# Se ejecuta tras las doce de la noche, así que pone el mes anterior.
# Si estamos en enero, pone diciembre del año anterior.

fecha=`date | /usr/local/bin/awk '$2=="Feb" {mes="Enero"} \
        $2=="Mar" {mes="Febrero"}       $2=="Apr" {mes="Marzo"}         \
        $2=="May" {mes="Abril"}         $2=="Jun" {mes="Mayo"}          \
        $2=="Jul" {mes="Junio"}         $2=="Aug" {mes="Julio"}         \
        $2=="Sep" {mes="Agosto"}        $2=="Oct" {mes="Septiembre"}    \
        $2=="Nov" {mes="Octubre"}       $2=="Dec" {mes="Noviembre"}     \
        $2=="Jan" {mes="Diciembre"; $7=$7-1} {print mes" "$7}'`

for i in `cat /tmp/conexiones.$$`
do
        touch $i
        echo "<center><h2>$fecha</h2></center>" >> $i
        /export/home/webmaster/cgi-bin/conexiones $i | \
        /usr/local/bin/awk '$1=="<!mensual>" {flag=!flag; next} flag {print}' >> $i

done
        
rm -f /tmp/conexiones.$$



# Madrid
cd /var/adm/radacct/172.16.192.1
mv detalle detalle.2
touch old
cat detalle.2>>old
rm -r detalle.2


# Barcelona
cd /var/adm/radacct/172.16.193.1
mv detalle detalle.2
touch old
cat detalle.2>>old
rm -r detalle.2

# Valencia
cd /var/adm/radacct/172.16.192.33
mv detalle detalle.2
touch old
cat detalle.2>>old
rm -r detalle.2

# Bilbao
cd /var/adm/radacct/172.16.192.49
mv detalle detalle.2
touch old
cat detalle.2>>old
rm -r detalle.2

# Sevilla
cd /var/adm/radacct/172.16.192.65
mv detalle detalle.2
touch old
cat detalle.2>>old
rm -r detalle.2

Por supuesto, este script no se lista para ser empleado tal cual, sino que se incluye como ejemplo de las posibilidades del programa.

En el diseño del script se advierte una "race condition", ya que entre el primer usuario y el último pueden transcurrir algunos minutos, en función de la velocidad del equipo y del número de usuarios en juego. En el caso de ARGO no es relevante. En el caso de otros proveedores más "cargados" resulta recomendable mover todos los fichero RADIUS a otro lugar y empezar ficheros RADIUS nuevos ANTES de iniciar el proceso usuario por usuario. Esa es la forma adecuada de hacerlo pero, como ya he dicho, en ARGO no es un problema y usar esa técnica obliga a tener dos librerías "CONEXIONES" separadas: una para el uso diario (que opera sobre los ficheros de detalle normales) y otra para el uso mensual, que opera sobre las salvaguardas de dichos ficheros.


Cosas por Hacer


La Librería


Historia



Firefox 4.0 Python Zope ©1998-2000 jcea@jcea.es