Bläddra i källkod

Merge pull request #1622 from lz1irq/master

registrar: add event_callback parameter and relevant documentation
Daniel-Constantin Mierla 7 år sedan
förälder
incheckning
9cc01c03e7

+ 31 - 0
src/modules/registrar/doc/registrar_admin.xml

@@ -961,6 +961,37 @@ modparam("registrar", "contact_max_size", 1024)
 		</example>
 	</section>
 
+	<section id="registrar.p.event_callback">
+		<title><varname>event_callback</varname> (str)</title>
+		<para>
+			The name of the function in the KEMI configuration file (embedded
+			scripting language such as Lua, Python, ...) to be executed instead
+			of event_route[...] blocks.
+		</para>
+		<para>
+			The function receives a string parameter with the name of the event.
+            The only possible value currently is 'usrloc:contact-expired'.
+		</para>
+		<para>
+		<emphasis>
+			Default value is 'empty' (no function is executed for events).
+		</emphasis>
+		</para>
+		<example>
+		<title>Set <varname>event_callback</varname> parameter</title>
+		<programlisting format="linespecific">
+...
+modparam("registrar", "event_callback", "ksr_registrar_event")
+...
+-- event callback function implemented in Lua
+function ksr_registrar_event(evname)
+    KSR.info( "Expired contact for " .. KSR.pv.getw("$ulc(exp=>aor)") .. "\n");
+	return 1;
+end
+...
+        </programlisting>
+		</example>
+	</section>
 	</section>
 
 	

+ 17 - 6
src/modules/registrar/registrar.c

@@ -126,6 +126,9 @@ str sock_hdr_name = {0,0};
 
 /* where to go for event route ("usrloc:contact-expired") */
 int reg_expire_event_rt = -1; /* default disabled */
+str reg_event_callback = STR_NULL;
+
+sr_kemi_eng_t *keng = NULL;
 
 #define RCV_NAME "received"
 str rcv_param = str_init(RCV_NAME);
@@ -228,6 +231,7 @@ static param_export_t params[] = {
 	{"regid_mode",         INT_PARAM, &reg_regid_mode					},
 	{"flow_timer",         INT_PARAM, &reg_flow_timer					},
 	{"contact_max_size",   INT_PARAM, &contact_max_size					},
+	{"event_callback",     PARAM_STR, &reg_event_callback				},
 	{0, 0, 0}
 };
 
@@ -339,12 +343,19 @@ static int mod_init(void)
 		return -1;
 	}
 
-	if(ul.register_ulcb != NULL)
-	{
-		reg_expire_event_rt = route_lookup(&event_rt, "usrloc:contact-expired");
-		if (reg_expire_event_rt>=0 && event_rt.rlist[reg_expire_event_rt]==0)
-			reg_expire_event_rt=-1; /* disable */
-		if (reg_expire_event_rt>=0) {
+	if(ul.register_ulcb != NULL) {
+		if (reg_event_callback.s==NULL || reg_event_callback.len<=0 ) {
+			reg_expire_event_rt = route_lookup(&event_rt, "usrloc:contact-expired");
+			if (reg_expire_event_rt>=0 && event_rt.rlist[reg_expire_event_rt]==0)
+				reg_expire_event_rt=-1; /* disable */
+		} else {
+			keng = sr_kemi_eng_get();
+			if(keng==NULL) {
+				LM_DBG("event callback (%s) set, but no cfg engine\n",
+					reg_event_callback.s);
+			}
+		}
+		if (reg_expire_event_rt>=0 || (reg_event_callback.s!=NULL && keng !=NULL)) {
 			set_child_rpc_sip_mode();
 			if(ul.register_ulcb(UL_CONTACT_EXPIRE, reg_ul_expired_contact, 0)< 0)
 			{

+ 19 - 4
src/modules/registrar/regpv.c

@@ -34,11 +34,14 @@
 #include "../../core/route.h"
 #include "../../core/action.h"
 #include "../../core/fmsg.h"
+#include "../../core/kemi.h"
 #include "../usrloc/usrloc.h"
 #include "registrar.h"
 #include "common.h"
 #include "regpv.h"
 
+extern str reg_event_callback;
+
 typedef struct _regpv_profile {
 	str pname;
 	str domain;
@@ -629,8 +632,9 @@ void reg_ul_expired_contact(ucontact_t* ptr, int type, void* param)
 	int olen;
 	int ilen;
 	char *p;
+	sr_kemi_eng_t *keng = NULL;
 
-	if(reg_expire_event_rt<0)
+	if(reg_expire_event_rt<0 && reg_event_callback.s==NULL)
 		return;
 
 	if (faked_msg_init() < 0)
@@ -733,11 +737,22 @@ void reg_ul_expired_contact(ucontact_t* ptr, int type, void* param)
 	backup_rt = get_route_type();
 	set_route_type(REQUEST_ROUTE);
 	init_run_actions_ctx(&ctx);
-	run_top_route(event_rt.rlist[reg_expire_event_rt], fmsg, 0);
+
+	if (reg_expire_event_rt >= 0) {
+		run_top_route(event_rt.rlist[reg_expire_event_rt], fmsg, 0);
+	} else {
+		keng = sr_kemi_eng_get();
+		if (keng!=NULL) {
+			str evname = str_init("usrloc:contact-expired");
+			if(keng->froute(fmsg, EVENT_ROUTE,
+					&reg_event_callback, &evname)<0) {
+				LM_ERR("error running event route kemi callback\n");
+			}
+		}
+	}
 	set_route_type(backup_rt);
 
 	return;
 error:
 	regpv_free_profile(rpp);
-	return;
-}
+	return; }