[Mon-commit] mon-contrib/monitors/udp udp.monitor,NONE,1.1
Brought to you by:
trockij
|
From: David N. <vi...@us...> - 2005-02-19 17:43:38
|
Update of /cvsroot/mon/mon-contrib/monitors/udp In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10471 Added Files: udp.monitor Log Message: Adding udp.monitor, udp equivelant of tcp.monitor. --- NEW FILE: udp.monitor --- #!/usr/bin/perl -w # # try to connect to a particular # port on a bunch of hosts. For use with "mon". # # Arguments are "[-p port] [-t timeout] [-r local-port] host [host...]" # # David Nolan, vi...@cm... # based on tcp.monitor by Jim Trocki, tr...@tr... # # $Id: udp.monitor,v 1.1 2005/02/19 17:43:21 vitroth Exp $ # # Copyright (C) 1998, Jim Trocki # # 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 2 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, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # use Getopt::Std; use Socket; use Sys::Hostname; my %opt; getopts ("p:r:t:", \%opt); my $PORT = $opt{"p"} || 23; my $TIMEOUT = $opt{"t"} || 10; my $RECVPORT = $opt{"r"}; my @failures = (); my @detail = (); my $ALARM = 0; foreach my $host (@ARGV) { my $pro = getprotobyname ('udp'); if (!defined $pro) { die "could not getprotobyname\n"; } if (!defined socket (S, PF_INET, SOCK_DGRAM, $pro)) { die "could not create socket: $!\n"; } my $a = inet_aton ($host); if (!defined $a) { push @failures, $host; push @detail, "$host could not inet_aton"; close (S); next; } my $sin = sockaddr_in ($PORT, $a); if (!defined $sin) { push @failures, $host; push @detail, "$host could not sockaddr_in"; close (S); next; } if (defined $RECVPORT) { $iaddr = gethostbyname(hostname()); $paddr = sockaddr_in($RECVPORT, $iaddr); $res = bind(S, $paddr); if (!$res) { push @failures, $host; push @detail, "$host: Could not bind to local port $RECVPORT"; close (S); next; } } my ($r, $from); eval { local $SIG{"ALRM"} = sub { die "alarm\n" }; alarm $TIMEOUT; send (S, "", 0, $sin); $from = recv(S, $r, 1, 0); alarm 0; }; if ($@) { push @failures, $host; if ($@ eq "alarm\n") { push @detail, "$host timeout"; } else { push @detail, "$host interrupted syscall: $!"; } close (S); next; } if (!defined $r) { push @failures, $host; push @detail, "$host no udp response packet received: $!"; close (S); next; } my ($fromport, $fromaddr) = sockaddr_in($from); if ($fromport != $PORT || $fromaddr ne $a) { push @failures, $host; my $fromhost = gethostbyaddr($fromaddr, AF_INET); push @detail, "response received from $fromhost:$fromport, instead of $host:$PORT"; next; } if (!defined close (S)) { push @failures, $host; push @detail, "$host could not close socket: $!"; next; } } if (@failures == 0) { exit 0; } print join (" ", sort @failures), "\n"; print "\n", join ("\n", @detail), "\n"; exit 1; |