Software / code / prosody
Comparison
plugins/mod_account_activity.lua @ 13670:cb44753db100
Merge 13.0->trunk
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Wed, 12 Feb 2025 17:16:09 +0000 |
| parent | 13668:6be7de547a25 |
| child | 13682:0055c177a54c |
comparison
equal
deleted
inserted
replaced
| 13666:528fcef83684 | 13670:cb44753db100 |
|---|---|
| 1 local jid = require "util.jid"; | 1 local jid = require "prosody.util.jid"; |
| 2 local time = os.time; | 2 local time = os.time; |
| 3 | 3 |
| 4 local store = module:open_store(nil, "keyval+"); | 4 local store = module:open_store(nil, "keyval+"); |
| 5 | 5 |
| 6 module:hook("authentication-success", function(event) | 6 module:hook("authentication-success", function(event) |
| 45 return true, ("%s (%s)"):format(os.date("%Y-%m-%d %H:%M:%S", last_timestamp), (is_online and "online" or "offline")); | 45 return true, ("%s (%s)"):format(os.date("%Y-%m-%d %H:%M:%S", last_timestamp), (is_online and "online" or "offline")); |
| 46 end; | 46 end; |
| 47 }); | 47 }); |
| 48 | 48 |
| 49 module:add_item("shell-command", { | 49 module:add_item("shell-command", { |
| 50 section = "user"; | |
| 51 section_desc = "View user activity data"; | |
| 52 name = "list_inactive"; | |
| 53 desc = "List inactive user accounts"; | |
| 54 args = { | |
| 55 { name = "host"; type = "string" }; | |
| 56 { name = "duration"; type = "string" }; | |
| 57 }; | |
| 58 host_selector = "host"; | |
| 59 handler = function(self, host, duration) --luacheck: ignore 212/self | |
| 60 local um = require "prosody.core.usermanager"; | |
| 61 local duration_sec = require "prosody.util.human.io".parse_duration(duration); | |
| 62 if not duration_sec then | |
| 63 return false, ("Invalid duration %q - try something like \"30d\""):format(duration); | |
| 64 end | |
| 65 | |
| 66 local now = os.time(); | |
| 67 local n_inactive, n_unknown = 0, 0; | |
| 68 | |
| 69 for username in um.users(host) do | |
| 70 local last_active = store:get_key(username, "timestamp"); | |
| 71 if not last_active then | |
| 72 local created_at = um.get_account_info(username, host).created; | |
| 73 if created_at and (now - created_at) > duration_sec then | |
| 74 self.session.print(username, ""); | |
| 75 n_inactive = n_inactive + 1; | |
| 76 elseif not created_at then | |
| 77 n_unknown = n_unknown + 1; | |
| 78 end | |
| 79 elseif (now - last_active) > duration_sec then | |
| 80 self.session.print(username, os.date("%Y-%m-%dT%T", last_active)); | |
| 81 n_inactive = n_inactive + 1; | |
| 82 end | |
| 83 end | |
| 84 | |
| 85 if n_unknown > 0 then | |
| 86 return true, ("%d accounts inactive since %s (%d unknown)"):format(n_inactive, os.date("%Y-%m-%dT%T", now - duration_sec), n_unknown); | |
| 87 end | |
| 88 return true, ("%d accounts inactive since %s"):format(n_inactive, os.date("%Y-%m-%dT%T", now - duration_sec)); | |
| 89 end; | |
| 90 }); | |
| 91 | |
| 92 module:add_item("shell-command", { | |
| 50 section = "migrate"; | 93 section = "migrate"; |
| 51 section_desc = "Perform data migrations"; | 94 section_desc = "Perform data migrations"; |
| 52 name = "account_activity_lastlog2"; | 95 name = "account_activity_lastlog2"; |
| 53 desc = "Migrate account activity information from mod_lastlog2"; | 96 desc = "Migrate account activity information from mod_lastlog2"; |
| 54 args = { { name = "host"; type = "string" } }; | 97 args = { { name = "host"; type = "string" } }; |
| 55 host_selector = "host"; | 98 host_selector = "host"; |
| 56 handler = function(self, host) --luacheck: ignore 212/host | 99 handler = function(self, host) --luacheck: ignore 212/host |
| 57 local lastlog2 = module:open_store("lastlog2", "keyval+"); | 100 local lastlog2 = module:open_store("lastlog2", "keyval+"); |
| 58 local n_updated, n_errors, n_skipped = 0, 0, 0; | 101 local n_updated, n_errors, n_skipped = 0, 0, 0; |
| 59 | 102 |
| 60 local async = require "util.async"; | 103 local async = require "prosody.util.async"; |
| 61 | 104 |
| 62 local p = require "util.promise".new(function (resolve) | 105 local p = require "prosody.util.promise".new(function (resolve) |
| 63 local async_runner = async.runner(function () | 106 local async_runner = async.runner(function () |
| 64 local n = 0; | 107 local n = 0; |
| 65 for username in lastlog2:items() do | 108 for username in lastlog2:items() do |
| 66 n = n + 1; | 109 n = n + 1; |
| 67 if n % 100 == 0 then | 110 if n % 100 == 0 then |