summaryrefslogtreecommitdiffstats
path: root/web/attachments/321739-check_dns.patch.git.txt
diff options
context:
space:
mode:
Diffstat (limited to 'web/attachments/321739-check_dns.patch.git.txt')
-rw-r--r--web/attachments/321739-check_dns.patch.git.txt182
1 files changed, 182 insertions, 0 deletions
diff --git a/web/attachments/321739-check_dns.patch.git.txt b/web/attachments/321739-check_dns.patch.git.txt
new file mode 100644
index 0000000..2f386cd
--- /dev/null
+++ b/web/attachments/321739-check_dns.patch.git.txt
@@ -0,0 +1,182 @@
1diff --git a/plugins/check_dns.c b/plugins/check_dns.c
2index 873dcae..4ca6b91 100644
3--- a/plugins/check_dns.c
4+++ b/plugins/check_dns.c
5@@ -45,15 +45,17 @@ int error_scan (char *);
6 void print_help (void);
7 void print_usage (void);
8
9-#define ADDRESS_LENGTH 256
10+#define ADDRESS_LENGTH 384
11 char query_address[ADDRESS_LENGTH] = "";
12 char dns_server[ADDRESS_LENGTH] = "";
13 char ptr_server[ADDRESS_LENGTH] = "";
14+char query_type[16] = "";
15 int verbose = FALSE;
16 char **expected_address = NULL;
17 int expected_address_cnt = 0;
18
19 int expect_authority = FALSE;
20+int accept_cname = FALSE;
21 thresholds *time_thresholds = NULL;
22
23 static int
24@@ -65,6 +67,22 @@ qstrcmp(const void *p1, const void *p2)
25 return strcmp(* (char * const *) p1, * (char * const *) p2);
26 }
27
28+char *
29+check_new_address(char *temp_buffer)
30+{
31+ temp_buffer++;
32+ /* Strip leading spaces */
33+ for (; *temp_buffer != '\0' && *temp_buffer == ' '; temp_buffer++)
34+ /* NOOP */;
35+
36+ strip(temp_buffer);
37+ if (temp_buffer==NULL || strlen(temp_buffer)==0) {
38+ die (STATE_CRITICAL,
39+ _("DNS CRITICAL - '%s' returned empty host name string\n"),
40+ NSLOOKUP_COMMAND);
41+ }
42+ return temp_buffer;
43+}
44
45 int
46 main (int argc, char **argv)
47@@ -103,7 +121,7 @@ main (int argc, char **argv)
48 }
49
50 /* get the command to run */
51- asprintf (&command_line, "%s %s %s", NSLOOKUP_COMMAND, query_address, dns_server);
52+ asprintf (&command_line, "%s %s %s %s", NSLOOKUP_COMMAND, query_type, query_address, dns_server);
53
54 alarm (timeout_interval);
55 gettimeofday (&tv, NULL);
56@@ -136,28 +154,26 @@ main (int argc, char **argv)
57 }
58 }
59
60+ if (strstr (chld_out.line[i], "Authoritative answers can be found from:"))
61+ break;
62 /* the server is responding, we just got the host name... */
63 if (strstr (chld_out.line[i], "Name:"))
64 parse_address = TRUE;
65+ else if (strstr (chld_out.line[i], "AAAA address")) {
66+ temp_buffer = rindex (chld_out.line[i], ' ');
67+ addresses[n_addresses++] = check_new_address(temp_buffer);
68+ }
69+ else if (strstr (chld_out.line[i], "text =") || strstr (chld_out.line[i], "exchanger =") \
70+ || strstr (chld_out.line[i], "service =") || (accept_cname && strstr (chld_out.line[i], "name ="))) {
71+ temp_buffer = index (chld_out.line[i], '=');
72+ addresses[n_addresses++] = check_new_address(temp_buffer);
73+ }
74 else if (parse_address == TRUE && (strstr (chld_out.line[i], "Address:") ||
75 strstr (chld_out.line[i], "Addresses:"))) {
76 temp_buffer = index (chld_out.line[i], ':');
77- temp_buffer++;
78-
79- /* Strip leading spaces */
80- for (; *temp_buffer != '\0' && *temp_buffer == ' '; temp_buffer++)
81- /* NOOP */;
82-
83- strip(temp_buffer);
84- if (temp_buffer==NULL || strlen(temp_buffer)==0) {
85- die (STATE_CRITICAL,
86- _("DNS CRITICAL - '%s' returned empty host name string\n"),
87- NSLOOKUP_COMMAND);
88- }
89-
90- addresses[n_addresses++] = strdup(temp_buffer);
91- }
92- else if (strstr (chld_out.line[i], _("Non-authoritative answer:"))) {
93+ addresses[n_addresses++] = check_new_address(temp_buffer);
94+ }
95+ if (strstr (chld_out.line[i], _("Non-authoritative answer:"))) {
96 non_authoritative = TRUE;
97 }
98
99@@ -274,7 +290,7 @@ error_scan (char *input_buffer)
100 die (STATE_CRITICAL, _("No response from DNS %s\n"), dns_server);
101
102 /* Host name is valid, but server doesn't have records... */
103- else if (strstr (input_buffer, "No records"))
104+ else if (strstr (input_buffer, "No records") || strstr (input_buffer, "No answer"))
105 die (STATE_CRITICAL, _("DNS %s has no records\n"), dns_server);
106
107 /* Connection was refused */
108@@ -316,7 +332,6 @@ error_scan (char *input_buffer)
109
110 }
111
112-
113 /* process command-line arguments */
114 int
115 process_arguments (int argc, char **argv)
116@@ -334,8 +349,10 @@ process_arguments (int argc, char **argv)
117 {"hostname", required_argument, 0, 'H'},
118 {"server", required_argument, 0, 's'},
119 {"reverse-server", required_argument, 0, 'r'},
120+ {"querytype", required_argument, 0, 'q'},
121 {"expected-address", required_argument, 0, 'a'},
122 {"expect-authority", no_argument, 0, 'A'},
123+ {"accept-cname", no_argument, 0, 'n'},
124 {"warning", required_argument, 0, 'w'},
125 {"critical", required_argument, 0, 'c'},
126 {0, 0, 0, 0}
127@@ -349,7 +366,7 @@ process_arguments (int argc, char **argv)
128 strcpy (argv[c], "-t");
129
130 while (1) {
131- c = getopt_long (argc, argv, "hVvAt:H:s:r:a:w:c:", long_opts, &opt_index);
132+ c = getopt_long (argc, argv, "hVvAnt:H:s:r:a:q:w:c:", long_opts, &opt_index);
133
134 if (c == -1 || c == EOF)
135 break;
136@@ -394,9 +411,18 @@ process_arguments (int argc, char **argv)
137 expected_address[expected_address_cnt] = strdup(optarg);
138 expected_address_cnt++;
139 break;
140+ case 'q': /* querytype -- A or AAAA or ANY or SRV or TXT, etc. */
141+ if (strlen (optarg) < 1 || strlen (optarg) > 4)
142+ die (STATE_UNKNOWN, _("Missing valid querytype parameter. Try using 'A' or 'AAAA' or 'SRV'\n"));
143+ strcpy(query_type, "-querytype=");
144+ strcat(query_type, optarg);
145+ break;
146 case 'A': /* expect authority */
147 expect_authority = TRUE;
148 break;
149+ case 'n': /* accept cname responses as a result */
150+ accept_cname = TRUE;
151+ break;
152 case 'w':
153 warning = optarg;
154 break;
155@@ -462,13 +488,20 @@ print_help (void)
156 printf (" %s\n", _("The name or address you want to query"));
157 printf (" -s, --server=HOST\n");
158 printf (" %s\n", _("Optional DNS server you want to use for the lookup"));
159+ printf (" -q, --querytype=TYPE\n");
160+ printf (" %s\n", _("Optional DNS record query type where TYPE =(A, AAAA, SRV, TXT, MX, ANY)"));
161+ printf (" %s\n", _("The default query type is 'A' (IPv4 host entry)"));
162 printf (" -a, --expected-address=IP-ADDRESS|HOST\n");
163 printf (" %s\n", _("Optional IP-ADDRESS you expect the DNS server to return. HOST must end with"));
164 printf (" %s\n", _("a dot (.). This option can be repeated multiple times (Returns OK if any"));
165 printf (" %s\n", _("value match). If multiple addresses are returned at once, you have to match"));
166 printf (" %s\n", _("the whole string of addresses separated with commas (sorted alphabetically)."));
167+ printf (" %s\n", _("If you would like to test for the presence of a cname, combine with -n param."));
168 printf (" -A, --expect-authority\n");
169 printf (" %s\n", _("Optionally expect the DNS server to be authoritative for the lookup"));
170+ printf (" -n, --accept-cname\n");
171+ printf (" %s\n", _("Optionally accept cname responses as a valid result to a query"));
172+ printf (" %s\n", _("The default is to ignore cname responses as part of the result"));
173 printf (" -w, --warning=seconds\n");
174 printf (" %s\n", _("Return warning if elapsed time exceeds value. Default off"));
175 printf (" -c, --critical=seconds\n");
176@@ -490,5 +523,5 @@ void
177 print_usage (void)
178 {
179 printf (_("Usage:"));
180- printf ("%s -H host [-s server] [-a expected-address] [-A] [-t timeout] [-w warn] [-c crit]\n", progname);
181+ printf ("%s -H host [-s server] [-q type ] [-a expected-address] [-A] [-n] [-t timeout] [-w warn] [-c crit]\n", progname);
182 }