Bladeren bron

xlog: exported xlogging functions to kemi

- xdbg(txt), xinfo(txt), xnotice(txt), xwarn(txt), xerr(txt),
  xalert(txt), xcrit(txt), xlog(lev, txt)
- the txt can include kamailio variables even in the embedded lanaguage
  script, e.g.,:
  KSR.xlog.xinfo("received $rm from $si\n");
- if no kamailio variables are in the text, it is recommended to use the
  KSR core functions, e.g.,: KSR.info("received INVITE from 127.0.0.1\n");
- all the parameters are parsed and evaluated for each execution of the
  function, there is no fixup at startup that can be triggered by the
  non-native embedded interpreters
Elena-Ramona Modroiu 9 jaren geleden
bovenliggende
commit
d0261b61d7
1 gewijzigde bestanden met toevoegingen van 157 en 0 verwijderingen
  1. 157 0
      modules/xlog/xlog.c

+ 157 - 0
modules/xlog/xlog.c

@@ -45,6 +45,7 @@
 #include "../../sr_module.h"
 #include "../../dprint.h"
 #include "../../error.h"
+#include "../../kemi.h"
 #include "../../cfg/cfg.h"
 #include "../../mem/mem.h"
 #include "../../parser/parse_param.h"
@@ -832,3 +833,159 @@ error:
 	return -1;
 
 }
+
+/**
+ * write message after evaluation of lmsg for pseudo-variables
+ */
+int ki_xlog_ex(sip_msg_t *msg, int llevel, str *lmsg)
+{
+	pv_elem_t *xmodel=NULL;
+	str txt = {0, 0};
+
+	if(!is_printable(llevel))
+		return 1;
+
+	if(pv_parse_format(lmsg, &xmodel)<0) {
+		LM_ERR("error in parsing evaluated second parameter\n");
+		return -1;
+	}
+
+	if(pv_printf_s(msg, xmodel, &txt)!=0) {
+		LM_ERR("cannot eval reparsed value of second parameter\n");
+		pv_elem_free_all(xmodel);
+		return -1;
+	}
+	LOG_(xlog_facility, llevel, _xlog_prefix,
+			"%.*s", txt.len, txt.s);;
+	pv_elem_free_all(xmodel);
+	return 1;
+}
+
+int ki_xlog(sip_msg_t *msg, str *slevel, str *lmsg)
+{
+	int llevel;
+
+	if (slevel->len==7
+			&& strncasecmp(slevel->s, "l_alert", 7)==0) {
+		llevel = L_ALERT;
+	} else if (slevel->len==5
+			&& strncasecmp(slevel->s, "l_bug", 5)==0) {
+		llevel = L_BUG;
+	} else if (slevel->len==7
+			&& strncasecmp(slevel->s, "l_crit2", 7)==0) {
+		llevel = L_CRIT2;
+	} else if (slevel->len==6
+			&& strncasecmp(slevel->s, "l_crit", 6)==0) {
+		llevel = L_CRIT;
+	} else if (slevel->len==5
+			&& strncasecmp(slevel->s, "l_err", 5)==0) {
+		llevel = L_ERR;
+	} else if (slevel->len==6
+			&& strncasecmp(slevel->s, "l_warn", 6)==0) {
+		llevel = L_WARN;
+	} else if (slevel->len==8
+			&& strncasecmp(slevel->s, "l_notice", 8)==0) {
+		llevel = L_NOTICE;
+	} else if (slevel->len==6
+			&& strncasecmp(slevel->s, "l_info", 6)==0) {
+		llevel = L_INFO;
+	} else if (slevel->len==5
+			&& strncasecmp(slevel->s, "l_dbg", 5)==0) {
+		llevel = L_DBG;
+	} else {
+		llevel = L_ERR;
+	}
+	return ki_xlog_ex(msg, llevel, lmsg);
+}
+
+int ki_xdbg(sip_msg_t *msg, str *lmsg)
+{
+	return ki_xlog_ex(msg, L_DBG, lmsg);
+}
+
+int ki_xerr(sip_msg_t *msg, str *lmsg)
+{
+	return ki_xlog_ex(msg, L_ERR, lmsg);
+}
+
+int ki_xinfo(sip_msg_t *msg, str *lmsg)
+{
+	return ki_xlog_ex(msg, L_INFO, lmsg);
+}
+
+int ki_xnotice(sip_msg_t *msg, str *lmsg)
+{
+	return ki_xlog_ex(msg, L_NOTICE, lmsg);
+}
+
+int ki_xwarn(sip_msg_t *msg, str *lmsg)
+{
+	return ki_xlog_ex(msg, L_WARN, lmsg);
+}
+
+int ki_xalert(sip_msg_t *msg, str *lmsg)
+{
+	return ki_xlog_ex(msg, L_ALERT, lmsg);
+}
+
+int ki_xcrit(sip_msg_t *msg, str *lmsg)
+{
+	return ki_xlog_ex(msg, L_CRIT, lmsg);
+}
+
+/**
+ *
+ */
+static sr_kemi_t sr_kemi_xlog_exports[] = {
+	{ str_init("xlog"), str_init("xdbg"),
+		SR_KEMIP_INT, ki_xdbg,
+		{ SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("xlog"), str_init("xinfo"),
+		SR_KEMIP_INT, ki_xinfo,
+		{ SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("xlog"), str_init("xnotice"),
+		SR_KEMIP_INT, ki_xnotice,
+		{ SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("xlog"), str_init("xwarn"),
+		SR_KEMIP_INT, ki_xwarn,
+		{ SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("xlog"), str_init("xerr"),
+		SR_KEMIP_INT, ki_xerr,
+		{ SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("xlog"), str_init("xalert"),
+		SR_KEMIP_INT, ki_xalert,
+		{ SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("xlog"), str_init("xcrit"),
+		SR_KEMIP_INT, ki_xcrit,
+		{ SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("xlog"), str_init("xlog"),
+		SR_KEMIP_INT, ki_xlog,
+		{ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+
+	{ {0, 0}, {0, 0}, 0, NULL, { 0, 0, 0, 0, 0, 0 } }
+};
+
+/**
+ *
+ */
+int mod_register(char *path, int *dlflags, void *p1, void *p2)
+{
+	sr_kemi_modules_add(sr_kemi_xlog_exports);
+	return 0;
+}