diff --git a/src/output-lua-common.c b/src/output-lua-common.c index 272621c821..6880d402f2 100644 --- a/src/output-lua-common.c +++ b/src/output-lua-common.c @@ -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; } diff --git a/src/output-lua.c b/src/output-lua.c index 4dff5e5556..198b5554e4 100644 --- a/src/output-lua.c +++ b/src/output-lua.c @@ -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); diff --git a/src/util-lua.c b/src/util-lua.c index 06f5fec2a0..24acfa6d69 100644 --- a/src/util-lua.c +++ b/src/util-lua.c @@ -54,6 +54,8 @@ #include #include +/* 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) { diff --git a/src/util-lua.h b/src/util-lua.h index 39557a1583..1b528d7789 100644 --- a/src/util-lua.h +++ b/src/util-lua.h @@ -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 */