diff options
Diffstat (limited to 'web/attachments/121772-nagiosplug-cvs-timeout_status.diff')
| -rw-r--r-- | web/attachments/121772-nagiosplug-cvs-timeout_status.diff | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/web/attachments/121772-nagiosplug-cvs-timeout_status.diff b/web/attachments/121772-nagiosplug-cvs-timeout_status.diff new file mode 100644 index 0000000..cf1e66a --- /dev/null +++ b/web/attachments/121772-nagiosplug-cvs-timeout_status.diff | |||
| @@ -0,0 +1,208 @@ | |||
| 1 | diff -urN ./plugins/check_nt.c ../plugins/plugins/check_nt.c | ||
| 2 | --- ./plugins/check_nt.c 2005-01-24 08:29:53.000000000 +0100 | ||
| 3 | +++ ../plugins/plugins/check_nt.c 2005-02-17 12:26:57.000000000 +0100 | ||
| 4 | @@ -35,6 +35,9 @@ | ||
| 5 | const char *copyright = "2003-2004"; | ||
| 6 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; | ||
| 7 | |||
| 8 | +extern const char *status_strings; | ||
| 9 | +extern int timeout_status; | ||
| 10 | + | ||
| 11 | #include "common.h" | ||
| 12 | #include "netutils.h" | ||
| 13 | #include "utils.h" | ||
| 14 | @@ -454,6 +457,7 @@ | ||
| 15 | {"hostname", required_argument,0,'H'}, | ||
| 16 | {"version", no_argument, 0,'V'}, | ||
| 17 | {"help", no_argument, 0,'h'}, | ||
| 18 | + {"timeout-status", required_argument, 0, 'T'}, | ||
| 19 | {0,0,0,0} | ||
| 20 | }; | ||
| 21 | |||
| 22 | @@ -478,7 +482,7 @@ | ||
| 23 | } | ||
| 24 | |||
| 25 | while (1){ | ||
| 26 | - c = getopt_long(argc,argv,"+hVH:t:c:w:p:v:l:s:d:",longopts,&option); | ||
| 27 | + c = getopt_long(argc,argv,"+hVH:t:c:w:p:v:l:s:d:T:",longopts,&option); | ||
| 28 | |||
| 29 | if (c==-1||c==EOF||c==1) | ||
| 30 | break; | ||
| 31 | @@ -549,8 +553,11 @@ | ||
| 32 | socket_timeout=atoi(optarg); | ||
| 33 | if(socket_timeout<=0) | ||
| 34 | return ERROR; | ||
| 35 | + break; | ||
| 36 | + case 'T': | ||
| 37 | + if(set_timeout_status(optarg) == ERROR) return ERROR; | ||
| 38 | + break; | ||
| 39 | } | ||
| 40 | - | ||
| 41 | } | ||
| 42 | |||
| 43 | if (vars_to_check==CHECK_NONE) | ||
| 44 | diff -urN ./plugins/common.h ../plugins/plugins/common.h | ||
| 45 | --- ./plugins/common.h 2004-12-10 11:42:00.000000000 +0100 | ||
| 46 | +++ ../plugins/plugins/common.h 2005-02-17 12:26:57.000000000 +0100 | ||
| 47 | @@ -157,8 +157,13 @@ | ||
| 48 | ERROR = -1 | ||
| 49 | }; | ||
| 50 | |||
| 51 | -/* AIX seems to have this defined somewhere else */ | ||
| 52 | -#ifndef FALSE | ||
| 53 | +/* AIX seems to have FALSE defined somewhere else, so make sure | ||
| 54 | + * TRUE means something else (we assume it does if it's already defined) */ | ||
| 55 | +#ifdef FALSE | ||
| 56 | +# ifndef TRUE | ||
| 57 | +# define TRUE (FALSE ^ 1) | ||
| 58 | +# endif | ||
| 59 | +#else | ||
| 60 | enum { | ||
| 61 | FALSE, | ||
| 62 | TRUE | ||
| 63 | @@ -170,7 +175,8 @@ | ||
| 64 | STATE_WARNING, | ||
| 65 | STATE_CRITICAL, | ||
| 66 | STATE_UNKNOWN, | ||
| 67 | - STATE_DEPENDENT | ||
| 68 | + STATE_DEPENDENT, | ||
| 69 | + STATE_OOB /* result out of bounds (keep last in list!) */ | ||
| 70 | }; | ||
| 71 | |||
| 72 | enum { | ||
| 73 | diff -urN ./plugins/netutils.c ../plugins/plugins/netutils.c | ||
| 74 | --- ./plugins/netutils.c 2005-01-05 21:53:22.000000000 +0100 | ||
| 75 | +++ ../plugins/plugins/netutils.c 2005-02-17 12:34:23.000000000 +0100 | ||
| 76 | @@ -38,18 +38,23 @@ | ||
| 77 | int econn_refuse_state = STATE_CRITICAL; | ||
| 78 | int was_refused = FALSE; | ||
| 79 | int address_family = AF_UNSPEC; | ||
| 80 | +extern char *status_strings; | ||
| 81 | +extern int timeout_status; | ||
| 82 | |||
| 83 | static int my_connect(const char *address, int port, int *sd, int proto); | ||
| 84 | /* handles socket timeouts */ | ||
| 85 | void | ||
| 86 | socket_timeout_alarm_handler (int sig) | ||
| 87 | { | ||
| 88 | - if (sig == SIGALRM) | ||
| 89 | - printf (_("CRITICAL - Socket timeout after %d seconds\n"), socket_timeout); | ||
| 90 | - else | ||
| 91 | - printf (_("CRITICAL - Abnormal timeout after %d seconds\n"), socket_timeout); | ||
| 92 | + /* this can only happen with poorly written plugins, so chalk | ||
| 93 | + * it up as input validation error and return STATE_UNKNOWN */ | ||
| 94 | + if(timeout_status < 0 || timeout_status >= STATE_OOB) | ||
| 95 | + timeout_status = STATE_UNKNOWN; | ||
| 96 | |||
| 97 | - exit (STATE_CRITICAL); | ||
| 98 | + printf (_("%s - Socket timeout after %d seconds\n"), | ||
| 99 | + status_strings[timeout_status], socket_timeout); | ||
| 100 | + | ||
| 101 | + exit (timeout_status); | ||
| 102 | } | ||
| 103 | |||
| 104 | |||
| 105 | diff -urN ./plugins/utils.c ../plugins/plugins/utils.c | ||
| 106 | --- ./plugins/utils.c 2005-01-05 21:53:23.000000000 +0100 | ||
| 107 | +++ ../plugins/plugins/utils.c 2005-02-17 12:26:57.000000000 +0100 | ||
| 108 | @@ -23,6 +23,20 @@ | ||
| 109 | extern void print_usage (void); | ||
| 110 | extern const char *progname; | ||
| 111 | |||
| 112 | +/* NULL-terminate these arrays just to be prudent | ||
| 113 | + * It's a bit faster and a lot more portable to use two separate | ||
| 114 | + * arrays for this, as we don't need to rely on strcasecmp being available | ||
| 115 | + */ | ||
| 116 | +const char *status_strings[] = { | ||
| 117 | + "OK", "WARNING", "CRITICAL", "UNKNOWN", "DEPENDENT", NULL | ||
| 118 | +}; | ||
| 119 | +const char *lowercase_status_strings[] = { | ||
| 120 | + "ok", "warning", "critical", "unknown", "dependent", NULL | ||
| 121 | +}; | ||
| 122 | +/* plugins may set this themselves, so export it from here | ||
| 123 | + * and have the plugins import it explicitly as extern */ | ||
| 124 | +int timeout_status = STATE_CRITICAL; | ||
| 125 | + | ||
| 126 | #define STRLEN 64 | ||
| 127 | #define TXTBLK 128 | ||
| 128 | |||
| 129 | @@ -105,18 +119,10 @@ | ||
| 130 | const char * | ||
| 131 | state_text (int result) | ||
| 132 | { | ||
| 133 | - switch (result) { | ||
| 134 | - case STATE_OK: | ||
| 135 | - return "OK"; | ||
| 136 | - case STATE_WARNING: | ||
| 137 | - return "WARNING"; | ||
| 138 | - case STATE_CRITICAL: | ||
| 139 | - return "CRITICAL"; | ||
| 140 | - case STATE_DEPENDENT: | ||
| 141 | - return "DEPENDENT"; | ||
| 142 | - default: | ||
| 143 | + if(result < 0 || result >= STATE_OOB) | ||
| 144 | return "UNKNOWN"; | ||
| 145 | - } | ||
| 146 | + | ||
| 147 | + return status_strings[result]; | ||
| 148 | } | ||
| 149 | |||
| 150 | void | ||
| 151 | @@ -129,14 +135,54 @@ | ||
| 152 | exit (result); | ||
| 153 | } | ||
| 154 | |||
| 155 | +int | ||
| 156 | +set_timeout_status(const char *arg) | ||
| 157 | +{ | ||
| 158 | + int i; | ||
| 159 | + | ||
| 160 | + timeou_status = -1; | ||
| 161 | + for(i = 0; status_strings[i],lowercase_status_strings[i]; i++) { | ||
| 162 | + if(status_strings[i][0] = arg[0] || | ||
| 163 | + lowercase_status_strings[i][0] = arg[0]) | ||
| 164 | + { | ||
| 165 | + timeout_status = i; | ||
| 166 | + break; | ||
| 167 | + } | ||
| 168 | + | ||
| 169 | + if(timeout_status != -1) return OK; | ||
| 170 | + | ||
| 171 | + errno = 0; | ||
| 172 | + timeout_status = (int)strtol(arg, NULL, 0); | ||
| 173 | + if(timeout_status < STATE_OK || timeout_status >= STATE_OOB || | ||
| 174 | + (!timeout_status && errno)) | ||
| 175 | + { | ||
| 176 | + timeout_status = STATE_UNKNOWN; | ||
| 177 | + return ERROR; | ||
| 178 | + } | ||
| 179 | + } | ||
| 180 | + | ||
| 181 | + return OK; | ||
| 182 | +} | ||
| 183 | + | ||
| 184 | + | ||
| 185 | void | ||
| 186 | timeout_alarm_handler (int signo) | ||
| 187 | { | ||
| 188 | + /* don't segfault if someone stupid has set this arbitrarily */ | ||
| 189 | + if(timeout_status < 0 || timeout_status >= STATE_OOB) | ||
| 190 | + timeout_status = STATE_UNKNOWN; | ||
| 191 | + | ||
| 192 | if (signo == SIGALRM) { | ||
| 193 | - printf (_("CRITICAL - Plugin timed out after %d seconds\n"), | ||
| 194 | - timeout_interval); | ||
| 195 | - exit (STATE_CRITICAL); | ||
| 196 | + printf (_("%s - Plugin timed out after %d seconds\n"), | ||
| 197 | + status_strings[timeout_status], timeout_interval); | ||
| 198 | + exit (timeout_status); | ||
| 199 | } | ||
| 200 | + | ||
| 201 | + /* fallthrough so we print something in case some stupid plugin | ||
| 202 | + * contributor has set this function to the catch-all sighandler */ | ||
| 203 | + printf(_("Caught signal %d in timeout_alarm_handler (bad coding).\n"), | ||
| 204 | + signo); | ||
| 205 | + exit(STATE_UNKNOWN); | ||
| 206 | } | ||
| 207 | |||
| 208 | int | ||
