aboutsummaryrefslogtreecommitdiffstats
path: root/clients/ping.pl
blob: 6968b4dbb2e23da0a059c050c43863a14190cbe6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#! /usr/bin/perl
use DBI;
use POSIX;
use Time::HiRes;
use Net::Oping;
use strict;
use warnings;

use lib '../include';
use nms;

my $dbh = nms::db_connect();
$dbh->{AutoCommit} = 0;
$dbh->{RaiseError} = 1;

my $q = $dbh->prepare("SELECT switch,ip FROM switches WHERE ip<>'127.0.0.1'");
my $lq = $dbh->prepare("SELECT linknet,addr1,addr2 FROM linknets");

while (1) {
	# ping loopbacks
	my $ping = Net::Oping->new;
	$ping->timeout(0.2);

	$q->execute;
	my %ip_to_switch = ();
	while (my $ref = $q->fetchrow_hashref) {
		my $switch = $ref->{'switch'};
		my $ip = $ref->{'ip'};
		$ping->host_add($ip);
		$ip_to_switch{$ip} = $switch;
	}
	my $result = $ping->ping();
	die $ping->get_error if (!defined($result));

	$dbh->do('COPY ping (switch, latency_ms) FROM STDIN');  # date is implicitly now.
	while (my ($ip, $latency) = each %$result) {
		my $switch = $ip_to_switch{$ip};
		if (!defined($latency)) {
			$dbh->pg_putcopydata("$switch\t\\N\n");
		} else {
			$dbh->pg_putcopydata("$switch\t$latency\n");
		}
	}
	$dbh->pg_putcopyend();
	$dbh->commit;

	# ping linknets
	$ping = Net::Oping->new;
	$ping->timeout(0.2);

	$lq->execute;
	my @linknets = ();
	while (my $ref = $lq->fetchrow_hashref) {
		push @linknets, $ref;
		$ping->host_add($ref->{'addr1'});
		$ping->host_add($ref->{'addr2'});
	}
	$result = $ping->ping();
	die $ping->get_error if (!defined($result));

	$dbh->do('COPY linknet_ping (linknet, latency1_ms, latency2_ms) FROM STDIN');  # date is implicitly now.
	for my $linknet (@linknets) {
		my $id = $linknet->{'linknet'};
		my $latency1 = $result->{$linknet->{'addr1'}} // '\N';
		my $latency2 = $result->{$linknet->{'addr2'}} // '\N';
		$dbh->pg_putcopydata("$id\t$latency1\t$latency2\n");
	}
	$dbh->pg_putcopyend();
	$dbh->commit;
	
	sleep 1;
}