From c77f464c9d6f67001904f71b4bedd4cd95e44e80 Mon Sep 17 00:00:00 2001 From: Brian Martin Date: Thu, 2 Jan 2020 23:56:30 -0500 Subject: [PATCH] add restart services restart services from status page --- bumper/confserver.py | 33 +++++++----- bumper/mqttserver.py | 21 +++++--- data/web/templates/home.jinja2 | 94 +++++++++++++++++++++++++++++----- 3 files changed, 117 insertions(+), 31 deletions(-) diff --git a/bumper/confserver.py b/bumper/confserver.py index 8a406a2..f68774d 100644 --- a/bumper/confserver.py +++ b/bumper/confserver.py @@ -198,8 +198,7 @@ class ConfServer: async def handle_base(self, request): try: - # TODO - API Options here for viewing clients, tokens, restarting the server, etc. - # text = "Bumper!" + bots = bumper.db_get().table("bots").all() clients = bumper.db_get().table("clients").all() helperbot = bumper.mqtt_helperbot.Client.session.transitions.state @@ -331,18 +330,27 @@ class ConfServer: async def restart_Helper(self): await bumper.mqtt_helperbot.Client.disconnect() - await bumper.mqtt_helperbot.start_helper_bot() + asyncio.create_task(bumper.mqtt_helperbot.start_helper_bot()) async def restart_MQTT(self): - mqttserver = bumper.mqtt_server.broker + + if not (bumper.mqtt_server.broker.transitions.state == "stopped" or bumper.mqtt_server.broker.transitions.state == "not_started"): + # close session writers - this was required so bots would reconnect properly after restarting + for sess in list(bumper.mqtt_server.broker._sessions): + sessobj = bumper.mqtt_server.broker._sessions[sess][1] + if sessobj.session.transitions.state == "connected": + await sessobj.writer.close() - await bumper.mqtt_server.broker.shutdown() - while not bumper.mqtt_server.broker.transitions.state == "stopped": - await asyncio.sleep(0.1) + aloop = asyncio.get_event_loop() + aloop.call_later( + 0.1, lambda: asyncio.create_task(bumper.mqtt_server.broker.shutdown()) + ) # In .1 seconds shutdown broker + + aloop = asyncio.get_event_loop() + aloop.call_later( + 1.5, lambda: asyncio.create_task(bumper.mqtt_server.broker_coro()) + ) # In 1.5 seconds start broker - await bumper.mqtt_server.broker_coro() - while not bumper.mqtt_server.broker.transitions.state == "started": - await asyncio.sleep(0.1) async def restart_XMPP(self): bumper.xmpp_server.disconnect() @@ -358,8 +366,8 @@ class ConfServer: await self.restart_MQTT() aloop = asyncio.get_event_loop() aloop.call_later( - 2, lambda: asyncio.create_task(self.restart_Helper()) - ) # In 2 seconds restart Helperbot + 5, lambda: asyncio.create_task(self.restart_Helper()) + ) # In 5 seconds restart Helperbot return web.json_response({"status": "complete"}) elif service == "XMPPServer": await self.restart_XMPP() @@ -369,6 +377,7 @@ class ConfServer: except Exception as e: confserverlog.exception("{}".format(e)) + pass async def handle_login(self, request): try: diff --git a/bumper/mqttserver.py b/bumper/mqttserver.py index f28a3f5..dbc05d5 100644 --- a/bumper/mqttserver.py +++ b/bumper/mqttserver.py @@ -35,7 +35,7 @@ class MQTTHelperBot: try: if self.Client is None: self.Client = MQTTClient( - client_id=self.client_id, config={"check_hostname": False} + client_id=self.client_id, config={"check_hostname": False, "reconnect_retries": 20} ) await self.Client.connect( @@ -207,27 +207,27 @@ class MQTTHelperBot: class MQTTServer: - default_config = {} + default_config = None broker = None async def broker_coro(self): mqttserverlog.info( "Starting MQTT Server at {}:{}".format(self.address[0], self.address[1]) - ) - self.broker = hbmqtt.broker.Broker(config=self.default_config) + ) try: await self.broker.start() except hbmqtt.broker.BrokerException as e: mqttserverlog.exception(e) - asyncio.create_task(bumper.shutdown()) + #asyncio.create_task(bumper.shutdown()) pass except Exception as e: mqttserverlog.exception("{}".format(e)) - asyncio.create_task(bumper.shutdown()) + #asyncio.create_task(bumper.shutdown()) + pass def __init__(self, address): try: @@ -252,7 +252,7 @@ class MQTTServer: "keyfile": bumper.server_key, }, }, - "sys_interval": 10, + "sys_interval": 0, "auth": { "allow-anonymous": False, # Set to True to allow anonymous authentication "password-file": os.path.join( @@ -263,6 +263,8 @@ class MQTTServer: "topic-check": {"enabled": False}, } + self.broker = hbmqtt.broker.Broker(config=self.default_config) + except Exception as e: mqttserverlog.exception("{}".format(e)) @@ -401,6 +403,11 @@ class BumperMQTTServer_Plugin: bumper.client_set_mqtt(client["resource"], True) return + #async def on_broker_message_received(self, client_id, message): + #print(message) + # Look at replacing helperbot with code here + + async def on_broker_client_disconnected(self, client_id): didsplit = str(client_id).split("@") diff --git a/data/web/templates/home.jinja2 b/data/web/templates/home.jinja2 index 0686d48..238463b 100644 --- a/data/web/templates/home.jinja2 +++ b/data/web/templates/home.jinja2 @@ -3,6 +3,48 @@ Bumper + + -
+

Bumper

-

Bumper Server Status

+

Server Status

-

MQTT Server

+
+
+

MQTT Server

+
Action:
+
+
Status: {% if mqtt_server[0].state == "started" %} {{ mqtt_server[0].state }} {% else %} {{ mqtt_server[0].state }} {% endif %} Sessions: {{ mqtt_server[1].sessions[0].count }} - +
@@ -37,12 +84,22 @@ {% endfor %}
usernameclientidstate
+ +
+
-

XMPP Server

+
+ +
+
+

XMPP Server

+
Action:
+
+
Status: {% if xmpp_server.server._serving == True %} running {% else %} not running {% endif %} Clients: {{ xmpp_server.clients | length }} - +
@@ -55,23 +112,36 @@ {% endfor %}
uidjidstate
+
+
+ +
+ +
+
+

Helperbot

+
Action:
+ +
-

Helperbot

+
Status: {% if helperbot[0].state == "connected" %} {{ helperbot[0].state }} {% else %} {{ helperbot[0].state }} {% endif %}
- +
+ +

-
+

Bots

- +
@@ -95,12 +165,12 @@
-
+

Clients

-
SNNicknameClassDIDResourceCompanyMQTT ConnectedXMPP Connected
+
User IDRealmResourceMQTT ConnectedXMPP Connected