Code

still trying to fix #1094326
[nagiosplug.git] / plugins / check_dns.c
index 9ab001f7eea61cdcf8ef5a61e2012f5d374210b2..94d4300c85e5f54c004120549a62b3f21562813f 100644 (file)
 
 ******************************************************************************/
 
-#include "common.h"
-#include "popen.h"
-#include "utils.h"
-#include "netutils.h"
-
 const char *progname = "check_dns";
 const char *revision = "$Revision$";
 const char *copyright = "2000-2004";
 const char *email = "nagiosplug-devel@lists.sourceforge.net";
 
+#include "common.h"
+#include "popen.h"
+#include "utils.h"
+#include "netutils.h"
+
 int process_arguments (int, char **);
 int validate_arguments (void);
 int error_scan (char *);
@@ -68,13 +68,11 @@ main (int argc, char **argv)
 
        /* Set signal handling and alarm */
        if (signal (SIGALRM, popen_timeout_alarm_handler) == SIG_ERR) {
-               printf (_("Cannot catch SIGALRM"));
-               return STATE_UNKNOWN;
+               usage4 (_("Cannot catch SIGALRM"));
        }
 
-       if (process_arguments (argc, argv) != OK) {
-               usage (_("check_dns: could not parse arguments\n"));
-               return STATE_UNKNOWN;
+       if (process_arguments (argc, argv) == ERROR) {
+               usage4 (_("Could not parse arguments"));
        }
 
        /* get the command to run */
@@ -137,7 +135,7 @@ main (int argc, char **argv)
                                asprintf(&address, "%s,%s", address, temp_buffer);
                }
 
-               else if (strstr (input_buffer, "Non-authoritative answer:")) {
+               else if (strstr (input_buffer, _("Non-authoritative answer:"))) {
                        non_authoritative = TRUE;
                }
 
@@ -152,6 +150,10 @@ main (int argc, char **argv)
 
        /* scan stderr */
        while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr)) {
+
+               if (verbose)
+                       printf ("%s", input_buffer);
+
                if (error_scan (input_buffer) != STATE_OK) {
                        result = max_state (result, error_scan (input_buffer));
                        output = strdup (1 + index (input_buffer, ':'));
@@ -165,7 +167,7 @@ main (int argc, char **argv)
        /* close stdout */
        if (spclose (child_process)) {
                result = max_state (result, STATE_WARNING);
-               if (!strcmp (output, ""))
+               if (output == NULL || !strcmp (output, ""))
                        output = strdup (_("nslookup returned error status"));
        }
 
@@ -198,7 +200,7 @@ main (int argc, char **argv)
                        multi_address = TRUE;
 
                printf ("DNS %s: ", _("OK"));
-               printf (ngettext("%.3f second response time, ", "%.3f seconds response time, ", elapsed_time), elapsed_time);
+               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));
        }
@@ -222,9 +224,9 @@ error_scan (char *input_buffer)
 {
 
        /* the DNS lookup timed out */
-       if (strstr (input_buffer, "Note: nslookup is deprecated and may be removed from future releases.") ||
-           strstr (input_buffer, "Consider using the `dig' or `host' programs instead.  Run nslookup with") ||
-           strstr (input_buffer, "the `-sil[ent]' option to prevent this message from appearing."))
+       if (strstr (input_buffer, _("Note: nslookup is deprecated and may be removed from future releases.")) ||
+           strstr (input_buffer, _("Consider using the `dig' or `host' programs instead.  Run nslookup with")) ||
+           strstr (input_buffer, _("the `-sil[ent]' option to prevent this message from appearing.")))
                return STATE_OK;
 
        /* DNS server is not running... */
@@ -237,15 +239,24 @@ error_scan (char *input_buffer)
 
        /* Connection was refused */
        else if (strstr (input_buffer, "Connection refused") ||
+                strstr (input_buffer, "Couldn't find server") ||
                 strstr (input_buffer, "Refused") ||
                 (strstr (input_buffer, "** server can't find") &&
                  strstr (input_buffer, ": REFUSED")))
                die (STATE_CRITICAL, _("Connection to DNS %s was refused\n"), dns_server);
 
+       /* Query refused (usually by an ACL in the namserver) */ 
+       else if (strstr (input_buffer, "Query refused"))
+               die (STATE_CRITICAL, _("Query was refused by DNS server at %s\n"), dns_server);
+
+       /* No information (e.g. nameserver IP has two PTR records) */
+       else if (strstr (input_buffer, "No information"))
+               die (STATE_CRITICAL, _("No information returned by DNS server at %s\n"), dns_server);
+
        /* Host or domain name does not exist */
        else if (strstr (input_buffer, "Non-existent") ||
                 strstr (input_buffer, "** server can't find") ||
-                strstr (input_buffer,"NXDOMAIN"))
+                strstr (input_buffer,"NXDOMAIN"))
                die (STATE_CRITICAL, _("Domain %s was not found by the server\n"), query_address);
 
        /* Network is unreachable */
@@ -266,7 +277,6 @@ error_scan (char *input_buffer)
 }
 
 
-
 /* process command-line arguments */
 int
 process_arguments (int argc, char **argv)
@@ -302,9 +312,7 @@ process_arguments (int argc, char **argv)
 
                switch (c) {
                case '?': /* args not parsable */
-                       printf (_("%s: Unknown argument: %s\n\n"), progname, optarg);
-                       print_usage ();
-                       exit (STATE_UNKNOWN);
+                       usage2 (_("Unknown argument"), optarg);
                case 'h': /* help */
                        print_help ();
                        exit (STATE_OK);
@@ -326,9 +334,7 @@ process_arguments (int argc, char **argv)
                        /* TODO: this is_host check is probably unnecessary. */
                        /* Better to confirm nslookup response matches */
                        if (is_host (optarg) == FALSE) {
-                               printf (_("Invalid hostname/address\n\n"));
-                               print_usage ();
-                               exit (STATE_UNKNOWN);
+                               usage2 (_("Invalid hostname/address"), optarg);
                        }
                        if (strlen (optarg) >= ADDRESS_LENGTH)
                                die (STATE_UNKNOWN, _("Input buffer overflow\n"));
@@ -377,7 +383,6 @@ process_arguments (int argc, char **argv)
 }
 
 
-
 int
 validate_arguments ()
 {
@@ -388,7 +393,6 @@ validate_arguments ()
 }
 
 
-
 void
 print_help (void)
 {
@@ -397,6 +401,12 @@ print_help (void)
        printf ("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>\n");
        printf (COPYRIGHT, copyright, email);
 
+       printf (_("\
+This plugin uses the nslookup program to obtain the IP address\n\
+for the given host/domain query.  A optional DNS server to use may\n\
+be specified.  If no DNS server is specified, the default server(s)\n\
+specified in /etc/resolv.conf will be used.\n\n"));
+
        print_usage ();
 
        printf (_(UT_HELP_VRSN));
@@ -413,22 +423,13 @@ print_help (void)
 
        printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT);
 
-       printf (_("\n\
-This plugin uses the nslookup program to obtain the IP address\n\
-for the given host/domain query.  A optional DNS server to use may\n\
-be specified.  If no DNS server is specified, the default server(s)\n\
-specified in /etc/resolv.conf will be used.\n"));
-
        printf (_(UT_SUPPORT));
 }
 
 
-
 void
 print_usage (void)
 {
-       printf (_("\
-Usage: %s -H host [-s server] [-a expected-address] [-A] [-t timeout]\n\
-       %s --help\n\
-       %s --version\n"), progname, progname, progname);
+       printf ("\
+Usage: %s -H host [-s server] [-a expected-address] [-A] [-t timeout]\n", progname);
 }