diff options
Diffstat (limited to 'calls.py')
-rw-r--r-- | calls.py | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/calls.py b/calls.py new file mode 100644 index 0000000..bd6bd0a --- /dev/null +++ b/calls.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import logging +import re + +from packaging import version + +from api import EjabberdApi + +log = logging.getLogger(__name__) + + +class EjabberdApiCalls(EjabberdApi): + @property + def verstring(self): + if self._login is not None: + ver_str = re.compile('([1-9][0-9.]+(?![.a-z]))\\b') + status = self.cmd('status', {}) + + # matches + try: + tmp = ver_str.findall(status)[0] + # raise SystemExit code 17 if no status message is received + except TypeError: + raise SystemExit(17) + + # return parsed version string + log.debug(f"fetched version string: {tmp}") + return version.parse(tmp) + + return None + + def fetch_onlineuser(self): + tmp = self.cmd("connected_users_info", {}) + if "connected_users_info" not in tmp: + return tmp + data = [] + for c in tmp["connected_users_info"]: + if "session" not in c: + continue + user = {} + for attrs in c["session"]: + for k, v in attrs.items(): + user[k] = v + data.append(user) + return data + + def fetch_nodes(self): + result = self.cmd("list_cluster", {}) + if "nodes" not in result: + return result + data = [] + for node in result["nodes"]: + data.append(node["node"]) + return data + + def fetch_vhosts(self): + result = self.cmd("registered_vhosts", {}) + if "vhosts" not in result: + return result + data = [] + for vhost in result["vhosts"]: + data.append(vhost["vhost"]) + return data + + def fetch_s2s_in(self): + result = self.cmd("incoming_s2s_number", {}) + if "s2s_incoming" not in result: + return result + return result["s2s_incoming"] + + def fetch_s2s_out(self): + result = self.cmd("outgoing_s2s_number", {}) + if "s2s_outgoing" not in result: + return result + return result["s2s_outgoing"] + + def fetch_registered_count(self, vhost=None): + if vhost is None: + result = self.cmd("stats", {"name": "registeredusers"}) + if "stat" in result: + return result["stat"] + else: + result = self.cmd("stats_host", {"name": "registeredusers", "host": vhost}) + if "stat" in result: + return result["stat"] + + def fetch_muc_count(self, vhost=None, muc_host="conference"): + host = "global" + if vhost is not None: + if self.verstring.major >= 19: + host = '.'.join([muc_host, vhost]) + else: + host = vhost + result = self.cmd("muc_online_rooms", {"host": host}) + if "rooms" in result: + return len(result["rooms"]) + return len(result) |