.. _lua-functions: Lua函数 ============= `output`与`detect`的区别 ------------------------------------------ 当前``needs``键的初始化方式会根据脚本用途(输出或检测)而有所不同。用于``luaxform``转换的Lua脚本**不使用``needs``**。 若为检测脚本,``needs``应按如下示例初始化(完整检测脚本示例参见:ref:`lua-detection`): :: function init (args) local needs = {} needs["packet"] = tostring(true) return needs end 若为输出日志,则遵循以下模式(完整脚本结构参见:ref:`lua-output`): :: function init (args) local needs = {} needs["protocol"] = "tls" return needs end 需注意``log``和``match``可用的函数及协议也可能不同。例如DNP3协议就不支持日志记录。 packet ------ 初始化方式: :: function init (args) local needs = {} needs["type"] = "packet" return needs end flow ---- :: function init (args) local needs = {} needs["type"] = "flow" return needs end http ---- 输出日志时初始化: :: function init (args) local needs = {} needs["protocol"] = "http" return needs end 检测时需指定具体缓冲区(完整列表参见:ref:`lua-detection`),例如: :: function init (args) local needs = {} needs["http.uri"] = tostring(true) return needs end 流式数据 -------------- 当前支持记录重组后的TCP数据及标准化HTTP数据。脚本会对每个连续数据块触发调用。 对于TCP重组数据,会根据主机操作系统设置去除所有可能的重复段: :: function init (args) return {streaming = "tcp"} end 对于HTTP正文数据,会自动解压及分块处理(如适用): :: function init (args) return {streaming = "http"} end 流式数据会通过``args``中的``stream``子表传递给日志函数:: function log(args) -- 数据缓冲区 local data = args["stream"]["data"] -- 缓冲区是否开启 local open = args["stream"]["open"] -- 缓冲区是否关闭 local close = args["stream"]["close"] -- 发往服务端 local ts = args["stream"]["toserver"] -- 发往客户端 local tc = args["stream"]["toclient"] end