Issue 1, 3: Integratie logger & verbetering fout detectie

This commit is contained in:
2020-01-03 15:03:16 +01:00
parent 4f148ef9d3
commit 3ea69b0ba2
2 changed files with 110 additions and 17 deletions

114
lmwsip.py
View File

@@ -4,8 +4,10 @@ See: LmwSip"""
import socket
import ssl
import select
import time
import re
import logging
class LmwSip:
"""Class to connect to the LMW Standard Interface prototcol (sip)
@@ -23,9 +25,9 @@ Support for:
"""
def __init__(self, user=None, password=None,
host="sip-lmw.rws.nl", port=443,
meetnet="LMW", ssl = True, check_ssl = True):
"""LmwSip(user, password, [host], [port], [meetnet], [ssl], [check_ssl])
host="sip-lmw.rws.nl", port=443, meetnet="LMW", ssl = True,
check_ssl = True, timeout = 10, log = None):
"""LmwSip(user, password, [host], [port], [meetnet], [ssl], [check_ssl], [timeout], [log])
user(optinal): Lmw user name
password(optional): Lmw password
@@ -34,6 +36,8 @@ port(optional): Default 443
meetnet(optional): Default LMW
ssl(optional): Default true
check_ssl(optional): true
timeout(optional): 10
log(optional): None
Opens the connection and logs in
"""
@@ -44,6 +48,17 @@ Opens the connection and logs in
self.meetnet = meetnet
self.ssl = ssl
self.check_ssl = check_ssl
self.timeout = timeout
self._socket = None
if (log != None):
self.log = log
self.log.debug("LmwSip.init")
else:
try:
self.log = logging.getLogger("lmwsip")
self.log.debug("LmwSip.init: Start log")
except Exception as e:
print("Logger failed: %s" % e)
if (self.host != None):
self.connect()
if (self.user != None):
@@ -85,22 +100,51 @@ Opens the connection and logs in
connects to lmw with tcp using the values of the object creation.
"""
self._tcp = socket.create_connection((self.host, self.port))
try:
self._tcp = socket.create_connection((self.host, self.port))
except Exception as e:
self.log.error("LmwSip.connect(%s, %s) failed: %s",
self.host, self.port, e)
raise LmwSipConnectError("LmwSip.connect: Socket create failed")
if (self.ssl):
self._context = ssl.create_default_context()
self._context.check_hostname = self.check_ssl
self._ssl = self._context.wrap_socket(self._tcp,
try:
self._context = ssl.create_default_context()
self._context.check_hostname = self.check_ssl
self._ssl = self._context.wrap_socket(self._tcp,
server_hostname=self.host)
self._socket = self._ssl
self._socket = self._ssl
except Exception as e:
self.log.error("LmwSip.connect setup ssl failed:\n%s", e)
raise LmwSipConnectError("LmwSip.connect: setup ssl failed")
else:
self._socket = self._tcp
self._socket.settimeout(self.timeout)
def closesocket(self):
"""Closes the socket and set the socket to None. Doesn't logout"""
try:
self.log.debug("LmwSip.closesocket")
self._socket.close()
except Exception as e:
pass
self._socket = None
def send(self, sipcmd):
"""send(sipcmd)
send a sip command to the server
"""
self._socket.sendall(sipcmd.encode('ascii'))
if self._socket != None:
try:
self.log.debug("LmwSip.send(%s)" % sipcmd)
self._socket.sendall(sipcmd.encode('ascii'))
except Exception as e:
self.log.error("LmwSip.send(%s) failed: %s", sipcmd, e)
self.closesocket()
raise LmwSipConnectError("LmwSip.send: Socket connection lost")
else:
self.log.warn("LmwSip.send: No connection")
def recv(self):
"""recv()
@@ -108,8 +152,26 @@ send a sip command to the server
recieve a answer from the sip server
"""
buf=""
while re.search("\r$", buf) == None:
buf += self._socket.recv(4096).decode('utf-8')
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
except Exception as e:
self.log.error("SipLmw.recv: socket timeout: %s", e)
self.closesocket()
raise LmwSipConnectError("LmwSip.recv: Socket timeout")
if self._socket == None:
self.log.warn("LmwSip.recv: No connection")
elif buf[0] != '!':
self.log.warn("LmwSip.recv: Sip error: %s" % buf)
else:
self.log.debug("LmwSip.recv: result: %s" % buf)
return(buf)
def login(self):
@@ -135,7 +197,7 @@ Raises a LmwCmdWarn of failure
self.send(ti)
d = self.recv()
if (d('ascii')[0] != '!'):
raise LmwCmdWarn("TI " + self.meetnet +":" + d)
raise LmwCmdWarn(ti, d)
return (d[2:-1])
def cmd(self, process, location, parameter, time_delta, day,
@@ -170,12 +232,12 @@ Returns:
self.send(cmdstr)
d = self.recv()
if (d[0] != '!'):
raise LmwCmdWarn(d)
raise LmwCmdWarn(cmdstr, d)
return (d[2:-1])
def value(self, process, location, parameter, day = None,
time_of_day = None):
"""value(process, location, parameter, [day], [time_of_day], [cmd_type="DATA"]):
"""value(process, location, parameter, [day], [time_of_day]):
Parameters:
process: <WN|VW|AS>
@@ -215,9 +277,33 @@ Returns a single string value or None
Logs of
"""
self.send("LO\r")
self.closesocket()
class LmwSipConnectError(Exception):
"""Connection exceptions for LmwSip"""
def __init__(self, message):
self.message = message
def __str__(self):
return(self.message)
class LmwLoginFailure(Exception):
"""Exception from LmwSip on login failure"""
def __init__(self, user, message):
self.user = user
self.message = message
def __str__(self):
return("Login with user %s failed: %s", self.user, self.message)
class LmwCmdWarn(Warning):
"""Exception fro LmwSip on a cmd"""
def __init__(self, cmd, message):
self.cmd = cmd
self.message = message
def __str__(self):
return("Cmd %s failed: %s", self.cmd, self.message)

13
siprun
View File

@@ -46,7 +46,11 @@ def main():
print("Set host and port")
usage()
sys.exit(3)
lmwsip = LmwSip(ssl=ssl, host=host, port=port)
try:
lmwsip = LmwSip(ssl=ssl, host=host, port=port)
except Exception as e:
print("Connect to lmw failed: %s" % e)
exit(1)
if (date == None or time == None):
# We assume a 10 minut interval so we use H10
r = lmwsip.lasttime("H10")
@@ -61,8 +65,11 @@ def main():
cmd = cmd.replace('{TIME}', time)
cmd = cmd.replace('\n', '\r')
print("> [%s]" % (cmd.strip('\r')))
lmwsip.send(cmd)
print("< [%s]" % (lmwsip.recv().strip('\r')))
try:
lmwsip.send(cmd)
print("< [%s]" % (lmwsip.recv().strip('\r')))
except:
pass
f.close()
if __name__ == "__main__":