Graphische Auswertung fuer Mosshe

From NJH-Wiki

Jump to: navigation, search
Autor 
Frank Prößdorf

Voraussetzungen

Diese Howto geht von folgenden Gegebenheiten aus:

  • Folgende Programme sind installiert und lauffähig:
  • Folgende PEAR Bibliotheken sind installiert:
    • Image_Graph
    • Image_Canvas
    • Image_Color
    • Numbers_Roman
    • Numbers_Words

PHP Script

Dieses kleine PHP Script durchforstet die abgelegten Log Dateien und stellt sie je nach Benutzerwunsch auch graphisch dar. Möchte man mehr als ein paar Tage darstellen, sieht es noch recht unreif aus.

<?php

        $pfad = './Logs';

        function auswertung($short)
        {
                $auswertungsart = array(
                        'net_traffic' => 'Netzwerktraffic (MB)',
                        'shells' => 'Shells',
                        'memory' => 'Memory (MB)',
                        'load' => 'Load (%)',
                        'ping' => 'Ping (sec)',
                        'net_errors' => 'Netzwerkfehler',
                        'Failed SSH logins' => 'Fehlgeschlagene SSH Logins',
                        'Other failed logins' => 'Fehlgeschlagene andere Logins',
                        'zombies' => 'Zombies',
                        'processes' => 'Prozesse',
                        '/dev/hda1' => '',
                        '/dev/sda1' => '');

                return $auswertungsart[$short];
        }

        // hole die Daten der Logfiles
        function get_logs($pfad)
        {
                $Logs = array();
                if ($handle = opendir($pfad)) {
                        while (false !== ($file = readdir($handle))) {
                                 if ($file != '.' && $file != '..' && strstr($file, '-')) {
                                        $file_array = explode('.', $file);
                                        $Logs[] = $file_array[0];
                                }
                        }

                        closedir($handle);
                }
                rsort($Logs);

                return $Logs;
        }

        // setze das vonbis array aus den beiden Daten zusammen
        function vonbis($von, $bis, $pfad) {
                $von_ts = strtotime($von);
                $bis_ts = strtotime($bis);
                if (($von_ts < $bis_ts) && ($bis_ts != NULL)) {
                        for ($i = $von_ts; $i <= $bis_ts; $i += 86400) {
                                $datum = date('Y-m-d', $i);
                                $filename = $pfad.'/'.$datum.'.log';
                                if (file_exists($filename)) {
                                        $vonbis[] = date('Y-m-d', $i);
                                }
                        }
                } else {
                        $vonbis[0] = $von;
                }

                return $vonbis;
        }

        // wandle ein englisches in ein deutsches datum um
        function date2datum($date)
        {
                $date_array = explode('-', $date);

                return $date_array[2].'.'.$date_array[1].'.'.$date_array[0];
        }

        // setze den Rechnernamen
        if (isset($_POST["rechner"])) {
                $rechner_name = $_POST["rechner"];
        } else {
                $rechner_name = 'server01';
        }

        // setze die Auswertungsart
        if (isset($_POST["auswertung"])) {
                $auswertung = $_POST["auswertung"];
        } else {
                $auswertung = 'net_traffic';
        }

        // setze das Datumsarray
        if (isset($_POST["von"])) {
                $vonbis = vonbis($_POST["von"], $_POST["bis"], $pfad);
        } else {
                $vonbis = false;
        }

        // Initialisiere den Graphen
        require_once 'Image/Graph.php';

        $Graph =& Image_Graph::factory('graph', array(600, 300));

        $fnt =& $Graph->addNew('font', 'berylium');
        $fnt->setSize(10);
        $Graph->setFont($fnt);

        if (count($vonbis) > 1) {
                $graph_title = date2datum($_POST["von"]).' - '.date2datum($_POST["bis"]);
        } else {
                $graph_title = date2datum($_POST["von"]);
        }

        $Graph->add(
                Image_Graph::vertical(
                    Image_Graph::factory('title', array($graph_title, 12)),
                    Image_Graph::vertical(
                        $Plotarea = Image_Graph::factory('plotarea'),
                        $Legend = Image_Graph::factory('legend'),
                        85
                    ),
                    7
                )
        );
        $Legend->setPlotarea($Plotarea);

        $Dataset =& Image_Graph::factory('dataset');
        $Logs = get_logs($pfad);
        $Server = array();

        if ($vonbis) {
                foreach ($vonbis as $datum) {
                        $file = $pfad.'/'.$datum.'.log';
                        $data_in_file = file($file);

                        foreach ($data_in_file as $line) {
                                $line_data = explode(';', $line);
                                $rechner = $line_data[2];
                                $zeit = strtotime($line_data[1]);

                                if (!in_array($rechner, $Server)) {
                                        $Server[] = $rechner;
                                }

                                if (strstr($line_data[3], $auswertung) && $rechner == $rechner_name) {
                                        $Dataset->addPoint($zeit, $line_data[5]);
                                }
                        }
                        unset($data_in_file);
                }
        }
        sort($Server);

        $Plot =& $Plotarea->addNew('Image_Graph_Plot_Smoothed_Area', $Dataset);
        $Plot->setTitle($rechner_name);

        $color =& Image_Graph::factory('Image_Graph_Fill_Array');
        $color->addColor('gold@0.2');

        $AxisX =& $Plotarea->getAxis(IMAGE_GRAPH_AXIS_X);
        $AxisX->setDataPreprocessor(Image_Graph::factory('Image_Graph_DataPreprocessor_Date', 'H'));
        if (count($vonbis) > 1) {
                $AxisX->setLabelInterval(array(01,02,03,04,05,06,07,08,09,10));
                $AxisX->setTitle(count($vonbis).' Tage');
        } else {
                $AxisX->setTitle('Uhrzeit');
        }

        $AxisY =& $Plotarea->getAxis(IMAGE_GRAPH_AXIS_Y);
        $AxisY->setTitle(auswertung($auswertung));
        $AxisY->setFontAngle(90);

        $Plot->setFillColor($color);

        $Graph->done(array('filename' => './graph.png'));
?>

<html>

<head>
        <link href="./graph.css" title="graph" rel="stylesheet" type="text/css" />
</head>

<body>
        <h1>Graphische Auswertung von Statistischen Daten</h1>
        <div id="output">
                <img src="./graph.png" alt="graph" />
        </div>
        <div id="input">
        <form method="post">
                <table>
                <tr>
                        <td>Rechnername:</td>
                        <td><select name="rechner">
                        <?
                                foreach ($Server as $elem) {
                                        if ($elem == $rechner_name) {
                                                echo '  <option selected>'.$elem.'</option>';
                                        } else {
                                                echo '  <option>'.$elem.'</option>';
                                        }
                                }
                        ?>
                        </select></td>
                </tr>
                <tr>
                        <td>Auswertung:</td>
                        <td><select name="auswertung">
                                <option value="shells"><?=auswertung('shells')?></option>
                                <option value="memory"><?=auswertung('memory')?></option>
                                <option value="load"><?=auswertung('load')?></option>
                                <option value="ping"><?=auswertung('ping')?></option>
                                <option value="net_traffic"><?=auswertung('net_traffic')?></option>
                                <option value="net_errors"><?=auswertung('net_errors')?></option>
                                <option value="Failed SSH logins"><?=auswertung('Failed SSH logins')?></option>
                                <option value="Other failed logins"><?=auswertung('Other failed logins')?></option>
                                <option value="zombies"><?=auswertung('zombies')?></option>
                                <option value="processes"><?=auswertung('processes')?></option>
                                <!--<option value="/dev/hda1"></option>
                                <option value="/dev/sda1"></option>-->
                        </select></td>
                </tr>
                <tr>
                        <td>Von:</td>
                        <td><select name="von">
                        <?
                                foreach ($Logs as $elem) {
                                        if ($elem == $_POST["von"]) {
                                                echo '  <option value="'.$elem.'" selected>'.date2datum($elem).'</option>';
                                        } else {
                                                echo '  <option value="'.$elem.'">'.date2datum($elem).'</option>';
                                        }
                                }
                        ?>
                        </select></td>
                </tr>
                <tr>
                        <td>Bis:</td>
                        <td><select name="bis">
                        <?
                                foreach ($Logs as $elem) {
                                        if ($elem == $_POST["bis"]) {
                                                echo '  <option value="'.$elem.'" selected>'.date2datum($elem).'</option>';
                                        } else {
                                                echo '  <option value="'.$elem.'">'.date2datum($elem).'</option>';
                                        }
                                }
                        ?>
                        </select></td>
                </tr>
                <tr>
                        <td> </td>
                        <td><input type="submit" value="Erstelle Graphen"></td>
                </tr>
                </table>
                <p> </p>
                (Sollten beim ersten Aufruf keine Rechner zur Auswahl<br />
                stehen, dann bitte Script ohne Auswahl starten.)
        </form>
        </div>
</body>

</html>
Personal tools