Übersicht lokales Netzwerk

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Übersicht lokales Netzwerk

    Hallo Leute, im Rahmen meines Lehramt Referendariats bin ich an einer Schule im Computerraum eingesetzt. Ich möchte den Schülern Linux (Ubuntu) und die Grundlagen von Html und PHP beibringen. Leider ist mein Kenntnisstand in PHP derzeit ebenfalls nur Grundwissen (aber ich arbeite daran). Um die 15 Computer hierbei besser (Netzwerkerreichbarkeit und Webserverstatus) Überwachen zu können. Es geht dabei nicht darum die Schüler zu überwachen, sondern nur die Erreichbarkeit (Ping + http Status) um die Wartung weiter zu minimieren.

    Dazu mein Plan:

    • Shellscript, was alle 15 Minuten (cronjob) alle 15 Computer anpingt und das "Ergebnis" in eine Textdatei schreibt.
    • Übersichtseite (html/php) auf meinem Computer, der den aktuellen Status wiedergibt.



    Das Shellscript werde ich schon hinbekommen (nehme aber hierbei auch gern Ideen entgegen).


    Ausganslage:

    CompStat.txt (ich dachte an Zahlen untereinander 1 = ok | 0 = nicht erreichbar). Die Computer haben die IP-Adresse: 192.168.1.10/25

    Code:
    1
    0
    1
    1
    etc ..
    Mein Script bisher:

    PHP-Code:
    <?php $Comparray file("CompStat.txt"); ?>
    weiter unten in der Tabelle jeweils:

    PHP-Code:
    <td align="center"><img src="img/pc1.png" width="220" height="100" alt=""/><br> 

    Ping: 
    <?php 

    if ($Comparray[0] == 1) { echo '<img src="img/online.png" />'; } else { echo '<img src="img/Offline.png" />'; } ?> 

    Webserver: 
    <?php 

    $url 
    "http://192.168.1.10"$online = @fsockopen ("$url"80); if (!$online) { echo '<img src="img/online.png" />'; } else { echo '<img src="img/Offline.png" />'; }; @fclose($online); 
    ?> 
    </td>
    Und dann erneut das selbe (eben 15 x). Gibt es da einen eleganteren Weg die Textdatei auszulesen und es auszugeben. Darüber hinaus scheint der "Webservercheck" nur ein mal die weiteren IP'S werden auch wenn diese Offline sind als Online angezeigt. Ich hoffe Ihr könnt mir hierbei weiterhelfen.

    Gruß & Danke!
    Iv0ry

  • #2
    PHP-Code:
    <?php

    function getData($file$prefix$startIp)
    {
        
    $ret = array();

        
    $data file($fileFILE_IGNORE_NEW_LINES);

        
    $cnt count($data);
        for (
    $i 0$i $cnt$i++) {
            
    $ip $prefix . ($startIp $i);

            
    $ping = ($data[$i] === '1');

            
    $http false;
            if (
    $ping) { // Wenn es nicht auf ping antwortet, wird es wohl aus sein
                
    $errno 0;
                
    $errstr '';
                
    $fp = @fsockopen($ip80$errno$errstr1);
                if (
    false !== $fp) {
                    
    $http true;
                    
    fclose($fp);
                }
            }

            
    $ret[] = array(
                
    'ip'   => $ip,
                
    'ping' => $ping,
                
    'http' => $http
            
    );
        }

        return 
    $ret;
    }



    // Nur für Testzwecke. Lokal einfach: $file = 'CompStat.txt';
    $content ''; for ($i 0$i 15$i++) { $content .= mt_rand(01) . "\n"; }
    $file    'data://text/plain;base64,' base64_encode($content);

    $prefix  '192.168.1.';
    $startIp 10;

    $data getData($file$prefix$startIp);

    // Hier beliebig formatiert ausgeben

    var_dump($data);
    Die Ausgabe sollte aber prinzipiell auch ohne Zwischenspeichern der Ping-Resultate und sehr viel schneller ermittelt werden können.

    - PHP: curl_multi_exec - Manual

    Kommentar


    • #3
      Hallo Mermshaus,

      danke für Deine Mühe!


      Ich muss gestehen, dass ich leider nur die Hälfte vom Script bzw. der Funktion verstanden habe. Aber ich arbeite daran.


      gibt aus:
      (grün = stimmt | rot = nicht korrekt)

      Code:
      [COLOR=DarkRed]{ [0]=> array(3) { ["ip"]=> string(11) "192.168.1.1" ["ping"]=> bool(false) ["http"]=> bool(false) [/COLOR]
      [COLOR=Green]} [1]=> array(3) { ["ip"]=> string(11) "192.168.1.2" ["ping"]=> bool(false) ["http"]=> bool(false) [/COLOR]
      [COLOR=Green]} [2]=> array(3) { ["ip"]=> string(11) "192.168.1.3" ["ping"]=> bool(false) ["http"]=> bool(false) [/COLOR]
      [COLOR=Green]} [3]=> array(3) { ["ip"]=> string(11) "192.168.1.4" ["ping"]=> bool(true) ["http"]=> bool(true) [/COLOR]
      [COLOR=Green]} [4]=> array(3) { ["ip"]=> string(11) "192.168.1.5" ["ping"]=> bool(true) ["http"]=> bool(true) [/COLOR]
      [COLOR=Green]} [5]=> array(3) { ["ip"]=> string(11) "192.168.1.6" ["ping"]=> bool(false) ["http"]=> bool(false) [/COLOR]
      [COLOR=Green]} [6]=> array(3) { ["ip"]=> string(11) "192.168.1.7" ["ping"]=> bool(false) ["http"]=> bool(false) [/COLOR]
      [COLOR=DarkRed]} [7]=> array(3) { ["ip"]=> string(11) "192.168.1.8" ["ping"]=> bool(true) ["http"]=> bool(false)[/COLOR] 
      [COLOR=Green]} [8]=> array(3) { ["ip"]=> string(11) "192.168.1.9" ["ping"]=> bool(false) ["http"]=> bool(false) [/COLOR]
      [COLOR=DarkRed]} [9]=> array(3) { ["ip"]=> string(12) "192.168.1.10" ["ping"]=> bool(false) ["http"]=> bool(false) [/COLOR]
      [COLOR=Green]} [10]=> array(3) { ["ip"]=> string(12) "192.168.1.11" ["ping"]=> bool(true) ["http"]=> bool(true) [/COLOR]
      [COLOR=Green]} [11]=> array(3) { ["ip"]=> string(12) "192.168.1.12" ["ping"]=> bool(false) ["http"]=> bool(false)[/COLOR] 
      [COLOR=DarkRed]} [12]=> array(3) { ["ip"]=> string(12) "192.168.1.13" ["ping"]=> bool(true) ["http"]=> bool(false) [/COLOR]
      [COLOR=DarkRed]} [13]=> array(3) { ["ip"]=> string(12) "192.168.1.14" ["ping"]=> bool(true) ["http"]=> bool(false) [/COLOR]
      [COLOR=DarkGreen]} [14]=> array(3) { ["ip"]=> string(12) "192.168.1.15" ["ping"]=> bool(false) ["http"]=> bool(false)[/COLOR]
      Wenn ich die Seite mittels 'F5' (Refresh) neu lade, verändern sich die Werte jedes mal. Irgendwie läuft da
      aber etwas falsch (namp zu dem Zeitpunkt)? Mit Multidimensional Arrays habe ich bisher leider noch nicht
      gearbeitet. 'var_dump($data);' war ja die Ausgabe der dump. Ich dachte die 1 Sek Timeout sind das Problem
      und habe mit 3, 8 und 15 Sekunden aber leider die selben seltsamen Ergebnisse erhalten.

      [COLOR=#000000][COLOR=#006600][COLOR=Black]Gruß
      Iv0ry
      [/COLOR][/COLOR][/COLOR]
      Zuletzt geändert von Iv0ry; 04.03.2016, 00:51.

      Kommentar


      • #4
        Wenn ich die Seite mittels 'F5' (Refresh) neu lade, verändern sich die Werte jedes mal.
        Ich erzeuge in dem Script zufällige Testdaten für den Inhalt der „Ping“-Datei, damit der Beispielcode auch lauffähig ist, ohne eine solche Datei erstellen zu müssen. Das ist aber eben nur für das Beispiel.

        Ersetze in deinem Fall einfach…

        PHP-Code:
        $content ''; for ($i 0$i 15$i++) { $content .= mt_rand(01) . "\n"; }
        $file    'data://text/plain;base64,' base64_encode($content); 
        …durch deine Datei. Zum Beispiel:

        PHP-Code:
        $file 'CompStat.txt'


        Ansonsten ist es für mich schwierig, ohne größere Umstände mehr zu weiteren Verbesserungen zu sagen. Das fängt schon damit an, dass du vermutlich Windows nutzt. (?)

        Kommentar


        • #5
          Danke Mermshaus für Deine Rückmeldung!

          Zitat von mermshaus Beitrag anzeigen
          Ansonsten ist es für mich schwierig, ohne größere Umstände mehr zu weiteren Verbesserungen zu sagen. Das fängt
          schon damit an, dass du vermutlich Windows nutzt. (?)
          Nein, wie im ersten Post beschrieben, laufen alle Computer unter Ubuntu (Server 14.04 LTS mit Apache2, MySQL und
          PHP 5). Und ich habe mir schon den Kopf zerbrochen, wofür du [COLOR=#000000][COLOR=#0000CC]'mt_rand' [COLOR=Black]([/COLOR][/COLOR][/COLOR]Zufallszahlengenerator) verwendet hast und
          bin einfach nicht dahinter gekommen, dass es zum Füttern der Werte für das Beispiel Script genutzt hast. Das macht
          dann natürlich Sinn.

          Okay, mit Angabe der Textdatei ($file = 'CompStat.txt' sind die Werte nun (fast) korrekt. Fast, weil dass Script
          geht ja davon aus, dass wenn ein Computer auf einen Ping nicht reagiert, auch der Webserver nicht aktiv ist, sofern
          ich Folgendes korrekt verstanden habe:

          PHP-Code:
          $ping = ($data[$i] === '1');
          $http false
          Es ist ja durchaus möglich, dass ein Computer nicht auf einen Ping reagiert (Timeout im Script oder mit den Iptables
          rumgespielt) aber das der Webserver dennoch erreichbar ist. Obwohl es vermutlich Sinn macht, keine Zeit (Scriptlaufzeit)
          zu investieren, wenn ein Gerät schon nicht auf einen Ping reagiert. Die Funktion greift also auf meine Textdatei für die
          Ping-Werte (vom Shellscript) für die Ausgabe zu, das ist schon mal sehr gut! Die Frage wäre noch, wie kann ich die
          Ausgabe gestalten, also wie greife ich auf die einzelnen Werte des Arrays zu, um diese bspw. mit meinen beiden
          Bildern (up/down) auszugeben?

          Ich hatte es mittels "echo $data[3][ip];" versucht, was auch korrekt die IP-Adresse ausgibt. Jedoch mit
          "echo $data[3][ping];" kommt keine Ausgabe.


          EDIT:

          Ist es dann nicht schneller (einfach) die IP-Adresse(n) direkt anzusprechen(?)
          Ist nur eben nicht sehr elegant.

          Beispiel für einen Computer:

          PHP-Code:
          $fp fsockopen("192.168.1.4",80,$errno,$errstr,2);
          if(!
          $fp
          { echo 
          '<img src="img/Offline.png" />';
          } else 
          { echo 
          '<img src="img/online.png" />'
          }

          if (
          $Comparray[4] == 1
          { echo 
          '<img src="img/online.png" />'
          } else { 
          echo 
          '<img src="img/Offline.png" />'; } 
          Gruß
          Iv0ry
          Zuletzt geändert von Iv0ry; 04.03.2016, 01:02.

          Kommentar


          • #6
            Habe noch mal was mit nmap gebastelt:

            PHP-Code:
            <?php

            function getOnlineHosts($range)
            {
                
            $cmd 'nmap -sn -n -oX - ' $range;

                
            $data shell_exec($cmd);

                
            $doc = new DOMDocument('1.0''UTF-8');
                
            $doc->loadXML($data);

                
            $xpath = new DOMXPath($doc);

                
            $hosts = array();

                foreach (
            $xpath->query('/nmaprun/host[status[@state="up"]]/address/@addr') as $attr) {
                    
            $hosts[] = $attr->value;
                }

                return 
            $hosts;
            }

            function 
            getOnlineHostsWithOpenPort($range$port)
            {
                
            $cmd 'nmap -p ' $port ' -n -oX - --open ' $range;

                
            $data shell_exec($cmd);

                
            $doc = new DOMDocument('1.0''UTF-8');
                
            $doc->loadXML($data);

                
            $xpath = new DOMXPath($doc);

                
            $hosts = array();

                foreach (
            $xpath->query('/nmaprun/host/address/@addr') as $attr) {
                    
            $hosts[] = $attr->value;
                }

                return 
            $hosts;
            }

            $rangePing '192.168.178.0-50';
            $hostsPing getOnlineHosts($rangePing);

            $rangeHttp implode(' '$hostsPing);
            $hostsHttp getOnlineHostsWithOpenPort($rangeHttp80);

            $s '<table>' "\n";

            for (
            $n 0$n <= 50$n++) {
                
            $host '192.168.178.' $n;
                
            $s .= '  <tr>' "\n";
                
            $s .= '    <td>' $host '</td>' "\n";
                
            $s .= '    <td>' . ((in_array($host$hostsPingtrue)) ? 'online' '-') . '</td>' "\n";
                
            $s .= '    <td>' . ((in_array($host$hostsHttptrue)) ? 'online' '-') . '</td>' "\n";
                
            $s .= '  </tr>' "\n";
            }

            $s .= '</table>' "\n";

            echo 
            $s;
            Läuft bei mir lokal in etwa 2 Sekunden.

            Was „reagiert nicht auf Ping, aber hat Webserver“ angeht:

            PHP-Code:
            $range '192.168.178.0-50';

            $hostsPing getOnlineHosts($range);
            $hostsHttp getOnlineHostsWithOpenPort($range80); 
            Läuft bei mir auch noch schnell genug. Aber keine Ahnung, was in deinem Kontext der Usecase dazu sein soll. HTTP-Server kann man sicher genauso verstecken (oder auf einen anderen Port legen), wenn man will. Wenn du von derlei Manipulationen ausgehst, kannst du es mit der Übersicht vermutlich gleich lassen.



            PS: Vermutlich kriegt man die Daten insgesamt auch irgendwie vom Router(?). Netzwerkadministration ist nicht so wirklich mein Gebiet.
            Zuletzt geändert von mermshaus; 06.03.2016, 00:26.

            Kommentar


            • #7
              Wow, danke für Deine erneute Mühe.



              Ja, das Script läuft sehr gut (Danke!!). Die einzige Frage, die ich übrig habe ist, wie ich diese Auslesen/Ausgeben kann. Bei Deinem ersten Script habe ich die Ausgabe dann noch hinbekommen, es war ja (hoffe das war richtig?):

              PHP-Code:
              echo $data[0][ip];
              if (
              $data[0][ping] == true) { echo '<img src="img/1.png" />'; } else { echo '<img src="img/0.png" />'; }
              if (
              $data[0][http] == true) { echo '<img src="img/1.png" />'; } else { echo '<img src="img/0.png" />'; } 
              Wie komme ich nun an die Daten im neuen Script? Mit einem Ähnlichen Syntax habe ich es leider nicht geschafft. Zumal das Script ja nur die Werte im Array zurück liefert, die auch erreichbar waren ("hostsPing" sowie "hostsHttp"). Wie kann ich nun die darstellen bzw. abfragen, die nicht erreichbar waren?

              Ich hatte es folgendermaßen probiert:

              PHP-Code:
              if ($hostsPing[0][hostsPing] == true) { echo '<img src="img/1.png" />'; } else { echo '<img src="img/0.png" />'; }
              if (
              $hostsHttp[0][hostsHttp] == true) { echo '<img src="img/1.png" />'; } else { echo '<img src="img/0.png" />'; } 
              Funktioniert soweit auch, zwei Frage bleiben in meinem Kopf noch offen, in welcher Variable steckt dann die eigentliche IP-Adresse für die Ausgabe ("$hosts" war es nicht) und wie kann ich die Computer darstellen, die nicht erreichbar sind? Denn im Array finde ich ja nur die, die auch erreichbar waren, oder?

              Meine Tabelle für die Auswertung (noch ohne PHP) sieht folgendermaßen aus (gekürzt auf 5 Computer). Hinter "Ping:" und "Webserver:" wollte ich dann jeweils die kleine Ausgabe packen (wie im Code hier drüber zu sehne ist). Oder ist dies erneut ein Denkfehler meinerseits?

              Code:
              <!DOCTYPE html>
              <html lang="de">
                  <head>
                      <meta charset="utf-8">
                      <title>.:ComputerTEST:.</title>
                      <link rel="shortcut icon" href="favicon.ico">
                      <link rel="stylesheet" href="computer.css">
              </head>
                  <body>
              <table width="80%" border="1" align="center">
                                    <tbody>
                                      <tr>
                                        <td align="center"><h5><img src="img/pc1.png" width="220" height="100" alt=""/><br>
                                        Ping:  Webserver:
                                         </h5></td>
                                        <td align="center"><h5><img src="img/pc2.png" width="220" height="100" alt=""/><br>
                                        Ping:  Webserver:
                                         </h5></td>
                                        <td align="center"><h5><img src="img/pc3.png" width="220" height="100" alt=""/><br>
                                        Ping:  Webserver:
                                         </h5></td>
                                        <td align="center"><h5><img src="img/pc4.png" width="220" height="100" alt=""/><br>
                                        Ping:  Webserver:
                                         </h5></td>
                                        <td align="center"><h5><img src="img/pc5.png" width="220" height="100" alt=""/><br>
                                        Ping:  Webserver:
                                         </h5></td>
                                      </tr>
                       </tbody>
                      </table>
                  </body>
              </html>

              Gruß
              Iv0ry

              Kommentar


              • #8
                Irgendwie verstehe ich das Problem nicht. Mein Code enthält doch sogar eine Ausgabe. Die müsstest du lediglich so formatieren/verändern, wie du möchtest.

                Die Computer, die offline sind, sind die, die nicht online sind. Wenn du eine feste IP-Range hast, sind die exakt definiert, wenn du weißt, welche online sind.

                Kommentar

                Lädt...
                X