Agregado identidad del agente y exportado a HTML. Se guardan ahora un HTML y un PNG como resultado del proceso
This commit is contained in:
@@ -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 <<EOF
|
||||
set terminal pngcairo size 800,400
|
||||
set output 'grafico_horas.png'
|
||||
set title "Visitas por Hora (Total Histórico)"
|
||||
set style fill solid
|
||||
plot 'hourly.dat' using 2:xtic(1) with boxes title "Visitas"
|
||||
|
||||
set output 'grafico_agentes.png'
|
||||
set title "Top 10 Agentes"
|
||||
set output 'grafica_semanal.png'
|
||||
set title "Frecuencia de Visitas Únicas"
|
||||
set xtics rotate by -45
|
||||
plot 'agents.dat' using 2:xtic(1) with boxes title "Agentes"
|
||||
set style fill solid
|
||||
plot 'freq.dat' using 2:xtic(1) with boxes title "Visitas"
|
||||
EOF
|
||||
|
||||
# 5. Generar Informe HTML
|
||||
echo "Generando informe HTML..."
|
||||
UNIQUE_AGENTS=$(jq '[.[].agente] | unique | length' "$OUTPUT_FILE")
|
||||
RSS_COUNT=$(jq '[.[] | select(.es_rss == "true")] | length' "$OUTPUT_FILE")
|
||||
# 4. Generar Informe HTML
|
||||
RSS_PERC=$(jq '.resumen.usuarios_rss * 100 / .resumen.total_visitantes_unicos' "$OUTPUT_FILE")
|
||||
|
||||
cat <<HTML > informe.html
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head><title>Reporte de Accesos</title></head>
|
||||
<html lang="es">
|
||||
<head><meta charset="UTF-8"><title>Reporte de Audiencia</title></head>
|
||||
<body>
|
||||
<h1>Reporte para: $URL_A_MONITORIZAR</h1>
|
||||
<p><b>Agentes Únicos:</b> $UNIQUE_AGENTS</p>
|
||||
<p><b>Lectores RSS detectados:</b> $RSS_COUNT</p>
|
||||
<hr>
|
||||
<h2>Frecuencia Horaria</h2>
|
||||
<img src="grafico_horas.png">
|
||||
<h2>Top Agentes</h2>
|
||||
<img src="grafico_agentes.png">
|
||||
<h1>Informe para $URL_A_MONITORIZAR</h1>
|
||||
<ul>
|
||||
<li><b>Total Visitantes Únicos:</b> $(jq '.resumen.total_visitantes_unicos' "$OUTPUT_FILE")</li>
|
||||
<li><b>Lectores RSS:</b> $(jq '.resumen.usuarios_rss' "$OUTPUT_FILE") ($RSS_PERC%)</li>
|
||||
<li><b>Última ejecución:</b> $(jq -r '.resumen.ultima_actualizacion' "$OUTPUT_FILE")</li>
|
||||
</ul>
|
||||
<img src="grafica_semanal.png">
|
||||
</body>
|
||||
</html>
|
||||
HTML
|
||||
|
||||
rm temp_data.txt hourly.dat agents.dat
|
||||
echo "Completado. Revisa informe.html"
|
||||
rm temp_data.txt freq.dat
|
||||
echo "Proceso terminado exitosamente."
|
||||
|
||||
Reference in New Issue
Block a user