comparison mod_audit/mod_audit.lua @ 5299:e3a3a6c86a9f

mod_audit: Add a command to print the audit log on the command-line
author Matthew Wild <mwild1@gmail.com>
date Sat, 01 Apr 2023 13:22:12 +0100
parents 12f7d8b901e0
children 0091b7de2763
comparison
equal deleted inserted replaced
5298:12f7d8b901e0 5299:e3a3a6c86a9f
121 end 121 end
122 122
123 function moduleapi.audit(module, user, event_type, extra) 123 function moduleapi.audit(module, user, event_type, extra)
124 audit(module.host, user, "mod_" .. module:get_name(), event_type, extra); 124 audit(module.host, user, "mod_" .. module:get_name(), event_type, extra);
125 end 125 end
126
127 function module.command(_arg)
128 local arg = require "util.argparse".parse(_arg, { value_params = { "limit", "user" } });
129 local host = arg[1];
130 if not host then
131 print("EE: Please supply the host for which you want to show events");
132 return 1;
133 elseif not prosody.hosts[host] then
134 print("EE: Unknown host: "..host);
135 return 1;
136 end
137
138 require "core.storagemanager".initialize_host(host);
139 local store = stores[host];
140 local c = 0;
141
142 local results, err = store:find(nil, {
143 with = arg.user;
144 limit = arg.limit and tonumber(arg.limit) or nil;
145 })
146 if not results then
147 print("EE: Failed to query audit log: "..tostring(err));
148 return 1;
149 end
150
151 local colspec = {
152 { title = "Date", key = "when", width = 19, mapper = function (when) return os.date("%Y-%m-%d %R:%S", when); end };
153 { title = "Source", key = "source", width = 18 };
154 { title = "Event", key = "event_type", width = 22 };
155 };
156
157 if not arg.global then
158 table.insert(colspec, {
159 title = "User", key = "username", width = 30,
160 mapper = function (user)
161 if user == "@" then return ""; end
162 if user:sub(-#host-1, -1) == ("@"..host) then
163 return (user:gsub("@.+$", ""));
164 end
165 end;
166 });
167
168 if attach_ips then
169 table.insert(colspec, {
170 title = "IP", key = "ip", width = "28";
171 });
172 end
173 if attach_location then
174 table.insert(colspec, {
175 title = "Location", key = "country", width = 2;
176 });
177 end
178 end
179
180 local width = tonumber(os.getenv("COLUMNS")) or 80;
181 local row = require "util.human.io".table(colspec, width);
182
183 print(string.rep("-", width));
184 print(row());
185 print(string.rep("-", width));
186 for _, entry, when, user in results do
187 c = c + 1;
188 print(row({
189 when = when;
190 source = entry.attr.source;
191 event_type = entry.attr.type:gsub("%-", " ");
192 username = user;
193 ip = entry:get_child_text("remote-ip");
194 location = entry:find("location@country");
195 }));
196 end
197 print(string.rep("-", width));
198 print(("%d records displayed"):format(c));
199 end