Últimos Cambios |
||
Blog personal: El hilo del laberinto |
Última Actualización: 28 de Diciembre de 2.000 - Jueves
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.
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.
Esta librería puede invocarse de varias formas:
Simplemente se indica el nombre del usuario cuyos datos se desean buscar.
A partir de la versión 14, se puede especificar la fecha inicial y, opcionalmente también, la fecha final a considerar, en formato aaaammddhhmm.
Un usuario normal puede ver la información que el sistema tiene sobre sus conexiones ejecutando el CGI sin ningún parámetro. El programa identificará al usuario por su IP actual.
Si el usuario escribe un asterisco ("*") al final de la URL, o bien selecciona el enlace "Archivo Histórico", se le mostrarán los datos acumulados de los meses anteriores, si el administrador ha habilitado esa funcionalidad.
La librería dispone de una "Puerta Trasera" gracias a la cual un administrador puede tener acceso a todos los datos de un usuario o una IP determinada. Para ello debe teclearse al final de la URL del GCI la cadena "?clave=login", o bien la cadena "?clave=IP". La "clave" es la clave que el administrador definió cuando compiló el código.
El "login" es el identificador del usuario que queremos analizar. La librería mostrará sus datos actuales, nos dará acceso también al archivo histórico y nos informará de si el usuario está conectado o no en estos momentos, y con qué dirección IP.
Como en el caso anterior, escribiendo un asterisco ("*") al final de la URL, o bien seleccionando el enlace "Archivo Histórico", se muestran los datos acumulados de los meses anteriores, si el administrador ha habilitado esa funcionalidad.
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:
Aquí escribimos la equivalencia entre direcciones IP fijas y usuarios determinados. Esto es útil cuando tenemos usuarios monitorizados por MRTG, o cuando queremos que una IP determinada pueda acceder a los datos de un usuario concreto.
Esta es la parte más importante y delicada, ya que estamos indicando las fuentes de datos que vamos a utilizar. Cada fuente aparece en una línea, y en cada línea la distribución es:
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.
Antes de instalar la librería de forma que sea accesible desde Internet, como CGI, es conveniente que todo está funcionando como debe:
Si no funciona: Probablemente no estén bien configuradas las rutas de acceso a los ficheros de detalle RADIUS, o no estamos ejecutando el programa como root.
Debería aparecernos un documento en formato HTML, con información pormenorizada de dicho usuario. Verifiquemos que datos como el número de conexiones, etc., son reales y coinciden con lo mostrado en la prueba anterior.
Si no funciona: Si aparecen todos los valores a cero, es muy posible que no hayamos configurado adecuadamente los campos de CPI (ISP).
Esta prueba debe repetirse al menos tantas veces como CPIs estemos evaluando, comprobando usuarios de todos ellos.
Si no funciona: O el directorio del CGI que hemos especificado en la configuración es erróneo, o no estamos ejecutando la operación como root.
Si no funciona: Si la prueba anterior funcionaba y ésta no, no hemos instalado la librería adecuadamente. ¿Lo haces como root?.
Es normal y correcto que nos diga que no puede encontrar información sobre la conexión, si no estamos conectados desde una cuenta RADIUS.
Si no funciona:
Si no funciona: Si no aparece todos los datos a cero, es muy posible que el usuario bajo el que se ejecuta el servidor web no tenga permiso de lectura sobre los logs. Es imprescindible que ese usuario tenga permiso de escritura sobre los logs, y de entrada en todos los directorios por encima de ellos.
Nos debería aparecer una página HTML mostrando información de ese usuario.
Si no funciona: Si nos aparece información sobre el usuario que estamos usando desde RADIUS o nos dice que no puede encontrar información sobre la conexión, y el usuario especificado se ha conectado alguna vez en el mes en curso, tenemos un problema de clave o hemos tecleado mal el usuario (o le hemos añadido la @, cosa que no se debe hacer).
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:
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
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.
Abre el fichero especificado por f_detalle. Sólo devuelve los registros que correspondan al usuario usuario. Si se desea acceder a todos los registros, se pasa "". Cualquier error es ignorado hasta que se intenta leer un registro.
Cierra el log abierto.
Esta función devuelve el siguiente registro. Los registros se devuelven en el orden en que fueron almacenados. En caso de error el contenido de registro no es confiable.
Devuelve el timestamp de este fichero de log. Es utilizado para la verificación caché. En caso de error, de que el fichero no tenga una existencia física, etc., se devuelve 0.
Los tipos de datos t_log, registro_log y log_estado se definen en "lee_log.h".
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.
Equivalente a abre_log de la interfaz lee_log, pero en este caso intenta evitar el acceso al fichero original mediante el empleo de una caché intermedia. El módulo se responsabiliza de verificar la validez de la caché y proceder a su reconstrucción si es preciso. original proporciona el punto de anclaje con los logs originales, para el caso de que la caché no sea válida y deba reconstruirse.
Equivalente a la interfaz lee_log.
Equivalente a la interfaz lee_log.
Equivalente a la interfaz lee_log. El timestamp devuelto es el de la fuente original, no el de la caché.
Esta interfaz proporciona diferentes posibilidades de visualización. Cada módulo es un formato de salida diferente.
Visualiza información sobre el cliente que está consultando los datos, como su IP, la versión de su navegador, etc. fecha contiene la fecha que se considera como última modificación de los datos que se van a mostrar, y expiración es el período de validez que se está proponiendo.
Visualiza el grueso de la información de conexiones. Esta rutina puede invocarse varias veces, con datos diferentes.
Esta rutina es invocada al final de la visualización.
Los tipos de datos t_salida_cabecera y t_salida_conexiones se definen en "salida.h".
Los módulos de este tipo proporcionan una visualización gráfica, no de texto.
Inicializa la salida gráfica.
Traza el objeto gráfico.
Finaliza la salida gráfica.
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.
Estructura que asocia un texto a un número de teléfono.
Inicializa todos los campos del registro, dándoles su valor por defecto.
Abre un fichero como lectura, utilizando un mecanismo de caché para reducir las llamadas al sistema y ganar velocidad. Los errores se ignoran hasta que se intenta leer.
Si f_detalle contiene algún espacio, intenta ejecutar el proceso indicado con la porción antes del espacio, pasándole como parámetros lo que haya tras el espacio. La salida de dicho proceso se toma como si fuera el fichero de entrada.
Cierra el fichero anterior.
Devuelve una línea entera del fichero. No incluye el '\n' final. Un '\r' que precede a un '\n' es ignorado. Si el fichero acaba sin un '\n', devuelve un LOG_EOF, y el contenido de linea no es confiable.
Devuelve un cierto número de caracteres del fichero. No los interpreta de ninguna manera. En caso de que ocurra un error o el fichero acabe antes de leer esos caracteres, se lee hasta donde se pueda, nada más, y se devuelve un LOG_EOF.
Nos dá el timestamp de la última modificación para ese fichero.
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"
Devuelve el número de segundos desde 01/01/1970 para una cadena en formato "AAAAMMDDhhmm".
Rellena una cadena con el tiempo en formato "AAAAMMDDhhmm" que se corresponde con tiempo como el número de segundos desde 01/01/1970.
Nos proporciona el tiempo en segundos que se corresponde al primer segundo del mes en que cae tiempo.
Nos proporciona el tiempo en segundos que se corresponde al primer segundo del mes siguiente al mes en que cae tiempo.
Fija para las variables globales tiempo_inicial y tiempo_final apropiadas para un período de un mes. Básicamente "tiempo_inicial=dia1_este_mes(ahora)" y "tiempo_final=dia1_siguiente_mes(ahora)".
Si estamos en las cuatro primeras horas del mes, toma como base el mes anterior. Esto se emplea para poder generar o refrescar los archivos históricos.
Si se le pasa un parámetro, lo considera tiempo inicial. El final será el instante actual. Si se le pasan dos parámetros, el primero será el tiempo inicial y el segundo el tiempo final. Los tiempos están en formato "AAAAMMDDhhmm".
Si no se le pasa ningún parámetro, se utiliza clipping_mensual().
El fin de estas rutinas es proporcionar información sobre la versión que se está ejecutando de la librería.
Nos proporciona un texto HTML.
Nos proporciona un texto en ASCII.
Nos proporciona un texto con la versión de la librería.
Nos da un texto con la fecha de la librería.
Esta rutina nos dá el timestamp en el momento de compilar la librería. Utilizado, por ejemplo, para decidir si la salida HTML debe renovarse o no debido a posibles cambios en la gestión de la librería. También se emplea como uno de los criterios para decidir si los ficheros caché están o no actualizados.
Diversas rutinas optimizadas. Se redefinen las rutinas estándar para que la librería emplee las rutinas optimizadas, usando #undef y #define.
Devuelve un puntero a la posición de la cadena s donde aparece el carácter c. Si no aparece, devuelve NULL. Semejante a strchr().
Dice si una cadena es mayor o menor que otra. Semejante a strcmp().
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".
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:
Las clases C a las que se les permite acceder como "Usuario". El resto de direcciones son rechazadas con un mensaje de "Usted no es un usuario nuestro". Cuando se especifica una clave válida en la URL del CGI, siempre se permite el acceso.
El último elemento es NULL.
La clave de administrador para el CGI. Conociendo esa clave se puede consultar la información de cualquier usuario y de cualquiera de nuestras IPs, así como los archivos históricos correspondientes.
Directorio donde se almacenan los archivos históricos de los usuarios.
Esta estructura permite asignar un usuario concreto a una IP fija. De esta forma es posible, por ejemplo, que un usuario que se monitoriza con MRTG pueda consultar sus estadísticas sin necesidad de que aparezca un registro START en el RADIUS.
El último elemento es {NULL, NULL}.
Esta estructura contiene toda la información necesaria para localizar y procesar los archivos de logs. path indica su Path de acceso, AT_ISP indica si debe añadirse algún sufijo en plan @isp, y cuál es. log es un puntero a una estructura que contiene punteros a las rutinas para acceder a ese fichero de log:
Esta rutina abre un archivo de log. Sólo se permite tener un archivo de log abierto simultaneamente. f_detalle es el path del archivo, y usuario es el usuario cuyos registros nos interesan. Si es una cadena vacía "" indicamos que estamos interesados en todos los registros de todos los usuarios.
Cierra el registro de log abierto.
Devuelve un registro.
El último elemento es {NULL, NULL, NULL}.
Esta rutina es la que se llama para realizar la gestión de logs. Es llamada por una rutina main externa, proporcionada por el usuario de la librería, para que éste pueda realizar el procesado previo que estime conveniente.
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.
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:
La clase C a la que se le permite acceder como "Usuario". El resto de direcciones son rechazadas con un mensaje de "Usted no es un usuario nuestro". Cuando se especifica una clave válida en la URL del CGI, siempre se permite el acceso.
Siempre debe existir.
La clave de administrador para el CGI. Conociendo esa clave se puede consultar la información de cualquier usuario y de cualquiera de nuestras IPs, así como los archivos históricos correspondientes.
Siempre debe existir.
Aquí se indica la coletilla a añadir al login de usuario a la hora de buscarlo en los ficheros de detalle RADIUS. Típicamente es algo de la forma "@ISP".
Siempre debe existir.
Directorio donde se almacenan los archivos históricos de los usuarios.
Siempre debe existir.
Estas funciones son stubs para permitir ampliar la librería con acceso a información RADIUS adicional, como una base de datos o un sistema remoto.
Siempre deben existir.
Esta función es la primera en ejecutarse de la librería. Normalmente invoca directamente la rutina "main_conexiones". No obstante puede sustituirse por lo que sea necesario. Por ejemplo, puede emplearse para realizar un programa para un propósito concreto, que sólo emplee las rutinas de acceso a los ficheros de detalle RADIUS.
Siempre debe existir.
Esta tabla permite configurar la librería con las direcciones locales de los ficheros RADIUS de detalle.
Siempre debe definirse, al menos, un fichero. No es necesario que exista, pero debe definirse algo en este campo.
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.
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.
La versión 13 sólo maneja adecuadamente clases IP A, B y C, y sólo una clase simultaneamente. Si un proveedor, entonces, tiene más de una clase C, el programa se configurará con una de ellas, y las otras serán rechazadas.
Este problema se solucionará en versiones subsiguientes si existe demanda. En cualquier caso, cuando el administrador utiliza la clave de acceso CGI, o la librería es ejecutada directamente desde la línea de comando, no se comprueba la clase. Por lo tanto, este problema, cuando la librería se utiliza con fines de administración, no es tal.
La versión 13 de la librería exige que siempre se añada una coletilla al identificador de usuario, a la hora de buscarlo en los logs. Por ejemplo, el usuario "jcea" será buscado en los logs como "jcea@argo". Esta situación es bastante típica.
Sin embargo existen numerosos proveedores que hospedan un único CPI, por lo que no añaden ninguna coletilla. No se puede quitar la coletilla, ya que esta versión (13) la exige. Lo que sí se puede hacer es utilizar las funciones STUB para interceptar la función de lectura de registro, añadiendo la coletilla de forma interna. Por ejemplo:
... char *AT_ISP="@pepito"; ... log_estado lee_registro_con_parche(registro_log *registro) { log_estado estado; estado=lee_registro_detalle_radius(registro); /* ** Cuidado con el overflow */ strcat(registro->nombre,AT_ISP); return estado; } ... void (*abre_log) (char *f_detalle)=abre_log_detalle_radius; void (*cierra_log) (void)=cierra_log_detalle_radius; log_estado (*lee_registro) (registro_log registro)=lee_registro_con_parche; /* OJO */ ...
Este caso es el inverso del anterior: el ISP siempre añade una coletilla, pero dicha coletilla es diferente según por dónde entre el usuario (infovía, nodo local, proxy, etc). A nosotros lo que nos interesa es el estado global; no nos importa por dónde acceda.
La solución es la misma que en el caso anterior, solo que en vez de añadir una coletilla genérica, se sustituye cualquier coletilla que exista por la genérica. Por ejemplo:
... char *AT_ISP="@pepito"; ... log_estado lee_registro_con_parche(registro_log *registro) { log_estado estado; char *p; estado=lee_registro_detalle_radius(registro); p=strchr(registro->nombre,'@'); if(p!=NULL) *p='\0'; /* ** Cuidado con el overflow */ strcat(registro->nombre,AT_ISP); return estado; } ... void (*abre_log) (char *f_detalle)=abre_log_detalle_radius; void (*cierra_log) (void)=cierra_log_detalle_radius; log_estado (*lee_registro) (registro_log registro)=lee_registro_con_parche; /* OJO */ ...
Un caso típico sería el almacenamiento en una base de datos. En casos así basta reemplazar las rutinas STUB abre_log, cierra_log y lee_registro, por otras equivalentes pero que tomen su entrada de los logs correspondientes. Siempre que se atengan a las especificaciones de la interfaz, la librería funcionará sin ningún tipo de problema.
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:
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.
Si se envían varios Alive por conexión, la librería no funciona correctamente. Los interpretará como varios Start. ¿Alguien puede decirme si eso es un problema?.
Verificación del fichero conexiones21_tar.gz:
MD5: 0977831abea9f3c8d8c5f1d11f45a30e SHA-1: e35cea3c18faa1c03d46880cb367a1911ea80af4
Verificación del fichero conexiones20_tar.gz:
MD5: 2c9667d48b7218ba4f5587690f40a4be SHA-1: 804a720348e009abd82da6923102f7fc40a47769
Verificación del fichero conexiones20b13_tar.gz:
MD5: 7eaca2616584900561ebaac9d23a45ef SHA-1: a7f1b07487a2240f19a3df125427315631db6ad2
Verificación del fichero conexiones20b6_tar.gz:
MD5: 3d687a0c2534814a74876021b895b27e SHA-1: baebfc6bdf459b2965e62df60672a05c02462b35
Verificación del fichero conexiones20b5_tar.gz:
MD5: 586fac47f45e67928f2198d85903344a SHA-1: 31185fbeb7a0a45bdcc134c7bcf93cb593ae2d97
Los ficheros contenidos en esta distribución son los siguientes:
Verificación del fichero conexiones19_tar.gz:
MD5: 059abf59dc16019be11cf2ca61735c8e SHA-1: 874745deb0b582f6d54a1142cd503957eccaecf5
Verificación del fichero conexiones19b13_tar.gz:
MD5: 06a7c26748ddfc82e449cc6de808d39f SHA-1: becdf6ab969a6bd062461fe094641fab5eae9f65
Verificación del fichero conexiones19b9_tar.gz:
MD5: 9ada81e8e2d77cb366d7a1581f2c4338 SHA-1: 92694ee22d2c2db0cfabe0024a11db5bbf7b798d
Verificación del fichero conexiones19b7_tar.gz:
MD5: 7bbd7071fee85e0a31f5ccca03a6d034 SHA-1: 2e0fa4e291637694fb722fc823661bf58c3d6b18
Verificación del fichero conexiones19b2_tar.gz:
MD5: 81740e38da99ed9d36e7491b7292388f SHA-1: 3413e5dee40481035ae31673d6a176ec1479729b
Los ficheros contenidos en esta distribución son los siguientes:
Verificación del fichero conexiones18_tar.gz:
MD5: dda7417c20983bf0385dc6419b2ec3e0 SHA-1: e0c162e80c7b9bfb76cb49f5fe0a8ce66c482d81
Verificación del fichero conexiones18b8_tar.gz:
MD5: 41fbd9d2efdd9015b33a9998e8a48d1d SHA-1: 251869d30bd9489e6416c7e9063d2f1fac407dee
Verificación del fichero conexiones18b7_tar.gz:
MD5: 1b0757d2fb2a92c9e16cfa4052a79a4a SHA-1: 13d82172a0f91ec75f4a85a383be47c63d9aab1a
Verificación del fichero conexiones18b6_tar.gz:
MD5: 67de251a6de6a98fe0d5df9b0f48fc04 SHA-1: c00a1f9eb3a0390f424daf2ecb264017ca9396ff
Verificación del fichero conexiones18b5_tar.gz:
MD5: 6c602f923c6f71871110576f0eefa01f SHA-1: c6aff10beed2d823af8f08b7ccd4550ac3e6f478
Verificación del fichero conexiones18b3_tar.gz:
MD5: a528c97e12404f3e8094b60ad5ec9410 SHA-1: 4f0abcd6d68f9d252fdb6d14abffcd03785671f6
Los ficheros contenidos en esta distribución son los siguientes:
Verificación del fichero conexiones17_tar.gz:
MD5: 0e2b2c76f01142fea443f908121d1a96 SHA-1: 766facbf8abccab8ff5db59c5ff081a86e139f99
Verificación del fichero conexiones17b6_tar.gz:
MD5: 79f3d066bb7f1e8ca471e3c70f002fcc SHA-1: de82a3557a043ad0c2560b53cd48e9674217054d
Verificación del fichero conexiones17b4_tar.gz:
MD5: ee663907a4b8b67a0f7ffdad0585855f SHA-1: d44123ed38eee1aa5e72139d77bbe277c55b1c14
Los ficheros contenidos en esta distribución son los siguientes:
Verificación del fichero conexiones16_tar.gz:
MD5: 199a88d8d4d6215ed3f26629b07593ac SHA-1: 626bc5103d445dafbbe82c97aa4f1ae1cf02c211
Verificación del fichero conexiones16b7_tar.gz:
MD5: 6b223ea8217d3caacf98cb0d1a5cc814 SHA-1: bf15492d2f1631bf6332872b462f4ebb66e635b2
Verificación del fichero conexiones16b6_tar.gz:
MD5: e8c12e5d175a8d90b1bee15e5e731a35 SHA-1: 9e06560a770221b35da55fb5dfe13e590aa3c69c
Verificación del fichero conexiones16b3_tar.gz:
MD5: 7333759557f34eab6f0cae11695a1b61 SHA-1: d7534a2cec4218c47ea80f554d2fabbb286481aa
Los ficheros contenidos en esta distribución son los siguientes:
Verificación del fichero conexiones15_tar.gz:
MD5: e79968f3d870736d31ca09678d39f1fc SHA-1: b2dce633fd06441fd0abfa933f0d73255a4cee8c
Verificación del fichero conexiones15b1_tar.gz:
MD5: 780cda65760742277b9d208e1ea16602 SHA-1: 9df39162e21a597d47b78a4422527b8af0995390
Ésta es la primera versión distribuida 100% con el código fuente completo. Con ello se pretende contribuir a su mayor difusión y a un desarrollo más rápido. Los términos de la licencia se pueden ver a continuación, y se incluyen en el fichero "COPYING":
Librería CONEXIONES
Versión 14 14/Dic/98 Jesús Cea Avión
CONDICIONES DE USO Y DISTRIBUCIÓN La versión 14 de la librería "CONEXIONES" tiene las siguientes condiciones de uso y distribución:
Jesús Cea Avión
Madrid, 14 de Diciembre de 1.998 |
Los ficheros contenidos en esta distribución son los siguientes:
Verificación del fichero conexiones14_tar.gz:
MD5: eacd98df4655d06ea6b8e0d718d3f2eb SHA-1: 982631ba6b3f35c449ae32e9101ef9d86f3d985d
Esta versión incluye librería para Windows/x86. Las condiciones de uso y distribución son las mismas que para la versión 13.
Librería Objeto Relocalizable. Esta distribución está constituida por los siguientes ficheros:
Verificación del fichero conexiones13_2_tar.gz:
MD5: 6e37712f285f555576605db737bcb537 SHA-1: 3d03ffc07baf299e2e5497a63965c7dc24dc8273
Librería CONEXIONES
Versión 13 13/Oct/98 Jesús Cea Avión
CONDICIONES DE USO Y DISTRIBUCIÓN La versión 13 de la librería "CONEXIONES" tiene las siguientes condiciones de uso y distribución:
Jesús Cea Avión
Madrid, 13 de Octubre de 1.998 |
Librería Objeto Relocalizable. Esta distribución está constituida por los siguientes ficheros:
Verificación del fichero conexiones13_tar.gz:
MD5: 720fff8cf5b333e485961faa125b3f88 SHA-1: 7893f3c89c00ed856bc7d12bef078947b17a15ed
Ésta fue la primera versión distribuida, como ejecutable Solaris/Sparc y Linux/x86. No era configurable ni adaptable en entornos distintos. No disponible.
Más información sobre los OpenBadges
Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS