Browse Source

check_dns.c - macro querytypes and auto cnames

Most of the code for checking querytypes can be abstracted into a single macro with a few variables. This significantly reduces code and complexity of potential issues. This also corrects a non-null terminated string possibility. Finally we are checking the set querytype and allowing drop through to the accept_cname statement when the user is querying for cnames as the logic depends on BOTH being set. This avoids them having to remember to set both, as that is a bit absurd on my part.
Spenser Reinhardt 11 years ago
parent
commit
47897416ac
1 changed files with 23 additions and 59 deletions
  1. 23 59
      plugins/check_dns.c

+ 23 - 59
plugins/check_dns.c

@@ -28,6 +28,12 @@
 * 
 * 
 *****************************************************************************/
+#define IF_RECORD(label, querytype, verb_str) if (strstr (chld_out.line[i], label) && (strncmp(query_type, querytype, query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) { \
+      if (verbose) printf(verb_str); \
+      temp_buffer = rindex (chld_out.line[i], ' '); \
+      addresses[n_addresses++] = check_new_address(temp_buffer); \
+      strncpy(query_found, querytype, sizeof(query_found)); \
+      memset(query_found, '\0', sizeof(query_found));
 
 const char *progname = "check_dns";
 const char *copyright = "2000-2014";
@@ -170,24 +176,17 @@ main (int argc, char **argv)
     if (strstr (chld_out.line[i], "Name:"))
       parse_address = TRUE;
     /* begin handling types of records */
-    if (strstr (chld_out.line[i], "AAAA address") && (strncmp(query_type, "-querytype=AAAA", query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) {
-      if (verbose) printf("Found AAAA record\n");
-      temp_buffer = rindex (chld_out.line[i], ' ');
-      addresses[n_addresses++] = check_new_address(temp_buffer);
-      strncpy(query_found, "-querytype=AAAA", sizeof(query_found));
-    }
-    else if (strstr (chld_out.line[i], "exchanger =") && (strncmp(query_type, "-querytype=MX", query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) {
-      if (verbose) printf("Found MX record\n");
-      temp_buffer = index (chld_out.line[i], '=');
-      addresses[n_addresses++] = check_new_address(temp_buffer);
-      strncpy(query_found, "-querytype=MX", sizeof(query_found));
-    }
-    else if (strstr (chld_out.line[i], "service =") && (strncmp(query_type, "-querytype=SRV", query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) {
-      if (verbose) printf("Found SRV record\n");
-      temp_buffer = index (chld_out.line[i], '=');
-      addresses[n_addresses++] = check_new_address(temp_buffer);
-      strncpy(query_found, "-querytype=SRV", sizeof(query_found));
-    }
+    IF_RECORD("AAAA address", "-querytype=AAAA", "Found AAAA record\n") }
+    else IF_RECORD("exchanger =", "-querytype=MX", "Found MX record\n") }
+    else IF_RECORD("service =", "-querytype=SRV", "Found SRV record\n") }
+    else IF_RECORD("nameserver =", "-querytype=NS", "Found NS record\n") }
+    else IF_RECORD("dname =", "-querytype=DNAME", "Found DNAME record\n") }
+    else IF_RECORD("protocol =", "-querytype=WKS", "Found WKS record\n") }
+    /* TODO: needs to be changed to handle txt output and max size of txt recrods */
+    else IF_RECORD("text =", "-querytype=TXT", "Found TXT record\n") }
+    /* only matching for origin records, if requested other fields could be included at a later date */
+    else IF_RECORD("origin =", "-querytype=SOA", "Found SOA record\n") }
+    /* cnames cannot use macro as we must check for accepting them separately */
     else if (accept_cname && strstr (chld_out.line[i], "canonical name =") && (strncmp(query_type, "-querytype=CNAME", query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) {
       if (verbose) printf("Found CNAME record\n");
       temp_buffer = index (chld_out.line[i], '=');
@@ -201,45 +200,8 @@ main (int argc, char **argv)
       addresses[n_addresses++] = check_new_address(temp_buffer);
       strncpy(query_found, "-querytype=A", sizeof(query_found));
     }
-    else if (strstr (chld_out.line[i], "nameserver =") && (strncmp(query_type, "-querytype=NS", query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) {
-      if (verbose) printf("Found NS record\n");
-      temp_buffer = index (chld_out.line[i], '=');
-      addresses[n_addresses++] = check_new_address(temp_buffer);
-      strncpy(query_found, "-querytype=NS", sizeof(query_found));
-    }
-    else if (strstr (chld_out.line[i], "dname =") && (strncmp(query_type, "-querytype=DNAME", query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) {
-      if (verbose) printf("Found DNAME record\n");
-      temp_buffer = index (chld_out.line[i], '=');
-      addresses[n_addresses++] = check_new_address(temp_buffer);
-      strncpy(query_found, "-querytype=DNAME", sizeof(query_found));
-    }
     /* must be after other records with "name" as an identifier, as ptr does not spefify */
-    else if (strstr (chld_out.line[i], "name =") && (strncmp(query_type, "-querytype=PTR", query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) {
-      if (verbose) printf("Found PTR record\n");
-      temp_buffer = index (chld_out.line[i], '=');
-      addresses[n_addresses++] = check_new_address(temp_buffer);
-      strncpy(query_found, "-querytype=PTR", sizeof(query_found));
-    }
-    else if (strstr (chld_out.line[i], "protocol =") && (strncmp(query_type, "-querytype=WKS", query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) {
-      if (verbose) printf("Found WKS record\n");
-      temp_buffer = index (chld_out.line[i], '=');
-      addresses[n_addresses++] = check_new_address(temp_buffer);
-      strncpy(query_found, "-querytype=WKS", sizeof(query_found));
-    }
-    /* TODO: needs to be changed to handle txt output and max size of txt recrods */
-    else if (strstr (chld_out.line[i], "text =") && (strncmp(query_type, "-querytype=TXT", query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) {
-      if (verbose) printf("Found TXT record\n");
-      temp_buffer = index (chld_out.line[i], '=');
-      addresses[n_addresses++] = check_new_address(temp_buffer);
-      strncpy(query_found, "-querytype=TXT", sizeof(query_found));
-    }
-    /* only matching for origin records, if requested other fields could be included at a later date */
-    else if (strstr (chld_out.line[i], "origin =") && (strncmp(query_type, "-querytype=SOA", query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) {
-      if (verbose) printf("Found SOA record\n");
-      temp_buffer = index(chld_out.line[i], '=');
-      addresses[n_addresses++] = check_new_address(temp_buffer);
-      strncpy(query_found, "-querytype=SOA", sizeof(query_found));
-    }
+    else IF_RECORD("name =", "-querytype=PTR", "Found PTR record\n") }
     /* needed for non-query ptr\reverse lookup checks */
     else if (strstr(chld_out.line[i], ".in-addr.arpa") && !query_set) {
       if ((temp_buffer = strstr(chld_out.line[i], "name = ")))
@@ -518,13 +480,15 @@ process_arguments (int argc, char **argv)
       strcpy(query_type, "-querytype=");
       strcat(query_type, optarg);
       query_set = TRUE;
+      /* logic is set such that we must accept cnames if they are querying for them */
+      if (strcmp(query_type, "-querytype=CNAME") != 0)
+        break;
+    case 'n': /* accept cname responses as a result */
+      accept_cname = TRUE;
       break;
     case 'A': /* expect authority */
       expect_authority = TRUE;
       break;
-    case 'n': /* accept cname responses as a result */
-      accept_cname = TRUE;
-      break;
     case 'w':
       warning = optarg;
       break;