Explorar el Código

dlgs: rpc dlgs.briefing command

Daniel-Constantin Mierla hace 5 años
padre
commit
8cb69c32af
Se han modificado 1 ficheros con 142 adiciones y 56 borrados
  1. 142 56
      src/modules/dlgs/dlgs_records.c

+ 142 - 56
src/modules/dlgs/dlgs_records.c

@@ -479,47 +479,117 @@ int dlgs_del_item(sip_msg_t *msg)
 	return 0;
 	return 0;
 }
 }
 
 
-int dlgs_count(sip_msg_t *msg, str *vfield, str *vop, str *vdata)
+/**
+ *
+ */
+int dlgs_parse_field(str *vfield, int *tfield)
 {
 {
-	int i;
-	int n;
-	dlgs_item_t *it;
-	int tfield = 0;
-	int top = 0;
-	str mval;
-
-	if(_dlgs_htb == NULL) {
-		return -1;
-	}
-	if(vfield == NULL || vop == NULL || vdata ==NULL) {
-		return -1;
-	}
 	if(vfield->len==3 && strncasecmp(vfield->s, "any", 3)==0) {
 	if(vfield->len==3 && strncasecmp(vfield->s, "any", 3)==0) {
-		tfield = 0;
+		*tfield = 0;
 	} else if(vfield->len==3 && strncasecmp(vfield->s, "src", 3)==0) {
 	} else if(vfield->len==3 && strncasecmp(vfield->s, "src", 3)==0) {
-		tfield = 1;
+		*tfield = 1;
 	} else if(vfield->len==3 && strncasecmp(vfield->s, "dst", 3)==0) {
 	} else if(vfield->len==3 && strncasecmp(vfield->s, "dst", 3)==0) {
-		tfield = 2;
+		*tfield = 2;
 	} else if(vfield->len==4 && strncasecmp(vfield->s, "data", 4)==0) {
 	} else if(vfield->len==4 && strncasecmp(vfield->s, "data", 4)==0) {
-		tfield = 3;
+		*tfield = 3;
 	} else {
 	} else {
 		LM_ERR("unknown field: %.*s\n", vfield->len, vfield->s);
 		LM_ERR("unknown field: %.*s\n", vfield->len, vfield->s);
 		return -1;
 		return -1;
 	}
 	}
+	return 0;
+}
+
+/**
+ *
+ */
+int dlgs_parse_op(str *vop, int *top)
+{
 	if(vop->len==2 && strncasecmp(vop->s, "eq", 2)==0) {
 	if(vop->len==2 && strncasecmp(vop->s, "eq", 2)==0) {
-		top = 0;
+		*top = 0;
 	} else if(vop->len==2 && strncasecmp(vop->s, "ne", 2)==0) {
 	} else if(vop->len==2 && strncasecmp(vop->s, "ne", 2)==0) {
-		top = 1;
+		*top = 1;
 	} else if(vop->len==2 && strncasecmp(vop->s, "re", 2)==0) {
 	} else if(vop->len==2 && strncasecmp(vop->s, "re", 2)==0) {
-		top = 2;
+		*top = 2;
 	} else if(vop->len==2 && strncasecmp(vop->s, "sw", 2)==0) {
 	} else if(vop->len==2 && strncasecmp(vop->s, "sw", 2)==0) {
-		top = 3;
+		*top = 3;
 	} else if(vop->len==2 && strncasecmp(vop->s, "fm", 2)==0) {
 	} else if(vop->len==2 && strncasecmp(vop->s, "fm", 2)==0) {
-		top = 4;
+		*top = 4;
 	} else {
 	} else {
 		LM_ERR("unknown operator: %.*s\n", vop->len, vop->s);
 		LM_ERR("unknown operator: %.*s\n", vop->len, vop->s);
 		return -1;
 		return -1;
 	}
 	}
+	return 0;
+}
+
+/**
+ *
+ */
+int dlgs_match_field(dlgs_item_t *it, int tfield, int top, str *vdata,
+		void *rdata)
+{
+	str mval;
+	switch(tfield) {
+		case 1:
+			mval = it->src;
+			break;
+		case 2:
+			mval = it->dst;
+			break;
+		case 3:
+			mval = it->data;
+			break;
+		default:
+			mval = it->src;
+			break;
+	}
+	switch(top) {
+		case 0:
+			if(mval.len == vdata->len
+					&& strncmp(mval.s, vdata->s, mval.len)==0) {
+				return 0;
+			}
+		break;
+		case 1:
+			if(mval.len != vdata->len
+					|| strncmp(mval.s, vdata->s, mval.len)!=0) {
+				return 0;
+			}
+		break;
+		case 3:
+			if(mval.len >= vdata->len
+					&& strncmp(mval.s, vdata->s, vdata->len)==0) {
+				return 0;
+			}
+		break;
+	}
+	return -1;
+}
+
+/**
+ *
+ */
+int dlgs_count(sip_msg_t *msg, str *vfield, str *vop, str *vdata)
+{
+	int i;
+	int n;
+	dlgs_item_t *it;
+	int tfield = 0;
+	int top = 0;
+
+	if(_dlgs_htb == NULL) {
+		return -1;
+	}
+	if(vfield == NULL || vop == NULL || vdata ==NULL) {
+		return -1;
+	}
+
+	if(dlgs_parse_field(vfield, &tfield)<0) {
+		return -1;
+	}
+
+	if(dlgs_parse_op(vop, &top)<0) {
+		return -1;
+	}
 
 
 	n = 0;
 	n = 0;
 	if(tfield == 0) {
 	if(tfield == 0) {
@@ -538,39 +608,8 @@ int dlgs_count(sip_msg_t *msg, str *vfield, str *vop, str *vdata)
 		for(it = _dlgs_htb->slots[i].first; it != NULL; it=it->next) {
 		for(it = _dlgs_htb->slots[i].first; it != NULL; it=it->next) {
 			if(it->state != DLGS_STATE_TERMINATED
 			if(it->state != DLGS_STATE_TERMINATED
 					&& it->state != DLGS_STATE_NOTANSWERED) {
 					&& it->state != DLGS_STATE_NOTANSWERED) {
-				switch(tfield) {
-					case 1:
-						mval = it->src;
-						break;
-					case 2:
-						mval = it->dst;
-						break;
-					case 3:
-						mval = it->data;
-						break;
-					default:
-						mval = it->src;
-						break;
-				}
-				switch(top) {
-					case 0:
-						if(mval.len == vdata->len
-								&& strncmp(mval.s, vdata->s, mval.len)==0) {
-							n++;
-						}
-					break;
-					case 1:
-						if(mval.len != vdata->len
-								|| strncmp(mval.s, vdata->s, mval.len)!=0) {
-							n++;
-						}
-					break;
-					case 3:
-						if(mval.len >= vdata->len
-								&& strncmp(mval.s, vdata->s, vdata->len)==0) {
-							n++;
-						}
-					break;
+				if(dlgs_match_field(it, tfield, top, vdata, NULL)==0) {
+					n++;
 				}
 				}
 			}
 			}
 		}
 		}
@@ -1045,12 +1084,59 @@ static void dlgs_rpc_list(rpc_t *rpc, void *ctx)
 	}
 	}
 }
 }
 
 
+static const char *dlgs_rpc_briefing_doc[2] = {
+	"Briefinf the dlgs records",
+	0
+};
+
+
+/*
+ * RPC command to return the briefing of the records
+ */
+static void dlgs_rpc_briefing(rpc_t *rpc, void *ctx)
+{
+	dlgs_item_t *it;
+	int n = 0;
+	int i;
+	void *th;
+
+	if(_dlgs_htb == NULL) {
+		return;
+	}
+
+	for(i = 0; i < _dlgs_htb->htsize; i++) {
+		lock_get(&_dlgs_htb->slots[i].lock);
+		it = _dlgs_htb->slots[i].first;
+		while(it) {
+			if (rpc->add(ctx, "{", &th) < 0) {
+				lock_release(&_dlgs_htb->slots[i].lock);
+				rpc->fault(ctx, 500, "Internal error creating rpc");
+				return;
+			}
+			if(rpc->struct_add(th, "dSSSuu",
+							"count", ++n,
+							"src", &it->src,
+							"dst", &it->dst,
+							"callid", &it->callid,
+							"state", it->state)<0) {
+				lock_release(&_dlgs_htb->slots[i].lock);
+				rpc->fault(ctx, 500, "Internal error creating item");
+				return;
+			}
+			it = it->next;
+		}
+		lock_release(&_dlgs_htb->slots[i].lock);
+	}
+}
+
 /* clang-format off */
 /* clang-format off */
 rpc_export_t dlgs_rpc_cmds[] = {
 rpc_export_t dlgs_rpc_cmds[] = {
 	{"dlgs.stats", dlgs_rpc_stats,
 	{"dlgs.stats", dlgs_rpc_stats,
 		dlgs_rpc_stats_doc, 0},
 		dlgs_rpc_stats_doc, 0},
 	{"dlgs.list",  dlgs_rpc_list,
 	{"dlgs.list",  dlgs_rpc_list,
 		dlgs_rpc_list_doc, RET_ARRAY},
 		dlgs_rpc_list_doc, RET_ARRAY},
+	{"dlgs.briefing",  dlgs_rpc_briefing,
+		dlgs_rpc_briefing_doc, RET_ARRAY},
 
 
 	{0, 0, 0, 0}
 	{0, 0, 0, 0}
 };
 };