From e24b1ebc1eae2bfead771cb5e0e6d715d6dce262 Mon Sep 17 00:00:00 2001 From: nijenhofm Date: Mon, 27 Jul 2020 10:52:04 +0200 Subject: [PATCH] Clear telnet patch voor rdl achter sommige N-porten die reverse telnet gebruiken --- lmwsip.py | 43 ++++++++++++++++++++++++++++++------------- siprun | 5 ++++- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/lmwsip.py b/lmwsip.py index c44802e..a1e04b2 100644 --- a/lmwsip.py +++ b/lmwsip.py @@ -28,7 +28,7 @@ Support for: def __init__(self, user=None, password=None, host="sip-lmw.rws.nl", port=443, meetnet="LMW", ssl = True, - check_ssl = True, timeout = 10, log = None): + check_ssl = True, timeout = 10, log = None, cleartelnet = False): """LmwSip(user, password, [host], [port], [meetnet], [ssl], [check_ssl], [timeout], [log]) user(optinal): Lmw user name @@ -40,6 +40,7 @@ ssl(optional): Default true check_ssl(optional): true timeout(optional): 10 log(optional): None +cleartelnet: False Opens the connection and logs in """ @@ -52,6 +53,7 @@ Opens the connection and logs in self.check_ssl = check_ssl self.timeout = timeout self._socket = None + self.cleartelnet = cleartelnet if (log != None): self.log = log self.log.debug("LmwSip.init") @@ -156,28 +158,32 @@ send a sip command to the server recieve a answer from the sip server """ - buf="" + stringbuf="" while self._socket != None and re.search("\r$", buf) == None: try: self.log.debug("LmwSip.recv: Waiting for data"); - b = self._socket.recv(4096).decode('utf-8') - if (b == ""): - self.log.error("SipLmw.recv: socket closed") - self.closesocket() - raise LmwSipConnectError("LmwSip.recv: Socket close") - else: - buf += b + bytebuf = self._socket.recv(4096) + if self.cleartelnet: + while bytebuf[0] == '\xff': + self.log.info("SipLmw.recv: telnet data: %s", bytebuf) + bytebuf = self._socket.recv(4096) except Exception as e: self.log.error("SipLmw.recv: socket timeout: %s", e) self.closesocket() raise LmwSipConnectError("LmwSip.recv: Socket timeout") + try: + stringbuf += bytebuf.decode('utf-8') + except Exception as e: + self.log.error("SipLmw.recv: decode error: %s", e) + self.closesocket() + raise LmwSipDecodeError("LmwSip.recv: decode error", bytebuf) if self._socket == None: self.log.warn("LmwSip.recv: No connection") - elif buf[0] != '!': - self.log.warn("LmwSip.recv: Sip error: %s" % buf.strip('\r')) + elif stringbuf[0] != '!': + self.log.warn("LmwSip.recv: Sip error: %s" % stringbuf.strip('\r')) else: - self.log.debug("LmwSip.recv: result: %s" % buf.strip('\r')) - return(buf) + self.log.debug("LmwSip.recv: result: %s" % stringbuf.strip('\r')) + return(stringbuf) def login(self): """login() @@ -420,6 +426,17 @@ class LmwSipConnectError(Exception): def __str__(self): return(self.message) +class LmwSipDecodeError(Exception): + """Connection exceptions for LmwSip""" + + def __init__(self, message, buf): + self.message = message + self.buf = buf + + def __str__(self): + return(self.message + ":" + buf) + + class LmwLoginFailure(Exception): """Exception from LmwSip on login failure""" diff --git a/siprun b/siprun index d41a828..fe15312 100755 --- a/siprun +++ b/siprun @@ -10,6 +10,8 @@ def main(): parser = argparse.ArgumentParser(description="Run a sip file.") parser.add_argument("-u", "--unencrypted", action="store_true", help="Run a sip connection without ssl") + parser.add_argument("-c", "--cleartelnet", action="store_true", + help="Clear telnet protocol in tcp session") parser.add_argument("-H", "--host", action='store', default="sip-lmw.rws.nl", help="Host to connect to") @@ -27,7 +29,8 @@ def main(): try: lmwsip = LmwSip(host=args.host, port=args.port, - ssl=not args.unencrypted) + ssl=not args.unencrypted, + cleartelnet=args.cleartelnet) except Exception as e: print("Connect to lmw failed: %s" % e) exit(1)