From 6b8eb0c969ab5e7499f948f6f9a2b145107914fb Mon Sep 17 00:00:00 2001 From: Drk0027 Date: Tue, 13 Jan 2026 10:33:27 -0500 Subject: [PATCH] Actualizacion de codigo --- .gitignore | 2 +- config.conf | 2 +- config.conf.example | 2 +- control-rss.sh | 102 ++++++++++++++++++++++++++++++-------------- 4 files changed, 73 insertions(+), 35 deletions(-) diff --git a/.gitignore b/.gitignore index 3842932..ca049fa 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -.conf \ No newline at end of file +config.conf \ No newline at end of file diff --git a/config.conf b/config.conf index 5540710..54975f7 100644 --- a/config.conf +++ b/config.conf @@ -4,5 +4,5 @@ LOG_FILE="/var/log/nginx/interlan.access.log" # Ruta a tu archivo de log princip URL_A_MONITORIZAR="/feed" # La URL que quieres analizar -OUTPUT_JSON="visitantes_unicos.json" # Archivo JSON de salida +OUTPUT_FILE="visitantes_unicos.json" # Archivo JSON de salida # --- Fin de Configuración --- diff --git a/config.conf.example b/config.conf.example index fdd1517..c791733 100644 --- a/config.conf.example +++ b/config.conf.example @@ -4,5 +4,5 @@ LOG_FILE="/var/log/nginx/access.log" # Ruta a tu archivo de log principal URL_A_MONITORIZAR="/feed" # El script es principalmente para ver datos de RSS, pero lo puedes modificar tu gusto -OUTPUT_JSON="visitantes_unicos.json" # Archivo JSON de salida +OUTPUT_FILE="visitantes_unicos.json" # Archivo JSON de salida # --- Fin de Configuración --- diff --git a/control-rss.sh b/control-rss.sh index 9982aa1..bdbdafd 100644 --- a/control-rss.sh +++ b/control-rss.sh @@ -1,45 +1,83 @@ #!/bin/bash # Cargar configuración -source config.conf +source ./config.conf -# Creacion del JSON si no existe -if [ ! -f "$OUTPUT_FILE" ]; then - echo '{"total_unicos": 0, "visitas": []}' > "$OUTPUT_FILE" -fi +# 1. Procesamiento eficiente de logs +echo "Procesando logs..." -zgrep "$TARGET_URL" $LOG_PATH | awk -F'"' '{ - split($1, a, " "); - ip = a[1]; fecha = substr(a[4], 2, 11); ua = $6; - print ip "|" fecha "|" ua -}' | sort -u > temp_agents.txt +# 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 +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) + 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 -while IFS="|" read -r ip fecha ua; do - if ! jq -e --arg ua "$ua" --arg date "$fecha" '.visitas[] | select(.user_agent == $ua and .fecha == $date)' "$OUTPUT_FILE" > /dev/null; then - jq --arg ip "$ip" --arg date "$fecha" --arg ua "$ua" \ - '.visitas += [{"ip": $ip, "fecha": $date, "user_agent": $ua}] | .total_unicos = (.visitas | map(.user_agent) | unique | length)' \ - "$OUTPUT_FILE" > "$OUTPUT_FILE.tmp" && mv "$OUTPUT_FILE.tmp" "$OUTPUT_FILE" - fi -done < temp_agents.txt +# 2. Actualizar JSON (Estructura optimizada) +echo "Actualizando JSON..." +if [ ! -f "$OUTPUT_FILE" ]; then echo "[]" > "$OUTPUT_FILE"; fi -# 2. Generar datos para Gnuplot (Frecuencia por fecha) -# Extraemos del JSON: "Fecha Cuenta" -jq -r '.visitas[].fecha' "$OUTPUT_FILE" | sort | uniq -c | awk '{print $2, $1}' > datos_grafica.dat +# 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}') + + # 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" +done < temp_data.txt -# 3. Generar la gráfica con Gnuplot -echo "Generando gráfica con Gnuplot..." +# 3. Preparar datos para Gnuplot + +# Frecuencia por Hora +jq -r '.[].hora' "$OUTPUT_FILE" | sort | uniq -c | awk '{print $2, $1}' > hourly.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 para: $URL_A_MONITORIZAR

+

Agentes Únicos: $UNIQUE_AGENTS

+

Lectores RSS detectados: $RSS_COUNT

+
+

Frecuencia Horaria

+ +

Top Agentes

+ + + +HTML + +rm temp_data.txt hourly.dat agents.dat +echo "Completado. Revisa informe.html"