Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Estadísticas de Conexiones RADIUS y MRTG: Historia

Ú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.


Historia

     

  • 28/Dic/00: versión 21

    • Calendario de festivos de 2.001. Son festivos nacionales los siguientes días: 1 de Enero (año nuevo), 13 de Abril (viernes santo), 1 de Mayo (fiesta del trabajo), 15 de Agosto (asunción de la Virgen), 12 de Octubre (día de la hispanidad), 1 de Noviembre (todos los santos), 6 de Diciembre (día de la constitución española), 8 de Diciembre (Inmaculada Concepción) y 25 de Diciembre (navidad).

    • Gestiona correctamente la posibilidad de utilizar la librería en un año para el cual no tenemos información de festivos. Para marcar este hecho, la librería muestra todo el mes como festivo. Las versiones previas de la librería mostraban días festivos al azar.
     

  • 27/Nov/00: versión 20

    • Cuando procesamos una entrada desconocida, la ignoramos. Anteriormente se abortaba con un error.

  • 03/Jul/00: versión 20b14

    • Cuando leemos un registro "Acct-Status-Type" desconocido, informa de ello e indica el valor que no se soporta.

    • Corrige un pequeño problema al intentar dibujar el gráfico de conexiones de un usuario desconocido.

    • Corregida la dirección de los registros MRTG, por enésima vez.

    • Eliminados un par de comentarios en el "Makefile", que parecen dar problemas con la versión Digital Unix del "make".

    • Soporte para librerias dinámicas. Modifico "make config" para hacerles sitio. Esta funcionalidad podría ser poco portable. Hay que experimentar con ella.

  • 28/Feb/00: versión 20b13

    • Meto la mayoría de los cambios realizados por Juan José Sánchez Mesa (jujosame@larural.es) para que mi librería compile correctamente en Windows NT. En el momento actual, la versión Windows tiene las siguientes peculiaridades:

      • Siempre se indica "usuario desconocido. Cuenta corporativa".

      • No permite obtener los logs RADIUS a partir de la salida de un proceso externo.

      • Construyendo la caché, no se realizan bloqueos de los ficheros. Este cambio es potencialmente peligroso para la integridad de los archivos de detalle.

  • 24/Feb/00: versión 20b12

    • Modificado el script "motd_stats_web", ya que sólo funciona correctamente con el AWK de GNU.

  • 22/Feb/00: versión 20b11

    • Añadido el script "motd_stats_web", que crea mensajes MOTD a partir de los datos de número de conexiones y tráfico web.

    • "Makefile" adaptado para crear una distribución que incluya el script "motd_stats_web".

    • Se ha modificado el script "diario" para genere los MOTD de los webs hospedados en Argo. Ésta es una tarea bastante lenta, y el script trabaja con un fichero temporal hasta que tenga generado el MOTD, para evitar dejarlo en blanco durante su lenta generación.

  • 22/Feb/00: versión 20b10

    • La librería muestra un MOTD (documento del día) cuando se producen accesos desde determinados usuarios. El directorio donde residen se configura con "make config".

    • Definimos usuarios RADIUS equivalentes a la hora de ostrar el MOTD. Ello permite que varios usuarios RADIUS tengan acceso a un MOTD en el que se muestran, por ejemplo, las estadísticas de su servidor web.

  • 21/Feb/00: Versión 20b9

    • Las URLs aparecen entrecomilladas.

  • 10/Feb/00: Versión 20b8

    • Comprueba registros duplicados a la hora de dibujar el gráfico de conexiones. Ello permite que efectivamente se vayan alternando los colores de las conexiones, aunque se hayan recibido registros duplicados.

    • Ampliada la herramienta whowas para que también indique las IPs.

    • Ampliada la herramienta whowas para que admita dos parámetros. Si ponemos solo uno, nos indica los datos de las conexiones que estaban en curso en ese momento. Si ponemos dos parámetros (dos fechas) indica los datos de todas las conexiones que tengan algún solapamiento con el intervalo indicado.

    • Cuando el administrador introduce una dirección IP en vez de un nombre de usuario, al seleccionar los archivos históricos aparece "No se puede encontrar información previa sobre ese usuario". Solucionado. Cuando se pone la IP, selecciona el archivo histórico de ese usuario.

    • Cuando se introduce una IP, en los enlaces de información histórica, gráficos, etc., se pone el login. Esto se hace así porque es más sencillo y permite obtener los datos de un usuario, cuando se introduce su IP, aunque se desconecte, una vez generada la página inicial.

    • Si una conexión no es cliente nuestra y, a pesar de ello, selecciona gráficos, mata el CGI. Eso no es problema, porque el servidor web lanza otro proceso de nuevo. Solucionado.

  • 10/Feb/00: Versión 20b7

    • Cuando un usuario ve rechazada su llamada porque está conectado ya, la librería ve los STOP y dice que está desconectado. Ello es porque el servidor RADIUS almacena el STOP en el histórico, con un tiempo de sesión de 0 segundos, PERO la IP de la sesión que ya está establecida. Se me ocurre que ésta es, precisamente, la forma de distinguir entre usuarios rechazados por clave incorrecta, etc., y por superación de sesiones.

      NOTA: He comprobado un poco el asunto y he llegado a la siguiente conclusión:

      • Si el usuario está intentando abrir una sesión multilink y no se le permite, aparece un tiempo de sesión de 0 segundos y la IP de la sesión a la cual pretendía enlazarse. Aparecen también datos como Caller-ID, etc. A efectos prácticos lo que sale es casi equivalente a un STOP normal.

      • Si se trata de una conexión completamente independiente, el tiempo de sesión es 0, y no aparece ninguna IP. Puede aparecer o no el Caller-ID y similares. Probablemente dependa del NAS al que se conecte el usuario.

    • Cuando se intenta saber el estado (conectado o desconectado) actual de un usuario, se ignoran las desconexiones cuyo identificador de sesión no coincida con el "start". De esta forma podemos reconocer perfectamente los dos casos anteriores.

    • Mejorada la gestión de "stops" duplicados. Ahora también funciona aunque haya registros adicionales entre los duplicados.

  • 07/Feb/00: Versión 20b6

    • Con el fin de portar la librería a otras arquitecturas, sobre todo considerando el "porting" a Windows, implmento yo mismo las operaciones sobre los tipos long long cuando el compilador no tiene soporte nativo. Para ello creo un nuevo módulo, llamado "portable".

      No podemos, sencillamente, eliminar las operaciones en 64 bits, porque es bastante sencillo que un usuario de un ISP tenga un tráfico mayor de 32 bits (4Gigabytes). De hecho yo tengo un buen montón de usuarios que superan los 4Gigabytes mensuales de forma rutinaria.

      Las operaciones implementadas son:

      • Suma de dos tipos de 64 bits.

      • Multiplica un tipo de 64 bits por diez.

      • Multiplica un tipo de 64 bits por un valor de 32 bits.

      • Asigna un tipo de 32 bits a un tipo de 64 bits.

      • Asignar a un tipo de 64 bits el valor CERO.

      • Asignar a un tipo de 64 bits otro tipo de 64 bits.

      • Verificación de si un tipo de 64 bits es cero.

      • Convertir un valor de 64 bits a un número en ASCII.

      • Convertir un número en ASCII a un valor de 64 bits.

    • Solucionado un problema al crear una nueva distribución con "make tar".

    • Cuando se hace un "make config", si no tenemos una configuración antigua en el directorio actual, comprueba si existe un backup en el directorio superior.

    • Dado que estoy implementando buena parte de aritmética de 64 bits, recupero una antigua "feature" que posibilitaba gestionar transferencias RADIUS/MRTG de más de 4gigabytes por conexión. Fue una "feature" que eliminé debido a que Linux no soportaba la función "atoll()". Ahora que he implementado aritmética 64 bits a mano, recupero esa funcionalidad en todos los sistemas.

  • 26/Ene/00: Versión 20b5

    • Los flujos de datos al leer MRTG estaban intercambiados.

  • 04/Ene/00: Versión 20b4

    • Cambiados los copyrights para que incluyan el 2.000.

    • Calendario laboral del año 2.000.

    • Añadido comando "whowas", que da los datos de aquellos usuarios conectados en una fecha determinada. Sólo se indican datos de los usuarios cuyas llamadas en aquel instante ya hayan concluido en el momento de ejecutar el comando.

      Los datos que se proporcionan son:

      • Identificador del usuario
      • Caller-ID
      • Called-ID
      • Fecha de la conexión
      • Duración de la conexión
      • Bytes enviados
      • Bytes recibidos

    • Corregido un problema por conflictos entre indent y la generación del TAR.

    • El TAR no incluía el sistema de gestión de días festivos.

    • El TAR no incluía timelocal.

  • 05/Nov/99: Versión 20b3

    • Añado una nueva utilidad a la librería: "timelocal". Sirve para convertir fechas ASCII en formato date(), a segundos desde 1.970 (epoch). Por ejemplo,
      $ ./timelocal Fri Nov 5 11:05:51 1999
      941796351

      Es una función que uso bastante a la hora de comparar, mezclar o procesar logs de manera automática, y que -en Solaris al menos- ocupa sólo 5Kbytes (si se hace un strip para eliminar la tabla de símbolos).

      Es una utilidad simple y sin apenas control de errores. Espera que la entrada sea correcta.

  • 27/Oct/99: Versión 20b2

    • Para dar una imagen homogenea, utilizo el programa "indent". Los parámetros que emplea a la hora de formatear los fuentes se incluyen con la distribución.

    • Distribuye también el fichero de configuración del CVS, en la distribución.

    • El gráfico se imprime correctamente, considerando el número de días del mes a analizar. Para Febrero se considera un calendario juliano, ya que es válido desde 1901 a 2399.

  • 20/Oct/99: Versión 20b1

    • Eliminado definitivamente el script mensual, ya que es sustituido con ventaja por el script diario.

    • Cambiadas las referencias de versión 19 a versión 20.

    • Ajustados algunos nombres de ficheros en los comentarios.

    • Visualiza en el gráfico, con una banda tenue, Sábados y Domingos.

    • Señala igualmente los festivos de carácter nacional. Los festivos generales todos los años son: 1 de Enero, 1 de Mayo, 12 de Octubre, 1 de Noviembre y 6, 8 y 25 de Diciembre.

    • Para el año 1.999, fueron festivos nacionales también: 6 de Enero (de éste no estoy muy seguro) y 2 de Abril.

    • Todavía no cuento con datos para el 2.000.
     

  • 20/Oct/99: Versión 19

    • Dejo pasar casi un mes desde la última revisión seria para comprobar que todo funciona perfectamente, ya que hay bastantes cosas nuevas.

    • Marcos Monge (marcos@skios.es), a propósito de los registros Alive que envían los equipos Cisco, comenta:
      > Acabo de poner la última beta (19b9) en el web. Pruébala y dime si te
      > funciona:

      Acabo de probarla... y funciona !! ;)

      O al menos aparentemente... ;)

      De todas formas, he estado viendo lo cambias que comentas de esta version, y revisando despacio mis logs...

      La secuencia para cada usuario es como sigue:

      Usuarios que se desconectan de forma normal, o por perdida de portadora:

      Registro START sin IP
      Registro ALIVE con IP
      Registro STOP con IP (con I/O packets/Octets correctos)
      Registro STOP sin IP (con I/O packets a 0 (cero) y sin campo de I/O Octects)

      Usuarios que el NAS desconecta por idle-timeout:
      Registro START sin IP
      Registro ALIVE con IP
      Registro STOP con IP (con I/O packets/Octets correctos)

      Como ves en este ultimo caso no se repite el paquete STOP. Y no entiendo porque se repite en el primer caso.

      En cualquier caso no hay paquetes ALIVE entre medias. El motivo de usar los Alive como ya te dije es que el cisco no manda la IP asignada en el paquete Start. Uso la siguiente configuracion en el cisco:

      !
      aaa accounting update newinfo
      aaa accounting network default start-stop radius
      !
      radius-server retransmit 1
      radius-server timeout 3
      

      El 'retransmit 1' es para que solo intente mandar 1 vez los paquetes. Si le pongo un valor mayor (por defecto es 3) envia 3 veces los alive. Esto creo que tiene que ver con que no reconoce los 'ack' que le responde el radius despues de recibir cada paquete. Pero no me preocupa porque no afecta a lo de que no aparece la ip inicial.

  • 20/Oct/99: Versión 19b19

    • Integro la librería en un CVS propio, para que me resulte más sencilla su gestión.

    • Aprovechando el CVS, marco cada revisión de cada fichero en el propio código fuente (usando Keyworkds).

    • Elimino un par de Warnings que ocurren al compilar el código con el nuevo GCC 2.95.1.

  • 29/Sep/99: Versión 19b18

    • Con la inclusión de make config no se verificaban correctamente las dependencias. Solucionado.

    • Se han corregido los prototipos de salida_graficos.

    • Se ha mejorado ligeramente la documentación de conf.h.

    • La configuración por defecto de make config incluye como red propia el rango de clases C privadas 192.168.*.*.

  • 27/Sep/99: Versión 19b17

    • Gracias a Raquel Martínez (raquel@hpr2.es) hemos podido probar a compilar la librería sobre HP-UX, usando las herramientas nativas del sistema. Aunque se han conseguido solucionar muchos problemas ajustando las opciones de compilación correspondientes, añadiendo un include al fichero del sistema "sys/stdsysms.h" y definiendo un símbolo en tiempo de compilación, no hemos conseguido generar ni la librería ni los ejecutables de ejemplo. Mi consejo ha sido instalar el compilador de C gcc y la versión GNU de la utilidad make. De todas formas se han realizado un par de cambios para facilitar futuras migraciones:

      • La definición de las rutinas propias de comparación y búsqueda de cadenas "strchr()" y "strcmp()" se ha declarado en un módulo común, para no propagar una característica poco portable por toda la librería. Además, esto evita duplicidades en el código.

  • 10/Sep/99: Versión 19b16

    • Versión interna. Período de inactividad.

  • 10/Sep/99: Versión 19b15

    • Cambio el script mensual por diario. Ahora es un script que se ejecuta a medianoche, todos los días. Hace lo siguiente:

      • Mueve las entradas RADIUS de las últimas 24 horas a otro fichero, para aprovechar la tecnología caché de la versión 19 de la librería.

      • Si el script se ejecuta en un cambio de mes:

        • Añade el mes anterior de entradas RADIUS al acumulado total.

        • Mueve las entradas RADIUS que se han ido acumulando a lo largo del mes al fichero que corresponde con el mes anterior (que es justo el que se acaba de terminar).

        • Actualiza los archivos históricos de cada usuario.

      Este script permite disponer en todo momento de cuatro ficheros RADIUS por cada fichero de detalle original:

      1. El fichero "detalle" original, que contiene SOLO las entradas desde la medianoche anterior. Este fichero no debe emplear el sistema de caché de la librería, ya que es un fichero que cambia constantemente.

      2. El fichero "detalle_este_mes" que contiene las entradas acumuladas entre el principio del mes y la medianoche anterior. Se le puede aplicar caché.

      3. El fichero "detalle_mes_anterior" que contiene las entradas del mes anterior, utilizadas, por ejemplo, para generar los gráficos de acceso. Se le puede aplicar caché.

      4. El fichero "detalle_old", que contiene todas las entradas desde hace dos meses hacia atrás. Este fichero se utiliza simplemente como acumulador de logs; la configuración por defecto de la librería no lo utiliza para nada.

  • 10/Sep/99: Versión 19b14

    • Se ha mejorado make config considerablemente:

      • Se pueden especificar un número arbitrario de clases IP a la hora de definir los rangos IP.

    • He realizado una automatización bastante extensa de toda la configuración. Sin embargo, finalmente, he decidido dar marcha atrás, ya que tanta automatización dificulta sobremanera que un usuario con necesidads especiales y concretas pueda configurar la librería adecuadamente.

      Dejo parte de la configuración, pues, manual.

  • 09/Sep/99: Versión 19b13

    • Se realiza una comprobación explícita de cadenas de longitud cero, a la hora de leer y escribir las cachés. Hasta ahora todo ha funcionado a la perfección sin ello, pero como no podemos depender de las librerías que cada cual tenga instaladas, mejor curarse en salud...

    • Se renombran "config.h" y "config.c" a "conf.h" y "conf.c".

    • Se ha añadido el tan largamente esperado "make config". Las opciones que se pueden configurar son:

      • Compilador empleado (*)
      • Opciones pasadas al compilador (*)
      • Opciones pasadas al linker
      • Clase C primaria
      • Path del directorio que contiene los archivos históricos
      • Clave de acceso del CGI
      • ¿El CGI debe soportar gráficos? ¿En qué formato? (*)
      • Path de instalación del CGI

      (*) El cambio en estas opciones supone la recompilación automática de toda la librería.

    • En este momento, y mientras no "afine" más el tema, cualquier "make config" producirá una compilación total.

    • Elimino el flag "-fPIC" a la hora de compilar la librería. Su objetivo era la creación de librerías dinámicas, pero esto ha sido algo que nunca se ha llevado a cabo, al menos hasta ahora. Eliminando esa opción, el código es más rápido y su tamaño se reduce en un 10%.

  • 08/Sep/99: Versión 19d12

    • Se implementa una caché de escritura a la hora de generar las cachés. Ello incrementa la velocidad de generación de forma notabilísima.

    • Para evitar race conditions cuando varios procesos intentan regenerar las cachés de forma concurrente, se implementa un bloqueo por cada una de ellas. De esta forma, los accesos de escritura se serializan.

    • Para reducir el riesgo de que la ejecución parcial de la librería deje las cachés inconsistentes, se almacena el timestamp interno de cada caché sólo cuando se ha terminado de generar. De esa forma, si la librería tiene algún tipo de problema, las cachés generadas no se considerarán válidas, por no tener un timestamp interno correcto.

    • En este momento, la diferencia entre usar sistema de caché o no hacerlo es:

      • El fichero de caché mide 3.3 veces menos que el fichero original (por tanto, el tráfico de disco se reduce en la misma proporción).

      • Las operaciones se aceleran 3.7 veces. Es decir, trabajar con caché es 3.7 veces más rápido.

      Como contrapartida, la generación de las cachés, aunque es un proceso muy esporádico, es lento. Aproximadamente el doble que el trabajar directamente con los ficheros en bruto.

  • 08/Sep/99: Versión 19d11

    • Creados los STUBS para las rutinas de caché. El proceso es el siguiente:

      • Si el original fue modificado hace menos de 60 segundos, elimina cualquier caché asociada, y lee la información directamente de él. De esta forma estamos evitando el generar cachés (que es un proceso lento) de ficheros que cambian constantemente. El minuto es necesario para evitar race conditions, en la que se esté generando una caché nueva y el original se vea modificado mientras tanto. Se supone que la generación de la caché consume menos de 60 segundos.

      • Si existe el fichero caché:

        • Lee el timestamp del fichero original y lo compara con la caché. Si la caché fue creada menos de un minuto después del último cambio en el original, la borra. El minuto es necesario para evitar race conditions, en la que se esté generando una caché nueva y el original se vea modificado mientras tanto. Se supone que la generación de la caché consume menos de 60 segundos.

        • Si la caché está actualizada, verifica la timestamp de la librería que la creó. Si no coincide con la de la librería actual, la borra.

        • Si todo ha ido bien, procedemos a leer la información de la caché, en vez del fichero original.

      • Si el fichero caché no existe:

        • Comparamos el timestamp del fichero original. Si hace menos de un minuto desde la última modificación, simplemente va leyendo de él.

        • Si el fichero original es más antiguo, creamos la caché. La caché se va creando a medida que se van leyendo registros.

      En esta primera implementación del sistema caché, el fichero de caché mide aproximadamente 30.3% respecto al fichero original.

  • 08/Sep/99: Versión 19b10

    • Cuando se compila la librería sin la opción de gráficos, el texto sale descolocado.

    • Divido la generación del archivo de la librería en varios pasos, para clarificar el Makefile.

    • Muevo las rutinas str2tiempo()", "tiempo2str()", "dia1_este_mes()", "dia1_siguiente_mes()", "clipping_mensual()" y "activa_clipping_mensual()" del módulo "config" al módulo "tiempo".

    • Creo un módulo "lee_radius_infovia_plus", para liberar de todo lo superfluo a "config".

    • Desplazo los STUBS de "config" a sus módulos correspondientes.

  • 07/Sep/99: Versión 19b9

    • Se solucionan una serie de problemas con la librería y equipos CISCO 3640, comunicados por Marcos Monge <marcos@ddnet.es>:

      • No se envía la dirección IP del usuario en los datagramas Start, sino que se hace en los datagramas Alive.

        Solución: Los registros que no contengan la IP del usuario son ignorados.

      • La librería "muere" porque no reconoce los registros Alive.

        Solución: Los registros Alive se consideran equivalentes a los registros "Start".

      • Cistron genera atributos Acct-Terminate-Cause con una explicación textual, no con un número.

        Solución: Si Acct-Terminate-Cause contiene un texto, usa el texto como explicación. Ello supone numerosos cambios en la librería, incluyendo los nuevos ficheros "causa_desconexion.h" y "causa_desconexion.c".

      Con estas modificaciones existe un problema: Si se envían varios Alive por conexión, la librería no funciona correctamente. ¿Alguien puede decirme si eso es un problema?. Por si acaso, lo añado a la Lista de Cosas por Hacer.

  • 05/Ago/99: Versión 19b8

    • Unas merecidas vacaciones...

  • 05/Ago/99: Versión 19b7

    • Impresión centrada, en el gráfico de conexiones, del nombre del usuario y del mes que se visualiza.

    • Al añadir el párrafo anterior, la librería moría si el usuario no había hecho ninguna conexión en el mes visualizado. Corregido.

    • Si no hay ninguna conexión en el mes en curso, no se imprime ningún rotulo. Corregido.

    • La línea punteada inferior aparecía descolocada. Corregido.

    • Se ha eliminado la necesidad de compilar la librería con el símbolo "GRAFICOS". Ahora basta con especificar el tipo de gráfico que se quiere soportar, en función de nuestras preferencias y de la versión de la librería GD que estemos utilizando. Para ello se define uno de los siguientes símbolos: "GRAFICOS_GIF" o "GRAFICOS_PNG".

    • Se ha modificado el script "mensual" para trabajar con dos ficheros "old". El primero contiene el mes pasado, y el segundo contiene los meses anteriores. De esta forma se puede trazar gráficamente el mes anterior de forma eficiente.

  • 04/Ago/99: Versión 19b6

    • Mejoradas las opciones de enlazado en el Makefile.

    • Las llamadas fallidas (tiempo de conexión de cero segundos) se visualizan en rojo. Para evitar que queden "machacadas" por otras conexiones inmediatamente posteriores, o porque ya hay una conexión en curso, se dibujan como líneas verticales al final de todo el proceso.

    • Las llamadas perdidas (tiempo de conexión de cero segundos) también son mostradas en el HTML.

    • Se permite visualizar también el gráfico del mes anterior, si están disponibles los logs.

  • 04/Ago/99: Versión 19b5

    • Cuando una conexión termina en el mes en curso, pero empezó el mes anterior, no se dibujaba correctamente. Se ha corregido. Al menos cuando la conexión dura menos de un mes :-).

    • Dependiendo de la librería GD que tengamos, se pueden generar gráficos GIF o PNG. Los GIF son más grandes y tienen problemas de patentes, así que se prefieren los PNG. Los PNG son soportados por las versiones 4.04 y superiores de Netscape, y por las 4.0 y superiores de Internet Explorer. Se puede elegir una cosa o la otra definiendo los símbolos "GRAFICOS_GIF" o "GRAFICOS_PNG" a la hora de compilar la librería.

      La opción PNG requiere tener instaladas las librerías ZLIB y libpng.

    • Corregido un bug en la rutina de cálculo del tamaño de las barras gráficas. A ver si ahora sí :-).

    • Cuando la conexión es fallida (tiempo de conexión de cero segundos), no rota los colores. De esta forma la gráfica se puede analizar y justificar de forma más sencilla.

  • 04/Ago/99: Versión 19d4

    • Se han pasado segmentos de código repetidos a rutinas, para evitar duplicidad y simplificar el mantenimiento.

    • Se ha implementado la posibilidad de visualizar también un GIF con el histórico de conexiones del usuario. En el gráfico se van alternando dos colores, para detectar más fácilmente conexiones consecutivas.

      Para poder utilizar esta funcionalidad es preciso tener instalada la librería GD y definir "GRAFICOS" en el Makefile.

  • 27/Jul/99: Versión 19b3

    • Al generar las dependencias, ponemos buen cuidado en que el compilador sea alimentado con los parámetros que luego se van a utilizar para compilar realmente el código. Esto es importante por si tenemos, por ejemplo, compilación condicional vía "-D" definidos en el Makefile.

    • Nuevo script "called_id", que proporciona el listado de todos los números de teléfono a los que han llamado los usuarios.

    • Corregido un error mecanográfico en los comentarios del script "caller_id".

  • 13/Jul/99: Versión 19b2

    • Corregido un bug introducido probablemente en 18b4, que hacía que no se tuvieran en cuenta los datos obtenidos vía MRTG.

    • El fichero "called_id_nodo_local.c" es el contenedor de los datos de nodo local de cada proveedor. Cada proveedor debe modificarlo en función de sus necesidades.

    • Añado también la información de Called-ID de Interpista y Retenet.

    • A veces aparecen Called-ID que no se corresponden a números llamados por el usuario. Probablemente sean números reenrutados debido a problemas o saturación en su nodo habitual. He hecho pruebas, y los nodos "anónimos" que aparecen pueden ser llamados directamente (responde un módem).

  • 12/Jul/99: Versión 19d1

    • Cambio las referencias a la versión 18 por versión 19. Esto afecta a los scripts caller_id y userstats.

    • Si está disponible, se muestra también el número de teléfono al que ha llamado el usuario, posiblemente disponible en el campo "Client-Port-DNIS". Se imprime para la conexión actual y para todos los históricos.

    • Las tablas HTML de números llamantes y llamados son tablas HTML separadas, ya que su tamaño es variable y sino no encajan con el resto de la plantilla web.

    • Identifica los nodos de Infovía Plus por su nombre, en función del número de teléfono al que se llame.

    • Si no se puede identificar el número al que se llama, y estamos en Infovía Plus, indica "Infovía Plus".
     

  • 07/Jul/99: Versión 18

    • Distribución de la versión 18. Es simplemente la 18b9 renombrada.

  • 02/Jul/99: Versión 18b9

    • En 18b8, cuando se introduce una fecha de longitud menor de la requerida, el resultado era inconsistente. Ahora el resultado tampoco es válido, pero al menos es siempre es el mismo si se introduce el mismo valor :-).

    • Cuando el usuario está conectado en este momento, se lista también su Caller-ID actual.

    • Al principio de la página web de resultados, en vez de salir Revisión, se cambia el texto por Versión.

  • 01/Jul/99: Versión 18b8

    • Parece que muchos sistemas no tienen implementada la función "strptime()", o no devuelve resultados correctos (¿Linux?). Por ello he modificado mi rutina "str2tiempo2()" para que que no utilice esa función. Hay que comprobar de forma exhaustiva que los valores son correctos cuando se produce el cambio de hora Verano<->Invierno.

      Al menos en este momento (verano), los resultados son correctos.

  • 01/Jul/99: Versión 18b7

    • En los ficheros de detalle RADIUS, considera equivalentes Framed-Address y Framed-IP-Address.

    • Cuando la librería se recompila y hay algún usuario conectado antes de la fecha de recompilación, en los datos de la conexión actual aparece como fecha de inicio la fecha de compilación de la librería, no la fecha de la conexión. Corregido.

    • En la información listada aparecía el CPI del usuario junto al identificador login. Solucionado. Este bug se introdujo en 18b4.

  • 30/Jun/99: Versión 18b6

    • La salida del script "Userstats" se clasifica por orden alfabético, para que su seguimiento sea más simple.

    • Corregidos los errores de compilación bajo Linux RedHat 6.0, al realizar redefiniciones de "strchr()" y de "strcmp()". Ahora hago un "#undef" primero.

    • Se ha modificado la librería de utilidades para que no compile las rutinas propias "strchr()" y "strcmp()" como static ya que cuando no se utilizan ambas, el compilador da un Warning. Antes no salía ningún Warning porque no se compilaban las rutinas que no se utilizaban en el módulo actual. Además, este cambio permite realizar el que sigue.

    • Se ha modificado la librería para que se compile "util.c" como un módulo más, enlazándolo posteriormente con el resto de módulos que lo necesiten. Esto hace que no se optimicen dichas rutinas como inlining, pero con el nivel de optimización que estamos utilizando ahora (-O2) tampoco se realiza dicha optimización, en este momento, de forma automática.

      El tiempo de ejecución es idéntico al de la versión anterior de la librería.

  • 28/Jun/99: Versión 18b5

    • Durante la madrugada del 26 al 27 de Junio (Sábado a Domingo) se introdujeron algunos Caller-ID que superaban los 80 caracteres de longitud, por lo que la librería terminaba la lectura del fichero en cuando llegaba a esa posición. Se ha incrementado el tamaño máximo de una línea de 80 caracteres a 160.

    • Cuando una línea de un fichero de log es demasiado larga, se aborta la lectura como antes, pero ahora también se visualiza un mensaje en pantalla.

    • Cuando son enlazados los ejecutables que se crean a partir de la librería, se enlazan con todas las opciones de depuración activadas.

    • Dado que ahora aparece el Caller-ID completo del llamante, cambio los textos:

      • Se elimina Por cuestiones de privacidad, sólo se muestran las 5 primeras cifras.

      • Se cambia Centrales desde las que se ha llamado a Teléfonos desde los que se ha llamado.

    • El recorte a 9 cifras cuando existe el Caller-ID y es numérico se realiza en la lectura de los ficheros de detalle, no en la visualización. Ello permite olvidarnos de este tema fuera de la librería.

    • Muy de vez en cuando aparece información corrupta en los ficheros de detalle RADIUS, de dos formas distintas:

      • A veces aparece un "\0" en el log. La librería cambia los "\0" por "\n". Esta revisión y cambio supone una pérdida de rendimiento del 9%, en mi entorno.

        Gracias a Javier Castillo (castillo@alhsys.es) por la información.

      • A veces parece como si una línea apareciese concatenada con la siguiente, etc. La librería intenta procesar esa línea en lo posible. Para evitar que la línea concatenada supere el tamaño máximo permitido por línea, éste se ha duplicado de 80 a 160 (ver explicación adicional al principio de esta sección).

  • 21/Jun/99: Versión 18b4

    Gracias a Josep Olivet (josep@altecom.es) por proporcionarme aliciente para realizar los siguientes cambios:

    • Ahora se puede especificar de forma sencilla varios CPI, sin necesidad de repetir el path del fichero tantas veces como CPIs se tengan, cada vez con un CPI distinto. Se define como un array de cadenas, terminado en NULL.

  • 21/Jun/99: Versión 18b3

    Gracias a Josep Olivet (josep@altecom.es) por enviarme un fichero de detalle para posibilitar los siguientes cambios:

    • Además de "Caller-Id" reconoce también el atributo "Calling-Station-Id", con el mismo significado.

    • Cuando el Caller-ID de un usuario es numérico, lo recorta a 9 cifras a la hora de visualizarlo en pantalla (no así internamente).

    • Además de "Ascend-Data-Rate", interpreta también como velocidad de conexión el atributo "Connect-Info".

  • 11/May/99: Versión 18b2

    • Cuando se leen logs MRTG, no se devuelven registros para los intervalos de tiempo en los que no haya tráfico, ni de entrada ni de salida. Se mantiene el esquema anterior en el código, por si alguien lo necesita.

  • 10/May/99: Versión 18d1

    • Cambio las referencias a la versión 17 por versión 18. Esto afecta a los scripts caller_id y userstats.

    • La librería permite leer los datos de logs desde programas externos. Ello posibilita, entre otras cosas:

      • Leer logs desde, por ejemplo, otras máquinas de la red.
      • Extraer los logs de una base de datos o generarlos al vuelo.
      • Descomprimir los logs al vuelo en el momento de su utilización.

      La librería ejecutará un programa si el path que se especifica para el fichero de log contiene algún espacio.

     

  • 10/May/99: Versión 17

    • Distribución de la versión 17. Es simplemente la 17b7 renombrada.

  • 05/May/99: Versión 17b7

    • La librería daba "core dump" cada vez que un usuario RADIUS intentaba acceder a los archivos históricos.

  • 20/Abr/99: Versión 17b6

    • En los archivos históricos, la fecha de "Last-Modified" que se envía es la del fichero en disco. Con ello se pretende que si se realiza algún cambio en dichos ficheros, el cliente lo vea.

    • Se envía en el "Last-Modified" la fecha de la librería, en caso de que ésta sea más reciente que la fecha del documento que se va a enviar. De esta forma la pantalla se actualiza correctamente cuando se realiza alguna modificación en la librería.

      Para ello se crea el módulo "timestamp", que genera el timestamp de la librería bajo un fichero de creación automática "version2.c".

    • Corregido un comentario en el módulo "version".

    • "make" es lo bastante inteligente como para saber compilar automáticamente los objetos, y de estos los ejecutables. Por tanto elimino del "Makefile" la descripción de cómo compilar los "*.o", porque "make" ya lo sabe hacer solo. Esto incluye incluso los parámetros de compilación.

    • Generación automática de los ejecutables "*.exec", a través de reglas implícitas de "make".

  • 12/Abr/99: Versión 17b5

    • Cuando se invocan archivos históricos, no se permite que el usuario contenga puntos (".") en su nombre de usuario. Ello es debido a criterios de seguridad. No obstante esta norma se ha eliminado, ya que existen usuarios con puntos "legítimos" en el nombre de usuario, y a que los puntos sólo son peligrosos desde un punto de vista de seguridad, si se permiten también las barras ("/"). Como las barras NO se permiten, se permiten los puntos.

  • 08/Abr/99: Versión 17b4

    • Mejorada la creación de las distribuciones con "make tar".

    • Un "make fullclean" hace un clean y borra también el fichero de dependencias.

    • Se ha modificado el módulo de lectura RADIUS para que lea correctamente las fechas de los ficheros de detalle cuando estamos en horario de verano. Lamentablemente los datos no son completamente correctos los dos días que hay cambio de horario. Si los ficheros de detalle contienen TimeStamp, no hay este problema.

    • Generación correcta de la fecha de creación y de expiración de la página de información histórica.

    • La combinación de Netscape Communicator 4.51 y Apache Web Server 1.3.6 da el siguiente resultado:

      • Petición sobre un usuario nuevo:

        • Mes en curso: Solicita la página.

        • Archivo histórico: Solicita la página.

        • Usuario no autorizado: Solicita la página.

      • Reload de la página:

        • Mes en curso: El cliente envía un GET condicional a la fecha y el tamaño del fichero. El servidor devuelve "304 Not Modified". Indica una expiración inmediata.

        • Archivo histórico: Idem. La expiración de la respuesta se sitúa en el cambio de mes.

        • Usuario no autorizado: Solicita la página. Se descarga de nuevo porque la fecha ha cambiado (es la actual).

        Obsérverse que en los dos primeros casos la librería se ejecuta, de todas formas. Pero el servidor Apache es lo bastante listo como para reconocer que la página que se ha generado de nuevo no tiene cambios, e informar de ello al cliente.

      • Navegación por enlaces, con las páginas ya visitadas:

        • Mes en curso: El cliente envía un GET condicional a la fecha y el tamaño del fichero. El servidor devuelve "304 Not Modified". Indica una expiración inmediata. La librería se ejecuta, no obstante.

        • Archivo histórico: El cliente no hace nada. Muestra los datos almacenados en su caché.

  • 07/Abr/99: Versión 17d3

    • El código de los scripts ha sido actualizado para que imprima en pantalla "Version 17" en vez de "Version 16". Esto afecta a los scripts "caller_id" y "userstats".

    • Se crea un fichero de dependencias automático entre módulos ("depend"). Se acabó el mantener las dependencias a mano, lo que es proclive a poner de más o de menos. En principio esto es de uso exclusivo para el programador.

    • Hago que "make clean" depende de "make cleantar", y con ello simplifico el mantenimiento del "Makefile".

    • Se envía "Cache-Control: private", para indicar que la página es privada al usuario. De esta forma no se almacenará en ningún Caché/Proxy intermedio.

    • Se ha modificado la interfaz "Salida" para que la salida HTML pueda expresar información sobre la última modificación a los datos, o su periodo de validez.

    • Genera cabeceras "Last-Modified" y "Expires" según las siguientes reglas:

      • Si estamos solicitando la información en curso sobre una conexión, devuelve una expiración inmediata, y la fecha de la página será la de la última conexión de ese usuario. Si el usuario no tiene conexiones, devuelve la fecha actual.

      • Si estamos solicitando información histórica, devuelve como fecha de la página el día 1 del mes en curso. La expiración será el día 1 del próximo mes. Esto resulta problemático si el usuario solicita información histórica mientras se están generando los informes mensuales. No se soluciona con un reload por parte del usuario, ya que las fechas ya se han establecido. Es preciso que el usuario borre su caché, o que la página se purgue por LRU en su caché.

      • Si no es un usuario autorizado, tanto la fecha como la expiración son las del instante de petición.

  • 05/Abr/99: Versión 17b2

    • El script mensual no funciona bien cuando se produce un cambio de horario, ya que aparece el DST (¿Daylight Saving Time?). Modifico el script para que sólo trabaje con el mes y el año, sin más consideraciones.

  • 29/Mar/99: Versión 17b1

    • Cuando un usuario está conectado, sale un espacio entre el momento de la conexión y el paréntesis final. Eliminado.

    • La librería indica "no hay conexiones previas" cuando la causa de la desconexión es 0 (cero). Ello puede ser debido a que el cliente RADIUS no envía el atributo, o a que el servidor RADIUS no lo almacena en los ficheros de detalle.

      Ahora no se imprime nada.

    • Cuando se informa de los datos de la última desconexión, se indica la hora de principio de conexión. Antes salía la hora de final de la conexión.
     

  • 29/Mar/99: Versión 16

    • Eliminado un atoll() que me había quedado en "lee_radius.c".

  • 15/Mar/99: Versión 16b8

    • Añadido un fichero "Conexiones-README" con algunos detalles de interés sobre la librería:

      • La librería no permite identificar usuarios cuando estos acceden a través de un proxy/caché tipo SQUID. Aunque el SQUID envía la información sobre el usuario original en la cabecera "X-Forward-For: DIR_IP", el reconocimiento de dicha cabecera se presta a abusos, ya que un usuario podría solicitar información confidencial de otros.

      • Si la librería te parece lenta, sólo tienes que comprobar que, en realidad, el cuello de botella es tu disco duro. Para ello simplemente comprueba el tamaño de tus ficheros de detalle y luego divídelo por la velocidad de tu disco duro.

        Por ejemplo, si tus ficheros de detalle miden 50 megabytes, y tu disco duro es capaz de transferir 1 megabyte por segundo, está claro que la librería va a tardar al menos 50 segundos en completar cualquier petición.

        También se puede comprobar la velocidad del disco duro cronometrando la duración de "cp path_fichero_detalle /dev/null".

        ¿Cómo mejorar la velocidad?. En el futuro la librería conexiones será capaz de procesar ficheros comprimidos con GZIP, lo que aumentará la velocidad de proceso considerablemente, aún a costa de multiplicar el consumo de CPU.

      • Algunas veces la librería funciona perfectamente cuando se invoca desde la línea de comandos (por ejemplo, comando "userstats"), pero no muestra ninguna información cuando se ejecuta como CGI.

        Casi siempre la causa del problema son los permisos de acceso. El usuario bajo el cual se ejecuta el CGI, generalmente el mismo usuario bajo el cual se ejecuta el servidor Web, debe tener permiso de lectura sobre los ficheros de detalle, así como permiso de "entrada" sobre todos los directorios por los que tenga que pasar.

        Para comprobarlo, lo más sencillo es hacer un CGI con este esquema:

          #!/bin/sh
          #
          /usr/bin/head FICHERO_DE_DETALLE_1
          /usr/bin/head FICHERO_DE_DETALLE_2
          ...
        

        Al ejecutar el CGI anterior podemos comprobar si los permisos son correctos. Si no lo son, tendremos que cambiarlos, o bien ejecutar el CGI como SUID (no se recomienda por motivos de seguridad).

    • Cuando se lee un log, si al final de una línea "\n" aparece un retorno de carro ("/r"), lo eliminamos. En UNIX no se genera un retorno de carro nunca cuando estamos hablando de texto, pero en Windows sí, y da problemas con el resto de rutinas de entrada, ya que UNIX no contempla en concepto de abrir un fichero en modo "texto". Gracias a Arturo García Mazorra (arturo@tyc.es) por proporcionarme un fichero de detalle con estas características.

    • Eliminado un warning al compilar, cuando la única fuente RADIUS es Infovía Plus. Gracias a las numerosas personas que me lo han hecho notar, ya que yo tengo varias fuentes RADIUS y me compilaba sin ninguna nota de atención. El cambio, además, resulta más elegante, ya que crea una dependencia explícita entre las rutinas de lectura de RADIUS y las rutinas de lectura de la variante RADIUS de Infovía Plus.

  • 08/Mar/99: Versión 16b7

    • Cambiado "Ese usuario no está conectado en este momento" por "Este usuario no está conectado en este momento".

    • Hago que "make install" dependa de todos los ejecutables y programas de apoyo que se incluyen con la librería, no sólo del CGI principal.

    • Gracias a Eduardo Márquez Martínez (emarquez@wmega.es) por advertirme de que la librería no es capaz de gestionar usuarios cuyo primer carácter es numérico. Ello es debido a que un primer carácter numérico se interpreta como una dirección IP. He modificado la librería para que sólo se consideren como IPs aquellos valores que pertenezcan a nuestras redes locales o a la tabla IP->Usuarios.

  • 01/Mar/99: Versión 16b6

    • Gracias a Juan Enrique Gómez (juanen@tpesp.es) he tenido acceso a un fichero de detalle de Radius estándar. A partir de ahora mi librería puede gestionar un fichero de detalle genérico, siempre y cuando incluya un campo Timestamp en cada registro. Si no lo incluye, se intentará reconocer el campo de fecha del registro, y actualmente sólo se soporta el formato generado por el RADIUS de Infovía.

    • El campo Timestamp siempre tiene preferencia pero, cuando no existe, se reconocen los formatos:

      • dd-mm-yyyy hh:mm:ss (formato Infovía tradicional)

      • www mmm dd hh:mm:ss yyyy (formato detalle estándar) <- NO NO NO NO. Este formato no es soportado de forma nativa. Si el archivo de detalle no contiene un Timestamp por cada registro, la librería devolverá valores incorrectos.

  • 01/Mar/99: Versión 16b5

    • Cambiadas las referencias a la versión 15, en los scripts, a la versión 16 (la actual).

    • Gracias a Adria García (adria@alpha.chi.es) por informarme de que el script caller_id hace referencia a su antiguo nombre, caller_id.sh, en la cabecera. Cambiado.

    • Gracias a Adria García (adria@alpha.chi.es) por comprobar la correcta compilación sobre estaciones Silicon Graphics y sistema operativo IRIX. Se añaden comentarios sobre ello en el Makefile.

    • Numerosos cambios en el Makefile:

      • Se cambia la variable PARAM a CFLAGS en el Makefile, por coherencia con el estándar.

      • He cambiado las referencias a gcc por la variable genérica CC, cumpliendo con el estándar.

      • Las opciones de enlazado se mueven a la variable LDFLAGS, cumpliendo el estándar.

      • Mejorado el funcionamiento de la dependencia entre módulos para all. Ya no se ejecutan tres "make" para compilar y enlazar la librería y todos los programas de apoyo.

      • Incluimos el parámetro -L. sólo cuando enlazamos el código, no al compilarlo.

  • 09/Feb/99: Versión 16b4

    • La última versión del programa de estadísticas "muere" si es invocado por un usuario no autorizado, sin imprimir ningún mensaje informativo. Corregido.

  • 01/Feb/99: Versión 16b3

    • Corregido un problema con el script mensual.

    • Se eliminan las referencias a los archivos de detalle de Infovía, ya que es una red que ya no existe (desde el 17 de Enero de 1.999).

  • 26/Ene/99: Versión 16b2

    • Se ha añadido una opción "-melf" para que la librería pueda compilarse sin problemas sobre SCO Unix. Para ello hay que cargar el Makefile en un editor y descomentar la línea correspondiente. Problema detectado por Arturo García Mazorra (arturo@tyc.es).

  • 18/Ene/99: Versión 16b1

    • Corregida una interacción entre la identificación de sesiones activas y la eliminación de registros duplicados, que hacía que una conexión ya cerrada se indicase abierta mientras el usuario no se conectase de nuevo.

    • Ajusta el tiempo que se devuelve en los registros mediante el campo Acct-Delay-Time. De esta forma el tiempo indicado en el registro es el tiempo real menos el tiempo que hemos estado reintentando el envío.
     

  • 12/Ene/99: Versión 15

    Publicación de la versión 15 de la librería.

  • 11/Ene/99: Versión de desarrollo 15b8

    • Un make cleantar elimina los ficheros generados a la hora de crear una distribución. Se ha añadido esta opción para no tener que hacer un make clean, que borra también los ficheros objeto y hay que recompilarlos de nuevo.

    • Se ha corregido un bug que hacía que la búsqueda por IP de un administrador, o en la consulta de un usuario RADIUS, se indicase siempre que el usuario no estaba online.

  • 08/Ene/99: Versión de desarrollo 15b7

    • Revisados y limpiados los #include entre módulos:

      • lee_log.
      • lee_radius.
      • lee_mrtg.
      • version.
      • salida.h:
        Depende de lee_log.h por CAMPO_LONG.
      • salida_html:
        Cambiada la dependencia de conexiones.h por una dependencia a config.h.
      • config:
        Se elimina la dependencia de conexiones.h moviendo prácticamente todo el código de dicho fichero a config.h.
      • caller_id:
        Eliminada la dependencia de conexiones.h.
      • userstats:
        Eliminada la dependencia de conexiones.h.
      • conex_conf.
      • conexiones:
        Eliminadas las dependencias de salida.h y lee_log.h.

    • Revisado el Makefile para definir correctamente las dependencias en función del árbol hallado en el paso anterior. De esta forma se pretende independizar los módulos lo máximo posible y generar una compilación más limpia y con dependencias mínimas y correctas.

  • 08/Ene/99: Versión de desarrollo 15b6

    • Añadida una utilidad llamada userstats que visualiza los usuarios que se han conectado, cuántas veces y cuántos bytes han enviado y recibido. Se pueden especificar períodos temporales siguiendo la sintaxis aplicable a toda la librería.

    • El script wipe es un desarrollo interno que limpia del código a distribuir las referencias que podrían considerarse confidenciales. Dicha utilidad elimina el bit execute de los scripts incluidos en la distribución. Se ha modificado el makefile para que restaure dichos atributos.

    • En los casos en los que una utilidad utiliza un script y un programa C compilado, había que invocar la función con funcion.sh para ejecutar el script que, a su vez, ejecuta el código C. Por sencillez se ha renombrado funcion a funcion.exec (el ejecutable en C) y funcion.sh a funcion (el script que hay que invocar realmente).

  • 04/Ene/99: Versión de desarrollo 15b5

    • Documentada la causa 47 de desconexión ASCEND: cierre del LCP antes de haber abierto ningún NCP.

    • Tal y como se ha escrito el script mensual, existe un problema: si una llamada termina entre el instante en que arranca el script y el instante en que termina, es posible que esa conexión no sea contabilizada a nivel de "accounting". Ello es debido a que cuando se ejecuta la librería para ese usuario, todavía no se ha guardado el registro. El registro se graba después de que hayamos sacado el informe sobre dicho usuario pero antes de que hayamos movido los ficheros de detalle.

      La solución es relativamente sencilla: renombramos los archivos de detalle antes de empezar los informes, y los informes trabajan tanto sobre el archivo renombrado como sobre el archivo original, por si éste fuera creado de nuevo entre tanto.

    • Se modifica caller_id para que acepte parámetros en la línea de comandos con el mismo significado que el resto de módulos: intervalo de tiempos a considerar.

    • En caller_id se imprime la información correctamente en ASCII, no en HTML, cuando las conexiones se realizan a través de Infovía Plus.

  • 04/Ene/99: Versión de desarrollo 15b4

    • Corregidos problemas de sintaxis en el script mensual.

    • Mejorada la compilación de la librería, al no tener que recompilar cada vez los módulos externos a la misma.

    • Se ha movido el módulo config a la librería, en vez de ser un objeto externo que se enlazaba al compilar código. Ello resulta más claro y permite introducir en dicho módulo rutinas genéricas.

    • Se mueven las rutinas str2tiempo y tiempo2str del módulo conexiones al módulo config.

    • Se ha movido el parsing de tiempos de la línea de comandos, de los módulos conex_conf y conexiones a conex_conf (sólo la parte mínima) y a config.

    • las variables tiempo_inicial y tiempo_final, que especifican la ventana a considerar por la librería, se han puesto accesibles.

    • Corregido un bug en el tratamiento de los tiempos, cuando estamos en el período de gracia del primer mes del año (Enero). Es decir, si se ejecuta el programa en las primeras cuatro horas del primero de Enero.

  • 30/Dic/98: Versión de desarrollo 15d3

    • Reestructuración de una gran cantidad de código para permitir que la salida sea accesible a través de una única llamada. El tema es complicado debido a factores tales como el acceso a archivos históricos.

    • Mueve toda la gestión de archivos históricos al módulo de salida, fuera del módulo conexiones.

    • Finalmente decido tener tres rutinas de salida:

      • SALIDA.salida_cabecera proporciona información sobre la IP que solicita el informe, su DNS inverso y la versión del navegador web que está utilizando.

      • SALIDA.salida_conexiones proporciona la información sobre las conexión actual, si existe, las conexiones acumuladas a lo largo del mes, y permite visualizar también el archivo histórico. Esta rutina puede llamarse varias veces con información de usuarios diferentes.

      • SALIDA.salida_final visualiza el pié de la información, copyrights, etc.

    • Cuando hacemos un make clean, se borran también los ejecutables.

  • 17/Dic/98: Versión de desarrollo 15d2

    • Se cambian todos los tabuladores que su usaron en las primeras versiones del código al nuevo formato, con dos espacios. Se han modificado también otros datos de estilo.

    • Se inicia la migración a una interfaz de salida homogenea y flexible. Entre otras cosas, ello permite una visualización completamente programática, así como hacer interfaz con otros módulos:

      • Visualización de cabecera convertida a la nueva interfaz.

      • Visualización de conexiones convertida a la nueva interfaz.

      • Visualización de la conexión actual convertida a la nueva interfaz.

      • Fusionamos en una única rutina las salidas de las conexiones anteriores y de la conexión actual.

  • 15/Dic/98: Versión de desarrollo 15b1

    • Inclusión del copyright de forma explícita en el código.

    • Las referencias del copyright a 1.998 se han cambiado a 1.999, con el inicio del nuevo año.

    • Toda la configuración de la librería (claves, paths de acceso, etc) se han relegado a un módulo llamado "config". Dicho módulo no forma parte de la librería en sí, sino que se utiliza en el enlazado de las aplicaciones con la librería. De esta forma es posible modificar las configuraciones (por ejemplo, los paths de los ficheros de log, o la clave de acceso) sin tener que modificar todas las aplicaciones desarrolladas. Basta con actualizar el módulo "config" y recompilar las aplicaciones.

    • Gracias a Pol Navarro (pol@sumi.es) se dispone de un documento "Conexiones-HOWTO" que explica cómo configurar la librería en un minuto. No obstante he tenido que modificarlo un poco para ajustarse a la versión 15.

    • Se ha añadido un include para que la librería se compile correctamente en Linux. Mea Culpa por no haberlo probado :-). Gracias a Carlos Galve y a Pol Navarro (pol@sumi.es) por advertirme del error.
     

  • 14/Dic/98: Versión 14

    Publicación de la versión 14 de la librería. Por primera vez se incluye el código fuente completo, con una licencia semejante (aunque no igual) a la GNU GPL. Liberando el código fuente se espera contribuir a su mayor difusión y a un desarrollo más rápido.

  • 14/Dic/98: Versión de desarrollo 14b9

    • Revisión general de código, buscando errores de programación y vulnerabilidades, continuando la revisión en 14b7:

      • conex_conf: Ok.
      • conexiones: Revisar con más calma en otra ocasión.

  • 08/Dic/98: Versión de desarrollo 14b8

    • Para evitar en lo posible el tener que tocar código entre las versiones internas y las versiones públicas, se mueve todo el código confidencial a módulos externos que son "limpiados" al crear las versiones públicas. En este momento se trata de la clave de acceso, las clases C de acceso, la IP del servidor de túneles y los usuarios de IP fija con usuario registrado.

    • Se ha facilitado la generación de las versiones públicas de la librería, mediante la programación de un par de módulos específicos en el Makefile, y un wipe externo, que borra las referencias confidenciales.

  • 07/Dic/98: Versión de desarrollo 14b7

    • Cambio las rutinas en "util.c" (strcmp() y strchr()) para que no salgan warnings. Ello repercute en una serie de llamadas en otros módulos. No obstante son errores que solo aparecen en el modo "pedantic", así que nos olvidamos del asunto.

    • Se eliminan los warnings derivados de incluir la librería "util.c" sin utilizar todas sus rutinas en el código. Ahora se compilan sólo las rutinas de la librería que se invocan.

    • Revisión general de código, buscando errores de programación y vulnerabilidades:

      • util: Documento los últimos cambios, así como la licencia de uso y distribución.
      • lee_log: Se han documentado un par de detalles que no quedaban claros en el código. Se ha mejorado la protección contra "Buffer Overflow" en la lectura de los ficheros de log.
      • salida_html: Corregidos un par de errores mecanográficos.
      • lee_mrtg: Se comprueba que el fichero de logs MRTG tenga el número de líneas que debe, para evitar overflows.
      • lee_radius: Añadimos un par de comprobaciones en la longitud de los parámetros.
      • caller_id: Identifica las llamadas efectuadas a través de Infovía Plus.

    • Se añaden las funciones version_html() y version_txt(), que proporcionan el texto del Copyright en dichos formatos. Para ello se añade un módulo objeto adicional. Se añaden también las rutinas version() y version_fecha().

  • 01/Dic/98: Versión de desarrollo 14b6

    • Corregido un bug que hacía que apareciese un usuario como conectado cuando se están leyendo logs RADIUS filtrados por fecha.

    • Corregidos algunas tildes en el HTML, destruidas al agrupar las rutinas de salida en un módulo externo.

    • Ya que Infovía Pus, de momento, no muestra el Caller ID del llamante, en vez de aparecer como Conexión Analógica, que aparezca como Infovía Plus.

  • 27/Nov/98: Versión de desarrollo 14d5

    • La construcción de la página Web de salida se mueve a un módulo externo, de forma que cualquier usuario del programa pueda rediseñarla.

  • 23/Nov/98: Versión de desarrollo 14d4

    • Los campos de fecha y hora de los registros se han sustituido por un campo de tiempo transcurrido en segundos desde el 1 de Enero de 1.970. De esta forma las operaciones son más sencillas y rápidas.

    • El cambio de fecha+hora a segundos ha enlentecido considerablemente la lectura de los logs Radius. Mediante una técnica de caché de día (sólo se realiza una operación lenta por día, no por registro) consigo una aceleración del 928%.

    • Se reconocen las nuevas causas de desconexión de Infovía Plus. Para diferenciarlas de las viejas causas Ascend de Infovía, a las causas Ascend se les suma 1000.

    • Como se ha acelerado considerablemente el acceso a los logs, se ha suprimido el rango de fechas a tener en cuenta, fichero por fichero. El rango de fechas a considerar es:

      1. Si se indica el tiempo inicial y final en la línea de comandos, se usan esos valores.

      2. Si sólo se indica el tiempo inicial en la línea de comandos, analiza los logs desde ese instante hasta el momento actual.

      3. Si no se indican tiempos en la línea de comandos:

        1. Si la fecha actual es posterior a las cuatro de la madrugada del día 1 del mes en curso, contabiliza los logs registrados en el mes actual.

        2. Si estamos antes de las 4 de la madrugada del día uno, contabiliza todo el mes anterior, hasta el instante actual.

        Esta diferenciación permite generar históricos con el cambio de mes.

  • 20/Nov/98: Versión de desarrollo 14d3

    • Fichero por fichero, se puede indicar una configuración por defecto para especificar las fechas a tener en cuenta. Por ejemplo, los ficheros de RADIUS que se rotan mensualmente se pueden leer enteros para cada consulta. Sin embargo los datos contenidos en un log MRTG deben tener en cuenta exclusivamente el último mes.

    • Se pueden especificar uno o dos parámetros adicionales en la línea de comandos. El primero indica el tiempo inicial a considerar y el segundo, si existe, indica el tiempo final. Cada uno de esos valores consta de 12 cifras: yyyymmddhhmm. Por ejemplo, las seis y veinte de la tarde del 27 de Octubre de 1.998 se escribiría como 199810271820.

    • Cuando un usuario está conectado en este momento, indica desde cuándo.

    • Lectura de ficheros de log MRTG. En esos registros, el campo de Caller-ID se pone el nombre especificado, para distinguirlo de números de teléfono.

    • Se pueden indicar un número ilimitado de direcciones IP asociadas directamente a un usuario, sin un registro RADIUS correspondiente. De esta forma es posible acceder a los logs MRTG sin necesidad de tener una entrada RADIUS para una IP de una intranet monitorizada.

    • Las matrices de cadenas, que se terminaban con un '\0', ahora se terminan con un puntero a NULL.

  • 27/Oct/98: Versión de desarrollo 14d2

    • Mejora en el rendimiento de un 50% gracias al filtrado del log por usuario a buscar.

    • El programa ya no genera un "CoreDump" cuando se invoca desde la línea de comandos sin ningún parámetro.

    • Al array que contiene los ficheros de detalle, en vez de llamarle CSIVs, lo llamo "accounting". De esta forma independizamos la nomenclatura y abrimos la puerta a la gestión de otros tipos de logs.

    • Puede gestionar logs RADIUS que no utilicen la notación "@", sin necesidad de un wrapper.

    • Soporte para lectura de logs en formatos arbitrarios, sin más que hacer las rutinas apropiadas y enlazarlas con la librería principal.

    • Soporte para un número ilimitado de clases IP, en vez de una única clase de la versión 13.

  • 20/Oct/98: Versión de desarrollo 14d1

    • Mejora en el rendimiento de un 37%, gracias al empleo de rutinas strchr y strcmp propias, así como el parsing del fichero de detalle mediante un árbol parcial.

    • Separación de las rutinas genéricas de logs (por ejemplo, caché o inicialización de las estructuras) de las rutinas de acceso a los ficheros de detalle RADIUS.

    • En vez de distribuir un fichero objeto "conexiones.o", se distribuye una librería "libconexiones.a", con varios objetos dentro: conexiones.o, lee_log.o y lee_radius.o.
     

  • 14/Oct/98: Versión 13_2

    Se anuncia en diversos foros la disponibilidad de esta página y de la librería "CONEXIONES".

    Por demanda, se distribuye también la librería para Windows/x86. Esta librería no es ELF, y no está probada.

  • 13/Oct/98: Versión 13

    Primera versión de este documento.

    La versión 13 es la primera versión realmente pública de esta librería, contemplando la configuración de los parámetros locales de cada instalación por el propio administrador. Adicionalmente, la velocidad se ha multiplicado por TRES respecto a la versión 12.

    Algunas de sus características:

    • Distribución como Objeto ELF, para poder enlazarse con rutinas o configuraciones de cada administrador local.

    • Disponible para Solaris/Sparc y Linux/x86.

    • Compilada de forma "relocalizable" para poder ser utilizada, por ejemplo, como componente de una librería dinámica y/o compartida.

    • Compilada con opciones de optimización, que multiplican la velocidad de ejecución por DOS.

    • Distribuida con ficheros de cabecera "*.h", para que el administrador local tenga acceso a su interfaz, y pueda configurarla y expandirla según sus necesidades concretas.

    • Reconoce los siguientes datos en los ficheros de detalle RADIUS: Fecha y hora, User-Name, Acct-Status-Type, Acct-Session-Id, Caller-Id, Acct-Session-Time, Ascend-Disconnect-Cause, Ascend-Data-Rate, Framed-Address, Acct-Output-Octets, Acct-Input-Octets, Acct-Output-Packets, Acct-Input-Packets.

    • Puede gestionar de forma unificada un número ilimitado de ficheros de detalle RADIUS.

  • 02/Oct/98:

    Se hace pública la disponibilidad de la librería en la lista de correo de Proveedores de Internet Españoles. La versión distribuida es básicamente igual a la versión interna de Argo. No es configurable de forma local y por ello no funciona correctamente en la mayoría de los otros sistemas. Disponible como ejecutable bajo Solaris/Sparc y Linux/x86.  

  • 30/Sep/98: Versión 12  

  • 20/May/97: Versión 1

    Primera versión de esta librería, ejecutable vía CGI.



Python Zope ©1998-2000 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS