Mercurial > prosody-modules
comparison mod_rawdebug/mod_rawdebug.lua @ 2256:c5c583fae25d
mod_rawdebug: Simplify, remove telnet command, log every single byte
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Thu, 28 Jul 2016 12:14:33 +0200 |
| parents | ae1d7665cde9 |
| children |
comparison
equal
deleted
inserted
replaced
| 2255:cdfc917a8cc7 | 2256:c5c583fae25d |
|---|---|
| 1 module:set_global(); | 1 module:set_global(); |
| 2 | 2 |
| 3 local tostring = tostring; | 3 local tostring = tostring; |
| 4 local filters = require "util.filters"; | 4 local filters = require "util.filters"; |
| 5 | 5 |
| 6 local def_env = module:shared("admin_telnet/env"); | 6 local function log_send(t, session) |
| 7 local rawdebug_enabled = module:shared("sessions"); | 7 if t and t ~= "" and t ~= " " then |
| 8 local full_sessions = prosody.full_sessions; | 8 session.log("debug", "SEND(%d): %s", #t, tostring(t)); |
| 9 local log = module._log; | |
| 10 | |
| 11 local rawdebug = {}; | |
| 12 def_env.rawdebug = rawdebug; | |
| 13 | |
| 14 local function new_logger(log, prefix) | |
| 15 local msg = prefix .. ": %s"; | |
| 16 return function (data) | |
| 17 log("debug", msg, tostring(data)) | |
| 18 return data; | |
| 19 end | 9 end |
| 10 return t; | |
| 20 end | 11 end |
| 21 | 12 |
| 22 function rawdebug:enable(sessionid) | 13 local function log_recv(t, session) |
| 23 local session = full_sessions[sessionid]; | 14 if t and t ~= "" and t ~= " " then |
| 24 if not session then | 15 session.log("debug", "RECV(%d): %s", #t, tostring(t)); |
| 25 return nil, "No such session"; | |
| 26 end | 16 end |
| 27 local f = { | 17 return t; |
| 28 ["stanzas/in"] = new_logger(session.log or log, "RECV"); | |
| 29 ["stanzas/out"] = new_logger(session.log or log, "SEND"); | |
| 30 }; | |
| 31 for type, callback in pairs(f) do | |
| 32 filters.add_filter(session, type, callback) | |
| 33 end | |
| 34 rawdebug_enabled[session] = f; | |
| 35 end | 18 end |
| 36 | 19 |
| 37 function rawdebug:disable(sessionid) | 20 local function init_raw_logging(session) |
| 38 local session = full_sessions[sessionid]; | 21 filters.add_filter(session, "bytes/in", log_recv, -10000); |
| 39 if not session then | 22 filters.add_filter(session, "bytes/out", log_send, 10000); |
| 40 return nil, "No such session"; | |
| 41 end | |
| 42 local f = rawdebug_enabled[session]; | |
| 43 for type, callback in pairs(f) do | |
| 44 filters.remove_filter(session, type, callback) | |
| 45 end | |
| 46 end | 23 end |
| 47 | 24 |
| 48 function module.unload() | 25 filters.add_filter_hook(init_raw_logging); |
| 49 def_env.rawdebug = nil; | 26 |
| 50 for session, f in pairs(rawdebug_enabled) do | 27 function module.unload() -- luacheck: ignore |
| 51 for type, callback in pairs(f) do | 28 filters.remove_filter_hook(init_raw_logging); |
| 52 filters.remove_filter(session, type, callback) | |
| 53 end | |
| 54 end | |
| 55 end | 29 end |
| 56 |
