diff options
| -rw-r--r-- | plugins/check_dns.c | 115 |
1 files changed, 41 insertions, 74 deletions
diff --git a/plugins/check_dns.c b/plugins/check_dns.c index 309c65b7..1fc4039f 100644 --- a/plugins/check_dns.c +++ b/plugins/check_dns.c | |||
| @@ -1,48 +1,20 @@ | |||
| 1 | /****************************************************************************** | 1 | /****************************************************************************** |
| 2 | * | 2 | |
| 3 | * CHECK_DNS.C | 3 | This program is free software; you can redistribute it and/or modify |
| 4 | * | 4 | it under the terms of the GNU General Public License as published by |
| 5 | * Program: DNS plugin for Nagios | 5 | the Free Software Foundation; either version 2 of the License, or |
| 6 | * License: GPL | 6 | (at your option) any later version. |
| 7 | * Copyright (c) 1999 Ethan Galstad (nagios@nagios.org) | 7 | |
| 8 | * | 8 | This program is distributed in the hope that it will be useful, |
| 9 | * Last Modified: $Date$ | 9 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 10 | * | 10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 11 | * Notes: | 11 | GNU General Public License for more details. |
| 12 | * - Safe popen added by Karl DeBisschop 9-11-99 | 12 | |
| 13 | * - expected-address parameter added by Alex Chaffee - 7 Oct 2002 | 13 | You should have received a copy of the GNU General Public License |
| 14 | * | 14 | along with this program; if not, write to the Free Software |
| 15 | * Command line: (see print_usage) | 15 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
| 16 | * | 16 | |
| 17 | * Description: | 17 | ******************************************************************************/ |
| 18 | * | ||
| 19 | * This program will use the nslookup program to obtain the IP address | ||
| 20 | * for a given host name. A optional DNS server may be specified. If | ||
| 21 | * no DNS server is specified, the default server(s) for the system | ||
| 22 | * are used. | ||
| 23 | * | ||
| 24 | * Return Values: | ||
| 25 | * OK The DNS query was successful (host IP address was returned). | ||
| 26 | * WARNING The DNS server responded, but could not fulfill the request. | ||
| 27 | * CRITICAL The DNS server is not responding or encountered an error. | ||
| 28 | * | ||
| 29 | * License Information: | ||
| 30 | * | ||
| 31 | * This program is free software; you can redistribute it and/or modify | ||
| 32 | * it under the terms of the GNU General Public License as published by | ||
| 33 | * the Free Software Foundation; either version 2 of the License, or | ||
| 34 | * (at your option) any later version. | ||
| 35 | * | ||
| 36 | * This program is distributed in the hope that it will be useful, | ||
| 37 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 38 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 39 | * GNU General Public License for more details. | ||
| 40 | * | ||
| 41 | * You should have received a copy of the GNU General Public License | ||
| 42 | * along with this program; if not, write to the Free Software | ||
| 43 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 44 | * | ||
| 45 | *****************************************************************************/ | ||
| 46 | 18 | ||
| 47 | #include "common.h" | 19 | #include "common.h" |
| 48 | #include "popen.h" | 20 | #include "popen.h" |
| @@ -51,7 +23,7 @@ | |||
| 51 | 23 | ||
| 52 | const char *progname = "check_dns"; | 24 | const char *progname = "check_dns"; |
| 53 | const char *revision = "$Revision$"; | 25 | const char *revision = "$Revision$"; |
| 54 | const char *copyright = "2000-2003"; | 26 | const char *copyright = "2000-2004"; |
| 55 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; | 27 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; |
| 56 | 28 | ||
| 57 | int process_arguments (int, char **); | 29 | int process_arguments (int, char **); |
| @@ -81,6 +53,7 @@ main (int argc, char **argv) | |||
| 81 | long microsec; | 53 | long microsec; |
| 82 | struct timeval tv; | 54 | struct timeval tv; |
| 83 | int multi_address; | 55 | int multi_address; |
| 56 | int parse_address = FALSE; /* This flag scans for Address: but only after Name: */ | ||
| 84 | 57 | ||
| 85 | setlocale (LC_ALL, ""); | 58 | setlocale (LC_ALL, ""); |
| 86 | bindtextdomain (PACKAGE, LOCALEDIR); | 59 | bindtextdomain (PACKAGE, LOCALEDIR); |
| @@ -105,6 +78,7 @@ main (int argc, char **argv) | |||
| 105 | 78 | ||
| 106 | if (verbose) | 79 | if (verbose) |
| 107 | printf ("%s\n", command_line); | 80 | printf ("%s\n", command_line); |
| 81 | |||
| 108 | /* run the command */ | 82 | /* run the command */ |
| 109 | child_process = spopen (command_line); | 83 | child_process = spopen (command_line); |
| 110 | if (child_process == NULL) { | 84 | if (child_process == NULL) { |
| @@ -120,7 +94,7 @@ main (int argc, char **argv) | |||
| 120 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) { | 94 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) { |
| 121 | 95 | ||
| 122 | if (verbose) | 96 | if (verbose) |
| 123 | printf ("%s\n", input_buffer); | 97 | printf ("%s", input_buffer); |
| 124 | 98 | ||
| 125 | if (strstr (input_buffer, ".in-addr.arpa")) { | 99 | if (strstr (input_buffer, ".in-addr.arpa")) { |
| 126 | if ((temp_buffer = strstr (input_buffer, "name = "))) | 100 | if ((temp_buffer = strstr (input_buffer, "name = "))) |
| @@ -132,34 +106,26 @@ main (int argc, char **argv) | |||
| 132 | } | 106 | } |
| 133 | 107 | ||
| 134 | /* the server is responding, we just got the host name... */ | 108 | /* the server is responding, we just got the host name... */ |
| 135 | if (strstr (input_buffer, "Name:")) { | 109 | if (strstr (input_buffer, "Name:")) |
| 136 | 110 | parse_address = TRUE; | |
| 137 | /* get the host address */ | 111 | else if (strstr (input_buffer, "Address:") && parse_address == TRUE) { |
| 138 | if (!fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) | 112 | temp_buffer = index (input_buffer, ':'); |
| 139 | break; | 113 | temp_buffer++; |
| 140 | 114 | ||
| 141 | if (verbose) | 115 | /* Strip leading spaces */ |
| 142 | printf ("%s\n", input_buffer); | 116 | for (; *temp_buffer != '\0' && *temp_buffer == ' '; temp_buffer++) |
| 143 | 117 | /* NOOP */; | |
| 144 | if ((temp_buffer = index (input_buffer, ':'))) { | 118 | |
| 145 | temp_buffer++; | 119 | strip(temp_buffer); |
| 146 | /* Strip leading spaces */ | 120 | if (temp_buffer==NULL || strlen(temp_buffer)==0) { |
| 147 | for (; *temp_buffer != '\0' && *temp_buffer == ' '; temp_buffer++) | 121 | die (STATE_CRITICAL, _("DNS CRITICAL - '%s' returned empty host name string\n"), |
| 148 | /* NOOP */; | ||
| 149 | address = strdup (temp_buffer); | ||
| 150 | strip (address); | ||
| 151 | if (address==NULL || strlen(address)==0) | ||
| 152 | die (STATE_CRITICAL, | ||
| 153 | _("DNS CRITICAL - '%s' returned empty host name string\n"), | ||
| 154 | NSLOOKUP_COMMAND); | 122 | NSLOOKUP_COMMAND); |
| 155 | result = STATE_OK; | ||
| 156 | } | ||
| 157 | else { | ||
| 158 | output = strdup (_("Unknown error (plugin)")); | ||
| 159 | result = STATE_WARNING; | ||
| 160 | } | 123 | } |
| 161 | 124 | ||
| 162 | break; | 125 | if (address == NULL) |
| 126 | address = strdup (temp_buffer); | ||
| 127 | else | ||
| 128 | asprintf(&address, "%s,%s", address, temp_buffer); | ||
| 163 | } | 129 | } |
| 164 | 130 | ||
| 165 | result = error_scan (input_buffer); | 131 | result = error_scan (input_buffer); |
| @@ -212,9 +178,10 @@ main (int argc, char **argv) | |||
| 212 | else | 178 | else |
| 213 | multi_address = TRUE; | 179 | multi_address = TRUE; |
| 214 | 180 | ||
| 215 | printf (_("DNS ok - %.3f seconds response time, address%s %s|%s\n"), | 181 | printf ("%s %s: ", _("DNS"), _("OK")); |
| 216 | elapsed_time, (multi_address==TRUE ? "es are" : " is"), address, | 182 | printf (ngettext("%.3f second response time, ", "%.3f seconds response time, ", elapsed_time), elapsed_time); |
| 217 | perfdata ("time", microsec, "us", FALSE, 0, FALSE, 0, TRUE, 0, FALSE, 0)); | 183 | printf (_("%s returns %s"), query_address, address); |
| 184 | printf ("|%s\n", perfdata ("time", microsec, "us", FALSE, 0, FALSE, 0, TRUE, 0, FALSE, 0)); | ||
| 218 | } | 185 | } |
| 219 | else if (result == STATE_WARNING) | 186 | else if (result == STATE_WARNING) |
| 220 | printf (_("DNS WARNING - %s\n"), | 187 | printf (_("DNS WARNING - %s\n"), |
