diff options
author | nico <nico@magicbroccoli.de> | 2020-04-28 14:11:49 +0200 |
---|---|---|
committer | nico <nico@magicbroccoli.de> | 2020-04-28 14:11:49 +0200 |
commit | d44e4021fe879230adb762972b9080d021176146 (patch) | |
tree | 7763fc30bf6e177f8ec5af152994323851a929d5 /api.py | |
parent | bfcb912595cf15746882603dd9c8c9feaaba410d (diff) |
code cleanup
* split up api and metrics class
* revamped file nameming to better resemble their function
* update prometheus and influx files
* fixed version regex to not break on - in version string
Diffstat (limited to 'api.py')
-rw-r--r-- | api.py | 71 |
1 files changed, 71 insertions, 0 deletions
@@ -0,0 +1,71 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import re + +from packaging import version + + +class EjabberdApi: + """ + class to interact with the ejabberd rest/ xmlrpc api + """ + def __init__(self, url, login=None, api: str = "rpc"): + # api variables + self._login = login + self._url = url + + if api == "rpc": + self.cmd = self._rpc + else: + import requests + + self.session = requests.Session() + self.cmd = self._rest + + @property + def _auth(self) -> (str, None): + if self._login is not None: + return f"{self._login['user']}@{self._login['server']}", self._login['password'] + return None + + @property + def verstring(self): + if self._login is not None: + ver_str = re.compile('([1-9][0-9.]*)') + status = self.cmd('status', {}) + + # matches + tmp = ver_str.findall(status)[0] + + # return parsed version string + return version.parse(tmp) + + return None + + def _rest(self, command: str, data) -> dict: + # add authentication header to the session obj + if self.session.auth is None: + self.session.auth = self._auth + + # post + r = self.session.post('/'.join([self._url, command]), json=data) + + # proceed if response is ok + if r.ok: + return r.json() + + return {} + + def _rpc(self, command: str, data): + from xmlrpc import client + + with client.ServerProxy(self._url) as server: + fn = getattr(server, command) + try: + if self._login is not None: + return fn(self._login, data) + return fn(data) + + except: + # this needs to be more specific + return {} |