diff options
| -rw-r--r-- | contrib/check_arping.pl | 120 | ||||
| -rw-r--r-- | contrib/check_cpqarray.c | 430 | ||||
| -rw-r--r-- | contrib/check_frontpage | 151 | ||||
| -rw-r--r-- | contrib/check_logins.c | 351 | ||||
| -rw-r--r-- | contrib/check_oracle_tbs | 206 | ||||
| -rw-r--r-- | contrib/check_pcpmetric.py | 106 | ||||
| -rw-r--r-- | contrib/check_pfstate | 75 |
7 files changed, 1439 insertions, 0 deletions
diff --git a/contrib/check_arping.pl b/contrib/check_arping.pl new file mode 100644 index 00000000..b78ec68f --- /dev/null +++ b/contrib/check_arping.pl | |||
| @@ -0,0 +1,120 @@ | |||
| 1 | #! /usr/bin/perl -w | ||
| 2 | # | ||
| 3 | # check_arping.pl - Nagios plugin to check host status via ARP ping | ||
| 4 | # | ||
| 5 | # usage: | ||
| 6 | # check_arping -H hostname -I interface -T timeout | ||
| 7 | # | ||
| 8 | # | ||
| 9 | # Copyright (C) 2003 Kenny Root | ||
| 10 | # | ||
| 11 | # This program is free software; you can redistribute it and/or | ||
| 12 | # modify it under the terms of the GNU General Public License | ||
| 13 | # as published by the Free Software Foundation; either version 2 | ||
| 14 | # of the License, or (at your option) any later version. | ||
| 15 | # | ||
| 16 | # This program is distributed in the hope that it will be useful, | ||
| 17 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 18 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 19 | # GNU General Public License for more details. | ||
| 20 | # | ||
| 21 | # You should have received a copy of the GNU General Public License | ||
| 22 | # along with this program; if not, write to the Free Software | ||
| 23 | # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 24 | # | ||
| 25 | # | ||
| 26 | # Report bugs to: kenny@the-b.org, nagiosplug-help@lists.sf.net | ||
| 27 | |||
| 28 | use POSIX; | ||
| 29 | use strict; | ||
| 30 | use lib "/usr/lib/nagios/plugins" ; | ||
| 31 | use utils qw($TIMEOUT %ERRORS &print_revision &support); | ||
| 32 | |||
| 33 | use Net::Arping; | ||
| 34 | use Getopt::Long; | ||
| 35 | |||
| 36 | my $PROGNAME = "check_arping"; | ||
| 37 | |||
| 38 | my($status, $state, $answer); | ||
| 39 | my($opt_V, $opt_h, $opt_t, $opt_I, $opt_H); | ||
| 40 | |||
| 41 | |||
| 42 | #Option checking | ||
| 43 | $status = GetOptions( | ||
| 44 | "V|version" => \$opt_V, | ||
| 45 | "help" => \$opt_h, | ||
| 46 | "I|interface=s" => \$opt_I, | ||
| 47 | "H|host=s" => \$opt_H, | ||
| 48 | "t|timeout=i" => \$opt_t); | ||
| 49 | |||
| 50 | if ($status == 0) | ||
| 51 | { | ||
| 52 | print_help() ; | ||
| 53 | exit $ERRORS{'OK'}; | ||
| 54 | } | ||
| 55 | |||
| 56 | |||
| 57 | if ($opt_V) { | ||
| 58 | print_revision($PROGNAME,'$Revision$ '); | ||
| 59 | exit $ERRORS{'OK'}; | ||
| 60 | } | ||
| 61 | |||
| 62 | if ($opt_h) { | ||
| 63 | print_help(); | ||
| 64 | exit $ERRORS{'OK'}; | ||
| 65 | } | ||
| 66 | |||
| 67 | if ($opt_t) { | ||
| 68 | if ($opt_t ne int($opt_t)) { | ||
| 69 | print "Timeout not in seconds!\n"; | ||
| 70 | print_help(); | ||
| 71 | exit $ERRORS{'OK'}; | ||
| 72 | } | ||
| 73 | $opt_t = int($opt_t); | ||
| 74 | } else { | ||
| 75 | $opt_t = 3; | ||
| 76 | } | ||
| 77 | |||
| 78 | if (! utils::is_hostname($opt_H)){ | ||
| 79 | usage(); | ||
| 80 | exit $ERRORS{"UNKNOWN"}; | ||
| 81 | } | ||
| 82 | |||
| 83 | my $ping = Net::Arping->new(); | ||
| 84 | |||
| 85 | my $reply = $ping->arping(Host => $opt_H, Interface => $opt_I, Timeout => $opt_t); | ||
| 86 | |||
| 87 | if ($reply eq "0") { | ||
| 88 | $state = "CRITICAL"; | ||
| 89 | print "$state: no reply from $opt_H on interface $opt_I in $opt_t seconds.\n"; | ||
| 90 | exit $ERRORS{$state}; | ||
| 91 | } else { | ||
| 92 | $state = "OK"; | ||
| 93 | $answer = "replied with MAC address $reply"; | ||
| 94 | } | ||
| 95 | |||
| 96 | print "ARPING $state - $answer\n"; | ||
| 97 | exit $ERRORS{$state}; | ||
| 98 | |||
| 99 | |||
| 100 | sub usage { | ||
| 101 | print "\nMissing arguments!\n"; | ||
| 102 | print "\n"; | ||
| 103 | print "check_arping -I <interface> -H <host IP> [-t <timeout>]\n"; | ||
| 104 | print "\n\n"; | ||
| 105 | support(); | ||
| 106 | exit $ERRORS{"UNKNOWN"}; | ||
| 107 | } | ||
| 108 | |||
| 109 | sub print_help { | ||
| 110 | print "check_arping pings hosts that normally wouldn't allow\n"; | ||
| 111 | print "ICMP packets but are still on the local network.\n"; | ||
| 112 | print "\nUsage:\n"; | ||
| 113 | print " -H (--host) IP to query - (required)\n"; | ||
| 114 | print " -I (--interface) Interface to use.\n"; | ||
| 115 | print " -t (--timeout) Timeout in seconds.\n"; | ||
| 116 | print " -V (--version) Plugin version\n"; | ||
| 117 | print " -h (--help) usage help \n\n"; | ||
| 118 | print_revision($PROGNAME, '$Revision$'); | ||
| 119 | |||
| 120 | } | ||
diff --git a/contrib/check_cpqarray.c b/contrib/check_cpqarray.c new file mode 100644 index 00000000..badffeb4 --- /dev/null +++ b/contrib/check_cpqarray.c | |||
| @@ -0,0 +1,430 @@ | |||
| 1 | /* | ||
| 2 | check_cpqarray, an extension for Netsaint / Nagios to check the | ||
| 3 | status of a Compaq SmartArray controller from the commandline. | ||
| 4 | Copyright (C) 2003 Guenther Mair | ||
| 5 | |||
| 6 | based on the work and using main parts of | ||
| 7 | |||
| 8 | CpqArray Deamon, a program to monitor and remotely configure a | ||
| 9 | SmartArray controller. | ||
| 10 | Copyright (C) 1999 Hugo Trippaers | ||
| 11 | |||
| 12 | This program is free software; you can redistribute it and/or modify | ||
| 13 | it under the terms of the GNU General Public License as published by | ||
| 14 | the Free Software Foundation; either version 2 of the License, or | ||
| 15 | (at your option) any later version. | ||
| 16 | |||
| 17 | This program is distributed in the hope that it will be useful, | ||
| 18 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 19 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 20 | GNU General Public License for more details. | ||
| 21 | |||
| 22 | You should have received a copy of the GNU General Public License | ||
| 23 | along with this program; if not, write to the Free Software | ||
| 24 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 25 | */ | ||
| 26 | |||
| 27 | #include <unistd.h> | ||
| 28 | #include <sys/ioctl.h> | ||
| 29 | #include <sys/utsname.h> | ||
| 30 | #include <stdio.h> | ||
| 31 | #include <fcntl.h> | ||
| 32 | #include <string.h> | ||
| 33 | #include <errno.h> | ||
| 34 | |||
| 35 | #include "/usr/src/linux/drivers/block/ida_ioctl.h" | ||
| 36 | #include "/usr/src/linux/drivers/block/ida_cmd.h" | ||
| 37 | #include "/usr/src/linux/drivers/block/cpqarray.h" | ||
| 38 | |||
| 39 | |||
| 40 | const char *controllers[] = | ||
| 41 | { | ||
| 42 | "/dev/ida/c0d0", | ||
| 43 | "/dev/ida/c1d0", | ||
| 44 | "/dev/ida/c2d0", | ||
| 45 | "/dev/ida/c3d0", | ||
| 46 | "/dev/ida/c4d0", | ||
| 47 | "/dev/ida/c5d0", | ||
| 48 | "/dev/ida/c6d0", | ||
| 49 | "/dev/ida/c7d0" | ||
| 50 | }; | ||
| 51 | |||
| 52 | const char *statusstr[] = { | ||
| 53 | "Logical drive /dev/ida/c%dd%d: OK\n", | ||
| 54 | "Logical drive /dev/ida/c%dd%d: FAILED\n", | ||
| 55 | "Logical drive /dev/ida/c%dd%d: not configured.\n", | ||
| 56 | "Logical drive /dev/ida/c%dd%d: using interim recovery mode, %3.2f%% done.\n", | ||
| 57 | "Logical drive /dev/ida/c%dd%d: ready for recovery operation.\n", | ||
| 58 | "Logical drive /dev/ida/c%dd%d: is currently recovering, %3.2f%% done.\n", | ||
| 59 | "Wrong physical drive was replaced.\n", | ||
| 60 | "A physical drive is not properly connected.\n", | ||
| 61 | "Hardware is overheating.\n", | ||
| 62 | "Hardware has overheated.\n", | ||
| 63 | "Logical drive /dev/ida/c%dd%d: currently expanding, %3.2f%% done.\n", | ||
| 64 | "Logical drive /dev/ida/c%dd%d: not yet available.\n", | ||
| 65 | "Logical drive /dev/ida/c%dd%d: queued for expansion.\n", | ||
| 66 | }; | ||
| 67 | |||
| 68 | extern char *optarg; | ||
| 69 | extern int optind, opterr, optopt; | ||
| 70 | |||
| 71 | int ctrls_found_num; | ||
| 72 | int exit_code = 0; | ||
| 73 | struct controller ctrls_found[8]; | ||
| 74 | |||
| 75 | #define DEBUG(x) fprintf(stderr, x) | ||
| 76 | |||
| 77 | struct opts | ||
| 78 | { | ||
| 79 | char debug; | ||
| 80 | }; | ||
| 81 | |||
| 82 | struct slog_disk | ||
| 83 | { | ||
| 84 | int status; | ||
| 85 | float pvalue; | ||
| 86 | }; | ||
| 87 | |||
| 88 | struct controller | ||
| 89 | { | ||
| 90 | char ctrl_devicename[20]; | ||
| 91 | int num_logd_found; | ||
| 92 | struct slog_disk log_disk[16]; | ||
| 93 | }; | ||
| 94 | |||
| 95 | |||
| 96 | |||
| 97 | int status_check (struct opts opts) | ||
| 98 | { | ||
| 99 | int devicefd; | ||
| 100 | int ctrl_cntr; | ||
| 101 | int logd_cntr; | ||
| 102 | ida_ioctl_t io, io2; | ||
| 103 | int status, nr_blks, blks_tr; | ||
| 104 | float pvalue; | ||
| 105 | int counter; | ||
| 106 | |||
| 107 | for ( ctrl_cntr=0; | ||
| 108 | ctrl_cntr < ctrls_found_num; | ||
| 109 | ctrl_cntr++) { | ||
| 110 | |||
| 111 | devicefd = open (controllers[ctrl_cntr], O_RDONLY); | ||
| 112 | |||
| 113 | for ( logd_cntr=0; | ||
| 114 | logd_cntr < ctrls_found[ctrl_cntr].num_logd_found; | ||
| 115 | logd_cntr++) { | ||
| 116 | |||
| 117 | memset (&io, 0, sizeof (io)); | ||
| 118 | |||
| 119 | io.cmd = SENSE_LOG_DRV_STAT; | ||
| 120 | io.unit = logd_cntr | UNITVALID; | ||
| 121 | |||
| 122 | if (ioctl (devicefd, IDAPASSTHRU, &io) < 0) | ||
| 123 | { | ||
| 124 | perror ("SENSE_LOG_DRV_STAT ioctl"); | ||
| 125 | return 0; | ||
| 126 | } | ||
| 127 | |||
| 128 | status=io.c.sense_log_drv_stat.status; | ||
| 129 | |||
| 130 | if ((status == 3) || (status == 5) || (status == 7)) { | ||
| 131 | /* is a progress indicator required? | ||
| 132 | */ | ||
| 133 | memset (&io2, 0, sizeof (io)); | ||
| 134 | |||
| 135 | io2.cmd = ID_LOG_DRV; | ||
| 136 | io2.unit = logd_cntr | UNITVALID; | ||
| 137 | |||
| 138 | if (ioctl (devicefd, IDAPASSTHRU, &io2) < 0) | ||
| 139 | { | ||
| 140 | perror ("ID_LOG_DRV ioctl"); | ||
| 141 | /* return 0; no return this isn't fatal for now */ | ||
| 142 | } | ||
| 143 | else | ||
| 144 | { | ||
| 145 | nr_blks = io2.c.id_log_drv.nr_blks; | ||
| 146 | blks_tr = io.c.sense_log_drv_stat.blks_to_recover; | ||
| 147 | |||
| 148 | pvalue = ((float)(nr_blks - blks_tr)/(float)nr_blks) * 100; | ||
| 149 | } | ||
| 150 | } | ||
| 151 | else { | ||
| 152 | pvalue = 0.0; | ||
| 153 | } | ||
| 154 | |||
| 155 | if (opts.debug) { | ||
| 156 | fprintf(stdout, "DEBUG: Status of controller %d unit %d is %d\n", | ||
| 157 | ctrl_cntr, logd_cntr, status); | ||
| 158 | fprintf(stdout, "DEBUG: "); | ||
| 159 | fprintf(stdout, statusstr[status], | ||
| 160 | ctrl_cntr, logd_cntr, pvalue); | ||
| 161 | fprintf(stdout, "\n"); | ||
| 162 | } | ||
| 163 | |||
| 164 | printf(statusstr[status], ctrl_cntr, logd_cntr, pvalue); | ||
| 165 | |||
| 166 | switch(status) | ||
| 167 | { | ||
| 168 | case 1: | ||
| 169 | case 2: | ||
| 170 | case 6: | ||
| 171 | case 7: | ||
| 172 | case 9: | ||
| 173 | /* CRITICAL */ | ||
| 174 | exit_code = 2; | ||
| 175 | break; | ||
| 176 | case 3: | ||
| 177 | case 4: | ||
| 178 | case 5: | ||
| 179 | case 8: | ||
| 180 | case 10: | ||
| 181 | case 11: | ||
| 182 | case 12: | ||
| 183 | /* WARNING (only if not yet at CRITICAL LEVEL) */ | ||
| 184 | if (exit_code < 2) exit_code = 1; | ||
| 185 | break; | ||
| 186 | case 0: | ||
| 187 | default: | ||
| 188 | /* do nothing */ | ||
| 189 | break; | ||
| 190 | } | ||
| 191 | |||
| 192 | ctrls_found[ctrl_cntr].log_disk[logd_cntr].pvalue = pvalue; | ||
| 193 | ctrls_found[ctrl_cntr].log_disk[logd_cntr].status = status; | ||
| 194 | } | ||
| 195 | close (devicefd); | ||
| 196 | } | ||
| 197 | |||
| 198 | return 1; | ||
| 199 | } | ||
| 200 | |||
| 201 | int discover_controllers (struct opts opts) | ||
| 202 | { | ||
| 203 | int cntr; | ||
| 204 | int foundone = 0; | ||
| 205 | |||
| 206 | for (cntr = 0; cntr < 8; cntr++) | ||
| 207 | { | ||
| 208 | /* does this device exist ? */ | ||
| 209 | if ((access (controllers[cntr], R_OK | F_OK)) == 0) | ||
| 210 | { | ||
| 211 | /* it does :) */ | ||
| 212 | if (interrogate_controller (opts, cntr)) | ||
| 213 | { | ||
| 214 | foundone = 1; | ||
| 215 | if (opts.debug) | ||
| 216 | fprintf (stderr, "DEBUG: %s is a existing controller\n", | ||
| 217 | controllers[cntr]); | ||
| 218 | } | ||
| 219 | } | ||
| 220 | else if (opts.debug) | ||
| 221 | { | ||
| 222 | fprintf (stderr, "DEBUG: Device %s could not be opened\n", controllers[cntr]); | ||
| 223 | perror ("DEBUG: reason"); | ||
| 224 | } | ||
| 225 | } | ||
| 226 | return foundone; | ||
| 227 | } | ||
| 228 | |||
| 229 | void boardid2str (unsigned long board_id, char *name) | ||
| 230 | { | ||
| 231 | switch (board_id) | ||
| 232 | { | ||
| 233 | case 0x0040110E: /* IDA */ | ||
| 234 | strcpy (name, "Compaq IDA"); | ||
| 235 | break; | ||
| 236 | case 0x0140110E: /* IDA-2 */ | ||
| 237 | strcpy (name, "Compaq IDA-2"); | ||
| 238 | break; | ||
| 239 | case 0x1040110E: /* IAES */ | ||
| 240 | strcpy (name, "Compaq IAES"); | ||
| 241 | break; | ||
| 242 | case 0x2040110E: /* SMART */ | ||
| 243 | strcpy (name, "Compaq SMART"); | ||
| 244 | break; | ||
| 245 | case 0x3040110E: /* SMART-2/E */ | ||
| 246 | strcpy (name, "Compaq SMART-2/E"); | ||
| 247 | break; | ||
| 248 | case 0x40300E11: /* SMART-2/P or SMART-2DH */ | ||
| 249 | strcpy (name, "Compaq SMART-2/P (2DH)"); | ||
| 250 | break; | ||
| 251 | case 0x40310E11: /* SMART-2SL */ | ||
| 252 | strcpy (name, "Compaq SMART-2SL"); | ||
| 253 | break; | ||
| 254 | case 0x40320E11: /* SMART-3200 */ | ||
| 255 | strcpy (name, "Compaq SMART-3200"); | ||
| 256 | break; | ||
| 257 | case 0x40330E11: /* SMART-3100ES */ | ||
| 258 | strcpy (name, "Compaq SMART-3100ES"); | ||
| 259 | break; | ||
| 260 | case 0x40340E11: /* SMART-221 */ | ||
| 261 | strcpy (name, "Compaq SMART-221"); | ||
| 262 | break; | ||
| 263 | case 0x40400E11: /* Integrated Array */ | ||
| 264 | strcpy (name, "Compaq Integrated Array"); | ||
| 265 | break; | ||
| 266 | case 0x40500E11: /* Smart Array 4200 */ | ||
| 267 | strcpy (name, "Compaq Smart Array 4200"); | ||
| 268 | break; | ||
| 269 | case 0x40510E11: /* Smart Array 4250ES */ | ||
| 270 | strcpy (name, "Compaq Smart Array 4250ES"); | ||
| 271 | break; | ||
| 272 | case 0x40580E11: /* Smart Array 431 */ | ||
| 273 | strcpy (name, "Compaq Smart Array 431"); | ||
| 274 | break; | ||
| 275 | default: | ||
| 276 | /* | ||
| 277 | * Well, its a SMART-2 or better, don't know which | ||
| 278 | * kind. | ||
| 279 | */ | ||
| 280 | strcpy (name, "Unknown Controller Type"); | ||
| 281 | } | ||
| 282 | } | ||
| 283 | |||
| 284 | int interrogate_controller (struct opts opts, int contrnum) | ||
| 285 | { | ||
| 286 | int devicefd; | ||
| 287 | ida_ioctl_t io; | ||
| 288 | char buffer[30]; | ||
| 289 | int foundone = 0; | ||
| 290 | int cntr; | ||
| 291 | |||
| 292 | devicefd = open (controllers[contrnum], O_RDONLY); | ||
| 293 | /* no checks, did that before */ | ||
| 294 | |||
| 295 | /* clear io */ | ||
| 296 | memset (&io, 0, sizeof (io)); | ||
| 297 | |||
| 298 | io.cmd = ID_CTLR; | ||
| 299 | |||
| 300 | if (ioctl (devicefd, IDAPASSTHRU, &io) < 0) | ||
| 301 | { | ||
| 302 | if (opts.debug) perror ("DEBUG: ioctl"); | ||
| 303 | return 0; | ||
| 304 | } | ||
| 305 | |||
| 306 | boardid2str (io.c.id_ctlr.board_id, buffer); | ||
| 307 | |||
| 308 | strncpy (ctrls_found[ctrls_found_num].ctrl_devicename, | ||
| 309 | buffer, 20); | ||
| 310 | |||
| 311 | ctrls_found[ctrls_found_num].num_logd_found = 0; | ||
| 312 | |||
| 313 | for (cntr = 0; cntr < io.c.id_ctlr.nr_drvs; cntr++) | ||
| 314 | { | ||
| 315 | if (interrogate_logical (opts, devicefd, cntr)) | ||
| 316 | { | ||
| 317 | /* logical drive found, this could be used later one */ | ||
| 318 | foundone = 1; | ||
| 319 | } | ||
| 320 | } | ||
| 321 | |||
| 322 | switch (ctrls_found[ctrls_found_num].num_logd_found) | ||
| 323 | { | ||
| 324 | case 0: | ||
| 325 | printf("Found a %s with no logical drives.\n", buffer); | ||
| 326 | break; | ||
| 327 | case 1: | ||
| 328 | printf("Found a %s with one Logical drive.\n", buffer, | ||
| 329 | ctrls_found[ctrls_found_num].num_logd_found); | ||
| 330 | break; | ||
| 331 | default: | ||
| 332 | printf("Found a %s with %d Logical drives.\n", buffer, | ||
| 333 | ctrls_found[ctrls_found_num].num_logd_found); | ||
| 334 | break; | ||
| 335 | } | ||
| 336 | |||
| 337 | ctrls_found_num++; | ||
| 338 | |||
| 339 | close (devicefd); | ||
| 340 | return 1; | ||
| 341 | } | ||
| 342 | |||
| 343 | int interrogate_logical (struct opts opts, int devicefd, int unit_nr) | ||
| 344 | { | ||
| 345 | ida_ioctl_t io; | ||
| 346 | ida_ioctl_t io2; | ||
| 347 | int nr_blks, blks_tr; | ||
| 348 | |||
| 349 | if (opts.debug) printf ("DEBUG: interrogating unit %d\n", unit_nr); | ||
| 350 | |||
| 351 | memset (&io, 0, sizeof (io)); | ||
| 352 | |||
| 353 | io.cmd = ID_LOG_DRV; | ||
| 354 | io.unit = unit_nr | UNITVALID; | ||
| 355 | |||
| 356 | if (ioctl (devicefd, IDAPASSTHRU, &io) < 0) | ||
| 357 | { | ||
| 358 | perror ("FATAL: ID_LOG_DRV ioctl"); | ||
| 359 | return 0; | ||
| 360 | } | ||
| 361 | |||
| 362 | memset (&io2, 0, sizeof (io2)); | ||
| 363 | |||
| 364 | io2.cmd = SENSE_LOG_DRV_STAT; | ||
| 365 | io2.unit = unit_nr | UNITVALID; | ||
| 366 | |||
| 367 | if (ioctl (devicefd, IDAPASSTHRU, &io2) < 0) | ||
| 368 | { | ||
| 369 | perror ("FATAL: SENSE_LOG_DRV_STAT ioctl"); | ||
| 370 | return 0; | ||
| 371 | } | ||
| 372 | |||
| 373 | ctrls_found[ctrls_found_num].num_logd_found++; | ||
| 374 | /* ctrls_found[ctrls_found_num].log_disk[unit_nr].status = | ||
| 375 | * io2.c.sense_log_drv_stat.status; | ||
| 376 | |||
| 377 | * nr_blks = io2.c.id_log_drv.nr_blks; | ||
| 378 | * blks_tr = io.c.sense_log_drv_stat.blks_to_recover; | ||
| 379 | * ctrls_found[ctrls_found_num].log_disk[unit_nr].pvalue = | ||
| 380 | * ((float)(nr_blks - blks_tr)/(float)nr_blks) * 100; | ||
| 381 | */ | ||
| 382 | ctrls_found[ctrls_found_num].log_disk[unit_nr].status = 0; | ||
| 383 | ctrls_found[ctrls_found_num].log_disk[unit_nr].pvalue = 0; | ||
| 384 | |||
| 385 | return 1; | ||
| 386 | } | ||
| 387 | |||
| 388 | |||
| 389 | void print_usage() | ||
| 390 | { | ||
| 391 | printf("cpqarrayd [options]\n"); | ||
| 392 | printf(" -h prints this text\n"); | ||
| 393 | printf(" -d enables debugging\n"); | ||
| 394 | } | ||
| 395 | |||
| 396 | |||
| 397 | int main(int argc, char *argv[]) | ||
| 398 | { | ||
| 399 | char option; | ||
| 400 | struct opts opts; /* commandline options */ | ||
| 401 | |||
| 402 | memset(&opts, 0, sizeof(struct opts)); | ||
| 403 | |||
| 404 | /* check options */ | ||
| 405 | while ((option = getopt (argc, argv, "dh:")) != EOF) | ||
| 406 | { | ||
| 407 | switch (option) | ||
| 408 | { | ||
| 409 | case 'd': | ||
| 410 | opts.debug = 1; | ||
| 411 | break; | ||
| 412 | case '?': | ||
| 413 | case 'h': | ||
| 414 | default: | ||
| 415 | print_usage(); | ||
| 416 | exit(0); | ||
| 417 | break; | ||
| 418 | } | ||
| 419 | } | ||
| 420 | |||
| 421 | /* Check for existance of array controllers */ | ||
| 422 | if (!discover_controllers(opts)) { | ||
| 423 | printf("No array controller found!\n\n"); | ||
| 424 | exit(1); | ||
| 425 | } | ||
| 426 | |||
| 427 | status_check(opts); | ||
| 428 | |||
| 429 | return exit_code; | ||
| 430 | } | ||
diff --git a/contrib/check_frontpage b/contrib/check_frontpage new file mode 100644 index 00000000..ee958d30 --- /dev/null +++ b/contrib/check_frontpage | |||
| @@ -0,0 +1,151 @@ | |||
| 1 | #! /usr/bin/perl -w | ||
| 2 | # | ||
| 3 | # $Id$ | ||
| 4 | # | ||
| 5 | # Check that FrontPage extensions appear to be working on a specified host. | ||
| 6 | # Currently only checks that the hit counter is not returning an error. | ||
| 7 | # | ||
| 8 | # Probably not a good idea to use this on a host that someone's counting | ||
| 9 | # the hits on, so create a separate vhost for frontpage extensions testing, | ||
| 10 | # or just install the extensions on the default/root host for your server, and | ||
| 11 | # point it against that hostname, running it against all vhosts on a server is | ||
| 12 | # probably rather wasteful. | ||
| 13 | # | ||
| 14 | # Kev Green, oRe Net (http://www.orenet.co.uk/). | ||
| 15 | |||
| 16 | |||
| 17 | use strict; | ||
| 18 | use lib "/usr/lib/nagios/plugins"; | ||
| 19 | use utils qw($TIMEOUT %ERRORS &print_revision &support); | ||
| 20 | use vars qw($PROGNAME); | ||
| 21 | use Getopt::Long; | ||
| 22 | use LWP; | ||
| 23 | use vars qw($opt_V $opt_h $verbose $opt_w $opt_c $opt_H); | ||
| 24 | my ($tt,$url,$response,$stime, $etime,$warning,$critical,$mimetype,$failtype,$temp,$message); | ||
| 25 | my $rt = 0; | ||
| 26 | |||
| 27 | $PROGNAME = "check_frontpage"; | ||
| 28 | sub print_help (); | ||
| 29 | sub print_usage (); | ||
| 30 | |||
| 31 | $ENV{'PATH'}=''; | ||
| 32 | $ENV{'BASH_ENV'}=''; | ||
| 33 | $ENV{'ENV'}=''; | ||
| 34 | |||
| 35 | Getopt::Long::Configure('bundling'); | ||
| 36 | GetOptions | ||
| 37 | ("V" => \$opt_V, "version" => \$opt_V, | ||
| 38 | "h" => \$opt_h, "help" => \$opt_h, | ||
| 39 | "v" => \$verbose, "verbose" => \$verbose, | ||
| 40 | "w=s" => \$opt_w, "warning=s" => \$opt_w, | ||
| 41 | "c=s" => \$opt_c, "critical=s" => \$opt_c, | ||
| 42 | "H=s" => \$opt_H, "hostname=s" => \$opt_H); | ||
| 43 | |||
| 44 | if ($opt_V) { | ||
| 45 | print_revision($PROGNAME,'$Revision$'); #' | ||
| 46 | exit $ERRORS{'OK'}; | ||
| 47 | } | ||
| 48 | |||
| 49 | if ($opt_h) { | ||
| 50 | print_help(); | ||
| 51 | exit $ERRORS{'OK'}; | ||
| 52 | } | ||
| 53 | |||
| 54 | $opt_H = shift unless ($opt_H); | ||
| 55 | print_usage() unless $opt_H; | ||
| 56 | my $host = $1 if ($opt_H =~ m/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+|[a-zA-Z][-a-zA-Z0-9]+(\.[a-zA-Z0-9][-a-zA-Z0-9]+)*)$/); | ||
| 57 | print_usage() unless $host; | ||
| 58 | |||
| 59 | ($opt_c) || ($opt_c = shift) || ($opt_c = 120); | ||
| 60 | if ($opt_c =~ /([0-9]+)/) { | ||
| 61 | $critical = $1; | ||
| 62 | } else { | ||
| 63 | $critical = 10; | ||
| 64 | } | ||
| 65 | |||
| 66 | ($opt_w) || ($opt_w = shift) || ($opt_w = 60); | ||
| 67 | if ($opt_w =~ /([0-9]+)/) { | ||
| 68 | $warning = $1; | ||
| 69 | } else { | ||
| 70 | $warning = 5; | ||
| 71 | } | ||
| 72 | |||
| 73 | # Guts go here, once we're through argument parsing and have warning and | ||
| 74 | # critical thresholds. | ||
| 75 | my $browser = LWP::UserAgent->new; | ||
| 76 | |||
| 77 | my @urls = ( | ||
| 78 | # This is the "Hit Counter", which continues to work if frontpage extensions | ||
| 79 | # are 'uninstall'ed from the site, but not when they are 'fulluninstall'ed. | ||
| 80 | { | ||
| 81 | url => "_vti_bin/fpcount.exe?Page=_borders/right.htm|Image=4", | ||
| 82 | mimetype => "image/gif", | ||
| 83 | message => "None, or broken frontpage extensions on server, or virtual site 'fulluninstall'ed?", | ||
| 84 | failtype => "CRITICAL" | ||
| 85 | }, | ||
| 86 | # This is the "FrontPage Configuration Information" file, which is removed | ||
| 87 | # when you 'uninstall' the extensions from a site. | ||
| 88 | { | ||
| 89 | url => "_vti_inf.html", | ||
| 90 | mimetype => "text/html", | ||
| 91 | message => "Someone 'uninstall'ed extensions on virtual site?", | ||
| 92 | failtype => "WARNING" | ||
| 93 | } | ||
| 94 | ); | ||
| 95 | |||
| 96 | print "FRONTPAGE: "; | ||
| 97 | |||
| 98 | foreach $temp (@urls) { | ||
| 99 | $url = $temp->{'url'}; | ||
| 100 | $mimetype = $temp->{'mimetype'}; | ||
| 101 | $failtype = $temp->{'failtype'}; | ||
| 102 | $message = $temp->{'message'}; | ||
| 103 | $stime = time(); | ||
| 104 | $response=$browser->get("http://".$host."/".$url); | ||
| 105 | $etime = time(); | ||
| 106 | $tt = $etime - $stime; | ||
| 107 | |||
| 108 | # If we got a server error, or unknown output type, report back as critical. | ||
| 109 | if ($response->status_line !~ "^200") { | ||
| 110 | print $message." (".$response->status_line.")\r\n"; | ||
| 111 | exit $ERRORS{$failtype}; | ||
| 112 | } elsif ($response->content_type !~ $mimetype) { | ||
| 113 | print $message." (Wrong Content-type: ".$response->content_type.")\r\n"; | ||
| 114 | exit $ERRORS{$failtype}; | ||
| 115 | } else { | ||
| 116 | # Because we're dealing with multiple URL's | ||
| 117 | $rt += $tt; | ||
| 118 | } | ||
| 119 | |||
| 120 | # Decide if the response time was critical or not. | ||
| 121 | # | ||
| 122 | if ($rt > $critical) { | ||
| 123 | print "Response time ".$rt." over critical threshold ".$critical."\r\n"; | ||
| 124 | exit($ERRORS{'CRITICAL'}); | ||
| 125 | } elsif ($rt > $warning) { | ||
| 126 | print "Response time ".$rt." over warning threshold ".$warning."\r\n"; | ||
| 127 | exit($ERRORS{'WARNING'}); | ||
| 128 | } | ||
| 129 | } | ||
| 130 | printf(" %s - %s second response time, ",$response->status_line, $rt); | ||
| 131 | |||
| 132 | # If all the required URL's give the right responses quick enough, then we | ||
| 133 | # should be okay. | ||
| 134 | exit($ERRORS{'OK'}); | ||
| 135 | |||
| 136 | sub print_usage () { | ||
| 137 | print "Usage: $PROGNAME -H <host> [-w <warn>] [-c <crit>]\n"; | ||
| 138 | exit; | ||
| 139 | } | ||
| 140 | |||
| 141 | sub print_help () { | ||
| 142 | print_revision($PROGNAME,'$Revision$'); | ||
| 143 | print "Copyright (c) 2003 Kev Green\n"; | ||
| 144 | print "\n"; | ||
| 145 | print "FrontPage remains a copyright/trademark of Microsoft Corporation.\n"; | ||
| 146 | print_usage(); | ||
| 147 | print "\n"; | ||
| 148 | print "<warn> = Unknown.\n"; | ||
| 149 | print "<crit> = Server error from FrontPage extensions.\n\n"; | ||
| 150 | support(); | ||
| 151 | } | ||
diff --git a/contrib/check_logins.c b/contrib/check_logins.c new file mode 100644 index 00000000..fa3ed177 --- /dev/null +++ b/contrib/check_logins.c | |||
| @@ -0,0 +1,351 @@ | |||
| 1 | /*================================= | ||
| 2 | * check_logins - Nagios plugin | ||
| 3 | * Copyright (C) 2003 Dag Robøle | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License as published by | ||
| 7 | * the Free Software Foundation; either version 2 of the License, or | ||
| 8 | * (at your option) any later version. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 18 | * | ||
| 19 | * Authors email: drobole@broadpark.no | ||
| 20 | */ | ||
| 21 | //================================= | ||
| 22 | #include <sys/types.h> | ||
| 23 | #include <signal.h> | ||
| 24 | #include <errno.h> | ||
| 25 | #include <stdio.h> | ||
| 26 | #include <stdlib.h> | ||
| 27 | #include <unistd.h> | ||
| 28 | #include <string.h> | ||
| 29 | |||
| 30 | #include "config.h" | ||
| 31 | #include "common.h" | ||
| 32 | #include "utils.h" | ||
| 33 | #include "popen.h" | ||
| 34 | //================================= | ||
| 35 | #define REVISION "$Revision$" | ||
| 36 | #define COPYRIGHT "2003" | ||
| 37 | #define AUTHOR "Dag Robole" | ||
| 38 | #define EMAIL "drobole@broadpark.no" | ||
| 39 | #define SUMMARY "Check for multiple user logins" | ||
| 40 | |||
| 41 | #define check(func, errmsg) { if((func) == -1) die(STATE_UNKNOWN, errmsg); } | ||
| 42 | #define checkz(func, errmsg) { if(!(func)) die(STATE_UNKNOWN, errmsg); } | ||
| 43 | //================================= | ||
| 44 | typedef struct USERNODE_TYP { | ||
| 45 | char *name; | ||
| 46 | char *host; | ||
| 47 | struct USERNODE_TYP* next; | ||
| 48 | } USERNODE; | ||
| 49 | //================================= | ||
| 50 | char *progname = NULL; | ||
| 51 | USERNODE *userlist = NULL, *adminlist = NULL; | ||
| 52 | int warning_limit = 0, critical_limit = 0; | ||
| 53 | |||
| 54 | void print_usage(); | ||
| 55 | void print_help(); | ||
| 56 | void process_arguments(int argc, char* *argv); | ||
| 57 | void parse_wholine(const char *line, char *name, char *host); | ||
| 58 | void node_create(USERNODE* *node, const char *name, const char *host); | ||
| 59 | void node_free(USERNODE* *node); | ||
| 60 | USERNODE* list_insert_sort_uniq(USERNODE* *list, USERNODE* *node); | ||
| 61 | void list_free(USERNODE* *list); | ||
| 62 | void cleanup(); | ||
| 63 | //================================= | ||
| 64 | int main(int argc, char* *argv) | ||
| 65 | { | ||
| 66 | FILE *who; | ||
| 67 | USERNODE *newnode, *nptra, *nptrb; | ||
| 68 | char buffer[BUFSIZ], username[BUFSIZ], hostname[BUFSIZ], *cptra, *cptrb; | ||
| 69 | char max_login_name[BUFSIZ], currname[BUFSIZ]; | ||
| 70 | int max_login_count = 0, counter = 0, skip; | ||
| 71 | void (*old_sig_alrm)(); | ||
| 72 | |||
| 73 | progname = argv[0]; | ||
| 74 | if(atexit(cleanup)) | ||
| 75 | die(STATE_UNKNOWN, "atexit failed\n"); | ||
| 76 | |||
| 77 | if((old_sig_alrm = signal((int)SIGALRM, timeout_alarm_handler)) == SIG_ERR) | ||
| 78 | die(STATE_UNKNOWN, "signal failed\n"); | ||
| 79 | alarm(timeout_interval); | ||
| 80 | |||
| 81 | process_arguments(argc, argv); | ||
| 82 | |||
| 83 | checkz(who = spopen(PATH_TO_WHO), "spopen failed\n"); | ||
| 84 | |||
| 85 | while(fgets(buffer, sizeof(buffer), who) != NULL) { | ||
| 86 | parse_wholine(buffer, username, hostname); | ||
| 87 | skip = 0; | ||
| 88 | nptra = adminlist; | ||
| 89 | |||
| 90 | while(nptra != NULL) { | ||
| 91 | if(!strcmp(nptra->name, username)) { | ||
| 92 | skip = 1; | ||
| 93 | break; | ||
| 94 | } | ||
| 95 | nptra = nptra->next; | ||
| 96 | } | ||
| 97 | if(!skip) { | ||
| 98 | node_create(&newnode, username, hostname); | ||
| 99 | if(!list_insert_sort_uniq(&userlist, &newnode)) | ||
| 100 | node_free(&newnode); | ||
| 101 | } | ||
| 102 | } | ||
| 103 | |||
| 104 | check(spclose(who), "spclose failed\n"); | ||
| 105 | |||
| 106 | if(userlist != NULL) { | ||
| 107 | nptra = userlist; | ||
| 108 | strcpy(currname, nptra->name); | ||
| 109 | strcpy(max_login_name, nptra->name); | ||
| 110 | max_login_count = 1; | ||
| 111 | while(nptra != NULL) { | ||
| 112 | if(!strcmp(currname, nptra->name)) | ||
| 113 | ++counter; | ||
| 114 | else { | ||
| 115 | if(counter > max_login_count) { | ||
| 116 | max_login_count = counter; | ||
| 117 | strcpy(max_login_name, currname); | ||
| 118 | } | ||
| 119 | strcpy(currname, nptra->name); | ||
| 120 | counter = 1; | ||
| 121 | } | ||
| 122 | nptra = nptra->next; | ||
| 123 | } | ||
| 124 | |||
| 125 | if(counter > max_login_count) { | ||
| 126 | max_login_count = counter; | ||
| 127 | strcpy(max_login_name, currname); | ||
| 128 | } | ||
| 129 | } | ||
| 130 | |||
| 131 | if(signal((int)SIGALRM, old_sig_alrm) == SIG_ERR) | ||
| 132 | die(STATE_UNKNOWN, "signal failed\n"); | ||
| 133 | |||
| 134 | if(max_login_count) { | ||
| 135 | if(critical_limit && max_login_count >= critical_limit) { | ||
| 136 | printf("CRITICAL - User %s has logged in from %d different hosts\n", max_login_name, max_login_count); | ||
| 137 | return STATE_CRITICAL; | ||
| 138 | } | ||
| 139 | else if(warning_limit && max_login_count >= warning_limit) { | ||
| 140 | printf("WARNING - User %s has logged in from %d different hosts\n", max_login_name, max_login_count); | ||
| 141 | return STATE_WARNING; | ||
| 142 | } | ||
| 143 | } | ||
| 144 | |||
| 145 | printf("OK - No users has exceeded the login limits\n"); | ||
| 146 | return STATE_OK; | ||
| 147 | } | ||
| 148 | //================================= | ||
| 149 | void print_usage() | ||
| 150 | { | ||
| 151 | fprintf(stderr, "Usage: %s [ -hV ] [ -w limit ] [ -c limit ] [ -u username1, ... ,usernameN ]\n", progname); | ||
| 152 | } | ||
| 153 | //================================= | ||
| 154 | void print_help() | ||
| 155 | { | ||
| 156 | print_revision(progname, REVISION); | ||
| 157 | printf("Copyright (c) %s %s <%s>\n\n%s\n\n", COPYRIGHT, AUTHOR, EMAIL, SUMMARY); | ||
| 158 | print_usage(); | ||
| 159 | printf("\nDescription:\n" | ||
| 160 | "\tThis plugin supports the w (warning) and c (critical) options indicating the upper limits\n" | ||
| 161 | "\tof logins allowed before a warning is given.\n" | ||
| 162 | "\tThe output from %s is the username and number of login sessions for the user\n" | ||
| 163 | "\twho has the most login sessions (from different hosts) running at a given point in time.\n" | ||
| 164 | "\tThe u (users) option takes a comma separated list of usernames that will be ignored\n" | ||
| 165 | "\twhile scannig users.\n" | ||
| 166 | "\nOptions:\n" | ||
| 167 | "\t-h | --help\n\t\tShow this help message and exit\n" | ||
| 168 | "\t-V | --version\n\t\tShow version description\n" | ||
| 169 | "\t-w | --warning=INTEGER\n\t\tSet warning limit for logins (minimum value is 2)\n" | ||
| 170 | "\t-c | --critical=INTEGER\n\t\tSet critical limit for logins (minimum value is 2)\n" | ||
| 171 | "\t-u | --users=STRING\n\t\tSet usernames to be ignored\n" | ||
| 172 | "\nExamples:\n\t%s -w 3 -c 5\n" | ||
| 173 | "\t%s -w 3 -c 5 -u root,guest,jcarmack\n\n", progname, progname, progname); | ||
| 174 | } | ||
| 175 | //================================= | ||
| 176 | void process_arguments(int argc, char* *argv) | ||
| 177 | { | ||
| 178 | USERNODE *newnode; | ||
| 179 | int optch; | ||
| 180 | char buffer[BUFSIZ], *cptra; | ||
| 181 | static struct option long_opts[] = { | ||
| 182 | {"help", no_argument, 0, 'h'}, | ||
| 183 | {"version", no_argument, 0, 'V'}, | ||
| 184 | {"warning", required_argument, 0, 'w'}, | ||
| 185 | {"critical", required_argument, 0, 'c'}, | ||
| 186 | {"users", required_argument, 0, 'u'}, | ||
| 187 | {0, 0, 0, 0}, | ||
| 188 | }; | ||
| 189 | |||
| 190 | while((optch = getopt_long(argc, argv, "hVw:c:u:", long_opts, NULL)) != -1) { | ||
| 191 | switch(optch) { | ||
| 192 | case 'h': | ||
| 193 | print_help(); | ||
| 194 | exit(STATE_OK); | ||
| 195 | break; | ||
| 196 | case 'V': | ||
| 197 | print_revision(progname, REVISION); | ||
| 198 | exit(STATE_OK); | ||
| 199 | break; | ||
| 200 | case 'w': | ||
| 201 | if(!is_numeric(optarg)) { | ||
| 202 | print_usage(); | ||
| 203 | die(STATE_UNKNOWN, "invalid options\n"); | ||
| 204 | } | ||
| 205 | warning_limit = atoi(optarg) > 2 ? atoi(optarg) : 2; | ||
| 206 | break; | ||
| 207 | case 'c': | ||
| 208 | if(!is_numeric(optarg)) { | ||
| 209 | print_usage(); | ||
| 210 | die(STATE_UNKNOWN, "invalid options\n"); | ||
| 211 | } | ||
| 212 | critical_limit = atoi(optarg) > 2 ? atoi(optarg) : 2; | ||
| 213 | break; | ||
| 214 | case 'u': | ||
| 215 | strcpy(buffer, optarg); | ||
| 216 | cptra = strtok(buffer, ","); | ||
| 217 | while(cptra != NULL) { | ||
| 218 | node_create(&newnode, cptra, "(adminhost)"); | ||
| 219 | list_insert_sort_uniq(&adminlist, &newnode); | ||
| 220 | cptra = strtok(NULL, ","); | ||
| 221 | } | ||
| 222 | break; | ||
| 223 | default: | ||
| 224 | print_usage(); | ||
| 225 | exit(STATE_UNKNOWN); | ||
| 226 | break; | ||
| 227 | } | ||
| 228 | } | ||
| 229 | |||
| 230 | if(argc > optind) { | ||
| 231 | print_usage(); | ||
| 232 | die(STATE_UNKNOWN, "invalid options\n"); | ||
| 233 | } | ||
| 234 | |||
| 235 | if(!warning_limit && !critical_limit) { | ||
| 236 | print_usage(); | ||
| 237 | die(STATE_UNKNOWN, "you must provide a limit for this plugin\n"); | ||
| 238 | } | ||
| 239 | |||
| 240 | if(critical_limit && warning_limit > critical_limit) { | ||
| 241 | print_usage(); | ||
| 242 | die(STATE_UNKNOWN, "warning limit must be less or equal critical limit\n"); | ||
| 243 | } | ||
| 244 | } | ||
| 245 | //================================= | ||
| 246 | void parse_wholine(const char *line, char *name, char *host) | ||
| 247 | { | ||
| 248 | char buffer[BUFSIZ], *cptra, *cptrb, *display; | ||
| 249 | strcpy(buffer, line); | ||
| 250 | |||
| 251 | cptra = buffer; | ||
| 252 | checkz(cptrb = (char*)strchr(buffer, ' '), "strchr failed\n"); | ||
| 253 | strncpy(name, cptra, cptrb-cptra); | ||
| 254 | name[cptrb-cptra] = '\0'; | ||
| 255 | |||
| 256 | if((cptra = strchr(buffer, '(')) != NULL) // hostname found in source arg... | ||
| 257 | { | ||
| 258 | if(cptra[1] == ':') // local host | ||
| 259 | strcpy(host, "(localhost)"); | ||
| 260 | else // extern host | ||
| 261 | { | ||
| 262 | checkz(cptrb = strchr(cptra, ')'), "strchr failed\n"); | ||
| 263 | cptrb++; | ||
| 264 | strncpy(host, cptra, cptrb-cptra); | ||
| 265 | host[cptrb-cptra] = '\0'; | ||
| 266 | } | ||
| 267 | } | ||
| 268 | else // no hostname in source arg, look in line arg... | ||
| 269 | { | ||
| 270 | checkz(cptra = strtok(buffer, " \t\r\n"), "strtok failed\n"); | ||
| 271 | checkz(cptra = strtok(NULL, " \t\r\n"), "strtok failed\n"); | ||
| 272 | if(cptra[0] == ':') // local host | ||
| 273 | strcpy(host, "(localhost)"); | ||
| 274 | else // extern host | ||
| 275 | sprintf(host, "(%s)", cptra); | ||
| 276 | } | ||
| 277 | |||
| 278 | if((cptra = strchr(host, ':')) != NULL) // remove display if any... | ||
| 279 | strcpy(cptra, ")"); | ||
| 280 | } | ||
| 281 | //================================= | ||
| 282 | void node_create(USERNODE* *node, const char *name, const char *host) | ||
| 283 | { | ||
| 284 | checkz(*node = (USERNODE*)malloc(sizeof(USERNODE)), "malloc failed\n"); | ||
| 285 | checkz((*node)->name = (char*)malloc(strlen(name)+1), "malloc failed\n"); | ||
| 286 | checkz((*node)->host = (char*)malloc(strlen(host)+1), "malloc failed\n"); | ||
| 287 | (*node)->next = NULL; | ||
| 288 | strcpy((*node)->name, name); | ||
| 289 | strcpy((*node)->host, host); | ||
| 290 | } | ||
| 291 | //================================= | ||
| 292 | void node_free(USERNODE* *node) | ||
| 293 | { | ||
| 294 | free((*node)->name); | ||
| 295 | free((*node)->host); | ||
| 296 | free(*node); | ||
| 297 | *node = NULL; | ||
| 298 | } | ||
| 299 | //================================= | ||
| 300 | USERNODE* list_insert_sort_uniq(USERNODE* *list, USERNODE* *node) | ||
| 301 | { | ||
| 302 | char n1[BUFSIZ], n2[BUFSIZ]; | ||
| 303 | USERNODE *last_nptr = NULL, *nptr = *list; | ||
| 304 | |||
| 305 | if(*list == NULL) | ||
| 306 | return(*list = *node); | ||
| 307 | else { | ||
| 308 | sprintf(n1, "%s %s", (*node)->name, (*node)->host); | ||
| 309 | while(nptr != NULL) { | ||
| 310 | sprintf(n2, "%s %s", nptr->name, nptr->host); | ||
| 311 | if(!strcmp(n1, n2)) | ||
| 312 | return NULL; | ||
| 313 | else if(strcmp(n1, n2) < 0) { | ||
| 314 | if(last_nptr) { | ||
| 315 | last_nptr->next = *node; | ||
| 316 | (*node)->next = nptr; | ||
| 317 | } | ||
| 318 | else { | ||
| 319 | (*node)->next = *list; | ||
| 320 | *list = *node; | ||
| 321 | } | ||
| 322 | break; | ||
| 323 | } | ||
| 324 | else { | ||
| 325 | last_nptr = nptr; | ||
| 326 | nptr = nptr->next; | ||
| 327 | } | ||
| 328 | } | ||
| 329 | if(nptr == NULL) | ||
| 330 | last_nptr->next = *node; | ||
| 331 | } | ||
| 332 | return *node; | ||
| 333 | } | ||
| 334 | //================================= | ||
| 335 | void list_free(USERNODE* *list) | ||
| 336 | { | ||
| 337 | USERNODE *doe, *nptr = *list; | ||
| 338 | while(nptr != NULL) { | ||
| 339 | doe = nptr; | ||
| 340 | nptr = nptr->next; | ||
| 341 | node_free(&doe); | ||
| 342 | } | ||
| 343 | *list = NULL; | ||
| 344 | } | ||
| 345 | //================================= | ||
| 346 | void cleanup() | ||
| 347 | { | ||
| 348 | list_free(&userlist); | ||
| 349 | list_free(&adminlist); | ||
| 350 | } | ||
| 351 | //================================= | ||
diff --git a/contrib/check_oracle_tbs b/contrib/check_oracle_tbs new file mode 100644 index 00000000..bcc4af87 --- /dev/null +++ b/contrib/check_oracle_tbs | |||
| @@ -0,0 +1,206 @@ | |||
| 1 | #!/usr/local/bin/perl -w | ||
| 2 | |||
| 3 | # (c)2003 John Koyle, RFP Depot, LLC. | ||
| 4 | # This is free software use it however you would like. | ||
| 5 | # Thanks to the folks at http://www.think-forward.com for the SQL query | ||
| 6 | |||
| 7 | |||
| 8 | use strict; | ||
| 9 | use DBI; | ||
| 10 | use Getopt::Long 2.16; | ||
| 11 | use lib "/usr/local/nagios/libexec"; | ||
| 12 | use utils qw(%ERRORS); | ||
| 13 | |||
| 14 | |||
| 15 | #******************************************************************************* | ||
| 16 | # Set user configureable options here. | ||
| 17 | # | ||
| 18 | # Global Oracle info set here rather than command line to avoid output in ps -ef | ||
| 19 | # Make sure this script is mode 700 and owner of the nrpe user | ||
| 20 | # | ||
| 21 | #******************************************************************************* | ||
| 22 | my $orasid = ""; | ||
| 23 | my $orauser = ""; | ||
| 24 | my $orapwd = ""; | ||
| 25 | |||
| 26 | |||
| 27 | if (!$ENV{ORACLE_HOME}) { | ||
| 28 | $ENV{ORACLE_HOME} = '/a01/app/oracle/product/9.2.0.1'; | ||
| 29 | } | ||
| 30 | |||
| 31 | #*****************You shouldn't need to modify anything below here ************* | ||
| 32 | my $state = $ERRORS{'UNKNOWN'}; | ||
| 33 | my $answer = undef; | ||
| 34 | |||
| 35 | my ($MAJOR_VERSION, $MINOR_VERSION) = q$Revision$ =~ /(\d+)\.(\d+)/; | ||
| 36 | my $VERSION = sprintf("%d.%02d", $MAJOR_VERSION - 1, $MINOR_VERSION); | ||
| 37 | |||
| 38 | my $opt_debug; # -d|--debug | ||
| 39 | my $opt_help; # -h|--help | ||
| 40 | my $opt_version; # -V|--version | ||
| 41 | my $opt_warn_space; # -w|--warn-space | ||
| 42 | my $opt_crit_space; # -c|--crit-space | ||
| 43 | |||
| 44 | my $help = <<MARK; # help statement | ||
| 45 | |||
| 46 | check_oracle_tbs v$VERSION | ||
| 47 | |||
| 48 | Checks the tablespaces in an Oracle database for available free space. | ||
| 49 | Usage: check_oracle_tbs [-w <warn>] [-c <crit>] | ||
| 50 | |||
| 51 | -d, --debug Output debug to screen. | ||
| 52 | -h, --help Displays this help and exits. | ||
| 53 | -w, --warn-space=... Warning threshold % free (default 15) | ||
| 54 | -c, --crit-space=... Critical threshold % free (default 10) | ||
| 55 | -V, --version Output version information and exit. | ||
| 56 | |||
| 57 | MARK | ||
| 58 | |||
| 59 | ## We want exact matches to the switches | ||
| 60 | |||
| 61 | Getopt::Long::config('no_auto_abbrev', 'no_ignore_case'); | ||
| 62 | |||
| 63 | my $rc = GetOptions( | ||
| 64 | "debug|d" => \$opt_debug, | ||
| 65 | "help|h" => \$opt_help, | ||
| 66 | "w|warn-space=s" => \$opt_warn_space, | ||
| 67 | "c|crit-space=s" => \$opt_crit_space, | ||
| 68 | "V|version" => \$opt_version, | ||
| 69 | ); | ||
| 70 | |||
| 71 | |||
| 72 | #*********************************************************************** | ||
| 73 | # Process command-line switches | ||
| 74 | #*********************************************************************** | ||
| 75 | |||
| 76 | if (! $rc || defined $opt_help) | ||
| 77 | { | ||
| 78 | print STDERR $help; | ||
| 79 | exit (defined $opt_help ? 0 : 1); | ||
| 80 | } | ||
| 81 | |||
| 82 | if (defined $opt_version) | ||
| 83 | { | ||
| 84 | print STDERR "check_oracle_tbs v$VERSION\n"; | ||
| 85 | exit 0; | ||
| 86 | } | ||
| 87 | |||
| 88 | if (! defined $opt_warn_space) | ||
| 89 | { | ||
| 90 | if(defined $opt_debug) { | ||
| 91 | print STDOUT "Warn space not defined, using 80%\n\n"; | ||
| 92 | } | ||
| 93 | $opt_warn_space = 15; | ||
| 94 | } | ||
| 95 | |||
| 96 | if (! defined $opt_crit_space) | ||
| 97 | { | ||
| 98 | if(defined $opt_debug) { | ||
| 99 | print STDOUT "Crit space not defined, using 90%\n\n"; | ||
| 100 | } | ||
| 101 | $opt_crit_space = 10; | ||
| 102 | } | ||
| 103 | |||
| 104 | my $array_ref = executeSQL(); | ||
| 105 | |||
| 106 | foreach my $row (@$array_ref) { | ||
| 107 | my ( $tbs_name, $tot_mb, $free_mb, $free_pct, $used_pct, $fsfi) = @$row; | ||
| 108 | if ($opt_debug) { print STDOUT "Output: $tbs_name\t$tot_mb\t$free_mb\t$free_pct\t$used_pct\t$fsfi\n\n"; } | ||
| 109 | if ($used_pct > (100 - $opt_crit_space) && $tbs_name !~ /RBS/) { | ||
| 110 | $state = $ERRORS{'CRITICAL'}; | ||
| 111 | $answer .= "$tbs_name = $used_pct\% "; | ||
| 112 | last; | ||
| 113 | } | ||
| 114 | if ($used_pct > (100 - $opt_warn_space) && $tbs_name !~ /RBS/) { | ||
| 115 | $state = $ERRORS{'WARNING'}; | ||
| 116 | $answer .= "$tbs_name = $used_pct\% "; | ||
| 117 | } | ||
| 118 | } | ||
| 119 | |||
| 120 | if ($state != $ERRORS{'CRITICAL'} && $state != $ERRORS{'WARNING'}) { | ||
| 121 | $state = $ERRORS{'OK'}; | ||
| 122 | $answer = "All Tablespaces OK"; | ||
| 123 | } | ||
| 124 | |||
| 125 | if ($opt_debug && $state != $ERRORS{'OK'}) { print STDOUT "The following tablespaces are in question: $answer\n\n"; } | ||
| 126 | |||
| 127 | foreach my $key (keys %ERRORS) { | ||
| 128 | if ($state==$ERRORS{$key}) { | ||
| 129 | print ("$key: $answer"); | ||
| 130 | last; | ||
| 131 | } | ||
| 132 | } | ||
| 133 | exit $state; | ||
| 134 | |||
| 135 | sub executeSQL | ||
| 136 | { | ||
| 137 | my ($dbh, $sth, $results); | ||
| 138 | |||
| 139 | $dbh = openOracle(); | ||
| 140 | |||
| 141 | eval { | ||
| 142 | $dbh->{RaiseError} = 1; | ||
| 143 | # This query is taken from this URL and used with permission: http://www.think-forward.com/sql/tspace.htm | ||
| 144 | $sth = $dbh->prepare(q{ | ||
| 145 | select df.tablespace_name tspace, | ||
| 146 | df.bytes/(1024*1024) tot_ts_size, | ||
| 147 | sum(fs.bytes)/(1024*1024) free_ts_size, | ||
| 148 | round(sum(fs.bytes)*100/df.bytes) ts_pct, | ||
| 149 | round((df.bytes-sum(fs.bytes))*100/df.bytes) ts_pct1, | ||
| 150 | ROUND(100*SQRT(MAX(fs.bytes)/SUM(fs.bytes))* | ||
| 151 | (1/SQRT(SQRT(COUNT(fs.bytes)))) ,2) FSFI | ||
| 152 | from dba_free_space fs, (select tablespace_name, sum(bytes) bytes | ||
| 153 | from dba_data_files | ||
| 154 | group by tablespace_name ) df | ||
| 155 | where fs.tablespace_name = df.tablespace_name | ||
| 156 | group by df.tablespace_name, df.bytes | ||
| 157 | }); | ||
| 158 | |||
| 159 | $sth->execute(); | ||
| 160 | $results = $sth->fetchall_arrayref(); | ||
| 161 | $sth->finish; | ||
| 162 | $dbh->{RaiseError} = 0; | ||
| 163 | }; | ||
| 164 | |||
| 165 | if ($@) { | ||
| 166 | closeOracle($dbh); | ||
| 167 | if($opt_debug) { print STDOUT "DB Failed Query: $@\n"; } | ||
| 168 | CleanupAndExit($ERRORS{'UNKNOWN'}); | ||
| 169 | } | ||
| 170 | |||
| 171 | closeOracle($dbh); | ||
| 172 | |||
| 173 | return $results; | ||
| 174 | } | ||
| 175 | |||
| 176 | #------ Open the connection to the database and return the handle | ||
| 177 | sub openOracle | ||
| 178 | { | ||
| 179 | my ($dbh); | ||
| 180 | |||
| 181 | $dbh = DBI->connect("$orasid", "$orauser", "$orapwd", "Oracle"); | ||
| 182 | |||
| 183 | if (!$dbh) { | ||
| 184 | if ($opt_debug) { print "ERROR: Could not connect to Oracle!\n\n"; } | ||
| 185 | CleanupAndExit($ERRORS{'UNKNOWN'}); | ||
| 186 | } | ||
| 187 | if ($opt_debug) { print "Connected to Oracle SID $orasid\n\n"; } | ||
| 188 | return $dbh; | ||
| 189 | } | ||
| 190 | |||
| 191 | #------- Close the database connection | ||
| 192 | sub closeOracle() | ||
| 193 | { | ||
| 194 | my ($dbh) = @_; | ||
| 195 | |||
| 196 | $dbh->disconnect; | ||
| 197 | } | ||
| 198 | |||
| 199 | #------ Exit with the current return code | ||
| 200 | sub CleanupAndExit | ||
| 201 | { | ||
| 202 | my ($rc) = @_; | ||
| 203 | |||
| 204 | exit($rc); | ||
| 205 | } | ||
| 206 | |||
diff --git a/contrib/check_pcpmetric.py b/contrib/check_pcpmetric.py new file mode 100644 index 00000000..71d816d4 --- /dev/null +++ b/contrib/check_pcpmetric.py | |||
| @@ -0,0 +1,106 @@ | |||
| 1 | #! /usr/bin/env python | ||
| 2 | # | ||
| 3 | # Nagios client for checking Performance Co-Pilot metrics | ||
| 4 | # | ||
| 5 | # | ||
| 6 | |||
| 7 | from sys import argv,exit | ||
| 8 | import popen2, getopt, string, types | ||
| 9 | |||
| 10 | DEBUG=0 | ||
| 11 | |||
| 12 | nagios_pcpclient_version = 0.01 | ||
| 13 | PMVAL='/usr/bin/pmval' | ||
| 14 | COMMANDLINE=PMVAL + " -s 1" | ||
| 15 | METRIC='undefined' | ||
| 16 | CRITICAL=0 | ||
| 17 | WARNING=0 | ||
| 18 | |||
| 19 | def usage(): | ||
| 20 | print "Usage:", argv[0], "[options]" | ||
| 21 | print "Options:" | ||
| 22 | print "\t[-H host]\tHostname to contact" | ||
| 23 | print "\t[-m metric]\tPCP metric to check" | ||
| 24 | print "\t[-i instance]\tPCP metric instance" | ||
| 25 | print "\t[-w warn]\tIssue warning alert if value is larger than this" | ||
| 26 | print "\t[-c critical]\tIssue critical alert value is larger than this" | ||
| 27 | print "\t[-V]\t\tProgram version" | ||
| 28 | print "\t[-h]\t\tThis helptext" | ||
| 29 | print "" | ||
| 30 | print "F.ex. to check 5 minute loadaverage, warn if the load is above 2," | ||
| 31 | print "and give critical warning if it's above 10:" | ||
| 32 | print "\n\t%", argv[0], " -i 5 -m kernel.all.load -w 2 -c 10" | ||
| 33 | print "" | ||
| 34 | print "A list of all PCP metrics can be found with the command 'pminfo'." | ||
| 35 | print "A list of all instances within a metric can be found with 'pminfo -f metric'." | ||
| 36 | print "F.ex. to see all available instances of 'filesys.full' execute:" | ||
| 37 | print "\n\t% pminfo -f filesys.full" | ||
| 38 | print "\tfilesys.full" | ||
| 39 | print """\t\tinst [0 or "/dev/root"] value 45.35514044640914""" | ||
| 40 | print """\t\tinst [1 or "/dev/sda1"] value 46.74285959344712""" | ||
| 41 | print """\t\tinst [2 or "/dev/sdb1"] value 0.807766570678168""" | ||
| 42 | print "" | ||
| 43 | print "And the command to have nagios monitor the /dev/sda1 filesystem would be:" | ||
| 44 | print "\n\t", argv[0], " -i /dev/sda1 -m filesys.full -w 70 -c 90" | ||
| 45 | |||
| 46 | |||
| 47 | opts, args = getopt.getopt(argv[1:],'hH:c:w:m:i:V') | ||
| 48 | for opt in opts: | ||
| 49 | key,value = opt | ||
| 50 | if key == '-H': | ||
| 51 | COMMANDLINE = COMMANDLINE + " -h " + value | ||
| 52 | elif key == '-m': | ||
| 53 | METRIC=value | ||
| 54 | elif key == '-i': | ||
| 55 | COMMANDLINE = COMMANDLINE + " -i " + value | ||
| 56 | elif key == '-c': | ||
| 57 | CRITICAL = value | ||
| 58 | elif key == '-w': | ||
| 59 | WARNING = value | ||
| 60 | elif key == '-h': | ||
| 61 | usage() | ||
| 62 | exit(0) | ||
| 63 | elif key == '-V': | ||
| 64 | print "Nagios Performance CoPilot client v%.2f" % nagios_pcpclient_version | ||
| 65 | print "Written by Jan-Frode Myklebust <janfrode@parallab.uib.no>" | ||
| 66 | exit(0) | ||
| 67 | |||
| 68 | if METRIC == 'undefined': | ||
| 69 | usage() | ||
| 70 | exit(3) | ||
| 71 | |||
| 72 | COMMANDLINE = COMMANDLINE + " " + METRIC | ||
| 73 | if DEBUG: print COMMANDLINE | ||
| 74 | p=popen2.Popen4(COMMANDLINE) | ||
| 75 | exitcode=p.wait() | ||
| 76 | |||
| 77 | # Get the last line of output from 'pmval': | ||
| 78 | buffer = p.fromchild.readline() | ||
| 79 | while (buffer != ''): | ||
| 80 | output=buffer | ||
| 81 | buffer = p.fromchild.readline() | ||
| 82 | |||
| 83 | returndata = string.split(output)[0] | ||
| 84 | |||
| 85 | |||
| 86 | # Confirm that we have gotten a float, and not | ||
| 87 | # some errormessage in the returndata. If not, | ||
| 88 | # print the error, and give the UNKNOWN exit code: | ||
| 89 | |||
| 90 | try: | ||
| 91 | retval = string.atof(returndata) | ||
| 92 | except ValueError, e: | ||
| 93 | print e | ||
| 94 | exit(3) | ||
| 95 | |||
| 96 | if (retval < WARNING): | ||
| 97 | EXITCODE=0 | ||
| 98 | elif (retval > CRITICAL): | ||
| 99 | EXITCODE=2 | ||
| 100 | elif (retval > WARNING): | ||
| 101 | EXITCODE=1 | ||
| 102 | else: | ||
| 103 | EXITCODE=3 | ||
| 104 | |||
| 105 | print retval | ||
| 106 | exit(EXITCODE) | ||
diff --git a/contrib/check_pfstate b/contrib/check_pfstate new file mode 100644 index 00000000..6fe0d9b0 --- /dev/null +++ b/contrib/check_pfstate | |||
| @@ -0,0 +1,75 @@ | |||
| 1 | #!/usr/bin/perl | ||
| 2 | |||
| 3 | use strict; | ||
| 4 | use Getopt::Long; | ||
| 5 | use vars qw($opt_V $opt_h $opt_P $opt_H $opt_w $opt_c $PROGNAME); | ||
| 6 | use lib "/usr/local/nagios/libexec" ; | ||
| 7 | use utils qw(%ERRORS &print_revision &support &usage); | ||
| 8 | |||
| 9 | my $remote_user = "root"; | ||
| 10 | my $path_to_ssh = "/usr/bin/ssh"; | ||
| 11 | my $path_to_grep = "/usr/bin/grep"; | ||
| 12 | my $path_to_awk = "/usr/bin/awk"; | ||
| 13 | my $warn = 50000; | ||
| 14 | my $crit = 60000; | ||
| 15 | |||
| 16 | $PROGNAME = "check_pfstate"; | ||
| 17 | $ENV{'PATH'}=''; | ||
| 18 | $ENV{'BASH_ENV'}=''; | ||
| 19 | $ENV{'ENV'}=''; | ||
| 20 | |||
| 21 | Getopt::Long::Configure('bundling'); | ||
| 22 | GetOptions | ||
| 23 | ("V" => \$opt_V, "version" => \$opt_V, | ||
| 24 | "h" => \$opt_h, "help" => \$opt_h, | ||
| 25 | "H=s" => \$opt_H, "hostname=s" => \$opt_H, | ||
| 26 | "w=s" => \$opt_w, "warning=s" => \$opt_w, | ||
| 27 | "c=s" => \$opt_c, "critical=s" => \$opt_c); | ||
| 28 | |||
| 29 | if ($opt_V) { | ||
| 30 | print_revision($PROGNAME,'$Revision$'); | ||
| 31 | exit $ERRORS{'OK'}; | ||
| 32 | } | ||
| 33 | if ($opt_h) { | ||
| 34 | print_help(); | ||
| 35 | exit $ERRORS{'OK'}; | ||
| 36 | } | ||
| 37 | if ($opt_w) { | ||
| 38 | if ($opt_w =~ /(\d+)/) { | ||
| 39 | $warn = $1; | ||
| 40 | } else { | ||
| 41 | usage("Invalid values: $opt_w\n"); | ||
| 42 | exit $ERRORS{'OK'}; | ||
| 43 | } | ||
| 44 | } | ||
| 45 | if ($opt_c) { | ||
| 46 | if ($opt_c =~ /(\d+)/) { | ||
| 47 | $crit = $1; | ||
| 48 | } else { | ||
| 49 | usage("Invalid values: $opt_c\n"); | ||
| 50 | exit $ERRORS{'OK'}; | ||
| 51 | } | ||
| 52 | } | ||
| 53 | ($opt_H) || usage("Host name/address not specified\n"); | ||
| 54 | my $host = $1 if ($opt_H =~ /([-.A-Za-z0-9]+)/); | ||
| 55 | ($host) || usage("Invalid host: $opt_H\n"); | ||
| 56 | |||
| 57 | my $result = `$path_to_ssh -l $remote_user $host '/sbin/pfctl -s info' | $path_to_grep entries`; | ||
| 58 | chomp $result; | ||
| 59 | $result =~ /(\d+)/; | ||
| 60 | $result = $1; | ||
| 61 | |||
| 62 | print "$result PF state entries\n"; | ||
| 63 | |||
| 64 | exit $ERRORS{'CRITICAL'} if ($result >= $crit); | ||
| 65 | exit $ERRORS{'WARNING'} if ($result >= $warn); | ||
| 66 | exit $ERRORS{'OK'}; | ||
| 67 | |||
| 68 | |||
| 69 | sub print_help { | ||
| 70 | print_revision($PROGNAME,'$Revision$'); | ||
| 71 | print "Copyright (c) 2002 Jason Dixon\n\nThis plugin checks the number of state table entries on a PF-enabled OpenBSD system.\n\n"; | ||
| 72 | print "Usage:\t-H, --hostname=<HOST> [-w, --warning=<WARNING>] [-c, --critical=<CRITICAL>]\n\n\tDefault warning is 50000 and critical is 60000.\n\n"; | ||
| 73 | support(); | ||
| 74 | } | ||
| 75 | |||
