Sfoglia il codice sorgente

core: rpc dns.view outputs proper formatted structure

- previously it was doing sort of printf to emulate structures
Daniel-Constantin Mierla 7 anni fa
parent
commit
ab9e9eba2b
1 ha cambiato i file con 136 aggiunte e 64 eliminazioni
  1. 136 64
      src/core/dns_cache.c

+ 136 - 64
src/core/dns_cache.c

@@ -3796,7 +3796,7 @@ static int dns_get_type(str* s)
 
 /** rpc-prints a dns cache entry.
   */
-void dns_cache_print_entry(rpc_t* rpc, void* ctx, struct dns_hash_entry* e)
+int dns_cache_print_entry(rpc_t* rpc, void* ctx, struct dns_hash_entry* e)
 {
 	int expires;
 	struct dns_rr* rr;
@@ -3805,104 +3805,173 @@ void dns_cache_print_entry(rpc_t* rpc, void* ctx, struct dns_hash_entry* e)
 	str s;
 	int i;
 	int n;
+	void *th;
+	void *rh;
+	void *sh;
+	void *ih;
+	void *ah;
+
+	/* add entry node */
+	if(rpc->add(ctx, "{", &th) < 0) {
+		rpc->fault(ctx, 500, "Internal error root reply");
+		return -1;
+	}
 
 	now=get_ticks_raw();
 	expires = (s_ticks_t)(e->expire-now)<0?-1: TICKS_TO_S(e->expire-now);
-	
-	rpc->rpl_printf(ctx, "%sname: %s", SPACE_FORMAT, e->name);
-	rpc->rpl_printf(ctx, "%stype: %s", SPACE_FORMAT, print_type(e->type));
-	rpc->rpl_printf(ctx, "%ssize (bytes): %d", SPACE_FORMAT,
-						e->total_size);
-	rpc->rpl_printf(ctx, "%sreference counter: %d", SPACE_FORMAT,
-						e->refcnt.val);
-	if (e->ent_flags & DNS_FLAG_PERMANENT) {
-		rpc->rpl_printf(ctx, "%spermanent: yes", SPACE_FORMAT);
-	} else {
-		rpc->rpl_printf(ctx, "%spermanent: no", SPACE_FORMAT);
-		rpc->rpl_printf(ctx, "%sexpires in (s): %d", SPACE_FORMAT, expires);
+	if(rpc->struct_add(th, "ssddsdds",
+			"name", e->name,
+			"type", print_type(e->type),
+			"size_bytes", e->total_size,
+			"reference_counter", e->refcnt.val,
+			"permanent", (e->ent_flags & DNS_FLAG_PERMANENT) ? "yes" : "no",
+			"expires", (e->ent_flags & DNS_FLAG_PERMANENT)?0:expires, /* seconds */
+			"last_used", TICKS_TO_S(now-e->last_used), /* seconds */
+			"negative_entry", (e->ent_flags & DNS_FLAG_BAD_NAME) ? "yes" : "no")
+				<0) {
+		rpc->fault(ctx, 500, "Internal error building structure");
+		return -1;
 	}
-	rpc->rpl_printf(ctx, "%slast used (s): %d", SPACE_FORMAT,
-						TICKS_TO_S(now-e->last_used));
-	rpc->rpl_printf(ctx, "%snegative entry: %s", SPACE_FORMAT,
-						(e->ent_flags & DNS_FLAG_BAD_NAME) ? "yes" : "no");
 	n = 0;
 	for (rr=e->rr_lst; rr; rr=rr->next) {
-		rpc->rpl_printf(ctx, "%srr idx: %d", SPACE_FORMAT, n++);
+		if(n==0) {
+			if(rpc->struct_add(th, "[", "records", &rh)<0) {
+				rpc->fault(ctx, 500, "Internal error building records");
+				return -1;
+			}
+		}
+		if(rpc->array_add(rh, "{", &sh) < 0) {
+			rpc->fault(ctx, 500, "Internal error adding record");
+			return -1;
+		}
+		if(rpc->struct_add(sh, "d", "rr_idx", n)<0) {
+			rpc->fault(ctx, 500, "Internal error adding rr_idx");
+			return -1;
+		}
+		n++;
 		switch(e->type) {
 			case T_A:
 			case T_AAAA:
 				if (dns_rr2ip(e->type, rr, &ip)==0){
-				  rpc->rpl_printf(ctx, "%srr ip: %s", SPACE_FORMAT,
-									ip_addr2a(&ip) );
+					if(rpc->struct_add(sh, "s", "rr_ip", ip_addr2a(&ip))<0) {
+						rpc->fault(ctx, 500, "Internal error adding rr_ip");
+						return -1;
+					}
 				}else{
-				  rpc->rpl_printf(ctx, "%srr ip: <error: bad rr>", 
-									SPACE_FORMAT);
+					if(rpc->struct_add(sh, "s", "rr_ip", "error-bad-rr")<0) {
+						rpc->fault(ctx, 500, "Internal error adding rr_ip");
+						return -1;
+					}
 				}
 				break;
 			case T_SRV:
-				rpc->rpl_printf(ctx, "%srr name: %s", SPACE_FORMAT,
-							((struct srv_rdata*)(rr->rdata))->name);
-				rpc->rpl_printf(ctx, "%srr port: %d", SPACE_FORMAT,
-							((struct srv_rdata*)(rr->rdata))->port);
-				rpc->rpl_printf(ctx, "%srr priority: %d", SPACE_FORMAT,
-						((struct srv_rdata*)(rr->rdata))->priority);
-				rpc->rpl_printf(ctx, "%srr weight: %d", SPACE_FORMAT,
-							((struct srv_rdata*)(rr->rdata))->weight);
+				if(rpc->struct_add(sh, "sddd",
+						"rr_name", ((struct srv_rdata*)(rr->rdata))->name,
+						"rr_port", ((struct srv_rdata*)(rr->rdata))->port,
+						"rr_priority", ((struct srv_rdata*)(rr->rdata))->priority,
+						"rr_weight", ((struct srv_rdata*)(rr->rdata))->weight)<0) {
+					rpc->fault(ctx, 500, "Internal error adding rr srv fields");
+					return -1;
+				}
 				break;
 			case T_NAPTR:
-				rpc->rpl_printf(ctx, "%srr order: %d", SPACE_FORMAT,
-							((struct naptr_rdata*)(rr->rdata))->order);
-				rpc->rpl_printf(ctx, "%srr preference: %d", SPACE_FORMAT,
-							((struct naptr_rdata*)(rr->rdata))->pref);
+				if(rpc->struct_add(sh, "ds",
+						"rr_order", ((struct naptr_rdata*)(rr->rdata))->order,
+						"rr_preference", ((struct naptr_rdata*)(rr->rdata))->pref)
+							<0) {
+					rpc->fault(ctx, 500, "Internal error adding naptr order");
+					return -1;
+				}
 				s.s = ((struct naptr_rdata*)(rr->rdata))->flags;
 				s.len = ((struct naptr_rdata*)(rr->rdata))->flags_len;
-				rpc->rpl_printf(ctx, "%srr flags: %.*s", SPACE_FORMAT,
-									s.len, s.s);
+				if(rpc->struct_add(sh, "S", "rr_flags", &s)<0) {
+					rpc->fault(ctx, 500, "Internal error adding naptre rr_flags");
+					return -1;
+				}
 				s.s=((struct naptr_rdata*)(rr->rdata))->services;
 				s.len=((struct naptr_rdata*)(rr->rdata))->services_len;
-				rpc->rpl_printf(ctx, "%srr service: %.*s", SPACE_FORMAT,
-									s.len, s.s);
+				if(rpc->struct_add(sh, "S", "rr_service", &s)<0) {
+					rpc->fault(ctx, 500, "Internal error adding naptre rr_service");
+					return -1;
+				}
 				s.s = ((struct naptr_rdata*)(rr->rdata))->regexp;
 				s.len = ((struct naptr_rdata*)(rr->rdata))->regexp_len;
-				rpc->rpl_printf(ctx, "%srr regexp: %.*s", SPACE_FORMAT,
-									s.len, s.s);
+				if(rpc->struct_add(sh, "S", "rr_regexp", &s)<0) {
+					rpc->fault(ctx, 500, "Internal error adding naptre rr_regexp");
+					return -1;
+				}
 				s.s = ((struct naptr_rdata*)(rr->rdata))->repl;
 				s.len = ((struct naptr_rdata*)(rr->rdata))->repl_len;
-				rpc->rpl_printf(ctx, "%srr replacement: %.*s", 
-									SPACE_FORMAT, s.len, s.s);
+				if(rpc->struct_add(sh, "S", "rr_regexp", &s)<0) {
+					rpc->fault(ctx, 500, "Internal error adding naptre rr_replacement");
+					return -1;
+				}
 				break;
 			case T_CNAME:
-				rpc->rpl_printf(ctx, "%srr name: %s", SPACE_FORMAT,
-							((struct cname_rdata*)(rr->rdata))->name);
+				if(rpc->struct_add(sh, "s", "rr_name",
+						((struct cname_rdata*)(rr->rdata))->name)<0) {
+					rpc->fault(ctx, 500, "Internal error adding cname rr_name");
+					return -1;
+				}
 				break;
 			case T_TXT:
+				if(rpc->struct_add(sh, "[", "txt", &ih)<0) {
+					rpc->fault(ctx, 500, "Internal error txt record");
+					return -1;
+				}
 				for (i=0; i<((struct txt_rdata*)(rr->rdata))->cstr_no;
 						i++){
-					rpc->rpl_printf(ctx, "%stxt[%d]: %s", SPACE_FORMAT, i,
-						((struct txt_rdata*)(rr->rdata))->txt[i].cstr);
+					if(rpc->array_add(ih, "{", &ah) < 0) {
+						rpc->fault(ctx, 500, "Internal error adding txt record");
+						return -1;
+					}
+					if(rpc->struct_add(ah, "ds", "idx", i,
+							"rr_txt",
+							((struct txt_rdata*)(rr->rdata))->txt[i].cstr)<0) {
+						rpc->fault(ctx, 500, "Internal error adding rr_txt");
+						return -1;
+					}
 				}
 				break;
 			case T_EBL:
-				rpc->rpl_printf(ctx, "%srr position: %d", SPACE_FORMAT,
-							((struct ebl_rdata*)(rr->rdata))->position);
-				rpc->rpl_printf(ctx, "%srr separator: %s", SPACE_FORMAT,
-							((struct ebl_rdata*)(rr->rdata))->separator);
-				rpc->rpl_printf(ctx, "%srr apex: %s", SPACE_FORMAT,
-							((struct ebl_rdata*)(rr->rdata))->apex);
+				if(rpc->struct_add(sh, "dss",
+						"rr_position", ((struct ebl_rdata*)(rr->rdata))->position,
+						"rr_separator", ((struct ebl_rdata*)(rr->rdata))->separator,
+						"rr_apex", ((struct ebl_rdata*)(rr->rdata))->apex)<0) {
+					rpc->fault(ctx, 500, "Internal error adding ebl fields");
+					return -1;
+				}
 				break;
 			case T_PTR:
-				rpc->rpl_printf(ctx, "%srr name: %s", SPACE_FORMAT,
-							((struct ptr_rdata*)(rr->rdata))->ptrdname);
+				if(rpc->struct_add(sh, "s", "rr_name",
+						((struct ptr_rdata*)(rr->rdata))->ptrdname)<0) {
+					rpc->fault(ctx, 500, "Internal error adding ptr rr_name");
+					return -1;
+				}
 				break;
 			default:
-				rpc->rpl_printf(ctx, "%sresource record: unknown",
-									SPACE_FORMAT);
+				if(rpc->struct_add(sh, "s", "rr_type", "unknown" )<0) {
+					rpc->fault(ctx, 500, "Internal error adding rr unknown");
+					return -1;
+				}
+		}
+		if ((e->ent_flags & DNS_FLAG_PERMANENT) == 0) {
+			if(rpc->struct_add(sh, "sd", "rr_permanent", "no",
+					"rr_expires",
+					(s_ticks_t)(rr->expire-now)<0?-1 : 
+						TICKS_TO_S(rr->expire-now))<0) {
+				rpc->fault(ctx, 500, "Internal error adding rr_expires");
+				return -1;
+			}
+		} else {
+			if(rpc->struct_add(sh, "sd", "rr_permanent", "yes",
+					"rr_expires", 0)<0) {
+				rpc->fault(ctx, 500, "Internal error adding rr_expires");
+				return -1;
+			}
 		}
-		if ((e->ent_flags & DNS_FLAG_PERMANENT) == 0)
-			rpc->rpl_printf(ctx, "%srr expires in (s): %d", SPACE_FORMAT,
-						(s_ticks_t)(rr->expire-now)<0?-1 : 
-						TICKS_TO_S(rr->expire-now));
 	}
+	return 0;
 }
 
 
@@ -3927,9 +3996,10 @@ void dns_cache_view(rpc_t* rpc, void* ctx)
 			) {
 				continue;
 			}
-			rpc->rpl_printf(ctx, "{\n");
-			dns_cache_print_entry(rpc, ctx, e);
-			rpc->rpl_printf(ctx, "}");
+			if(dns_cache_print_entry(rpc, ctx, e)<0) {
+				LM_DBG("failed to print dns entry\n");
+				return;
+			}
 		}
 	}
 	UNLOCK_DNS_HASH();
@@ -4612,7 +4682,9 @@ void dns_cache_rpc_lookup(rpc_t* rpc, void* ctx)
 		rpc->fault(ctx, 400, "Not found");
 		return;
 	}
-	dns_cache_print_entry(rpc, ctx, e);
+	if(dns_cache_print_entry(rpc, ctx, e)<0) {
+		LM_DBG("failed to print the dns entry\n");
+	}
 	dns_hash_put(e);
 }