Ein Wiki privater Natur

show_top_domains

Übersicht über die Domains, die am meisten Traffic innerhalb eines Monats hatten.

Die Größenangaben beziehen sich auf die komrimierten Logfiles

show_top_domains.png

show_top_domains.sh

#!/bin/bash
# show_top_domains.sh
#$Revision: 1.4 $
# Dieses Skript gibt die Top 10 der größten Domains basierend auf der Logfile-Größe eines gesamten Monats aus.

# Der Monat, den wir analysieren wollen (z.B. "202407" für Juli 2024)
log_month="202407"

# Funktion für die animierte Darstellung
animate_progress() {
  #local chars="/-\|" die sicherste Varianten
  #local chars=":;."  sind diese ersten beiden
  # UTF-8 kann funktionieren, wenn die Anmation kaputt aussieht nimm eins der beiden ersten 
  local chars="◐◓◑◒"
  local chars="◐◓◑◒ ● ○ "
  local chars="▁▂▃▄▅▆▇█▇▆▅▄▃▂▁"
  #local chars="▖▘▝▗"
  #local chars="⚫⚪"
  #local chars=("● ○")
  while :; do
    for (( i=0; i<${#chars}; i++ )); do
      echo -en "\r${chars:$i:1} "
      sleep 0.2
    done
  done
}

# Starte die Animation im Hintergrund
animate_progress &

# Speichere die Prozess-ID der Animation
ANIMATE_PID=$!

# Sorge dafür, dass die Animation beim Beenden des Skripts auch beendet wird
trap "kill $ANIMATE_PID >/dev/null 2>&1" EXIT


# Finde die Logfiles des gesamten Monats und summiere die Größen pro Webnummer
declare -A web_sizes

while IFS= read -r line; do
    size=$(echo "$line" | awk '{print $7}')
    web=$(echo "$line" | awk -F'/' '{print $6}')
    web_sizes["$web"]=$((web_sizes["$web"] + size))
done < <(find /var/www/clients/ -name "$log_month*-access.log*" -ls)

# Sortiere die Webnummern nach der Gesamtsumme der Logfile-Größen und beschränke auf die Top 10
top_webs=$(for web in "${!web_sizes[@]}"; do
    echo "${web_sizes[$web]} $web"
done | sort -rn | head -n 10 | awk '{print $2}')

# Initialisiere eine leere Variable für die Ergebnisse
# das "\r" überschreibt das letzte animate zeichen
result="\rTop 10 Domains nach Logfile-Größe für den Monat $log_month:\n"
result+="-------------------------------------------------------\n"

# Schleife über die Top-Webnummern, um die zugehörigen Domainnamen aus der Datenbank zu holen
for web in $top_webs; do
    domain=$(echo "use dbispconfig;
    SELECT DISTINCT domain
    FROM web_domain
    WHERE system_user = \"$web\";
    " | mysql -S /var/run/mysqld/mysqld.sock --skip-column-names)

    size_bytes=${web_sizes[$web]}
    size_mb=$(echo "scale=2; $size_bytes / 1048576" | bc)  # Umrechnung in MB

    # Ausgabe formatieren
    formatted_line=$(LC_NUMERIC=C printf "%-15s %-30s (Größe: %6.2f MB)" "$web:" "$domain" "$size_mb")

    # Hinzufügen der formatierten Zeile zum Ergebnis
    result+="$formatted_line\n"
done

# Ausgabe der Top 10 Domains
echo -e "$result"