Code

still trying to fix #1094326
[nagiosplug.git] / plugins / check_dns.c
index 2a8f459275fbc2cf13214b0cc471a36be6db26dc..94d4300c85e5f54c004120549a62b3f21562813f 100644 (file)
@@ -71,7 +71,7 @@ main (int argc, char **argv)
                usage4 (_("Cannot catch SIGALRM"));
        }
 
-       if (process_arguments (argc, argv) != TRUE) {
+       if (process_arguments (argc, argv) == ERROR) {
                usage4 (_("Could not parse arguments"));
        }
 
@@ -135,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;
                }
 
@@ -150,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, ':'));
@@ -163,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"));
        }
 
@@ -196,7 +200,7 @@ main (int argc, char **argv)
                        multi_address = TRUE;
 
                printf ("DNS %s: ", _("OK"));
-               printf (_("%.3f seconds response 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));
        }
@@ -220,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... */
@@ -235,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 */
@@ -264,7 +277,6 @@ error_scan (char *input_buffer)
 }
 
 
-
 /* process command-line arguments */
 int
 process_arguments (int argc, char **argv)
@@ -300,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);
@@ -324,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"));
@@ -375,7 +383,6 @@ process_arguments (int argc, char **argv)
 }
 
 
-
 int
 validate_arguments ()
 {
@@ -386,7 +393,6 @@ validate_arguments ()
 }
 
 
-
 void
 print_help (void)
 {
@@ -421,7 +427,6 @@ specified in /etc/resolv.conf will be used.\n\n"));
 }
 
 
-
 void
 print_usage (void)
 {