Plugin:check ircd


 * 1) ! /usr/bin/perl -wT


 * 1) File Name:		check_ircd.pl
 * 2) Author:		Richard Mayhew - South Africa
 * 3) Date:			1999/09/20
 * 4) Description:		This script will check to see if an IRCD is running
 * 5) 			about how many users it has
 * 6) Email:		netsaint@splash.co.za
 * 7) Copyright 1999 (c) Richard Mayhew
 * 8) Credits go to Ethan Galstad for coding Nagios
 * 9) If any changes are made to this script, please mail me a copy of the
 * 10) changes :)
 * 11) Some code taken from Charlie Cook (check_disk.pl)
 * 12) License GPL
 * 13) Date		Author		Reason
 * 14) 1999/09/20	RM		Creation
 * 15) 1999/09/20	TP		Changed script to use strict, more secure by
 * 16) 				specifying $ENV variables. The bind command is
 * 17) 				still insecure through. Did most of my work
 * 18) 				with perl -wT and 'use strict'
 * 19) test using check_ircd.pl (irc-2.mit.edu|irc.erols.com|irc.core.com)
 * 20) 2002/05/02    SG		Fixed for Embedded Perl
 * 1) Some code taken from Charlie Cook (check_disk.pl)
 * 2) License GPL
 * 3) Date		Author		Reason
 * 4) 1999/09/20	RM		Creation
 * 5) 1999/09/20	TP		Changed script to use strict, more secure by
 * 6) 				specifying $ENV variables. The bind command is
 * 7) 				still insecure through. Did most of my work
 * 8) 				with perl -wT and 'use strict'
 * 9) test using check_ircd.pl (irc-2.mit.edu|irc.erols.com|irc.core.com)
 * 10) 2002/05/02    SG		Fixed for Embedded Perl
 * 1) 1999/09/20	TP		Changed script to use strict, more secure by
 * 2) 				specifying $ENV variables. The bind command is
 * 3) 				still insecure through. Did most of my work
 * 4) 				with perl -wT and 'use strict'
 * 5) test using check_ircd.pl (irc-2.mit.edu|irc.erols.com|irc.core.com)
 * 6) 2002/05/02    SG		Fixed for Embedded Perl
 * 1) test using check_ircd.pl (irc-2.mit.edu|irc.erols.com|irc.core.com)
 * 2) 2002/05/02    SG		Fixed for Embedded Perl


 * 1) [ Require ]--

require 5.004;


 * 1) ---[ Uses ]--

use Socket; use strict; use Getopt::Long; use vars qw($opt_V $opt_h $opt_t $opt_p $opt_H $opt_w $opt_c $verbose); use vars qw($PROGNAME); use lib "/usr/lib/nagios/plugins"; use utils qw($TIMEOUT %ERRORS &print_revision &support &usage);


 * 1) [ Function Prototypes ]--

sub print_help ; sub print_usage ; sub connection ($$$$); sub bindRemote ($$);


 * 1) -[ Enviroment ]--

$ENV{PATH} = ""; $ENV{ENV} = ""; $ENV{BASH_ENV} = "";


 * 1) -[ Global ]--

$PROGNAME = "check_ircd"; my $NICK="ircd$$"; my $USER_INFO="monitor localhost localhost : "; sub connection ($$$$) {	my ($in_remotehost,$in_users,$in_warn,$in_crit) = @_; my $state; my $answer;
 * 1) -[ connection ]--

print "connection(debug): users = $in_users\n" if $verbose; $in_users =~ s/\ //g; if ($in_users >= 0) {

if ($in_users > $in_crit) { $state = "CRITICAL"; $answer = "Critical Number Of Clients Connected : $in_users (Limit = $in_crit)\n";

} elsif ($in_users > $in_warn) { $state = "WARNING"; $answer = "Warning Number Of Clients Connected : $in_users (Limit = $in_warn)\n";

} else { $state = "OK"; $answer = "IRCD ok - Current Local Users: $in_users\n"; }

} else { $state = "UNKNOWN"; $answer = "Server $in_remotehost has less than 0 users! Something is Really WRONG!\n"; }	print ClientSocket "quit\n"; print $answer; exit $ERRORS{$state}; }


 * 1) [ print_usage ]--

sub print_usage { print "Usage: $PROGNAME -H [-w ] [-c ] [-p ]\n"; }


 * 1) -[ print_help ]--

sub print_help {	print_revision($PROGNAME,'1.4.16'); print "Copyright (c) 2000 Richard Mayhew/Karl DeBisschop

Perl Check IRCD plugin for Nagios

";	print_usage;	print " -H, --hostname=HOST Name or IP address of host to check -w, --warning=INTEGER Number of connected users which generates a warning state (Default: 50) -c, --critical=INTEGER Number of connected users which generates a critical state (Default: 100) -p, --port=INTEGER Port that the ircd daemon is running on (Default: 6667) -v, --verbose Print extra debugging information "; }


 * 1) -[ bindRemote ]--

sub bindRemote ($$) {	my ($in_remotehost, $in_remoteport) = @_; my $proto = getprotobyname('tcp'); my $sockaddr; my $that; my ($name, $aliases,$type,$len,$thataddr) = gethostbyname($in_remotehost);

if (!socket(ClientSocket,AF_INET, SOCK_STREAM, $proto)) { print "IRCD UNKNOWN: Could not start socket ($!)\n"; exit $ERRORS{"UNKNOWN"}; }	$sockaddr = 'S n a4 x8'; $that = pack($sockaddr, AF_INET, $in_remoteport, $thataddr); if (!connect(ClientSocket, $that)) { print "IRCD UNKNOWN: Could not connect socket ($!)\n"; exit $ERRORS{"UNKNOWN"}; }	select(ClientSocket); $| = 1; select(STDOUT); return \*ClientSocket; }


 * 1) ===================================================================[ MAIN ]==

MAIN: {	my $hostname;

Getopt::Long::Configure('bundling'); GetOptions ("V"  => \$opt_V,  "version"    => \$opt_V,		"h"   => \$opt_h,  "help"       => \$opt_h,		"v"   => \$verbose,"verbose"    => \$verbose,		"t=i" => \$opt_t,  "timeout=i"  => \$opt_t,		"w=i" => \$opt_w,  "warning=i"  => \$opt_w,		"c=i" => \$opt_c,  "critical=i" => \$opt_c,		"p=i" => \$opt_p,  "port=i"     => \$opt_p,		"H=s" => \$opt_H,  "hostname=s" => \$opt_H);

if ($opt_V) { print_revision($PROGNAME,'1.4.16'); exit $ERRORS{'OK'}; }

if ($opt_h) {print_help; exit $ERRORS{'OK'};}

($opt_H) || ($opt_H = shift @ARGV) || usage("Host name/address not specified\n"); my $remotehost = $1 if ($opt_H =~ /([-.A-Za-z0-9]+)/); ($remotehost) || usage("Invalid host: $opt_H\n");

($opt_w) || ($opt_w = shift @ARGV) || ($opt_w = 50); my $warn = $1 if ($opt_w =~ /^([0-9]+)$/); ($warn) || usage("Invalid warning threshold: $opt_w\n");

($opt_c) || ($opt_c = shift @ARGV) || ($opt_c = 100); my $crit = $1 if ($opt_c =~ /^([0-9]+)$/); ($crit) || usage("Invalid critical threshold: $opt_c\n");

($opt_p) || ($opt_p = shift @ARGV) || ($opt_p = 6667); my $remoteport = $1 if ($opt_p =~ /^([0-9]+)$/); ($remoteport) || usage("Invalid port: $opt_p\n");

if ($opt_t && $opt_t =~ /^([0-9]+)$/) { $TIMEOUT = $1; }

# Just in case of problems, let's not hang Nagios $SIG{'ALRM'} = sub { print "Somthing is Taking a Long Time, Increase Your TIMEOUT (Currently Set At $TIMEOUT Seconds)\n"; exit $ERRORS{"UNKNOWN"}; };	alarm($TIMEOUT);

my ($name, $alias, $proto) = getprotobyname('tcp');

print "MAIN(debug): binding to remote host: $remotehost -> $remoteport\n" if $verbose; my $ClientSocket = &bindRemote($remotehost,$remoteport); print ClientSocket "NICK $NICK\nUSER $USER_INFO\n"; while () { print "MAIN(debug): default var = $_\n" if $verbose;

# DALnet,LagNet,UnderNet etc. Require this! # Replies with a PONG when presented with a PING query. # If a server doesn't require it, it will be ignored. if (m/^PING (.*)/) {print ClientSocket "PONG $1\n";} alarm(0); # Look for pattern in IRCD Output to gather Client Connections total. connection($remotehost,$1,$warn,$crit) if (m/:I have\s+(\d+)/); }	print "IRCD UNKNOWN: Unknown error - maybe could not authenticate\n"; exit $ERRORS{"UNKNOWN"}; }