From 01d13e02647175b517cead28af9a59006eb6c6cf Mon Sep 17 00:00:00 2001 From: Brian Martin Date: Thu, 2 Jan 2020 01:16:43 -0500 Subject: [PATCH 01/11] add jinja2 Add jinja2/aiohttp_jinja2 - Update handle_base and template to show status --- Pipfile | 2 + Pipfile.lock | 56 ++++++++++++++-- bumper/confserver.py | 14 ++-- data/web/templates/home.jinja2 | 113 +++++++++++++++++++++++++++++++++ 4 files changed, 177 insertions(+), 8 deletions(-) create mode 100644 data/web/templates/home.jinja2 diff --git a/Pipfile b/Pipfile index fb910e4..563961f 100644 --- a/Pipfile +++ b/Pipfile @@ -11,6 +11,8 @@ pyyaml = "~=5.2" atomicwrites = "~=1.3" yarl = "~=1.3.0" multidict = "~=4.5.2" +aiohttp-jinja2 = "*" +jinja2 = "*" [dev-packages] black = "*" diff --git a/Pipfile.lock b/Pipfile.lock index adf5518..0383d41 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "315b25b9f7d46a6ea88fb08170ad935b35aa2717743be4eca137e52e595066de" + "sha256": "740f61688ce679591a1b01f41abc1fa979f8fb1552d598e68868bc47712ba937" }, "pipfile-spec": 6, "requires": {}, @@ -32,6 +32,14 @@ "index": "pypi", "version": "==3.6.2" }, + "aiohttp-jinja2": { + "hashes": [ + "sha256:2dfe29cfd278d07cd0a851afb98471bc8ce2a830968443e40d67636f3c035d79", + "sha256:3b4dfe1bfd5542e254a769c18cb58d62f7f92755fec127e38d0da3436900b240" + ], + "index": "pypi", + "version": "==1.2.0" + }, "async-timeout": { "hashes": [ "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f", @@ -82,6 +90,47 @@ ], "version": "==2.8" }, + "jinja2": { + "hashes": [ + "sha256:74320bb91f31270f9551d46522e33af46a80c3d619f4a4bf42b3164d30b5911f", + "sha256:9fe95f19286cfefaa917656583d020be14e7859c6b0252588391e47db34527de" + ], + "index": "pypi", + "version": "==2.10.3" + }, + "markupsafe": { + "hashes": [ + "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", + "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", + "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", + "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", + "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", + "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", + "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", + "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", + "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", + "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", + "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", + "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", + "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", + "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", + "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905", + "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735", + "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d", + "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e", + "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d", + "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c", + "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21", + "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2", + "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5", + "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b", + "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", + "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", + "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", + "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7" + ], + "version": "==1.1.1" + }, "multidict": { "hashes": [ "sha256:024b8129695a952ebd93373e45b5d341dbb87c17ce49637b34000093f243dd4f", @@ -636,10 +685,9 @@ }, "wcwidth": { "hashes": [ - "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e", - "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c" + "sha256:8fd29383f539be45b20bd4df0dc29c20ba48654a41e661925e612311e9f3c603" ], - "version": "==0.1.7" + "version": "==0.1.8" }, "wrapt": { "hashes": [ diff --git a/bumper/confserver.py b/bumper/confserver.py index af95f06..8a406a2 100644 --- a/bumper/confserver.py +++ b/bumper/confserver.py @@ -11,6 +11,8 @@ from bumper.models import * from datetime import datetime, timedelta import asyncio from aiohttp import web +import aiohttp_jinja2 +import jinja2 import uuid import xml.etree.ElementTree as ET @@ -50,7 +52,8 @@ class ConfServer: return int(round(timetoconvert * 1000)) def confserver_app(self): - self.app = web.Application(loop=asyncio.get_event_loop(), middlewares=[self.log_all_requests]) + self.app = web.Application(loop=asyncio.get_event_loop())#, middlewares=[self.log_all_requests]) + aiohttp_jinja2.setup(self.app, loader=jinja2.FileSystemLoader(os.path.join(bumper.data_dir, "web","templates"))) self.app.add_routes( [ @@ -201,6 +204,7 @@ class ConfServer: clients = bumper.db_get().table("clients").all() helperbot = bumper.mqtt_helperbot.Client.session.transitions.state mqttserver = bumper.mqtt_server.broker + xmppserver = bumper.xmpp_server mq_sessions = [] for sess in mqttserver._sessions: tmpsess = [] @@ -224,9 +228,11 @@ class ConfServer: ] }, ], - } - - return web.json_response(all) + "xmpp_server": xmppserver + } + resp = aiohttp_jinja2.render_template('home.jinja2', request, context=all) + #return web.json_response(all) + return resp except Exception as e: confserverlog.exception("{}".format(e)) diff --git a/data/web/templates/home.jinja2 b/data/web/templates/home.jinja2 new file mode 100644 index 0000000..7982f36 --- /dev/null +++ b/data/web/templates/home.jinja2 @@ -0,0 +1,113 @@ + + + + + Bumper + + + + +

Bumper

+ + + +
+
+

Bumper Server Status

+

MQTT Server

+ Status: {% if mqtt_server[0].state == "started" %} {{ mqtt_server[0].state }} {% else %} {{ mqtt_server[0].state }} {% endif %} + Sessions: {{ mqtt_server[1].sessions[0].count }} + + + + + + {% for sess in mqtt_server[1].sessions[1].clients %} + + + + + + {% endfor %} +
usernameclientidstate
{{ sess[0].username }}{{ sess[0].client_id }} {{ sess[0].state }}
+ +

XMPP Server

+ Status: {% if xmpp_server.server._serving == True %} running {% else %} not running {% endif %} + Clients: {{ xmpp_server.clients | length }} + + + + + + {% for client in xmpp_server.clients %} + + + + + + {% endfor %} +
uidjidstate
{{ client.uid }}{{ client.bumper_jid }}{% if client.state == 4 %} connected {% else %} not connected {% endif %}
+ + +

Helperbot

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

Bots

+ + + + + {% for bot in bots %} + + + + + + + + + + + + {% endfor %} +
SNNicknameClassDIDResourceCompanyMQTT ConnectedXMPP Connected
{{ bot.name }}{{ bot.nick }}{{ bot.class }}{{ bot.did }}{{ bot.resource }} {{ bot.company}} {{ bot.mqtt_connection }} {{ bot.xmpp_connection }}
+
+
+ +
+ + +
+
+

Clients

+ + + + + {% for client in clients %} + + + + + + + + {% endfor %} +
User IDRealmResourceMQTT ConnectedXMPP Connected
{{ client.userid }}{{ client.realm }}{{ client.resource }} {{ client.mqtt_connection }} {{ client.xmpp_connection }}
+
+
+ + + \ No newline at end of file -- 2.39.5 From d08d3b2d3c42b4ba4e77c50de27f0b0475b20e24 Mon Sep 17 00:00:00 2001 From: Brian Martin Date: Thu, 2 Jan 2020 08:46:11 -0500 Subject: [PATCH 02/11] fix build and add style - fix build with requirements.txt - card styling --- data/web/templates/home.jinja2 | 169 +++++++++++++++++---------------- requirements.txt | 5 +- 2 files changed, 93 insertions(+), 81 deletions(-) diff --git a/data/web/templates/home.jinja2 b/data/web/templates/home.jinja2 index 7982f36..0686d48 100644 --- a/data/web/templates/home.jinja2 +++ b/data/web/templates/home.jinja2 @@ -11,103 +11,112 @@ {% endfor %} +

Bumper

- -
-
-

Bumper Server Status

-

MQTT Server

- Status: {% if mqtt_server[0].state == "started" %} {{ mqtt_server[0].state }} {% else %} {{ mqtt_server[0].state }} {% endif %} - Sessions: {{ mqtt_server[1].sessions[0].count }} - - - - - - {% for sess in mqtt_server[1].sessions[1].clients %} - - - - - - {% endfor %} -
usernameclientidstate
{{ sess[0].username }}{{ sess[0].client_id }} {{ sess[0].state }}
+
+
+

Bumper Server Status

+
+
+ +

MQTT Server

+ Status: {% if mqtt_server[0].state == "started" %} {{ mqtt_server[0].state }} {% else %} {{ mqtt_server[0].state }} {% endif %} + Sessions: {{ mqtt_server[1].sessions[0].count }} + + + + + + {% for sess in mqtt_server[1].sessions[1].clients %} + + + + + + {% endfor %} +
usernameclientidstate
{{ sess[0].username }}{{ sess[0].client_id }} {{ sess[0].state }}
-

XMPP Server

- Status: {% if xmpp_server.server._serving == True %} running {% else %} not running {% endif %} - Clients: {{ xmpp_server.clients | length }} - - - - - - {% for client in xmpp_server.clients %} - - - - - - {% endfor %} -
uidjidstate
{{ client.uid }}{{ client.bumper_jid }}{% if client.state == 4 %} connected {% else %} not connected {% endif %}
+

XMPP Server

+ Status: {% if xmpp_server.server._serving == True %} running {% else %} not running {% endif %} + Clients: {{ xmpp_server.clients | length }} + + + + + + {% for client in xmpp_server.clients %} + + + + + + {% endfor %} +
uidjidstate
{{ client.uid }}{{ client.bumper_jid }}{% if client.state == 4 %} connected {% else %} not connected {% endif %}
- -

Helperbot

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

Helperbot

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

-
-
-

Bots

- - - - - {% for bot in bots %} - - - - - - - - - - - - {% endfor %} -
SNNicknameClassDIDResourceCompanyMQTT ConnectedXMPP Connected
{{ bot.name }}{{ bot.nick }}{{ bot.class }}{{ bot.did }}{{ bot.resource }} {{ bot.company}} {{ bot.mqtt_connection }} {{ bot.xmpp_connection }}
-
+
+
+

Bots

+
+
+ + + + + {% for bot in bots %} + + + + + + + + + + + + {% endfor %} +
SNNicknameClassDIDResourceCompanyMQTT ConnectedXMPP Connected
{{ bot.name }}{{ bot.nick }}{{ bot.class }}{{ bot.did }}{{ bot.resource }} {{ bot.company}} {{ bot.mqtt_connection }} {{ bot.xmpp_connection }}
+

-
-
-

Clients

- - - - - {% for client in clients %} - - - - - - - - {% endfor %} -
User IDRealmResourceMQTT ConnectedXMPP Connected
{{ client.userid }}{{ client.realm }}{{ client.resource }} {{ client.mqtt_connection }} {{ client.xmpp_connection }}
-
+
+
+

Clients

+
+
+ + + + + {% for client in clients %} + + + + + + + + {% endfor %} +
User IDRealmResourceMQTT ConnectedXMPP Connected
{{ client.userid }}{{ client.realm }}{{ client.resource }} {{ client.mqtt_connection }} {{ client.xmpp_connection }}
+
+
\ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 29019d1..46c5ac6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ aiohttp==3.6.2 +aiohttp-jinja2==1.2.0 async-timeout==3.0.1 atomicwrites==1.3.0 attrs==19.3.0 @@ -6,9 +7,11 @@ chardet==3.0.4 docopt==0.6.2 hbmqtt==0.9.5 idna==2.8 +Jinja2==2.10.3 +MarkupSafe==1.1.1 multidict==4.5.2 passlib==1.7.2 -PyYAML==5.2 +PyYAML==5.3b1 six==1.13.0 tinydb==3.15.2 transitions==0.7.1 -- 2.39.5 From 2d5e4e17a0642c60528a42caad20d443cb8fb298 Mon Sep 17 00:00:00 2001 From: Brian Martin Date: Thu, 2 Jan 2020 09:21:15 -0500 Subject: [PATCH 03/11] Update test_confserver.py -fix tests, missing xmpp server for base --- tests/test_confserver.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/test_confserver.py b/tests/test_confserver.py index 6e35542..774d807 100644 --- a/tests/test_confserver.py +++ b/tests/test_confserver.py @@ -65,6 +65,12 @@ async def test_base(aiohttp_client): mqtt_server = bumper.MQTTServer(mqtt_address) bumper.mqtt_server = mqtt_server await mqtt_server.broker_coro() + + # Start XMPP + xmpp_address = ("127.0.0.1", 5223) + xmpp_server = bumper.XMPPServer(xmpp_address) + bumper.xmpp_server = xmpp_server + await xmpp_server.start_async_server() # Start Helperbot mqtt_helperbot = bumper.MQTTHelperBot(mqtt_address) @@ -79,6 +85,9 @@ async def test_base(aiohttp_client): await mqtt_server.broker.shutdown() + bumper.xmpp_server.disconnect() + + async def test_restartService(aiohttp_client): remove_existing_db() bumper.db = "tests/tmp.db" # Set db location for testing -- 2.39.5 From c77f464c9d6f67001904f71b4bedd4cd95e44e80 Mon Sep 17 00:00:00 2001 From: Brian Martin Date: Thu, 2 Jan 2020 23:56:30 -0500 Subject: [PATCH 04/11] 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
+
-- 2.39.5 From 80c412afd18b03d2d24ef1c473c7bd888e38da77 Mon Sep 17 00:00:00 2001 From: Brian Martin Date: Fri, 3 Jan 2020 00:19:27 -0500 Subject: [PATCH 05/11] fix restart test --- bumper/confserver.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/bumper/confserver.py b/bumper/confserver.py index f68774d..25e9e6d 100644 --- a/bumper/confserver.py +++ b/bumper/confserver.py @@ -341,17 +341,18 @@ class ConfServer: if sessobj.session.transitions.state == "connected": await sessobj.writer.close() + #await bumper.mqtt_server.broker.shutdown() 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()) + 1.5, lambda: asyncio.create_task(bumper.mqtt_server.broker_coro()) ) # In 1.5 seconds start broker - async def restart_XMPP(self): bumper.xmpp_server.disconnect() await bumper.xmpp_server.start_async_server() @@ -363,11 +364,12 @@ class ConfServer: await self.restart_Helper() return web.json_response({"status": "complete"}) elif service == "MQTTServer": - await self.restart_MQTT() + asyncio.create_task(self.restart_MQTT()) aloop = asyncio.get_event_loop() aloop.call_later( 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() -- 2.39.5 From 63e0620f0c104e2d02005d95e055b1fb55669f83 Mon Sep 17 00:00:00 2001 From: Brian Martin Date: Fri, 3 Jan 2020 01:33:31 -0500 Subject: [PATCH 06/11] add remove bot and client --- bumper/confserver.py | 30 ++++++++++++++++++++- bumper/db.py | 8 +++++- data/web/templates/home.jinja2 | 48 ++++++++++++++++++---------------- tests/test_confserver.py | 10 +++++++ tests/test_db.py | 5 +++- 5 files changed, 76 insertions(+), 25 deletions(-) diff --git a/bumper/confserver.py b/bumper/confserver.py index 25e9e6d..c9e5339 100644 --- a/bumper/confserver.py +++ b/bumper/confserver.py @@ -58,7 +58,9 @@ class ConfServer: self.app.add_routes( [ - web.get("", self.handle_base), + web.get("", self.handle_base), + web.get("/bot/remove/{did}", self.handle_RemoveBot, name='remove-bot'), + web.get("/client/remove/{resource}", self.handle_RemoveClient, name='remove-client'), web.get("/restart_{service}", self.handle_RestartService, name='restart-service'), web.get( "/{apiversion}/private/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/login", @@ -381,6 +383,32 @@ class ConfServer: confserverlog.exception("{}".format(e)) pass + async def handle_RemoveBot(self, request): + try: + did = request.match_info.get("did", "") + bumper.bot_remove(did) + if bumper.bot_get(did): + return web.json_response({"status": "failed to remove bot"}) + else: + return web.json_response({"status": "successfully removed bot"}) + + except Exception as e: + confserverlog.exception("{}".format(e)) + pass + + async def handle_RemoveClient(self, request): + try: + resource = request.match_info.get("resource", "") + bumper.client_remove(resource) + if bumper.client_get(resource): + return web.json_response({"status": "failed to remove client"}) + else: + return web.json_response({"status": "successfully removed client"}) + + except Exception as e: + confserverlog.exception("{}".format(e)) + pass + async def handle_login(self, request): try: user_devid = request.match_info.get("devid", "") diff --git a/bumper/db.py b/bumper/db.py index 52f6ba1..71c158a 100644 --- a/bumper/db.py +++ b/bumper/db.py @@ -286,7 +286,8 @@ def bot_add(sn, did, devclass, resource, company): def bot_remove(did): bots = db_get().table("bots") bot = bot_get(did) - bots.remove(doc_ids=[bot.doc_id]) + if bot: + bots.remove(doc_ids=[bot.doc_id]) def bot_get(did): @@ -344,6 +345,11 @@ def client_add(userid, realm, resource): bumperlog.info("Adding new client with resource {}".format(newclient.resource)) client_full_upsert(newclient.asdict()) +def client_remove(resource): + clients = db_get().table("clients") + client = client_get(resource) + if client: + clients.remove(doc_ids=[client.doc_id]) def client_get(resource): clients = db_get().table("clients") diff --git a/data/web/templates/home.jinja2 b/data/web/templates/home.jinja2 index 238463b..5e74303 100644 --- a/data/web/templates/home.jinja2 +++ b/data/web/templates/home.jinja2 @@ -5,41 +5,43 @@ Bumper
User IDRealmResourceMQTT ConnectedXMPP Connected