Heute habe ich mich endlich einem Problem angenommen, das mich mit meiner Cacti-Installation seit mehr als einem Jahr plagt: Die Ping-Werte für Google werden nicht mehr aufgezeichnet.
Nachdem ich unter
- Console
- System Utilities
- View Cacti Log File
nach „ping“ gesucht hatte und feststellen musste, dass das Script ~/cacti/scripts/ping.pl permanent „U“ als Wert zurücklieferte, begann das Debugging.
Auch die manuelle Ausführung von
~/cacti/scripts/ping.pl www.google.com
brachte ein „U“ als Resultat hervor. Was cheibs?
Im Grunde ruft das Perl-Script folgenden Kommandozeilenbefehl auf und filtert im Anschluss den Rückgabe wert:
ping -c 1 www.google.com | grep icmp_seq | grep time
Als ich dies auf der Kommandezeile ausführte, wurde ein leerer Wert zurückgegeben.
Nachdem ich ein Blick auf das Resultat von
$ ping -c 1 www.google.com PING www.l.google.com (74.125.79.104) 56(84) bytes of data. 64 bytes from ey-in-f104.1e100.net (74.125.79.104): icmp_req=1 ttl=53 time=34.6 ms --- www.l.google.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 34.695/34.695/34.695/0.000 ms
geworfen hatte, war mir sofort klar, was das Problem war: grep nach icmp_seq kann nicht von Erfolg gekrönt sein, weil hier offenbar icmp_req steht.
Das Problem ist im ping.pl does not account for ping using icmp_req rather than icmp_seq in some versions of ping festgehalten: Offenbar gab es bei ping irgendwann einmal eine Anpassung am Code, die nur noch diese Ausgabe zur Folge hatte.
Nach einem Blick auf den Patch nahm ich die Anpassung an ~/cacti/scripts/ping.pl selber vor — irgendwie einfach ein wenig anders als vorgeschlagen:
... open(PROCESS, "ping -c 1 $host | grep -E 'icmp_(r|s)eq' | grep time |"); ...
Damit klappte es wieder.
Nachtrag
Unter einer Synology DiskStation klappt es auch trotz dieser Anpassung nicht. Der Ping-Befehl gibt folgendes aus:
ping -c 1 192.168.8.8 PING 192.168.8.8 (192.168.8.8): 56 data bytes 64 bytes from 192.168.8.8: seq=0 ttl=64 time=0.223 ms
Keine Spur von icmp_seq, stattdessen steht dort nur seq. Somit passt man das Script finalerweise folgendermassen an:
... open(PROCESS, "ping -c 1 $host | grep -E '(r|s)eq' | grep time |"); ...