Software / code / prosody-modules
File
mod_statistics/mod_statistics.lua @ 6305:1c62edeb9147
mod_pastebin: Update Readme
diff --git a/mod_pastebin/README.md b/mod_pastebin/README.md
--- a/mod_pastebin/README.md
+++ b/mod_pastebin/README.md
@@ -37,12 +37,14 @@ For example:
Pastes will be available by default at
`http://<your-prosody>:5280/pastebin/` by default.
-In Prosody 0.9 and later this can be changed with [HTTP
-settings](https://prosody.im/doc/http).
+Ports and path can be changed with [HTTP
+settings](https://prosody.im/doc/http), for example like:
-In 0.8 and older this can be changed with `pastebin_ports` (see below),
-or you can forward another external URL from your web server to Prosody,
-use `pastebin_url` to set that URL.
+``` {.lua}
+ http_paths = {
+ pastebin = "/$host-paste";
+ }
+```
# Discovery
@@ -82,27 +84,16 @@ The line and character tresholds are adv
pastebin_line_threshold The maximum number of lines a message may have before it is sent to the pastebin. (default 4 lines)
pastebin_trigger A string of characters (e.g. "!paste ") which if detected at the start of a message, always sends the message to the pastebin, regardless of length. (default: not set)
pastebin_expire_after Number of hours after which to expire (remove) a paste, defaults to 24. Set to 0 to store pastes permanently on disk.
- pastebin_ports List of ports to run the HTTP server on, same format as mod_httpserver's http_ports[^1]
- pastebin_url Base URL to display for pastebin links, must end with / and redirect to Prosody's built-in HTTP server[^2]
# Compatibility
- ------ -------
- trunk Works
+ ------ ---------------------
+ trunk Works as of 25-06-13
+ 13 Works
0.12 Works
- 0.11 Works
- 0.10 Works
- 0.9 Works
- 0.8 Works
- ------ -------
+ ------ ---------------------
# Todo
- Maximum paste length
- Web interface to submit pastes?
-
-[^1]: As of Prosody 0.9, `pastebin_ports` is replaced by `http_ports`,
- see [Prosody HTTP server documentation](https://prosody.im/doc/http)
-
-[^2]: See also
- [http_external_url](https://prosody.im/doc/http#external_url)
| author | Menel <menel@snikket.de> |
|---|---|
| date | Fri, 13 Jun 2025 11:39:58 +0200 |
| parent | 3414:66bda434d476 |
line wrap: on
line source
module:set_global(); local stats = module:require("mod_statistics/stats"); local filters = require "util.filters"; local serialize = require "util.serialization".serialize; local cached_values = {}; local sessions = {}; local function push_stat(conn, name, value) local value_str = serialize(value); return conn:write((("STAT %q (%s)\n"):format(name, value_str):gsub("\\\n", "\\n"))); end local function push_stat_to_all(name, value) for conn in pairs(sessions) do push_stat(conn, name, value); end end local session_stats_tpl = ([[{ message_in = %d, message_out = %d; presence_in = %d, presence_out = %d; iq_in = %d, iq_out = %d; bytes_in = %d, bytes_out = %d; }]]):gsub("%s", ""); local jid_fields = { c2s = "full_jid"; s2sin = "from_host"; s2sout = "to_host"; component = "host"; }; local function push_session_to_all(session, stats) local id = tostring(session):match("[a-f0-9]+$"); -- FIXME: Better id? :/ local stanzas_in, stanzas_out = stats.stanzas_in, stats.stanzas_out; local s = (session_stats_tpl):format( stanzas_in.message, stanzas_out.message, stanzas_in.presence, stanzas_out.presence, stanzas_in.iq, stanzas_out.iq, stats.bytes_in, stats.bytes_out); local jid = session[jid_fields[session.type]] or ""; for conn in pairs(sessions) do conn:write(("SESS %q %q %s\n"):format(id, jid, s)); end end local available_stats = stats.stats; local active_sessions = stats.active_sessions; -- Handle statistics provided by other modules local function item_handlers(host) host = host and (host.."/") or ""; return function (event) -- Added local stats = event.item.statistics; local group = host..(stats.name and (stats.name.."::") or ""); for name, stat in pairs(stats) do available_stats[group..name] = stat; end end, function (event) -- Removed local stats = event.item.statistics; local group = host..(stats.name and (stats.name.."::") or ""); for name, stat in pairs(stats) do available_stats[group..name] = nil; end end; end module:handle_items("statistics-provider", item_handlers()); function module.add_host(module) module:handle_items("statistics-provider", item_handlers(module.host)); end -- Network listener local listener = {}; function listener.onconnect(conn) sessions[conn] = {}; push_stat(conn, "version", prosody.version); for name, value in pairs(cached_values) do push_stat(conn, name, value); end conn:write("\n"); -- Signal end of first batch (for non-streaming clients) end function listener.onincoming(conn, data) end function listener.ondisconnect(conn) sessions[conn] = nil; end function listener.onreadtimeout() return true; end function module.load() if not(prosody and prosody.arg) then return; end filters.add_filter_hook(stats.filter_hook); module:add_timer(1, function () for stat_name, stat in pairs(available_stats) do if stat.get then local cached = cached_values[stat_name]; local new_value = stat.get(); if new_value ~= cached then push_stat_to_all(stat_name, new_value); cached_values[stat_name] = new_value; end end end for session, session_stats in pairs(active_sessions) do active_sessions[session] = nil; push_session_to_all(session, session_stats); end return 1; end); end function module.unload() filters.remove_filter_hook(stats.filter_hook); end function module.command( args ) local command = args[1]; if command == "top" then local dir = module:get_directory(); package.path = dir.."/?.lua;"..dir.."/?.lib.lua;"..package.path; local prosodytop = module:require "prosodytop"; prosodytop.run(); end end if prosody and prosody.arg then module:provides("net", { default_port = 5782; listener = listener; private = true; }); end