From 13c4a8a09feeb173f6b8502520ff93910fdcfc03 Mon Sep 17 00:00:00 2001 From: Nicolas Date: Wed, 4 May 2016 21:33:01 +0200 Subject: [PATCH] Fix #36 Don't start listener if it doesn't contain a 'bind' parameter --- hbmqtt/broker.py | 71 +++++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 34 deletions(-) diff --git a/hbmqtt/broker.py b/hbmqtt/broker.py index 788745b..3ba1fcc 100644 --- a/hbmqtt/broker.py +++ b/hbmqtt/broker.py @@ -225,43 +225,46 @@ class Broker: for listener_name in self.listeners_config: listener = self.listeners_config[listener_name] - # Max connections - try: - max_connections = listener['max_connections'] - except KeyError: - max_connections = -1 - - # SSL Context - sc = None - if 'ssl' in listener and listener['ssl'].upper() == 'ON': + if 'bind' not in listener: + self.logger.debug("Listener configuration '%s' is not bound" % listener_name) + else: + # Max connections try: - sc = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) - sc.load_cert_chain(listener['certfile'], listener['keyfile']) - sc.verify_mode = ssl.CERT_OPTIONAL - except KeyError as ke: - raise BrokerException("'certfile' or 'keyfile' configuration parameter missing: %s" % ke) - except FileNotFoundError as fnfe: - raise BrokerException("Can't read cert files '%s' or '%s' : %s" % - (listener['certfile'], listener['keyfile'], fnfe)) + max_connections = listener['max_connections'] + except KeyError: + max_connections = -1 - if listener['type'] == 'tcp': - address, port = listener['bind'].split(':') - cb_partial = partial(self.stream_connected, listener_name=listener_name) - instance = yield from asyncio.start_server(cb_partial, - address, - port, - ssl=sc, - loop=self._loop) - self._servers[listener_name] = Server(listener_name, instance, max_connections, self._loop) - elif listener['type'] == 'ws': - address, port = listener['bind'].split(':') - cb_partial = partial(self.ws_connected, listener_name=listener_name) - instance = yield from websockets.serve(cb_partial, address, port, ssl=sc, loop=self._loop, - subprotocols=['mqtt']) - self._servers[listener_name] = Server(listener_name, instance, max_connections, self._loop) + # SSL Context + sc = None + if 'ssl' in listener and listener['ssl'].upper() == 'ON': + try: + sc = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) + sc.load_cert_chain(listener['certfile'], listener['keyfile']) + sc.verify_mode = ssl.CERT_OPTIONAL + except KeyError as ke: + raise BrokerException("'certfile' or 'keyfile' configuration parameter missing: %s" % ke) + except FileNotFoundError as fnfe: + raise BrokerException("Can't read cert files '%s' or '%s' : %s" % + (listener['certfile'], listener['keyfile'], fnfe)) - self.logger.info("Listener '%s' bind to %s (max_connections=%d)" % - (listener_name, listener['bind'], max_connections)) + if listener['type'] == 'tcp': + address, port = listener['bind'].split(':') + cb_partial = partial(self.stream_connected, listener_name=listener_name) + instance = yield from asyncio.start_server(cb_partial, + address, + port, + ssl=sc, + loop=self._loop) + self._servers[listener_name] = Server(listener_name, instance, max_connections, self._loop) + elif listener['type'] == 'ws': + address, port = listener['bind'].split(':') + cb_partial = partial(self.ws_connected, listener_name=listener_name) + instance = yield from websockets.serve(cb_partial, address, port, ssl=sc, loop=self._loop, + subprotocols=['mqtt']) + self._servers[listener_name] = Server(listener_name, instance, max_connections, self._loop) + + self.logger.info("Listener '%s' bind to %s (max_connections=%d)" % + (listener_name, listener['bind'], max_connections)) self.transitions.starting_success() yield from self.plugins_manager.fire_event(EVENT_BROKER_POST_START)