output-lua: expose thread info

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()
pull/1112/head
Victor Julien 12 years ago
parent 8802ba3f67
commit 22dd14d560

@ -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;
}

@ -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);

@ -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)
{

@ -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 */

Loading…
Cancel
Save