Projet

Général

Profil

Paste
Télécharger au format
Statistiques
| Branche: | Révision:

root / plugins / ping / multi_tcp_ping @ 17f78427

Historique | Voir | Annoter | Télécharger (4,33 ko)

1 2969fd43 Gunnar Wolf
#!/usr/bin/perl
2
3
=head1 NAME
4
5
multi_tcp_ping - Graphs together the TCP ping results for several hosts
6
7
=head1 SYNOPSIS
8
9
This plugin is meant to be called from Munin. You should set the
10
'hosts' environment variable from Munin's configuration (i.e.
11
/etc/munin/munin.conf) to specify which hosts and ports to query.
12
13
=head1 DESCRIPTION
14
15
This plugin expects to receive the following environment variables:
16
17
=over 4
18
19
=item hosts (REQUIRED!)
20
21
Comma-separated list of hosts to query. You can specify the TCP port
22
to connect to on each of the hosts by listing them as host:port - The
23
port defaults to 80. The following is a valid hosts declaration:
24
25
    hosts='192.168.0.15, 192.168.0.18:22'
26
27
It will query host 192.168.0.15 on the default port (80), as well as
28
host 192.168.0.18 on port 22.
29
30
=back
31
32
If the connection was opened successfully, it gives as the return
33
value the time it took to establish the connection. If the requested
34
host is not reachable, a hard-wired '-0.01' will be returned. Why
35
-0.01? Because giving a negative value is the best way to easily get
36
-visually- that something failed. Connection establishment times are
37
usually in the 5-500ms range. 100ms will be not too little (and thus
38
invisible), not too much (and thus killing the details in our graphs).
39
40
=head1 DEPENDS ON
41
42
L<Net::Ping>
43
44
=head1 SEE ALSO
45
46
L<munin>, L<munin-node>
47
48
=head1 AUTHOR
49
50
Gunnar Wolf <gwolf@gwolf.org>
51
52
=head1 COPYRIGHT
53
54
55
Copyright 2008 Gunnar Wolf, Instituto de Investigaciones
56
Economicas, UNAM. This plugin is Free Software; you can
57
redistribute it and/or modify it under the terms of the GNU General
58
Public License as published by the Free Software Foundation; version 2
59
dated June, 1991, or any later version (at your choice).
60
61
This program is distributed in the hope that it will be useful, but
62
WITHOUT ANY WARRANTY; without even the implied warranty of
63
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
64
General Public License for more details.
65
66
You should have received a copy of the GNU General Public License
67
along with this program; if not, write to the Free Software
68
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
69
USA.
70
71
=cut
72
73
use strict;
74
use warnings;
75 ff4c91ac Stig Sandbeck Mathisen
76
# This evil "eval" is to make Travis CI able to test the plugin syntax
77
# without having a perl built with threads.
78
#
79
# Also: The use of interpreter-based threads in perl is officially
80
# discouraged.
81
eval 'use threads; 1;' or die 'Could not use threads';
82
83 2969fd43 Gunnar Wolf
use Net::Ping;
84
my (%defaults, @hosts, $cmd_arg);
85
86
%defaults = (port => 80, timeout => 2, unreachable => -0.01);
87
@hosts = get_hosts($ENV{hosts});
88
die "Hosts not set - cannot continue\n" unless @hosts;
89
90
$cmd_arg = $ARGV[0] || '';
91
config() if($cmd_arg eq "config");
92
autoconf() if ($cmd_arg eq 'autoconf');
93
94 17f78427 Lars Kruse
for my $host (@hosts) {
95 2969fd43 Gunnar Wolf
    threads->new(\&ping_host, $host)
96
}
97
98
map {$_->join} threads->list;
99
exit 0;
100
101
sub ping_host {
102
    my ($host, $addr, $p, $ret, $time, $ip);
103
    $host = shift;
104
    $addr = host_label_for($host);
105
106
    $p=Net::Ping->new("tcp", $defaults{timeout});
107
    $p->hires();
108
    $p->{port_num} = $host->[1] || $defaults{port};
109
110
    ($ret, $time, $ip) = $p->ping($host->[0]);
111
112
    $time = $defaults{unreachable} if !$ret;
113
    print "${addr}.value $time\n";
114
}
115
116
sub get_hosts {
117
    # Hosts are defined in the 'hosts' environment variable. It's a list of
118
    # hosts (and optionally ports) - We parse the list and arrange it neatly
119
    # to be easily consumed.
120
    my ($hostsdef, @hosts);
121
    $hostsdef = shift;
122
    return unless $hostsdef;
123
124
    for my $host (split(/,/, $hostsdef)) {
125
	$host =~ s/\s//g;
126
127
	$host =~ /^(?:([^:]+))
128
	    (?::(\d+))?$/x;
129
130
	push @hosts, [$1, $2 || $defaults{port}];
131
132
    }
133
134
    return @hosts;
135
}
136
137
sub config {
138
    my @res = ("graph_title TCP connection times",
139
	       "graph_args --base 1000 -l 0",
140
	       "graph_vlabel seconds",
141
	       "graph_category network",
142
	       "graph_info Shows the time to establish a TCP connection");
143
    for my $host (@hosts) {
144
	my $addr = host_label_for($host);
145
	push @res, "$addr.label $addr";
146
	push @res, "$addr.draw LINE2";
147
	push @res, "$addr.info Time to establish TCP connection to " .
148
	    "$host->[0]:$host->[1]";
149
150
    }
151
152
    print map {"$_\n"} @res;
153
    exit 0;
154
}
155
156
sub autoconf {
157
    print "yes\n";
158
    exit 0;
159
}
160
161
sub host_label_for {
162
    my ($ip, $port) = @{$_[0]};
163
    # Periods and colonsare not allowed in variable names
164
    my $addr = "src_${ip}_${port}";
165
    $addr =~ s/\./_/g;
166
    return $addr;
167
}