From f7dce4bfcd33a16f90057dff89bc419feb9f5516 Mon Sep 17 00:00:00 2001 From: clerie Date: Thu, 6 Jan 2022 16:10:30 +0100 Subject: [PATCH] Bootstrap some basic session handling --- mitel_ommclient2/session.py | 80 +++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 mitel_ommclient2/session.py diff --git a/mitel_ommclient2/session.py b/mitel_ommclient2/session.py new file mode 100644 index 0000000..78a73b5 --- /dev/null +++ b/mitel_ommclient2/session.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 + +from time import sleep + +from . import connection +from . import messages + +class Session: + """ + Synchronous API session handler + + :param host: Hostname or IP address of OMM + :param username: Username + :param password: Password + :param port: Port + :param connection_class: One of :class:`mitel_ommclient2.connection.Connection` or :class:`mitel_ommclient2.connection.SSLConnection` + + Usage:: + >>> s = Session("omm.local", "admin", "admin") + >>> s.request(mitel_ommclient2.messages.Ping()) + """ + + def __init__(self, host, username, password, port=None, connection_class=None): + self.host = host + self.username = username + self.password = password + self.port = port + self.connection_class = connection_class + if self.connection_class is None: + self.connection_class = connection.SSLConnection + + self._connection = None + + self._ensure_connection() + + def _wait_for_respose(self): + """ + Wait until data got received and return message string + """ + + while True: + r = self.connection.recv() + if r is not None: + return r + sleep(0.1) + + def _ensure_connection(self): + """ + Make sure we are connected and logged in + """ + + if self._connection is None: + kwargs = {} + if self.port is not None: + kwargs["port"] = self.port + self._connection = self.connection_class(self.host, **kwargs) + + self._connection.connect() + + self._connection.send(messages.Open(self.username, self.password)) + + res = self._wait_for_respose() + + def request(self, request): + """ + Sends a request and waits for response + + :param request: Request object + + Usage:: + >>> r = s.request(mitel_ommclient2.messages.Ping()) + >>> r.name + 'PingResp' + """ + + message = messages.construct(request) + self.connection.send(message) + + res = self._wait_for_respose() + return messages.parse(res)