int main (int argc, char **argv) { char *command_line; output chld_out, chld_err; char *msg = NULL; size_t i; char *t; long microsec; double elapsed_time; int result = STATE_UNKNOWN; int timeout_interval_dig; setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); /* Set signal handling and alarm */ if (signal (SIGALRM, runcmd_timeout_alarm_handler) == SIG_ERR) usage_va(_("Cannot catch SIGALRM")); /* Parse extra opts if any */ argv=np_extra_opts (&argc, argv, progname); if (process_arguments (argc, argv) == ERROR) usage_va(_("Could not parse arguments")); /* dig applies the timeout to each try, so we need to work around this */ timeout_interval_dig = timeout_interval / number_tries + number_tries; /* get the command to run */ xasprintf (&command_line, "%s %s %s -p %d @%s %s %s +tries=%d +time=%d", PATH_TO_DIG, dig_args, query_transport, server_port, dns_server, query_address, record_type, number_tries, timeout_interval_dig); alarm (timeout_interval); gettimeofday (&tv, NULL); if (verbose) { printf ("%s\n", command_line); if(expected_address != NULL) { printf (_("Looking for: '%s'\n"), expected_address); } else { printf (_("Looking for: '%s'\n"), query_address); } } /* run the command */ if(np_runcmd(command_line, &chld_out, &chld_err, 0) != 0) { result = STATE_WARNING; msg = (char *)_("dig returned an error status"); } for(i = 0; i < chld_out.lines; i++) { /* the server is responding, we just got the host name... */ if (strstr (chld_out.line[i], ";; ANSWER SECTION:")) { /* loop through the whole 'ANSWER SECTION' */ for(; i < chld_out.lines; i++) { /* get the host address */ if (verbose) printf ("%s\n", chld_out.line[i]); if (strstr (chld_out.line[i], (expected_address == NULL ? query_address : expected_address)) != NULL) { msg = chld_out.line[i]; result = STATE_OK; /* Translate output TAB -> SPACE */ t = msg; while ((t = strchr(t, '\t')) != NULL) *t = ' '; break; } } if (result == STATE_UNKNOWN) { msg = (char *)_("Server not found in ANSWER SECTION"); result = STATE_WARNING; } /* we found the answer section, so break out of the loop */ break; } } if (result == STATE_UNKNOWN) { msg = (char *)_("No ANSWER SECTION found"); result = STATE_CRITICAL; } /* If we get anything on STDERR, at least set warning */ if(chld_err.buflen > 0) { result = max_state(result, STATE_WARNING); if(!msg) for(i = 0; i < chld_err.lines; i++) { msg = strchr(chld_err.line[0], ':'); if(msg) { msg++; break; } } } microsec = deltime (tv); elapsed_time = (double)microsec / 1.0e6; if (critical_interval > UNDEFINED && elapsed_time > critical_interval) result = STATE_CRITICAL; else if (warning_interval > UNDEFINED && elapsed_time > warning_interval) result = STATE_WARNING; printf ("DNS %s - %.3f seconds response time (%s)|%s\n", state_text (result), elapsed_time, msg ? msg : _("Probably a non-existent host/domain"), fperfdata("time", elapsed_time, "s", (warning_interval>UNDEFINED?TRUE:FALSE), warning_interval, (critical_interval>UNDEFINED?TRUE:FALSE), critical_interval, TRUE, 0, FALSE, 0)); return result; }
int main (int argc, char **argv) { char *command_line = NULL; char input_buffer[MAX_INPUT_BUFFER]; char *address = NULL; /* comma seperated str with addrs/ptrs (sorted) */ char **addresses = NULL; int n_addresses = 0; char *msg = NULL; char *temp_buffer = NULL; int non_authoritative = FALSE; int result = STATE_UNKNOWN; double elapsed_time; long microsec; struct timeval tv; int multi_address; int parse_address = FALSE; /* This flag scans for Address: but only after Name: */ output chld_out, chld_err; size_t i; setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); /* Set signal handling and alarm */ if (signal (SIGALRM, runcmd_timeout_alarm_handler) == SIG_ERR) { usage_va(_("Cannot catch SIGALRM")); } /* Parse extra opts if any */ argv=np_extra_opts (&argc, argv, progname); if (process_arguments (argc, argv) == ERROR) { usage_va(_("Could not parse arguments")); } /* get the command to run */ xasprintf (&command_line, "%s %s %s", NSLOOKUP_COMMAND, query_address, dns_server); alarm (timeout_interval); gettimeofday (&tv, NULL); if (verbose) printf ("%s\n", command_line); /* run the command */ if((np_runcmd(command_line, &chld_out, &chld_err, 0)) != 0) { msg = (char *)_("nslookup returned an error status"); result = STATE_WARNING; } /* scan stdout */ for(i = 0; i < chld_out.lines; i++) { if (addresses == NULL) addresses = malloc(sizeof(*addresses)*10); else if (!(n_addresses % 10)) addresses = realloc(addresses,sizeof(*addresses) * (n_addresses + 10)); if (verbose) puts(chld_out.line[i]); if (strstr (chld_out.line[i], ".in-addr.arpa")) { if ((temp_buffer = strstr (chld_out.line[i], "name = "))) addresses[n_addresses++] = strdup (temp_buffer + 7); else { msg = (char *)_("Warning plugin error"); result = STATE_WARNING; } } /* the server is responding, we just got the host name... */ if (strstr (chld_out.line[i], "Name:")) parse_address = TRUE; else if (parse_address == TRUE && (strstr (chld_out.line[i], "Address:") || strstr (chld_out.line[i], "Addresses:"))) { temp_buffer = index (chld_out.line[i], ':'); temp_buffer++; /* Strip leading spaces */ for (; *temp_buffer != '\0' && *temp_buffer == ' '; temp_buffer++) /* NOOP */; strip(temp_buffer); if (temp_buffer==NULL || strlen(temp_buffer)==0) { die (STATE_CRITICAL, _("DNS CRITICAL - '%s' returned empty host name string\n"), NSLOOKUP_COMMAND); } addresses[n_addresses++] = strdup(temp_buffer); } else if (strstr (chld_out.line[i], _("Non-authoritative answer:"))) { non_authoritative = TRUE; } result = error_scan (chld_out.line[i]); if (result != STATE_OK) { msg = strchr (chld_out.line[i], ':'); if(msg) msg++; break; } } /* scan stderr */ for(i = 0; i < chld_err.lines; i++) { if (verbose) puts(chld_err.line[i]); if (error_scan (chld_err.line[i]) != STATE_OK) { result = max_state (result, error_scan (chld_err.line[i])); msg = strchr(input_buffer, ':'); if(msg) msg++; } } if (addresses) { int i,slen; char *adrp; qsort(addresses, n_addresses, sizeof(*addresses), qstrcmp); for(i=0, slen=1; i < n_addresses; i++) { slen += strlen(addresses[i])+1; } adrp = address = malloc(slen); for(i=0; i < n_addresses; i++) { if (i) *adrp++ = ','; strcpy(adrp, addresses[i]); adrp += strlen(addresses[i]); } *adrp = 0; } else die (STATE_CRITICAL, _("DNS CRITICAL - '%s' msg parsing exited with no address\n"), NSLOOKUP_COMMAND); /* compare to expected address */ if (result == STATE_OK && expected_address_cnt > 0) { result = STATE_CRITICAL; temp_buffer = ""; for (i=0; i<expected_address_cnt; i++) { /* check if we get a match and prepare an error string */ if (strcmp(address, expected_address[i]) == 0) result = STATE_OK; xasprintf(&temp_buffer, "%s%s; ", temp_buffer, expected_address[i]); } if (result == STATE_CRITICAL) { /* Strip off last semicolon... */ temp_buffer[strlen(temp_buffer)-2] = '\0'; xasprintf(&msg, _("expected '%s' but got '%s'"), temp_buffer, address); } } /* check if authoritative */ if (result == STATE_OK && expect_authority && non_authoritative) { result = STATE_CRITICAL; xasprintf(&msg, _("server %s is not authoritative for %s"), dns_server, query_address); } microsec = deltime (tv); elapsed_time = (double)microsec / 1.0e6; if (result == STATE_OK) { if (strchr (address, ',') == NULL) multi_address = FALSE; else multi_address = TRUE; result = get_status(elapsed_time, time_thresholds); if (result == STATE_OK) { printf ("DNS %s: ", _("OK")); } else if (result == STATE_WARNING) { printf ("DNS %s: ", _("WARNING")); } else if (result == STATE_CRITICAL) { printf ("DNS %s: ", _("CRITICAL")); } printf (ngettext("%.3f second response time", "%.3f seconds response time", elapsed_time), elapsed_time); printf (_(". %s returns %s"), query_address, address); printf ("|%s\n", fperfdata ("time", elapsed_time, "s", FALSE, 0, FALSE, 0, TRUE, 0, FALSE, 0)); } else if (result == STATE_WARNING) printf (_("DNS WARNING - %s\n"), !strcmp (msg, "") ? _(" Probably a non-existent host/domain") : msg); else if (result == STATE_CRITICAL) printf (_("DNS CRITICAL - %s\n"), !strcmp (msg, "") ? _(" Probably a non-existent host/domain") : msg); else printf (_("DNS UNKNOWN - %s\n"), !strcmp (msg, "") ? _(" Probably a non-existent host/domain") : msg); return result; }
int main (int argc, char **argv) { char *command_line; int result = STATE_UNKNOWN; char *p, *ret[QSTAT_MAX_RETURN_ARGS]; size_t i = 0; output chld_out; setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); /* Parse extra opts if any */ argv=np_extra_opts (&argc, argv, progname); if (process_arguments (argc, argv) == ERROR) usage_va(_("Could not parse arguments")); result = STATE_OK; /* create the command line to execute */ xasprintf (&command_line, "%s -raw %s -%s %s", PATH_TO_QSTAT, QSTAT_DATA_DELIMITER, game_type, server_ip); if (port) xasprintf (&command_line, "%s:%-d", command_line, port); if (verbose > 0) printf ("%s\n", command_line); /* run the command. historically, this plugin ignores output on stderr, * as well as return status of the qstat program */ (void)np_runcmd(command_line, &chld_out, NULL, 0); /* sanity check */ /* was thinking about running qstat without any options, capturing the -default line, parsing it & making an array of all know server types but thought this would be too much hassle considering this is a tool for intelligent sysadmins (ha). Could put a static array of known server types in a header file but then we'd be limiting ourselves In the end, I figured I'd simply let an error occur & then trap it */ if (!strncmp (chld_out.line[0], "unknown option", 14)) { printf (_("CRITICAL - Host type parameter incorrect!\n")); result = STATE_CRITICAL; return result; } p = (char *) strtok (chld_out.line[0], QSTAT_DATA_DELIMITER); while (p != NULL) { ret[i] = p; p = (char *) strtok (NULL, QSTAT_DATA_DELIMITER); i++; if (i >= QSTAT_MAX_RETURN_ARGS) break; } if (strstr (ret[2], QSTAT_HOST_ERROR)) { printf (_("CRITICAL - Host not found\n")); result = STATE_CRITICAL; } else if (strstr (ret[2], QSTAT_HOST_DOWN)) { printf (_("CRITICAL - Game server down or unavailable\n")); result = STATE_CRITICAL; } else if (strstr (ret[2], QSTAT_HOST_TIMEOUT)) { printf (_("CRITICAL - Game server timeout\n")); result = STATE_CRITICAL; } else { printf ("OK: %s/%s %s (%s), Ping: %s ms|%s %s\n", ret[qstat_game_players], ret[qstat_game_players_max], ret[qstat_game_field], ret[qstat_map_field], ret[qstat_ping_field], perfdata ("players", atol(ret[qstat_game_players]), "", FALSE, 0, FALSE, 0, TRUE, 0, TRUE, atol(ret[qstat_game_players_max])), fperfdata ("ping", strtod(ret[qstat_ping_field], NULL), "", FALSE, 0, FALSE, 0, TRUE, 0, FALSE, 0)); } return result; }
int main (int argc, char **argv) { int result = STATE_UNKNOWN; char input_buffer[MAX_INPUT_BUFFER]; unsigned long latest_entry_time = 0L; unsigned long temp_entry_time = 0L; int proc_entries = 0; time_t current_time; char *temp_ptr; FILE *fp; int procuid = 0; int procpid = 0; int procppid = 0; int procvsz = 0; int procrss = 0; float procpcpu = 0; char procstat[8]; #ifdef PS_USES_PROCETIME char procetime[MAX_INPUT_BUFFER]; #endif /* PS_USES_PROCETIME */ char procprog[MAX_INPUT_BUFFER]; char *procargs; int pos, cols; int expected_cols = PS_COLS - 1; const char *zombie = "Z"; char *temp_string; output chld_out, chld_err; size_t i; setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); /* Parse extra opts if any */ argv=np_extra_opts (&argc, argv, progname); if (process_arguments (argc, argv) == ERROR) usage_va(_("Could not parse arguments")); /* Set signal handling and alarm timeout */ if (signal (SIGALRM, timeout_alarm_handler) == SIG_ERR) { usage_va(_("Cannot catch SIGALRM")); } /* handle timeouts gracefully... */ alarm (timeout_interval); /* open the status log */ fp = fopen (status_log, "r"); if (fp == NULL) { die (STATE_CRITICAL, "NAGIOS %s: %s\n", _("CRITICAL"), _("Cannot open status log for reading!")); } /* get the date/time of the last item updated in the log */ while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, fp)) { if ((temp_ptr = strstr (input_buffer, "created=")) != NULL) { temp_entry_time = strtoul (temp_ptr + 8, NULL, 10); latest_entry_time = temp_entry_time; break; } else if ((temp_ptr = strtok (input_buffer, "]")) != NULL) { temp_entry_time = strtoul (temp_ptr + 1, NULL, 10); if (temp_entry_time > latest_entry_time) latest_entry_time = temp_entry_time; } } fclose (fp); if (verbose >= 2) printf("command: %s\n", PS_COMMAND); /* run the command to check for the Nagios process.. */ if((result = np_runcmd(PS_COMMAND, &chld_out, &chld_err, 0)) != 0) result = STATE_WARNING; /* count the number of matching Nagios processes... */ for(i = 0; i < chld_out.lines; i++) { cols = sscanf (chld_out.line[i], PS_FORMAT, PS_VARLIST); /* Zombie processes do not give a procprog command */ if ( cols == (expected_cols - 1) && strstr(procstat, zombie) ) { cols = expected_cols; /* Set some value for procargs for the strip command further below * Seen to be a problem on some Solaris 7 and 8 systems */ chld_out.line[i][pos] = '\n'; chld_out.line[i][pos+1] = 0x0; } if ( cols >= expected_cols ) { xasprintf (&procargs, "%s", chld_out.line[i] + pos); strip (procargs); /* Some ps return full pathname for command. This removes path */ temp_string = strtok ((char *)procprog, "/"); while (temp_string) { strcpy(procprog, temp_string); temp_string = strtok (NULL, "/"); } /* May get empty procargs */ if (!strstr(procargs, argv[0]) && strstr(procargs, process_string) && strcmp(procargs,"")) { proc_entries++; if (verbose >= 2) { printf (_("Found process: %s %s\n"), procprog, procargs); } } } } /* If we get anything on stderr, at least set warning */ if(chld_err.buflen) result = max_state (result, STATE_WARNING); /* reset the alarm handler */ alarm (0); if (proc_entries == 0) { die (STATE_CRITICAL, "NAGIOS %s: %s\n", _("CRITICAL"), _("Could not locate a running Nagios process!")); } if (latest_entry_time == 0L) { die (STATE_CRITICAL, "NAGIOS %s: %s\n", _("CRITICAL"), _("Cannot parse Nagios log file for valid time")); } time (¤t_time); if ((int)(current_time - latest_entry_time) > (expire_minutes * 60)) { result = STATE_WARNING; } else { result = STATE_OK; } printf ("NAGIOS %s: ", (result == STATE_OK) ? _("OK") : _("WARNING")); printf (ngettext ("%d process", "%d processes", proc_entries), proc_entries); printf (", "); printf ( ngettext ("status log updated %d second ago", "status log updated %d seconds ago", (int) (current_time - latest_entry_time) ), (int) (current_time - latest_entry_time) ); printf ("\n"); return result; }
int main (int argc, char **argv) { char *command_line = NULL; char input_buffer[MAX_INPUT_BUFFER]; char *address = NULL; /* comma seperated str with addrs/ptrs (sorted) */ char **addresses = NULL; int n_addresses = 0; char *msg = NULL; char query_found[16] = ""; char *temp_buffer = NULL; int non_authoritative = TRUE; int result = STATE_UNKNOWN; double elapsed_time; long microsec; struct timeval tv; int multi_address; int parse_address = FALSE; /* This flag scans for Address: but only after Name: */ output chld_out, chld_err; size_t i; setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); /* Set signal handling and alarm */ if (signal (SIGALRM, runcmd_timeout_alarm_handler) == SIG_ERR) { usage_va(_("Cannot catch SIGALRM")); } /* Parse extra opts if any */ argv=np_extra_opts (&argc, argv, progname); if (process_arguments (argc, argv) == ERROR) { usage_va(_("Could not parse arguments")); } /* get the command to run */ xasprintf (&command_line, "%s %s %s %s", NSLOOKUP_COMMAND, query_type, query_address, dns_server); alarm (timeout_interval); gettimeofday (&tv, NULL); if (verbose) printf ("%s\n", command_line); /* run the command */ if((np_runcmd(command_line, &chld_out, &chld_err, 0)) != 0) { msg = (char *)_("nslookup returned an error status"); result = STATE_WARNING; } /* scan stdout */ for(i = 0; i < chld_out.lines; i++) { if (addresses == NULL) addresses = malloc(sizeof(*addresses)*10); else if (!(n_addresses % 10)) addresses = realloc(addresses,sizeof(*addresses) * (n_addresses + 10)); if (verbose) puts(chld_out.line[i]); if (strstr (chld_out.line[i], "Authoritative answers can be found from:")) { non_authoritative = FALSE; break; } /* the server is responding, we just got the host name... */ if (strstr (chld_out.line[i], "Name:")) parse_address = TRUE; /* begin handling types of records */ if (strstr (chld_out.line[i], "AAAA address")) { if (verbose) printf("Found AAAA record\n"); temp_buffer = rindex (chld_out.line[i], ' '); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=AAAA", sizeof(query_found)); } else if (strstr (chld_out.line[i], "exchanger =")) { if (verbose) printf("Found MX record\n"); temp_buffer = index (chld_out.line[i], '='); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=MX", sizeof(query_found)); } else if (strstr (chld_out.line[i], "service =")) { if (verbose) printf("Found SRV record\n"); temp_buffer = index (chld_out.line[i], '='); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=SRV", sizeof(query_found)); } else if (accept_cname && strstr (chld_out.line[i], "canonical name =")) { if (verbose) printf("Found CNAME record\n"); temp_buffer = index (chld_out.line[i], '='); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=CNAME", sizeof(query_found)); } else if (parse_address == TRUE && (strstr (chld_out.line[i], "Address:") || strstr (chld_out.line[i], "Addresses:"))) { if (verbose) printf("Found A record\n"); temp_buffer = index (chld_out.line[i], ':'); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=A", sizeof(query_found)); } else if (strstr (chld_out.line[i], "nameserver =")) { if (verbose) printf("Found NS record\n"); temp_buffer = index (chld_out.line[i], '='); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=NS", sizeof(query_found)); } else if (strstr (chld_out.line[i], "dname =")) { if (verbose) printf("Found DNAME record\n"); temp_buffer = index (chld_out.line[i], '='); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=DNAME", sizeof(query_found)); } /* must be after other records with "name" as an identifier, as ptr does not spefify */ else if (strstr (chld_out.line[i], "name =")) { if (verbose) printf("Found PTR record\n"); temp_buffer = index (chld_out.line[i], '='); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=PTR", sizeof(query_found)); } else if (strstr (chld_out.line[i], "protocol =")) { if (verbose) printf("Found WKS record\n"); temp_buffer = index (chld_out.line[i], '='); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=WKS", sizeof(query_found)); } /* TODO: needs to be changed to handle txt output and max size of txt recrods */ else if (strstr (chld_out.line[i], "text =")) { if (verbose) printf("Found TXT record\n"); temp_buffer = index (chld_out.line[i], '='); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=TXT", sizeof(query_found)); } /* only matching for origin records, if requested other fields could be included at a later date */ else if (strstr (chld_out.line[i], "origin =")) { if (verbose) printf("Found SOA record\n"); temp_buffer = index(chld_out.line[i], '='); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=SOA", sizeof(query_found)); } if (strstr (chld_out.line[i], _("Non-authoritative answer:"))) { non_authoritative = TRUE; } result = error_scan (chld_out.line[i]); if (result != STATE_OK) { msg = strchr (chld_out.line[i], ':'); if(msg) msg++; break; } } /* scan stderr */ for(i = 0; i < chld_err.lines; i++) { if (verbose) puts(chld_err.line[i]); if (error_scan (chld_err.line[i]) != STATE_OK) { result = max_state (result, error_scan (chld_err.line[i])); msg = strchr(input_buffer, ':'); if(msg) msg++; } } if (addresses) { int i,slen; char *adrp; qsort(addresses, n_addresses, sizeof(*addresses), qstrcmp); for(i=0, slen=1; i < n_addresses; i++) { slen += strlen(addresses[i])+1; } adrp = address = malloc(slen); for(i=0; i < n_addresses; i++) { if (i) *adrp++ = ','; strcpy(adrp, addresses[i]); adrp += strlen(addresses[i]); } *adrp = 0; } else die (STATE_CRITICAL, _("DNS CRITICAL - '%s' msg parsing exited with no address\n"), NSLOOKUP_COMMAND); /* compare to expected address */ if (result == STATE_OK && expected_address_cnt > 0) { result = STATE_CRITICAL; temp_buffer = ""; for (i=0; i<expected_address_cnt; i++) { /* check if we get a match and prepare an error string */ if (strcmp(address, expected_address[i]) == 0) result = STATE_OK; xasprintf(&temp_buffer, "%s%s; ", temp_buffer, expected_address[i]); } if (result == STATE_CRITICAL) { /* Strip off last semicolon... */ temp_buffer[strlen(temp_buffer)-2] = '\0'; xasprintf(&msg, _("expected '%s' but got '%s'"), temp_buffer, address); } } /* check if authoritative */ if (result == STATE_OK && expect_authority && !non_authoritative) { result = STATE_CRITICAL; if (strncmp(dns_server, "", 1)) xasprintf(&msg, _("server %s is not authoritative for %s"), dns_server, query_address); else xasprintf(&msg, _("there is no authoritative server for %s"), query_address); } /* compare query type to query found, if query type is ANY we can skip as any record is accepted*/ if (result == STATE_OK && strncmp(query_type, "", 1) && (strncmp(query_type, "-querytype=ANY", 15) != 0)) { if (strncmp(query_type, query_found, 16) != 0) { if (verbose) printf( "Failed query for %s only found %s, or nothing\n", query_type, query_found); result = STATE_CRITICAL; xasprintf(&msg, _("query type of %s was not found for %s"), query_type, query_address); } } microsec = deltime (tv); elapsed_time = (double)microsec / 1.0e6; if (result == STATE_OK) { if (strchr (address, ',') == NULL) multi_address = FALSE; else multi_address = TRUE; result = get_status(elapsed_time, time_thresholds); if (result == STATE_OK) { printf ("DNS %s: ", _("OK")); } else if (result == STATE_WARNING) { printf ("DNS %s: ", _("WARNING")); } else if (result == STATE_CRITICAL) { printf ("DNS %s: ", _("CRITICAL")); } printf (ngettext("%.3f second response time", "%.3f seconds response time", elapsed_time), elapsed_time); printf (_(". %s returns %s"), query_address, address); if ((time_thresholds->warning != NULL) && (time_thresholds->critical != NULL)) { printf ("|%s\n", fperfdata ("time", elapsed_time, "s", TRUE, time_thresholds->warning->end, TRUE, time_thresholds->critical->end, TRUE, 0, FALSE, 0)); } else if ((time_thresholds->warning == NULL) && (time_thresholds->critical != NULL)) { printf ("|%s\n", fperfdata ("time", elapsed_time, "s", FALSE, 0, TRUE, time_thresholds->critical->end, TRUE, 0, FALSE, 0)); } else if ((time_thresholds->warning != NULL) && (time_thresholds->critical == NULL)) { printf ("|%s\n", fperfdata ("time", elapsed_time, "s", TRUE, time_thresholds->warning->end, FALSE, 0, TRUE, 0, FALSE, 0)); } else printf ("|%s\n", fperfdata ("time", elapsed_time, "s", FALSE, 0, FALSE, 0, TRUE, 0, FALSE, 0)); } else if (result == STATE_WARNING) printf (_("DNS WARNING - %s\n"), !strcmp (msg, "") ? _(" Probably a non-existent host/domain") : msg); else if (result == STATE_CRITICAL) printf (_("DNS CRITICAL - %s\n"), !strcmp (msg, "") ? _(" Probably a non-existent host/domain") : msg); else printf (_("DNS UNKNOWN - %s\n"), !strcmp (msg, "") ? _(" Probably a non-existent host/domain") : msg); return result; }
int main (int argc, char **argv) { char *status_text; int cresult; int result = STATE_UNKNOWN; int i; time_t local_time; FILE *fp = NULL; struct output chld_out, chld_err; remotecmd = ""; comm = strdup (SSH_COMMAND); setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); /* process arguments */ if (process_arguments (argc, argv) == ERROR) usage_va(_("Could not parse arguments")); /* Set signal handling and alarm timeout */ if (signal (SIGALRM, popen_timeout_alarm_handler) == SIG_ERR) { usage_va(_("Cannot catch SIGALRM")); } alarm (timeout_interval); /* run the command */ if (verbose) printf ("%s\n", comm); result = np_runcmd(comm, &chld_out, &chld_err, 0); if (skip_stdout == -1) /* --skip-stdout specified without argument */ skip_stdout = chld_out.lines; if (skip_stderr == -1) /* --skip-stderr specified without argument */ skip_stderr = chld_err.lines; /* UNKNOWN if (non-skipped) output found on stderr */ if(chld_err.lines > skip_stderr) { printf (_("Remote command execution failed: %s\n"), chld_err.line[skip_stderr]); return STATE_UNKNOWN; } /* this is simple if we're not supposed to be passive. * Wrap up quickly and keep the tricks below */ if(!passive) { if (chld_out.lines > skip_stdout) for (i = skip_stdout; i < chld_out.lines; i++) puts (chld_out.line[i]); else printf (_("%s - check_by_ssh: Remote command '%s' returned status %d\n"), state_text(result), remotecmd, result); return result; /* return error status from remote command */ } /* * Passive mode */ /* process output */ if (!(fp = fopen (outputfile, "a"))) { printf (_("SSH WARNING: could not open %s\n"), outputfile); exit (STATE_UNKNOWN); } local_time = time (NULL); commands = 0; for(i = skip_stdout; i < chld_out.lines; i++) { status_text = strstr (chld_out.line[i], "STATUS CODE: "); if (status_text == NULL) { printf ("%s", chld_out.line[i]); return result; } if (service[commands] && status_text && sscanf (status_text, "STATUS CODE: %d", &cresult) == 1) { fprintf (fp, "[%d] PROCESS_SERVICE_CHECK_RESULT;%s;%s;%d;%s\n", (int) local_time, host_shortname, service[commands++], cresult, chld_out.line[i]); } } /* force an OK state */ return result; }