diff options
Diffstat (limited to 'plugins-scripts/check_ircd.pl')
| -rwxr-xr-x | plugins-scripts/check_ircd.pl | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/plugins-scripts/check_ircd.pl b/plugins-scripts/check_ircd.pl new file mode 100755 index 00000000..e4c4bd02 --- /dev/null +++ b/plugins-scripts/check_ircd.pl | |||
| @@ -0,0 +1,257 @@ | |||
| 1 | #!/usr/bin/perl -wT | ||
| 2 | |||
| 3 | # ----------------------------------------------------------------------------- | ||
| 4 | # File Name: check_ircd.pl | ||
| 5 | # | ||
| 6 | # Author: Richard Mayhew - South Africa | ||
| 7 | # | ||
| 8 | # Date: 1999/09/20 | ||
| 9 | # | ||
| 10 | # $Id$ | ||
| 11 | # | ||
| 12 | # Description: This script will check to see if an IRCD is running | ||
| 13 | # about how many users it has | ||
| 14 | # | ||
| 15 | # Email: netsaint@splash.co.za | ||
| 16 | # | ||
| 17 | # ----------------------------------------------------------------------------- | ||
| 18 | # Copyright 1999 (c) Richard Mayhew | ||
| 19 | # | ||
| 20 | # Credits go to Ethan Galstad for coding Nagios | ||
| 21 | # | ||
| 22 | # If any changes are made to this script, please mail me a copy of the | ||
| 23 | # changes :) | ||
| 24 | # | ||
| 25 | # Some code taken from Charlie Cook (check_disk.pl) | ||
| 26 | # | ||
| 27 | # License GPL | ||
| 28 | # | ||
| 29 | # ----------------------------------------------------------------------------- | ||
| 30 | # Date Author Reason | ||
| 31 | # ---- ------ ------ | ||
| 32 | # | ||
| 33 | # 1999/09/20 RM Creation | ||
| 34 | # | ||
| 35 | # 1999/09/20 TP Changed script to use strict, more secure by | ||
| 36 | # specifying $ENV variables. The bind command is | ||
| 37 | # still insecure through. Did most of my work | ||
| 38 | # with perl -wT and 'use strict' | ||
| 39 | # | ||
| 40 | # test using check_ircd.pl (irc-2.mit.edu|irc.erols.com|irc.core.com) | ||
| 41 | # | ||
| 42 | # ------------------------------------------------------------------[ Begin ]-- | ||
| 43 | |||
| 44 | BEGIN { | ||
| 45 | if ($0 =~ m/^(.*?)[\/\\]([^\/\\]+)$/) { | ||
| 46 | $runtimedir = $1; | ||
| 47 | $PROGNAME = $2; | ||
| 48 | } | ||
| 49 | } | ||
| 50 | |||
| 51 | # ----------------------------------------------------------------[ Require ]-- | ||
| 52 | |||
| 53 | require 5.004; | ||
| 54 | |||
| 55 | # -------------------------------------------------------------------[ Uses ]-- | ||
| 56 | |||
| 57 | use Socket; | ||
| 58 | use strict; | ||
| 59 | use Getopt::Long; | ||
| 60 | use vars qw($opt_V $opt_h $opt_t $opt_p $opt_H $opt_w $opt_c $verbose); | ||
| 61 | use vars qw($PROGNAME); | ||
| 62 | use lib $main::runtimedir; | ||
| 63 | use utils qw($TIMEOUT %ERRORS &print_revision &support &usage); | ||
| 64 | |||
| 65 | # ----------------------------------------------------[ Function Prototypes ]-- | ||
| 66 | |||
| 67 | sub print_help (); | ||
| 68 | sub print_usage (); | ||
| 69 | sub connection ($$$$); | ||
| 70 | sub bindRemote ($$$); | ||
| 71 | |||
| 72 | # -------------------------------------------------------------[ Enviroment ]-- | ||
| 73 | |||
| 74 | $ENV{PATH} = ""; | ||
| 75 | $ENV{ENV} = ""; | ||
| 76 | $ENV{BASH_ENV} = ""; | ||
| 77 | |||
| 78 | # -----------------------------------------------------------------[ Global ]-- | ||
| 79 | |||
| 80 | my $NICK="ircd$$"; | ||
| 81 | my $USER_INFO="monitor localhost localhost : "; | ||
| 82 | |||
| 83 | # -------------------------------------------------------------[ connection ]-- | ||
| 84 | sub connection ($$$$) | ||
| 85 | { | ||
| 86 | my ($in_remotehost,$in_users,$in_warn,$in_crit) = @_; | ||
| 87 | my $state; | ||
| 88 | my $answer; | ||
| 89 | |||
| 90 | print "connection(debug): users = $in_users\n" if $verbose; | ||
| 91 | $in_users =~ s/\ //g; | ||
| 92 | |||
| 93 | if ($in_users >= 0) { | ||
| 94 | |||
| 95 | if ($in_users > $in_crit) { | ||
| 96 | $state = "CRITICAL"; | ||
| 97 | $answer = "Critical Number Of Clients Connected : $in_users (Limit = $in_crit)\n"; | ||
| 98 | |||
| 99 | } elsif ($in_users > $in_warn) { | ||
| 100 | $state = "WARNING"; | ||
| 101 | $answer = "Warning Number Of Clients Connected : $in_users (Limit = $in_warn)\n"; | ||
| 102 | |||
| 103 | } else { | ||
| 104 | $state = "OK"; | ||
| 105 | $answer = "IRCD ok - Current Local Users: $in_users\n"; | ||
| 106 | } | ||
| 107 | |||
| 108 | } else { | ||
| 109 | $state = "UNKNOWN"; | ||
| 110 | $answer = "Server $in_remotehost has less than 0 users! Something is Really WRONG!\n"; | ||
| 111 | } | ||
| 112 | |||
| 113 | print ClientSocket "quit\n"; | ||
| 114 | print $answer; | ||
| 115 | exit $ERRORS{$state}; | ||
| 116 | } | ||
| 117 | |||
| 118 | # ------------------------------------------------------------[ print_usage ]-- | ||
| 119 | |||
| 120 | sub print_usage () { | ||
| 121 | print "Usage: $PROGNAME -H <host> [-w <warn>] [-c <crit>] [-p <port>]\n"; | ||
| 122 | } | ||
| 123 | |||
| 124 | # -------------------------------------------------------------[ print_help ]-- | ||
| 125 | |||
| 126 | sub print_help () | ||
| 127 | { | ||
| 128 | print_revision($PROGNAME,'$Revision$ '); | ||
| 129 | print "Copyright (c) 2000 Richard Mayhew/Karl DeBisschop | ||
| 130 | |||
| 131 | Perl Check IRCD plugin for Nagios | ||
| 132 | |||
| 133 | "; | ||
| 134 | print_usage(); | ||
| 135 | print " | ||
| 136 | -H, --hostname=HOST | ||
| 137 | Name or IP address of host to check | ||
| 138 | -w, --warning=INTEGER | ||
| 139 | Number of connected users which generates a warning state (Default: 50) | ||
| 140 | -c, --critical=INTEGER | ||
| 141 | Number of connected users which generates a critical state (Default: 100) | ||
| 142 | -p, --port=INTEGER | ||
| 143 | Port that the ircd daemon is running on <host> (Default: 6667) | ||
| 144 | -v, --verbose | ||
| 145 | Print extra debugging information | ||
| 146 | "; | ||
| 147 | } | ||
| 148 | |||
| 149 | # -------------------------------------------------------------[ bindRemote ]-- | ||
| 150 | |||
| 151 | sub bindRemote ($$$) | ||
| 152 | { | ||
| 153 | my ($in_remotehost, $in_remoteport, $in_hostname) = @_; | ||
| 154 | my $proto = getprotobyname('tcp'); | ||
| 155 | my $sockaddr; | ||
| 156 | my $this; | ||
| 157 | my $thisaddr = gethostbyname($in_hostname); | ||
| 158 | my $that; | ||
| 159 | my ($name, $aliases,$type,$len,$thataddr) = gethostbyname($in_remotehost); | ||
| 160 | # ($name,$aliases,$type,$len,$thisaddr) = gethostbyname($in_hostname); | ||
| 161 | |||
| 162 | if (!socket(ClientSocket,AF_INET, SOCK_STREAM, $proto)) { | ||
| 163 | print "IRCD UNKNOWN: Could not start socket ($!)\n"; | ||
| 164 | exit $ERRORS{"UNKNOWN"}; | ||
| 165 | } | ||
| 166 | $sockaddr = 'S n a4 x8'; | ||
| 167 | $this = pack($sockaddr, AF_INET, 0, $thisaddr); | ||
| 168 | $that = pack($sockaddr, AF_INET, $in_remoteport, $thataddr); | ||
| 169 | if (!bind(ClientSocket, $this)) { | ||
| 170 | print "IRCD UNKNOWN: Could not bind socket ($!)\n"; | ||
| 171 | exit $ERRORS{"UNKNOWN"}; | ||
| 172 | } | ||
| 173 | if (!connect(ClientSocket, $that)) { | ||
| 174 | print "IRCD UNKNOWN: Could not connect socket ($!)\n"; | ||
| 175 | exit $ERRORS{"UNKNOWN"}; | ||
| 176 | } | ||
| 177 | select(ClientSocket); $| = 1; select(STDOUT); | ||
| 178 | return \*ClientSocket; | ||
| 179 | } | ||
| 180 | |||
| 181 | # ===================================================================[ MAIN ]== | ||
| 182 | |||
| 183 | MAIN: | ||
| 184 | { | ||
| 185 | my $hostname; | ||
| 186 | |||
| 187 | Getopt::Long::Configure('bundling'); | ||
| 188 | GetOptions | ||
| 189 | ("V" => \$opt_V, "version" => \$opt_V, | ||
| 190 | "h" => \$opt_h, "help" => \$opt_h, | ||
| 191 | "v" => \$verbose,"verbose" => \$verbose, | ||
| 192 | "t=i" => \$opt_t, "timeout=i" => \$opt_t, | ||
| 193 | "w=i" => \$opt_w, "warning=i" => \$opt_w, | ||
| 194 | "c=i" => \$opt_c, "critical=i" => \$opt_c, | ||
| 195 | "p=i" => \$opt_p, "port=i" => \$opt_p, | ||
| 196 | "H=s" => \$opt_H, "hostname=s" => \$opt_H); | ||
| 197 | |||
| 198 | if ($opt_V) { | ||
| 199 | print_revision($PROGNAME,'$Revision$ '); | ||
| 200 | exit $ERRORS{'OK'}; | ||
| 201 | } | ||
| 202 | |||
| 203 | if ($opt_h) {print_help(); exit $ERRORS{'OK'};} | ||
| 204 | |||
| 205 | ($opt_H) || ($opt_H = shift) || usage("Host name/address not specified\n"); | ||
| 206 | my $remotehost = $1 if ($opt_H =~ /([-.A-Za-z0-9]+)/); | ||
| 207 | ($remotehost) || usage("Invalid host: $opt_H\n"); | ||
| 208 | |||
| 209 | ($opt_w) || ($opt_w = shift) || ($opt_w = 50); | ||
| 210 | my $warn = $1 if ($opt_w =~ /^([0-9]+)$/); | ||
| 211 | ($warn) || usage("Invalid warning threshold: $opt_w\n"); | ||
| 212 | |||
| 213 | ($opt_c) || ($opt_c = shift) || ($opt_c = 100); | ||
| 214 | my $crit = $1 if ($opt_c =~ /^([0-9]+)$/); | ||
| 215 | ($crit) || usage("Invalid critical threshold: $opt_c\n"); | ||
| 216 | |||
| 217 | ($opt_p) || ($opt_p = shift) || ($opt_p = 6667); | ||
| 218 | my $remoteport = $1 if ($opt_p =~ /^([0-9]+)$/); | ||
| 219 | ($remoteport) || usage("Invalid port: $opt_p\n"); | ||
| 220 | |||
| 221 | if ($opt_t && $opt_t =~ /^([0-9]+)$/) { $TIMEOUT = $1; } | ||
| 222 | |||
| 223 | # Just in case of problems, let's not hang Nagios | ||
| 224 | $SIG{'ALRM'} = sub { | ||
| 225 | print "Somthing is Taking a Long Time, Increase Your TIMEOUT (Currently Set At $TIMEOUT Seconds)\n"; | ||
| 226 | exit $ERRORS{"UNKNOWN"}; | ||
| 227 | }; | ||
| 228 | |||
| 229 | alarm($TIMEOUT); | ||
| 230 | |||
| 231 | chomp($hostname = `/bin/hostname`); | ||
| 232 | $hostname = $1 if ($hostname =~ /([-.a-zA-Z0-9]+)/); | ||
| 233 | my ($name, $alias, $proto) = getprotobyname('tcp'); | ||
| 234 | print "MAIN(debug): hostname = $hostname\n" if $verbose; | ||
| 235 | |||
| 236 | print "MAIN(debug): binding to remote host: $remotehost -> $remoteport -> $hostname\n" if $verbose; | ||
| 237 | my $ClientSocket = &bindRemote($remotehost,$remoteport,$hostname); | ||
| 238 | |||
| 239 | print ClientSocket "NICK $NICK\nUSER $USER_INFO\n"; | ||
| 240 | |||
| 241 | while (<ClientSocket>) { | ||
| 242 | print "MAIN(debug): default var = $_\n" if $verbose; | ||
| 243 | |||
| 244 | # DALnet,LagNet,UnderNet etc. Require this! | ||
| 245 | # Replies with a PONG when presented with a PING query. | ||
| 246 | # If a server doesn't require it, it will be ignored. | ||
| 247 | |||
| 248 | if (m/^PING (.*)/) {print ClientSocket "PONG $1\n";} | ||
| 249 | |||
| 250 | alarm(0); | ||
| 251 | |||
| 252 | # Look for pattern in IRCD Output to gather Client Connections total. | ||
| 253 | connection($remotehost,$1,$warn,$crit) if (m/:I have\s+(\d+)/); | ||
| 254 | } | ||
| 255 | print "IRCD UNKNOWN: Unknown error - maybe could not authenticate\n"; | ||
| 256 | exit $ERRORS{"UNKNOWN"}; | ||
| 257 | } | ||
