Ping mit Feedback

Hallo zusammen,

ich hoffe ich bin hier in der Richtigen Forum-Kategorie, bin mir selbst nicht ganz sicher.

Ich suche eine Lösung zu Folgendem Problem:

Ich würde gerne ein Programm (egal in welcher Sprache) das einen Ping zu IP-Adressen ausführt, diese dann Auswertet und am liebsten Graphisch grün oder rot je nach Erreichbarkeit anzeigt.

Es sollte komplett vom Notebook aus laufen ohne einen extra Server, denke aber das für das graphische Html sich am besten eignet.

Es handelt sich um ca 120 IPs alle im internen Netzwerk.

Habt ihr einen Ansatz für mich wie man es am besten Realisiert ?


Vielen dank im vorraus
 
ich hoffe ich bin hier in der Richtigen Forum-Kategorie, bin mir selbst nicht ganz sicher.

[...]
Ich würde gerne ein Programm (egal in welcher Sprache) das einen Ping zu IP-Adressen ausführt, diese dann Auswertet und am liebsten Graphisch grün oder rot je nach Erreichbarkeit anzeigt.

Ob du hier richtig bist, hängt davon ab welches Verb im unteren zitierten Teil fehlt. Was das Programm machen soll OK, aber würdest du gerne das Programm haben/kaufen/programmieren wollen?

Im Code Kitchen wohl programmieren, aber egal welche Sprache hört sich da komisch an. Welche kannst du denn?
 
Hallo und danke für deine schnelle antwort.

Ich kann bis jetzt C und C++ zwar kein Experte aber es reicht.
Ich bin mir aber nicht sicher ob da C allein reicht.

Wenn du ein Programm kennst das die Funktion hat wäre ich natürlich auch dankbar.

Ich weiß halt so garnicht wie ich anfange gerade.
 
C reicht für alles, was man irgendwie an Anwendungen programmieren kann. Und wenn du diese Sprache wirklich könntest, wüsstest du das auch. However... dir fehlt offenbar die Praxis. Daher...

Ein Ping ist im Endeffekt nichts anderes als ein ICMP-Paket. Dieses kannst du in C mittels eines Sockets vom Typ IPPROTO_ICMP oder IPPROTO_RAW versenden. Demzufolge brauchst du einen entsprechenden Socket. Punkt 1 auf deiner Todo-Liste ist also: Suche dir jeweils ein Tutorial zur Socket-Programmierung, zum Aufbau von Netzwerk-Paketen und zu ICMP-Echo-Requests aka Pings. Dann willst du die Ergebnisse auswerten. Das dürfte sich auf ein paar if-else beschränken, also kein Problem. Und zu guter letzt willst du das alles grafisch darstellen. Um Grafiken oder Graphen zu generieren gibt es verschiedene Libraries. Github, Sourceforge etc. dürften gute Anlaufpunkte sein um was passendes zu finden.

Leichter wäre es allerdings ein Skript zu verwenden. Zum einen gibt es bereits gute Ping-Programme, die man in seinem Skript verwenden kann. Zum anderen muss man das Rad ja nicht immer wieder neu erfinden, so lange es nicht darauf abzielt eine bestimmte Programmiersprache zu vertiefen. In einem Skript würdest du einfach das Ping-Programm mit passenden Parametern aufrufen, den Output weiter verarbeiten und die Daten mittels eines Tools wie rrdtool, sqlite o.ä. in einem "Daten-Behälter" aka Datenbank ablegen. Von dort stehen sie dann für die Generierung von Graphen zur Verfügung.

Und die ganz einfache Lösung wäre, dass du dich mal im Bereich des Server-Monitorings umschaust. Diese Tools können nämlich fast alle Ping-Zeiten graphisch darstellen. Munin wäre so ein Tool, das sich für deine Zwecke eignen würde. Das kann auch problemlos auf deinem Laptop laufen. Alternativ fütterst du die Daten eines Ping-Skripts in einen Graphite-Server (auch der kann auf deinem Laptop laufen) und nutzt diesen um dir Graphen daraus anzeigen zu lassen. Was ähnliches hatte ich schonmal für die Erreichbarkeit spezifischer Ports auf verschiedenen Rechnern gebastelt: https://github.com/bitmuncher/bitscripts/blob/master/check_port.pl Für deine Zwecke modifiziert, könnte das dann so aussehen.

Code:
#!/usr/bin/env perl

use strict;
use warnings;

use Net::Ping;
use IO::Socket::Inet;

# define your hosts here!
my @hostlist = (
		'host1',
		'host2',
		'host3',
		'host4',
		);
		
my $carbon_host = 'localhost'; # host of carbon server
my $carbon_port = '2003'; # port of carbon server
my $carbon_path = 'test.pingcheck.'; # path prefix for graphite

sub sendToGraphite($$) {
	my $carbon_path = shift;
	my $value = shift;
	my $sock = IO::Socket::INET->new(
					PeerAddr => $carbon_host,
					PeerPort => $carbon_port,
					Proto    => 'tcp',
					Timeout => 2,
					);
	die "Unable to connect: $!\n" unless ($sock->connected);
	my $time = time;
	$sock->send($carbon_path.' '.$value.' '.$time."\n");
	my $retval;
}

my $p = Net::Ping->new();

foreach my $host (@hostlist) {
	my path = $carbon_path.$host;
	my $reachable = 0;
	if($p->ping($host)) {
		$reachable = 1;	
	}
	sendToGraphite($path, $reachable);
}

$p->close();

1;

Dieses Perl-Skript pingt die Hosts aus der definierten Liste einmal durch und sendet die Daten an Graphite weiter. Kann man einfach alle 1-2 Minuten laufen lassen oder noch eine Endlos-Schleife drumrum basteln und fertig. Über das Interface von Graphite kann man sich dann einfach Graphen daraus generieren. Voraussetzung natürlich: Auf dem Rechner muss Perl und Graphite installiert sein.
 
Habe nie mit Perl programmiert, aber wenn ich es recht verstehe, wird die Schleife bei jedem unerreichbaren Host erstmal 5 Sekunden warten:

https://www.npmjs.com/package/net-ping
If a default timeout ($def_timeout) in seconds is provided, it is used when a timeout is not given to the ping() method (below). The timeout must be greater than 0 and the default, if not specified, is 5 seconds.

Wenn viele Server nicht erreichbar sind (Switch-Ausfall z.B.), kann man erstmal paar Minuten warten, bis die Datenbank/Graphite die Erreichbarkeit registriert hat.

Ich würde da eher ein eventbasiertes node.js Skript in Endlosschleife per screen-Session vorziehen, wo jeder Server unabhängig von den anderen z.b. alle 30 Sekunden gepingt und geloggt wird.
 
Sollte auch nur ein kleines Beispiel sein. In einer idealen Welt würde man natürlich jedes Host in einen extra Thread legen, so dass alle Hosts parallel abgearbeitet werden können. Und Timeout-Werte festlegen ist nicht gerade ein Hexenwerk. ;)
 
Zurück
Oben