Explorar o código

check_dns.c - Record type corrections

With the addition of checking various record types, ptr and cnames were added to expect values inappropriately. This restores correct functionality while maintaining the new record checking.
Spenser Reinhardt %!s(int64=12) %!d(string=hai) anos
pai
achega
c05722e4fa
Modificáronse 1 ficheiros con 13 adicións e 11 borrados
  1. 13 11
      plugins/check_dns.c

+ 13 - 11
plugins/check_dns.c

@@ -94,6 +94,7 @@ main (int argc, char **argv)
   int n_addresses = 0;
   int n_addresses = 0;
   char *msg = NULL;
   char *msg = NULL;
   char query_found[16] = "";
   char query_found[16] = "";
+  int query_size = 16;
   char *temp_buffer = NULL;
   char *temp_buffer = NULL;
   int non_authoritative = TRUE;
   int non_authoritative = TRUE;
   int result = STATE_UNKNOWN;
   int result = STATE_UNKNOWN;
@@ -150,74 +151,75 @@ main (int argc, char **argv)
       non_authoritative = FALSE;
       non_authoritative = FALSE;
       break;
       break;
     }
     }
-    /* the server is responding, we just got the host name... */
+    /* the server is responding, we just got the host name...*/
     if (strstr (chld_out.line[i], "Name:"))
     if (strstr (chld_out.line[i], "Name:"))
       parse_address = TRUE;
       parse_address = TRUE;
     /* begin handling types of records */
     /* begin handling types of records */
-    if (strstr (chld_out.line[i], "AAAA address")) {
+    if (strstr (chld_out.line[i], "AAAA address") && (strncmp(query_type, "-querytype=AAAA", query_size) == 0 || strncmp(query_type, "-querytype=ALL", query_size) == 0)) {
       if (verbose) printf("Found AAAA record\n");
       if (verbose) printf("Found AAAA record\n");
       temp_buffer = rindex (chld_out.line[i], ' ');
       temp_buffer = rindex (chld_out.line[i], ' ');
       addresses[n_addresses++] = check_new_address(temp_buffer);
       addresses[n_addresses++] = check_new_address(temp_buffer);
       strncpy(query_found, "-querytype=AAAA", sizeof(query_found));
       strncpy(query_found, "-querytype=AAAA", sizeof(query_found));
     }
     }
-    else if (strstr (chld_out.line[i], "exchanger =")) {
+    else if (strstr (chld_out.line[i], "exchanger =") && (strncmp(query_type, "-querytype=MX", query_size) == 0 || strncmp(query_type, "-querytype=ALL", query_size) == 0)) {
       if (verbose) printf("Found MX record\n");
       if (verbose) printf("Found MX record\n");
       temp_buffer = index (chld_out.line[i], '=');
       temp_buffer = index (chld_out.line[i], '=');
       addresses[n_addresses++] = check_new_address(temp_buffer);
       addresses[n_addresses++] = check_new_address(temp_buffer);
       strncpy(query_found, "-querytype=MX", sizeof(query_found));
       strncpy(query_found, "-querytype=MX", sizeof(query_found));
     }
     }
-    else if (strstr (chld_out.line[i], "service =")) {
+    else if (strstr (chld_out.line[i], "service =") && (strncmp(query_type, "-querytype=SRV", query_size) == 0 || strncmp(query_type, "-querytype=ALL", query_size) == 0)) {
       if (verbose) printf("Found SRV record\n");
       if (verbose) printf("Found SRV record\n");
       temp_buffer = index (chld_out.line[i], '=');
       temp_buffer = index (chld_out.line[i], '=');
       addresses[n_addresses++] = check_new_address(temp_buffer);
       addresses[n_addresses++] = check_new_address(temp_buffer);
       strncpy(query_found, "-querytype=SRV", sizeof(query_found));
       strncpy(query_found, "-querytype=SRV", sizeof(query_found));
     }
     }
-    else if (accept_cname && strstr (chld_out.line[i], "canonical name =")) {
+    else if (accept_cname && strstr (chld_out.line[i], "canonical name =") && (strncmp(query_type, "-querytype=CNAME", query_size) == 0 || strncmp(query_type, "-querytype=ALL", query_size) == 0)) {
       if (verbose) printf("Found CNAME record\n");
       if (verbose) printf("Found CNAME record\n");
       temp_buffer = index (chld_out.line[i], '=');
       temp_buffer = index (chld_out.line[i], '=');
       addresses[n_addresses++] = check_new_address(temp_buffer);
       addresses[n_addresses++] = check_new_address(temp_buffer);
       strncpy(query_found, "-querytype=CNAME", sizeof(query_found));
       strncpy(query_found, "-querytype=CNAME", sizeof(query_found));
     }
     }
+    /* does not need strncmp as we want A at all times unless another record match */
     else if (parse_address == TRUE && (strstr (chld_out.line[i], "Address:") || strstr (chld_out.line[i], "Addresses:"))) {
     else if (parse_address == TRUE && (strstr (chld_out.line[i], "Address:") || strstr (chld_out.line[i], "Addresses:"))) {
       if (verbose) printf("Found A record\n");
       if (verbose) printf("Found A record\n");
       temp_buffer = index (chld_out.line[i], ':');
       temp_buffer = index (chld_out.line[i], ':');
       addresses[n_addresses++] = check_new_address(temp_buffer);
       addresses[n_addresses++] = check_new_address(temp_buffer);
       strncpy(query_found, "-querytype=A", sizeof(query_found));
       strncpy(query_found, "-querytype=A", sizeof(query_found));
     }
     }
-    else if (strstr (chld_out.line[i], "nameserver =")) {
+    else if (strstr (chld_out.line[i], "nameserver =") && (strncmp(query_type, "-querytype=NS", query_size) == 0 || strncmp(query_type, "-querytype=ALL", query_size) == 0)) {
       if (verbose) printf("Found NS record\n");
       if (verbose) printf("Found NS record\n");
       temp_buffer = index (chld_out.line[i], '=');
       temp_buffer = index (chld_out.line[i], '=');
       addresses[n_addresses++] = check_new_address(temp_buffer);
       addresses[n_addresses++] = check_new_address(temp_buffer);
       strncpy(query_found, "-querytype=NS", sizeof(query_found));
       strncpy(query_found, "-querytype=NS", sizeof(query_found));
     }
     }
-    else if (strstr (chld_out.line[i], "dname =")) {
+    else if (strstr (chld_out.line[i], "dname =") && (strncmp(query_type, "-querytype=DNAME", query_size) == 0 || strncmp(query_type, "-querytype=ALL", query_size) == 0)) {
       if (verbose) printf("Found DNAME record\n");
       if (verbose) printf("Found DNAME record\n");
       temp_buffer = index (chld_out.line[i], '=');
       temp_buffer = index (chld_out.line[i], '=');
       addresses[n_addresses++] = check_new_address(temp_buffer);
       addresses[n_addresses++] = check_new_address(temp_buffer);
       strncpy(query_found, "-querytype=DNAME", sizeof(query_found));
       strncpy(query_found, "-querytype=DNAME", sizeof(query_found));
     }
     }
     /* must be after other records with "name" as an identifier, as ptr does not spefify */
     /* must be after other records with "name" as an identifier, as ptr does not spefify */
-    else if (strstr (chld_out.line[i], "name =")) {
+    else if (strstr (chld_out.line[i], "name =") && (strncmp(query_type, "-querytype=PTR", query_size) == 0 || strncmp(query_type, "-querytype=ALL", query_size) == 0)) {
       if (verbose) printf("Found PTR record\n");
       if (verbose) printf("Found PTR record\n");
       temp_buffer = index (chld_out.line[i], '=');
       temp_buffer = index (chld_out.line[i], '=');
       addresses[n_addresses++] = check_new_address(temp_buffer);
       addresses[n_addresses++] = check_new_address(temp_buffer);
       strncpy(query_found, "-querytype=PTR", sizeof(query_found));
       strncpy(query_found, "-querytype=PTR", sizeof(query_found));
     }
     }
-    else if (strstr (chld_out.line[i], "protocol =")) {
+    else if (strstr (chld_out.line[i], "protocol =") && (strncmp(query_type, "-querytype=WKS", query_size) == 0 || strncmp(query_type, "-querytype=ALL", query_size) == 0)) {
       if (verbose) printf("Found WKS record\n");
       if (verbose) printf("Found WKS record\n");
       temp_buffer = index (chld_out.line[i], '=');
       temp_buffer = index (chld_out.line[i], '=');
       addresses[n_addresses++] = check_new_address(temp_buffer);
       addresses[n_addresses++] = check_new_address(temp_buffer);
       strncpy(query_found, "-querytype=WKS", sizeof(query_found));
       strncpy(query_found, "-querytype=WKS", sizeof(query_found));
     }
     }
     /* TODO: needs to be changed to handle txt output and max size of txt recrods */
     /* TODO: needs to be changed to handle txt output and max size of txt recrods */
-    else if (strstr (chld_out.line[i], "text =")) {
+    else if (strstr (chld_out.line[i], "text =") && (strncmp(query_type, "-querytype=TXT", query_size) == 0 || strncmp(query_type, "-querytype=ALL", query_size) == 0)) {
       if (verbose) printf("Found TXT record\n");
       if (verbose) printf("Found TXT record\n");
       temp_buffer = index (chld_out.line[i], '=');
       temp_buffer = index (chld_out.line[i], '=');
       addresses[n_addresses++] = check_new_address(temp_buffer);
       addresses[n_addresses++] = check_new_address(temp_buffer);
       strncpy(query_found, "-querytype=TXT", sizeof(query_found));
       strncpy(query_found, "-querytype=TXT", sizeof(query_found));
     }
     }
     /* only matching for origin records, if requested other fields could be included at a later date */
     /* only matching for origin records, if requested other fields could be included at a later date */
-    else if (strstr (chld_out.line[i], "origin =")) {
+    else if (strstr (chld_out.line[i], "origin =") && (strncmp(query_type, "-querytype=SOA", query_size) == 0 || strncmp(query_type, "-querytype=ALL", query_size) == 0)) {
       if (verbose) printf("Found SOA record\n");
       if (verbose) printf("Found SOA record\n");
       temp_buffer = index(chld_out.line[i], '=');
       temp_buffer = index(chld_out.line[i], '=');
       addresses[n_addresses++] = check_new_address(temp_buffer);
       addresses[n_addresses++] = check_new_address(temp_buffer);