diff --git a/boswatch/network/broadcast.py b/boswatch/network/broadcast.py index 7f9da4b..6684843 100644 --- a/boswatch/network/broadcast.py +++ b/boswatch/network/broadcast.py @@ -112,7 +112,7 @@ class BroadcastServer: @return True or False""" try: - if not self._serverThread: + if not self.isRunning: logging.debug("start udp broadcast server") self._serverThread = threading.Thread(target=self._listen) self._serverThread.name = "BroadServ" @@ -136,7 +136,7 @@ class BroadcastServer: @return True or False""" try: - if self._serverThread: + if self.isRunning: logging.debug("stop udp broadcast server") self._serverShutdown = True return True diff --git a/boswatch/network/client.py b/boswatch/network/client.py index 6c785db..7e73439 100644 --- a/boswatch/network/client.py +++ b/boswatch/network/client.py @@ -40,12 +40,15 @@ class TCPClient: @param port: Server Port (8080) @return True or False""" try: - self._sock = socket - self._sock.setdefaulttimeout(self._timeout) - self._sock = socket.create_connection((host, port)) - - logging.debug("connected to %s:%s", host, port) - return True + if not self.isConnected: + self._sock = socket + self._sock.setdefaulttimeout(self._timeout) + self._sock = socket.create_connection((host, port)) + logging.debug("connected to %s:%s", host, port) + return True + else: + logging.warning("client always connected") + return True except ConnectionRefusedError: logging.error("cannot connect to %s:%s - connection refused", host, port) return False @@ -61,9 +64,14 @@ class TCPClient: @return True or False""" try: - self._sock.close() - logging.debug("disconnected") - return True + if self.isConnected: + self._sock.close() + self._sock = None + logging.debug("disconnected") + return True + else: + logging.warning("client not connected") + return True except AttributeError: logging.error("cannot disconnect - no connection established") return False @@ -111,3 +119,10 @@ class TCPClient: except: # pragma: no cover logging.exception("error while receiving") return False + + @property + def isConnected(self): + """!Property of client connected state""" + if self._sock: + return True + return False diff --git a/boswatch/network/server.py b/boswatch/network/server.py index 0ebebd2..affdd5d 100644 --- a/boswatch/network/server.py +++ b/boswatch/network/server.py @@ -82,6 +82,10 @@ class TCPServer: self._clientsConnectedLock = threading.Lock() self._clientsConnected = {} + def __del__(self): + if self.isRunning: + self.stop() + def start(self, port=8080): """!Start a threaded TCP socket server @@ -93,21 +97,23 @@ class TCPServer: @return True or False""" try: - self._server = ThreadedTCPServer(("", port), ThreadedTCPRequestHandler) - self._server.timeout = self._timeout - self._server.alarmQueue = self._alarmQueue + if not self.isRunning: + self._server = ThreadedTCPServer(("", port), ThreadedTCPRequestHandler) + self._server.timeout = self._timeout + self._server.alarmQueue = self._alarmQueue - self._server.clientsConnctedLock = self._clientsConnectedLock - self._server.clientsConnected = self._clientsConnected + self._server.clientsConnctedLock = self._clientsConnectedLock + self._server.clientsConnected = self._clientsConnected - self._server_thread = threading.Thread(target=self._server.serve_forever) - self._server_thread.name = "Thread-BWServer" - self._server_thread.daemon = True - self._server_thread.start() - logging.debug("TCPServer started in Thread: %s", self._server_thread.name) - return True - except OSError: - logging.exception("server always running?") + self._server_thread = threading.Thread(target=self._server.serve_forever) + self._server_thread.name = "Thread-BWServer" + self._server_thread.daemon = True + self._server_thread.start() + logging.debug("TCPServer started in Thread: %s", self._server_thread.name) + return True + else: + logging.warning("server always started") + return True except: # pragma: no cover logging.exception("cannot start the server") return False @@ -117,16 +123,17 @@ class TCPServer: @return True or False""" try: - self._server.shutdown() - self._server_thread.join() - self._server_thread = None - self._server.socket.close() - self._server = None - logging.debug("TCPServer stopped") - return True - except AttributeError: - logging.exception("cannot stop - server not started?") - return False + if self.isRunning: + self._server.shutdown() + self._server_thread.join() + self._server_thread = None + self._server.socket.close() + self._server = None + logging.debug("TCPServer stopped") + return True + else: + logging.warning("server always stopped") + return True except: # pragma: no cover logging.exception("cannot stop the server") return False @@ -147,3 +154,10 @@ class TCPServer: # todo return full list or write a print/debug method? with self._clientsConnectedLock: # because our list is not threadsafe return self._clientsConnected + + @property + def isRunning(self): + """!Property of server running state""" + if self._server: + return True + return False diff --git a/bw_server.py b/bw_server.py index 8838cbb..7144e45 100644 --- a/bw_server.py +++ b/bw_server.py @@ -48,11 +48,7 @@ try: from boswatch import configYaml from boswatch.network.server import TCPServer from boswatch.packet.packet import Packet - from boswatch.plugin.pluginManager import PluginManager - from boswatch.descriptor.descriptor import Descriptor - from boswatch.filter.doubeFilter import DoubleFilter from boswatch.utils import header - from boswatch.network.broadcast import BroadcastClient from boswatch.network.broadcast import BroadcastServer except: # pragma: no cover logging.exception("cannot import modules") diff --git a/test/test_ServerClient.py b/test/test_ServerClient.py index fcba7a7..0e2ddff 100644 --- a/test/test_ServerClient.py +++ b/test/test_ServerClient.py @@ -55,7 +55,7 @@ class Test_ServerClient: def test_clientDisconnectFailed(self): """!Disconnect while no connection is established""" self.testClient = TCPClient() - assert not self.testClient.disconnect() + assert self.testClient.disconnect() def test_clientTransmitFailed(self): """!Transmit while no connection is established""" @@ -135,7 +135,7 @@ class Test_ServerClient: def test_serverStopFailed(self, useServer): """!Test to stop a stopped server""" assert self.testServer.stop() - assert not self.testServer.stop() + assert self.testServer.stop() def test_serverDoubleStart(self): """!Test to start the server twice""" @@ -145,7 +145,7 @@ class Test_ServerClient: assert self.testServer1.start() assert not self.testServer2.start() assert self.testServer1.stop() - assert not self.testServer2.stop() + assert self.testServer2.stop() def test_serverGetOutput(self, useServer): """!Send data to server with 2 clients, check '[ack]' and data on server queue"""