X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fcheck_dig.c;h=6e0408744f2902ea55d28c42f29fdc7895398ef9;hb=cb448eb1d57259641e10494e8d74d885e44c215d;hp=384b380b8ba5afa291e7847ca8257f349b700639;hpb=f4c6f7f09305c1c9916da6ac4f7aadcb31e319e0;p=nagiosplug.git diff --git a/plugins/check_dig.c b/plugins/check_dig.c index 384b380..6e04087 100644 --- a/plugins/check_dig.c +++ b/plugins/check_dig.c @@ -1,26 +1,54 @@ -/****************************************************************************** +/***************************************************************************** * -* check_dig.c +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. * -* Program: dig plugin for Nagios -* License: GPL -* Copyright (c) 2000 +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. * -* $Id$ +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ +const char *progname = "check_dig"; +const char *revision = "$Revision$"; +const char *copyright = "2002-2003"; +const char *authors = "Nagios Plugin Development Team"; +const char *email = "nagiosplug-devel@lists.sourceforge.net"; + +const char *summary = "Test the DNS service on the specified host using dig\n"; + +const char *option_summary = "-H host -l lookup [-t timeout] [-v]"; + +const char *options = "\ + -H, --hostname=STRING or IPADDRESS\n\ + Check server on the indicated host\n\ + -l, --lookup=STRING\n\ + machine name to lookup\n\ + -t, --timeout=INTEGER\n\ + Seconds before connection attempt times out (default: %d)\n\ + -v, --verbose\n\ + Print extra information (command-line use only)\n"; + +const char *standard_options = "\ + -h, --help\n\ + Print detailed help screen\n\ + -V, --version\n\ + Print version information\n\n"; + #include "config.h" #include "common.h" #include "utils.h" #include "popen.h" -#define PROGNAME "check_dig" - int process_arguments (int, char **); -int call_getopt (int, char **); int validate_arguments (void); -int check_disk (int usp, int free_disk); void print_help (void); void print_usage (void); @@ -33,7 +61,7 @@ main (int argc, char **argv) { char input_buffer[MAX_INPUT_BUFFER]; char *command_line = NULL; - char *output = NULL; + char *output = ""; int result = STATE_UNKNOWN; /* Set signal handling and alarm */ @@ -44,9 +72,7 @@ main (int argc, char **argv) usage ("Could not parse arguments\n"); /* get the command to run */ - command_line = - ssprintf (command_line, "%s @%s %s", PATH_TO_DIG, dns_server, - query_address); + asprintf (&command_line, "%s @%s %s", PATH_TO_DIG, dns_server, query_address); alarm (timeout_interval); time (&start_time); @@ -64,8 +90,6 @@ main (int argc, char **argv) if (child_stderr == NULL) printf ("Could not open stderr for %s\n", command_line); - output = strscpy (output, ""); - while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) { /* the server is responding, we just got the host name... */ @@ -79,11 +103,11 @@ main (int argc, char **argv) input_buffer[strcspn (input_buffer, "\r\n")] = '\0'; if (strstr (input_buffer, query_address) == input_buffer) { - output = strscpy (output, input_buffer); + asprintf (&output, input_buffer); result = STATE_OK; } else { - strcpy (output, "Server not found in ANSWER SECTION"); + asprintf (&output, "Server not found in ANSWER SECTION"); result = STATE_WARNING; } @@ -93,15 +117,15 @@ main (int argc, char **argv) } if (result != STATE_OK) { - strcpy (output, "No ANSWER SECTION found"); + asprintf (&output, "No ANSWER SECTION found"); } while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr)) { /* If we get anything on STDERR, at least set warning */ result = max_state (result, STATE_WARNING); printf ("%s", input_buffer); - if (!strcmp (output, "")) - strcpy (output, 1 + index (input_buffer, ':')); + if (strlen (output) == 0) + asprintf (&output, 1 + index (input_buffer, ':')); } (void) fclose (child_stderr); @@ -109,27 +133,24 @@ main (int argc, char **argv) /* close the pipe */ if (spclose (child_process)) { result = max_state (result, STATE_WARNING); - if (!strcmp (output, "")) - strcpy (output, "nslookup returned error status"); + if (strlen (output) == 0) + asprintf (&output, "dig returned error status"); } (void) time (&end_time); + if (output == NULL || strlen (output) == 0) + asprintf (&output, " Probably a non-existent host/domain"); + if (result == STATE_OK) - printf ("DNS ok - %d seconds response time (%s)\n", + printf ("DNS OK - %d seconds response time (%s)\n", (int) (end_time - start_time), output); else if (result == STATE_WARNING) - printf ("DNS WARNING - %s\n", - !strcmp (output, - "") ? " Probably a non-existent host/domain" : output); + printf ("DNS WARNING - %s\n", output); else if (result == STATE_CRITICAL) - printf ("DNS CRITICAL - %s\n", - !strcmp (output, - "") ? " Probably a non-existent host/domain" : output); + printf ("DNS CRITICAL - %s\n", output); else - printf ("DNS problem - %s\n", - !strcmp (output, - "") ? " Probably a non-existent host/domain" : output); + printf ("DNS problem - %s\n", output); return result; } @@ -140,43 +161,6 @@ process_arguments (int argc, char **argv) { int c; - if (argc < 2) - return ERROR; - - - c = 0; - while ((c += (call_getopt (argc - c, &argv[c]))) < argc) { - - if (is_option (argv[c])) - continue; - - if (dns_server == NULL) { - if (is_host (argv[c])) { - dns_server = argv[c]; - } - else { - usage ("Invalid host name"); - } - } - } - - if (dns_server == NULL) - dns_server = strscpy (NULL, "127.0.0.1"); - - return validate_arguments (); -} - - - - - - -int -call_getopt (int argc, char **argv) -{ - int c, i = 0; - -#ifdef HAVE_GETOPT_H int option_index = 0; static struct option long_options[] = { {"hostname", required_argument, 0, 'H'}, @@ -186,28 +170,19 @@ call_getopt (int argc, char **argv) {"help", no_argument, 0, 'h'}, {0, 0, 0, 0} }; -#endif - while (1) { -#ifdef HAVE_GETOPT_H - c = getopt_long (argc, argv, "+hVvt:l:H:", long_options, &option_index); -#else - c = getopt (argc, argv, "+?hVvt:l:H:"); -#endif + if (argc < 2) + return ERROR; - i++; + while (1) { + c = getopt_long (argc, argv, "hVvt:l:H:", long_options, &option_index); - if (c == -1 || c == EOF || c == 1) + if (c == -1 || c == EOF) break; switch (c) { - case 't': - case 'l': - case 'H': - i++; - } - - switch (c) { + case '?': /* help */ + usage3 ("Unknown argument", optopt); case 'H': /* hostname */ if (is_host (optarg)) { dns_server = optarg; @@ -231,16 +206,30 @@ call_getopt (int argc, char **argv) } break; case 'V': /* version */ - print_revision (PROGNAME, "$Revision$"); + print_revision (progname, "$Revision$"); exit (STATE_OK); case 'h': /* help */ print_help (); exit (STATE_OK); - case '?': /* help */ - usage ("Invalid argument\n"); } } - return i; + + c = optind; + if (dns_server == NULL) { + if (c < argc) { + if (is_host (argv[c])) { + dns_server = argv[c]; + } + else { + usage ("Invalid host name"); + } + } + else { + dns_server = strdup ("127.0.0.1"); + } + } + + return validate_arguments (); } @@ -252,7 +241,7 @@ validate_arguments (void) { return OK; } - + @@ -260,25 +249,13 @@ validate_arguments (void) void print_help (void) { - print_revision (PROGNAME, "$Revision$"); - printf - ("Copyright (c) 2000 Karl DeBisschop\n\n" - "This plugin use dig to test the DNS service on the specified host.\n\n"); + print_revision (progname, revision); + printf ("Copyright (c) %s %s\n\t<%s>\n\n", copyright, authors, email); + printf (summary); print_usage (); - printf - ("\nOptions:\n" - " -H, --hostname=STRING or IPADDRESS\n" - " Check server on the indicated host\n" - " -l, --lookup=STRING\n" - " machine name to lookup\n" - " -t, --timeout=INTEGER\n" - " Seconds before connection attempt times out (default: %d)\n" - " -v, --verbose\n" - " Print extra information (command-line use only)\n" - " -h, --help\n" - " Print detailed help screen\n" - " -V, --version\n" - " Print version information\n\n", DEFAULT_SOCKET_TIMEOUT); + printf ("\nOptions:\n"); + printf (options, DEFAULT_SOCKET_TIMEOUT); + printf (standard_options); support (); } @@ -289,8 +266,7 @@ print_help (void) void print_usage (void) { - printf - ("Usage: %s -H host -l lookup [-t timeout] [-v]\n" - " %s --help\n" - " %s --version\n", PROGNAME, PROGNAME, PROGNAME); + printf ("Usage: %s %s\n", progname, option_summary); + printf (" %s (-h|--help)\n", progname); + printf (" %s (-V|--version)\n", progname); }