[Tutorial] Monitoring mit MRTG + RRD Support auf Raspberry Pi (Debian Wheezy)

Hallo zusammen!

Wie der Name schon verrät möchte ich heute ein kleines Tutorial zum Thema MRTG mit RRD Support auf dem Raspberry Pi schreiben.

Nachdem mich das Thema Monitoring schon immer interessiert hat, und ich u.a. MRTG+RRD auf meinem Windows 7 x64 System zum laufen bekommen habe, habe ich nun endlich die perfekte Lösung für Monitoring Rund um die Uhr 24x7x365.

Sie heißt: Raspberry Pi!

Ein kleiner Linux Rechner mit 700MHz ARM Kern (Broadcom BCM2835) und 256MB Ram.

Der kleine Pi ist mit 35$ sagenhaft günstig und bietet alles was man sich wünscht – von HDMI Anschluss und HD Wiedergabe über USB und LAN bis hin zu GPIO Pins ist alles an Bord, und das bei einem max. Stromverbrauch von 3,5Watt die Stunde! Ein einfaches Handy-Ladegerät mit MicroUSB und mind. 1A Leistung reicht aus um den Winzling zu betreiben. Weitere Infos gibt es HIER.

Los gehts!

Nachdem mein MRTG Monitoring unter Windows 7 x64 doch eine recht schwere Geburt war, ging das ganze unter Debian Wheezy um einiges einfacher und schneller!

Zuerst aktualisieren wir die Paketquellen mit „aptitude“ oder „apt-get“, je nach Vorliebe. Allerdings sollte man dauerhaft das gleiche nutzen, da sonst die Paketverwaltung aus dem Tritt kommen kann.
sudo aptitude update

Falls Apache2 oder alternativ Lighttpd oder ein andere Webserver schon installiert ist, machen wir sofort mit den fehlenden MRTG und RRD Paketen weiter, wenn nicht dann installieren wir zuerst einmal Lighttpd mit den benötigten Paketen nach der Anleitung unter Punkt 11 von diesem [Tutorial] Raspberry Pi sauber installieren/aufsetzen.

Danach kommen die benötigten Pakete für MRTG und RRD.
sudo aptitude install mrtg mrtg-rrd rrdtool snmp snmpd

Bei der Abfrage, ob root der Eigentümer der Datei /etc/mrtg.cfg sein soll, wählen wir NEIN.

Nachdem wir nun alle benötigten Pakete beisammen haben, geht es mit der Konfiguration weiter.
Zuerst erstellen wir ein neues Verzeichnis im öffentlichen WWW Ordner, in dem später die RRD Datenbanken und die netten PNG Grafiken erzeugt werden.
sudo mkdir -p /var/www/mrtg

Nun erstellen wir das cgi-bin Verzeichnis, welches unter Lighttpd direkt im WWW Ordner liegt und erstellen einen Symlink zur mrtg-rrd.cgi mit der später die HTML Seite generiert wird.
sudo mkdir -p /var/www/cgi-bin
sudo ln -s /usr/lib/cgi-bin/mrtg-rrd.cgi /var/www/cgi-bin/mrtg-rrd.cgi

Da der Lighttpd Benutzer (und die Gruppe) noch keine Schreibrechte für alle Ordner und Dateien besitzen, ändern wir mit „chown“ die Berechtigungen.
sudo chown -R www-data:www-data /var/www/*

Und weil es noch ein Problem mit der SNMP_Session.pm gibt, müssen wir diese patchen:
sudo sed -i 's|import Socket6;|Socket6->import(qw(inet_pton getaddrinfo));|' /usr/share/perl5/SNMP_Session.pm

Mit diesem Befehl ersetzen wir in der Datei /usr/share/perl5/SNMP_Session.pmimport Socket6;“ durch „Socket6->import(qw(inet_pton getaddrinfo));„.

Damit wir unseren Raspberry monitoren können, müssen wir zuerst SNMP Zugriff für localhost erlauben. Dazu öffnen wir die Datei /etc/snmp/snmpd.conf und entfernen das ‚#‘ am Anfang von Zeile 49 (rocommunity public localhost). Im Anschluss wird der SNMP Daemon neu gestartet.

[Zur Info] Mit „i“ kommen wir bei vim, dem verwendeten Editor, in den Edit-Modus und mit der Taste [ESCAPE] verlassen wir diesen wieder, mit 2x schnell „d“ auf der Tastatur löschen wir eine Zeile und mit rechtsklick fügen wir kopierten Text ein.
sudo vim /etc/snmp/snmpd.conf
:49
[i]
[Entf]
[ESC]
[:wq]
sudo service snmpd restart

Jetzt wird es Zeit eine neue mrtg.cfg zu erstellen. Zuerst erstellen wir zur Sicherheit ein Backup der original Datei.
sudo mv /etc/mrtg.cfg /etc/mrtg.cfg.bak

Danach erstellen wir eine neue mrtg.cfg indem wir den cfgmaker benutzen und eine Configdatei für unseren Raspberry erstellen.
sudo cfgmaker --global "Options[_]: growright" --global "IconDir: /mrtg" --global "WriteExpires: Yes" --global "Language: german" --global "RunAsDaemon: yes" --global "EnableIPv6: no" --global "LogFormat: rrdtool" --global "Interval: 1" '--if-filter=$if_admin && $default_iftype' --output /etc/mrtg.cfg public@localhost

Da der Apache User Leseberechtigung für die mrtg.cfg benötigt, ändern wir die Rechte ab und kopieren die MRTG Icons ins WWW Dir.
sudo chmod 644 /etc/mrtg.cfg
sudo cp /usr/share/mrtg/* /var/www/mrtg/

Nun kommt der Test ob alles richtig konfiguriert ist.
sudo mrtg /etc/mrtg.cfg

Erhält man folgende Fehlermeldung:
-----------------------------------------------------------------------
ERROR: Mrtg will most likely not work properly when the environment
variable LANG is set to UTF-8. Please run mrtg in an environment
where this is not the case. Try the following command to start:
env LANG=C /usr/bin/mrtg /etc/mrtg.cfg
-----------------------------------------------------------------------

Bedeutet dies, dass man den UTF-8 Zeichensatz verwendet. Es gibt nun zwei Möglichkeiten, entweder man startet MRTG auf die folgende Weise:
sudo env LANG=C /usr/bin/mrtg /etc/mrtg.cfg

oder man stellt generell von UTF-8 auf de_DE ISO-8859-1 um. Das geht auch relativ einfach:
sudo raspi-config

Nun auf „change locale“ mit den Pfeiltasten navigieren und Enter. Nun wieder mit den Pfeiltasten nach unten gehen und „de_DE ISO-8859-1“ mit der Leertaste auswählen, mit TAB auf OK wechseln und Enter.
Im nächsten Fenster wählen wir nur „de_DE“ aus. Mit TAB wieder auf OK, Enter und fertig. Nun müssen wir kurz warten. Danach noch einmal mit TAB „Finish“ auswählen, Enter und im Anschluss den Raspberry neu starten.
sudo reboot

Je nach SSH-Programm muss nun auch dort das Character Set geändert werden. Bei Putty geht dies unter dem Menüpunkt „Translation„, hier auf „ISO-8859-1: 1998 (Latin-1, West Europe)“ umstellen. Nun werden alle Zeichen wieder richtig dargestellt.

Nach dem Neustart versuchen wir noch einmal den MRTG Daemon zu starten.
sudo mrtg /etc/mrtg

Wenn nun folgende Meldung erscheint habt ihr alles richtig gemacht und MRTG fragt jede Minute den Traffic des Pi ab und das auch nach einem reboot!
Daemonizing MRTG ...

Mit einem Browser könnt ihr nun auch unter http://localhost/cgi-bin/mrtg-rrd.cgi eine schöne grafische Übersicht der Statistiken aufrufen. Von anderen Geräten im Netzwerk muss „localhost“ natürlich durch die IP-Adresse des Raspberry ersetzt werden.

Nun könnt ihr anfangen auch andere Devices zu monitoren! Bei mir geschieht dies z.B. mit zwei Routern, meinem produktiven Pi und einem Temperatursensor. Eurer Fantasie sind so gut wie keine Grenzen gesetzt 😉

Falls dir/euch das Tutorial gefallen oder weiter gebracht hat, würde ich mich über einen kleinen Kommentar freuen – das gleiche gilt natürlich auch für Kritik oder Verbesserungsvorschläge 😀
Natürlich dürft ihr auch gerne euren Adblocker auf Kopfkino deaktivieren und den kleinen Banner am Ende des Posts klicken – ist aber natürlich absolut freiwillig 😉 Die Werbung ist dezent gehalten und es gibt keine nervigen Flashbanner oder ähnliches 🙂 Einnahmen kommen vollständig neuen Projekten zu Gute 😀

Gruß iro

 

[Nachtrag1]

Da mir die Anordnung der Grafiken auf den generierten HTML Seiten mit meiner Auflösung von 1920x1200px nicht sonderlich gefallen haben, hat mir gibbsnich netterweise geholfen die mrtg-rrd.cgi umzuschreiben. Nun gibt es drei Spalten mit Grafiken, und auf der Detailseite gibt es nun noch zusätzlich eine 6 Stunden Übersicht. So sieht man nun zusätzlich u.a. bei meinem Temperatursensor eine schöne 6 Stunden Kurve die um einiges besser lesbar ist als die Tages Grafik. Zusätzlich wurden auch hier Grafiken in 3er Spalten aufgeteilt um übermäßiges Scrollen zu vermeiden. Zu guter Letzt wurden die Grafiken um 25% vergrößert – von 400x100px auf 500x125px. Danke nochmal hier für gibbsnich!

Einen kleinen Eindruck liefern die folgenden Screenshots:

 

Wer gerne die veränderte mrtg-rrd.cgi hätte, findet sie HIER. Nach /var/www/cgi-bin kopieren und die alte überschreiben und am besten vorher noch ein Backup anlegen mit sudo mv /var/www/cgi-bin/mrtg-rrd.cgi /var/www/cgi-bin/mrtg-rrd.cgi.bak Allerdings ist fastCGI aktiviert. Da das bei euch vermutlich nicht der Fall ist, einfach ganz am Ende der Datei den Teil für fastCGI auskommentieren und vor dem CGI Teil die Kommentarzeichen entfernen ‚#‘. Dann läuft meine Version auch ohne dass man fastCGI aktivieren muss.

Falls man fastCGI doch aktivieren möchte, gibt es hier eine (fast fertige) Anleitung 😉

Zuerst muss noch ein Paket nachinstalliert werden, damit auch Perl fast-cgi unterstützt (danke Mario!):
sudo aptitude update
sudo aptitude install libfcgi-perl

Nun sollte Lighttpd ausreichend konfiguriert sein um auch fast-cgi Scripte unter Perl zu unterstützen!

 

[Nachtrag2]

Da ich festgestellt habe, dass MRTG nur unnötig jede Minute sein log mit der Nachricht füllt, dass es bereits läuft, empfehle ich die Datei /etc/cron.d/mrtg zu bearbeiten und den Inhalt in
*/5 * * * * root env LANG=C /usr/bin/mrtg /etc/mrtg.cfg > /dev/null
zu ändern.

Das dürfte die Flashzellen eurer SD etwas entlasten 🙂

 

[Nachtrag3]

Mittlerweile habe ich ein zweites Tutorial zum Thema MRTG und Raspberry Pi geschrieben. Hier gibt es Infos wie man CPU, RAM, Temperatur und einen DS18S20 Temperatur Sensor monitored. Das Tutorial findet ihr HIER!

Und wie man einen DS18S20 Temperatur Sensor anschließt erfahrt ihr hier: DS18S20 Temperatur Sensor an einem Raspberry Pi

 

[Last Edit: 28.10.2013]

Verwendete Schlagwörter: , , , , , , , , , , , , ,

86 Comments on “[Tutorial] Monitoring mit MRTG + RRD Support auf Raspberry Pi (Debian Wheezy)

    • hrhr, ich habs sogar schon 3x gemacht 😉 erster versuch lief irgendwann, dann noch einmal sauber und einmal fürs tutorial 😉
      aber du darfst es gerne mal ausprobieren ob alles so tut wie beschrieben 😀
      sieht zwar viel aus, dürfte aber innerhalb von 15-20mins erledigt sein 🙂
      gruß iro

  1. Perfekt, eine super Anleitung.

    habe aber noch einige Meldungen bekommen:

    beim Starten von mrtg:

    root@raspberrypi:/etc# mrtg /etc/mrtg.cfg
    Subroutine SNMPv1_Session::pack_sockaddr_in6 redefined at /usr/share/perl/5.14/Exporter.pm line 67.
    at /usr/share/perl5/SNMP_Session.pm line 608
    Subroutine SNMPv1_Session::unpack_sockaddr_in6 redefined at /usr/share/perl/5.14/Exporter.pm line 67.
    at /usr/share/perl5/SNMP_Session.pm line 608
    Subroutine SNMPv1_Session::sockaddr_in6 redefined at /usr/share/perl/5.14/Exporter.pm line 67.
    at /usr/share/perl5/SNMP_Session.pm line 608
    Daemonizing MRTG …

    und im Browser dann die Meldung:

    Error: Undefined statistics

    muss mal noch nachschauen, ob ich den Fehler finde…

    Gruß,
    Andi

    • Hey Andi,
      erstmal danke 🙂
      Die Fehlermeldung taucht auf, wenn die SNMP_Session.pm nicht gepatched wurde. Schau am besten nochmal nach ob du wirklich an beiden Stellen „import Socket6;“ durch „Socket6->import(qw(inet_pton getaddrinfo));“ ersetzt hast. Falls es dann immer noch nicht gehen sollte, finden wir bestimmt eine Lösung 😀
      Gruß iro

    • ok, wenn man die Anleitung richtig befolgen würde 😉

      habe die Änderung im File: /usr/share/perl5/SNMP_Session.pm in Zeile 608 vergessen, jetzt startet mrtg ohne Fehler, aber habe im Browser immer noch die Meldung: Error: Undefined statistics

      Gruß,
      Andi

      • Na dann sind wir doch schon mal n Schritt weiter 🙂 Dein Fehler hatte ich auch an irgend einer Stelle… das muss mit den Rechten zu tun haben. Kann es sein, dass deine mrtg.cfg nicht für den www-data user lesbar ist? Versuch nochmal ein „sudo chmod 644 /etc/mrtg.cfg„. MRTG sollte an der Stelle schon sauber laufen und Daten aufzeichen, es liegt also nur noch an der Darstellung 😉
        Gruß iro

  2. nein, die rechte waren es nicht, die hatte ich schon gesetzt.

    ich habe alles nochmal gelöscht dann noch den kompletten Raspi upgedatet, mit apt-get update und apt-get upgrade und nochmal alles nach deiner Anleitung durchgemacht, und dann lief es.
    Vielen Dank,
    Gruß,
    Andi

    • Wunderbar, na dann viel Spaß mit dem weiteren mrtg.cfg basteln 😉 Denke ich werde demnächst auch noch ein kleines Tutorial schreiben wie man CPU, Ram und Temperatur des Raspberrys mit MRTG monitored. Darfst du dann auch gerne ausprobieren 🙂
      Gruß iro

  3. Hello,
    sorry for typing in English
    My problem is in don´t generation graphs and i haven´t index.html
    Can you write me simple guide how do it ?
    If I open mrtg-rrd.cgi in browser i see configuration this .cgi

    Thanks for your answer!
    Lukas

    • Hey Lukas,
      do you mean you can see the textual content of the cgi file in your browser? if yes, then your apache is not configured to run cgi code. which means it is simply not enabled. there should be plenty of tutorials out there how to enable cgi support for apache 🙂 I didn’t explain that in my tutorial either. But try this and tell me if it works so I can update the tutorial:
      sudo a2enmod cgi
      cheers iro

      • Thanks for answer!
        I enable this and now i have problem with internal error 500.
        Internal Server Error

        „The server encountered an internal error or misconfiguration and was unable to complete your request.

        Please contact the server administrator, webmaster@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.

        More information about this error may be available in the server error log.“

        I look to error.log and i find only this.
        „[Thu Nov 08 10:06:16 2012] [error] [client 192.168.1.100] Can’t locate FCGI.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at /usr/lib/cgi-bin/mrtg-rrd.cgi line 1098.
        [Thu Nov 08 10:06:16 2012] [error] [client 192.168.1.100] BEGIN failed–compilation aborted at /usr/lib/cgi-bin/mrtg-rrd.cgi line 1098.
        [Thu Nov 08 10:06:16 2012] [error] [client 192.168.1.100] Premature end of script headers: mrtg-rrd.cgi“

        If i commented line 1098 in mrtg-rrd.cgi, error is this
        „[Thu Nov 08 10:12:06 2012] [error] [client 192.168.1.100] Undefined subroutine &FCGI::Request called at /usr/lib/cgi-bin/mrtg-rrd.cgi line 1101.
        [Thu Nov 08 10:12:06 2012] [error] [client 192.168.1.100] Premature end of script headers: mrtg-rrd.cgi“

        I really don´t know where is problem. It´s my beginning with linux 🙂 and with raspi.

        I´m using your mrtg-rrd.cgi.

        Thanks for your answer!

        • Hey Lukas,
          if you use my mrtg-rrd.cgi you have to enable fastCGI:
          sudo a2enmod fcgid
          the alternative is to edit the mrtg-rrd.cgi. if you scroll to the end of the file, there is the cgi section, which is commented out. remove the hashes ‚#‘ at the beginning of each line and comment out the fastCGI part, as they cannot be active both at the same time.
          give it a try and enjoy your first steps with linux, I know it is hard some times, but keep on trying 😀
          cheers iro

          • Thanks man!
            But next problem 😀

            ERROR: Module fastcgi does not exist!

            I try

            sudo apt-get install fastcgi

            next error: E: Unable to locale package fastcgi

            🙁 🙁

              • sudo a2enmod fastcgi
                still error..

                I tried all your command. Now i can´t using php, hups 🙁
                But, still the same problem ..

                with error.log 🙁
                grrr, hate this problems.

                I think about new installation on second SD card and install first MRTG with all module and after this steps install php, mysql, phpmyadmin etc. 🙂

    • Thx Mario 😀 I supposed it must be a perllib, but didn’t know which one 🙂 I already wrote Lukas an email an he did not reply anymore – guess he has figured it out.
      But anyway, will add this info soon in my tutorial, thx again!
      Cheers iro

    • Hallo Matrix,
      da muss ich heute abend nachschauen wie ich das realisiert habe. Allerdings habe ich den Sensor nicht per 1-Wire angeschlossen, sondern habe ihm 3 Adern spendiert (+, GND, Data) und einen Widerstand eingelötet.
      Gruß iro

  4. Hallo
    bis zum ersten Mal http://localhost/cgi-bin/mrtg-rrd.cgi klapt alles.
    Ich sehe die Netzwerkauslastun und auch die Grafen bis zu einem Jahr.
    Wenn ich aber versuche den Nachtrag1 umzusetzen bekomme ich
    Internal Server Error
    The server encountered an internal error or misconfiguration and was unable to complete your request.

    Hat jemand den selben fehler gehabt und beheben können?
    Ich habe meinen RasPi gerade mit den aktuellsten Versionen installiert.
    Grüße
    Marc

    • Hallo Marc,

      ich denke das liegt an deine Apache2 VirtualHost Konfig.

      Meine (gekürzte) VirtualHost:


      ServerAdmin your@email.com
      ServerName raspberry.pi
      ServerAlias localhost

      DocumentRoot /var/www


      Options Indexes FollowSymLinks MultiViews
      AllowOverride All
      Order allow,deny
      allow from all

      ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

      AllowOverride None
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
      Order allow,deny
      Allow from all



      Options +ExecCGI
      AllowOverride All
      AddHandler fcgid-script .php
      FCGIWrapper /var/www/php-fcgi-scripts/php-fcgi-starter .php
      Order allow,deny
      Allow from all

      ErrorLog ${APACHE_LOG_DIR}/error.log

      # Possible values include: debug, info, notice, warn, error, crit,
      # alert, emerg.
      LogLevel warn

      CustomLog ${APACHE_LOG_DIR}/access.log combined

      Vergleich die bitte mit deiner VirtualHost (die Datei findest du unter /etc/apache2/sites-enabled). Ich denke der fastcgi Teil düfte bei dir fehlen. Falls ja, und es hinterher funktioniert, bitte Bescheid geben, damit ich das Tutorial anpassen kann. Danke! 🙂

      Gruß iro

      • Ich besitze die nur die default Datei
        /etc/apache2/sites-enabled $ sudo nano 000-default
        Nachdem ich die fehlenden Teile eingefügt habe und Apatche durchgestartet bekomme ich die Meldung:
        Syntax error on line 28 of /etc/apache2/sites-enabled/000-default:
        Wrapper /var/www/php-fcgi-scripts/php-fcgi-starter cannot be accessed: (2)No such file or directory
        Action ‚configtest‘ failed.
        Das Verzeichnis /var/www beinhaltet nur das Verzeichnis mrtg

        Muss ich noch etwas installieren?
        Grüße
        Marc

        • Hallo Marc,

          richtig, es fehlt doch noch etwas. Immer wieder faszinierend was man alles geändert hat 😉

          Zuerst den fehlenden Ordner erstellen:
          sudo mkdir /var/www/php-fcgi-scripts

          Dann eine neue Datei namens php-fcgi-starter erstellen
          touch /var/www/php-fcgi-scripts/php-fcgi-starter

          und folgenden Inhalt einfügen

          #!/bin/sh
          PHPRC=/etc/php5/cgi/
          export PHPRC
          export PHP_FCGI_MAX_REQUESTS=5000
          export PHP_FCGI_CHILDREN=8
          exec /usr/lib/cgi-bin/php

          Danach noch die Rechte anpassen
          sudo chmod +x /var/www/php-fcgi-scripts/php-fcgi-starter
          sudo chown -R www-data:www-data /var/www/php-fcgi-scripts

          Jetzt sollte es funktionieren!

          Gruß iro

          • Danke
            Ein kleiner Fehler ist noch da:
            In der Datei mrtg-rrd.cgi ist in der Zeile 1084 ein # vor den Kommentar, dann erscheint das gewünschte auf dem Bildschirm
            Gruß
            Marc

            • Hey Marc,

              das kann eigentlich nicht sein. Entweder Zeile 1079-1093 auskommentieren, und Zeile 1097-1113 einkommentieren, dann wird fastCGI deaktivert und man nutzt CGI. Oder eben umgekehrt, so wie bei mir.
              Einer von beiden Teilen MUSS auskommentiert bleiben.
              Als Workaround einfach den fastCGI auskommentieren und den CGI Teil einkommentieren. Dann sollte es auf jeden Fall laufen 🙂
              Leider habe ich meinen Test-Pi in das Weihnachtsgeschenk für meine Freundin verbaut, deshalb ist testen momentan schwierig und den produktiven Pi möchte ich ehrlich gesagt nicht anrühren 😉 Sobald ich der Sache auf den Grund gehen kann, werde ich auf jeden Fall das Tutorial anpassen. Solange gilt der Workaround ohne fastCGI 😉
              Gruß iro

              @Jan: Danke für die Rückmeldung, immer schön zu sehen wenn die Anleitung hilfreich war 😀

  5. Hi!

    Ich hatte das Ganze vorgestern auch mal ausprobiert und bin nach dem Hinzufügen der Nachträge genau wie Marc an der letzten Hürde gescheitert!

    Und jetzt tickert der Monitor 🙂

    Vielen Dank für die tolle Anleitung!

  6. Hi,
    ich probiere das ganze auch momentan allerdings hänge ich momentan an dieser Stelle und komm nicht weiter…. hast du eine Idee?

    sudo cfgmaker –global „Options[_]: growright“ –global „WorkDir: /var/www/mrtg“ –global „IconDir: /mrtg“ –global „WriteExpires: Yes“ –global „Language: german“ –global „RunAsDaemon: yes“ –global „EnableIPv6: no“ –global „LogFormat: rrdtool“ –global „Interval: 1“ ‚–if-filter=$if_admin && $default_iftype‘ –output /etc/mrtg.cfg public@localhost

    Ergebnis:

    Undefined subroutine &SNMP_Session::pack_sockaddr_in6 called at /usr/share/perl5/SNMP_Session.pm line 150.
    BEGIN failed–compilation aborted at /usr/share/perl5/SNMP_Session.pm line 154.
    Compilation failed in require at /usr/share/perl5/SNMP_util.pm line 44.
    BEGIN failed–compilation aborted at /usr/share/perl5/SNMP_util.pm line 44.
    Compilation failed in require at /usr/share/perl5/MRTG_lib.pm line 24.
    Compilation failed in require at /usr/bin/cfgmaker line 49.
    BEGIN failed–compilation aborted at /usr/bin/cfgmaker line 49.

    • Moin Marc,
      hast du vorher Perl mit dem sed Befehl gepatched? Wenn ich mich richtig erinner, gabs allerdings auch nach dem Patch noch ein paar Perl Fehlermeldungen. Die mrtg.cfg sollte trotzdem erstellt werden und ohne Probleme funktionieren. Einfach mal mrtg starten und testen ob es läuft. Falls nicht müsste mrtg sich mit einer Fehlermeldung verabschieden und dann können wir weiter schauen.
      Gruß iro

      • ———————————————————————–
        ERROR: Mrtg will most likely not work properly when the environment
        variable LANG is set to UTF-8. Please run mrtg in an environment
        where this is not the case. Try the following command to start:
        env LANG=C /usr/bin/mrtg /etc/mrtg.cfg
        ———————————————————————–

        ich habe aber bei meinem Putty bereits auf ISO-8859-1: 1998 (Latin-1, West Europe) gestellt

        • Mit patchen meinte ich den Befehl:
          sed -i 's|import Socket6;|Socket6->import(qw(inet_pton getaddrinfo));|' /usr/share/perl5/SNMP_Session.pm
          Aber wie schon geschrieben, ein paar Fehlermeldungen bleiben wenn ich mich richtig erinnere. Das macht aber nix und beeinflusst auch die erstellte mrtg.cfg in keinster weise.
          Gruß iro

            • Das ist ja auch nur der Befehl um perl zu patchen. Eine neue mrtg.cfg erstellst du mit dem Befehl
              sudo cfgmaker --global "Options[_]: growright" --global "IconDir: /mrtg" --global "WriteExpires: Yes" --global "Language: german" --global "RunAsDaemon: yes" --global "EnableIPv6: no" --global "LogFormat: rrdtool" --global "Interval: 1" '--if-filter=$if_admin && $default_iftype' --output /etc/mrtg.cfg public@localhost
              Gruß iro

              • Dann kommt diese Meldung 😀
                Undefined subroutine &SNMP_Session::pack_sockaddr_in6 called at /usr/share/perl5 /SNMP_Session.pm line 150.
                BEGIN failed–compilation aborted at /usr/share/perl5/SNMP_Session.pm line 154.
                Compilation failed in require at /usr/share/perl5/SNMP_util.pm line 44.
                BEGIN failed–compilation aborted at /usr/share/perl5/SNMP_util.pm line 44.
                Compilation failed in require at /usr/share/perl5/MRTG_lib.pm line 24.
                Compilation failed in require at /usr/bin/cfgmaker line 49.
                BEGIN failed–compilation aborted at /usr/bin/cfgmaker line 49.

                • Hey Marc,
                  da fällt mir eigentlich nur eins ein, am besten nochmal mit sudo aptitude purge mrtg mrtg-rrd rrdtool MRTG noch einmal komplett entfernen und das TUT von vorne beginnen. Ist aus der ferne leider immer etwas schwer den Fehler zu finden… und falls das nicht funktioniert, die SD Karte neu flashen 😉
                  Gruß iro
                  PS: Hab MRTG erst gestern neu auf einem 512er Pi installiert und es lief ohne Probleme. Die weiter oben bereits erwähnten Fehler beim erstellen der Konfig traten zwar auch auf, am am Ende wurde die mrtg.cfg erfolgreich nach /etc/mrtg.cfg geschrieben.
                  Gruß iro

    • Hey Zwergnase,
      die Box is gefreetzt, allerdings läuft die Abfrage über upnp. Die Infos hab ich von HIER.
      In meinem zweiten MRTG Artikel steht wie man über MRTG externe Scripte aufruft. Zuerst python nachinstallieren und dann eine Datei namens /etc/ng-upnp2mrtg.py anlegen und folgenden Code verwenden:

      #!/usr/bin/env python
      # -*- coding: utf-8 -*-
      #
      ######################################################################
      # This program is free software: you can redistribute it and/or modify
      # it under the terms of the GNU General Public License as published by
      # the Free Software Foundation, either version 3 of the License, or
      # (at your option) any later version.
      #
      # This program is distributed in the hope that it will be useful,
      # but WITHOUT ANY WARRANTY; without even the implied warranty of
      # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
      # GNU General Public License for more details.
      #
      # You should have received a copy of the GNU General Public License
      # along with this program. If not, see <http://www.gnu.org/licenses/>.
      ######################################################################

      # name/IP and port of router
      DEFAULT_HOST = „192.168.178.1“
      DEFAULT_PORT = 49000

      # name of the box, used as is in html page generated by mrtg
      DEFAULT_TARGET_NAME = „Fritzbox“

      # prints lots of stuff
      DEBUG = False

      #
      __VERSION__ = ‚0.2.3‘

      # 0.1 2009.03.29 first version
      # 0.2 2009.03.31 added: fritzbox, first published version
      # 0.2.1 2009.04.27 added: command line interface
      # 0.2.2 2009.05.11 added: raw log
      # 0.2.3 2009.05.18 added: nowrap

      import socket
      import re
      import getopt
      import sys
      import datetime

      def dhms(sec):
      „““ return number of seconds as (days,hours,minutes,seconds)
      „““
      if sec is None: return (0,0,0,0)

      min = sec / 60
      sec %= 60
      ho = min / 60
      min %= 60
      day = ho / 24
      ho %= 24

      return (day, ho, min, sec)

      def none2unknown(val):
      „““ return value as is, except if value is None
      rrdtools/mrtg wants UNKNOWN in this case
      „““
      if val is None: return „UNKNOWN“
      return val

      def my_int(s, default = None):
      try:
      v = int(s)
      except ValueError:
      v = default
      return v

      def response_code(msg):
      „““ extract response code from HTTP response
      example: HTTP/1.1 200 OK
      -> 200: ok
      -> -1: error during decode
      -> any other is considered not ok
      „““
      if msg is None: return 0

      match = re.match(‚^HTTP/1.[0|1]s+(d+)‘,msg)
      if match is None: return 0
      return int(match.group(1))

      def gettag(answer,tag):
      „““ find result in answer
      „““

      if (answer is None) or (tag is None): return None

      # extract part between and
      tag1 = „<%s>“ % (tag,)
      tag2 = „“ % (tag,)
      po1 = answer.find(tag1) + len(tag1)
      if po1<0 : return None # opening tag not found
      po2 = answer.find(tag2,po1)
      if po2<0 : return None # closing tag not found

      return answer[po1:po2]

      class upnpclient(object):
      def __init__(self,host,port):
      self.host = host
      self.port = port

      def create_message(self,serviceurl,schema,action):
      body="""




      „““ % (action,schema)

      pream = „““POST /%s HTTP/1.0
      HOST: %s:%s
      CONTENT-LENGTH: %s
      CONTENT-TYPE: text/xml; charset=“utf-8“
      SOAPACTION: „urn:schemas-upnp-org:service:%s#%s“

      „““.replace(„n“,“rn“) % (serviceurl,self.host,self.port,len(body),schema,action)

      dat = „%s%s“ % (pream,body)

      return dat

      def send(self,cmd):
      „““ send command to host:port and wait for the answer
      „““

      # create TCP socket and connect to host:port
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      s.connect((self.host,self.port))

      # send text
      s.send(cmd)

      # receive answer
      resp = „“
      while True:
      data = s.recv(1024) # receive up to 1K bytes
      if len(data) == 0: break
      resp += data
      s.close()

      return resp

      def send_command(self,serviceurl,schema,action,tag):
      „““ send command to router and analyse the result
      returns the value between and
      or None on error

      tag can be a single string (in this case the function returns a string)
      or a tuple of strings (in this case a tuple of results is returned)
      „““
      global DEBUG

      cmd = self.create_message(serviceurl,schema,action)
      if DEBUG: print cmd
      try:
      res = self.send(cmd)
      except socket.error, msg:
      print ‚Socket error:‘, msg
      return None
      if DEBUG: print res

      # check return code
      ret_code = response_code(res)
      if DEBUG: print ‚repsonse code:‘,ret_code
      if ret_code != 200: return None

      if tag is None: return res # debug

      if type(tag) is tuple:
      answer = []
      for t in tag:
      answer.append( gettag(res,t) )
      if DEBUG: return answer
      return tuple(answer)
      else:
      if DEBUG: return gettag(res,tag)
      return gettag(res,tag)

      class basic_modem(object):
      „““ This is an abstract class
      overwrite the functions
      „““
      def __init__(self):
      self.target_name = self.get_long_id() # descriptive text for 4th line of output

      def get_id(self):
      „““ returns a short if, which will be shown in –list
      „““
      return „???“

      def get_long_id(self):
      „““ returns longer description (model id, etc.)
      „““
      return „?????“

      def query(self,host,port):
      # see mrtg-reference: External Monitoring Scripts
      # returns the value for the 4 strings
      # 1: variable 1, usually incoming bytes count
      # 2: variable 2, usually outgoing bytes count
      # 3: uptime in human readble format (string is displayed as is)
      # query must format the string into human readable form
      # 4: name of target (string is displayed as is)
      # set to long_id by __init__ – can be overwritten
      pass

      class nc_router(basic_modem):
      def get_id(self):
      return „nc_premium“

      def get_long_id(self):
      return „NetCologn Premium“

      def query(self,host,port):
      uc = upnpclient(host,port)

      inbytes = uc.send_command(„WANCommonInterfaceConfigService/control“,
      #inbytes = uc.send_command(„LANCommonInterfaceConfigService/control“,
      „WANCommonInterfaceConfig:1″,
      #“LANCommonInterfaceConfig:1“,
      „GetTotalBytesReceived“,
      „NewTotalBytesReceived“)

      outbytes = uc.send_command(„WANCommonInterfaceConfigService/control“,
      #outbytes = uc.send_command(„LANCommonInterfaceConfigService/control“,
      „WANCommonInterfaceConfig:1″,
      #“LANCommonInterfaceConfig:1“,
      „GetTotalBytesSent“,
      „NewTotalBytesSent“)

      uptime = uc.send_command(„WANIPConnectionService/control“, # controlurl
      „WANIPConnection:1“, # servicetype
      „GetStatusInfo“,
      „NewUptime“)

      try:
      uptime = int(uptime)
      except (ValueError,TypeError):
      uptime = None
      if uptime is None: uptime = 0

      uptime_str = „%s days %02d:%02d:%02d h“ % dhms(uptime)
      return inbytes, outbytes, uptime_str, self.target_name

      class fritz_box(basic_modem):
      def get_id(self):
      return „fritzbox“

      def get_long_id(self):
      return „FritzBox“

      def query(self,host,port):
      # NOT TESTED

      uc = upnpclient(host,port)

      inbytes, outbytes = uc.send_command(„upnp/control/WANCommonIFC1“,
      „WANCommonInterfaceConfig:1“,
      „GetAddonInfos“,
      (‚NewTotalBytesReceived‘,’NewTotalBytesSent‘))

      uptime = uc.send_command(„upnp/control/WANIPConn1“,
      „WANIPConnection:1“,
      „GetStatusInfo“,
      ‚NewUptime‘)

      try:
      uptime = int(uptime)
      except (ValueError,TypeError):
      uptime = None
      if uptime is None: uptime = 0

      uptime_str = „%s Tagen, %d Stunden, %d Minuten und %02d Sekunden“ % dhms(uptime)
      return inbytes, outbytes, uptime_str, self.target_name
      ###################################################
      class nowrap_handler(object):
      # The last raw values from the device and the last offsets
      # are stored in a file.

      def __init__(self,filename):
      self.filename = filename
      self.lastinraw = None
      self.lastoutraw = None
      self.inoffset = 0
      self.outoffset = 0

      try:
      lines = open(filename,’r‘).readlines()
      if len(lines) != 2: raise ValueError,“format mismatch“

      comp = re.compile(„^(d+)t(d+)n$“)
      m1 = comp.match(lines[0])
      m2 = comp.match(lines[1])
      if (m1 is None) or (m2 is None): raise ValueErrur,“format mismatch“

      self.lastinraw = int(m1.group(1))
      self.lastoutraw = int(m1.group(2))
      self.inoffset = int(m2.group(1))
      self.outoffset = int(m2.group(2))
      except (IOError, ValueError):
      pass

      def __str__(self):
      return „%st%sn%st%sn“ % (self.lastinraw, self .lastoutraw,
      self.inoffset, self.outoffset)

      def get_corr_values(self,newinraw,newoutraw):
      # – get corrected values
      # – store last values (if not None)
      # – calc new offset

      newinraw = my_int(newinraw,None)
      newoutraw = my_int(newoutraw,None)

      if not (newinraw is None):
      if newinraw < self.lastinraw: self.inoffset += self.lastinraw self.lastinraw = newinraw newinraw += self.inoffset if not (newoutraw is None): if newoutraw < self.lastoutraw: self.outoffset += self.lastoutraw self.lastoutraw = newoutraw newoutraw += self.outoffset return newinraw, newoutraw def store_info(self): f = open(self.filename,'w') f.write(str(self)) f.close() def get_offsets(self): return self.inoffset, self.outoffset ############## command line interface ############# def usage(): print """Usage: %s [OPTIONS] --help this message --host, -h host ip (default: %s) --port. -p port number (default: %s) --type, -t type of router (mandatory) --list list available router --rawlog fnm save raw data in file --nowrap fnm activate anti-wrap, store status in fnm --debug enter debug mode """ % (sys.argv[0],DEFAULT_HOST,DEFAULT_PORT) def list_models(all): if len(all) == 0: print "No models available" return print "Model id Description" print "-------- -----------" for m in all: print "%-15s %s" % (m.get_id(), m.get_long_id()) def get_model(all,search): s = search.lower() for m in all: if m.get_id().lower() == s: return m return None def main(): global DEBUG allrouter = (nc_router(), fritz_box()) hostip = DEFAULT_HOST portno = DEFAULT_PORT target_name = DEFAULT_TARGET_NAME selected_model = None rawlog = None nowrap = None try: opts, args = getopt.getopt(sys.argv[1:], "h:p:t:", ["help", "host=","port=","type=","list","debug","rawlog=","nowrap="]) except getopt.GetoptError: print "unknown option" usage() sys.exit(2) for o, a in opts: if o == "--help": usage() sys.exit() if o == "--list": list_models(allrouter) sys.exit() if o == "--debug": DEBUG = True if o in ("-h", "--host"): hostip = a if o in ("-p", "--port"): portno = a if o in ("-t", "--type"): selected_model = get_model(allrouter, a) if o == "--rawlog": rawlog = a if o == "--nowrap": nowrap = nowrap_handler(a) if selected_model is None: print "Please select type of router.n" list_models(allrouter) print usage() sys.exit(2) try: portno = int(portno) except ValueError: print "port must be integer" sys.exit(3) inbytes, outbytes, uptime, target = selected_model.query(hostip,portno) if not(nowrap is None): inbytes, outbytes = nowrap.get_corr_values(inbytes,outbytes) nowrap.store_info() # store raw data in a file (if requested) # give a hint in the output that will displayed in the HTML page if rawlog is None: logindicator = '' else: try: now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') if nowrap is None: add_info = '' else: di, do = nowrap.get_offsets() add_info = 't%st%s' % (di,do) f = open(rawlog,'a') print >>f,’%st%st%st%s%s‘ % (now,inbytes,outbytes,uptime,add_info)
      f.close()
      logindicator = ‚ (logged)‘
      except IOError:
      logindicator = ‚ (error during logging)‘

      # output for MRTG
      print none2unknown(inbytes)
      print none2unknown(outbytes)
      print uptime
      print target_name + logindicator

      if __name__ == „__main__“:
      main()

      Das zusätzlich in die mrtg.cfg einfügen:

      ######################################################################
      # System: Fritzbox
      # Contact: root
      # Location: home
      ######################################################################

      ### FritzBox Traffic Gateway

      Target[fritzbox]: `/etc/ng-upnp2mrtg.py -P fritzbox`
      Title[fritzbox]: FritzBox VOIP-Gateway
      MaxBytes1[fritzbox]: 12500000
      MaxBytes2[fritzbox]: 125000
      WithPeak[fritzbox]: wmy
      PageTop[fritzbox]: <h1>Traffic Analysis for VOIP-Gateway (FritzBox) %</h1>

      Viel Spaß!

      Gruß iro

  7. Hi, danke für die tolle und ausführliche Anleitung. Ich habe alles befolgt und es hat auch alles geklappt, allerdings bekomme ich beim aufrufen von „*RaspberryPi IP*/cgi-bin/mrtg-rrd.cgi“ die Fehlermeldung „Error: Undefined statistics“
    Was habe ich falsch gemacht?

    Danke!

    • Hey Chris,
      das klingt als wären die Rechte falsch gesetzt, überprüf nochmal das der www-data user auch die die von mrtg erstellten Daten lesen kann.
      Gruß iro

      • Hi und danke für deine Antwort. Ich habe das Tutorial nochmal von Anfang an durch gearbeitet, un danach hat es funktioniert. Ich konnte die Statistik der eth0 Schnittstelle sehen.

        Dann habe ich deine mrtg Datei von deinem Nachtrag eingefügt und ersetzt, und den CGI Teil editiert und „aktiviert“.
        Allerdings habe ich jetzt keine Statistiken mehr, ich bekomme nur noch eine leere Seite ohne Fehlermeldung angezeigt.

        Was habe ich falsch gemacht?

        Danke.

        • Hey Chris,
          wenn du den CGI Teil richtig auskommentiert und den davor wieder einkommentiert hast, dann liegts bestimmt wieder an den Rechten 😉 Prüf nochmal dass auch wirklich der www-user Besitzer der Datei ist und sie auch ausführbar ist.
          Gruß iro

          • Hi iro,

            wenn ich wüsste wie das geht, würde ich das machen 😉

            Das Problem was ich hatte, lag an einer Zeile in der mrtg-rrd.cgi, im CGI Teil. Nämlich ###dump_targets();
            Ich hatte das auskommentiert, danach hatte ich das Problem mit der blanken Seite.
            Es funktioniert also soweit, ich habe danach noch dein anderes Tutorial gemacht, mit den verschiedenen Sensoren und bekomme auch fast alle angezeigt. Ich habe in der mrtg.cfg die eth0 komplett auskommentiert und wlan0 aktiviert (da ich wlan benutze).
            Allerdings bekomme ich keinen Graph angezeigt.
            Wenn ich eth0 wieder aktiviere, zusammen mit wlan0 bekomme ich einen Graphen angezeigt, aber der zeigt nichts an.

            Der einzige Graph, der zu funktionieren scheint, ist die CPU Auslastung:
            http://abload.de/img/unbenannttaswz.png

            Die CPU Temperatur zeigt 2.0°C an
            Die anderen zeigen entweder nichts an oder falsche Werte, und der Wlan Graph ist nicht vorhanden.

            Bezgl. des DS18S20 Sensors: Ja, ich habe die i2C Adresse ausgelesen und angepasst 😉

            Ich habe meine mrtg.cfg hochgeladen:
            http://www.file-upload.net/download-8003672/mrtg.cfg.html

            Vielleicht hast du ja mal Zeit drüber zu schauen 🙂

            PS:
            Ist das normal, dass die MRTG-Seite extrem lange immer braucht bis dass sie sich aufgebaut hat? Das ist ziemlich nervig 🙁

            Danke!

            Chris

            • Nachtrag:
              Die CPU Temperatur funktioniert nun, beim kopieren vom CPU Temperatur Skript, scheint ein Fehler beim kopieren aufzutreten.
              Die Zeile „scale=2; $tempread / 1000“ wird als .scale=2; $tempread / 1000. kopiert. Also mit punkten anstelle von „.

              Ich vermute das liegt daran, dass ich den Rpi gemäß deines Vorschlages auf Iso 8859 umgestellt habe.

              Jedenfalls habe ich die Punkte durch die “ ersetzt. Jetzt wird die Zeile auch Gelb angezeigt. Die CPU Temp funktioniert. Der DS18S20 Sensor habe ich auch so angepasst, aber er liest mir immer noch keine Temperatur aus.

              MfG

  8. Hi iro,

    Habe folgendes Problem:
    MRTG läuft (Danke für das Super Tutorial.
    Wollte anstatt Interface 2 das I 3 aktivieren (Ich hab bei mir WLAN-Connect)
    Also I 2 auskommentiert u. das I 3 aktiviert.
    Leider kommt jetzt diese Errormeldung:
    Error: Undefined statistics

    Ich denke da fehlt wohl noch irgendwo ein Eintrag ?!

    Hier noch meine cfg Datei:

    # Created by
    # /usr/bin/cfgmaker –global „Options[_]: growright“ –global „IconDir: /mrtg“ –global „WriteExpires: Yes“ –global „Language: german“ –global „RunAsDaemon: yes“ –global „EnableIPv6: no“ –global „LogFormat: rrdtool“ –global „Interval: 1“ „–if-filter=$if_admin && $default_iftype“ –output /etc/mrtg.cfg public@localhost

    ### Global Config Options

    # for UNIX
    # WorkDir: /home/http/mrtg

    # for Debian
    WorkDir: /var/www/mrtg

    # or for NT
    # WorkDir: c:mrtgdata

    ### Global Defaults

    # to get bits instead of bytes and graphs growing to the right
    # Options[_]: growright, bits

    EnableIPv6: no
    Options[_]: growright
    WorkDir: /var/www/mrtg
    IconDir: /mrtg
    WriteExpires: Yes
    Language: german
    RunAsDaemon: yes
    EnableIPv6: no
    LogFormat: rrdtool
    Interval: 1

    ######################################################################
    # System: raspberrypi
    # Description: Linux raspberrypi 3.6.11+ #538 PREEMPT Fri Aug 30 20:42:08 BST 2013 armv6l
    # Contact: Me
    # Location: Sitting on the Dock of the Bay
    ######################################################################

    ### Interface 1 >> Descr: ‚lo‘ | Name: ‚lo‘ | Ip: ‚127.0.0.1‘ | Eth: ‚No Ethernet Id‘ ###
    ### The following interface is commented out because:
    ### * it is a Software Loopback interface
    ### * filter specified by –if-filter rejected the interface
    #
    # Target[localhost_1]: 1:public@localhost:
    # SetEnv[localhost_1]: MRTG_INT_IP=“127.0.0.1″ MRTG_INT_DESCR=“lo“
    # MaxBytes[localhost_1]: 1250000
    # Title[localhost_1]: Traffic Analysis for 1 — raspberrypi
    # PageTop[localhost_1]: Traffic Analysis for 1 — raspberrypi
    #
    #
    #
    # System:
    # raspberrypi in Sitting on the Dock of the Bay
    #
    #
    # Maintainer:
    # Me <me@example.org>
    #
    #
    # Description:
    # lo
    #
    #
    # ifType:
    # softwareLoopback (24)
    #
    #
    # ifName:
    # lo
    #
    #
    # Max Speed:
    # 1250.0 kBytes/s
    #
    #
    # Ip:
    # 127.0.0.1 (localhost)
    #
    #
    #

    ### Interface 2 >> Descr: ‚eth0‘ | Name: ‚eth0‘ | Ip: ‚No Ip‘ | Eth: ‚b8-27-eb-0c-58-69‘ ###

    #Target[localhost_2]: 2:public@localhost:
    #SetEnv[localhost_2]: MRTG_INT_IP=“No Ip“ MRTG_INT_DESCR=“eth0″
    #MaxBytes[localhost_2]: 1250000
    #Title[localhost_2]: Traffic Analysis for 2 — raspberrypi
    #PageTop[localhost_2]: Traffic Analysis for 2 — raspberrypi
    #
    #
    #
    # System:
    # raspberrypi in Sitting on the Dock of the Bay
    #
    #
    # Maintainer:
    # Me <me@example.org>
    #
    #
    # Description:
    # eth0
    #
    #
    # ifType:
    # ethernetCsmacd (6)
    #
    #
    # ifName:
    # eth0
    #
    #
    # Max Speed:
    # 1250.0 kBytes/s
    #
    #
    # Ip:
    # No Ip (No DNS name)
    #
    #
    #

    ##Interface 3 >> Descr: ‚wlan0‘ | Name: ‚wlan0‘ | Ip: ‚192.168.1.104‘ | Eth: ’80-1f-02-af-0f-78′ ###

    Target[localhost_3]: 3:public@localhost:
    SetEnv[localhost_3]: MRTG_INT_IP=“192.168.1.104″ MRTG_INT_DESCR=“wlan0″
    MaxBytes[localhost_3]: 0
    Title[localhost_3]: Traffic Analysis for 3 — raspberrypi
    PageTop[localhost_3]: Traffic Analysis for 3 — raspberrypi

    System:
    raspberrypi in Sitting on the Dock of the Bay

    Maintainer:
    Me <me@example.org>

    Description:
    wlan0

    ifType:
    ethernetCsmacd (6)

    ifName:
    wlan0

    Max Speed:
    0.0 Bytes/s

    Ip:
    192.168.1.104 (localhost)

    • Hallo Torsten,
      beim schnellen drüber lesen ist mir folgendes aufgefallen:
      Max Speed:
      0.0 Bytes/s

      Das kann nicht sein 😉 Am besten ist, du verbindest dich per WLAN mit dem Pi und lässt das LAN ausgesteckt. Wenn du jetzt noch einmal den cfgmaker aufrufst, sollte MRTG automatisch das LAN Interface auskommentieren und statt dessen dein WiFi Interface mit der korrekten max. Speed anzeigen. Generell werden alle Interfaces angezeigt, die aktiv sind und inaktive auskommentiert.
      Gruß und gn8
      iro

      • Hallo iro. Genauso hab ich es gemacht. Per WLAN verbunden. LAN war nicht eingesteckt. Jedoch war dann in der conf die LAN aktiv u. WLAN aus kommentiert. Was nun ?
        Gruss Torsten

        • Ok das ist seltsam 🙂 Dann noch einmal den wlan Teil einkommentieren und dabei darauf achten dass keine Formatierung geändert wird. MRTG reagiert da sehr allergisch drauf. Von Hand dann noch den Parameter „MaxBytes[localhost_3]:“ auf die Geschwindigkeit deines WLAN Adapters ändern.
          Nutzt du z.B. einen 150MBit Adapter, dann wäre der Wert 1875000.
          Gruß iro

          • Ok, Hab das jetzt alles auskommentiert. Aber wenn alles auskommentiert ist kann mrtg ja auch nix anzeigen. Also kommt die Meldung undefined statistics.
            Also hab ich die # Zeichen wieder rausgenommen (bei WLAN) Nun kommt:
            Error: RRDs::graph failed, opening ‚/var/www/mrtg/localhost_3.rrd‘: No such file or directory
            Da fehlt wohl noch eine Zuordnung zu Interface 3 Muss ich die in der mrtg.cfg machen.
            Gruß Torsten
            PS Du hast wohl die Kommentarfunktion unter dem WordPress Artikel abgeschalten ?

            Hier noch meine aktuelle mrtg.cfg:
            # Created by
            # /usr/bin/cfgmaker –global „Options[_]: growright“ –global „IconDir: /mrtg“ –global „WriteExpires: Yes“ –global „Language: german“ –global „RunAsDaemon: yes“ –global „EnableIPv6: no“ –global „LogFormat: rrdtool“ –global „Interval: 1“ „–if-filter=$if_admin && $default_iftype“ –output /etc/mrtg.cfg public@localhost

            ### Global Config Options

            # for UNIX
            # WorkDir: /home/http/mrtg

            # for Debian
            WorkDir: /var/www/mrtg

            # or for NT
            # WorkDir: c:mrtgdata

            ### Global Defaults

            # to get bits instead of bytes and graphs growing to the right
            # Options[_]: growright, bits

            EnableIPv6: no
            Options[_]: growright
            WorkDir: /var/www/mrtg
            IconDir: /mrtg
            WriteExpires: Yes
            Language: german
            RunAsDaemon: yes
            EnableIPv6: no
            LogFormat: rrdtool
            Interval: 1

            ######################################################################
            # System: raspberrypi
            # Description: Linux raspberrypi 3.6.11+ #538 PREEMPT Fri Aug 30 20:42:08 BST 2013 armv6l
            # Contact: Me
            # Location: Sitting on the Dock of the Bay
            ######################################################################

            ### Interface 1 >> Descr: ‚lo‘ | Name: ‚lo‘ | Ip: ‚127.0.0.1‘ | Eth: ‚No Ethernet Id‘ ###
            ### The following interface is commented out because:
            ### * it is a Software Loopback interface
            ### * filter specified by –if-filter rejected the interface
            #
            # Target[localhost_1]: 1:public@localhost:
            # SetEnv[localhost_1]: MRTG_INT_IP=“127.0.0.1″ MRTG_INT_DESCR=“lo“
            # MaxBytes[localhost_1]: 1250000
            # Title[localhost_1]: Traffic Analysis for 1 — raspberrypi
            # PageTop[localhost_1]: Traffic Analysis for 1 — raspberrypi
            #
            #
            #
            # System:
            # raspberrypi in Sitting on the Dock of the Bay
            #
            #
            # Maintainer:
            # Me <me@example.org>
            #
            #
            # Description:
            # lo
            #
            #
            # ifType:
            # softwareLoopback (24)
            #
            #
            # ifName:
            # lo
            #
            #
            # Max Speed:
            # 1250.0 kBytes/s
            #
            #
            # Ip:
            # 127.0.0.1 (localhost)
            #
            #
            #

            ### Interface 2 >> Descr: ‚eth0‘ | Name: ‚eth0‘ | Ip: ‚No Ip‘ | Eth: ‚b8-27-eb-0c-58-69‘ ###

            #Target[localhost_2]: 2:public@localhost:
            #SetEnv[localhost_2]: MRTG_INT_IP=“No Ip“ MRTG_INT_DESCR=“eth0″
            #MaxBytes[localhost_2]: 1250000
            #Title[localhost_2]: Traffic Analysis for 2 — raspberrypi
            #PageTop[localhost_2]: Traffic Analysis for 2 — raspberrypi
            #
            #
            #
            # System:
            # raspberrypi in Sitting on the Dock of the Bay
            #
            #
            # Maintainer:
            # Me <me@example.org>
            #
            #
            # Description:
            # eth0
            #
            #
            # ifType:
            # ethernetCsmacd (6)
            #
            #
            # ifName:
            # eth0
            #
            #
            # Max Speed:
            # 1250.0 kBytes/s
            #
            #
            # Ip:
            # No Ip (No DNS name)
            #
            #
            #

            ##Interface 3 >> Descr: ‚wlan0‘ | Name: ‚wlan0‘ | Ip: ‚192.168.1.104‘ | Eth: ’80-1f-02-af-0f-78′ ###

            Target[localhost_3]: 3:public@localhost:
            SetEnv[localhost_3]: MRTG_INT_IP=“192.168.1.104″ MRTG_INT_DESCR=“wlan0″
            MaxBytes[localhost_3]: 1875000
            Title[localhost_3]: Traffic Analysis for 3 — raspberrypi
            PageTop[localhost_3]: Traffic Analysis for 3 — raspberrypi

            System:
            raspberrypi in Sitting on the Dock of the Bay

            Maintainer:
            Me <me@example.org>

            Description:
            wlan0

            ifType:
            ethernetCsmacd (6)

            ifName:
            wlan0

            Max Speed:
            0.0 Bytes/s

            Ip:
            192.168.1.104 (localhost)

  9. Hallo,
    vielen Dank für die anfängerfreundlichen Anleitungen. Ich beginne gerade mit Hardwareprogrammierungen und bin dementsprechend unsicher. Darum weiß ich auch nicht, wo ich mit der Suche beginnen soll.
    Also der erste Test brachte diese Fehlermeldung:
    ———-
    sudo mrtg /etc/mrtg.cfg
    Daemonizing MRTG …
    ERROR: I Quit! Another copy of mrtg seems to be running. Check /etc/mrtg.pid
    ———-

    In der /etc/mrtg.pid steht „2664“, mehr nicht Im Netzt fand ich einen Hinweis (allerdings in einer anderen Angelegenheit), dass evtl. in der /etc//cron.d etwas gestartet wurde, was nicht sein darf. Tatsächlich liegt dort die Datei mrtg mit dem Inhalt:
    ————-
    */5 * * * * root if [ -x /usr/bin/mrtg ] && [ -r /etc/mrtg.cfg ] && [ -d „$(grep ‚^[[:space:]]*[^#]*[[:space:]]*WorkDir‘ /etc/mrtg.cfg | awk ‚{ print $NF }‘)“ ]; then mkdir -p /var/log/mrtg ; env LANG=C /usr/bin/mrtg /etc/mrtg.cfg 2>&1 | tee -a /var/log/mrtg/mrtg.log ; fi
    ————-

    Wenn ich die gesamte Zeile auskommentiere und den RasPi neu starte, kommt zwar keine Fehlermeldung, sondern das gewünschte „Daemonizing MRTG …“

    Allerdings kann im Browser die gewünschte Webseite unter http://192.168.yy.xx /cgi-bin/mrtg-rrd.cgi nicht angezeigt werden.

    Es ist ein neu aufgesetztes wheezy, muss ich evtl. erst noch weitere Pakete installieren? Oder noch Rechte an /var/www/ anpassen)

    Ich habe auch noch nicht die Nachträge abgearbeitet, weil ich erst mal Schritt für Schritt rangehen muss.

    Könnt ihr mir helfen?
    Danke Marc Adam

  10. Hi iro, danke für Dein Tutorial.

    Bei mir hat der cfgmaker erstmal nicht getan, weil die Zeile:
    dontLogTCPWrappersConnects true

    in der falschen Konfigurationsdatei war. Statt in die
    /etc/default/snmpd
    gehört es in die
    /etc/snmp/snmpd.conf

    Vielleicht gehts ja anderen auch so…

    Gruesse
    Christoph

  11. Hi!
    Danke fürs tutorial, hat alles funktioniert, habe auch schon einen Luftdruck-Sensor eingebaut, perfekt.
    Hast du eine Ahnung wie man die y-Achse der Graphen nicht bei 0 sondern benutzerdefiniert starten kann? Zweck wäre zB bei Temeratur und Druck gibts einen Bereich der uninteressant ist, zb <15 Grad oder <0.9Bar.

    Schöne Grüße
    Flo

  12. Hi!
    Danke für das how2. habs komplett durchgearbeitet, bekomme aber leider den Fehler „Error: Undefined statistics“ im Browser 🙁
    Die Rechte der /etc/mrtg.cfg sollten eigentlich passen: -rw-r–r– www-data www-data /etc/mrtg.cfg

    Wo ist der Fehler? Bitte Hilfe 🙁

    Danke und Gruß

    • Hey Kevin,
      denk das liegt trotzdem an den Rechten 😉 www-data darf zwar lesend und schreibend auf die Konfig zugreifen, aber was ist mit MRTG und den DBS? Hat der Prozess auch Schreibrechte für das Verzeichnis in dem die DBs liegen?
      Gruß iro

      • danke für die antwort.
        wenn du mir jetzt noch sagen könntest wie ich das herausfinde, bin ich glücklich 😀
        Linux ist dann doch nicht so meins merke ich so langsam 🙂

    • Hey boarduser,
      gleiche Antwort auch hier, wenn die Abfragen der verschiedenen Skripte richtig funktionieren und Werte zurückgegen werden, dann erzeugt MRTG automatisch selbst die rrd DBs. Die html Links der Webseite werden von der mrtg-rrd.cgi anhand der mrtg.cfg erstellt.
      Gruß iro

  13. Hi,

    nachdem ich das Tu´T mit dem Dallas-Temp.-Sensoren „gemeistert“ habe, hatte ich ja bereits angedroht, dieses nächstes TuT zu versuchen…. und scheitere natürlich gleich wieder:
    Hab den RaspPi nach dem TuT „sauber installieren“ 2x neu geflasht, dieses TuT 2 x neu angefangen (und auch abgeschlossen, samt Kommentaren, meine ich) und hänge dabei, das ich keine Daten in die Graphen bekomme.
    Auch die Problematik, die Thorsten beschrieb ( trotz WLAN-Anbindung wird nur der LAN-Graph ( der natürlich leer sein muss) angezeigt, habe ich auch
    Ich habe die beiden Scripte für „Temperatur Wohnzimmer“ und „RaspBerryPi Server-CPU Temperatur“ eingefügt, wobei ich im ersteren Script einzig die ID des Sensors angepasst habe, das zweite Script habe ich übernommen. Die leeren Graphen werden auch angezeigt, das ist leider Alles.

    Was mache ich noch falsch???

    Gibt es denn eine Möglichkeit, die einzelnen Schritte zu überprüfen bzw. ein LogFile, das mir die Fehler zeigt?

    Gruß
    Obersimulant

  14. Hey Iro nochmals danke für das Tutorial.
    Bei mir läuft soweit alles gut. Ich habe nur folgendes Problem. Wenn ich den Raspi neustarte dann startet MRTG nicht automatisch. Erst nachdem ich in manuell starte kann ich wieder auf die Seite zugreifen. Bzw. die Messdaten die vorher gesammelt wurden sind weg. Werden die bei einem reboot gelöscht?

    Danke schonmal im Vorraus. 😉

    • Hey Pr3,
      seltsames Phenomän hast du da. Wenn du mrtg wie beschrieben installiert hast, dann sollte ein Cron angelegt worden sein, der alle 5 Minuten läuft und prüft ob mrtg läuft. Falls nicht wird es gestartet. Die Ausgabe solltest du im syslog finden, prüf das mal. Falls du im syslog nichts findest, dürfte neu installieren am schnellsten funktionieren. Wichtig: Vorher deine /etc/mrtg.cfg sichern und hinterher zurückspielen – sollte in 2 Minuten erledigt sein.
      Warum deine Daten verschwinden kann ich dir nicht sagen, gelöscht wird definitiv nichts. Liegen die Daten denn nach einem Reboot noch unter /var/www/mrtg?
      Gruß iro

      • Also die Daten bleiben jetzt erhalten und werden nicht gelöscht. Jedoch startet MRTG nach einem Reboot immer noch nicht neu.
        Die Datei /etc/cron.d/mrtg hat den Inhalt wie bei dir beschrieben.

        */5 * * * * root env LANG=C /usr/bin/mrtg /etc/mrtg.cfg > /dev/null

        Hab es neu installiert und es Funktioniert irgendwie immer noch nicht. WO kann ich denn das syslog prüfen?

        Danke schon mal für die Hilfe 😉

        grüße Pr3

  15. Hallo.
    Gute Beschreibung. Tolle Arbeit hast du geleistet.
    Habe eine Frage. Wie kann ich Festplatten von einem Externen Gerät (NAS) auslesen ?

    • Hey Micha,
      danke für das Feedback!
      Eine Pauschale Antwort auf deine Frage kann ich dir allerdings nicht liefern, das hängt stark von der Funktionalität des NAS ab. Wenn SNMP unterstützt wird, dann würde ich es damit versuchen. Community String auf dem NAS setzen und vom Raspberry dann einen SNMP Walk ausführen. Damit kannst du dir bestimmt was schönes zusammenbasteln.
      Gruß iro

  16. Hallo, zu allererst einmal: ich finde Ihre Tutorials sehr gut erklärt.
    Jetzt mein Problem:
    Wenn ich den Befehl sudo mrtg /etc/mrtg eingebe kommt folgende Fehlermeldung
    ERROR: unable to open config file: /etc/mrtg
    Wie kann ich diesen Fehler Beheben

  17. Guten tag,

    ich bekomme folgende Fehlermeldung auf der Seite:
    Error: Undefined statistics

    ich habe ein Apache2 Server laufen, diesbezüglich habe ich alles gemacht nur halt noch in den html ordner dazu rein dürfte ja dennoch kein problem sein oder?

    • Hey Marco,
      falls du das Problem noch nicht gelöst hast, was meinst du denn mit „nur halt noch in den html ordner dazu rein„?
      Prinzipiell ist es natürlich egal ob du Apache, Lighty oder einen anderen Webserver nutzt, solange die gleichen bzw. vergleichbare Modules laufen.
      Gruß iro

  18. Hallo iro,

    zu erst, richtig gutes Tutorial. Ist sogar für mich als Anfänger nachvollziehbar. Allerdings habe ich ein oder zwei Probleme und finde nicht heraus woran es liegen könnte. Habe alles installiert nur wenn ich den MRTG Daemon starten will kommt folgende Meldung:

    Daemonizing MRTG …
    ERROR: I Quit! Another copy of mrtg seems to be running. Check /etc/mrtg.pid

    Nun dachte ich, ich habe das selbe Problem wie Marc Adam. Doch leider hat auch das installieren von bc nichts genützt. Zudem zeigt der Pi mir unter http://ip-adresse/cgi-bin/mrtg-rrd.cgi einen 404 – Not Found an. Kannst Du mir helfen bzw sagen woran das liegen könnte und was ich tun soll? Ich wäre Dir sehr Dankbar!

    Viele Grüße, ErdwurmJim

    • Hey Jim,

      die Meldung sagt ganz einfach, dass mrtg schon läuft. Das wird beim booten automatisch gestartet.
      Um die laufende Version zu stoppen, musst du zuerst die PID (Prozessnummer) von mrtg raus bekommen. Machst du mit folgendem Befehl:
      ps -Af | grep mrtg
      Die erste Zahl hinter dem Prozessnamen ist die PID. Nun den Prozess abschießen:
      kill PID
      PID natürlich durch die Zahl ersetzen die dir im Schritt davor angezeigt wurde.

      Ich bin mir gerade nicht sicher, aber wenn ich mich nicht täusche, dann darfst du die mrtg.cfg nur bearbeiten, wenn mrtg nicht läuft. Sonst werden deine Änderungen wieder überschrieben.

      Gruß iro

      • Hallo iro,

        mir werden zwei Prozesse angezeigt:

        root 850 1 0 19:50 ? 00:00:00 /usr/bin/perl -w /usr/bin/mrtg /etc/mrtg.cfg
        pi 872 826 0 19:50 pts/0 00:00:00 grep –color=auto mrtg

        leider sagt er mir, egal welches ich beende „Ungültige Signalbezeichnung“

  19. Hat jemand das Tutorial basierend auf der neusten pi Version Jessie erfolgreich zum Fliegen gebracht? Bin mir sicher die Anleitung unter Wheezy bereits durchgeführt zu haben und hatte auch Erfolg. Momentan bekomme ich es einfach nicht hin, auch nach mehrmaliger Installation. Habe es mit lighttp versucht. Ich bekomme aber immer den 404 und von MRTG wird kein index.html file erstellt. Dennoch wird ein rrd aktualisiert und Port 80 ist offen. Komme nicht dahinter, was ich übersehen habe. Ist aktuell halblebig. Ist der Indexmaker notwendig? Werde es später mal noch mit Apache versuchen.
    Trotzdem vielen Dank für die gute Anleitung.

  20. Hallo
    Das Tutorial ist super.
    Beim Test krieg ich die Meldung“ Daemonizing MRTG“
    Nur wenn ich die mrtg-rrd.cgi mit dem Browser am raspi öffnen will, kommt die Meldung
    „Diese Webseite ist nicht erreichbar. localhost hat die Verbindung abgelehnt.“ Wenn ich es über ein anderes Gerät im Netzwerk mit der IP vom Rapsi(die mit Putty undVNC funkt) probiere, krieg ich die Meldung „Firefox kann keine Verbindung zu dem Server unter 10.0.0.15 aufbauen“
    Was mach ich falsch.
    Bin kein ganzer newbie, aber meine Kenntnisse sind bescheiden (frei nach Sokrates “ Je mehr ich weis, umso mehr weis ich, dass ich nichts weis“)
    Gruß Jerry

    • Hey Jerry,
      besser spät als nie, ich würde darauf tippen, dass dein Webserver nicht läuft. Eine andere Möglichkeit wäre, dass du iptables laufen hast. Dann müsstest du Port 80 noch freigeben.
      Gruß iro

  21. Hi, thanks for the guide.
    finally my mrtg is running after 16 hours
    googling, try some tutorial on internet
    nothing work, until i find your web.

    btw i have problem. i install pi-hole on my rpi along mrtg.
    both pi-hole and mrtg using different root dir.
    pi-hole use /var/www/html
    and your mrtg guide user /var/www/

    i have no clue how to move root dir from /var/www to /var/www/html.

    • Hey teuku,
      thanks for your feedback 🙂
      Regarding your question, there is no need to move the root dir. In fact everything under „/var/www/“ will be accessible via your browser.
      Cheers iro

  22. Hallo,

    sehr sehr cool, die Anleitung.

    Ich habe allerdings bei dem Installieren von mrtg-rrd ein Problem. er gibt mir dort immer den Fehler, dass er dort keine Pakete finden kann.
    Hatte das schonmal jemand?

    Danke euch 🙂

  23. Hallo,

    ich habe bei dem mrtg-rrd enorme Probleme bei dier Installation. Das Paket kan nciht gefunden werden.

    Hatte das schonmal jemand?

    Danke.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.