version 1.1, 2005/04/22 18:42:57 |
version 1.3, 2006/08/29 23:26:31 |
|
|
#!/usr/bin/perl
|
#!/usr/bin/perl |
#
|
# $RedRiver: check_radius.pl,v 1.2 2005/08/25 00:56:07 andrew Exp $ |
# check_radius.pl - nagios plugin
|
# |
#
|
# check_radius.pl - nagios plugin |
#
|
# |
# Copyright (C) 2003 andrew fresh
|
# |
#
|
# Copyright (C) 2003 andrew fresh |
# This program is free software; you can redistribute it and/or
|
# |
# modify it under the terms of the GNU General Public License
|
# This program is free software; you can redistribute it and/or |
# as published by the Free Software Foundation; either version 2
|
# modify it under the terms of the GNU General Public License |
# of the License, or (at your option) any later version.
|
# 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
|
# This program is distributed in the hope that it will be useful, |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
# GNU General Public License for more details.
|
# 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
|
# You should have received a copy of the GNU General Public License |
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# along with this program; if not, write to the Free Software |
#
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
#
|
# |
# Report bugs to: andrew@mad-techies.org
|
# |
#
|
# Report bugs to: andrew@mad-techies.org |
# 11.26.2000 Version 1.0
|
# |
#
|
# 11.26.2000 Version 1.0 |
# $Id$
|
# |
|
# $Id$ |
use strict;
|
|
use warnings;
|
use strict; |
use diagnostics;
|
use warnings; |
|
use diagnostics; |
use POSIX;
|
|
use lib "C:/nrpe_nt/lib" ;
|
use POSIX; |
use utils qw($TIMEOUT %ERRORS &print_revision &support);
|
use lib "/usr/local/libexec/nagios"; |
|
use utils qw($TIMEOUT %ERRORS &print_revision &support); |
use Getopt::Long;
|
|
Getopt::Long::Configure('bundling');
|
use Getopt::Long; |
|
Getopt::Long::Configure('bundling'); |
my $PROGNAME = "check_radius";
|
|
|
my $PROGNAME = "check_radius"; |
my $state = 'UNKNOWN'; # tells whether the it is warning, critical, or OK
|
|
my $answer = ''; # stores the test of the errors
|
my $state = 'UNKNOWN'; # tells whether the it is warning, critical, or OK |
my $hostname = '';
|
my $answer = ''; # stores the test of the errors |
my $port = '';
|
my $hostname = ''; |
my $secret = '';
|
my $port = ''; |
my $user = '';
|
my $secret = ''; |
my $pwd = '';
|
my $user = ''; |
my $timeout = 5;
|
my $pwd = ''; |
my %states; # This stores the count of states;
|
my $timeout = 5; |
my $file;
|
my %states; # This stores the count of states; |
my $opt_h ;
|
my $file; |
my $opt_V ;
|
my $opt_h ; |
|
my $opt_V ; |
|
|
# Just in case of problems, let's not hang Nagios
|
|
$SIG{'ALRM'} = sub {
|
# Just in case of problems, let's not hang Nagios |
print ("ERROR: No radius response from $hostname (alarm timeout)\n");
|
$SIG{'ALRM'} = sub { |
exit $ERRORS{"UNKNOWN"};
|
print ("ERROR: No radius response from $hostname (alarm timeout)\n"); |
};
|
exit $ERRORS{"UNKNOWN"}; |
alarm($TIMEOUT);
|
}; |
|
alarm($TIMEOUT); |
|
|
|
|
#Option checking
|
|
my $status = GetOptions(
|
#Option checking |
"V" => \$opt_V, "version" => \$opt_V,
|
my $status = GetOptions( |
"h" => \$opt_h, "help" => \$opt_h,
|
"V" => \$opt_V, "version" => \$opt_V, |
"H=s" => \$hostname, "hostname=s" => \$hostname,
|
"h" => \$opt_h, "help" => \$opt_h, |
"s=s" => \$secret, "secret=s" => \$secret,
|
"H=s" => \$hostname, "hostname=s" => \$hostname, |
"P=i" => \$port, "port=i" => \$port,
|
"s=s" => \$secret, "secret=s" => \$secret, |
"u=s" => \$user, "username=s" => \$user,
|
"P=i" => \$port, "port=i" => \$port, |
"p=s" => \$pwd, "password=s" => \$pwd,
|
"u=s" => \$user, "username=s" => \$user, |
"t=i" => \$timeout, "timeout=i"=> \$timeout,
|
"p=s" => \$pwd, "password=s" => \$pwd, |
);
|
"t=i" => \$timeout, "timeout=i"=> \$timeout, |
|
); |
if ($status == 0)
|
|
{
|
if ($status == 0) |
print_help() ;
|
{ |
exit $ERRORS{'OK'};
|
print_help() ; |
}
|
exit $ERRORS{'OK'}; |
|
} |
|
|
if ($opt_V) {
|
|
print_revision($PROGNAME,'$Revision$ ');
|
if ($opt_V) { |
exit $ERRORS{'OK'};
|
print_revision($PROGNAME,'$Revision$ '); |
}
|
exit $ERRORS{'OK'}; |
|
} |
if ($opt_h) {
|
|
print_help();
|
if ($opt_h) { |
exit $ERRORS{'OK'};
|
print_help(); |
}
|
exit $ERRORS{'OK'}; |
|
} |
unless ($hostname && $secret && $user && $pwd) {
|
|
print_help();
|
unless ($hostname && $secret && $user && $pwd) { |
exit $ERRORS{'OK'};
|
print_help(); |
}
|
exit $ERRORS{'OK'}; |
|
} |
if ($port) {
|
|
$hostname .= ":" . $port;
|
if ($port) { |
}
|
$hostname .= ":" . $port; |
|
} |
use Authen::Radius;
|
|
|
use Authen::Radius; |
#print "Creating Client . . . ";
|
|
my $r = new Authen::Radius(Host => $hostname, Secret => $secret, Timeout => $timeout);
|
#print "Creating Client . . . "; |
#print defined $r ? "" : "not ", "ok\n";
|
my $r = new Authen::Radius(Host => $hostname, Secret => $secret, Timeout => $timeout); |
|
#print defined $r ? "" : "not ", "ok\n"; |
unless (defined $r) {
|
|
done('UNKNOWN', "Couldn't create socket!");
|
unless (defined $r) { |
}
|
done('UNKNOWN', "Couldn't create socket!"); |
|
} |
|
|
$r->clear_attributes;
|
|
|
$r->clear_attributes; |
$r->add_attributes (
|
|
{ Name => 1, Value => $user, Type => 'string' }, # Username
|
$r->add_attributes ( |
{ Name => 2, Value => $pwd, Type => 'string' }, # Password
|
{ Name => 1, Value => $user, Type => 'string' }, # Username |
{ Name => 5, Value => '1', Type => 'integer' }, # NASPort
|
{ Name => 2, Value => $pwd, Type => 'string' }, # Password |
);
|
{ Name => 5, Value => '1', Type => 'integer' }, # NASPort |
|
); |
#print "Authenticating . . .";
|
|
my $snt = $r->send_packet(ACCESS_REQUEST);
|
#print "Authenticating . . ."; |
unless (defined $snt) {
|
my $snt = $r->send_packet(ACCESS_REQUEST); |
done('CRITICAL', "Couldn't sent authentication packet: " . $r->strerror($r->get_error));
|
unless (defined $snt) { |
}
|
done('CRITICAL', "Couldn't sent authentication packet: " . $r->strerror($r->get_error)); |
|
} |
$r->clear_attributes;
|
|
|
$r->clear_attributes; |
my $rcv = $r->recv_packet();
|
|
|
my $rcv = $r->recv_packet(); |
#print "" . (defined($rcv) and $rcv == ACCESS_ACCEPT) ? "" : "not ", "ok\n";
|
|
|
#print "" . (defined($rcv) and $rcv == ACCESS_ACCEPT) ? "" : "not ", "ok\n"; |
unless (defined $rcv) {
|
|
done ('CRITICAL', "Didn't recieve valid response: " . $r->strerror($r->get_error));
|
unless (defined $rcv) { |
}
|
done ('CRITICAL', "Didn't recieve valid response: " . $r->strerror($r->get_error)); |
|
} |
unless ($rcv == ACCESS_ACCEPT) {
|
|
done ('WARNING', "Access was denied for $user");
|
unless ($rcv == ACCESS_ACCEPT) { |
}
|
done ('WARNING', "Access was denied for $user"); |
|
} |
|
|
#my @a = $r->get_attributes;
|
|
#print "Attributes . . . ";
|
#my @a = $r->get_attributes; |
#print $#a != -1 ? "" : "not ", "ok\n";
|
#print "Attributes . . . "; |
#for $a (@a) {
|
#print $#a != -1 ? "" : "not ", "ok\n"; |
# print "attr: name=$a->{'Name'} value=$a->{'Value'}\n";
|
#for $a (@a) { |
#}
|
# print "attr: name=$a->{'Name'} value=$a->{'Value'}\n"; |
|
#} |
|
|
if ($state eq 'UNKNOWN') {
|
|
$state = 'OK';
|
if ($state eq 'UNKNOWN') { |
$answer = "User $user authenticated correctly!";
|
$state = 'OK'; |
}
|
$answer = "User $user authenticated correctly!"; |
|
} |
done($state, $answer);
|
|
|
done($state, $answer); |
sub done
|
|
{
|
sub done |
my $state = shift;
|
{ |
my $answer = shift;
|
my $state = shift; |
|
my $answer = shift; |
print "$state: ";
|
|
print $answer;
|
print "$state: "; |
exit $ERRORS{$state};
|
print $answer; |
}
|
exit $ERRORS{$state}; |
|
} |
sub print_help {
|
|
printf "$PROGNAME plugin for Nagios monitors radius authentication\n";
|
sub print_help { |
printf " $PROGNAME -H <HOSTNAME> -u <USERNAME> -p <PASSWORD>\n";
|
printf "$PROGNAME plugin for Nagios monitors radius authentication\n"; |
printf "\nUsage:\n";
|
printf " $PROGNAME -H <HOSTNAME> -u <USERNAME> -p <PASSWORD>\n"; |
printf " -H (--hostname) Hostname to query (required)\n";
|
printf "\nUsage:\n"; |
printf " -s (--secret) Radius Secret (required)\n";
|
printf " -H (--hostname) Hostname to query (required)\n"; |
printf " -P (--port) Radius auth port\n";
|
printf " -s (--secret) Radius Secret (required)\n"; |
printf " -u (--username) Username to try authenticating (required)\n";
|
printf " -P (--port) Radius auth port\n"; |
printf " -p (--password) Password to authenticate with (required)\n";
|
printf " -u (--username) Username to try authenticating (required)\n"; |
printf " -t (--timeout) Time to wait for response (defaults to 5 secs)\n";
|
printf " -p (--password) Password to authenticate with (required)\n"; |
printf " -h (--help) usage help \n\n";
|
printf " -t (--timeout) Time to wait for response (defaults to 5 secs)\n"; |
print_revision($PROGNAME, '$Revision$');
|
printf " -h (--help) usage help \n\n"; |
}
|
print_revision($PROGNAME, '$Revision$'); |
|
} |
|
|