[Nagiosplug-checkins] nagiosplug/contrib check_wins.pl,1.2,1.3
Stanley Hopcroft
stanleyhopcroft at users.sourceforge.net
Wed Nov 24 20:47:06 CET 2004
Update of /cvsroot/nagiosplug/nagiosplug/contrib
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23897
Modified Files:
check_wins.pl
Log Message:
Non functional tidy ups to check_wins
Index: check_wins.pl
===================================================================
RCS file: /cvsroot/nagiosplug/nagiosplug/contrib/check_wins.pl,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- check_wins.pl 20 Aug 2003 08:31:49 -0000 1.2
+++ check_wins.pl 25 Nov 2004 04:46:16 -0000 1.3
@@ -1,251 +1,248 @@
-#!/usr/bin/perl -w
-
-# $Id$
-
+#!/usr/bin/perl -w
+
+# $Id$
+
# $Log$
+# Revision 1.3 2004/11/25 04:46:16 stanleyhopcroft
+# Non functional tidy ups to check_wins
+#
# Revision 1.2 2003/08/20 08:31:49 tonvoon
# Changed netsaint to nagios in use lib
#
# Revision 1.1 2003/02/09 14:16:28 sghosh
# more contribs
-#
-
-use strict ;
-
-use Getopt::Long ;
-use vars qw($opt_H $opt_D $opt_W $opt_T $debug @my_dcs);
-
-use lib '/usr/local/nagios/libexec/' ;
-use utils qw($TIMEOUT %ERRORS &print_revision &support &usage);
-
-my $PROGNAME = 'check_wins' ;
-
-use constant SAMBA_DEBUG_LVL => 2 ;
-use constant MY_DCS => ('dc1','dc2') ;
-# use constant MY_DCS => qw(ipa01 ipa02 ipa03) ;
-
-my $NMBLOOKUP_PATH = '/usr/bin/nmblookup' ;
-my $NMBLOOKUP = sub { return `$NMBLOOKUP_PATH $_[2] -R -U $_[0] $_[1]` } ;
-my $NMBLOOKUP_CMD = $NMBLOOKUP_PATH . ' -R -U' ;
-
-sub print_help ();
-sub print_usage ();
-sub help ();
-sub version ();
-
-delete @ENV{'PATH', 'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
-
-$SIG{"ALRM"} = sub { die "Alarm clock restart" } ;
-
-Getopt::Long::Configure('bundling', 'no_ignore_case');
-GetOptions
- ("V|version" => \&version,
- "h|help" => \&help,
- "d|debug" => \$debug,
- "C|controllers:s" => \@my_dcs,
- "T|timeout:i" => \$opt_T,
- "W|wins=s" => \$opt_W,
- "D|domain=s" => \$opt_D);
-
-
-($opt_D) || usage("MS Domain name not specified\n");
-my $domain = $1 if $opt_D =~ m#(\w+)# ; # NetBIOS names allow __any__ characters (more than \w)
-($domain) || usage("Invalid MS D name: $opt_D\n");
-
-($opt_W) || usage("WINS hostname or address not specified\n");
-my $wins = $1 if $opt_W =~ m#((?:^\w+$)|(?:\d+(?:\.\d+){3,3}$))# ;
-($wins) || usage("Invalid WINS hostname or address: $opt_W\n");
-
-usage("You must provide the names of your domain controllers by updating MY_DCS in the text or use -C dc_name1 -C dc_name2 ..\n")
- unless (@my_dcs or MY_DCS) ;
-
- at my_dcs = MY_DCS unless defined $my_dcs[0] ;
-$TIMEOUT = $opt_T if defined $opt_T ;
-
-my ($netbios_name, @dcs_of_domain, @dc_addresses) ;
-my (@addr_dcs_of_domain, @found_dcs, %address2dc) ;
-my (@dc_query) ;
-
-# tsitc> /usr/local/samba/bin/nmblookup -R -U wins ipa01
-# Sending queries to 10.0.100.29
-# 10.0.100.16 ipa01<00>
-
-eval {
- alarm($TIMEOUT) ;
- @dc_query = $debug ? map { $NMBLOOKUP->($wins, "$_#20", '-d ' . SAMBA_DEBUG_LVL) } @my_dcs :
- map { ( $NMBLOOKUP->($wins, "$_#20", '') )[1] } @my_dcs ;
- alarm(0) ;
-} ;
-
-if ($@ and $@ =~ /Alarm clock restart/) {
- print qq(Failed. Timeout while waiting for response from (one of) "$NMBLOOKUP_CMD $wins @my_dcs"\n) ;
- exit $ERRORS{"CRITICAL"} ;
-}
-
-if ($@ and $@ !~ /Alarm clock restart/) {
- print qq(Failed. "$@" in response to "NMBLOOKUP_CMD $wins @my_dcs"\n) ;
- exit $ERRORS{"UNKNOWN"} ;
-}
-
-chomp @dc_query ;
-if ( scalar grep(/name_query failed/, @dc_query) ) {
- print qq(Failed. WINS "$wins" failed to resolve), scalar @my_dcs > 1 ? ' at least one of ' : ' ', qq("@my_dcs", the domain controller(s) of "$domain". Got "@dc_query"\n) ;
- exit $ERRORS{"CRITICAL"} ;
-}
-
-# the results of looking up the DCs (by their name) in the WINS
-
-# 10.0.100.16 ipa01<20>
-# 10.0.100.1 ipa02<20>
-# 10.0.100.104 ipa03<20>
-
- at dc_addresses = () ;
-foreach (@dc_query) {
- next unless /^(\S+)\s+(\S+?)<\S+?>$/ ;
- $address2dc{$1} = $2 ;
- push @dc_addresses, $1 ;
-}
-
-$netbios_name = "$domain#1C" ;
-
-eval {
- alarm($TIMEOUT) ;
- @dcs_of_domain = $NMBLOOKUP->($wins, $netbios_name, defined $debug ? '-d ' . SAMBA_DEBUG_LVL : '') ;
- alarm(0) ;
-
-} ;
-
-if ($@ and $@ =~ /Alarm clock restart/) {
- print qq(Failed. Timeout while waiting for response from "$NMBLOOKUP_CMD $wins $netbios_name"\n) ;
- exit $ERRORS{"CRITICAL"} ;
-}
-
-if ($@ and $@ !~ /Alarm clock restart/) {
- print qq(Failed. "$@" in response to "$NMBLOOKUP_CMD $wins $netbios_name"\n) ;
- exit $ERRORS{"UNKNOWN"} ;
-}
-
-shift @dcs_of_domain ;
-chomp @dcs_of_domain ;
- at addr_dcs_of_domain = map /^(\S+)/, @dcs_of_domain ;
-
-# tsitc> /usr/local/samba/bin/nmblookup -R -U wins ipaustralia#1c
-# Sending queries to 10.0.100.29
-# 10.0.100.114 ipaustralia<1c>
-# 168.168.102.129 ipaustralia<1c>
-# 192.168.101.221 ipaustralia<1c>
-# 10.0.100.61 ipaustralia<1c>
-# 192.168.108.129 ipaustralia<1c>
-# 192.168.102.128 ipaustralia<1c>
-# 10.0.4.126 ipaustralia<1c>
-# 192.168.106.214 ipaustralia<1c>
-# 10.0.3.165 ipaustralia<1c>
-# 192.168.105.214 ipaustralia<1c>
-# 10.0.6.145 ipaustralia<1c>
-# 192.168.104.128 ipaustralia<1c>
-# 10.0.4.59 ipaustralia<1c>
-# 10.9.99.99 ipaustralia<1c>
-# 10.99.99.99 ipaustralia<1c>
-# 10.9.99.254 ipaustralia<1c>
-# 10.0.3.15 ipaustralia<1c>
-# 192.168.102.129 ipaustralia<1c>
-# 192.168.103.129 ipaustralia<1c>
-# 192.168.105.129 ipaustralia<1c>
-# 192.168.106.129 ipaustralia<1c>
-# 192.168.101.129 ipaustralia<1c>
-# 192.168.104.129 ipaustralia<1c>
-# 10.0.3.123 ipaustralia<1c>
-# 10.0.100.67 ipaustralia<1c>
-# tsitc>
-
-my %x ;
- at found_dcs = grep { ! $x{$_}++ } @address2dc{ grep exists $address2dc{$_}, @addr_dcs_of_domain} ;
-# @found_dcs = grep { defined $_} @address2dc{ grep exists $address2dc{$_}, @addr_dcs_of_domain} ;
- # Gotcha.
- # 'exists' is necessary to prevent autovivificatiton
- # of keys in %address2dc
-
-if ( &set_eq( \@found_dcs, [ values %address2dc ] ) ) {
- print $debug ? qq(Ok. WINS named "$wins" resolved addresses of "@my_dcs" as "@dc_query" and controllers of domain "$domain" as "@dcs_of_domain"\n) :
- qq(Ok. Found controllers named "@my_dcs" in response to "$domain#1C" name query from WINS named "$wins".\n) ;
- exit $ERRORS{"OK"} ;
-} elsif ( scalar @found_dcs == 0 ) {
- print qq(Failed. Found __no__ controllers named "@my_dcs" in response to "$domain#1C" query from WINS named "$wins". Got "@dcs_of_domain"\n) ;
- exit $ERRORS{"CRITICAL"} ;
-} elsif ( scalar @found_dcs < scalar keys %address2dc ) {
- print qq(Warning. Not all domain controllers found in response to "$domain#1C" query from WINS named "$wins". Expected "@my_dcs", got "@found_dcs"\n) ;
- exit $ERRORS{"WARNING"} ;
-}
-
-sub set_eq {
-
- return 0 unless scalar @{$_[0]} == scalar @{$_[1]} ;
- foreach my $a ( @{$_[0]} ) {
- return 0 unless scalar grep { $a eq $_ } @{$_[1]} ;
- }
- return 1 ;
-
-}
-
-
-sub print_usage () {
- print "Usage: $PROGNAME -W <wins> -D <domain>\n";
-}
-
-sub print_help () {
- print_revision($PROGNAME,'$Revision$ ');
- print "Copyright (c) 2001 Karl DeBisschop/S Hopcroft
-
-Perl Check WINS plugin for NetSaint.
-
-Returns OK if the addresses of domain controllers are found in the list of domain controllers returned in the WINS response to a 'domain controllers query'
-
-Why would you want to do this ?
-
-MS File server clients insist on connecting to file servers using NetBIOS names.
-If they __don't__ resolve NetBIOS names with a WINS (NBNS) then they'll either fail to logon and connect to shares or they will
-broadcast requsts for names.
-Both problems are eliminated by a healthy WINS.
-Also, you may have a MS domain spanning a number of WAN connected sites, with domain controllers far away from powerful local
-domain controllers.
-In this case, you want your local clients to have their logon requests validated by the local controllers.
-
-The plugin works by
- asking the WINS to resolve the addresses of the domain controllers (supplied by -C or from the constant MY_DCS)
- asking the WINS to return the list of addresses of the domain controllers able to validate requests for the domain
- whose name is given by -D
- returning Ok if all controller addresses are in that list (of addresses of domain controllers) or
- returning WARNING if not all the controller addresses are in the list or
- returning CRITICAL if there is no reply from the WINS or the list contains none of the contoller addresses
-
-";
- print_usage();
- print '
--W, --wins=STRING
- Hostname or address of the WINS (Either Samba/nmbd or MS product)
--D, --domain=STRING
- MS Domain name to find the Domain controllers of.
--C, --controllers:STRING
- Optional __name(s)__ of domain controller that __must__ be found in the response to a domain controller name query.
- If not defined, then use the constant value MY_DCS. You must use either -C or make sure that MY_DCS contains the names
- of __your__ domain controllers.
--T, --timeout:INTEGER
--d, --debug
- Debugging output.
--h, --help
- This stuff.
-
-';
- support();
-}
-
-sub version () {
- print_revision($PROGNAME,'$Revision$ ');
- exit $ERRORS{'OK'};
-}
-
-sub help () {
- print_help();
- exit $ERRORS{'OK'};
-}
-
+#
+
+use strict ;
+
+use Getopt::Long ;
+use vars qw($opt_H $opt_D $opt_W $opt_T $debug @my_dcs);
+
+use lib '/usr/local/nagios/libexec/' ;
+use utils qw($TIMEOUT %ERRORS &print_revision &support &usage);
+
+my $PROGNAME = 'check_wins' ;
+
+use constant SAMBA_DEBUG_LVL => 2 ;
+use constant MY_DCS => ('dc1','dc2') ;
+
+my $NMBLOOKUP_PATH = '/usr/bin/nmblookup' ;
+my $NMBLOOKUP = sub { return `$NMBLOOKUP_PATH $_[2] -R -U $_[0] $_[1]` } ;
+my $NMBLOOKUP_CMD = $NMBLOOKUP_PATH . ' -R -U' ;
+
+sub print_help ();
+sub print_usage ();
+sub help ();
+sub version ();
+
+delete @ENV{'PATH', 'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
+
+$SIG{"ALRM"} = sub { die "Alarm clock restart" } ;
+
+Getopt::Long::Configure('bundling', 'no_ignore_case');
+GetOptions
+ ("V|version" => \&version,
+ "h|help" => \&help,
+ "d|debug" => \$debug,
+ "C|controllers:s" => \@my_dcs,
+ "T|timeout:i" => \$opt_T,
+ "W|wins=s" => \$opt_W,
+ "D|domain=s" => \$opt_D);
+
+
+($opt_D) || usage("MS Domain name not specified\n");
+my $domain = $1 if $opt_D =~ m#(\w+)# ; # NetBIOS names allow __any__ characters (more than \w)
+($domain) || usage("Invalid MS D name: $opt_D\n");
+
+($opt_W) || usage("WINS hostname or address not specified\n");
+my $wins = $1 if $opt_W =~ m#((?:^\w+$)|(?:\d+(?:\.\d+){3,3}$))# ;
+($wins) || usage("Invalid WINS hostname or address: $opt_W\n");
+
+usage("You must provide the names of your domain controllers by updating MY_DCS in the text or use -C dc_name1 -C dc_name2 ..\n")
+ unless (@my_dcs or MY_DCS) ;
+
+ at my_dcs = MY_DCS unless defined $my_dcs[0] ;
+$TIMEOUT = $opt_T if defined $opt_T ;
+
+my ($netbios_name, @dcs_of_domain, @dc_addresses) ;
+my (@addr_dcs_of_domain, @found_dcs, %address2dc) ;
+my (@dc_query) ;
+
+# tsitc> /usr/local/samba/bin/nmblookup -R -U wins ipa01
+# Sending queries to 192.168.1.29
+# 192.168.1.16 ipa01<00>
+
+eval {
+ alarm($TIMEOUT) ;
+ @dc_query = $debug ? map { $NMBLOOKUP->($wins, "$_#20", '-d ' . SAMBA_DEBUG_LVL) } @my_dcs :
+ map { ( $NMBLOOKUP->($wins, "$_#20", '') )[1] } @my_dcs ;
+ alarm(0) ;
+} ;
+
+if ($@ and $@ =~ /Alarm clock restart/) {
+ print qq(Failed. Timeout while waiting for response from (one of) "$NMBLOOKUP_CMD $wins @my_dcs"\n) ;
+ exit $ERRORS{"CRITICAL"} ;
+}
+
+if ($@ and $@ !~ /Alarm clock restart/) {
+ print qq(Failed. "$@" in response to "NMBLOOKUP_CMD $wins @my_dcs"\n) ;
+ exit $ERRORS{"UNKNOWN"} ;
+}
+
+chomp @dc_query ;
+if ( scalar grep(/name_query failed/, @dc_query) ) {
+ print qq(Failed. WINS "$wins" failed to resolve), scalar @my_dcs > 1 ? ' at least one of ' : ' ', qq("@my_dcs", the domain controller(s) of "$domain". Got "@dc_query"\n) ;
+ exit $ERRORS{"CRITICAL"} ;
+}
+
+=begin comment
+
+the results of looking up the DCs (by their name) in the WINS
+
+192.168.1.16 ipa01<20>
+192.168.1.1 ipa02<20>
+192.168.1.104 ipa03<20>
+
+=end comment
+
+=cut
+
+ at dc_addresses = () ;
+foreach (@dc_query) {
+ next unless /^(\S+)\s+(\S+?)<\S+?>$/ ;
+ $address2dc{$1} = $2 ;
+ push @dc_addresses, $1 ;
+}
+
+$netbios_name = "$domain#1C" ;
+
+eval {
+ alarm($TIMEOUT) ;
+ @dcs_of_domain = $NMBLOOKUP->($wins, $netbios_name, defined $debug ? '-d ' . SAMBA_DEBUG_LVL : '') ;
+ alarm(0) ;
+
+} ;
+
+if ($@ and $@ =~ /Alarm clock restart/) {
+ print qq(Failed. Timeout while waiting for response from "$NMBLOOKUP_CMD $wins $netbios_name"\n) ;
+ exit $ERRORS{"CRITICAL"} ;
+}
+
+if ($@ and $@ !~ /Alarm clock restart/) {
+ print qq(Failed. "$@" in response to "$NMBLOOKUP_CMD $wins $netbios_name"\n) ;
+ exit $ERRORS{"UNKNOWN"} ;
+}
+
+shift @dcs_of_domain ;
+chomp @dcs_of_domain ;
+ at addr_dcs_of_domain = map /^(\S+)/, @dcs_of_domain ;
+
+=begin comment
+
+tsitc> /usr/local/samba/bin/nmblookup -R -U wins ipaustralia#1c
+Sending queries to 192.168.1.29
+192.168.1.114 ipaustralia<1c>
+192.168.1.221 ipaustralia<1c>
+192.168.1.61 ipaustralia<1c>
+192.168.1.129 ipaustralia<1c>
+192.168.1.128 ipaustralia<1c>
+192.168.1.214 ipaustralia<1c>
+192.168.1.67 ipaustralia<1c>
+tsitc>
+
+=end comment
+
+=cut
+
+
+my %x ;
+ at found_dcs = grep { ! $x{$_}++ } @address2dc{ grep exists $address2dc{$_}, @addr_dcs_of_domain} ;
+# @found_dcs = grep { defined $_} @address2dc{ grep exists $address2dc{$_}, @addr_dcs_of_domain} ;
+ # Gotcha.
+ # 'exists' is necessary to prevent autovivificatiton
+ # of keys in %address2dc
+
+if ( &set_eq( \@found_dcs, [ values %address2dc ] ) ) {
+ print $debug ? qq(Ok. WINS named "$wins" resolved addresses of "@my_dcs" as "@dc_query" and controllers of domain "$domain" as "@dcs_of_domain"\n) :
+ qq(Ok. Found controllers named "@my_dcs" in response to "$domain#1C" name query from WINS named "$wins".\n) ;
+ exit $ERRORS{"OK"} ;
+} elsif ( scalar @found_dcs == 0 ) {
+ print qq(Failed. Found __no__ controllers named "@my_dcs" in response to "$domain#1C" query from WINS named "$wins". Got "@dcs_of_domain"\n) ;
+ exit $ERRORS{"CRITICAL"} ;
+} elsif ( scalar @found_dcs < scalar keys %address2dc ) {
+ print qq(Warning. Not all domain controllers found in response to "$domain#1C" query from WINS named "$wins". Expected "@my_dcs", got "@found_dcs"\n) ;
+ exit $ERRORS{"WARNING"} ;
+}
+
+sub set_eq {
+
+ return 0 unless scalar @{$_[0]} == scalar @{$_[1]} ;
+ foreach my $a ( @{$_[0]} ) {
+ return 0 unless scalar grep { $a eq $_ } @{$_[1]} ;
+ }
+ return 1 ;
+
+}
+
+
+sub print_usage () {
+ print "Usage: $PROGNAME -W <wins> -D <domain>\n";
+}
+
+sub print_help () {
+ print_revision($PROGNAME,'$Revision$ ');
+ print "Copyright (c) 2001 Karl DeBisschop/S Hopcroft
+
+Perl Check WINS plugin for NetSaint.
+
+Returns OK if the addresses of domain controllers are found in the list of domain controllers returned in the WINS response to a 'domain controllers query'
+
+Why would you want to do this ?
+
+MS File server clients insist on connecting to file servers using NetBIOS names.
+If they __don't__ resolve NetBIOS names with a WINS (NBNS) then they'll either fail to logon and connect to shares or they will
+broadcast requsts for names.
+Both problems are eliminated by a healthy WINS.
+Also, you may have a MS domain spanning a number of WAN connected sites, with domain controllers far away from powerful local
+domain controllers.
+In this case, you want your local clients to have their logon requests validated by the local controllers.
+
+The plugin works by
+ asking the WINS to resolve the addresses of the domain controllers (supplied by -C or from the constant MY_DCS)
+ asking the WINS to return the list of addresses of the domain controllers able to validate requests for the domain
+ whose name is given by -D
+ returning Ok if all controller addresses are in that list (of addresses of domain controllers) or
+ returning WARNING if not all the controller addresses are in the list or
+ returning CRITICAL if there is no reply from the WINS or the list contains none of the contoller addresses
+
+";
+ print_usage();
+ print '
+-W, --wins=STRING
+ Hostname or address of the WINS (Either Samba/nmbd or MS product)
+-D, --domain=STRING
+ MS Domain name to find the Domain controllers of.
+-C, --controllers:STRING
+ Optional __name(s)__ of domain controller that __must__ be found in the response to a domain controller name query.
+ If not defined, then use the constant value MY_DCS. You must use either -C or make sure that MY_DCS contains the names
+ of __your__ domain controllers.
+-T, --timeout:INTEGER
+-d, --debug
+ Debugging output.
+-h, --help
+ This stuff.
+
+';
+ support();
+}
+
+sub version () {
+ print_revision($PROGNAME,'$Revision$ ');
+ exit $ERRORS{'OK'};
+}
+
+sub help () {
+ print_help();
+ exit $ERRORS{'OK'};
+}
+
More information about the Commits
mailing list