-- (C) 2011, Marco Cirillo (LW.Org)
-- General Stanzas' Counter with web output.
local jid_bare = require "util.jid".bare
local httpserver = require "net.httpserver"
module.host = "*" -- Needs to be global for stats web wise.
local ports = module:get_option_array("stanza_counter_ports" or {{ port = 5280; base = "stanza-counter" }})
-- http handlers
local r_200 = "\n
\n
\n
Prosody's Stanza Counter\n
\n
\n
\n
\n
Incoming and Outgoing stanzas divided per type
\n
Incoming IQs: %d
\n
Outgoing IQs: %d
\n
Incoming Messages: %d
\n
Outgoing Messages: %d
\n
Incoming Presences: %d
\n
Outgoing Presences: %d
\n
\n
\n
\n"
local r_405 = "\n
\n
\n
Prosody's Stanza Counter - Error\n
\n
\n
\n
\n
Bad Method ... I only support GET.
\n
\n
\n
\n"
local function res(code, r, h)
local response = {
status = code;
body = r;
}
if h then response.headers = h; end
return response
end
local function req(method, body, request)
if method = "GET" then
local forge_res = r_200:format(prosody.stanza_counter.iq["incoming"],
prosody.stanza_counter.iq["outgoing"],
prosody.stanza_counter.message["incoming"],
prosody.stanza_counter.message["outgoing"],
prosody.stanza_counter.presence["incoming"],
prosody.stanza_counter.presence["outgoing"]);
return res(200, forge_res)
else
return res(405, r_405, {["Allow"] = "GET"})
end
end
-- Setup, Init functions.
-- initialize function counter table on the global object on start
local function init_counter()
prosody.stanza_counter = {
iq = { incoming=0, outgoing=0 },
message = { incoming=0, outgoing=0 },
presence = { incoming=0, outgoing=0 }
}
end
-- init http interface
local function init_web()
httpserver.new_from_config(ports, req)
end
-- Setup on server start
local function setup()
init_counter(); init_web();
end
-- Basic Stanzas' Counters
local function iq_callback(check)
return function(self)
local origin, stanza = self.origin, self.stanza
if not prosody.stanza_counter then init_counter() end
if check
if not stanza.attr.to or hosts[jid_bare(stanza.attr.to)] then return nil;
else
prosody.stanza_counter.iq["outgoing"] = prosody.stanza_counter.iq["outgoing"] + 1
end
else
prosody.stanza_counter.iq["incoming"] = prosody.stanza_counter.iq["incoming"] + 1
end
end
end
local function message_callback(check)
return function(self)
local origin, stanza = self.origin, self.stanza
if not prosody.stanza_counter then init_counter() end
if check
if not stanza.attr.to or hosts[jid_bare(stanza.attr.to)] then return nil;
else
prosody.stanza_counter.message["outgoing"] = prosody.stanza_counter.message["outgoing"] + 1
end
else
prosody.stanza_counter.message["incoming"] = prosody.stanza_counter.message["incoming"] + 1
end
end
end
local function presence_callback(check)
return function(self)
local origin, stanza = self.origin, self.stanza
if not prosody.stanza_counter then init_counter() end
if check
if not stanza.attr.to or hosts[jid_bare(stanza.attr.to)] then return nil;
else
prosody.stanza_counter.presence["outgoing"] = prosody.stanza_counter.presence["outgoing"] + 1
end
else
prosody.stanza_counter.presence["incoming"] = prosody.stanza_counter.presence["incoming"] + 1
end
end
end
-- Hook all pre-stanza events.
module:hook("pre-iq/bare", iq_callback(true), 140)
module:hook("pre-iq/full", iq_callback(true), 140)
module:hook("pre-iq/host", iq_callback(true), 140)
module:hook("pre-message/bare", mes_callback(true), 140)
module:hook("pre-message/full", mes_callback(true), 140)
module:hook("pre-message/host", mes_callback(true), 140)
module:hook("pre-presence/bare", pre_callback(true), 140)
module:hook("pre-presence/full", pre_callback(true), 140)
module:hook("pre-presence/host", pre_callback(true), 140)
-- Hook all stanza events.
module:hook("iq/bare", iq_callback(false), 140)
module:hook("iq/full", iq_callback(false), 140)
module:hook("iq/host", iq_callback(false), 140)
module:hook("message/bare", mes_callback(false), 140)
module:hook("message/full", mes_callback(false), 140)
module:hook("message/host", mes_callback(false), 140)
module:hook("presence/bare", pre_callback(false), 140)
module:hook("presence/full", pre_callback(false), 140)
module:hook("presence/host", pre_callback(false), 140)
-- Hook server start to initialize the counter.
module:hook("server-started", setup)