aboutsummaryrefslogtreecommitdiffstats
path: root/calls.py
diff options
context:
space:
mode:
Diffstat (limited to 'calls.py')
-rw-r--r--calls.py98
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)