confserver revamp #88

Merged
bmartin5692 merged 12 commits from wip-confserver-jinja2 into master 2020-01-05 02:46:34 +01:00
2 changed files with 113 additions and 137 deletions
Showing only changes of commit 70fdfdb1b3 - Show all commits

View file

@ -27,7 +27,7 @@ class MQTTHelperBot:
def __init__(self, address): def __init__(self, address):
self.address = address self.address = address
self.client_id = "helper1@bumper/helper1" self.client_id = "helperbot@bumper/helperbot"
self.command_responses = [] self.command_responses = []
async def start_helper_bot(self): async def start_helper_bot(self):
@ -44,89 +44,26 @@ class MQTTHelperBot:
) )
await self.Client.subscribe( await self.Client.subscribe(
[ [
("iot/p2p/+/+/+/+/helper1/bumper/helper1/+/+/+", QOS_0), ("iot/p2p/+/+/+/+/helperbot/bumper/helperbot/+/+/+", QOS_0),
("iot/p2p/+", QOS_0), ("iot/p2p/+", QOS_0),
("iot/atr/+", QOS_0), ("iot/atr/+", QOS_0),
] ]
) )
asyncio.create_task(self.get_msg()) # except ConnectionRefusedError as e:
# helperbotlog.Error(e)
# pass
except ConnectionRefusedError as e: # except asyncio.CancelledError as e:
helperbotlog.Error(e) # pass
pass
except asyncio.CancelledError as e: # except hbmqtt.client.ConnectException as e:
pass # helperbotlog.Error(e)
# pass
except hbmqtt.client.ConnectException as e:
helperbotlog.Error(e)
pass
except Exception as e: except Exception as e:
helperbotlog.exception("{}".format(e)) helperbotlog.exception("{}".format(e))
async def get_msg(self):
while True:
message = await self.Client.deliver_message()
if str(message.topic).split("/")[6] == "helper1":
# Response to command
helperbotlog.debug(
"Received Response - Topic: {} - Message: {}".format(
message.topic, str(message.data.decode("utf-8"))
)
)
self.command_responses.append(
{
"time": time.time(),
"topic": message.topic,
"payload": str(message.data.decode("utf-8")),
}
)
elif str(message.topic).split("/")[3] == "helper1":
# Helperbot sending command
helperbotlog.debug(
"Send Command - Topic: {} - Message: {}".format(
message.topic, str(message.data.decode("utf-8"))
)
)
elif str(message.topic).split("/")[1] == "atr":
# Broadcast message received on atr
if str(message.topic).split("/")[2] == "errors":
boterrorlog.error(
"Received Error - Topic: {} - Message: {}".format(
message.topic, str(message.data.decode("utf-8"))
)
)
else:
helperbotlog.debug(
"Received Broadcast - Topic: {} - Message: {}".format(
message.topic, str(message.data.decode("utf-8"))
)
)
else:
helperbotlog.debug(
"Received Message - Topic: {} - Message: {}".format(
message.topic, str(message.data.decode("utf-8"))
)
)
# Cleanup "expired messages" > 60 seconds from time
for msg in self.command_responses:
expire_time = (
datetime.fromtimestamp(msg["time"])
+ timedelta(seconds=self.expire_msg_seconds)
).timestamp()
if time.time() > expire_time:
helperbotlog.debug(
"Pruning Message Due To Expiration - Message Topic: {}".format(
msg["topic"]
)
)
self.command_responses.remove(msg)
async def wait_for_resp(self, requestid): async def wait_for_resp(self, requestid):
try: try:
@ -139,8 +76,7 @@ class MQTTHelperBot:
if len(self.command_responses) > 0: if len(self.command_responses) > 0:
for msg in self.command_responses: for msg in self.command_responses:
topic = str(msg["topic"]).split("/") topic = str(msg["topic"]).split("/")
if topic[6] == "helper1" and topic[10] == requestid: if topic[6] == "helperbot" and topic[10] == requestid:
# helperbotlog.debug('VacBot MQTT Response: Topic: %s Payload: %s' % (msg['topic'], msg['payload']))
if topic[11] == "j": if topic[11] == "j":
resppayload = json.loads(msg["payload"]) resppayload = json.loads(msg["payload"])
else: else:
@ -175,7 +111,7 @@ class MQTTHelperBot:
async def send_command(self, cmdjson, requestid): async def send_command(self, cmdjson, requestid):
if not self.Client._handler.writer is None: if not self.Client._handler.writer is None:
try: try:
ttopic = "iot/p2p/{}/helper1/bumper/helper1/{}/{}/{}/q/{}/{}".format( ttopic = "iot/p2p/{}/helperbot/bumper/helperbot/{}/{}/{}/q/{}/{}".format(
cmdjson["cmdName"], cmdjson["cmdName"],
cmdjson["toId"], cmdjson["toId"],
cmdjson["toType"], cmdjson["toType"],
@ -298,13 +234,6 @@ class BumperMQTTServer_Plugin:
async def authenticate(self, *args, **kwargs): async def authenticate(self, *args, **kwargs):
authenticated = False authenticated = False
if not self.auth_config:
# auth config section not found
self.context.logger.warning(
"'auth' section not found in context configuration"
)
return False
try: try:
session = kwargs.get("session", None) session = kwargs.get("session", None)
@ -334,7 +263,7 @@ class BumperMQTTServer_Plugin:
realm = tmpclientdetail[0] realm = tmpclientdetail[0]
resource = tmpclientdetail[1] resource = tmpclientdetail[1]
if userid == "helper1": if userid == "helperbot":
mqttserverlog.info(f"Bumper Authentication Success - Helperbot: {client_id}") mqttserverlog.info(f"Bumper Authentication Success - Helperbot: {client_id}")
authenticated = True authenticated = True
else: else:
@ -413,9 +342,67 @@ class BumperMQTTServer_Plugin:
bumper.client_set_mqtt(client["resource"], True) bumper.client_set_mqtt(client["resource"], True)
return return
#async def on_broker_message_received(self, client_id, message): async def on_broker_message_received(self, client_id, message):
#print(message) self.handle_helperbot_msg(client_id, message)
# Look at replacing helperbot with code here
def handle_helperbot_msg(self, client_id, message):
if str(message.topic).split("/")[6] == "helperbot":
# Response to command
helperbotlog.debug(
"Received Response - Topic: {} - Message: {}".format(
message.topic, str(message.data.decode("utf-8"))
)
)
bumper.mqtt_helperbot.command_responses.append(
{
"time": time.time(),
"topic": message.topic,
"payload": str(message.data.decode("utf-8")),
}
)
elif str(message.topic).split("/")[3] == "helperbot":
# Helperbot sending command
helperbotlog.debug(
"Send Command - Topic: {} - Message: {}".format(
message.topic, str(message.data.decode("utf-8"))
)
)
elif str(message.topic).split("/")[1] == "atr":
# Broadcast message received on atr
if str(message.topic).split("/")[2] == "errors":
boterrorlog.error(
"Received Error - Topic: {} - Message: {}".format(
message.topic, str(message.data.decode("utf-8"))
)
)
else:
helperbotlog.debug(
"Received Broadcast - Topic: {} - Message: {}".format(
message.topic, str(message.data.decode("utf-8"))
)
)
else:
helperbotlog.debug(
"Received Message - Topic: {} - Message: {}".format(
message.topic, str(message.data.decode("utf-8"))
)
)
# Cleanup "expired messages" > 60 seconds from time
for msg in bumper.mqtt_helperbot.command_responses:
expire_time = (
datetime.fromtimestamp(msg["time"])
+ timedelta(seconds=bumper.mqtt_helperbot.expire_msg_seconds)
).timestamp()
if time.time() > expire_time:
helperbotlog.debug(
"Pruning Message Due To Expiration - Message Topic: {}".format(
msg["topic"]
)
)
bumper.mqtt_helperbot.command_responses.remove(msg)
async def on_broker_client_disconnected(self, client_id): async def on_broker_client_disconnected(self, client_id):

View file

@ -31,10 +31,9 @@ async def test_helperbot_message():
await mqtt_helperbot.Client.publish( await mqtt_helperbot.Client.publish(
msg_topic_name, msg_payload.encode(), hbmqtt.client.QOS_0 msg_topic_name, msg_payload.encode(), hbmqtt.client.QOS_0
) )
try:
await asyncio.wait_for(mqtt_helperbot.Client.deliver_message(), timeout=0.1) await asyncio.wait_for(mqtt_helperbot.Client.deliver_message(), timeout=0.1)
except asyncio.TimeoutError:
pass
l.check_present( l.check_present(
( (
"helperbot", "helperbot",
@ -53,20 +52,19 @@ async def test_helperbot_message():
) # Check helperbot is connected ) # Check helperbot is connected
msg_payload = "{}" msg_payload = "{}"
msg_topic_name = ( msg_topic_name = (
"iot/p2p/GetWKVer/helper1/bumper/helper1/bot_serial/ls1ok3/wC3g/q/iCmuqp/j" "iot/p2p/GetWKVer/helperbot/bumper/helperbot/bot_serial/ls1ok3/wC3g/q/iCmuqp/j"
) )
await mqtt_helperbot.Client.publish( await mqtt_helperbot.Client.publish(
msg_topic_name, msg_payload.encode(), hbmqtt.client.QOS_0 msg_topic_name, msg_payload.encode(), hbmqtt.client.QOS_0
) )
try:
await asyncio.wait_for(mqtt_helperbot.Client.deliver_message(), timeout=0.1) await asyncio.wait_for(mqtt_helperbot.Client.deliver_message(), timeout=0.1)
except asyncio.TimeoutError:
pass
l.check_present( l.check_present(
( (
"helperbot", "helperbot",
"DEBUG", "DEBUG",
"Send Command - Topic: iot/p2p/GetWKVer/helper1/bumper/helper1/bot_serial/ls1ok3/wC3g/q/iCmuqp/j - Message: {}", "Send Command - Topic: iot/p2p/GetWKVer/helperbot/bumper/helperbot/bot_serial/ls1ok3/wC3g/q/iCmuqp/j - Message: {}",
) )
) # Check send command message was logged ) # Check send command message was logged
l.clear() l.clear()
@ -80,20 +78,19 @@ async def test_helperbot_message():
) # Check helperbot is connected ) # Check helperbot is connected
msg_payload = '{"ret":"ok","ver":"0.13.5"}' msg_payload = '{"ret":"ok","ver":"0.13.5"}'
msg_topic_name = ( msg_topic_name = (
"iot/p2p/GetWKVer/bot_serial/ls1ok3/wC3g/helper1/bumper/helper1/p/iCmuqp/j" "iot/p2p/GetWKVer/bot_serial/ls1ok3/wC3g/helperbot/bumper/helperbot/p/iCmuqp/j"
) )
await mqtt_helperbot.Client.publish( await mqtt_helperbot.Client.publish(
msg_topic_name, msg_payload.encode(), hbmqtt.client.QOS_0 msg_topic_name, msg_payload.encode(), hbmqtt.client.QOS_0
) )
try:
await asyncio.wait_for(mqtt_helperbot.Client.deliver_message(), timeout=0.1) await asyncio.wait_for(mqtt_helperbot.Client.deliver_message(), timeout=0.1)
except asyncio.TimeoutError:
pass
l.check_present( l.check_present(
( (
"helperbot", "helperbot",
"DEBUG", "DEBUG",
'Received Response - Topic: iot/p2p/GetWKVer/bot_serial/ls1ok3/wC3g/helper1/bumper/helper1/p/iCmuqp/j - Message: {"ret":"ok","ver":"0.13.5"}', 'Received Response - Topic: iot/p2p/GetWKVer/bot_serial/ls1ok3/wC3g/helperbot/bumper/helperbot/p/iCmuqp/j - Message: {"ret":"ok","ver":"0.13.5"}',
) )
) # Check received response message was logged ) # Check received response message was logged
l.clear() l.clear()
@ -107,21 +104,20 @@ async def test_helperbot_message():
) # Check helperbot is connected ) # Check helperbot is connected
msg_payload = "test" msg_payload = "test"
msg_topic_name = ( msg_topic_name = (
"iot/p2p/GetWKVer/bot_serial/ls1ok3/wC3g/TESTBAD/bumper/helper1/p/iCmuqp/j" "iot/p2p/GetWKVer/bot_serial/ls1ok3/wC3g/TESTBAD/bumper/helperbot/p/iCmuqp/j"
) )
await mqtt_helperbot.Client.publish( await mqtt_helperbot.Client.publish(
msg_topic_name, msg_payload.encode(), hbmqtt.client.QOS_0 msg_topic_name, msg_payload.encode(), hbmqtt.client.QOS_0
) )
try:
await asyncio.wait_for(mqtt_helperbot.Client.deliver_message(), timeout=0.1) await asyncio.wait_for(mqtt_helperbot.Client.deliver_message(), timeout=0.1)
except asyncio.TimeoutError:
pass
l.check_present( l.check_present(
( (
"helperbot", "helperbot",
"DEBUG", "DEBUG",
"Received Message - Topic: iot/p2p/GetWKVer/bot_serial/ls1ok3/wC3g/TESTBAD/bumper/helper1/p/iCmuqp/j - Message: test", "Received Message - Topic: iot/p2p/GetWKVer/bot_serial/ls1ok3/wC3g/TESTBAD/bumper/helperbot/p/iCmuqp/j - Message: test",
) )
) # Check received message was logged ) # Check received message was logged
l.clear() l.clear()
@ -138,10 +134,8 @@ async def test_helperbot_message():
await mqtt_helperbot.Client.publish( await mqtt_helperbot.Client.publish(
msg_topic_name, msg_payload.encode(), hbmqtt.client.QOS_0 msg_topic_name, msg_payload.encode(), hbmqtt.client.QOS_0
) )
try:
await asyncio.wait_for(mqtt_helperbot.Client.deliver_message(), timeout=0.1) await asyncio.wait_for(mqtt_helperbot.Client.deliver_message(), timeout=0.1)
except asyncio.TimeoutError:
pass
l.check_present( l.check_present(
( (
@ -165,13 +159,14 @@ async def test_helperbot_expire_message():
# Test broadcast message # Test broadcast message
mqtt_helperbot = bumper.MQTTHelperBot(mqtt_address) mqtt_helperbot = bumper.MQTTHelperBot(mqtt_address)
bumper.mqtt_helperbot = mqtt_helperbot
await mqtt_helperbot.start_helper_bot() await mqtt_helperbot.start_helper_bot()
assert ( assert (
mqtt_helperbot.Client._connected_state._value == True mqtt_helperbot.Client._connected_state._value == True
) # Check helperbot is connected ) # Check helperbot is connected
expire_msg_payload = '{"ret":"ok","ver":"0.13.5"}' expire_msg_payload = '{"ret":"ok","ver":"0.13.5"}'
expire_msg_topic_name = "iot/p2p/GetWKVer/bot_serial/ls1ok3/wC3g/helper1/bumper/helper1/p/testgood/j" expire_msg_topic_name = "iot/p2p/GetWKVer/bot_serial/ls1ok3/wC3g/helperbot/bumper/helperbot/p/testgood/j"
currenttime = time.time() currenttime = time.time()
mqtt_helperbot.command_responses.append( mqtt_helperbot.command_responses.append(
{ {
@ -197,10 +192,9 @@ async def test_helperbot_expire_message():
msg_topic_name, msg_payload.encode(), hbmqtt.client.QOS_0 msg_topic_name, msg_payload.encode(), hbmqtt.client.QOS_0
) # Send another message to force get_msg ) # Send another message to force get_msg
try:
await asyncio.wait_for(mqtt_helperbot.Client.deliver_message(), timeout=0.1) await asyncio.wait_for(mqtt_helperbot.Client.deliver_message(), timeout=0.1)
except asyncio.TimeoutError:
pass
assert { assert {
"time": currenttime, "time": currenttime,
@ -229,6 +223,7 @@ async def test_helperbot_sendcommand():
await mqtt_server.broker_coro() await mqtt_server.broker_coro()
mqtt_helperbot = bumper.MQTTHelperBot(mqtt_address) mqtt_helperbot = bumper.MQTTHelperBot(mqtt_address)
bumper.mqtt_helperbot = mqtt_helperbot
await mqtt_helperbot.start_helper_bot() await mqtt_helperbot.start_helper_bot()
assert ( assert (
mqtt_helperbot.Client._connected_state._value == True mqtt_helperbot.Client._connected_state._value == True
@ -268,7 +263,7 @@ async def test_helperbot_sendcommand():
# Send response beforehand # Send response beforehand
msg_payload = '{"ret":"ok","ver":"0.13.5"}' msg_payload = '{"ret":"ok","ver":"0.13.5"}'
msg_topic_name = ( msg_topic_name = (
"iot/p2p/GetWKVer/bot_serial/ls1ok3/wC3g/helper1/bumper/helper1/p/testgood/j" "iot/p2p/GetWKVer/bot_serial/ls1ok3/wC3g/helperbot/bumper/helperbot/p/testgood/j"
) )
await mqtt_helperbot.Client.publish( await mqtt_helperbot.Client.publish(
msg_topic_name, msg_payload.encode(), hbmqtt.client.QOS_0 msg_topic_name, msg_payload.encode(), hbmqtt.client.QOS_0
@ -307,7 +302,7 @@ async def test_helperbot_sendcommand():
# Send response beforehand # Send response beforehand
msg_payload = "<ctl ret='ok' type='Brush' left='4142' total='18000'/>" msg_payload = "<ctl ret='ok' type='Brush' left='4142' total='18000'/>"
msg_topic_name = ( msg_topic_name = (
"iot/p2p/GetLifeSpan/bot_serial/ls1ok3/wC3g/helper1/bumper/helper1/p/testx/q" "iot/p2p/GetLifeSpan/bot_serial/ls1ok3/wC3g/helperbot/bumper/helperbot/p/testx/q"
) )
await mqtt_helperbot.Client.publish( await mqtt_helperbot.Client.publish(
msg_topic_name, msg_payload.encode(), hbmqtt.client.QOS_0 msg_topic_name, msg_payload.encode(), hbmqtt.client.QOS_0
@ -352,7 +347,7 @@ async def test_helperbot_sendcommand():
msg_payload = '{"body":{"code":0,"data":{"area":0,"cid":"111","start":"1569378657","time":6,"type":"auto"},"msg":"ok"},"header":{"fwVer":"1.6.4","hwVer":"0.1.1","pri":1,"ts":"1569380074036","tzm":480,"ver":"0.0.1"}}' msg_payload = '{"body":{"code":0,"data":{"area":0,"cid":"111","start":"1569378657","time":6,"type":"auto"},"msg":"ok"},"header":{"fwVer":"1.6.4","hwVer":"0.1.1","pri":1,"ts":"1569380074036","tzm":480,"ver":"0.0.1"}}'
msg_topic_name = ( msg_topic_name = (
"iot/p2p/getStats/bot_serial/ls1ok3/wC3g/helper1/bumper/helper1/p/testj/j" "iot/p2p/getStats/bot_serial/ls1ok3/wC3g/helperbot/bumper/helperbot/p/testj/j"
) )
await mqtt_helperbot.Client.publish( await mqtt_helperbot.Client.publish(
msg_topic_name, msg_payload.encode(), hbmqtt.client.QOS_0 msg_topic_name, msg_payload.encode(), hbmqtt.client.QOS_0
@ -447,29 +442,23 @@ async def test_mqttserver():
# bad password # bad password
with LogCapture() as l: with LogCapture() as l:
try:
await test_client.Client.connect( await test_client.Client.connect(
f"mqtts://test-client:notvalid!@{test_client.address[0]}:{test_client.address[1]}/", f"mqtts://test-client:notvalid!@{test_client.address[0]}:{test_client.address[1]}/",
cafile=bumper.ca_cert, cleansession=True cafile=bumper.ca_cert, cleansession=True
) )
except Exception as ae:
pass
l.check_present( l.check_present(
("mqttserver", "INFO", "File Authentication Failed - Username: test-client - ClientID: test-file-auth"), ("mqttserver", "INFO", "File Authentication Failed - Username: test-client - ClientID: test-file-auth"),
order_matters=False order_matters=False
) )
# no username in file # no username in file
try: await test_client.Client.connect(
await test_client.Client.connect( f"mqtts://test-client-noexist:notvalid!@{test_client.address[0]}:{test_client.address[1]}/",
f"mqtts://test-client-noexist:notvalid!@{test_client.address[0]}:{test_client.address[1]}/", cafile=bumper.ca_cert, cleansession=True
cafile=bumper.ca_cert, cleansession=True )
)
except Exception as ae:
pass
l.check_present( l.check_present(
("mqttserver", "INFO", 'File Authentication Failed - No Entry for Username: test-client-noexist - ClientID: test-file-auth'), ("mqttserver", "INFO", 'File Authentication Failed - No Entry for Username: test-client-noexist - ClientID: test-file-auth'),
order_matters=False order_matters=False