]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
output-lua: expose thread info
authorVictor Julien <victor@inliniac.net>
Fri, 21 Mar 2014 08:40:54 +0000 (09:40 +0100)
committerVictor Julien <victor@inliniac.net>
Fri, 15 Aug 2014 11:58:26 +0000 (13:58 +0200)
A new callback to give access to thread id, name and group name:
SCThreadInfo. It gives: tid (integer), tname (string), tgroup (string)

    function log(args)
        tid, tname, tgroup = SCThreadInfo()

src/output-lua-common.c
src/output-lua.c
src/util-lua.c
src/util-lua.h

index 272621c8217ccc02991e14ab2ab090fa222e1f19..6880d402f20edee4684579b7e1df3d5f9c2f9cd9 100644 (file)
@@ -547,6 +547,36 @@ static int LuaCallbackFileState(lua_State *luastate)
     return LuaCallbackFileStatePushToStackFromFile(luastate, file);
 }
 
+/** \internal
+ *  \brief fill lua stack with thread info
+ *  \param luastate the lua state
+ *  \param pa pointer to packet alert struct
+ *  \retval cnt number of data items placed on the stack
+ *
+ *  Places: thread id (number), thread name (string, thread group name (string)
+ */
+static int LuaCallbackThreadInfoPushToStackFromThreadVars(lua_State *luastate, const ThreadVars *tv)
+{
+    u_long tid = SCGetThreadIdLong();
+    lua_pushinteger (luastate, (lua_Integer)tid);
+    lua_pushstring (luastate, tv->name);
+    lua_pushstring (luastate, tv->thread_group_name);
+    return 3;
+}
+
+/** \internal
+ *  \brief Wrapper for getting tuple info into a lua script
+ *  \retval cnt number of items placed on the stack
+ */
+static int LuaCallbackThreadInfo(lua_State *luastate)
+{
+    const ThreadVars *tv = LuaStateGetThreadVars(luastate);
+    if (tv == NULL)
+        return LuaCallbackError(luastate, "internal error: no tv");
+
+    return LuaCallbackThreadInfoPushToStackFromThreadVars(luastate, tv);
+}
+
 int LogLuaRegisterFunctions(lua_State *luastate)
 {
     /* registration of the callbacks */
@@ -587,6 +617,8 @@ int LogLuaRegisterFunctions(lua_State *luastate)
     lua_pushcfunction(luastate, LuaCallbackFileState);
     lua_setglobal(luastate, "SCFileState");
 
+    lua_pushcfunction(luastate, LuaCallbackThreadInfo);
+    lua_setglobal(luastate, "SCThreadInfo");
     return 0;
 }
 
index 4dff5e55563f95f79bca9f028e53659343dec3d1..198b5554e41485ffe852b96e1651f7eb3d0ab4c2 100644 (file)
@@ -85,6 +85,7 @@ static int LuaTxLogger(ThreadVars *tv, void *thread_data, const Packet *p, Flow
 
     SCMutexLock(&td->lua_ctx->m);
 
+    LuaStateSetThreadVars(td->lua_ctx->luastate, tv);
     LuaStateSetPacket(td->lua_ctx->luastate, (Packet *)p);
     LuaStateSetTX(td->lua_ctx->luastate, txptr);
     LuaStateSetFlow(td->lua_ctx->luastate, f, /* locked */FALSE);
@@ -144,6 +145,7 @@ static int LuaPacketLoggerAlerts(ThreadVars *tv, void *thread_data, const Packet
 
         lua_getglobal(td->lua_ctx->luastate, "log");
 
+        LuaStateSetThreadVars(td->lua_ctx->luastate, tv);
         LuaStateSetPacket(td->lua_ctx->luastate, (Packet *)p);
         LuaStateSetFlow(td->lua_ctx->luastate, p->flow, /* unlocked */TRUE);
         LuaStateSetPacketAlert(td->lua_ctx->luastate, (PacketAlert *)pa);
@@ -202,6 +204,7 @@ static int LuaPacketLogger(ThreadVars *tv, void *thread_data, const Packet *p)
     SCMutexLock(&td->lua_ctx->m);
     lua_getglobal(td->lua_ctx->luastate, "log");
 
+    LuaStateSetThreadVars(td->lua_ctx->luastate, tv);
     LuaStateSetPacket(td->lua_ctx->luastate, (Packet *)p);
     LuaStateSetFlow(td->lua_ctx->luastate, p->flow, /* unlocked */TRUE);
 
@@ -251,6 +254,7 @@ static int LuaFileLogger(ThreadVars *tv, void *thread_data, const Packet *p, con
 
     SCMutexLock(&td->lua_ctx->m);
 
+    LuaStateSetThreadVars(td->lua_ctx->luastate, tv);
     LuaStateSetPacket(td->lua_ctx->luastate, (Packet *)p);
     LuaStateSetTX(td->lua_ctx->luastate, txptr);
     LuaStateSetFlow(td->lua_ctx->luastate, p->flow, /* locked */FALSE);
index 06f5fec2a0a0c2e9ecff515579cbbe65b0f036ac..24acfa6d697b58a97e2c22b92e5dd6f990b3b574 100644 (file)
@@ -54,6 +54,8 @@
 #include <lualib.h>
 #include <lauxlib.h>
 
+/* key for tv (threadvars) pointer */
+const char lua_ext_key_tv[] = "suricata:lua:tv:ptr";
 /* key for tx pointer */
 const char lua_ext_key_tx[] = "suricata:lua:tx:ptr";
 /* key for p (packet) pointer */
@@ -68,6 +70,22 @@ const char lua_ext_key_pa[] = "suricata:lua:pkt:alert:ptr";
 /* key for file pointer */
 const char lua_ext_key_file[] = "suricata:lua:file:ptr";
 
+/** \brief get tv pointer from the lua state */
+ThreadVars *LuaStateGetThreadVars(lua_State *luastate)
+{
+    lua_pushlightuserdata(luastate, (void *)&lua_ext_key_tv);
+    lua_gettable(luastate, LUA_REGISTRYINDEX);
+    void *tv = lua_touserdata(luastate, -1);
+    return (ThreadVars *)tv;
+}
+
+void LuaStateSetThreadVars(lua_State *luastate, ThreadVars *tv)
+{
+    lua_pushlightuserdata(luastate, (void *)&lua_ext_key_tv);
+    lua_pushlightuserdata(luastate, (void *)tv);
+    lua_settable(luastate, LUA_REGISTRYINDEX);
+}
+
 /** \brief get packet pointer from the lua state */
 Packet *LuaStateGetPacket(lua_State *luastate)
 {
index 39557a15831194c1405607e1ea305b9613900402..1b528d778923d79072d9b7886881ef0456700ec6 100644 (file)
@@ -28,6 +28,9 @@
 
 /* gets */
 
+/** \brief get tv pointer from the lua state */
+ThreadVars *LuaStateGetThreadVars(lua_State *luastate);
+
 Packet *LuaStateGetPacket(lua_State *luastate);
 void *LuaStateGetTX(lua_State *luastate);
 
@@ -62,6 +65,8 @@ void LuaStateSetPacketAlert(lua_State *luastate, PacketAlert *pa);
 
 void LuaStateSetFile(lua_State *luastate, File *file);
 
+void LuaStateSetThreadVars(lua_State *luastate, ThreadVars *tv);
+
 void LuaPrintStack(lua_State *state);
 
 #endif /* HAVE_LUA */