home-harmening:tools:netzwerk:netzwerk_messen_skript

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
home-harmening:tools:netzwerk:netzwerk_messen_skript [2024/12/05 06:35] – angelegt charmeninghome-harmening:tools:netzwerk:netzwerk_messen_skript [2024/12/05 07:02] (aktuell) charmening
Zeile 1: Zeile 1:
 +{{ :home-harmening:tools:netzwerk:netzwerktestbalkendiagramm.png?400|}}
 ==== Skript um das Netzwerk zu testen ==== ==== Skript um das Netzwerk zu testen ====
 Ich stand vor dem Problem, dass ich die einen kompletten Standort durchmessen sollte. Der Vorteil hier \\ Ich stand vor dem Problem, dass ich die einen kompletten Standort durchmessen sollte. Der Vorteil hier \\
Zeile 12: Zeile 13:
   * Das Ergebnis wird in einem Logfile gespeichert und zum Administationspc gesendet   * Das Ergebnis wird in einem Logfile gespeichert und zum Administationspc gesendet
   * Nach Abschluss aller Messungen werden die Logfiles analysiert und mit php wird ein grafisch aufbereitetes html Dokument erstellt   * Nach Abschluss aller Messungen werden die Logfiles analysiert und mit php wird ein grafisch aufbereitetes html Dokument erstellt
 +\\
 +Um das Skript nutzen zu können müssen im Kopf zuvor einige Variablen festgelegt werden\\
 +  * str_sshUser = Benutzer der einen SSH Zugang zu allen Systemen besitzt
 +  * str_sshPass = Passwort des Benutzers
 +  * lst_clients = Liste der Clients die getestet werden sollen (z.B 10.0.013 10.0.1.14 ... 10.0.1.220)
 +  * str_server  = Adresse des iperf3 Servers gegen den getestet werden soll
 +  * bol_json    = Auskommentieren wenn die Webansicht nicht benötigt wird
 +\\
 +Vor beginn muss sich auf den Server aufgeloggt werden und der iper3 Server gestartet werden.
 +<code Bash>iperf3 -s</code>
 \\ \\
 === Ordnerstruktur === === Ordnerstruktur ===
Zeile 22: Zeile 33:
                               IPn.txt                               IPn.txt
 </code> </code>
 +=== networkTest.sh ===
 +<code Bash>
 +#!/bin/bash
 +# Skript führt eine Netzwerkmessung mit iperf3 an den angegebenen Rechnern durch
  
 +#Variablen
 +str_server="iperf3 SERVER" #Server IP
 +lst_clients="Client1 Client2 ..." #Lister der Clients
 +str_sshUser="SSHUSER" #SSH Benutzer
 +str_sshPass="SSHPASS" #SSH Passwort
 +str_baseDir=$(dirname "$(readlink -f "$0")")/ #Ausgabeverzeichnis
 +bol_json="--json" # Kommentar entfernen für Ausgabe im json Format?
 +
 +RED='\033[0;31m'
 +GREEN='\033[0;32m'
 +YELLOW='\033[1;33m'
 +NC='\033[0m'
 +str_myIP=$(hostname -I|awk '{print $1}')
 +
 +read -p "Geben Sie bitte den Standort an (Berlin): " str_location
 +str_output=${str_baseDir}${str_location}/
 +
 +# Dies ist das Skript was auf die Clients kopiert wird
 +str_networkTest=$(cat << EOF
 +#!/bin/bash
 +# Installiere requirements
 +if ! dpkg --list | grep iperf3 &> /dev/null ; then echo -e "${str_sshPass}\n" | sudo -S apt-get install iperf3 -y ; fi
 +if ! dpkg --list | grep sshpass &> /dev/null ; then echo -e "${str_sshPass}\n" | sudo -S apt-get install sshpass -y ; fi
 +
 +if [ -f /tmp/ergebnis.txt ]; then echo -e "${str_sshPass}\n" | sudo -S rm /tmp/ergebnis.txt ; fi
 +# Führe die Messung durch und speicher das Ergebnis im Logfile
 +iperf3 -c ${str_server} -u -b 100M -i 12 --logfile /tmp/ergebnis.txt ${bol_json}
 +# Kopiere das Logfile auf den Adminclient
 +sshpass -p "${str_sshPass}" scp -o StrictHostKeyChecking=no /tmp/ergebnis.txt ${str_sshUser}@${str_myIP}:${str_output}\$1.txt
 +EOF
 +)
 +echo -e "$str_networkTest" > /tmp/networkTest.sh
 +
 +# Variablen Prüfung
 +if [ -z "${str_server}" ]; then read -p "Geben Sie bitte den iperf3 Server ein: " str_server; fi
 +if [ -z "${lst_clients}" ]; then read -p "Geben Sie die iperf3 Client Liste ein (Client1 Client2 ... ClientN): " lst_clients; fi
 +if [ -z "${str_sshUser}" ]; then read -p "Geben Sie bitte den SSH Benutzer ein: " str_sshUser; fi
 +if [ -z "${str_server}" ]; then read -p -s "Geben Sie bitte das SSH Passwort ein: " str_sshPass; fi
 +
 +# Output Verzeichnis erstellen
 +if [ ! -d "${str_output}" ]; then mkdir -p ${str_output}; fi
 +
 +# Pakete installieren
 +if ! dpkg --list | grep sshpass &> /dev/null; then apt-get install ssh sshpass -y ;fi
 +if ! dpkg --list | grep php &> /dev/null; then apt-get install ssh php -y ;fi
 +
 +# Client initialisieren
 +int_clients=0
 +int_successClients=0
 +
 +# Nacheinander werden die Client getestet
 +for str_client in ${lst_clients}; do
 +  printf "${YELLOW}Connection to ${str_client}...${NC}"
 +  int_clients=$((int_clients + 1))
 +  if ping -c 3 ${str_client} &> /dev/null ; then
 +    # Kopiere das Testskript auf den Client
 +    sshpass -p "${str_sshPass}" scp -o StrictHostKeyChecking=no /tmp/networkTest.sh ${str_sshUser}@${str_client}:~/
 +    # FÜhre den Test auf dem Client durch
 +    sshpass -p "${str_sshPass}"  ssh -o StrictHostKeyChecking=no ${str_sshUser}@${str_client} "chmod +x ~/networkTest.sh ; echo -e \"${str_sshPass}\\n\" | sudo -S ~/networkTest.sh ${str_client}"
 +    # Entferne das Skript wieder
 +    sshpass -p "${str_sshPass}"  ssh -o StrictHostKeyChecking=no ${str_sshUser}@${str_client} "rm ~/networkTest.sh"
 +    printf "${GREEN}\rConnection success! Result stored in ${str_output}${str_client}.txt${NC}\n"
 +    int_successClients=$((int_successClients + 1))
 +  else
 +   printf "${RED}\rCant connect to ${str_client}...\n${NC}"
 +  fi
 +done
 +
 +echo
 +printf "${YELLOW}${int_successClients} from ${int_clients} are successful!\n"
 +
 +# Erstelle html zusammenfassung
 +cp ${str_baseDir}/present.php ${str_output}/
 +php ${str_output}/present.php > ${str_output}/present.html
 +</code>
 +\\
 +=== present.php ===
 +<code PHP>
 +<?php
 +// Verzeichnis, in dem das Skript liegt
 +$directory = __DIR__;  // Gibt das aktuelle Verzeichnis des Skripts zurück
 +$folderName = basename($directory);  // Holt den Namen des aktuellen Ordners
 +
 +// Alle .txt-Dateien im Verzeichnis finden
 +$files = glob($directory . '/*.txt');
 +
 +$dataArray = [];
 +$jitterData = [];
 +$bandwidthData = [];
 +$sentPacketsData = [];
 +$receivedPacketsData = [];
 +$fileNames = [];
 +$clientIPs = [];
 +$serverIPs = [];
 +
 +// Durch die Dateien iterieren und die JSON-Daten auslesen
 +foreach ($files as $file) {
 +    $json_data = json_decode(file_get_contents($file), true);
 +    
 +    // Überprüfen, ob die Daten vorhanden sind
 +    $bandwidth = isset($json_data['end']['sum']['bits_per_second']) ? $json_data['end']['sum']['bits_per_second'] : 0;
 +    $jitter = isset($json_data['end']['sum']['jitter_ms']) ? $json_data['end']['sum']['jitter_ms'] : 0;
 +    $lost_percent = isset($json_data['end']['sum']['lost_percent']) ? $json_data['end']['sum']['lost_percent'] : 0;
 +    
 +    // Extrahiere gesendete und empfangene Pakete
 +    $sent_packets = isset($json_data['end']['sum']['packets']) ? $json_data['end']['sum']['packets'] : 0;
 +    $received_packets = isset($json_data['intervals'][0]['streams'][0]['packets']) ? $json_data['intervals'][0]['streams'][0]['packets'] : 0;
 +
 +    // Extrahiere Client und Server IP (Client ist der remote_host und Server der local_host)
 +    $client_ip = isset($json_data['start']['connected'][0]['remote_host']) ? $json_data['start']['connected'][0]['remote_host'] : 'Unbekannt';
 +    $server_ip = isset($json_data['start']['connected'][0]['local_host']) ? $json_data['start']['connected'][0]['local_host'] : 'Unbekannt';
 +
 +    // Speichern der Dateinamen und der Daten für jedes Diagramm
 +    // Entfernen der .txt Endung vom Dateinamen
 +    $fileNames[] = basename($file, '.txt');  // Dateiname ohne .txt
 +    $bandwidthData[] = $bandwidth / 1e6;  // Bandbreite in Mbit/s (Umrechnung von Bits auf Mbit)
 +    $jitterData[] = $jitter;            // Jitter in ms
 +    $sentPacketsData[] = $sent_packets; // gesendete Pakete
 +    $receivedPacketsData[] = $received_packets; // empfangene Pakete
 +    $clientIPs[] = $client_ip;
 +    $serverIPs[] = $server_ip;
 +}
 +?>
 +
 +<!DOCTYPE html>
 +<html lang="de">
 +<head>
 +    <meta charset="UTF-8">
 +    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 +    <title>Netzwerkmessung Standort <?php echo $folderName; ?></title>
 +    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
 +    <script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels"></script> <!-- Für das Anzeigen der Werte -->
 +    <style>
 +        body {
 +            font-family: Arial, sans-serif;
 +            margin: 0;
 +            padding: 20px;
 +            display: flex;
 +            flex-direction: column;
 +            align-items: center;
 +        }
 +
 +        h1, h2 {
 +            text-align: center;
 +        }
 +
 +        .charts-container {
 +            display: flex;
 +            justify-content: space-around;
 +            flex-wrap: wrap;
 +            gap: 20px;
 +        }
 +
 +        .chart-container {
 +            width: 45%; /* Jedes Diagramm nimmt 45% der Breite ein */
 +            min-width: 300px; /* Mindestbreite für jedes Diagramm */
 +        }
 +
 +        canvas {
 +            width: 100% !important;
 +            height: auto !important;
 +        }
 +
 +        @media (max-width: 768px) {
 +            .chart-container {
 +                width: 100%; /* Auf kleineren Bildschirmen jedes Diagramm auf 100% der Breite setzen */
 +            }
 +        }
 +
 +        table {
 +            width: 100%;
 +            border-collapse: collapse;
 +            margin-top: 20px;
 +            text-align: center;
 +        }
 +
 +        table, th, td {
 +            border: 1px solid #ddd;
 +        }
 +
 +        th, td {
 +            padding: 8px;
 +        }
 +
 +        th {
 +            background-color: #f2f2f2;
 +        }
 +    </style>
 +</head>
 +<body>
 +    <h1>Netzwerkmessung Standort <?php echo $folderName; ?></h1>
 +
 +    <h2>Diagramme der Ergebnisse:</h2>
 +
 +    <div class="charts-container">
 +        <!-- Diagramm für Bandbreite -->
 +        <div class="chart-container">
 +            <h3>Bandbreite (Mbit/s)</h3>
 +            <canvas id="bandwidth-chart" width="400" height="200"></canvas>
 +        </div>
 +
 +        <!-- Diagramm für Jitter -->
 +        <div class="chart-container">
 +            <h3>Jitter (ms)</h3>
 +            <canvas id="jitter-chart" width="400" height="200"></canvas>
 +        </div>
 +
 +        <!-- Diagramm für gesendete und empfangene Pakete -->
 +        <div class="chart-container">
 +            <h3>Gesendete und Empfangene Pakete</h3>
 +            <canvas id="packets-chart" width="400" height="200"></canvas>
 +        </div>
 +    </div>
 +
 +    <!-- Tabelle mit den Werten -->
 +    <h2>Zusammenfassung der Messwerte:</h2>
 +    <table>
 +        <thead>
 +            <tr>
 +                <th>Datei</th>
 +                <th>Client IP</th>
 +                <th>Server IP</th>
 +                <th>Bandbreite (Mbit/s)</th>
 +                <th>Jitter (ms)</th>
 +                <th>Gesendete Pakete</th>
 +                <th>Empfangene Pakete</th>
 +            </tr>
 +        </thead>
 +        <tbody>
 +            <?php for ($i = 0; $i < count($fileNames); $i++): ?>
 +                <tr>
 +                    <td><?php echo $fileNames[$i]; ?></td>
 +                    <td><?php echo $clientIPs[$i]; ?></td>
 +                    <td><?php echo $serverIPs[$i]; ?></td>
 +                    <td><?php echo number_format($bandwidthData[$i], 2); ?></td>
 +                    <td><?php echo number_format($jitterData[$i], 2); ?></td>
 +                    <td><?php echo $sentPacketsData[$i]; ?></td>
 +                    <td><?php echo $receivedPacketsData[$i]; ?></td>
 +                </tr>
 +            <?php endfor; ?>
 +        </tbody>
 +    </table>
 +
 +    <script>
 +        // Bandbreiten-Diagramm
 +        var ctx1 = document.getElementById('bandwidth-chart').getContext('2d');
 +        var bandwidthChart = new Chart(ctx1, {
 +            type: 'bar',
 +            data: {
 +                labels: <?php echo json_encode($fileNames); ?>,  // Dateinamen als Labels
 +                datasets: [{
 +                    label: 'Bandbreite (Mbit/s)',
 +                    data: <?php echo json_encode($bandwidthData); ?>,
 +                    backgroundColor: 'rgba(54, 162, 235, 0.2)',
 +                    borderColor: 'rgba(54, 162, 235, 1)',
 +                    borderWidth: 1
 +                }]
 +            },
 +            options: {
 +                responsive: true,
 +                scales: {
 +                    y: {
 +                        beginAtZero: true
 +                    }
 +                },
 +                plugins: {
 +                    datalabels: {
 +                        display: true, // Werte werden immer angezeigt
 +                        align: 'center', // Position des Textes innerhalb des Balkens
 +                        anchor: 'center', // Ankerpunkt innerhalb des Balkens
 +                        font: {
 +                            weight: 'bold',
 +                            size: 12
 +                        },
 +                        color: '#000',  // Textfarbe
 +                        formatter: function(value) {
 +                            return value.toFixed(2);  // Anzeige der Werte als feste Dezimalstellen
 +                        }
 +                    }
 +                }
 +            }
 +        });
 +
 +        // Jitter-Diagramm
 +        var ctx2 = document.getElementById('jitter-chart').getContext('2d');
 +        var jitterChart = new Chart(ctx2, {
 +            type: 'bar',
 +            data: {
 +                labels: <?php echo json_encode($fileNames); ?>,  // Dateinamen als Labels
 +                datasets: [{
 +                    label: 'Jitter (ms)',
 +                    data: <?php echo json_encode($jitterData); ?>,
 +                    backgroundColor: 'rgba(255, 159, 64, 0.2)',
 +                    borderColor: 'rgba(255, 159, 64, 1)',
 +                    borderWidth: 1
 +                }]
 +            },
 +            options: {
 +                responsive: true,
 +                scales: {
 +                    y: {
 +                        beginAtZero: true
 +                    }
 +                },
 +                plugins: {
 +                    datalabels: {
 +                        display: true, // Werte werden immer angezeigt
 +                        align: 'center', // Position des Textes innerhalb des Balkens
 +                        anchor: 'center', // Ankerpunkt innerhalb des Balkens
 +                        font: {
 +                            weight: 'bold',
 +                            size: 12
 +                        },
 +                        color: '#000',  // Textfarbe
 +                        formatter: function(value) {
 +                            return value.toFixed(2);  // Anzeige der Werte als feste Dezimalstellen
 +                        }
 +                    }
 +                }
 +            }
 +        });
 +
 +        // Gesendete/Empfangene Pakete-Diagramm
 +        var ctx3 = document.getElementById('packets-chart').getContext('2d');
 +        var packetsChart = new Chart(ctx3, {
 +            type: 'bar',
 +            data: {
 +                labels: <?php echo json_encode($fileNames); ?>,  // Dateinamen als Labels
 +                datasets: [
 +                    {
 +                        label: 'Gesendete Pakete',
 +                        data: <?php echo json_encode($sentPacketsData); ?>,
 +                        backgroundColor: 'rgba(75, 192, 192, 0.2)',
 +                        borderColor: 'rgba(75, 192, 192, 1)',
 +                        borderWidth: 1
 +                    },
 +                    {
 +                        label: 'Empfangene Pakete',
 +                        data: <?php echo json_encode($receivedPacketsData); ?>,
 +                        backgroundColor: 'rgba(153, 102, 255, 0.2)',
 +                        borderColor: 'rgba(153, 102, 255, 1)',
 +                        borderWidth: 1
 +                    }
 +                ]
 +            },
 +            options: {
 +                responsive: true,
 +                scales: {
 +                    y: {
 +                        beginAtZero: true
 +                    }
 +                },
 +                plugins: {
 +                    datalabels: {
 +                        display: true, // Werte werden immer angezeigt
 +                        align: 'center', // Position des Textes innerhalb des Balkens
 +                        anchor: 'center', // Ankerpunkt innerhalb des Balkens
 +                        font: {
 +                            weight: 'bold',
 +                            size: 12
 +                        },
 +                        color: '#000',  // Textfarbe
 +                        formatter: function(value) {
 +                            return value;  // Zeigt den Wert direkt an
 +                        }
 +                    }
 +                }
 +            }
 +        });
 +    </script>
 +
 +</body>
 +</html>
 +</code>