#!/usr/bin/perl -w use strict; use IO::Handle; use Socket; use Sys::Hostname; use Getopt::Std; STDERR->autoflush(1); STDOUT->autoflush(1); # getopts "H:p:b:a:v:s:t: # b: base dn; a: atrib; v: value of attrib; s: search string; t: timeout use vars qw($opt_d $opt_h $opt_H $opt_p $opt_b $opt_a $opt_v $opt_s $opt_t); getopts("dhH:p:b:a:v:s:t:"); our $Usage = < [-p ] [-t ] -b -a -v -s EOUSAGE (print $Usage and exit 3) if $opt_h; if (!defined($opt_H) or !defined($opt_b) or !defined($opt_a) or !defined($opt_v) or !defined($opt_s)) { print $Usage; exit 3; } our $debug = $opt_d; our $ThatHost = $opt_H; our $ThatPort = defined($opt_p) ? $opt_p : 80; our $TIMEOUT = defined($opt_t) ? $opt_t : 10; # our $BaseDN = "o=Princeton University,c=US"; # our $Attrib = "uid"; # our $Value = "esm"; our $BaseDN = $opt_b; our $Attrib = $opt_a; our $Value = $opt_v; our $SearchFor = $opt_s; our @Result; our $DSML = < $Value End_Of_Query our $LengthOfDSML = length($DSML); our $ThisHost = hostname(); our ($AfInet, $SockStream, $SockAddr) = (AF_INET, SOCK_STREAM, 'S n a4 x8'); our ($Name, $Aliases, $Proto) = getprotobyname('tcp'); our ($Type, $Length) = (undef, undef); our @ThisAddr = (); our @ThatAddr = (); ($Name, $Aliases, $Type, $Length, @ThisAddr) = gethostbyname($ThisHost); ($Name, $Aliases, $Type, $Length, @ThatAddr) = gethostbyname($ThatHost); our $This = pack ($SockAddr, $AfInet, 0, $ThisAddr[0]); our $That = pack ($SockAddr, $AfInet, $ThatPort, $ThatAddr[0]); if (socket(SOCKET, $AfInet, $SockStream, $Proto)) { print STDOUT "TCP socket created\n" if $debug; } else { print "CRITICAL: Cannot connect to $ThatHost:$ThatPort\n"; exit 2; } ## if (bind(SOCKET, $This)) { ## print STDOUT "Bound to $ThisHost\n"; ## } else { ## die "Cannot bind to $ThisHost; $!\n"; ## } ## our $Error = sprintf 'Timeout connecting to port %u of %s', $ThatPort, $ThatHost; our $Error = ''; $SIG{ALRM} = sub { print "CRITICAL: Timeout connecting to $ThatHost:$ThatPort\n"; exit 2; }; alarm($TIMEOUT) if $TIMEOUT > 0; if (connect(SOCKET, $That)) { printf STDOUT "Connected to port %u of %s\n", $ThatPort, $ThatHost if $debug; } else { print "CRITICAL: Cannot connect to $ThatHost:$ThatPort\n"; exit 2; } alarm(0); $SIG{ALRM} = 'DEFAULT'; SOCKET->autoflush(1); our $HTTPandDSML = < 0; print STDOUT $HTTPandDSML if $debug; print SOCKET $HTTPandDSML; while () { print STDOUT if $debug; chop; push @Result, $_; next unless m||is; $Error = ''; last; } alarm(0); $SIG{ALRM} = 'DEFAULT'; close SOCKET; if ($Result[0] !~ /HTTP\/.*200 OK/) { print "CRITICAL: DSML query returned $Result[0]\n"; exit 2; } my $s; foreach $s (@Result) { if ($s =~ /$SearchFor/) { print "OK: lookup of $Attrib=$Value succeeded\n"; exit 0; } } print "CRITICAL: lookup of $Attrib=$Value failed\n"; exit 2;