mrDoctorWho/vk4xmpp

View on GitHub
modules/mod_iq_stats.py

Summary

Maintainability
B
4 hrs
Test Coverage
# coding: utf-8
# This file is a part of VK4XMPP transport
# © simpleApps, 2013 — 2015.

from __main__ import *


STAT_FIELDS = {
            "users/total": "users",
            "users/online": "users",
            "memory/virtual": "MB",
            "memory/real": "MB",
            "cpu/percent": "percent",
            "cpu/time": "seconds",
            "thread/active": "threads",
            "msg/in": "messages",
            "msg/out": "messages"
            }


def stats_handler(cl, iq):
    destination = iq.getTo()
    iqChildren = iq.getQueryChildren()
    result = iq.buildReply("result")
    if destination == TransportID:
        queryPayload = list()
        if not iqChildren:
            keys = sorted(STAT_FIELDS.keys(), reverse=True)
            for key in keys:
                node = xmpp.Node("stat", {"name": key})
                queryPayload.append(node)
        else:
            users = calcStats()
            try:
                shell = os.popen("ps -o vsz,rss,%%cpu,time -p %s" % os.getpid()).readlines()
                virt, real, percent, time = shell[1].split()
            except IndexError:
                logger.error("IndexError during trying to execute `ps`")
                raise xmpp.NodeProcessed()

            virt, real = "%0.2f" % (int(virt)/1024.0), "%0.2f" % (int(real)/1024.0)
            stats = {"users": users,
                    "MB": [virt, real],
                    "percent": [percent],
                    "seconds": [time],
                    "threads": [threading.activeCount()],
                    "messages": [Stats["msgout"], Stats["msgin"]]}
            for child in iqChildren:
                if child.getName() == "stat":
                    name = child.getAttr("name")
                    if name in STAT_FIELDS:
                        attr = STAT_FIELDS[name]
                        value = stats[attr].pop(0)
                        node = xmpp.Node("stat", {"units": attr})
                        node.setAttr("name", name)
                        node.setAttr("value", value)
                        queryPayload.append(node)
        if queryPayload:
            result.setQueryPayload(queryPayload)
            sender(cl, result)


def load():
    TransportFeatures.add(xmpp.NS_STATS)
    Component.RegisterHandler("iq", stats_handler, "get", xmpp.NS_STATS)

MOD_TYPE = "iq"
MOD_HANDLERS = ((stats_handler, "get", xmpp.NS_STATS, False),)
MOD_FEATURES = [xmpp.NS_STATS]