From 4dcd97b7260d3cc0a1ff8fcdd9c47a24452996b0 Mon Sep 17 00:00:00 2001 From: Drk0027 Date: Tue, 13 Jan 2026 10:45:43 -0500 Subject: [PATCH] Agregado identidad del agente y exportado a HTML. Se guardan ahora un HTML y un PNG como resultado del proceso --- control-rss.sh | 99 +++++++++++++++++++++++++------------------------- 1 file changed, 50 insertions(+), 49 deletions(-) diff --git a/control-rss.sh b/control-rss.sh index bdbdafd..57eddf5 100644 --- a/control-rss.sh +++ b/control-rss.sh @@ -1,83 +1,84 @@ #!/bin/bash # Cargar configuración +if [ ! -f config.conf ]; then echo "Error: config.conf no encontrado"; exit 1; fi source ./config.conf -# 1. Procesamiento eficiente de logs -echo "Procesando logs..." +# Inicializar JSON si no existe +if [ ! -f "$OUTPUT_FILE" ]; then + echo '{"datos": [], "resumen": {}}' > "$OUTPUT_FILE" +fi -# Extraemos: IP, Fecha(DD/Mon/YYYY), Hora(HH), Agente, URL -# Formato Combined: $1=IP, $4=[DD/Mon/YYYY:HH:mm:ss, $7=URL, $12+=Agente +echo "Procesando logs..." +# Extraer: IP | Fecha | Hora | Agente (IP + Agente definen al único) awk -v url="$URL_A_MONITORIZAR" ' $7 == url || $7 ~ url { split($4, t, /[:/]/); - fecha=t[2]"/"t[3]"/"t[4]; - hora=t[5]; - # Extraer User Agent (todo lo que sigue después de la columna 11) + fecha=t[1]"/"t[2]"/"t[3]; + hora=t[4]":"t[5]; + # Extraer User Agent ua=""; for(i=12; i<=NF; i++) ua=(ua=="" ? $i : ua" "$i); gsub(/"/, "", ua); print $1 "|" fecha "|" hora "|" ua }' "$LOG_FILE" | sort -u > temp_data.txt -# 2. Actualizar JSON (Estructura optimizada) -echo "Actualizando JSON..." -if [ ! -f "$OUTPUT_FILE" ]; then echo "[]" > "$OUTPUT_FILE"; fi +echo "Actualizando base de datos JSON..." +# Usamos un archivo temporal para construir la nueva lista de datos +TMP_JSON="tmp_db.json" -# Usamos jq para fusionar datos únicos de forma masiva (más rápido que línea a línea) while IFS="|" read -r ip fecha hora ua; do - is_rss=$([[ "$ua" =~ (RSS|Feed|Reader|SimplePie|W3C_Validator) ]] && echo "true" || echo "false") - NEW_ENTRY=$(jq -n --arg ip "$ip" --arg f "$fecha" --arg h "$hora" --arg ua "$ua" --arg rss "$is_rss" \ - '{ip: $ip, fecha: $f, hora: $h, agente: $ua, es_rss: $rss}') + # Identificador único para evitar duplicados en el histórico + ID_UNICO=$(echo "${ip}${ua}" | md5sum | cut -d' ' -f1) - # Solo añadir si no existe la combinación exacta - jq --argjson new "$NEW_ENTRY" 'if any(.[]; .ip == $new.ip and .agente == $new.agente and .fecha == $new.fecha) then . else . + [$new] end' \ - "$OUTPUT_FILE" > "$OUTPUT_FILE.tmp" && mv "$OUTPUT_FILE.tmp" "$OUTPUT_FILE" + # Determinar si es RSS + IS_RSS=$([[ "$ua" =~ (RSS|Feed|Reader|SimplePie|W3C_Validator|TinyPRSS) ]] && echo "true" || echo "false") + + # Insertar solo si no existe el ID_UNICO + jq --arg id "$ID_UNICO" --arg ip "$ip" --arg f "$fecha" --arg h "$hora" --arg ua "$ua" --arg rss "$IS_RSS" \ + 'if .datos | any(.[]; .uid == $id) then . + else .datos += [{"uid": $id, "ip": $ip, "fecha": $f, "hora": $h, "agente": $ua, "es_rss": ($rss=="true")}] end' \ + "$OUTPUT_FILE" > "$TMP_JSON" && mv "$TMP_JSON" "$OUTPUT_FILE" done < temp_data.txt -# 3. Preparar datos para Gnuplot +echo "Recalculando resumen y gráficas..." +# Actualizar el bloque de resumen dentro del JSON +jq '.resumen = { + "total_visitantes_unicos": (.datos | length), + "usuarios_rss": ([.datos[] | select(.es_rss == true)] | length), + "usuarios_estandar": ([.datos[] | select(.es_rss == false)] | length), + "ultima_actualizacion": "'$(date +%Y-%m-%d\ %H:%M:%S)'" +}' "$OUTPUT_FILE" > "$TMP_JSON" && mv "$TMP_JSON" "$OUTPUT_FILE" -# Frecuencia por Hora -jq -r '.[].hora' "$OUTPUT_FILE" | sort | uniq -c | awk '{print $2, $1}' > hourly.dat +# 3. Datos para Gnuplot (Frecuencia semanal) +jq -r '.datos[].fecha' "$OUTPUT_FILE" | sort | uniq -c | awk '{print $2, $1}' > freq.dat -# Frecuencia por Agente (Top 10) -jq -r '.[].agente' "$OUTPUT_FILE" | sort | uniq -c | sort -rn | head -10 | awk '{$1=""; print "\""$0"\"", $1}' > agents.dat - -# 4. Generar Gráficas -echo "Generando gráficas..." gnuplot < informe.html - -Reporte de Accesos + +Reporte de Audiencia -

Reporte para: $URL_A_MONITORIZAR

-

Agentes Únicos: $UNIQUE_AGENTS

-

Lectores RSS detectados: $RSS_COUNT

-
-

Frecuencia Horaria

- -

Top Agentes

- +

Informe para $URL_A_MONITORIZAR

+ + HTML -rm temp_data.txt hourly.dat agents.dat -echo "Completado. Revisa informe.html" +rm temp_data.txt freq.dat +echo "Proceso terminado exitosamente."