[sr-dev] git:master:c62e411b: presence: implemented rpc command to list presententy records in memory

Daniel-Constantin Mierla miconda at gmail.com
Tue Apr 21 10:11:59 CEST 2020


Module: kamailio
Branch: master
Commit: c62e411b116db7f9b9227b9decd37866e62f4378
URL: https://github.com/kamailio/kamailio/commit/c62e411b116db7f9b9227b9decd37866e62f4378

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2020-04-21T09:57:30+02:00

presence: implemented rpc command to list presententy records in memory

- presence.presentity_list [mode] - mode is optional and can be 'full'
to print all attributes of the presentity record

---

Modified: src/modules/presence/hash.c
Modified: src/modules/presence/hash.h
Modified: src/modules/presence/presence.c

---

Diff:  https://github.com/kamailio/kamailio/commit/c62e411b116db7f9b9227b9decd37866e62f4378.diff
Patch: https://github.com/kamailio/kamailio/commit/c62e411b116db7f9b9227b9decd37866e62f4378.patch

---

diff --git a/src/modules/presence/hash.c b/src/modules/presence/hash.c
index 7a58fe5309..6d868e165d 100644
--- a/src/modules/presence/hash.c
+++ b/src/modules/presence/hash.c
@@ -705,6 +705,11 @@ int update_phtable(presentity_t *presentity, str *pres_uri, str *body)
 
 static ps_ptable_t *_ps_ptable = NULL;
 
+ps_ptable_t *ps_ptable_get(void)
+{
+	return _ps_ptable;
+}
+
 #define PS_PRESENTITY_FIELD_COPY(field) do { \
 		if (pt->field.s) { \
 			ptn->field.s = p; \
@@ -945,6 +950,7 @@ void ps_ptable_destroy(void)
 	}
 	for(i=0; i<_ps_ptable->ssize; i++) {
 		lock_destroy(&_ps_ptable->slots[i].lock);
+		pt = _ps_ptable->slots[i].plist;
 		while(pt!=NULL) {
 			ptn = pt->next;
 			ps_presentity_free(pt, 0);
diff --git a/src/modules/presence/hash.h b/src/modules/presence/hash.h
index 96621efe5b..45732426f5 100644
--- a/src/modules/presence/hash.h
+++ b/src/modules/presence/hash.h
@@ -180,5 +180,6 @@ int ps_ptable_remove(ps_presentity_t *pt);
 ps_presentity_t *ps_ptable_get_list(str *user, str *domain);
 ps_presentity_t *ps_ptable_get_item(str *user, str *domain, str *event, str *etag);
 ps_presentity_t *ps_ptable_get_expired(int eval);
+ps_ptable_t *ps_ptable_get(void);
 
 #endif
diff --git a/src/modules/presence/presence.c b/src/modules/presence/presence.c
index c0e1912ecd..84997b4230 100644
--- a/src/modules/presence/presence.c
+++ b/src/modules/presence/presence.c
@@ -1847,6 +1847,83 @@ static const char *rpc_presence_cleanup_doc[3] = {
 	0
 };
 
+/*! \brief
+ *  rpc cmd: presence.presentity_list
+ *			\mode - output attributes control
+ *		* */
+void rpc_presence_presentity_list(rpc_t *rpc, void *ctx)
+{
+	str omode = {0, 0};
+	int imode = 0;
+	int i = 0;
+	ps_ptable_t *ptb = NULL;
+	ps_presentity_t *ptn = NULL;
+	void* th = NULL;
+	str pempty = str_init("");
+
+	LM_DBG("listing in memory presentity records\n");
+
+	imode = rpc->scan(ctx, "*S", &omode);
+	if(imode < 1) {
+		imode = 0;
+	} else {
+		if(omode.len == 4 && strncmp(omode.s, "full", 4)==0) {
+			imode = 1;
+		} else {
+			imode = 0;
+		}
+	}
+	ptb = ps_ptable_get();
+	if(ptb == NULL) {
+		return;
+	}
+
+	for(i=0; i<ptb->ssize; i++) {
+		lock_get(&ptb->slots[i].lock);
+		ptn = ptb->slots[i].plist;
+		while(ptn!=NULL) {
+			/* add record node */
+			if (rpc->add(ctx, "{", &th) < 0) {
+				rpc->fault(ctx, 500, "Internal error creating rpc");
+				lock_release(&ptb->slots[i].lock);
+				return;
+			}
+			/* add common fields */
+			if(rpc->struct_add(th, "SSSSSd",
+					"user",  &ptn->user,
+					"domain", &ptn->domain,
+					"event", &ptn->event,
+					"etag", &ptn->etag,
+					"sender", (ptn->sender.s)?&ptn->sender:&pempty,
+					"expires", ptn->expires)<0) {
+				rpc->fault(ctx, 500, "Internal error adding item");
+				lock_release(&ptb->slots[i].lock);
+				return;
+			}
+			if(imode==1) {
+				/* add extra fields */
+				if(rpc->struct_add(th, "ddSSd",
+						"received_time",  ptn->received_time,
+						"priority", ptn->priority,
+						"ruid", (ptn->ruid.s)?&ptn->ruid:&pempty,
+						"body", (ptn->body.s)?&ptn->body:&pempty,
+						"hashid", ptn->hashid)<0) {
+					rpc->fault(ctx, 500, "Internal error adding item");
+					lock_release(&ptb->slots[i].lock);
+					return;
+				}
+			}
+			ptn = ptn->next;
+		}
+		lock_release(&ptb->slots[i].lock);
+	}
+	return;
+}
+
+static const char *rpc_presence_presentity_list_doc[2] = {
+	"Trigger update of watchers",
+	0
+};
 
 rpc_export_t presence_rpc[] = {
 	{"presence.cleanup", rpc_presence_cleanup, rpc_presence_cleanup_doc, 0},
@@ -1854,6 +1931,8 @@ rpc_export_t presence_rpc[] = {
 			rpc_presence_refresh_watchers_doc, 0},
 	{"presence.updateWatchers", rpc_presence_update_watchers,
 			rpc_presence_update_watchers_doc, 0},
+	{"presence.presentity_list", rpc_presence_presentity_list,
+			rpc_presence_presentity_list_doc, 0},
 	{0, 0, 0, 0}
 };
 




More information about the sr-dev mailing list