From c28c1efbb19eb9f8c073802954b0c4bab4bcbffe Mon Sep 17 00:00:00 2001 From: Josh Date: Sun, 29 Nov 2020 02:13:50 +0000 Subject: [PATCH] Add pending actions to agent table and filter --- api/tacticalrmm/agents/serializers.py | 5 ++++ .../management/commands/initial_mesh_setup.py | 23 +++++++++++------- docker/docker-compose.yml | 4 +++- web/src/components/AgentTable.vue | 15 ++++++++++++ web/src/views/Dashboard.vue | 24 +++++++++++++++++++ 5 files changed, 62 insertions(+), 9 deletions(-) diff --git a/api/tacticalrmm/agents/serializers.py b/api/tacticalrmm/agents/serializers.py index 51d5ebbc..1365b454 100644 --- a/api/tacticalrmm/agents/serializers.py +++ b/api/tacticalrmm/agents/serializers.py @@ -36,12 +36,16 @@ class AgentSerializer(serializers.ModelSerializer): class AgentTableSerializer(serializers.ModelSerializer): patches_pending = serializers.ReadOnlyField(source="has_patches_pending") + pending_actions = serializers.SerializerMethodField() status = serializers.ReadOnlyField() checks = serializers.ReadOnlyField() last_seen = serializers.SerializerMethodField() client_name = serializers.ReadOnlyField(source="client.name") site_name = serializers.ReadOnlyField(source="site.name") + def get_pending_actions(self, obj): + return obj.pendingactions.filter(status="pending").count() + def get_last_seen(self, obj): if obj.time_zone is not None: agent_tz = pytz.timezone(obj.time_zone) @@ -62,6 +66,7 @@ class AgentTableSerializer(serializers.ModelSerializer): "description", "needs_reboot", "patches_pending", + "pending_actions", "status", "overdue_text_alert", "overdue_email_alert", diff --git a/api/tacticalrmm/core/management/commands/initial_mesh_setup.py b/api/tacticalrmm/core/management/commands/initial_mesh_setup.py index 323a52d5..7baecfb3 100644 --- a/api/tacticalrmm/core/management/commands/initial_mesh_setup.py +++ b/api/tacticalrmm/core/management/commands/initial_mesh_setup.py @@ -12,12 +12,11 @@ class Command(BaseCommand): async def websocket_call(self, mesh_settings): - token = get_auth_token( - mesh_settings.mesh_username, mesh_settings.mesh_token - ) + token = get_auth_token(mesh_settings.mesh_username, mesh_settings.mesh_token) - if settings.MESH_WS_URL: - uri = f"{settings.MESH_WS_URL}/control.ashx?auth={token}" + if settings.DOCKER_BUILD: + site = mesh_settings.mesh_site.replace("https", "ws") + uri = f"{site}:443/control.ashx?auth={token}" else: site = mesh_settings.mesh_site.replace("https", "wss") uri = f"{site}/control.ashx?auth={token}" @@ -52,11 +51,17 @@ class Command(BaseCommand): try: # Check for Mesh Username - if not mesh_settings.mesh_username or settings.MESH_USERNAME != mesh_settings.mesh_username: + if ( + not mesh_settings.mesh_username + or settings.MESH_USERNAME != mesh_settings.mesh_username + ): mesh_settings.mesh_username = settings.MESH_USERNAME # Check for Mesh Site - if not mesh_settings.mesh_site or settings.MESH_SITE != mesh_settings.mesh_site: + if ( + not mesh_settings.mesh_site + or settings.MESH_SITE != mesh_settings.mesh_site + ): mesh_settings.mesh_site = settings.MESH_SITE # Check for Mesh Token @@ -75,7 +80,9 @@ class Command(BaseCommand): return try: - asyncio.get_event_loop().run_until_complete(self.websocket_call(mesh_settings)) + asyncio.get_event_loop().run_until_complete( + self.websocket_call(mesh_settings) + ) self.stdout.write("Initial Mesh Central setup complete") except websockets.exceptions.ConnectionClosedError: self.stdout.write( diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 85ee32a3..5beb06d5 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -101,7 +101,9 @@ services: MONGODB_USER: ${MONGODB_USER} MONGODB_PASSWORD: ${MONGODB_PASSWORD} networks: - - proxy + proxy: + aliases: + - ${MESH_HOST} - mesh-db volumes: - tactical_data:/opt/tactical diff --git a/web/src/components/AgentTable.vue b/web/src/components/AgentTable.vue index e0555f86..51ff828a 100644 --- a/web/src/components/AgentTable.vue +++ b/web/src/components/AgentTable.vue @@ -46,6 +46,13 @@ +