Mercurial > prosody-modules
changeset 432:23a6289a00bd
mod_stanza_counter: initial draft.
author | Marco Cirillo <maranda@lightwitch.org> |
---|---|
date | Tue, 20 Sep 2011 21:15:29 +0000 |
parents | fb7898826026 |
children | 967757965dbd |
files | mod_stanza_counter/mod_stanza_counter.lua |
diffstat | 1 files changed, 163 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_stanza_counter/mod_stanza_counter.lua Tue Sep 20 21:15:29 2011 +0000 @@ -0,0 +1,163 @@ +-- (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 +<html>\n +<head>\n +<title>Prosody's Stanza Counter</title>\n +<meta name=\"robots\" content=\"noindex, nofollow\" />\n +</head>\n +\n +<body>\n +<h3>Incoming and Outgoing stanzas divided per type</h3>\n +<p><strong>Incoming IQs</strong>: %d<br/>\n +<strong>Outgoing IQs</strong>: %d<br/>\n +<strong>Incoming Messages</strong>: %d<br/>\n +<strong>Outgoing Messages</strong>: %d<br/>\n +<strong>Incoming Presences</strong>: %d<br/>\n +<strong>Outgoing Presences</strong>: %d<p>\n +</body>\n +\n +</html>" + +local r_405 = "\n +<html>\n +<head>\n +<title>Prosody's Stanza Counter - Error</title>\n +<meta name=\"robots\" content=\"noindex, nofollow\" />\n +</head>\n +\n +<body>\n +<h3>Bad Method ... I only support GET.</h3>\n +</body>\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)