diff --git a/.devcontainer/.env.example b/.devcontainer/.env.example index 89aec6406f..b92a9e98fc 100644 --- a/.devcontainer/.env.example +++ b/.devcontainer/.env.example @@ -25,7 +25,6 @@ POSTGRES_PASS=postgrespass # DEV SETTINGS APP_PORT=80 API_PORT=80 -API_PROTOCOL=https:// HTTP_PROTOCOL=https DOCKER_NETWORK=172.21.0.0/24 DOCKER_NGINX_IP=172.21.0.20 diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 611f9b17c3..8d7f5f6e5c 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -209,7 +209,6 @@ services: CERT_PRIV_KEY: ${CERT_PRIV_KEY} APP_PORT: ${APP_PORT} API_PORT: ${API_PORT} - API_PROTOCOL: ${API_PROTOCOL} DEV: 1 networks: dev: diff --git a/api/tacticalrmm/agents/serializers.py b/api/tacticalrmm/agents/serializers.py index 6735af5fa0..73740b2c5e 100644 --- a/api/tacticalrmm/agents/serializers.py +++ b/api/tacticalrmm/agents/serializers.py @@ -148,6 +148,7 @@ class Meta: fields = [ "id", "hostname", + "block_policy_inheritance", "client", "site", "monitoring_type", diff --git a/api/tacticalrmm/agents/tasks.py b/api/tacticalrmm/agents/tasks.py index 05589d2595..cd90e60399 100644 --- a/api/tacticalrmm/agents/tasks.py +++ b/api/tacticalrmm/agents/tasks.py @@ -1,12 +1,11 @@ import asyncio import datetime as dt import random -import urllib.parse from time import sleep from typing import Union from alerts.models import Alert -from core.models import CodeSignToken, CoreSettings +from core.models import CoreSettings from django.conf import settings from django.utils import timezone as djangotime from logs.models import DebugLog, PendingAction @@ -16,10 +15,10 @@ from tacticalrmm.utils import run_nats_api_cmd from agents.models import Agent +from agents.utils import get_winagent_url -def agent_update(pk: int, codesigntoken: str = None, force: bool = False) -> str: - from agents.utils import get_exegen_url +def agent_update(pk: int, force: bool = False) -> str: agent = Agent.objects.get(pk=pk) @@ -37,13 +36,7 @@ def agent_update(pk: int, codesigntoken: str = None, force: bool = False) -> str version = settings.LATEST_AGENT_VER inno = agent.win_inno_exe - - if codesigntoken is not None and pyver.parse(version) >= pyver.parse("1.5.0"): - base_url = get_exegen_url() + "/api/v1/winagents/?" - params = {"version": version, "arch": agent.arch, "token": codesigntoken} - url = base_url + urllib.parse.urlencode(params) - else: - url = agent.winagent_dl + url = get_winagent_url(agent.arch) if not force: if agent.pendingactions.filter( @@ -77,30 +70,20 @@ def agent_update(pk: int, codesigntoken: str = None, force: bool = False) -> str @app.task def force_code_sign(pks: list[int]) -> None: - try: - token = CodeSignToken.objects.first().token # type:ignore - except: - return - chunks = (pks[i : i + 50] for i in range(0, len(pks), 50)) for chunk in chunks: for pk in chunk: - agent_update(pk=pk, codesigntoken=token, force=True) + agent_update(pk=pk, force=True) sleep(0.05) sleep(4) @app.task def send_agent_update_task(pks: list[int]) -> None: - try: - codesigntoken = CodeSignToken.objects.first().token # type:ignore - except: - codesigntoken = None - chunks = (pks[i : i + 30] for i in range(0, len(pks), 30)) for chunk in chunks: for pk in chunk: - agent_update(pk, codesigntoken) + agent_update(pk) sleep(0.05) sleep(4) @@ -111,11 +94,6 @@ def auto_self_agent_update_task() -> None: if not core.agent_auto_update: # type:ignore return - try: - codesigntoken = CodeSignToken.objects.first().token # type:ignore - except: - codesigntoken = None - q = Agent.objects.only("pk", "version") pks: list[int] = [ i.pk @@ -126,7 +104,7 @@ def auto_self_agent_update_task() -> None: chunks = (pks[i : i + 30] for i in range(0, len(pks), 30)) for chunk in chunks: for pk in chunk: - agent_update(pk, codesigntoken) + agent_update(pk) sleep(0.05) sleep(4) diff --git a/api/tacticalrmm/agents/tests.py b/api/tacticalrmm/agents/tests.py index 8553650a23..3a1b74805a 100644 --- a/api/tacticalrmm/agents/tests.py +++ b/api/tacticalrmm/agents/tests.py @@ -1049,9 +1049,11 @@ def setUp(self): self.authenticate() self.setup_coresettings() - @patch("agents.utils.get_exegen_url") + @patch("agents.utils.get_winagent_url") @patch("agents.models.Agent.nats_cmd") - def test_agent_update(self, nats_cmd, get_exe): + def test_agent_update(self, nats_cmd, get_url): + get_url.return_value = "https://exe.tacticalrmm.io" + from agents.tasks import agent_update agent_noarch = baker.make_recipe( @@ -1077,7 +1079,7 @@ def test_agent_update(self, nats_cmd, get_exe): version="1.4.14", ) - r = agent_update(agent64_nosign.pk, None) + r = agent_update(agent64_nosign.pk) self.assertEqual(r, "created") action = PendingAction.objects.get(agent__pk=agent64_nosign.pk) self.assertEqual(action.action_type, "agentupdate") @@ -1103,7 +1105,7 @@ def test_agent_update(self, nats_cmd, get_exe): ) # test __with__ code signing (64 bit) - codesign = baker.make("core.CodeSignToken", token="testtoken123") + """ codesign = baker.make("core.CodeSignToken", token="testtoken123") agent64_sign = baker.make_recipe( "agents.agent", operating_system="Windows 10 Pro, 64 bit (build 19041.450)", @@ -1153,7 +1155,7 @@ def test_agent_update(self, nats_cmd, get_exe): ) action = PendingAction.objects.get(agent__pk=agent32_sign.pk) self.assertEqual(action.action_type, "agentupdate") - self.assertEqual(action.status, "pending") + self.assertEqual(action.status, "pending") """ @patch("agents.tasks.agent_update") @patch("agents.tasks.sleep", return_value=None) diff --git a/api/tacticalrmm/agents/utils.py b/api/tacticalrmm/agents/utils.py index 1c7f3583db..9d745e94ba 100644 --- a/api/tacticalrmm/agents/utils.py +++ b/api/tacticalrmm/agents/utils.py @@ -1,8 +1,9 @@ import random import urllib.parse - import requests + from django.conf import settings +from core.models import CodeSignToken def get_exegen_url() -> str: @@ -20,18 +21,20 @@ def get_exegen_url() -> str: def get_winagent_url(arch: str) -> str: - from core.models import CodeSignToken + + dl_url = settings.DL_32 if arch == "32" else settings.DL_64 try: - codetoken = CodeSignToken.objects.first().token - base_url = get_exegen_url() + "/api/v1/winagents/?" - params = { - "version": settings.LATEST_AGENT_VER, - "arch": arch, - "token": codetoken, - } - dl_url = base_url + urllib.parse.urlencode(params) + t: CodeSignToken = CodeSignToken.objects.first() # type: ignore + if t.is_valid: + base_url = get_exegen_url() + "/api/v1/winagents/?" + params = { + "version": settings.LATEST_AGENT_VER, + "arch": arch, + "token": t.token, + } + dl_url = base_url + urllib.parse.urlencode(params) except: - dl_url = settings.DL_64 if arch == "64" else settings.DL_32 + pass return dl_url diff --git a/api/tacticalrmm/checks/models.py b/api/tacticalrmm/checks/models.py index b347d8bb22..24d3f5ee5e 100644 --- a/api/tacticalrmm/checks/models.py +++ b/api/tacticalrmm/checks/models.py @@ -457,7 +457,7 @@ def handle_check(self, data): elif self.status == "passing": self.fail_count = 0 - self.save(update_fields=["status", "fail_count", "alert_severity"]) + self.save() if Alert.objects.filter(assigned_check=self, resolved=False).exists(): Alert.handle_alert_resolve(self) diff --git a/api/tacticalrmm/checks/views.py b/api/tacticalrmm/checks/views.py index 7d8c3d61ca..da9c0ecf9f 100644 --- a/api/tacticalrmm/checks/views.py +++ b/api/tacticalrmm/checks/views.py @@ -137,11 +137,11 @@ def delete(self, request, pk): # Re-evaluate agent checks is policy was enforced if check.policy.enforced: - generate_agent_checks_task.delay(policy=check.policy) + generate_agent_checks_task.delay(policy=check.policy.pk) # Agent check deleted elif check.agent: - check.agent.generate_checks_from_policies() + generate_agent_checks_task.delay(agents=[check.agent.pk]) return Response(f"{check.readable_desc} was deleted!") diff --git a/api/tacticalrmm/core/models.py b/api/tacticalrmm/core/models.py index 983ccb4be8..1c8bd7fa36 100644 --- a/api/tacticalrmm/core/models.py +++ b/api/tacticalrmm/core/models.py @@ -1,6 +1,6 @@ +import requests import smtplib from email.message import EmailMessage -from django.db.models.enums import Choices import pytz from django.conf import settings @@ -8,6 +8,7 @@ from django.core.exceptions import ValidationError from django.db import models from twilio.rest import Client as TwClient +from twilio.base.exceptions import TwilioRestException from logs.models import BaseAuditModel, DebugLog, LOG_LEVEL_CHOICES @@ -195,22 +196,29 @@ def send_mail(self, subject, body, alert_template=None, test=False): else: return True - def send_sms(self, body, alert_template=None): - if not alert_template or not self.sms_is_configured: - return + def send_sms(self, body, alert_template=None, test=False): + if not alert_template and not self.sms_is_configured: + return "Sms alerting is not setup correctly." # override email recipients if alert_template is passed and is set if alert_template and alert_template.text_recipients: - text_recipients = alert_template.email_recipients + text_recipients = alert_template.text_recipients else: text_recipients = self.sms_alert_recipients + if not text_recipients: + return "No sms recipients found" + tw_client = TwClient(self.twilio_account_sid, self.twilio_auth_token) for num in text_recipients: try: tw_client.messages.create(body=body, to=num, from_=self.twilio_number) - except Exception as e: + except TwilioRestException as e: DebugLog.error(message=f"SMS failed to send: {e}") + if test: + return str(e) + + return True @staticmethod def serialize(core): @@ -306,6 +314,31 @@ def save(self, *args, **kwargs): super(CodeSignToken, self).save(*args, **kwargs) + @property + def is_valid(self) -> bool: + if not self.token: + return False + + errors = [] + for url in settings.EXE_GEN_URLS: + try: + r = requests.post( + f"{url}/api/v1/checktoken", + json={"token": self.token}, + headers={"Content-type": "application/json"}, + timeout=15, + ) + except Exception as e: + errors.append(str(e)) + else: + errors = [] + break + + if errors: + return False + + return r.status_code == 200 + def __str__(self): return "Code signing token" diff --git a/api/tacticalrmm/core/views.py b/api/tacticalrmm/core/views.py index 26bc3147f6..d2b0ed9341 100644 --- a/api/tacticalrmm/core/views.py +++ b/api/tacticalrmm/core/views.py @@ -1,9 +1,7 @@ import os -import pprint import re from django.conf import settings -from django.db.models.fields import IPAddressField from django.shortcuts import get_object_or_404 from logs.models import AuditLog from rest_framework import status @@ -14,7 +12,6 @@ from rest_framework.response import Response from rest_framework.views import APIView -from agents.permissions import MeshPerms from tacticalrmm.utils import notify_error from .models import CodeSignToken, CoreSettings, CustomField, GlobalKVStore, URLAction @@ -34,7 +31,7 @@ class UploadMeshAgent(APIView): - permission_classes = [IsAuthenticated, MeshPerms] + permission_classes = [IsAuthenticated, EditCoreSettingsPerms] parser_class = (FileUploadParser,) def put(self, request, format=None): @@ -50,7 +47,9 @@ def put(self, request, format=None): for chunk in f.chunks(): j.write(chunk) - return Response(status=status.HTTP_201_CREATED) + return Response( + "Mesh Agent uploaded successfully", status=status.HTTP_201_CREATED + ) @api_view() @@ -383,7 +382,6 @@ def patch(self, request): class TwilioSMSTest(APIView): def get(self, request): - from twilio.rest import Client as TwClient core = CoreSettings.objects.first() if not core.sms_is_configured: @@ -391,14 +389,9 @@ def get(self, request): "All fields are required, including at least 1 recipient" ) - try: - tw_client = TwClient(core.twilio_account_sid, core.twilio_auth_token) - tw_client.messages.create( - body="TacticalRMM Test SMS", - to=core.sms_alert_recipients[0], - from_=core.twilio_number, - ) - except Exception as e: - return notify_error(pprint.pformat(e)) + r = core.send_sms("TacticalRMM Test SMS", test=True) + + if not isinstance(r, bool) and isinstance(r, str): + return notify_error(r) - return Response("SMS Test OK!") + return Response("SMS Test sent successfully!") diff --git a/api/tacticalrmm/logs/models.py b/api/tacticalrmm/logs/models.py index 5a16bb4f97..244b2bed61 100644 --- a/api/tacticalrmm/logs/models.py +++ b/api/tacticalrmm/logs/models.py @@ -106,6 +106,7 @@ def audit_raw_command(username, agent, cmd, shell, debug_info={}): AuditLog.objects.create( username=username, agent=agent.hostname, + agent_id=agent.id, object_type="agent", action="execute_command", message=f"{username} issued {shell} command on {agent.hostname}.", @@ -120,6 +121,7 @@ def audit_object_changed( AuditLog.objects.create( username=username, object_type=object_type, + agent=before["hostname"] if object_type == "agent" else None, agent_id=before["id"] if object_type == "agent" else None, action="modify", message=f"{username} modified {object_type} {name}", @@ -133,7 +135,8 @@ def audit_object_add(username, object_type, after, name="", debug_info={}): AuditLog.objects.create( username=username, object_type=object_type, - agent=after["id"] if object_type == "agent" else None, + agent=after["hostname"] if object_type == "agent" else None, + agent_id=after["id"] if object_type == "agent" else None, action="add", message=f"{username} added {object_type} {name}", after_value=after, @@ -145,7 +148,7 @@ def audit_object_delete(username, object_type, before, name="", debug_info={}): AuditLog.objects.create( username=username, object_type=object_type, - agent=before["id"] if object_type == "agent" else None, + agent=before["hostname"] if object_type == "agent" else None, action="delete", message=f"{username} deleted {object_type} {name}", before_value=before, diff --git a/api/tacticalrmm/requirements.txt b/api/tacticalrmm/requirements.txt index 8a7c9ee322..8cf8de2267 100644 --- a/api/tacticalrmm/requirements.txt +++ b/api/tacticalrmm/requirements.txt @@ -4,13 +4,13 @@ celery==5.1.2 certifi==2021.5.30 cffi==1.14.6 channels==3.0.4 -channels_redis==3.3.0 +channels_redis==3.3.1 chardet==4.0.0 cryptography==3.4.8 daphne==3.0.2 -Django==3.2.7 -django-cors-headers==3.8.0 -django-ipware==3.0.2 +Django==3.2.8 +django-cors-headers==3.10.0 +django-ipware==4.0.0 django-rest-knox==4.1.0 djangorestframework==3.12.4 future==0.18.2 @@ -19,19 +19,19 @@ msgpack==1.0.2 packaging==21.0 psycopg2-binary==2.9.1 pycparser==2.20 -pycryptodome==3.10.1 +pycryptodome==3.10.4 pyotp==2.6.0 pyparsing==2.4.7 -pytz==2021.1 +pytz==2021.3 qrcode==6.1 redis==3.5.3 requests==2.26.0 six==1.16.0 -sqlparse==0.4.1 -twilio==6.63.1 -urllib3==1.26.6 -uWSGI==2.0.19.1 +sqlparse==0.4.2 +twilio==7.1.0 +urllib3==1.26.7 +uWSGI==2.0.20 validators==0.18.2 vine==5.0.0 websockets==9.1 -zipp==3.5.0 +zipp==3.6.0 diff --git a/api/tacticalrmm/scripts/community_scripts.json b/api/tacticalrmm/scripts/community_scripts.json index dafecde9f0..2e193e493c 100644 --- a/api/tacticalrmm/scripts/community_scripts.json +++ b/api/tacticalrmm/scripts/community_scripts.json @@ -30,18 +30,27 @@ "default_timeout": "300" }, { - "guid": "2ee134d5-76aa-4160-b334-a1efbc62079f", - "filename": "Win_Install_Duplicati.ps1", - "submittedBy": "https://github.com/Omnicef", - "name": "Duplicati - Install", - "description": "This script installs Duplicati 2.0.5.1 as a service.", - "shell": "powershell", + "guid": "7b1d90a1-3eda-48ab-9c49-20e714c9e82a", + "filename": "Win_Duplicati_Install.bat", + "submittedBy": "https://github.com/dinger1986", + "name": "Duplicati - Install 2.0.6.100 to work with Community Check Status", + "description": "This script installs Duplicati 2.0.6.100 as a service and creates status files to be used with commuity check", + "shell": "cmd", "category": "TRMM (Win):3rd Party Software", "default_timeout": "300" }, + { + "guid": "7c14beb4-d1c3-41aa-8e70-92a267d6e080", + "filename": "Win_Duplicati_Status.ps1", + "submittedBy": "https://github.com/dinger1986", + "name": "Duplicati - Check Status", + "description": "Checks Duplicati Backup is running properly over the last 24 hours", + "shell": "powershell", + "category": "TRMM (Win):3rd Party Software>Monitoring" + }, { "guid": "81cc5bcb-01bf-4b0c-89b9-0ac0f3fe0c04", - "filename": "Win_Reset_Windows_Update.ps1", + "filename": "Win_Windows_Update_Reset.ps1", "submittedBy": "https://github.com/Omnicef", "name": "Windows Update - Reset", "description": "This script will reset all of the Windows Updates components to DEFAULT SETTINGS.", @@ -91,17 +100,23 @@ "guid": "9d34f482-1f0c-4b2f-b65f-a9cf3c13ef5f", "filename": "Win_TRMM_Rename_Installed_App.ps1", "submittedBy": "https://github.com/bradhawkins85", - "name": "TacticalRMM Agent Rename", + "name": "TacticalRMM - Agent Rename", "description": "Updates the DisplayName registry entry for the Tactical RMM windows agent to your desired name. This script takes 1 required argument: the name you wish to set.", + "args": [ + "" + ], "shell": "powershell", "category": "TRMM (Win):TacticalRMM Related" }, { "guid": "525ae965-1dcf-4c17-92b3-5da3cf6819f5", - "filename": "Win_Bitlocker_Encrypted_Drive_c.ps1", - "submittedBy": "https://github.com/ThatsNASt", - "name": "Bitlocker - Check C Drive for Status", - "description": "Runs a check on drive C for Bitlocker status.", + "filename": "Win_Bitlocker_Drive_Check_Status.ps1", + "submittedBy": "https://github.com/silversword411", + "name": "Bitlocker - Check Drive for Status", + "description": "Runs a check on drive for Bitlocker status. Returns 0 if Bitlocker is not enabled, 1 if Bitlocker is enabled", + "args": [ + "[Drive ]" + ], "shell": "powershell", "category": "TRMM (Win):Storage" }, @@ -235,15 +250,6 @@ "shell": "powershell", "category": "TRMM (Win):Hardware" }, - { - "guid": "7c14beb4-d1c3-41aa-8e70-92a267d6e080", - "filename": "Win_Duplicati_Status.ps1", - "submittedBy": "https://github.com/dinger1986", - "name": "Duplicati - Check Status", - "description": "Checks Duplicati Backup is running properly over the last 24 hours", - "shell": "powershell", - "category": "TRMM (Win):3rd Party Software" - }, { "guid": "907652a5-9ec1-4759-9871-a7743f805ff2", "filename": "Win_Software_Uninstall.ps1", @@ -317,7 +323,7 @@ }, { "guid": "a821975c-60df-4d58-8990-6cf8a55b4ee0", - "filename": "Win_Sync_Time.bat", + "filename": "Win_Time_Sync.bat", "submittedBy": "https://github.com/dinger1986", "name": "ADDC - Sync DC Time", "description": "Syncs time with domain controller", @@ -425,6 +431,11 @@ "submittedBy": "https://github.com/silversword411", "name": "Chocolatey - Install, Uninstall and Upgrade Software", "description": "This script installs, uninstalls and updates software using Chocolatey with logic to slow tasks to minimize hitting community limits. Mode install/uninstall/upgrade Hosts x", + "args": [ + "-$PackageName ", + "[-Hosts ]", + "[-mode {(install) | update | uninstall}]" + ], "shell": "powershell", "category": "TRMM (Win):3rd Party Software>Chocolatey", "default_timeout": "600" @@ -478,17 +489,23 @@ "guid": "08ca81f2-f044-4dfc-ad47-090b19b19d76", "filename": "Win_User_Logged_in_with_Temp_Profile.ps1", "submittedBy": "https://github.com/dinger1986", - "name": "User Logged in with temp profile check", + "name": "User Check - See if user logged in with temp profile", "description": "Check if users are logged in with a temp profile", "shell": "powershell", "category": "TRMM (Win):Other" }, { "guid": "5d905886-9eb1-4129-8b81-a013f842eb24", - "filename": "Win_Rename_Computer.ps1", + "filename": "Win_Computer_Rename.ps1", "submittedBy": "https://github.com/silversword411", "name": "Rename Computer", "description": "Rename computer. First parameter will be new PC name. 2nd parameter if yes will auto-reboot machine", + "args": [ + "-NewName ", + "[-Username ]", + "[-Password ]", + "[-Restart]" + ], "shell": "powershell", "category": "TRMM (Win):Other", "default_timeout": 30 @@ -499,6 +516,9 @@ "submittedBy": "https://github.com/tremor021", "name": "Power - Restart or Shutdown PC", "description": "Restart PC. Add parameter: shutdown if you want to shutdown computer", + "args": [ + "[shutdown]" + ], "shell": "powershell", "category": "TRMM (Win):Updates" }, @@ -523,7 +543,7 @@ "-url {{client.ScreenConnectInstaller}}", "-clientname {{client.name}}", "-sitename {{site.name}}", - "-action install" + "-action {(install) | uninstall | start | stop}" ], "default_timeout": "90", "shell": "powershell", @@ -573,7 +593,7 @@ "guid": "7c0c7e37-60ff-462f-9c34-b5cd4c4796a7", "filename": "Win_Wifi_SSID_and_Password_Retrieval.ps1", "submittedBy": "https://github.com/silversword411", - "name": "Network Wireless - Retrieve Saved passwords", + "name": "Network Wireless - Retrieve Saved WiFi passwords", "description": "Returns all saved wifi passwords stored on the computer", "shell": "powershell", "category": "TRMM (Win):Network", @@ -624,7 +644,7 @@ "filename": "Win_Network_TCP_Reset_Stack.bat", "submittedBy": "https://github.com/silversword411", "name": "Network - Reset tcp using netsh", - "description": "resets tcp stack using netsh", + "description": "Resets TCP stack using netsh", "shell": "cmd", "category": "TRMM (Win):Network", "default_timeout": "120" @@ -633,7 +653,7 @@ "guid": "6ce5682a-49db-4c0b-9417-609cf905ac43", "filename": "Win_Win10_Change_Key_and_Activate.ps1", "submittedBy": "https://github.com/silversword411", - "name": "Product Key in Win10 Change and Activate", + "name": "Product Key in Win10 - Change and Activate", "description": "Insert new product key and Activate. Requires 1 parameter the product key you want to use", "shell": "powershell", "category": "TRMM (Win):Other", @@ -653,7 +673,7 @@ "guid": "83f6c6ea-6120-4fd3-bec8-d3abc505dcdf", "filename": "Win_TRMM_Start_Menu_Delete_Shortcut.ps1", "submittedBy": "https://github.com/silversword411", - "name": "TacticalRMM Delete Start Menu Shortcut for App", + "name": "TacticalRMM - Delete Start Menu Shortcut for App", "description": "Delete its application shortcut that's installed in the start menu by default", "shell": "powershell", "category": "TRMM (Win):TacticalRMM Related", @@ -735,19 +755,26 @@ "guid": "6a52f495-d43e-40f4-91a9-bbe4f578e6d1", "filename": "Win_User_Create.ps1", "submittedBy": "https://github.com/brodur", - "name": "Create Local User", + "name": "User - Create Local", "description": "Create a local user. Parameters are: username, password and optional: description, fullname, group (adds to Users if not specified)", + "args": [ + "-username ", + "-password ", + "[-description ]", + "[-fullname ]", + "[-group ]" + ], "shell": "powershell", - "category": "TRMM (Win):Other" + "category": "TRMM (Win):User Management" }, { "guid": "57997ec7-b293-4fd5-9f90-a25426d0eb90", "filename": "Win_Users_List.ps1", "submittedBy": "https://github.com/tremor021", - "name": "Get Computer Users", + "name": "Users - List Local Users and Enabled/Disabled Status", "description": "Get list of computer users and show which one is enabled", "shell": "powershell", - "category": "TRMM (Win):Other" + "category": "TRMM (Win):User Management" }, { "guid": "77da9c87-5a7a-4ba1-bdde-3eeb3b01d62d", diff --git a/api/tacticalrmm/tacticalrmm/settings.py b/api/tacticalrmm/tacticalrmm/settings.py index 68f8ccfe67..caf8ccbb47 100644 --- a/api/tacticalrmm/tacticalrmm/settings.py +++ b/api/tacticalrmm/tacticalrmm/settings.py @@ -15,11 +15,11 @@ AUTH_USER_MODEL = "accounts.User" # latest release -TRMM_VERSION = "0.8.4" +TRMM_VERSION = "0.8.5" # bump this version everytime vue code is changed # to alert user they need to manually refresh their browser -APP_VER = "0.0.146" +APP_VER = "0.0.147" # https://github.com/wh1te909/rmmagent LATEST_AGENT_VER = "1.6.2" @@ -29,10 +29,10 @@ NATS_SERVER_VER = "2.3.3" # for the update script, bump when need to recreate venv or npm install -PIP_VER = "21" -NPM_VER = "22" +PIP_VER = "22" +NPM_VER = "23" -SETUPTOOLS_VER = "57.5.0" +SETUPTOOLS_VER = "58.2.0" WHEEL_VER = "0.37.0" DL_64 = f"https://github.com/wh1te909/rmmagent/releases/download/v{LATEST_AGENT_VER}/winagent-v{LATEST_AGENT_VER}.exe" diff --git a/api/tacticalrmm/tacticalrmm/utils.py b/api/tacticalrmm/tacticalrmm/utils.py index 1fde8b5f96..75339a2012 100644 --- a/api/tacticalrmm/tacticalrmm/utils.py +++ b/api/tacticalrmm/tacticalrmm/utils.py @@ -4,7 +4,6 @@ import subprocess import tempfile import time -import urllib.parse from typing import Optional, Union import pytz @@ -50,7 +49,7 @@ def generate_winagent_exe( file_name: str, ) -> Union[Response, FileResponse]: - from agents.utils import get_exegen_url + from agents.utils import get_winagent_url inno = ( f"winagent-v{settings.LATEST_AGENT_VER}.exe" @@ -58,18 +57,12 @@ def generate_winagent_exe( else f"winagent-v{settings.LATEST_AGENT_VER}-x86.exe" ) + dl_url = get_winagent_url(arch) + try: codetoken = CodeSignToken.objects.first().token # type:ignore - base_url = get_exegen_url() + "/api/v1/winagents/?" - params = { - "version": settings.LATEST_AGENT_VER, - "arch": arch, - "token": codetoken, - } - dl_url = base_url + urllib.parse.urlencode(params) except: codetoken = "" - dl_url = settings.DL_64 if arch == "64" else settings.DL_32 data = { "client": client, diff --git a/docker/containers/tactical-nginx/entrypoint.sh b/docker/containers/tactical-nginx/entrypoint.sh index 0992182c71..00e6b8f0cb 100644 --- a/docker/containers/tactical-nginx/entrypoint.sh +++ b/docker/containers/tactical-nginx/entrypoint.sh @@ -30,7 +30,7 @@ fi /bin/bash -c "sed -i 's/worker_connections.*/worker_connections ${WORKER_CONNECTIONS};/g' /etc/nginx/nginx.conf" -if [ $DEV -eq 1 ]; then +if [[ $DEV -eq 1 ]]; then API_NGINX=" #Using variable to disable start checks set \$api http://tactical-backend:${API_PORT}; diff --git a/docs/docs/3rdparty_bitdefender_gravityzone.md b/docs/docs/3rdparty_bitdefender_gravityzone.md index 518aa6a14b..450eb4270d 100644 --- a/docs/docs/3rdparty_bitdefender_gravityzone.md +++ b/docs/docs/3rdparty_bitdefender_gravityzone.md @@ -31,4 +31,4 @@ Paste download link into the `bdurl` when you right click your target clients na Right click the Agent you want to deploy to and **Run Script**. Select **BitDefender GravityZone Install** and set timeout for 1800 seconds. -**Install time will vary based on internet speed and other AV removal by BitDefender BEST deployment** \ No newline at end of file +**Install time will vary based on internet speed and other AV removal by BitDefender BEST deployment** diff --git a/docs/docs/3rdparty_grafana.md b/docs/docs/3rdparty_grafana.md index 798e9400b3..8799043a89 100644 --- a/docs/docs/3rdparty_grafana.md +++ b/docs/docs/3rdparty_grafana.md @@ -6,4 +6,4 @@ See ![Example1](images/3rdparty_grafana_ex1.png) -![Example1](images/3rdparty_grafana_ex2.png) \ No newline at end of file +![Example1](images/3rdparty_grafana_ex2.png) diff --git a/docs/docs/backup.md b/docs/docs/backup.md index 5d38783c4c..6587faf525 100644 --- a/docs/docs/backup.md +++ b/docs/docs/backup.md @@ -1,8 +1,12 @@ # Backing up the RMM +!!!note + This is only applicable for the standard install, not Docker installs. + A backup script is provided for quick and easy way to backup all settings into one file to move to another server. Download the backup script: + ```bash wget -N https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/backup.sh ``` @@ -23,4 +27,3 @@ chmod +x backup.sh The backup tar file will be saved in `/rmmbackups` with the following format: `rmm-backup-CURRENTDATETIME.tar` - diff --git a/docs/docs/code_signing.md b/docs/docs/code_signing.md index bd4a9c719d..a2b72b5f4e 100644 --- a/docs/docs/code_signing.md +++ b/docs/docs/code_signing.md @@ -12,11 +12,10 @@ Please allow up to 24 hours for a response You will then be sent a code signing auth token, which you should enter into Tactical's web UI from *Settings > Code Signing* - ## How does it work? Everytime you generate an agent or an agent does a self-update, your self-hosted instance sends a request to Tactical's code signing servers with your auth token. If the token is valid, the server sends you back a code signed agent. If not, it sends you back the un-signed agent. -If you think your auth token has been compromised or stolen then please email support or contact wh1te909 on discord to get a new token / invalidate the old one. \ No newline at end of file +If you think your auth token has been compromised or stolen then please email support or contact wh1te909 on discord to get a new token / invalidate the old one. diff --git a/docs/docs/contributing.md b/docs/docs/contributing.md index ad12166610..d633c1c5a8 100644 --- a/docs/docs/contributing.md +++ b/docs/docs/contributing.md @@ -1,6 +1,6 @@ # Contributing -### Contributing to the docs +## Contributing to the docs Docs are built with [MKDocs for Material](https://squidfunk.github.io/mkdocs-material/) diff --git a/docs/docs/contributing_community_scripts.md b/docs/docs/contributing_community_scripts.md index ea976622b1..b570d3e619 100644 --- a/docs/docs/contributing_community_scripts.md +++ b/docs/docs/contributing_community_scripts.md @@ -1,10 +1,12 @@ +# Community Scripts + ## Script Library Naming Conventions -### File names +### File names Under `/scripts` the file name should generally follow this format: -``` +```text (Platform)_(Category or Function)_(What It Does).xxx ``` @@ -13,7 +15,7 @@ Under `/scripts` the file name should generally follow this format: Platform for now are: -``` +```text Win OSX Linux @@ -21,10 +23,9 @@ iOS Android ``` - Good filename examples include: -``` +```text Win_Azure_Mars_Cloud_Backup_Status.ps1 Win_AzureAD_Check_Connection_Status.ps1 Win_Network_DHCP_Set.bat @@ -44,7 +45,7 @@ Script Manager - Folder View (Grouped by Categories) -Run or Add script +Run or Add script - Running scripts manually or adding tasks (or adding in Automation Manager) @@ -53,7 +54,7 @@ Run or Add script Make sure your Name roughly follows the order of file naming as above -``` +```text Category or Function - What It Does ``` @@ -67,12 +68,13 @@ Category or Function - What It Does ### Good Habits -- Try and make them fully self-contained. +- Try and make them fully self-contained. - If they pull data from elsewhere, create comment notes at the top with references for others to audit/validate - Good folder locations to use for standardized things: -``` + +```text c:\ProgramData\TacticalRMM\ c:\ProgramData\TacticalRMM\scripts c:\ProgramData\TacticalRMM\toolbox @@ -81,9 +83,10 @@ c:\ProgramData\TacticalRMM\temp c:\ProgramData\TacticalRMM\ ``` -- Command Parameters are good. Optional command parameters for extra functions are better. +- Command Parameters are good. Optional command parameters for extra functions are better. - Add standardized Comment headers to scripts (include the first 2, more if appropriate): + ```powershell <# .Synopsis @@ -118,9 +121,12 @@ c:\ProgramData\TacticalRMM\ - Doesn't play well with other community scripts (reused names etc.) - ***** +## Script Parameters + + + ## Useful Reference Script Examples RunAsUser (since Tactical RMM runs as system) @@ -136,14 +142,13 @@ Optional Command Parameters and testing for errors ## Volunteers Needed -If you want to contribute back to the project there are a lot of scripts that need some TLC (Tender Loving Care) please paruse thru them here: [https://github.com/wh1te909/tacticalrmm/tree/develop/scripts_wip](https://github.com/wh1te909/tacticalrmm/tree/develop/scripts_wip) +If you want to contribute back to the project there are a lot of scripts that need some TLC (Tender Loving Care) please paruse thru them in The Script WIP (Work In Progress): [https://github.com/wh1te909/tacticalrmm/tree/develop/scripts_wip](https://github.com/wh1te909/tacticalrmm/tree/develop/scripts_wip) Discuss/ask questions in the Discord group [here](https://discord.com/channels/736478043522072608/744281869499105290) What you can add is: - - Add standardized Comment headers per above - - Parameterize scripts where appropriate - - Add $ExitCode and error conditions as appropriate - - Contact @silversword in Discord if you need help doing Github additions/edits/adding to the community Library and have questions about [Script Library Naming Conventions](#script-library-naming-conventions) - +- Add standardized Comment headers per above +- Parameterize scripts where appropriate +- Add $ExitCode and error conditions as appropriate +- Contact @silversword in Discord if you need help doing Github additions/edits/adding to the community Library and have questions about [Script Library Naming Conventions](#script-library-naming-conventions) diff --git a/docs/docs/contributing_using_a_remote_server.md b/docs/docs/contributing_using_a_remote_server.md new file mode 100644 index 0000000000..b49f20b3a4 --- /dev/null +++ b/docs/docs/contributing_using_a_remote_server.md @@ -0,0 +1,115 @@ +# Contributing Using a Remote Server + +The below instructions are for a non-production server that has Tactical RMM installed and configured with a real domain. You can then use your own GitHub to push changes to and then submit a PR request to the TRMM `develop` branch (). + +!!!warning + Do not attempt development of this kind on your production server. + +## Install Tacticall RMM + +### 1. Traditional install + +This guide assumes you have done a [Traditional Install](install_server.md). + +### 2. Install VSCode and Extensions +Download VSCode [here](https://code.visualstudio.com/download) + +Download the Remote SSH Development Pack [here](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack) + +## Configure the Remote Development Server +### 1. Connect + +The remote development server should already have Tactical RMM installed via the traditional install method. + +After the extension pack is installed in VSCode you will have a new button at the bottom-left of VSCode. You can select it and add your remote SSH host information. + +![RemoteSSH](images/Remote_SSH_connection.png) + +### 2. Configure + +Configuring a remote server for development work is necessary so that as you make changes to the code base it will automatically refresh and you can see the changes. It may be necessary to do a full browser refresh if changing styles. + +Disable RMM and Daphne services + +```bash +sudo systemctl disable --now rmm.service && sudo systemctl disable --now daphne.service +``` + +Open /rmm/web/.env and make it look like the following + +```bash +DEV_URL = "http://api.domain.com:8000" +APP_URL = "http://rmm.domain.com:8080" +``` + +Open /rmm/api/tacticalrmm/tacticalrmm/local_settings.py + +```bash +change DEBUG = True +``` +Remove +```bash +CORS_ORIGIN_WHITELIST list +``` +Add +```bash +CORS_ORIGIN_ALLOW_ALL = True +``` + +Add the following to the ALLOWED HOSTS +```bash +rmm.doamin.com +``` +cd /rmm/api/tacticalrmm/ + +```bash +source ../env/bin/activate +``` + +Install requirements + +```bash +pip install -r requirements-dev.txt -r requirements-test.txt +``` + +Start Django backend + +```bash +python manage.py runserver 0:8000 +``` + +Open a new terminal and compile quasar frontend + +```bash +cd /rmm/web +npm install +npm install -g @quasar/cli +quasar dev +``` + +!!!info If you receive a CORS error when trying to log into your server via localhost or IP, try the following +```bash +rm -rf node_modules .quasar +npm install +quasar dev +``` +You should now have a localhost and IP based URL to view that has a live reload feature. + +## Configure GitHub with VSCode +!!!info Make sure you are submitting Pull Requests to the develop branch. +Follow this guide for a good introduction to GitHub: + +Make sure u are on develop branch +```bash +git checkout develop +``` +git remote -v should look like the following +```bash +origin https://github.com/yourusername/tacticalrmm.git (fetch) +origin https://github.com/yourusername/tacticalrmm.git (push) +upstream https://github.com/wh1te909/tacticalrmm.git (fetch) +upstream https://github.com/wh1te909/tacticalrmm.git (push) +``` +You will commit the change to your GitHub and from within GitHub you can then submit a PR to the develop branch of wh1te909 Tactical RMM. + +More to come... \ No newline at end of file diff --git a/docs/docs/contributing_using_browser.md b/docs/docs/contributing_using_browser.md new file mode 100644 index 0000000000..2ec6fb1702 --- /dev/null +++ b/docs/docs/contributing_using_browser.md @@ -0,0 +1,51 @@ +# Contributing Using Web Browser + +## Getting Started + +### 1. Fork Project in Github + +This is making a duplicate of the code under your Github that you can edit + + + +![ForkIt](images/vscode-forkit.png) + +### 2. Make Edits + +Make some changes + +![Edit](images/contribute_browser_make_changes.png) + +![Edit](images/contribute_browser_make_changes2.png) + +### 3. Request your changes to be pulled into the primary repo (Pull Request) + +![Changes you've made need integration with master repo](images/trmm_contribute-notice.png) + +This is taking your changes and requesting they be integrated into the Tactical RMM develop branch. + +#### 3a. Check the status of your PR + +Look at a summary of the changes you've requested, monitor for them to be accepted, or commented on. + + + +Once they're accepted you can either: +* Delete your fork +* Sync your local fork + +#### 4. Sync your fork + + + +Bring changes from original repo to your fork so you're current with changes made in original Github repo + +![Sync Fork](images/trmm_need_sync_local_fork.png) + +#### 5. Lather, Rinse, Repeat + +Goto Step 2. and contribute some more + +## Notes + +After your changes are accepted, they won't be live in Tactical RMM until there is a new [release](https://github.com/wh1te909/tacticalrmm/releases). #BePatient diff --git a/docs/docs/contributing_using_docker.md b/docs/docs/contributing_using_docker.md index 3fe8234261..0a3f4a5f12 100644 --- a/docs/docs/contributing_using_docker.md +++ b/docs/docs/contributing_using_docker.md @@ -1,13 +1,12 @@ - +# Contributing using Docker ## Install WSL2 -https://docs.microsoft.com/en-us/windows/wsl/install-win10 - + ## Install Docker Desktop -https://www.docker.com/products/docker-desktop + ### Configure Docker @@ -40,19 +39,19 @@ This is better Under .devcontainer duplicate -``` +```text .env.example ``` -as +as -``` +```text .env ``` Customize to your tastes (it doesn't need to be internet configured, just add records in your `hosts` file) eg -``` +```conf 127.0.0.1 rmm.example.com 127.0.0.1 api.example.com 127.0.0.1 mesh.example.com @@ -64,12 +63,12 @@ Right-click `docker-compose.yml` and choose `Compose Up` Wait, it'll take a while as docker downloads all the modules and gets running. -## Develop! +## Develop You're operational! !!!note - Self-signed certs are in your dev environment. Navigate to https://api.example.com and https://rmm.example.com and accept the self signed certs to get rid of errors. + Self-signed certs are in your dev environment. Navigate to and and accept the self signed certs to get rid of errors. ### View mkdocks live edits in browser @@ -82,4 +81,3 @@ Open: [http://rmm.example.com:8005/](http://rmm.example.com:8005/) ### View django administration Open: [http://rmm.example.com:8000/admin/](http://rmm.example.com:8000/admin/) - diff --git a/docs/docs/contributing_using_vscode.md b/docs/docs/contributing_using_vscode.md index f97d999801..e917a7e2d7 100644 --- a/docs/docs/contributing_using_vscode.md +++ b/docs/docs/contributing_using_vscode.md @@ -1,14 +1,16 @@ +# Contributing Using VSCode ## Getting Started ### 1. Install vscode -[https://code.visualstudio.com/download](https://code.visualstudio.com/download) + + ### 2. Fork Project in Github This is making a duplicate of the code under your Github that you can edit -[https://github.com/wh1te909/tacticalrmm](https://github.com/wh1te909/tacticalrmm) + ![ForkIt](images/vscode-forkit.png) @@ -28,37 +30,36 @@ Remote - SSH ### 4. Open Terminal -[https://code.visualstudio.com/docs/editor/integrated-terminal](https://code.visualstudio.com/docs/editor/integrated-terminal) + -``` +```text Ctrl+` ``` ### 5. Configure a remote for your fork (in vscode) -[https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/configuring-a-remote-for-a-fork](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/configuring-a-remote-for-a-fork) + Configure your local fork and tell it where the original code repo is so you can compare and merge updates later when official repo is updated Check repos -``` +```bash git remote -v ``` Add upstream repo -``` +```bash git remote add upstream https://github.com/wh1te909/tacticalrmm ``` Confirm changes -``` +```bash git remote -v ``` - ### 6. Contribute code Make changes to something. @@ -69,7 +70,6 @@ Make changes to something. Open browser and look at your repo (It should reflect your commit) - #### 6a. Request your changes to be pulled into the primary repo (Pull Request) ![Changes you've made need integration with master repo](images/trmm_contribute-notice.png) @@ -78,7 +78,7 @@ In browser create pull request ### 7. Sync your local fork -[https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/syncing-a-fork](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/syncing-a-fork) + Bring changes from original repo to your local vscode copy so you're current with changes made in original Github repo @@ -86,15 +86,16 @@ Bring changes from original repo to your local vscode copy so you're current wit In VSCode open TERMINAL -``` +```text Ctrl+` ``` Tell git to pull from the GitHub upstream repo all new changes into your local directory -``` +```bash git pull --rebase upstream develop ``` + #### 7a. Push your local updated copy to your Github fork Then you're `push`ing that updated local repo to your online Github fork @@ -106,6 +107,7 @@ Then you're `push`ing that updated local repo to your online Github fork Check your Github fork in browser, should be up to date now with original. Repeat 6 or 7 as necessary ***** + ## Reference ### Customizing the Admin Web Interface @@ -114,6 +116,4 @@ Created using quasar, it's all your .vue files in `web/src/components/modals/age Learn stuff here -https://quasar.dev/ - - + diff --git a/docs/docs/faq.md b/docs/docs/faq.md index 1a25cdda0e..0be23c4386 100644 --- a/docs/docs/faq.md +++ b/docs/docs/faq.md @@ -1,35 +1,54 @@ # FAQ +## Is it possible to use XXX with Tactical RMM + +While it _may be possible_ to use XXX, we have not configured it and therefore it is [Unsupported](../unsupported_guidelines). We cannot help you configure XXX as it pertains to **your environment**. + +## Is it possible to use XXX proxy server with Tactical RMM + +If you wish to stray from the [easy install](../install_server/#option-1-easy-install) of a standard install in a VPS, you need to have the knowledge on how to troubleshoot your own custom environment. + +The most common reasons you're running a proxy is: + +1. Because you only have a single public IP and you already have something on Port 443. **Workaround**: Get another public IP from your ISP +2. Because you want to monitor traffic for security reasons: You're a [Networking Wizard](../unsupported_guidelines). + +There are some [implementations](../unsupported_scripts) that others have done, but be aware it is [Unsupported](../unsupported_guidelines) and if you're requesting help in Discord please let us know in advance. + +## How do I do X feature in the web UI? -#### How do I do X feature in the web UI? Alot of features in the web UI are hidden behind right-click menus; almost everything has a right click menu so if you don't see something, try right clicking on it. -#### Where are the Linux / Mac agents? + +## Where are the Linux / Mac agents? + Linux / Mac agents are currently under development. -#### Can I run Tactical RMM locally behind NAT without exposing anything to the internet? +## Can I run Tactical RMM locally behind NAT without exposing anything to the internet? + Yes, you will just need to setup local DNS for the 3 subdomains, either by editing host files on all your agents or through a local DNS server. -#### I am locked out of the web UI. How do I reset my password? + +## I am locked out of the web UI. How do I reset my password? SSH into your server and run: + ```bash /rmm/api/env/bin/python /rmm/api/tacticalrmm/manage.py reset_password ``` -
+## How do I reset password or 2 factor token? -#### How do I reset password or 2 factor token? -From the web UI, click **Settings > User Administration** and then right-click on a user:

+From the web UI, click **Settings > User Administration** and then right-click on a user: ![reset2fa](images/reset2fa.png) -

-Or from the command line:
+ +Or from the command line: + ```bash /rmm/api/env/bin/python /rmm/api/tacticalrmm/manage.py reset_2fa ``` -Then simply log out of the web UI and next time the user logs in they will be redirected to the 2FA setup page which will present a barcode to be scanned with the Authenticator app. -
+Then simply log out of the web UI and next time the user logs in they will be redirected to the 2FA setup page which will present a barcode to be scanned with the Authenticator app. -#### How do I recover my MeshCentral login credentials? +## How do I recover my MeshCentral login credentials? From Tactical's web UI: *Settings > Global Settings > MeshCentral* @@ -42,21 +61,21 @@ node node_modules/meshcentral --resetaccount --pass sudo systemctl start meshcentral ``` -#### Help! I've been hacked there are weird agents appearing in my Tactical RMM +## Help! I've been hacked there are weird agents appearing in my Tactical RMM -No, you haven't. +No, you haven't. -1. Your installer was scanned by an antivirus. +1. Your installer was scanned by an antivirus. -2. It didn't recognize the exe. +2. It didn't recognize the exe. -3. You have the option enabled to submit unknown applications for analysis. +3. You have the option enabled to submit unknown applications for analysis. ![AV Option1](images/faq_av_option1.png) -4. They ran it against their virtualization testing cluster. +4. They ran it against their virtualization testing cluster. -5. You allow anyone to connect to your rmm server (you should look into techniques to hide your server from the internet). +5. You allow anyone to connect to your rmm server (you should look into techniques to hide your server from the internet). 6. Here are some examples of what that looks like. @@ -66,4 +85,4 @@ No, you haven't. ![AV Sandbox1](images/faq_av_sandbox3.png) -![AV Sandbox1](images/faq_av_sandbox4.png) \ No newline at end of file +![AV Sandbox1](images/faq_av_sandbox4.png) diff --git a/docs/docs/functions/automation_policies.md b/docs/docs/functions/automation_policies.md index 8e1e9fbb9d..1fe9af19c5 100644 --- a/docs/docs/functions/automation_policies.md +++ b/docs/docs/functions/automation_policies.md @@ -7,7 +7,8 @@ Automation policies in Tactical RMM allow for mass deployment of Checks, Automat - Site - Agent -## Adding Automation Policies +You can also see a list of Relations that show what policy is applied to what Clients | Sites | Agents +## Creating Automation Policies In the dashboard, navigate to **Settings > Automation Manager**. Use the **Add** button to create a blank Automation Policy. The options available are: @@ -18,5 +19,18 @@ In the dashboard, navigate to **Settings > Automation Manager**. Use the **Add** ## Policy Inheritance +They get applied in this order: +1. Global Settings +2. Client +3. Site +4. Agent + +and at each level you can Block policy inheritance from the level above using checkboxes in the appropriate screens. +## Adding Windows Patch Management Policy + +Under the Automation Manager you can create a Patch Policy and control what patches are applied, when, and if the computer is rebooted after. + +!!!note + Most "regular" Windows patches are listed in the "Other" category. diff --git a/docs/docs/functions/examples.md b/docs/docs/functions/examples.md index 28d760c753..f45b5295eb 100644 --- a/docs/docs/functions/examples.md +++ b/docs/docs/functions/examples.md @@ -27,5 +27,13 @@ https://www.dell.com/support/home/en-us/product-support/servicetag/{{agent.Seria Lenovo Support Page ``` -https://www.dell.com/support/home/en-us/product-support/servicetag/{{agent.SerialNumber}}/overview -``` \ No newline at end of file +https://pcsupport.lenovo.com/us/en/products/{{agent.SerialNumber}} +``` + +HP Support Page + +It gives an errors because the product model doesn't match the serial number. If you figure out a better link please let us know! :) + +``` +https://support.hp.com/us-en/product/hp-pro-3500-microtower-pc/5270849/model/5270850?serialnumber={{agent.SerialNumber}} +``` diff --git a/docs/docs/functions/scripting.md b/docs/docs/functions/scripting.md index 358dcd8238..808b3f1b5b 100644 --- a/docs/docs/functions/scripting.md +++ b/docs/docs/functions/scripting.md @@ -45,9 +45,24 @@ In the **Agent Table**, you can right-click on an agent and select **Run Script* There is also an option on the agent context menu called **Run Favorited Script**. This will essentially Fire and Forget the script with default args and timeout. +### Script Arguments + +The `Script Arguments` field should be pre-filled with information for any script that can accept or requires parameters. + +

<Required Parameter Name> <string>
[-<Optional Parameter Name> <string>]
[-<string> {(<default string if not specified>) | <string2> | <string3>}]

+ +Where `[]` indicates an optional parameter + +and `{}` indicates a parameter with several preconfigured parameter + +and `()` indicates a default parameter if none is specified + ### Bulk Run on agents -Tactical RMM offers a way to run a script on multiple agents at once. Browse to **Tools > Bulk Script** and select the target for the script to run. +There is also an option on the agent context menu called **Run Favorited Script**. ### Automated Tasks @@ -134,4 +149,4 @@ When editing a script, you can add template tags to the script body that contain !!!info Everything between {{}} is CaSe sEnSiTive -The template tags will only be visible when Editing the script. When downloading or viewing the script code the template tags will be replaced with the script snippet code. \ No newline at end of file +The template tags will only be visible when Editing the script. When downloading or viewing the script code the template tags will be replaced with the script snippet code. diff --git a/docs/docs/howitallworks.md b/docs/docs/howitallworks.md index 10acf0a0f7..48125b83eb 100644 --- a/docs/docs/howitallworks.md +++ b/docs/docs/howitallworks.md @@ -1,14 +1,10 @@ # How It All Works -INSERT WIREFRAME GRAPHICS HERE USING SOMETHING LIKE +![Network Design](images/TacticalRMM-Network.png) -1) how nats-django-admin web interface work +1. Agent installer steps -2) Agent installer steps - -3) Agent communication process with server (what ports to which services etc) - -4) Agent checks/tasks and how they work on the workstation/interact with server +2. Agent checks/tasks and how they work on the workstation/interact with server ## Server @@ -140,6 +136,16 @@ Files create `c:\Windows\temp\Tacticalxxxx\` folder for install (and log files) *** +### Agent Recovery + +#### Mesh Agent Recovery + +Tactical Agent just runs `mesh_agent.exe -something` to get the mesh agent id and saves it to the django database. + +#### Tactical RPC Recovery + +#### Tactical Agent Recovery + ### Windows Update Management Tactical RMM Agent sets: diff --git "a/docs/docs/images/2021-07-10_123702 - Code_\342\227\217_community_scripts.json_-_tacticalrmm_-_Visual_St.png" "b/docs/docs/images/2021-07-10_123702 - Code_\342\227\217_community_scripts.json_-_tacticalrmm_-_Visual_St.png" deleted file mode 100644 index 10160f3851..0000000000 Binary files "a/docs/docs/images/2021-07-10_123702 - Code_\342\227\217_community_scripts.json_-_tacticalrmm_-_Visual_St.png" and /dev/null differ diff --git a/docs/docs/images/Remote_SSH_connection.png b/docs/docs/images/Remote_SSH_connection.png new file mode 100644 index 0000000000..55fe5ae3c0 Binary files /dev/null and b/docs/docs/images/Remote_SSH_connection.png differ diff --git a/docs/docs/images/TacticalRMM-Network.drawio b/docs/docs/images/TacticalRMM-Network.drawio new file mode 100644 index 0000000000..0bcd2c213f --- /dev/null +++ b/docs/docs/images/TacticalRMM-Network.drawio @@ -0,0 +1 @@ +7R1rc5u49td4prsz9vAGf2yc5u6d224zTXr38WWHgGyzwYgLuEn2118dIfEQwmAbYjtt2klAEhLSOTo6byb6YvP8r8SN15+wj8KJpvjPE/16ommGaSvkD5S85CWq5jh5ySoJfFZWFtwF/yBWyB5cbQMfpbWGGcZhFsT1Qg9HEfKyWpmbJPip3myJw/qosbtCjYI7zw2bpb8FfrZmpaqilBW/oGC1ZkM7Jqt4cL3HVYK3ERsvwhHKazYu74Y1Tdeuj58qRfqHib5IMM7yq83zAoWwrnzF8uduWmqLV05QlPV54OvTR3MVfv3zxfxzvd18CLzr//415QD45oZbtha/4eQxzdwswFE6gT5vyO87lHxDCbm3QjLY1RKTMcmUshe2gtb/tphXTFMK3/ekgWrEz2UluVqxv7SXh0QsIYPlXfNirTaKRlcawYQUUv20DjJ0F7se1D4R1CRl62wTkjuVvQtDNdWB+yAMFzjECe1L913kLD1SvkpcPyCLWKmzkWshGCLNEvyIKjWW56CHJQyEk+AfMoLLhyPrkwUEpd6HwSoiZRmG98Hk9YIM9oWhFDOCpui5FY5qgR1kxyG8QVnyQpqwB6aq4zCose3Gb5+qqMsxdF1B2wIXXbZfVkXvJeKQC4Y7cjz68z/B9c10+fjL/dfPzubD4sPn+7+mltPAowbwUOS/h71K7rzQTdPAq8Or2CCwUL6brimgaU3mJhyUFrknPVXuchjxfasKkKY7kjzyHGS/Q98zzWS3f7DWcH39zMalNy/8JiJr8ztvBjd/0C5Mfls+Ru/4cw2sublRyE8B/wawyTrhbeKhHStsc7roJiuU7WhozPOGyK/RvCY+VdBFhiy8LEEhIQbf6pRShkBshFscUOLA0dU26tiqqwIS5lNnj1UJmNiTqoldGUJX+eI0uqIoXcz8CCy3zh3LOcIqNYTtQNdyb/TfGidFccs4LxS35vZMm5c/dg1LCX2eOXql+kD0tzUB+0VqPhz2S3kFu4H80SqInttP8+O4BGA5Ao81Ebr0Crwrn9IB/2Bx29gN9uzS9epvc5fjpaYsCGNL/twmuNqJ4ruZO81fOfFqT66zDBjU95RHopxLOlthvAqRGwfpzMMbUuylpMnN0t0EIQCOj3aVj3YljJa/cvqSZmjjZWFl6g3e6PJmRbjKbfp25kNGnQKE6DaYpQxfd0+vpbjcPB/xKu2P855nWSCkVBbiMlbu5ptLpnwT4hX5zejITe9FOoW8gCxf8ZHs6JvPLdUxD5EJdEUuf/imrc/9oeQFU6kfHKbaV2BQndEEBgknlcM0jd2o16mhwqmhMKSndfkjUBnhZOOG9eonNjGoN2BJWGWIsgwl0xSgEq2kz5PVz6ZuDkSo9sjao6ReHRBMi1j3SuXVaGWWuFG6JJ3y7kFNwBo84cSvj159vNQwTBkFgBbJ6uGdZpqUShAAKML1T8XjfpDGofuSPxVEYVAZeBliN6u+0EWfnG1MgUgg86ltULqeoWd3E4eIDqe/Nwy9m3jn2FkvbsVYAWBKAaLKVQkqulB8tuwAIO+Xz0M3YNVQ+A0BQWnUCBvhxyZ5zU2ivPvl/v727qdWNBFFRCK23LFbnGRrvMKRG34oS6/q51bZ5iOGA4QeLX8TgLyw48rdZrh+lpWCYKmsGEsUPFzgU/sKfI7dU+A7VpJTtflw2gqhK0N5XW2FqreesW+QoJNhRHqulRNuEHTl3f3ittixJWf57tf393cFeY0e0rhC6F1gjxK03DFzH3vpLHLJ7AMMnC25msYJzjCZTPNenMRtUaNck44qb+/yJj+dhJwcQBYOJUFHkBNtaBVpb3JyFC+sypTne6pQHJkKheFyP5mqqm+Ro/9+ypczpy5vU9Gyn2ZsH4XMW4L6hCtugE7309uU+2SBo2WwOnCbeB6cXxe4YDfJBh4m/ZDfmetRtUZeRs80ckn6j5b9lxEl2T66XcvS9UtcN5R5oOdCWYoiL3mJM7iDI4VUVdgV7ebnWYw2+yu24BDuUGy1nqgNvdIuo7MtKpHmDSVSYY+r6ZDGOzfn3eY4kArj/gtQuJi4D7wHpWthdK22MKrW1K5p3GJVWxh7LOUaZ4QqCzP06Z7jJScE7gpRZO239a+r4vY964Jcfvn0ifx+X+2rfIjsLw+lTDVeIUCE6UfN1hLGnjz2K6bM1DYB8kA2jbeGW07/FZk4MAFPnkcEnjDZGpX4EWBQ+RA+ufWxnPlSvsGj13+70Yq1FRA0XbsxXMZ8fl27udR1fN5mVFXRtst3b5ruvc/tl9pMtxxDUxVTs3TVdHqit2HPoLntzA0bOjDGwvamLpkjFcUoYcFB1VRf0bpCn5nSJdZ1ptu6Zoqtpnp/E/g+FbhkIKwLYcNDi9XOjQZ4bKsJnRagDg4cTgxPS6MNPuoZ0Wi1sTDj0OhPKF2LZHU/Ei3roYUwQ1PaLifLJ6Z1BfK9HVrXdMKoQ+eSid0e4OLETmvAx5GwoK9F7PTmnq6LFrutTuWeuv8IrIMHIlI3RPtDKkFp8A+jmgCXGFTPdBHMq4l5DX1tM5wyG/hE8E+Dm1sXzEARLdGUJj6BPcrS57o/adjPl/OljfwxscEQiLzRJPKqDD30sWi81qmB76nivghhV6KBB9zOdQatanhuOrs0pfZE38cjuJW76VRqa4x5G84pknNFysw2OH95qN2MN8HLZYpGsWJp5jkwkMr5MZBaU+wZV8hPYu8g/rH+Jg15/8st2OPv6lrYH3L/4Lyw2bIbLpYX1pq88JuR+/eA1pnK/T10s942+VZwl51xExAd0WxBi2+CUOL4YhDMqxzS6kyx7I5jumQJDM2pMAUFH7AjFqIamlEL8kgfUeati/HqQR1CyAfp9hYlAYEBIFr5hmLh4fwE11Z38hNcmDmXIAu1cFvl/jSHu+YYluDlYwldtbjmEPxzXyrNmAC1z0srtShNcpH3OSjPpDfljk9f7+7pmZbRwy9Ykl8rDM50jUMsWxOStYJW4O9CzqfnF5m3AByKuZz6eQlOcj7tTAki6al8qD9NEC3xDMRmIL6JGzL5hOyuCMYka38DCpBFXqsJt1/JIf8viC2exf6yVTUGrcgf2rDC4biTNusbbImP7gMKxxPE+54TbfrhvXlcZaZZZp3JnWrGuUsHnJq9GY1Luzqlhy6mv8blAAOwLkQdS6MIXlW9ohsSHuMNOOvIHRzrL5BLQH3d10+gXDnSAZmrYXqoZCQ8kzzu5nCmiWsSux2VlZ5MU0F1LdtRh2GQTNF1WYwP7eSPxqfXRpNeN7BzdG2OKVAyqTJHt4ig1CRmRZjU4NSM49iupYFdXSHwQCoWi1Z856WUVbklpwzVXujXDzjLgGRchUJFcZ41DrjKzsa59mFRpGJRmifPgv7IjjPLcdQrfdKMemOyNi++DhKmbYGqBMAiyFlaLmdRJcrmeQWZaWYRyp4gfcksdOO2Pb8bL/trR/bAmdFOQKNpcLqCbDjAz54PF8NAOzwoWK3jzFS7El9vNiBjSdiS0XKhGE3pa/fZXQa+VkWm7wd+hi6FH+czJWymNLnNaPCUWSDerBWv3nGLTa+vj+8aeY+TigY9xSFcLTHI24vPX0DmQkmCk/RoHrWmZTuGYd03109N1VdVUrJtU9VQFm0GSmZ0FJP8CuzwATZJzeZ6/aP5YV2ueutS8r0qP9wZ+nPeNKON9M3nMhF2GwXPxfjFWdgSVlC19aUY6Mg4wu2xhOMUBEDO7x8f9LtHbrQjqEdfjwajb9RvIUyDeDEM8TDMOvGw52dIPJoGUIF4HBg3yM3WB0QOitE8Jwm6OShwrWWtdiZkSDkt9nJaHNP3EVMz7Ao65CF4eUAapXWHx6P1TBn09kLQ3DieBVG7m1nvJEvnvRJ9c0Cxaes38L9XdOdpgjDfeRR3c7+cPYyC26d0FUxpqH2CXHJSInpNI+5RBAF2boZSiLT7HNM8tjN6Xmt6iFcr0I2I71KUS2x/1KKpMAz7qTeK9WVXOrx+6oF+rYfuPoYcRdAT23pTwtZlGpO5OTNHkrHtpiKLL2Df7DrV7C7t+XVaUuMcmkCmkbTQ3QAu+3jjlobwiTxtEODKhUzrImFxUaRd7kK9ZzoqgbQULoZu4oYhIkQucUHtH1cUAbW6ioagM1le8Iy42NIzUqDNOt1u8h6E3KkCJ6/L7NaahNyJPkHDETvr5EJrRVS095IVR5F2ayYtlka4lxx8uBDKNVPdQqjVUwg9VuJ05spMqfwIWnAxbfDIyaNs+5xw9LtEUZ6lqBNFef6gM0ln5DTt1q+OOq+Yr+qtoBt3iuh2DDbPC93OIkBI/MqBIeEyZM5xoyXY5dSjVaLKmUYIv8t539LLd4e8IhMHWOjL/aLSkbKhU6R5Ox/7J8YMwyBOUTf36aZx7ntC2VAJb+l4yPNku+nBMUG129ua7fQPxDgVpDl/2/OrFIxQ7LRgHGidqK78ATZKuQW2i/wOBeHhzuOhv8DSn4kUvhAhSjB9AyQEBdFUDLQYmfd05qdnIL53ZsDuy3v2dXh9JWagaRKrn3BKAMaWGKdp8EB9UWgkTKGH9ifUiBOjJHwZ8XhaLjX58eRbD5ZpDaX60EUPiFMzJU7zqBLAI3WG+4Lg43OobDYWYHwTOb4hA4yjPejWUIAxRGZReT24SD/t05mn4kBDMguwYuFYgxiUz1uNu2f+1VZDcDXi7UeC0l7W4cqS1e+m8D7QL12X2d8pjvqvZZGllAY87lzPS1gnmM/XpH0n5sZOyUpJbOcXvBh7GtLrXyuqI9rPM1o6WtrWI7/9YwhpW1/Z2Cs9bdq//dP7tFHrp81FolublyS8QDG+qtkzhfxTc9frKn80tCPkK4pJ1U9ttX8nSypZHPhpAIlys50TOpX0Ivka83fi3ZUSSphOUQQKV79OY3enFT+ewB4pYxmCjFUY6qqBYTJm3h4Ai+Tf9Na66Ot5Y8QR1LJ0MM/9An03XkdoVPfxM6KaRbxXaf6y93XoHoTayjy85aja5dDtHO3Q/Qpu2E1+5jul2p0fgTg1tZ73IdYyX6AhiPVOY+oP5FkmpG8U+ft9RuQuI1TBgykHIXo7Pt0PmmUtJRmLClH06empPOWCtD2z96m3nKX12HIyAXS0Lcddv1qV0Gdlld5/xRvfiZ+fWOtv9fDQ+GGg3ofB6u29uHcArqM7ncgzjK166qj1oQyxj975/GxDeGkRlYczWO9gY8cIxKPyyyB2k8sJxDvv87rLcsNFzpGMNue9OH0Z1B4hffW7EJPLv4gAlwXRKp3FkoyULUv9I9TvLAhBDaercX8HZwZ91SDA+lueXUTgcUYikWGU2YgMmVQ8oo1ox0e9JixzvEQUjHw3IbKk8u+IEOUwbLb5FZKxx1I2n0dL5XmWfLzNfX+bS94Bnz6RUIIir5kljf5ImFcT/k2a2dOAraT/Jm3GFExeOMgAwroyEN5oquAo2Dey6gBJA84KDNu15Nsg49snQnWgxf8B \ No newline at end of file diff --git a/docs/docs/images/TacticalRMM-Network.png b/docs/docs/images/TacticalRMM-Network.png new file mode 100644 index 0000000000..f14acd7013 Binary files /dev/null and b/docs/docs/images/TacticalRMM-Network.png differ diff --git a/docs/docs/images/contribute_browser_make_changes.png b/docs/docs/images/contribute_browser_make_changes.png new file mode 100644 index 0000000000..cee9dac4c1 Binary files /dev/null and b/docs/docs/images/contribute_browser_make_changes.png differ diff --git a/docs/docs/images/contribute_browser_make_changes2.png b/docs/docs/images/contribute_browser_make_changes2.png new file mode 100644 index 0000000000..06dc19fdc5 Binary files /dev/null and b/docs/docs/images/contribute_browser_make_changes2.png differ diff --git a/docs/docs/images/mesh_features.png b/docs/docs/images/mesh_features.png new file mode 100644 index 0000000000..991c58f200 Binary files /dev/null and b/docs/docs/images/mesh_features.png differ diff --git a/docs/docs/images/mesh_userconsent.png b/docs/docs/images/mesh_userconsent.png new file mode 100644 index 0000000000..443be1555a Binary files /dev/null and b/docs/docs/images/mesh_userconsent.png differ diff --git a/docs/docs/images/meshagentdl.png b/docs/docs/images/meshagentdl.png index 85defd464b..8bf10feaff 100644 Binary files a/docs/docs/images/meshagentdl.png and b/docs/docs/images/meshagentdl.png differ diff --git a/docs/docs/images/synology_docker_ports.jpg b/docs/docs/images/synology_docker_ports.jpg new file mode 100644 index 0000000000..5e1ee183d5 Binary files /dev/null and b/docs/docs/images/synology_docker_ports.jpg differ diff --git a/docs/docs/images/synology_docker_reverse.jpg b/docs/docs/images/synology_docker_reverse.jpg new file mode 100644 index 0000000000..addba63715 Binary files /dev/null and b/docs/docs/images/synology_docker_reverse.jpg differ diff --git a/docs/docs/images/synology_docker_reverse_details1.jpg b/docs/docs/images/synology_docker_reverse_details1.jpg new file mode 100644 index 0000000000..ac2c08a3d5 Binary files /dev/null and b/docs/docs/images/synology_docker_reverse_details1.jpg differ diff --git a/docs/docs/images/synology_docker_reverse_details2.jpg b/docs/docs/images/synology_docker_reverse_details2.jpg new file mode 100644 index 0000000000..b0391ba5ed Binary files /dev/null and b/docs/docs/images/synology_docker_reverse_details2.jpg differ diff --git a/docs/docs/install_agent.md b/docs/docs/install_agent.md index 5fc72d2d24..547148c890 100644 --- a/docs/docs/install_agent.md +++ b/docs/docs/install_agent.md @@ -10,74 +10,101 @@ `C:\Windows\Temp\winagent-v*.exe`
`C:\Windows\Temp\trmm\*`
`C:\temp\tacticalrmm*.exe`
- +## Dynamically generated executable +The generated exe is simply a wrapper around the Manual install method, using a single exe/command without the need to pass any command line flags to the installer. +All it does is download the generic installer from the agent's github [release page](https://github.com/wh1te909/rmmagent/releases) and call it using predefined command line args that you choose from the web UI. +It "bakes" the command line args into the executable. -#### Dynamically generated executable +From the UI, click **Agents > Install Agent** + +You can also **right click on a site > Install Agent**. This will automatically fill in the client/site dropdown for you. -The generated exe is simply a wrapper around the Manual install method, using a single exe/command without the need to pass any command line flags to the installer.

-All it does is download the generic installer from the agent's github [release page](https://github.com/wh1te909/rmmagent/releases) and call it using predefined command line args that you choose from the web UI.

-It "bakes" the command line args into the executable.

-From the UI, click **Agents > Install Agent**
-You can also **right click on a site > Install Agent**. This will automatically fill in the client/site dropdown for you.

![siteagentinstall](images/siteagentinstall.png) -#### Powershell +## Powershell + The powershell method is very similar to the generated exe in that it simply downloads the installer from github and calls the exe for you. -#### Manual -The manual installation method requires you to first download the generic installer and call it using command line args.

-This is useful for scripting the installation using Group Policy or some other batch deployment method.
+## Manual +The manual installation method requires you to first download the generic installer and call it using command line args. +This is useful for scripting the installation using Group Policy or some other batch deployment method. !!!tip You can reuse the installer for any of the deployment methods, you don't need to constantly create a new installer for each new agent.
The installer will be valid for however long you specify the token expiry time when generating an agent. -
-#### Using a deployment link +## Using a deployment link -Creating a deployment link is the recommended way to deploy agents.

-The main benefit of this method is that the exectuable is generated only whenever the deployment download link is accessed, whereas with the other methods it's generated right away and the agent's version hardcoded into the exe.

-Using a deployment link will allow you to not worry about installing using an older version of an agent, which will fail to install if you have updated your RMM to a version that is not compatible with an older installer you might have lying around.

+Creating a deployment link is the recommended way to deploy agents. +The main benefit of this method is that the exectuable is generated only whenever the deployment download link is accessed, whereas with the other methods it's generated right away and the agent's version hardcoded into the exe. +Using a deployment link will allow you to not worry about installing using an older version of an agent, which will fail to install if you have updated your RMM to a version that is not compatible with an older installer you might have lying around. -To create a deployment, from the web UI click **Agents > Manage Deployments**.

+To create a deployment, from the web UI click **Agents > Manage Deployments**. ![managedeployments](images/managedeployments.png) - !!!tip - Create a client/site named "Default" and create a deployment for it with a very long expiry to have a generic installer that can be deployed anytime at any client/site.

+ Create a client/site named "Default" and create a deployment for it with a very long expiry to have a generic installer that can be deployed anytime at any client/site. You can then move the agent into the correct client/site from the web UI after it's been installed. Copy/paste the download link from the deployment into your browser. It will take a few seconds to dynamically generate the executable and then your browser will automatically download the exe. - -#### Optional installer args +## Optional installer args The following optional arguments can be passed to any of the installation method executables: -``` +```text -log debug ``` + Will print very verbose logging during agent install. Useful for troubleshooting agent install. -``` +```text -silent ``` + This will not popup any message boxes during install, either any error messages or the "Installation was successfull" message box that pops up at the end of a successfull install. -``` +```text -proxy "http://proxyserver:port" ``` + Use a http proxy -``` +```text -meshdir "C:\Program Files\Your Company Name\Mesh Agent" ``` + Specify the full path to the directory containing `MeshAgent.exe` if using custom agent branding for your MeshCentral instance. -``` +```text -nomesh ``` -Do not install meshcentral agent during tactical agent install. Note: take control, remote terminal and file browser will not work. \ No newline at end of file + +Do not install meshcentral agent during tactical agent install. Note: take control, remote terminal and file browser will not work. + +## Scripting Agent Installation + +If you want to deploy the TRMM agent using AD, intune, mesh, teamviewer, Group Policy GPO etc this is a sample CMD script for deploying Tactical. + +!!!note + You will need to replace `deployment url` with your custom deployment URL + +```bat +if not exist C:\TEMP\TRMM md C:\TEMP\TRMM +powershell Set-ExecutionPolicy -ExecutionPolicy Unrestricted +powershell Add-MpPreference -ExclusionPath C:\TEMP\TRMM +powershell Add-MpPreference -ExclusionPath "C:\Program Files\TacticalAgent\*" +powershell Add-MpPreference -ExclusionPath C:\Windows\Temp\winagent-v*.exe +powershell Add-MpPreference -ExclusionPath "C:\Program Files\Mesh Agent\*" +powershell Add-MpPreference -ExclusionPath C:\Windows\Temp\TRMM\* +cd c:\temp\trmm +powershell Invoke-WebRequest "deployment url" -Outfile tactical.exe +"C:\Program Files\TacticalAgent\unins000.exe" /VERYSILENT /SUPPRESSMSGBOXES /FORCECLOSEAPPLICATIONS +start tactical.exe +powershell Remove-MpPreference -ExclusionPath C:\TEMP\TRMM +``` + +There is also a full powershell version [here](https://wh1te909.github.io/tacticalrmm/3rdparty_screenconnect/#install-tactical-rmm-via-screeconnect-commands-window) diff --git a/docs/docs/install_docker.md b/docs/docs/install_docker.md index 1ddc7ba514..8523cc18e9 100644 --- a/docs/docs/install_docker.md +++ b/docs/docs/install_docker.md @@ -1,30 +1,66 @@ # Docker Setup -- Install docker and docker-compose -- Obtain valid wildcard certificate for your domain. If certificates are not provided, a self-signed certificate will be generated and most agent functions won't work. See below on how to generate a free Let's Encrypt! +## 1. Install Docker -## Generate certificates with certbot -Install Certbot +Install docker -``` +### 2. Create the A records + +We'll be using `example.com` as our domain for this example. + +!!!info + The RMM uses 3 different sites. The Vue frontend e.g. `rmm.example.com` which is where you'll be accesing your RMM from the browser, the REST backend e.g. `api.example.com` and Meshcentral e.g. `mesh.example.com` + +1. Get the public IP of your server with `curl https://icanhazip.tacticalrmm.io` +2. Open the DNS manager of wherever the domain you purchased is hosted. +3. Create 3 A records: `rmm`, `api` and `mesh` and point them to the public IP of your server: + +![arecords](images/arecords.png) + +## 3. Acquire Let's Encrypt Wildcard certs with certbot + +!!!warning + If the Let's Encrypt wildcard certificates are not provided, a self-signed certificate will be generated and most agent functions won't work. + +### A. Install Certbot + +```bash sudo apt-get install certbot ``` -Generate the wildcard certificate. Add the DNS entry for domain validation. Replace `example.com` with your root doamin +### B. Generate the wildcard Let's Encrypt certificates -``` +We're using the [DNS-01 challenge method](https://letsencrypt.org/docs/challenge-types/#dns-01-challenge) +#### a. Deploy the TXT record in your DNS manager + +!!!warning + TXT records can take anywhere from 1 minute to a few hours to propogate depending on your DNS provider.
+ You should verify the TXT record has been deployed first before pressing Enter.
+ A quick way to check is with the following command:
`dig -t txt _acme-challenge.example.com`
+ or test using: Enter: `_acme-challenge.example.com` + +![txtrecord](images/txtrecord.png) + +![dnstxt](images/dnstxt.png) + +#### b. Request Let's Encrypt Wildcard cert + +```bash sudo certbot certonly --manual -d *.example.com --agree-tos --no-bootstrap --manual-public-ip-logging-ok --preferred-challenges dns ``` -## Configure DNS and firewall +!!!note + Replace `example.com` with your root domain + +## 4. Configure DNS and firewall You will need to add DNS entries so that the three subdomains resolve to the IP of the docker host. There is a reverse proxy running that will route the hostnames to the correct container. On the host, you will need to ensure the firewall is open on tcp ports 80, 443 and 4222. -## Setting up the environment +## 5. Setting up the environment Get the docker-compose and .env.example file on the host you which to install on -``` +```bash wget https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/docker/docker-compose.yml wget https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/docker/.env.example mv .env.example .env @@ -32,9 +68,9 @@ mv .env.example .env Change the values in .env to match your environment. -If you are supplying certificates through Let's Encrypt or another source, see the section below about base64 encoding the certificate files. +When supplying certificates through Let's Encrypt, see the section below about base64 encoding the certificate files. -## Base64 encoding certificates to pass as env variables +### A. Base64 encoding certificates to pass as env variables Use the below command to add the the correct values to the .env. @@ -48,25 +84,39 @@ public key private key `/etc/letsencrypt/live/${rootdomain}/privkey.pem` -``` +```bash echo "CERT_PUB_KEY=$(sudo base64 -w 0 /path/to/pub/key)" >> .env echo "CERT_PRIV_KEY=$(sudo base64 -w 0 /path/to/priv/key)" >> .env ``` -## Starting the environment +## 6. Starting the environment Run the below command to start the environment. -``` +```bash sudo docker-compose up -d ``` Removing the -d will start the containers in the foreground and is useful for debugging. -## Get MeshCentral EXE download link +## 7. Get MeshCentral EXE download link Run the below command to get the download link for the mesh central exe. This needs to be uploaded on first successful signin. -``` +```bash sudo docker-compose exec tactical-backend python manage.py get_mesh_exe_url -``` \ No newline at end of file +``` + +Download the mesh agent: + +![meshagentdl](images/meshagentdl.png) + +Navigate to `https://rmm.example.com` and login with the username/password you created during install. + +Once logged in, you will be redirected to the initial setup page. + +Create your first client/site, choose the default timezone and then upload the mesh agent you just downloaded. + +## Note about Backups + +The backup script **does not** work with docker. To backup your install use [standard docker backup/restore](https://docs.docker.com/desktop/backup-and-restore/) processes. diff --git a/docs/docs/install_server.md b/docs/docs/install_server.md index e2e20269be..2d172ce8b2 100644 --- a/docs/docs/install_server.md +++ b/docs/docs/install_server.md @@ -1,41 +1,62 @@ # Installation -## Minimum requirements -- A fresh linux VM running either Ubuntu 20.04 or Debian 10, with a minimum of 3GB RAM (4GB Recommended).
+## General Information + +### Minimum requirements + +#### Hardware / OS + +A fresh linux VM running either Ubuntu 20.04 LTS or Debian 10 with 3GB RAM !!!warning - The provided install script assumes a fresh server with no software installed on it. Attempting to run it on an existing server with other services **will** break things and the install will fail.

+ The provided install script assumes a fresh server with no software installed on it. Attempting to run it on an existing server with other services **will** break things and the install will fail. + +!!!note The install script has been tested on the following public cloud providers: DigitalOcean, Linode, Vultr, BuyVM (highly recommended), Hetzner, AWS, Google Cloud and Azure, as well as behind NAT on Hyper-V, Proxmox and ESXi. -- A real (internet resolvable) domain is needed to generate a Let's Encrypt wildcard cert.
If you cannot afford to purchase a domain ($12 a year) then you can get one for free at [freenom.com](https://www.freenom.com/) -- example.local is __NOT__ a real domain. No you [don't have to expose your server](faq.md#can-i-run-tactical-rmm-locally-behind-nat-without-exposing-anything-to-the-internet) to the internet

+#### Network Requirements -- A TOTP based authenticator app. Some popular ones are Google Authenticator, Authy and Microsoft Authenticator.

+- A real (internet resolvable) domain is needed to generate a Let's Encrypt wildcard cert. _If you cannot afford to purchase a domain ($12 a year) then you can get one for free at [freenom.com](https://www.freenom.com/)_ + - example.local is __NOT__ a real domain. No you [don't have to expose your server](faq.md#can-i-run-tactical-rmm-locally-behind-nat-without-exposing-anything-to-the-internet) to the internet +- A TOTP based authenticator app. Some popular ones are Google Authenticator, Authy and Microsoft Authenticator. -## Install +#### Update Recommendations -!!!info - It is recommended that you keep your server updated regularly (monthly). SSL wildcard certs will expire every 3 months and need manual updating as well.

+!!!note + We highly recommend staying current with updates (at least every 3 months when you update your SSL certs is a good minimum) while Tactical RMM is still working towards its 1.0 release.

Until we reach production release, there may be architectural changes that may be made to Tactical RMM and only a regular patching schedule is supported by developers. -#### Run updates and setup the linux user -SSH into the server as **root**.

-Download and run the prereqs and latest updates
+## Option 1: Easy Install on a VPS + +Install on a VPS: DigitalOcean, Linode, Vultr, BuyVM (highly recommended), Hetzner, AWS, Google Cloud and Azure to name a few + +Use something that meets [minimum specs](install_server.md#hardware-os) + +### Run updates and setup the linux user + +SSH into the server as **root**. + +Download and run the prereqs and latest updates + ```bash apt update apt install -y wget curl sudo apt -y upgrade ``` -If a new kernel is installed, then reboot the server with the `reboot` command

-Create a linux user named `tactical` to run the rmm and add it to the sudoers group.
+ +If a new kernel is installed, then reboot the server with the `reboot` command + +Create a linux user named `tactical` to run the rmm and add it to the sudoers group. **For Ubuntu**: + ```bash adduser tactical usermod -a -G sudo tactical ``` **For Debian**: + ```bash useradd -m -s /bin/bash tactical usermod -a -G sudo tactical @@ -44,7 +65,7 @@ usermod -a -G sudo tactical !!!tip [Enable passwordless sudo to make your life easier](https://linuxconfig.org/configure-sudo-without-password-on-ubuntu-20-04-focal-fossa-linux) -#### Setup the firewall (optional but highly recommended) +### Setup the firewall (optional but highly recommended) !!!info Skip this step if your VM is __not__ publicly exposed to the world e.g. running behind NAT. You should setup the firewall rules in your router instead (ports 22, 443 and 4222 TCP). @@ -59,44 +80,47 @@ ufw allow proto tcp from any to any port 4222 !!!info SSH (port 22 tcp) is only required for you to remotely login and do basic linux server administration for your rmm. It is not needed for any agent communication.
Allow ssh from everywhere (__not__ recommended) + ```bash ufw allow ssh ``` Allow ssh from only allowed IP's (__highly__ recommended) + ```bash ufw allow proto tcp from X.X.X.X to any port 22 ufw allow proto tcp from X.X.X.X to any port 22 ``` Enable and activate the firewall -``` + +```bash ufw enable && ufw reload ``` -#### Create the A records +### Create the A records We'll be using `example.com` as our domain for this example. !!!info The RMM uses 3 different sites. The Vue frontend e.g. `rmm.example.com` which is where you'll be accesing your RMM from the browser, the REST backend e.g. `api.example.com` and Meshcentral e.g. `mesh.example.com` - -Get the public IP of your server with `curl https://icanhazip.tacticalrmm.io`
-Open the DNS manager of wherever the domain you purchased is hosted.
-Create 3 A records: `rmm`, `api` and `mesh` and point them to the public IP of your server: +1. Get the public IP of your server with `curl https://icanhazip.tacticalrmm.io` +2. Open the DNS manager of wherever the domain you purchased is hosted. +3. Create 3 A records: `rmm`, `api` and `mesh` and point them to the public IP of your server: ![arecords](images/arecords.png) - -#### Run the install script +### Run the install script Switch to the `tactical` user + ```bash su - tactical ``` Download and run the install script + ```bash wget https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/install.sh chmod +x install.sh @@ -107,13 +131,13 @@ Answer the initial questions when prompted. Replace `example.com` with your doma ![questions](images/install_questions.png) - -#### Deploy the TXT record in your DNS manager: +### Deploy the TXT record in your DNS manager for Lets Encrypt wildcard certs !!!warning TXT records can take anywhere from 1 minute to a few hours to propogate depending on your DNS provider.
You should verify the TXT record has been deployed first before pressing Enter.
- A quick way to check is with the following command:
`dig -t txt _acme-challenge.example.com` + A quick way to check is with the following command:
`dig -t txt _acme-challenge.example.com`
+ or test using: Enter: `_acme-challenge.example.com` ![txtrecord](images/txtrecord.png) @@ -125,14 +149,74 @@ Create a login for the RMM web UI: A bunch of URLS / usernames / passwords will be printed out at the end of the install script. **Save these somewhere safe.** [Recover them if you didn't](faq.md#how-do-i-recover-my-meshcentral-login-credentials) +### Upload mesh agents Copy the url for the meshagent exe (`https://mesh.example.com/agentinvite?c=......`), paste it in your browser and download the mesh agent: ![meshagentdl](images/meshagentdl.png) -Navigate to `https://rmm.example.com` and login with the username/password you created during install.

-Once logged in, you will be redirected to the initial setup page.

+Navigate to `https://rmm.example.com` and login with the username/password you created during install. + +Once logged in, you will be redirected to the initial setup page. + Create your first client/site, choose the default timezone and then upload the mesh agent you just downloaded. +### You're Done + +[Update Regularly](install_server.md#update-regularly) + +## Option 2: Install behind NAT Router + +Install in your local network using: Dedicated hardware, Hyper-V, Proxmox or ESXi. All been tested and work fine. + +Do everything from [Option 1: Easy Install](install_server.md#run-updates-and-setup-the-linux-user) + +### If you only have agents on the private network/subnet + +Make sure your local DNS server (or agents hosts file) have your Tactical RMM server IP addresses for the 3 domain names: `rmm`, `api` and `mesh` + +### Agents exist outside the private network/subnet - Setup Port Forwarding + +If you have agents outside your local network: Make sure the public DNS servers have A records for the 3 Tactical RMM server domain names: `rmm`, `api` and `mesh` + +Login to your router/NAT device. + +1. Set your TRMM server as a static IP (Use a DHCP reservation is usually safer) +2. Create 2 port forwarding rules. `TCP Port 443` and `TCP Port 4222` to your TRMM servers private IP address. + !!!note - Though it is an unsupported configuration, if you are using HAProxy or wish to configure fail2ban this might be of use to you [Unsupported Configuration Notes](unsupported_scripts.md) + can help with Port Forwarding setup + +### You're Done + +[Update Regularly](install_server.md#update-regularly) + +## Option 3: Installs by Network Wizards + +Use the scripts above. + +### Requirements + +1. TLD domain name which is internet resolvable (this is for a LetsEncrypt DNS wildcard request during the install script [validated by DNS txt record](https://letsencrypt.org/docs/challenge-types/#dns-01-challenge)). + - Test using: or . Enter: `_acme-challenge.example.com` as `TXT` +2. Agents need to be able to connect to your server via DNS lookup (hosts file, local DNS, smoke signals etc.). + - Test from agent: `ping rmm.example.com`. Should result in the IP of your Tactical RMM server + - Test from agent: `ping api.example.com`. Should result in the IP of your Tactical RMM server + - Test from agent: `ping mesh.example.com`. Should result in the IP of your Tactical RMM server + +!!!note + Did you notice #2 doesn't need to be something publicly available? + +That's it. You're a wizard, you know how to satisfy these 2 items. + +You'll probably enjoy browsing thru the [Unsupported section](unsupported_guidelines.md) of the docs. + +## Update Regularly + +We've said it before, we'll say it again. + +- We recommend regular updates. + + - Every 3 months. + + - Do it when you update your SSL certs. diff --git a/docs/docs/management_cmds.md b/docs/docs/management_cmds.md index da21552d3f..169fce5ba9 100644 --- a/docs/docs/management_cmds.md +++ b/docs/docs/management_cmds.md @@ -1,74 +1,88 @@ # Management Commands To run any of the management commands you must first activate the python virtual env: + ```bash cd /rmm/api/tacticalrmm source ../env/bin/activate ``` -#### Reset a user's password +## Reset a user's password + ```bash python manage.py reset_password ``` -#### Reset a user's 2fa token +## Reset a user's 2fa token + ```bash python manage.py reset_2fa ``` -#### Find all agents that have X software installed +## Find all agents that have X software installed + ```bash python manage.py find_software "adobe" ``` -#### Show outdated online agents +## Show outdated online agents + ```bash python manage.py show_outdated_agents ``` -#### Log out all active web sessions +## Log out all active web sessions + ```bash python manage.py delete_tokens ``` -#### Check for orphaned tasks on all agents and remove them +## Check for orphaned tasks on all agents and remove them + ```bash python manage.py remove_orphaned_tasks ``` -#### Create a MeshCentral agent invite link +## Create a MeshCentral agent invite link + ```bash python manage.py get_mesh_exe_url ``` -#### Bulk update agent offline/overdue time +## Bulk update agent offline/overdue time Change offline time on all agents to 5 minutes + ```bash python manage.py bulk_change_checkin --offline --all 5 ``` Change offline time on all agents in site named *Example Site* to 2 minutes + ```bash python manage.py bulk_change_checkin --offline --site "Example Site" 2 ``` Change offline time on all agents in client named *Example Client* to 12 minutes + ```bash python manage.py bulk_change_checkin --offline --client "Example Client" 12 ``` Change overdue time on all agents to 10 minutes + ```bash python manage.py bulk_change_checkin --overdue --all 10 ``` Change overdue time on all agents in site named *Example Site* to 4 minutes + ```bash python manage.py bulk_change_checkin --overdue --site "Example Site" 4 ``` Change overdue time on all agents in client named *Example Client* to 14 minutes + ```bash python manage.py bulk_change_checkin --overdue --client "Example Client" 14 ``` diff --git a/docs/docs/mesh_integration.md b/docs/docs/mesh_integration.md index d493d5bfff..6ca0382680 100644 --- a/docs/docs/mesh_integration.md +++ b/docs/docs/mesh_integration.md @@ -1,6 +1,6 @@ # MeshCentral Integration -#### Overview +## Overview Tactical RMM integrates with [MeshCentral](https://github.com/Ylianst/MeshCentral) for the following 3 functions: @@ -16,7 +16,7 @@ They do not even have to run on the same box, however when you install Tactical It is highly recommended to use the MeshCentral instance that Tactical installs, since it allows the developers more control over it and to ensure things don't break. -#### How does it work +## How does it work MeshCentral has an embedding feature that allows integration into existing products. @@ -25,4 +25,3 @@ See *Section 14 - Embedding MeshCentral* in the [MeshCentral User Guide](https:/ The Tactical RMM Agent keeps track of your Mesh Agents, and periodically interacts with them to synchronize the mesh agent's unique ID with the tactical rmm database. When you do a take control / terminal / file browser on an agent using the Tactical UI, behind the scenes, Tactical generates a login token for meshcentral's website and then "wraps" MeshCentral's UI in an iframe for that specific agent only, using it's unique ID to know what agent to render in the iframe. - diff --git a/docs/docs/restore.md b/docs/docs/restore.md index cfc54f90c2..9ab4e9aec6 100644 --- a/docs/docs/restore.md +++ b/docs/docs/restore.md @@ -7,19 +7,22 @@ The restore script will always restore to the latest available RMM version on github. Make sure you update your old RMM to the latest version using the `update.sh` script and then run a fresh backup to use with this restore script. -#### Prepare the new server + +## Prepare the new server + Create the same exact linux user account as you did when you installed the original server. Add it to the sudoers group and setup the firewall. Refer to the [installation instructions](install_server.md) for steps on how to do all of the above. -#### Change DNS A records +## Change DNS A records + Open the DNS manager of wherever your domain is hosted. Change the 3 A records `rmm`, `api` and `mesh` and point them to the public IP of your new server. -#### Run the restore script +## Run the restore script Copy the backup tar file you created during [backup](backup.md) to the new server. diff --git a/docs/docs/script_variables.md b/docs/docs/script_variables.md index 79b198a48f..45524de183 100644 --- a/docs/docs/script_variables.md +++ b/docs/docs/script_variables.md @@ -18,8 +18,8 @@ See below for the available options. - **{{agent.public_ip}}** - Public IP address of agent - **{{agent.agent_id}}** - agent ID in database - **{{agent.last_seen}}** - Date and Time Agent last seen -- **{{agent.used_ram}}** - Used RAM on agent. Returns an integer - example: *16* -- **{{agent.total_ram}}** - Total RAM on agent. Returns an integer - example: *16* +- **{{agent.used_ram}}** - Used RAM on agent. Returns an integer - example: *16* +- **{{agent.total_ram}}** - Total RAM on agent. Returns an integer - example: *16* - **{{agent.boot_time}}** - Uptime of agent. Returns unix timestamp. example: *1619439603.0* - **{{agent.logged_in_username}}** - Username of logged in user - **{{agent.last_logged_in_user}}** - Username of last logged in user @@ -34,7 +34,7 @@ See below for the available options. - **{{agent.check_interval}}** - Returns check interval time setting for agent in TRMM - **{{agent.needs_reboot}}** - Returns true if reboot is pending on agent - **{{agent.choco_installed}}** - Returns true if Chocolatey is installed -- **{{agent.patches_last_installed}}** - The date that patches were last installed by Tactical RMM. +- **{{agent.patches_last_installed}}** - The date that patches were last installed by Tactical RMM. - **{{agent.needs_reboot}}** - Returns true if the agent needs a reboot - **{{agent.time_zone}}** - Returns timezone configured on agent - **{{agent.maintenance_mode}}** - Returns true if agent is in maintenance mode @@ -42,16 +42,18 @@ See below for the available options. - **{{agent.alert_template}** - Returns true if agent has block policy inheritance ## Client + - **{{client.name}}** - Returns name of client ## Site + - **{{site.name}}** - Returns name of Site ## Alert !!!info Only available in failure and resolve actions on alert templates! - + - **{{alert.alert_time}}** - Time of the alert - **{{alert.message}}** - Alert message - **{{alert.severity}}** - Severity of the alert *info, warning, or error* diff --git a/docs/docs/security.md b/docs/docs/security.md new file mode 100644 index 0000000000..1b0c5fe436 --- /dev/null +++ b/docs/docs/security.md @@ -0,0 +1,7 @@ +# Security + +If you think that you have found a security vulnerability in Tactical RMM, please disclose it to us via our security e-mail address at **security@amidaware.com** + +Please do not make vulnerabilities public without notifying us and giving us at least 3 days to respond. + +If you are going to write about Tactical RMM's security, please get in touch, so we can make sure that all claims are correct. \ No newline at end of file diff --git a/docs/docs/sponsor.md b/docs/docs/sponsor.md index 8628e45569..c651313952 100644 --- a/docs/docs/sponsor.md +++ b/docs/docs/sponsor.md @@ -13,4 +13,3 @@ We are always looking for feedback and ways to improve Tactical RMM to better ad [Sponsor with Github](https://github.com/wh1te909) [Sponsor with Ko-fi](https://ko-fi.com/tacticalrmm) - diff --git a/docs/docs/support_templates/Initial questions.txt b/docs/docs/support_templates/Initial questions.txt new file mode 100644 index 0000000000..4121e8e0ea --- /dev/null +++ b/docs/docs/support_templates/Initial questions.txt @@ -0,0 +1,9 @@ +1. Standard/Docker +2. VPS/onprem +3. Are you using a proxy? +4. What version of Ubuntu/Debian, is it a Desktop or Server +5. Specs of machine including hard drive spec is it ssd or mechanical? +6. have you looked at the troubleshooting on github? +7. are you using a real domain +8. did letsencrypt finalise and work +9. are you using the standard ssl certs or something else? \ No newline at end of file diff --git a/docs/docs/support_templates/Initial questionsv2.txt b/docs/docs/support_templates/Initial questionsv2.txt new file mode 100644 index 0000000000..4a0270566f --- /dev/null +++ b/docs/docs/support_templates/Initial questionsv2.txt @@ -0,0 +1,19 @@ +Note: If you don't want to share any specific info publicly on discord you can DM me that data +1. Install type? (Standard/Docker) + If standard install did you deviate IN ANY WAY from these instructions? https://wh1te909.github.io/tacticalrmm/install_server/ + If docker install did you deviate IN ANY WAY from these instructions? https://wh1te909.github.io/tacticalrmm/install_docker/ +2. Where is the server? (VPS/onprem) +3. New install, or established? Rough age of TRMM server (days/weeks/months)? + +Server Install Specific questions: +4. What version of Ubuntu/Debian, is it a Desktop or Server +5. Are you using a real domain +6. Did letsencrypt finalise and work +7. Have you looked at the troubleshooting steps on github? https://wh1te909.github.io/tacticalrmm/troubleshooting/ +8. What kind of ssl certs? Let's Encrypt, or purchased (you're not trying to make self-signed work right?) +9. Check Expiry date of your certificates in the browser (at https://rmm.example.com ) + +Network Troubleshooting +10. Are you using a proxy? +11. Are you a wizard? See https://wh1te909.github.io/tacticalrmm/unsupported_guidelines/ + If so, what's in the network between agent and server? diff --git a/docs/docs/tidbits.md b/docs/docs/tidbits.md new file mode 100644 index 0000000000..82f37bb5ea --- /dev/null +++ b/docs/docs/tidbits.md @@ -0,0 +1,12 @@ +# Misc info + +## Run Intervals for Checks + +You can modify at several locations/levels: + +* **Settings Menu > Automation Manager > Checks tab >** Edit check +* Agent Level: **Edit Agent > Run checks every** +* Edit Check under agent > Run this check every (seconds) + +!!!note + The interval under check will override agent check if set \ No newline at end of file diff --git a/docs/docs/tipsntricks.md b/docs/docs/tipsntricks.md index dfc18715e2..f88e01c384 100644 --- a/docs/docs/tipsntricks.md +++ b/docs/docs/tipsntricks.md @@ -8,7 +8,11 @@ At the top right of your web administration interface, click your Username > pre ***** -## Mesh +## MeshCentral + +Tactical RMM is actually 2 products: An RMM service with agent, and a secondary [MeshCentral](https://github.com/Ylianst/MeshCentral) install that handles the `Take Control` and `Remote Background` stuff. + +### Adjust Settings Right-click the connect button in *Remote Background | Terminal* for shell options @@ -17,3 +21,19 @@ Right-click the connect button in *Remote Background | Terminal* for shell optio Right-click the connect button in *Take Control* for connect options ![Terminal](images/tipsntricks_meshcontrol.png) + +### Enable Remote Control options + +!!!note + These settings are independant of Tactical RMM. Enable features (like auto remove inactive devices) with caution + +1. Remote background a machine then go to mesh.yourdomain.com +2. Click on My Account +3. Click on the device group you want to enable notifications or accept connection etc on (probably TacticalRMM) +4. Next to User Consent click edit (the wee pencil) +5. Tick whatever boxes you want in there (Features: Sync server device name to hostname, Automatically remove inactive devices, Notify/Prompt for Consent/Connection Toolbar settings) +6. Click ok + +![Features](images/mesh_features.png) + +![Features](images/mesh_userconsent.png) diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index f4fdad5a9c..d75c55a930 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -1,8 +1,34 @@ # Troubleshooting -#### Problems after new install +## Server Troubleshooting Script -In the very unlikely event you have issues after install please wipe the box and install again (following all the steps including downloading the install script but not running it) use the following command which will log the install progress and if you continue to have issues will assist with support of the installation. +If you've asked for help in [#support](https://discord.com/channels/736478043522072608/744282073870630912) please run this, and send a screenshot at the top of the thread created for troubleshooting your issue. + +Blur your domains if you desire privacy. + +```bash +wget -N https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/troubleshoot_server.sh +chmod +x troubleshoot_server.sh +./troubleshoot_server.sh +``` + +## Make sure DNS (name resolution) was setup properly + +### From the agent + +Open command prompt + +```cmd +ping rmm.example.com +ping api.example.com +ping mesh.example.com +``` + +The IP address for all 3 should reflect your Tactical RMM server + +## Problems after new server install + +In the very unlikely event you have issues after install please wipe the box and install again (following all the steps including downloading the install script _but not running it yet_) use the following command which will log the install progress and if you continue to have issues will assist with support of the installation. ```bash bash -x install.sh 2>&1 | tee install.log @@ -11,7 +37,7 @@ bash -x install.sh 2>&1 | tee install.log !!!note Logging of installs isn’t desirable as it logs extremely sensitive information which is why this isn’t done by default! **Do not** post the raw log publicly only provide it if requested and then by dm only. Authorized users in Discord are: @BurningTimes#1938 @sadnub#6992 @dinger1986#1734 @silversword#9652 -#### "Bad credentials" error when trying to login to the Web UI +## "Bad credentials" error when trying to login to the Web UI If you are sure you are using the correct credentials and still getting a "bad credentials" error, open your browser's dev tools (ctrl + shift + j on chrome) and check the Console tab to see the real error. @@ -21,11 +47,9 @@ If you see an error about SSL or certificate expired, then your Let's Encrypt ce Refer to the Let's Encrypt cert renewal instructions [here](update_server.md#keeping-your-lets-encrypt-certificate-up-to-date) -
- -#### Agents not updating +## Agents not installing or updating -The most common problem we've seen of agents not updating is due to Antivirus blocking the updater executable. +The most common problem we've seen of agents not installing or updating is due to Antivirus blocking the updater executable. Windows Defender will 100% of the time block the updater from running unless an exclusion is set. @@ -37,11 +61,9 @@ Since Tactical RMM is still in alpha and the developers makes breaking changes p If you have agents that are relatively old, you will need to uninstall them manually and reinstall using the latest version. -
+## Agents not checking in or showing up / General agent issues -#### Agents not checking in or showing up / General agent issues - -First, reload NATS from tactical's web UI:
+First, reload NATS from tactical's web UI:
*Tools > Server Maintenance > Reload Nats Configuration* Open CMD as admin on the problem computer and stop the agent services: @@ -52,11 +74,13 @@ net stop tacticalrpc ``` Run the tacticalagent service manually with debug logging: + ```cmd "C:\Program Files\TacticalAgent\tacticalrmm.exe" -m winagentsvc -log debug -logto stdout ``` Run the tacticalrpc service manually with debug logging: + ```cmd "C:\Program Files\TacticalAgent\tacticalrmm.exe" -m rpc -log debug -logto stdout ``` @@ -67,9 +91,11 @@ Please then copy/paste the logs and post them either in our [Discord support cha If all else fails, simply uninstall the agent either from control panel or silently with `"C:\Program Files\TacticalAgent\unins000.exe" /VERYSILENT` and then reinstall the agent. -#### All other errors +## All other errors + +First, run the [update script](update_server.md#updating-to-the-latest-rmm-version) with the `--force` flag. -First, run the [update script](update_server.md#updating-to-the-latest-rmm-version) with the `--force` flag.
This will fix permissions and reinstall python/node packages that might have gotten corrupted. +This will fix permissions and reinstall python/node packages that might have gotten corrupted. ```bash ./update.sh --force @@ -95,12 +121,13 @@ sudo systemctl status redis ``` Read through the log files in the following folders and check for errors: + ```bash /rmm/api/tacticalrmm/tacticalrmm/private/log /var/log/celery ``` -#### Using Cloudflare DNS +## Using Cloudflare DNS - rmm.example.com can be proxied. @@ -108,7 +135,7 @@ Read through the log files in the following folders and check for errors: - mesh.example.com can be proxied with the caveat that Mesh checks the cert presented to the agent is the same one on the server. I.e. no MITM. You'll need to copy Cloudflare's edge cert to your server if you want to proxy this domain. -#### Testing Network Connectivity between agent and server +## Testing Network Connectivity between agent and server Use powershell, make sure you can connect to 443 and 4222 from agent to server: @@ -124,4 +151,13 @@ Test-NetConnection -ComputerName api.example.com -Port 443 Test-NetConnection -ComputerName rmm.example.com -Port 443 ``` -Are you trying to use a proxy to share your single public IP with multiple services on 443? This is complicated and [unsupported by Tactical RMM](unsupported_scripts.md), test your setup. \ No newline at end of file +Are you trying to use a proxy to share your single public IP with multiple services on 443? This is complicated and [unsupported by Tactical RMM](unsupported_scripts.md), test your setup. + +## Mesh Agent x86 x64 integration with TRMM + +1. Log into Mesh (you can right-click any agent, choose remote control or Remote Background) +2. Goto your mesh interface (eg `https://mesh.domain.com`) +3. Find your TacticalRMM group +4. Click the add link +5. Download both agents +6. In Tactical RMM, go **Settings > Global Settings > MeshCentral > Upload Mesh Agents** upload them both into the appropriate places. diff --git a/docs/docs/unsupported_guidelines.md b/docs/docs/unsupported_guidelines.md index 5792a6d66d..3d6764212f 100644 --- a/docs/docs/unsupported_guidelines.md +++ b/docs/docs/unsupported_guidelines.md @@ -1,8 +1,10 @@ +# Unsupported Guidelines + ## General Information -Tactical RMM is designed to be secure by default. +Tactical RMM is designed to be secure by default. -You **CAN** **_expose_** it to the internet, and start deploying agents. +You **CAN** **_expose_** it to the internet, and start deploying agents. You **CAN** **_not expose_** it to the internet, and start deploying agents. @@ -11,11 +13,11 @@ You **CAN** **_not expose_** it to the internet, and start deploying agents. !!!info BIG PERIOD **.** <--- See, it's really really big 🙂 -## That said... +## That said There are those that wish to add layers to their security onion. For the benefit of others following in their footsteps, we have added here for your convenience additional information on a range of subjects and technologies that have been graciously donated to us by the community at large. -Please be aware that those providing help and assistance in the Discord [#support](https://discord.com/channels/736478043522072608/744282073870630912) channel will generally assume that you are **not** one of these wizards of networking magic. +Please be aware that those providing help and assistance in the Discord [#support](https://discord.com/channels/736478043522072608/744282073870630912) channel will generally assume that you are **not** one of these wizards of networking magic. Should you employ any one or several of these unsupported technologies: @@ -27,8 +29,13 @@ Should you employ any one or several of these unsupported technologies: * IDSs * IPSs * SDNs +* Did anything other than follow the installation instructions exactly * and any/all other magical ABC thru XYZ technologies -Please let us know **BEFORE** we start troubleshooting and looking for software bugs that you are...in fact...a 🧙...and using something non-standard 😉 Help us maximize keeping developer time and resources focused on new releases...not support goosechases. +Please let us know **BEFORE** we start troubleshooting and looking for software bugs that you are...in fact...a 🧙...and using something non-standard 😉 + +These are "unsupported" because then we are troubleshooting **your** environment, not Tactical RMM. You need to have knowledge about how things work if you're going to stray from the [easy path](../install_server/#option-1-easy-install) of the standard install. + +Help us maximize keeping developer time and resources focused on new releases...not support goosechases. -Thank you and #KeepDeploying \ No newline at end of file +Thank you and #KeepDeploying diff --git a/docs/docs/unsupported_scripts.md b/docs/docs/unsupported_scripts.md index de9cf3cc63..01be065f79 100644 --- a/docs/docs/unsupported_scripts.md +++ b/docs/docs/unsupported_scripts.md @@ -1,10 +1,23 @@ # Unsupported Reference Scripts -!!!note - These are not supported scripts/configurations by Tactical RMM, but it's provided here for your reference. +!!!note + These are not supported scripts/configurations by Tactical RMM, but it's provided here for your reference. -## HAProxy +## General Notes on Proxies and Tactical RMM + +### Port 443 + +Make sure websockets option is enabled. + +All 3 URL's will need to be configured: `rmm`, `api`, `mesh` + +For `mesh` see the Section 10. TLS Offloading of the [MeshCentral 2 User Guide](https://info.meshcentral.com/downloads/MeshCentral2/MeshCentral2UserGuide.pdf) +### Port 4222 + +Is NATS (). You'll need a TCP forwarder as NATS only talks TCP not HTTP. + +## HAProxy Check/Change the mesh central config.json, some of the values may be set already, CertUrl must be changed to point to the HAProxy server. @@ -20,7 +33,7 @@ nano /meshcentral/meshcentral-data/config.json Insert this (modify `HAProxyIP` to your network) -``` +```conf { "settings": { "Port": 4430, @@ -45,9 +58,9 @@ service meshcentral restart ### HAProxy Config The order of use_backend is important `Tactical-Mesh-WebSocket_ipvANY` must be before `Tactical-Mesh_ipvANY` -The values of `timeout connect`, `timeout server`, `timeout tunnel` in `Tactical-Mesh-WebSocket` have been configured to maintain a stable agent connection, however you may need to adjust these values to suit your environment. +The values of `timeout connect`, `timeout server`, `timeout tunnel` in `Tactical-Mesh-WebSocket` have been configured to maintain a stable agent connection, however you may need to adjust these values to suit your environment. -``` +```conf frontend HTTPS-merged bind 0.0.0.0:443 name 0.0.0.0:443 ssl crt-list /var/etc/haproxy/HTTPS.crt_list #ADJUST THIS TO YOUR OWN SSL CERTIFICATES mode http @@ -131,8 +144,7 @@ sudo apt install -y fail2ban ### Set Tactical fail2ban filter conf File - -``` +```bash tacticalfail2banfilter="$(cat << EOF [Definition] failregex = ^.*400.17.*$ @@ -144,7 +156,7 @@ sudo echo "${tacticalfail2banfilter}" > /etc/fail2ban/filter.d/tacticalrmm.conf ### Set Tactical fail2ban jail conf File -``` +```bash tacticalfail2banjail="$(cat << EOF [tacticalrmm] enabled = true @@ -210,7 +222,7 @@ You need to add the certificate private key and public keys to the following fil but change api. to: mesh. and rmm. respectively. -7. Add the following to the last lines of `/rmm/api/tacticalrmm/tacticalrmm/local_settings.py` +5. Add the following to the last lines of `/rmm/api/tacticalrmm/tacticalrmm/local_settings.py` nano /rmm/api/tacticalrmm/tacticalrmm/local_settings.py @@ -526,4 +538,141 @@ done ###Renew certs can be done by sudo letsencrypt renew (this should automatically be in /etc/cron.d/certbot) -``` \ No newline at end of file +``` + +### Using your own certs with Docker + +Let's Encrypt is the only officially supported method of obtaining wildcard certificates. Publicly signed certificates should work but have not been fully tested. + +If you are providing your own publicly signed certificates, ensure you download the **full chain** (combined CA/Root + Intermediary) certificate in pem format. If certificates are not provided, a self-signed certificate will be generated and most agent functions won't work. + +## Restricting Access to rmm.yourdomain.com + +### Using DNS + +1. Create a file allowed-domain.list which contains the DNS names you want to grant access to your rmm: + + Edit `/etc/nginx/allowed-domain.list` and add + + nom1.dyndns.tv + nom2.dyndns.tv + +2. Create a bash script domain-resolver.sh which do the DNS lookups for you: + + Edit `/etc/nginx/domain-resolver.sh` + + #!/usr/bin/env bash + filename="$1" + while read -r line + do + ddns_record="$line" + if [[ ! -z $ddns_record ]]; then + resolved_ip=getent ahosts $line | awk '{ print $1 ; exit }' + if [[ ! -z $resolved_ip ]]; then + echo "allow $resolved_ip;# from $ddns_record" + fi + fi + done < "$filename" + +3. Give the right permission to this script `chmod +x /etc/nginx/domain-resolver.sh` + +4. Add a cron job which produces a valid nginx configuration and restarts nginx: + + `/etc/cron.hourly/domain-resolver` + + #!/usr/bin/env bash + /etc/nginx/domain-resolver.sh /etc/nginx/allowed-domain.list > /etc/nginx//allowed-ips-from-domains.conf + service nginx reload > /dev/null 2>&1 + + This can be a hourly, daily or monthly job or you can have it run at a specific time. + +5. Give the right permission to this script chmod +x /etc/cron.hourly/domain-resolver + +6. When run it will give something like this + + Edit `/etc/nginx//allowed-ips-from-domains.conf` + + allow xxx.xxx.xxx.xxx;# from maison.nom1.dyndns.tv + allow xxx.xxx.xxx.xxx;# from maison.nom2.dyndns.tv + +7. Update your nginx configuration to take this output into account: + + Edit `/etc/nginx/sites-enabled/frontend.conf` + + server { + server_name rmm.example.com; + charset utf-8; + location / { + root /var/www/rmm/dist; + try_files $uri $uri/ /index.html; + add_header Cache-Control "no-store, no-cache, must-revalidate"; + add_header Pragma "no-cache"; + } + error_log /var/log/nginx/frontend-error.log; + access_log /var/log/nginx/frontend-access.log; + include /etc/nginx/allowed-ips-from-domains.conf; + deny all; + listen 443 ssl; + listen [::]:443 ssl; + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384'; + } + + server { + if ($host = rmm.example.com) { + return 301 https://$host$request_uri; + } + + listen 80; + listen [::]:80; + server_name rmm.example.com; + return 404; + } + +### Using a fixed IP + +1. Create a file containg the fixed IP address (where xxx.xxx.xxx.xxx must be replaced by your real IP address) + + Edit `/etc/nginx//allowed-ips.conf` + # Private IP address + allow 192.168.0.0/16; + allow 172.16.0.0/12; + allow 10.0.0.0/8; + # Public fixed IP address + allow xxx.xxx.xxx.xxx + +2. Update your nginx configuration to take this output into account: + + Edit `/etc/nginx/sites-enabled/frontend.conf` + + server { + server_name rmm.example.com; + charset utf-8; + location / { + root /var/www/rmm/dist; + try_files $uri $uri/ /index.html; + add_header Cache-Control "no-store, no-cache, must-revalidate"; + add_header Pragma "no-cache"; + } + error_log /var/log/nginx/frontend-error.log; + access_log /var/log/nginx/frontend-access.log; + include /etc/nginx/allowed-ips; + deny all; + listen 443 ssl; + listen [::]:443 ssl; + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384'; + } + + server { + if ($host = rmm.example.com) { + return 301 https://$host$request_uri; + } + + listen 80; + listen [::]:80; + server_name rmm.example.com; + return 404; + } diff --git a/docs/docs/unsupported_synology_docker_install.md b/docs/docs/unsupported_synology_docker_install.md new file mode 100644 index 0000000000..28c62d776f --- /dev/null +++ b/docs/docs/unsupported_synology_docker_install.md @@ -0,0 +1,38 @@ +# Installing on Synology NAS using docker install + +## Docker Setup + +While a docker install is supported, trying to help someone get it working on their own Synology NAS is not. But here's how you do it! + +- Follow the [standard docker install](./install_docker.md) documentation. +- Once the `docker-compose` file is downloaded, edit it and modify the ports used by the nginx server to custom ports (`13180` and `13443` in the example below) + +![syno ports](images/synology_docker_ports.jpg) + +## Setup the reverse proxy + +Go to **Login Portal > Advanced > Reverse Proxy** in the Control Panel + +Create 2 entries for each tactical DNS entries, one for the HTTP port & one for the HTTPS + +![syno reverse](images/synology_docker_reverse.jpg) + +For the entries related to the mesh, add some custom headers and adjust the proxy timeout connection + +![syno reverse detail](images/synology_docker_reverse_details1.jpg) + +![syno reverse detail](images/synology_docker_reverse_details2.jpg) + +## Bonus: SSL Certificate + +In regards to the certificate, I followed this [tutorial](https://www.nas-forum.com/forum/topic/68046-tuto-certificat-lets-encrypt-avec-acmesh-api-ovh-en-docker-dsm67-update-180621) (in french but still clear after translation) to automatically update it and manually updating it on the NAS and in TRMM + +```bash +docker exec Acme sh -c "acme.sh --issue --keylength 4096 -d '*.mydomain.com' --dns dns_provider" +sed -i '/CERT_PUB_KEY/d' /path/to/tactical/.env +sed -i '/CERT_PRIV_KEY/d' /path/to/tactical/.env +echo "CERT_PUB_KEY=$(sudo base64 -w 0 /volume1/docker/acme/\*.mydomain.com/fullchain.cer)" >> /path/to/tactical/.env +echo "CERT_PRIV_KEY=$(sudo base64 -w 0 /volume1/docker/acme/\*.mydomain.com/*.whitesnew.com.key)" >> /path/to/tactical/.env +docker exec Acme sh -c "acme.sh --deploy -d '*.mydomain.com' --deploy-hook synology_provider" +docker-compose -f /path/to/tactical/docker-compose.yml restart +``` diff --git a/docs/docs/update_agents.md b/docs/docs/update_agents.md index d9a6f62095..266631abd8 100644 --- a/docs/docs/update_agents.md +++ b/docs/docs/update_agents.md @@ -5,35 +5,41 @@ For example, currently RMM version 0.4.17 is compatible with agent version 1.4.6 and lower.

You should never attempt to manually update an agent to a newer version without first making sure your RMM is on the latest version. -#### Updating from the Web UI -Agents will automatically self update themselves if you have auto self update enabled in **Settings > Global Settings**

+## Updating from the Web UI + +Agents will automatically self update themselves if you have auto self update enabled in **Settings > Global Settings** + ![autoagentupdate](images/autoagentupdate.png) -There is a background job that runs every hour, at 35 minutes past the hour and sends any online agents an update command if it detects they are on an older version.

+There is a background job that runs every hour, at 35 minutes past the hour and sends any online agents an update command if it detects they are on an older version. + +You can also trigger this background job to run on demand by clicking **Agents > Update Agents** in the web UI: -You can also trigger this background job to run on demand by clicking **Agents > Update Agents** in the web UI:

![manualagentupdate](images/manualagentupdate.png) -You can individually choose which agents to update, or simply Select All.

-The RMM will automatically skip any agents that don't need updating.

-You can trigger this manual agent update anytime you want. It is safe to spam, and won't run if an agent update task is already running.

-It will also make sure agents update to the correct version, in case they are an older version that cannot be directly upgraded to the latest version.

-For example, agents older than version 1.3.0 must first be updated to 1.3.0 before they can go any further.
+You can individually choose which agents to update, or simply Select All. + +The RMM will automatically skip any agents that don't need updating. -
+You can trigger this manual agent update anytime you want. It is safe to spam, and won't run if an agent update task is already running. -#### Manually updating from the command line on the agent +It will also make sure agents update to the correct version, in case they are an older version that cannot be directly upgraded to the latest version. -You should never need to do this but might be needed to troubleshoot agents that are not updating automatically.
+For example, agents older than version 1.3.0 must first be updated to 1.3.0 before they can go any further. -Download the `winagent-vX.X.X.exe` executable from the [github releases page](https://github.com/wh1te909/rmmagent/releases) and place it somewhere on the filesystem.
+## Manually updating from the command line on the agent + +You should never need to do this but might be needed to troubleshoot agents that are not updating automatically. + +Download the `winagent-vX.X.X.exe` executable from the [github releases page](https://github.com/wh1te909/rmmagent/releases) and place it somewhere on the filesystem. Open CMD as admin and call the exe like so: -``` +```cmd C:\Windows\Temp>winagent-vX.X.X.exe /VERYSILENT /LOG=agentupdate.txt ``` -This command will return immediately since it spawns a background process to run the update.
-The agent will take around 30 seconds to fully update.

-You can check the `agentupdate.txt` log file that is created for troubleshooting.

+This command will return immediately since it spawns a background process to run the update. +The agent will take around 30 seconds to fully update. + +You can check the `agentupdate.txt` log file that is created for troubleshooting. diff --git a/docs/docs/update_docker.md b/docs/docs/update_docker.md index bc7f7a74b6..68f6407f02 100644 --- a/docs/docs/update_docker.md +++ b/docs/docs/update_docker.md @@ -1,10 +1,11 @@ # Updating the RMM (Docker) -#### Updating to the latest RMM version +## Updating to the latest RMM version Tactical RMM updates the docker images on every release and should be available within a few minutes -SSH into your server as a root user and run the below commands:
+SSH into your server as a root user and run the below commands: + ```bash cd [dir/with/compose/file] mv docker-compose.yml docker-compose.yml.old @@ -14,7 +15,7 @@ sudo docker-compose down sudo docker-compose up -d --remove-orphans ``` -#### Keeping your Let's Encrypt certificate up to date +## Keeping your Let's Encrypt certificate up to date To renew your Let's Encrypt wildcard cert, run the following command, replacing `example.com` with your domain and `admin@example.com` with your email: @@ -29,7 +30,7 @@ echo "CERT_PUB_KEY=$(sudo base64 -w 0 /etc/letsencrypt/live/${rootdomain}/fullch echo "CERT_PRIV_KEY=$(sudo base64 -w 0 /etc/letsencrypt/live/${rootdomain}/privkey.pem)" >> .env ``` -!!!warning +!!!warning You must remove the old and any duplicate entries for CERT_PUB_KEY and CERT_PRIV_KEY in the .env file Now run `sudo docker-compose restart` and the new certificate will be in effect diff --git a/docs/docs/update_server.md b/docs/docs/update_server.md index fbb9bbe475..69165ff49a 100644 --- a/docs/docs/update_server.md +++ b/docs/docs/update_server.md @@ -1,22 +1,32 @@ # Updating the RMM -#### Keeping your linux server up to date +## Keeping your linux server up to date You should periodically run `sudo apt update` and `sudo apt -y upgrade` to keep your server up to date. Other than this, you should avoid making any changes to your server and let the `update.sh` script handle everything else for you. -#### Updating to the latest RMM version + +## Updating to the latest RMM version !!!danger - Do __not__ attempt to manually edit the update script or any configuration files unless specifically told to by one of the developers.

- Since this software is completely self hosted and we have no access to your server, we have to assume you have not made any config changes to any of the files or services on your server, and the update script will assume this.

- You should also **never** attempt to automate running the update script via cron.

- The update script will update itself if needed to the latest version when you run it, and them prompt you to run it again.

+ Do __not__ attempt to manually edit the update script or any configuration files unless specifically told to by one of the developers. + + Since this software is completely self hosted and we have no access to your server, we have to assume you have not made any config changes to any of the files or services on your server, and the update script will assume this. + + You should also **never** attempt to automate running the update script via cron. + + The update script will update itself if needed to the latest version when you run it, and then prompt you to run it again. + Sometimes, manual intervention will be required during an update in the form of yes/no prompts, so attempting to automate this will ignore these prompts and cause your installation to break. -SSH into your server as the linux user you created during install.

-__Never__ run any update scripts or commands as the `root` user.
This will mess up permissions and break your installation.

-Download the update script and run it:
+SSH into your server as the linux user you created during install. + +!!!danger + __Never__ run any update scripts or commands as the `root` user. + + This will mess up permissions and break your installation. + +Download the update script and run it: ```bash wget -N https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/update.sh @@ -24,19 +34,17 @@ chmod +x update.sh ./update.sh ``` -
+If you are already on the latest version, the update script will notify you of this and return immediately. -If you are already on the latest version, the update script will notify you of this and return immediately.

-You can pass the optional `--force` flag to the update script to forcefully run through an update, which will bypass the check for latest version.
+You can pass the optional `--force` flag to the update script to forcefully run through an update, which will bypass the check for latest version. ```bash ./update.sh --force ``` -This is usefull for a botched update that might have not completed fully.

-The update script will also fix any permissions that might have gotten messed up during a botched update, or if you accidentally ran the update script as the `root` user. +This is usefull for a botched update that might have not completed fully. -
+The update script will also fix any permissions that might have gotten messed up during a botched update, or if you accidentally ran the update script as the `root` user. !!!warning Do __not__ attempt to manually update MeshCentral to a newer version. @@ -45,7 +53,7 @@ The update script will also fix any permissions that might have gotten messed up The developers will test MeshCentral and make sure integration does not break before bumping the mesh version. -#### Keeping your Let's Encrypt certificate up to date +## Keeping your Let's Encrypt certificate up to date !!!info Currently, the update script does not automatically renew your Let's Encrypt wildcard certificate, which expires every 3 months, since this is non-trivial to automate using the DNS TXT record method. @@ -64,7 +72,7 @@ After this you have renewed the cert, simply run the `update.sh` script, passing ./update.sh --force ``` -#### Keep an eye on your disk space +## Keep an eye on your disk space If you're running low, shrink you database diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 35bd0bff7a..f4c90049d9 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -13,8 +13,10 @@ nav: - "Updating Agents": update_agents.md - Functionality: - "Alerting": functions/alerting.md + - "API Access": functions/api.md - "Automated Tasks": functions/automated_tasks.md - "Custom Fields": functions/custom_fields.md + - "Database Maintenance": functions/database_maintenance.md - "Django Admin": functions/django_admin.md - "Global Keystore": functions/keystore.md - "Maintenance Mode": functions/maintenance_mode.md @@ -23,9 +25,7 @@ nav: - "Scripting": functions/scripting.md - "URL Actions": functions/url_actions.md - "User Interface Preferences": functions/user_ui.md - - "API Access": functions/api.md - "Examples": functions/examples.md - - "Database Maintenace": functions/database_maintenance.md - Backup: backup.md - Restore: restore.md - Troubleshooting: troubleshooting.md @@ -33,21 +33,24 @@ nav: - Management Commands: management_cmds.md - MeshCentral Integration: mesh_integration.md - 3rd Party Integrations: + - "Grafana": 3rdparty_grafana.md - "AnyDesk": 3rdparty_anydesk.md - - "BitDefender GravityZone": 3rdparty_bitdefender_gravityzone.md - "Connectwise Control / Screenconnect": 3rdparty_screenconnect.md - - "Grafana": 3rdparty_grafana.md - "TeamViewer": 3rdparty_teamviewer.md - - Unsupported Scripts & Security: + - "BitDefender GravityZone": 3rdparty_bitdefender_gravityzone.md + - Unsupported Extras: - "Unsupported Guidelines": unsupported_guidelines.md - "Unsupported Scripts": unsupported_scripts.md - "Securing nginx": securing_nginx.md + - "Installing in Synology docker": unsupported_synology_docker_install.md - Tips n' Tricks: tipsntricks.md - Contributing: - "Contributing to Docs": contributing.md - "Contributing to Community Scripts": contributing_community_scripts.md - "Contributing using VSCode": contributing_using_vscode.md - "Contributing using Docker": contributing_using_docker.md + - "Contributing using a Remote Server": contributing_using_a_remote_server.md + - Security: security.md - License: license.md site_description: "A remote monitoring and management tool" site_author: "wh1te909" diff --git a/install.sh b/install.sh index 5906be71ad..66689bb3cf 100644 --- a/install.sh +++ b/install.sh @@ -1,6 +1,6 @@ #!/bin/bash -SCRIPT_VERSION="53" +SCRIPT_VERSION="54" SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/install.sh' sudo apt install -y curl wget dirmngr gnupg lsb-release @@ -40,11 +40,11 @@ fi # determine system -if ([ "$osname" = "ubuntu" ] && [ "$fullrelno" = "20.04" ]) || ([ "$osname" = "debian" ] && [ $relno -ge 10 ]); then +if ([ "$osname" = "ubuntu" ] && [ "$fullrelno" = "20.04" ]) || ([ "$osname" = "debian" ] && [ $relno -eq 10 ]); then echo $fullrel else echo $fullrel - echo -ne "${RED}Only Ubuntu release 20.04 and Debian 10 and later, are supported\n" + echo -ne "${RED}Only Ubuntu release 20.04 and Debian 10 are supported\n" echo -ne "Your system does not appear to be supported${NC}\n" exit 1 fi @@ -169,6 +169,7 @@ print_green 'Installing Nginx' sudo apt install -y nginx sudo systemctl stop nginx sudo sed -i 's/worker_connections.*/worker_connections 2048;/g' /etc/nginx/nginx.conf +sudo sed -i 's/# server_names_hash_bucket_size.*/server_names_hash_bucket_size 64;/g' /etc/nginx/nginx.conf print_green 'Installing NodeJS' diff --git a/restore.sh b/restore.sh index 97aebf4583..8c99b4b239 100755 --- a/restore.sh +++ b/restore.sh @@ -1,6 +1,6 @@ #!/bin/bash -SCRIPT_VERSION="30" +SCRIPT_VERSION="31" SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/restore.sh' sudo apt update @@ -39,11 +39,11 @@ if [ ! "$osname" = "ubuntu" ] && [ ! "$osname" = "debian" ]; then fi # determine system -if ([ "$osname" = "ubuntu" ] && [ "$fullrelno" = "20.04" ]) || ([ "$osname" = "debian" ] && [ $relno -ge 10 ]); then +if ([ "$osname" = "ubuntu" ] && [ "$fullrelno" = "20.04" ]) || ([ "$osname" = "debian" ] && [ $relno -eq 10 ]); then echo $fullrel else echo $fullrel - echo -ne "${RED}Only Ubuntu release 20.04 and Debian 10 and later, are supported\n" + echo -ne "${RED}Only Ubuntu release 20.04 and Debian 10 are supported\n" echo -ne "Your system does not appear to be supported${NC}\n" exit 1 fi diff --git a/scripts/Win_Bitdefender_GravityZone_Install.ps1 b/scripts/Win_Bitdefender_GravityZone_Install.ps1 index c8213a0519..c4dcaffa3a 100644 --- a/scripts/Win_Bitdefender_GravityZone_Install.ps1 +++ b/scripts/Win_Bitdefender_GravityZone_Install.ps1 @@ -9,7 +9,7 @@ $log if provided will output verbose logs with timestamps. This can be used to determine how long the installer took. TacticalRMM: Need to add Custom Fields to the Client or Site and invoke them in the Script Arguments; example shown. - Name the url "bdurl" in the client custom field. + Name the url "bdurl" in the client custom field. -url {{client.bdurl} SuperOps.ai: Add url and exe run time variables. @@ -45,24 +45,23 @@ if ($log) { Write-Output "" } - -if (($exe -ne $null) -and ($exe.Length -gt 0)) { +if (($null -ne $exe) -and ($exe.Length -gt 0)) { Write-Output "$(Get-Timestamp) The -exe parameter is deprecated (not needed)" } -if (($url -eq $null) -or ($url.Length -eq 0)) { +if (($null -eq $url) -or ($url.Length -eq 0)) { Write-Output "$(Get-Timestamp) Url parameter is not specified" Exit(1) } $exe = [uri]::UnescapeDataString($([uri]$url).segments[-1]) -if ($exe -eq $null) { +if ($null -eq $exe) { Write-Output "$(Get-Timestamp) Exe could not be extracted from the URL" Write-Output "$(Get-Timestamp) Make sure the URL is not modified from the original URL" Exit(1) } -#Check if software is installed. If folder is present, terminate script +# Check if software is installed. If key is present, terminate script if ($log) { Write-Output "$(Get-Timestamp) Checking if Bitdefender is installed..." } @@ -126,7 +125,6 @@ if ($log) { Write-Output "$(Get-Timestamp) Cleaning up temp file..." } - # Cleanup if (Test-Path -PathType Leaf -Path $tmpExe) { Remove-Item $tmpExe diff --git a/scripts/Win_Bitlocker_Drive_Check_Status.ps1 b/scripts/Win_Bitlocker_Drive_Check_Status.ps1 new file mode 100644 index 0000000000..b58db7d3ca --- /dev/null +++ b/scripts/Win_Bitlocker_Drive_Check_Status.ps1 @@ -0,0 +1,31 @@ +<# + .SYNOPSIS + Checks drive to see if bitlocker is enabled + .DESCRIPTION + Assumes c, but you can specify a drive if you want. + .PARAMETER Drive + Optional: Specify drive letter if you want to check a drive other than c + .EXAMPLE + Drive d + .NOTES + 9/20/2021 v1 Initial release by @silversword411 with the help of @Ruben +#> + +param ( + [string] $Drive = "c" +) + + +if ((Get-BitLockerVolume -MountPoint $Drive).ProtectionStatus -eq 'On') { + do { + $EncryptionPercentage = (Get-BitLockerVolume -MountPoint $Drive).EncryptionPercentage + Write-Output "BitLocker Encryption Percentage: $EncryptionPercentage" + Start-Sleep -Seconds 5 + } until ($EncryptionPercentage -match 100) + Write-Output "Bitlocker is enabled and Encryption completed" + Exit 1 +} +else { + Write-Output "BitLocker is not turned on for this volume!" + Exit 0 +} \ No newline at end of file diff --git a/scripts/Win_Bitlocker_Encrypted_Drive_c.ps1 b/scripts/Win_Bitlocker_Encrypted_Drive_c.ps1 deleted file mode 100644 index 731f916c6c..0000000000 --- a/scripts/Win_Bitlocker_Encrypted_Drive_c.ps1 +++ /dev/null @@ -1,10 +0,0 @@ -## Copied from https://github.com/ThatsNASt/tacticalrmm to add to new pull request for https://github.com/wh1te909/tacticalrmm - -$x = Get-WMIObject -Namespace "root/CIMV2/Security/MicrosoftVolumeEncryption" -query "SELECT * FROM Win32_EncryptableVolume WHERE DriveLetter='C:'"; -$y = $x.GetProtectionStatus().ProtectionStatus - if ($y -eq 1) { - Write-Host "OK"; exit 0 - } - else { - Write-Host "FAIL $y"; exit 1 - } \ No newline at end of file diff --git a/scripts/Win_Chocolatey_Manage_Apps_Bulk.ps1 b/scripts/Win_Chocolatey_Manage_Apps_Bulk.ps1 index e69bc83de4..c97fa53774 100644 --- a/scripts/Win_Chocolatey_Manage_Apps_Bulk.ps1 +++ b/scripts/Win_Chocolatey_Manage_Apps_Bulk.ps1 @@ -15,6 +15,8 @@ Mode upgrade Hosts 50 .EXAMPLE Mode uninstall PackageName googlechrome + .NOTES + 9/2021 v1 Initial release by @silversword411 and @bradhawkins #> param ( diff --git a/scripts/Win_Rename_Computer.ps1 b/scripts/Win_Computer_Rename.ps1 similarity index 90% rename from scripts/Win_Rename_Computer.ps1 rename to scripts/Win_Computer_Rename.ps1 index 8e97d2e9af..5a4eda9dda 100644 --- a/scripts/Win_Rename_Computer.ps1 +++ b/scripts/Win_Computer_Rename.ps1 @@ -24,7 +24,10 @@ Results are printed to the console. .EXAMPLE - PS C:\> .\Win_Rename_Computer.ps1 -Username myuser -Password mypassword -NewName mynewname -Restart + -NewName mynewname + +.EXAMPLE + -Username myuser -Password mypassword -NewName mynewname -Restart .NOTES Change Log @@ -39,7 +42,7 @@ param( [string] $NewName ) -if (!$NewName){ +if (!$NewName) { Write-Host "-NewName parameter required." Exit 1 } @@ -49,7 +52,8 @@ if ((Get-WmiObject win32_computersystem).partofdomain -eq $false) { if ($Restart) { Rename-computer -NewName $NewName -Force -Restart - } else { + } + else { Rename-computer -NewName $NewName -Force } Write-Host "Attempted rename of computer to $NewName." @@ -58,12 +62,12 @@ if ((Get-WmiObject win32_computersystem).partofdomain -eq $false) { else { # Rename Domain Joined Computer - if (!$Username){ + if (!$Username) { Write-Host "-Username parameter required on domain joined computers." Exit 1 } - if (!$Password){ + if (!$Password) { Write-Host "-Password parameter required on domain joined computers." Exit 1 } @@ -76,7 +80,8 @@ else { if ($Restart) { Rename-computer -NewName $NewName -DomainCredential $credential -Force -Restart - } else { + } + else { Rename-computer -NewName $NewName -DomainCredential $credential -Force } Write-Host "Attempted rename of domain computer to $NewName." diff --git a/scripts/Win_Defender_QuickScan_Background.ps1 b/scripts/Win_Defender_QuickScan_Background.ps1 index c4cf3f6fb8..238220ad6e 100644 --- a/scripts/Win_Defender_QuickScan_Background.ps1 +++ b/scripts/Win_Defender_QuickScan_Background.ps1 @@ -1,2 +1,2 @@ -Write-Host "Running Windows Defender Full Scan in Background" -ForegroundColor Green -Start-MpScan -ScanPath C:\ -ScanType QuickScan -AsJob \ No newline at end of file +Write-Host "Running Windows Defender Quick Scan in Background" -ForegroundColor Green +Start-MpScan -ScanType QuickScan -AsJob diff --git a/scripts/Win_Duplicati_Install.bat b/scripts/Win_Duplicati_Install.bat new file mode 100644 index 0000000000..ab55eabf0e --- /dev/null +++ b/scripts/Win_Duplicati_Install.bat @@ -0,0 +1,40 @@ +if not exist C:\TEMP\ md C:\TEMP\ +cd c:\temp\ + +cd c:\temp +powershell Invoke-WebRequest https://github.com/duplicati/duplicati/releases/download/v2.0.6.100-2.0.6.100_canary_2021-08-11/duplicati-2.0.6.100_canary_2021-08-11-x64.msi -Outfile duplicati.msi +start /wait msiexec /i duplicati.msi /l*v C:\temp\duplicatiinst.txt /qn +REM Kill Duplicati +taskkill /IM "Duplicati*" /F +"C:\Program Files\Duplicati 2\Duplicati.WindowsService.exe" install +sc start Duplicati +del "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Duplicati 2.lnk" +del "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\Duplicati 2.lnk" +del "C:\Users\Public\Desktop\Duplicati 2.lnk" + +( +echo REM Create Running Status +echo EVENTCREATE /T INFORMATION /L APPLICATION /SO Duplicati2 /ID 205 /D "%DUPLICATI__BACKUP_NAME% - Starting Duplicati Backup Job" +)>"C:\Program Files\Duplicati 2\Duplicati_Before.bat" + +( +echo REM Create Result Status from Parsed Results +echo SET DSTATUS=%DUPLICATI__PARSED_RESULT% +echo If %DSTATUS%==Fatal GOTO DSError +echo If %DSTATUS%==Error GOTO DSError +echo If %DSTATUS%==Unknown GOTO DSWarning +echo If %DSTATUS%==Warning GOTO DSWarning +echo If %DSTATUS%==Success GOTO DSSuccess +echo GOTO END +echo :DSError +echo EVENTCREATE /T ERROR /L APPLICATION /SO Duplicati2 /ID 202 /D "%DUPLICATI__BACKUP_NAME% - Error running Duplicati Backup Job" +echo GOTO END +echo :DSWarning +echo EVENTCREATE /T WARNING /L APPLICATION /SO Duplicati2 /ID 201 /D "%DUPLICATI__BACKUP_NAME% - Warning running Duplicati Backup Job" +echo GOTO END +echo :DSSuccess +echo EVENTCREATE /T SUCCESS /L APPLICATION /SO Duplicati2 /ID 200 /D "%DUPLICATI__BACKUP_NAME% - Success in running Duplicati Backup Job" +echo GOTO END +echo :END +echo SET DSTATUS= +)>"C:\Program Files\Duplicati 2\Duplicati_After.bat" \ No newline at end of file diff --git a/scripts/Win_Sync_Time.bat b/scripts/Win_Time_Sync.bat similarity index 97% rename from scripts/Win_Sync_Time.bat rename to scripts/Win_Time_Sync.bat index 05388da23e..99a9e9bd0b 100644 --- a/scripts/Win_Sync_Time.bat +++ b/scripts/Win_Time_Sync.bat @@ -1,2 +1,2 @@ -REM Syncs time with domain controller -net time %logonserver% /set /y +REM Syncs time with domain controller +net time %logonserver% /set /y diff --git a/scripts/Win_Reset_Windows_Update.ps1 b/scripts/Win_Windows_Update_Reset.ps1 similarity index 100% rename from scripts/Win_Reset_Windows_Update.ps1 rename to scripts/Win_Windows_Update_Reset.ps1 diff --git a/scripts_wip/Win_Bitlocker_Enable.ps1 b/scripts_wip/Win_Bitlocker_Enable.ps1 new file mode 100644 index 0000000000..5127c96c58 --- /dev/null +++ b/scripts_wip/Win_Bitlocker_Enable.ps1 @@ -0,0 +1,27 @@ +<# +.SYNOPSIS + Enables Bitlocker + +.DESCRIPTION + Enables bitlocker, and shows recovery keys + +.OUTPUTS + Results are printed to the console. + +.NOTES + Change Log + V1.0 Initial release from dinger1986 https://discord.com/channels/736478043522072608/744281869499105290/836871708790882384 +#> + +If(!(test-path C:\TEMP\)) +{ + New-Item -ItemType Directory -Force -Path C:\TEMP\ +} + +Enable-Bitlocker -MountPoint c: -UsedSpaceOnly -SkipHardwareTest -RecoveryPasswordProtector +manage-bde -protectors C: -get + +$bitlockerkey = manage-bde -protectors C: -get +( +echo $bitlockerkey +)>"C:\Temp\bitlockerkey.txt" \ No newline at end of file diff --git a/scripts_wip/Win_Chrome_Check_Version.ps1 b/scripts_wip/Win_Chrome_Check_Version.ps1 new file mode 100644 index 0000000000..cf2ce93498 --- /dev/null +++ b/scripts_wip/Win_Chrome_Check_Version.ps1 @@ -0,0 +1,10 @@ +## Getting Chrome version + +$ResultWow6432 = (Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object { $_ -match "Chrome" } | Select-Object -ExpandProperty DisplayVersion) +$Result = (Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object { $_ -match "Chrome" } | Select-Object -ExpandProperty DisplayVersion) + +if ($ResultWow6432) { + +} +Write-Output "Version Wow6432: $($ResultWow6432)`r" +Write-Output "Version: $($Result)`r" diff --git a/scripts_wip/Win_Dell_Command_Install.ps1 b/scripts_wip/Win_Dell_Command_Install.ps1 new file mode 100644 index 0000000000..89f81caefa --- /dev/null +++ b/scripts_wip/Win_Dell_Command_Install.ps1 @@ -0,0 +1,31 @@ + + +$Source = "https://davidthegeek.com/utils/dell/DCU_4.3.0.EXE" +$SourceDownloadLocation = "C:\temp\Dell_Command_Update_4.3" +$SourceInstallFile = "$SourceDownloadLocation\DCU_Setup_4_3_0.exe" +$ProgressPreference = 'SilentlyContinue' + +If (Test-Path -Path $SourceInstallFile -PathType Leaf) { + + $proc = Start-Process "$SourceInstallFile" -ArgumentList "/s" -PassThru + Wait-Process -InputObject $proc + if ($proc.ExitCode -ne 0) { + Write-Warning "Exited with error code: $($proc.ExitCode)" + }else{ + Write-Output "Successful install with exit code: $($proc.ExitCode)" + } + + +}else{ + + New-Item -Path $SourceDownloadLocation -ItemType directory + Invoke-WebRequest $Source -OutFile $SourceInstallFile + + $proc = Start-Process "$SourceInstallFile" -ArgumentList "/s" -PassThru + Wait-Process -InputObject $proc + if ($proc.ExitCode -ne 0) { + Write-Warning "Exited with error code: $($proc.ExitCode)" + }else{ + Write-Output "Successful install with exit code: $($proc.ExitCode)" + } +} \ No newline at end of file diff --git a/scripts/Win_Install_Duplicati.ps1 b/scripts_wip/Win_Duplicati_Install.ps1 similarity index 100% rename from scripts/Win_Install_Duplicati.ps1 rename to scripts_wip/Win_Duplicati_Install.ps1 diff --git a/scripts_wip/Win_Hardware_Disk_SMART.ps1 b/scripts_wip/Win_Hardware_Disk_SMART.ps1 new file mode 100644 index 0000000000..fa5ea446eb --- /dev/null +++ b/scripts_wip/Win_Hardware_Disk_SMART.ps1 @@ -0,0 +1,126 @@ +# From nullzilla + +# Requires -Version 3.0 +# Requires -RunAsAdministrator + +# If this is a virtual machine, we don't need to continue +$Computer = Get-CimInstance -ClassName 'Win32_ComputerSystem' +if ($Computer.Model -like 'Virtual*') { + exit +} + +$disks = (Get-CimInstance -Namespace 'Root\WMI' -ClassName 'MSStorageDriver_FailurePredictStatus' | Select-Object 'InstanceName') + +$Warnings = @() + +foreach ($disk in $disks.InstanceName) { + # Retrieve SMART data + $SmartData = (Get-CimInstance -Namespace 'Root\WMI' -ClassName 'MSStorageDriver_ATAPISMartData' | Where-Object 'InstanceName' -eq $disk) + + [Byte[]]$RawSmartData = $SmartData | Select-Object -ExpandProperty 'VendorSpecific' + + # Starting at the third number (first two are irrelevant) + # get the relevant data by iterating over every 12th number + # and saving the values from an offset of the SMART attribute ID + [PSCustomObject[]]$Output = for ($i = 2; $i -lt $RawSmartData.Count; $i++) { + if (0 -eq ($i - 2) % 12 -and $RawSmartData[$i] -ne 0) { + # Construct the raw attribute value by combining the two bytes that make it up + [Decimal]$RawValue = ($RawSmartData[$i + 6] * [Math]::Pow(2, 8) + $RawSmartData[$i + 5]) + + $InnerOutput = [PSCustomObject]@{ + DiskID = $disk + ID = $RawSmartData[$i] + #Flags = $RawSmartData[$i + 1] + #Value = $RawSmartData[$i + 3] + Worst = $RawSmartData[$i + 4] + RawValue = $RawValue + } + + $InnerOutput + } + } + + # Reallocated Sectors Count + $Warnings += $Output | Where-Object ID -eq 5 | Where-Object RawValue -gt 1 | Format-Table + + # Spin Retry Count + $Warnings += $Output | Where-Object ID -eq 10 | Where-Object RawValue -ne 0 | Format-Table + + # Recalibration Retries + $Warnings += $Output | Where-Object ID -eq 11 | Where-Object RawValue -ne 0 | Format-Table + + # Used Reserved Block Count Total + $Warnings += $Output | Where-Object ID -eq 179 | Where-Object RawValue -gt 1 | Format-Table + + # Erase Failure Count + $Warnings += $Output | Where-Object ID -eq 182 | Where-Object RawValue -ne 0 | Format-Table + + # SATA Downshift Error Count or Runtime Bad Block + $Warnings += $Output | Where-Object ID -eq 183 | Where-Object RawValue -ne 0 | Format-Table + + # End-to-End error / IOEDC + $Warnings += $Output | Where-Object ID -eq 184 | Where-Object RawValue -ne 0 | Format-Table + + # Reported Uncorrectable Errors + $Warnings += $Output | Where-Object ID -eq 187 | Where-Object RawValue -ne 0 | Format-Table + + # Command Timeout + $Warnings += $Output | Where-Object ID -eq 188 | Where-Object RawValue -gt 2 | Format-Table + + # High Fly Writes + $Warnings += $Output | Where-Object ID -eq 189 | Where-Object RawValue -ne 0 | Format-Table + + # Temperature Celcius + $Warnings += $Output | Where-Object ID -eq 194 | Where-Object RawValue -gt 50 | Format-Table + + # Reallocation Event Count + $Warnings += $Output | Where-Object ID -eq 196 | Where-Object RawValue -ne 0 | Format-Table + + # Current Pending Sector Count + $Warnings += $Output | Where-Object ID -eq 197 | Where-Object RawValue -ne 0 | Format-Table + + # Uncorrectable Sector Count + $Warnings += $Output | Where-Object ID -eq 198 | Where-Object RawValue -ne 0 | Format-Table + + # UltraDMA CRC Error Count + $Warnings += $Output | Where-Object ID -eq 199 | Where-Object RawValue -ne 0 | Format-Table + + # Soft Read Error Rate + $Warnings += $Output | Where-Object ID -eq 201 | Where-Object Worst -lt 95 | Format-Table + + # SSD Life Left + $Warnings += $Output | Where-Object ID -eq 231 | Where-Object Worst -lt 50 | Format-Table + + # SSD Media Wear Out Indicator + $Warnings += $Output | Where-Object ID -eq 233 | Where-Object Worst -lt 50 | Format-Table + +} + +$Warnings += Get-CimInstance -Namespace 'Root\WMI' -ClassName 'MSStorageDriver_FailurePredictStatus' | +Select-Object InstanceName, PredictFailure, Reason | +Where-Object { $_.PredictFailure -ne $False } | Format-Table + +$Warnings += Get-CimInstance -ClassName 'Win32_DiskDrive' | +Select-Object Model, SerialNumber, Name, Size, Status | +Where-Object { $_.status -ne 'OK' } | Format-Table + +$Warnings += Get-PhysicalDisk | +Select-Object FriendlyName, Size, MediaType, OperationalStatus, HealthStatus | +Where-Object { $_.OperationalStatus -ne 'OK' -or $_.HealthStatus -ne 'Healthy' } | Format-Table + +if ($Warnings) { + $Warnings = $warnings | Out-String + $Warnings + Write-Host "$Warnings" + Exit 1 +} + +if ($Error) { + if ($Error -match "Not supported") { + $notsup = "You may need to switch from ACHI to RAID/RST mode, see the link for how to do this non-destructively: https://www.top-password.com/blog/switch-from-raid-to-ahci-without-reinstalling-windows/" + $notsup + } + Write-Host "$Error $notsup" + exit 1 +} + diff --git a/scripts_wip/Win_Location_Enable.ps1 b/scripts_wip/Win_Location_Enable.ps1 new file mode 100644 index 0000000000..5936d45400 --- /dev/null +++ b/scripts_wip/Win_Location_Enable.ps1 @@ -0,0 +1,128 @@ +<# +.SYNOPSIS + Enables Location services in Windows + +.DESCRIPTION + Lets you enable/disable device-wide location or User App location + +.PARAMETER Enable + https://www.tenforums.com/tutorials/13225-turn-off-location-services-windows-10-a.html + user = Enable for User App locations + machine = Enable location for system wide + all = Enables both user and machine + +.PARAMETER Disable + https://www.tenforums.com/tutorials/13225-turn-off-location-services-windows-10-a.html + user = Disable for User App locations + machine = Disable location for system wide + all = Disables both user and machine + +.OUTPUTS + Results are printed to the console. + +.EXAMPLE + -Enable machine + +.EXAMPLE + -Disable all + +.NOTES + Change Log + V1.0 Initial release +#> + + +param ( + [string] $Enable, + [string] $Disable +) + + +# HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location +if (Get-PackageProvider -Name NuGet) { + Write-Output "NuGet Already Added" +} +else { + Write-Host "Installing NuGet" + Install-PackageProvider -Name NuGet -Force +} + +if (Get-Module -ListAvailable -Name RunAsUser) { + Write-Output "RunAsUser Already Installed" +} +else { + Write-Output "Installing RunAsUser" + Install-Module -Name RunAsUser -Force +} + +If (!(test-path $env:programdata\TacticalRMM\temp\)) { + New-Item -ItemType Directory -Force -Path $env:programdata\TacticalRMM\temp\ +} + +If (!(test-path $env:programdata\TacticalRMM\temp\curpsxpolicy.txt)) { + $curexpolicy = Get-ExecutionPolicy + + ( + Write-Output $curexpolicy + )>$env:programdata\TacticalRMM\temp\curpsxpolicy.txt +} +Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell -Name ExecutionPolicy -Value Unrestricted + +if (!$Enable -AND !$Disable) { + Write-Host "At least one parameter is required: Enable or Disable." + Exit 1 +} + +# Used to pull variables in and use them inside the script block. Contains message to show user +Set-Content -Path c:\temp\message.txt -Value $args + +Invoke-AsCurrentUser -scriptblock { + Write-Output "Runasuser started" | Out-File -append -FilePath c:\temp\raulog.txt + $Enable = Get-Content -Path c:\temp\message.txt + Write-Output $Enable | Out-File -append -FilePath c:\temp\raulog.txt + Write-Output "$Enable" | Out-File -append -FilePath c:\temp\raulog.txt + Write-Output "Debug output finished" | Out-File -append -FilePath c:\temp\raulog.txt + + if ($Enable -eq "user" -or $Enable -eq "all") { + # https://www.tenforums.com/tutorials/13225-turn-off-location-services-windows-10-a.html + $registryPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location" + $Name = "Value" + $value = "Allow" + New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType String -Force | Out-Null + Write-Output "Enabled Location for user" | Out-File -append -FilePath c:\temp\raulog.txt + } + elseif ($Disable -eq "user" -or $Disable -eq "all") { + $registryPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location" + $Name = "Value" + $value = "Deny" + New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType String -Force | Out-Null + Write-Output "Disabled Location for user" | Out-File -append -FilePath c:\temp\raulog.txt + } + +} + +$exitcode = Get-Content -Path "c:\temp\raulog.txt" +Write-Host $exitcode + + +$curpsxpol = Get-Content -Path $env:programdata\TacticalRMM\temp\curpsxpolicy.txt; +Set-ExecutionPolicy -ExecutionPolicy $curpsxpol + +if ($Enable -eq "machine" -or $Enable -eq "all") { + # https://www.tenforums.com/tutorials/13225-turn-off-location-services-windows-10-a.html + $registryPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location" + $Name = "Value" + $value = "Allow" + New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType String -Force | Out-Null + Write-Output "Enabled Location for machine" +} + +if ($Disable -eq "machine" -or $Disable -eq "all") { + $registryPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location" + $Name = "Value" + $value = "Deny" + New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType String -Force | Out-Null + Write-Output "Disabled Location for machine" +} + +Remove-Item -path "c:\temp\raulog.txt" \ No newline at end of file diff --git a/scripts_wip/Win_Location_Get.ps1 b/scripts_wip/Win_Location_Get.ps1 new file mode 100644 index 0000000000..a35e0e370f --- /dev/null +++ b/scripts_wip/Win_Location_Get.ps1 @@ -0,0 +1,16 @@ +Add-Type -AssemblyName System.Device #Required to access System.Device.Location namespace +$GeoWatcher = New-Object System.Device.Location.GeoCoordinateWatcher #Create the required object +$GeoWatcher.Start() #Begin resolving current locaton + +while (($GeoWatcher.Status -ne 'Ready') -and ($GeoWatcher.Permission -ne 'Denied')) { + Start-Sleep -Milliseconds 100 #Wait for discovery. +} + +if ($GeoWatcher.Permission -eq 'Denied') { + Write-Error 'Access Denied for Location Information' +} +else { + # $GeoWatcher.Position.Location | Select Latitude,Longitude #Select the relevent results. + $a = $GeoWatcher.Position.Location + write-host "$a" +} \ No newline at end of file diff --git a/scripts_wip/Win_Location_Task_Trigger_On_WLAN_event.ps1 b/scripts_wip/Win_Location_Task_Trigger_On_WLAN_event.ps1 new file mode 100644 index 0000000000..1537145545 --- /dev/null +++ b/scripts_wip/Win_Location_Task_Trigger_On_WLAN_event.ps1 @@ -0,0 +1,9 @@ +# From gretsky +# https://discord.com/channels/736478043522072608/744282073870630912/891008070434558042 + +$CIMTriggerClass = Get-CimClass -ClassName MSFT_TaskEventTrigger -Namespace Root/Microsoft/Windows/TaskScheduler:MSFT_TaskEventTrigger +$Trigger = New-CimInstance -CimClass $CIMTriggerClass -ClientOnly +$Trigger.Subscription = "" +$Trigger.Enabled = $True +$Taskname = 'TacticalRMM_TASKID' +Set-ScheduledTask -TaskName $Taskname -Trigger $Trigger \ No newline at end of file diff --git a/scripts_wip/Win_Screensaver_Activate.ps1 b/scripts_wip/Win_Screensaver_Activate.ps1 new file mode 100644 index 0000000000..6e7f3f85b3 --- /dev/null +++ b/scripts_wip/Win_Screensaver_Activate.ps1 @@ -0,0 +1,60 @@ +<# + .SYNOPSIS + Lets you enable/disable screensaver and set options + + .DESCRIPTION + You can enable and disable the screensaver, Set Timeout, Require password on wake, and change default screensaver + + .PARAMETER Active + 1 = Enable screensaver + 0 = Disable screensaver + + .PARAMETER Timeout + Number in Minutes + + .PARAMETER IsSecure + 1 = Requires password after screensaver activates + 0 = Disabled password requirement + + .PARAMETER ScreensaverName + Can optionally use any of these default windows screensavers: scrnsave.scr (blank), ssText3d.scr, Ribbons.scr, Mystify.scr, Bubbles.scr + + .EXAMPLE + Active 1 Timeout 60 IsSecure 0 Name Bubbles.scr + + .EXAMPLE + Active 0 + + .NOTES + Change Log + V1.0 Initial release +#> + +param ( + [string] $Active, + [string] $Timeout, + [string] $IsSecure, + [string] $ScreensaverName +) + + +# Enable screensaver +Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name ScreenSaveActive -Value $Active + +# Screensaver Timeout Value +Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name ScreenSaveTimeOut -Value $Timeout + +# On resume, display logon screen. +Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name ScreenSaveIsSecure -Value $IsSecure + +# Set Screensaver to blank if not specified +if (!$ScreensaverName) { + Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name scrnsave.exe -Value "c:\windows\system32\scrnsave.scr" + Exit 0 +} +else { + Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name scrnsave.exe -Value "c:\windows\system32\$ScreensaverName" + Exit 0 +} + + diff --git a/scripts_wip/Win_TRMM_Agent_Install.bat b/scripts_wip/Win_TRMM_Agent_Install.bat new file mode 100644 index 0000000000..334b7d9632 --- /dev/null +++ b/scripts_wip/Win_TRMM_Agent_Install.bat @@ -0,0 +1,14 @@ +rem If you want to deploy TRMM agent using AD, intune, mesh, teamviewer, Group Policy GPO etc this is a sample CMD script for deploying tactical + +if not exist C:\TEMP\TRMM md C:\TEMP\TRMM +powershell Set-ExecutionPolicy -ExecutionPolicy Unrestricted +powershell Add-MpPreference -ExclusionPath C:\TEMP\TRMM +powershell Add-MpPreference -ExclusionPath "C:\Program Files\TacticalAgent\*" +powershell Add-MpPreference -ExclusionPath C:\Windows\Temp\winagent-v*.exe +powershell Add-MpPreference -ExclusionPath "C:\Program Files\Mesh Agent\*" +powershell Add-MpPreference -ExclusionPath C:\Windows\Temp\TRMM\* +cd c:\temp\trmm +powershell Invoke-WebRequest "deployment url" -Outfile tactical.exe +"C:\Program Files\TacticalAgent\unins000.exe" /VERYSILENT /SUPPRESSMSGBOXES /FORCECLOSEAPPLICATIONS +start tactical.exe +powershell Remove-MpPreference -ExclusionPath C:\TEMP\TRMM \ No newline at end of file diff --git a/scripts_wip/Win_TRMM_Dupe_Agent_Fix_and_Install.ps1 b/scripts_wip/Win_TRMM_Dupe_Agent_Fix_and_Install.ps1 new file mode 100644 index 0000000000..512f5089da --- /dev/null +++ b/scripts_wip/Win_TRMM_Dupe_Agent_Fix_and_Install.ps1 @@ -0,0 +1,81 @@ +# gretsky https://discord.com/channels/736478043522072608/744281869499105290/890953042332094514 + +$ErrorActionPreference = "SilentlyContinue" +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + +$env:COMPUTERNAME + +$install = $NULL +$serviceName = 'tacticalagent' +$rmmURI = 'https://INSTALL_SCRIPT_LOCATION/rmm.ps1' +$headers = @{ + 'X-API-KEY' = 'YOURAPIKEY' + "Content-Type" = "application/json" +} + +$Model = (Get-WmiObject -Class win32_computersystem -ComputerName localhost).model +if ($Model.toupper().contains('VIRTUAL') -Or ($Model.toupper().contains('PROLIANT')) -Or ($Model.toupper().contains('VMWARE'))) { + Write-Output 'Serveur' + $rmmURI = 'https://INSTALL_SCRIPT_LOCATION/rmm_server.ps1' +} + +$ChkReg = Test-Path 'HKLM:\SOFTWARE\TacticalRMM\' +If ($ChkReg -eq $True) { + $regrmm = Get-ItemProperty -Path HKLM:\SOFTWARE\TacticalRMM\ +} +else { + write-host "Installing, no registry entry" + Invoke-Expression ((new-object System.Net.WebClient).DownloadString($rmmURI)) + Start-Sleep -s 60 +} + +Try { + $rmmagents = Invoke-RestMethod -Method Patch -Headers $headers -uri "https://rmm-api.DOMAIN.COM/agents/listagents/" +} +Catch { + write-host "RMM down ???" + Start-Sleep -s 5 + exit 1 +} + +Foreach ($rmmagent in $rmmagents) { + + $hostname = $rmmagent.hostname + $agent_id = $rmmagent.agent_id + $agentpk = $rmmagent.id + + if ($hostname -eq $env:COMPUTERNAME) { + + if ($agent_id -eq $regrmm.agentid) { + Write-Host 'Not Duplicate!' + $install = "OK" + Start-Sleep -s 5 + } + else { + write-host "delete" $agentpk + $body = "{`"pk`":$agentpk}" + Invoke-RestMethod -Method DELETE -Headers $headers -body $body -uri "https://rmm-api.DOMAIN.COM/agents/uninstall/" + Start-Sleep -s 5 + } + + } +} + +if ($install -eq $NULL) { + + If (Get-Service $serviceName -ErrorAction SilentlyContinue) { + write-host ('Tactical RMM Is Already Installed') + & 'C:\Program Files\TacticalAgent\unins000.exe' /VERYSILENT /SUPPRESSMSGBOXES /FORCECLOSEAPPLICATIONS + Start-Sleep -s 20 + } + Invoke-Expression ((new-object System.Net.WebClient).DownloadString($rmmURI)) + Start-Sleep -s 30 + exit 0 + +} + +if ($install -eq "OK") { + write-host "OK!" + Start-Sleep -s 5 + exit 0 +} \ No newline at end of file diff --git a/scripts_wip/Win_TRMM_Remove_and_unjoin_from_AzureAD.ps1 b/scripts_wip/Win_TRMM_Remove_and_unjoin_from_AzureAD.ps1 new file mode 100644 index 0000000000..ab63292f28 --- /dev/null +++ b/scripts_wip/Win_TRMM_Remove_and_unjoin_from_AzureAD.ps1 @@ -0,0 +1,25 @@ +# gretsky https://discord.com/channels/736478043522072608/744281869499105290/890996626716508180 +# remove non domain joined device from trmm and unjoin them from Azure Ad + +$domain = (Get-WmiObject -Class win32_computersystem -ComputerName localhost).domain +if ($domain.toupper().contains('DOMAIN')) { + Write-Output 'DOMAIN OK' +} +else { + $ChkReg = Test-Path 'HKLM:\SOFTWARE\TacticalRMM\' + If ($ChkReg -eq $True) { + $regrmm = Get-ItemProperty -Path HKLM:\SOFTWARE\TacticalRMM\ + & 'C:\Program Files\TacticalAgent\unins000.exe' /VERYSILENT /SUPPRESSMSGBOXES /FORCECLOSEAPPLICATIONS + start-sleep -s 20 + } + dsregcmd.exe /debug /leave + $Location = 'hklm:\SOFTWARE\Policies\Microsoft\Windows\WorkplaceJoin' + + if ( !(Test-Path $Location) ) { + New-item -path $Location + New-ItemProperty -Path $Location -Name "BlockAADWorkplaceJoin" -PropertyType Dword -Value "1" + } + + Start-Sleep -s 20 + exit 0 +} \ No newline at end of file diff --git a/scripts_wip/Win_User_GetIdleTimev1.ps1 b/scripts_wip/Win_User_GetIdleTimev1.ps1 new file mode 100644 index 0000000000..ed0ab85260 --- /dev/null +++ b/scripts_wip/Win_User_GetIdleTimev1.ps1 @@ -0,0 +1,79 @@ + + +if (Get-Module -ListAvailable -Name RunAsUser) { +} +else { + Install-Module RunAsUser -force +} +if (-not (Test-Path -LiteralPath C:\Temp)) { + + try { + New-Item -Path C:\Temp -ItemType Directory -ErrorAction Stop | Out-Null #-Force + } + catch { + Write-Error -Message "Unable to create directory 'C:\Temp'. Error was: $_" -ErrorAction Stop + } + "Successfully created directory 'C:\Temp'." + +} +else { +} +$scriptblock = { + Add-Type @' +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace PInvoke.Win32 { + + public static class UserInput { + + [DllImport("user32.dll", SetLastError=false)] + private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); + + [StructLayout(LayoutKind.Sequential)] + private struct LASTINPUTINFO { + public uint cbSize; + public int dwTime; + } + + public static DateTime LastInput { + get { + DateTime bootTime = DateTime.UtcNow.AddMilliseconds(-Environment.TickCount); + DateTime lastInput = bootTime.AddMilliseconds(LastInputTicks); + return lastInput; + } + } + + public static TimeSpan IdleTime { + get { + return DateTime.UtcNow.Subtract(LastInput); + } + } + + public static int LastInputTicks { + get { + LASTINPUTINFO lii = new LASTINPUTINFO(); + lii.cbSize = (uint)Marshal.SizeOf(typeof(LASTINPUTINFO)); + GetLastInputInfo(ref lii); + return lii.dwTime; + } + } + } +} +'@ + + $Last = [PInvoke.Win32.UserInput]::LastInput + $Idle = [PInvoke.Win32.UserInput]::IdleTime + $DTnow = [DateTimeOffset]::Now + + $LastStr = $Last.ToLocalTime().ToString("MMM d h:mm tt") + $IdleStr = $Idle.ToString("d\d\ h\h\ m\m") + $DTnowStr = $DTnow.ToString("MMM d h:mm tt") + "Device is idle for $IdleStr" | Out-File C:\Temp\IdleTime.txt + +} +invoke-ascurrentuser -scriptblock $scriptblock -NoWait | Out-Null +Start-Sleep -Seconds 2 +type "C:\Temp\IdleTime.txt" +del "C:\Temp\IdleTime.txt" \ No newline at end of file diff --git a/scripts_wip/Win_User_GetIdleTimev2.ps1 b/scripts_wip/Win_User_GetIdleTimev2.ps1 new file mode 100644 index 0000000000..b7d14cedf3 --- /dev/null +++ b/scripts_wip/Win_User_GetIdleTimev2.ps1 @@ -0,0 +1,88 @@ +# bradhawkins https://discord.com/channels/736478043522072608/744281869499105290/890570620469915698 + +$idlecode = @' +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace PInvoke.Win32 { + + public static class UserInput { + + [DllImport("user32.dll", SetLastError=false)] + private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); + + [StructLayout(LayoutKind.Sequential)] + private struct LASTINPUTINFO { + public uint cbSize; + public int dwTime; + } + + public static DateTime LastInput { + get { + DateTime bootTime = DateTime.UtcNow.AddMilliseconds(-Environment.TickCount); + DateTime lastInput = bootTime.AddMilliseconds(LastInputTicks); + return lastInput; + } + } + + public static TimeSpan IdleTime { + get { + return DateTime.UtcNow.Subtract(LastInput); + } + } + + public static int LastInputTicks { + get { + LASTINPUTINFO lii = new LASTINPUTINFO(); + lii.cbSize = (uint)Marshal.SizeOf(typeof(LASTINPUTINFO)); + GetLastInputInfo(ref lii); + return lii.dwTime; + } + } + } +} +'@ + +$idlecode2 = @' + +for ( $i = 0; $i -lt 10; $i++ ) { + $Last = [PInvoke.Win32.UserInput]::LastInput + $Idle = [PInvoke.Win32.UserInput]::IdleTime + $LastStr = $Last.ToLocalTime().ToString("MM/dd/yyyy hh:mm tt") + Out-File -FilePath "c:\temp\useridle.txt" -Encoding ascii -Force -InputObject ("Last user keyboard/mouse input: " + $LastStr) + Out-File -FilePath "c:\temp\useridle.txt" -Append -Encoding ascii -Force -InputObject ("Idle for " + $Idle.Days + " days, " + $Idle.Hours + " hours, " + $Idle.Minutes + " minutes, " + $Idle.Seconds + " seconds.") +} +'@ + +$hidecode = @" +command = "powershell.exe -nologo -ExecutionPolicy Bypass -command c:\temp\useridle.ps1" +set shell = CreateObject("WScript.Shell") +shell.Run command,0 +"@ + +Out-File -FilePath "c:\temp\useridle.vbs" -Force -InputObject $hidecode -Encoding ascii +Out-File -FilePath "c:\temp\useridle.ps1" -Force -InputObject "Add-Type @'" -Encoding ascii +Out-File -FilePath "c:\temp\useridle.ps1" -Append -Force -InputObject $idlecode -Encoding ascii +Out-File -FilePath "c:\temp\useridle.ps1" -Append -Force -InputObject "'@" -Encoding ascii +Out-File -FilePath "c:\temp\useridle.ps1" -Append -Force -InputObject $idlecode2 -Encoding ascii + +$action = New-ScheduledTaskAction -Execute "wscript.exe" -Argument "c:\temp\useridle.vbs" +$trigger = New-ScheduledTaskTrigger -AtLogOn +$username = Get-CimInstance -ClassName Win32_ComputerSystem | Select-Object -expand UserName +$principal = New-ScheduledTaskPrincipal -UserId $username +$task = New-ScheduledTask -Action $action -Trigger $trigger -Principal $principal +$taskname = "useridle" +Register-ScheduledTask $taskname -InputObject $task >$null 2>&1 +Start-ScheduledTask -TaskName $taskname +Start-Sleep -Seconds 5 +Unregister-ScheduledTask -TaskName $taskname -Confirm:$false + +$idletime = Get-Content -Path "c:\temp\useridle.txt" +Write-Output $idletime + +Remove-Item -Path "c:\temp\useridle.txt" +Remove-Item -Path "c:\temp\useridle.vbs" +Remove-Item -Path "c:\temp\useridle.ps1" + +exit 0 diff --git a/scripts_wip/Win_Veeam_Backup_Script_Notification.ps1 b/scripts_wip/Win_Veeam_Backup_Script_Notification.ps1 index de65848246..e5623ef3a8 100644 --- a/scripts_wip/Win_Veeam_Backup_Script_Notification.ps1 +++ b/scripts_wip/Win_Veeam_Backup_Script_Notification.ps1 @@ -1,13 +1,13 @@ -Import-Module $env:SyncroModule # Create RMMAlerts when a backup fails -$event = Get-EventLog "Veeam Backup" -newest 1 -After (Get-Date).AddDays(-1)| Where-Object {$_.EventID -eq 0} +$event = Get-EventLog "Veeam Backup" -newest 1 -After (Get-Date).AddDays(-1) | Where-Object { $_.EventID -eq 0 } -if($event.entrytype -eq "Error") { +if ($event.entrytype -eq "Error") { write-host "We got an event that is an error from Veeam Backup!" Rmm-Alert -Category "veeam_backup_failed" -Body "Veeam Backup Failed on $(%computername%) - message: $($event.message)" -} else { +} +else { write-host "No errors here" } diff --git a/troubleshoot_server.sh b/troubleshoot_server.sh new file mode 100644 index 0000000000..2457877098 --- /dev/null +++ b/troubleshoot_server.sh @@ -0,0 +1,275 @@ +#!/bin/bash + +# Tactical RMM install troubleshooting script +# Contributed by https://github.com/dinger1986 + +# This script asks for the 3 subdomains, checks they exist, checks they resolve locally and remotely (using google dns for remote), +# checks services are running, checks ports are opened. The only part that will make the script stop is if the sub domains dont exist, theres literally no point in going further if thats the case + +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +NC='\033[0m' + +# Resolve Locally used DNS server +locdns=$(resolvectl | grep 'Current DNS Server:' | cut -d: -f2 | awk '{ print $1}') + +while [[ $rmmdomain != *[.]*[.]* ]] +do +echo -ne "${YELLOW}Enter the subdomain for the backend (e.g. api.example.com)${NC}: " +read rmmdomain +done + +if ping -c 1 $rmmdomain &> /dev/null +then + echo -ne ${GREEN} Verified $rmmdomain | tee -a checklog.log + printf >&2 "\n\n" +else + echo -ne ${RED} $rmmdomain doesnt exist please create it or check for a typo | tee -a checklog.log + printf >&2 "\n\n" + printf >&2 "You will have a log file called checklog.log in the directory you ran this script from\n\n" + printf >&2 "\n\n" + exit +fi + +while [[ $frontenddomain != *[.]*[.]* ]] +do +echo -ne "${YELLOW}Enter the subdomain for the frontend (e.g. rmm.example.com)${NC}: " +read frontenddomain +done + +if ping -c 1 $frontenddomain &> /dev/null +then + echo -ne ${GREEN} Verified $frontenddomain | tee -a checklog.log + printf >&2 "\n\n" +else + echo -ne ${RED} $frontenddomain doesnt exist please create it or check for a typo | tee -a checklog.log + printf >&2 "\n\n" + printf >&2 "You will have a log file called checklog.log in the directory you ran this script from\n\n" + printf >&2 "\n\n" + exit +fi + +while [[ $meshdomain != *[.]*[.]* ]] +do +echo -ne "${YELLOW}Enter the subdomain for meshcentral (e.g. mesh.example.com)${NC}: " +read meshdomain +done + +if ping -c 1 $meshdomain &> /dev/null +then + echo -ne ${GREEN} Verified $meshdomain | tee -a checklog.log + printf >&2 "\n\n" +else + echo -ne ${RED} $meshdomain doesnt exist please create it or check for a typo | tee -a checklog.log + printf >&2 "\n\n" | tee -a checklog.log + printf >&2 "You will have a log file called checklog.log in the directory you ran this script from\n\n" + printf >&2 "\n\n" + exit +fi + +while [[ $domain != *[.]* ]] +do +echo -ne "${YELLOW}Enter yourdomain used for letsencrypt (e.g. example.com)${NC}: " +read domain +done + + echo -ne ${YELLOW} Checking IPs | tee -a checklog.log + printf >&2 "\n\n" + +# Check rmmdomain IPs +locapiip=`dig @"$locdns" +short $rmmdomain` +remapiip=`dig @8.8.8.8 +short $rmmdomain` + +if [ "$locapiip" = "$remapiip" ]; then + echo -ne ${GREEN} Success $rmmdomain is Locally Resolved: "$locapiip" Remotely Resolved: "$remapiip" | tee -a checklog.log + printf >&2 "\n\n" +else + echo -ne ${RED} Locally Resolved: "$locapiip" Remotely Resolved: "$remapiip" | tee -a checklog.log + printf >&2 "\n\n" | tee -a checklog.log + echo -ne ${RED} Your Local and Remote IP for $rmmdomain all agents will require non-public DNS to find TRMM server | tee -a checklog.log + printf >&2 "\n\n" + +fi + + +# Check Frontenddomain IPs +locrmmip=`dig @"$locdns" +short $frontenddomain` +remrmmip=`dig @8.8.8.8 +short $frontenddomain` + +if [ "$locrmmip" = "$remrmmip" ]; then + echo -ne ${GREEN} Success $frontenddomain is Locally Resolved: "$locrmmip" Remotely Resolved: "$remrmmip"| tee -a checklog.log + printf >&2 "\n\n" +else + echo -ne ${RED} Locally Resolved: "$locrmmip" Remotely Resolved: "$remrmmip" | tee -a checklog.log + printf >&2 "\n\n" | tee -a checklog.log + echo -ne ${RED} echo Your Local and Remote IP for $frontenddomain all agents will require non-public DNS to find TRMM server | tee -a checklog.log + printf >&2 "\n\n" + +fi + +# Check meshdomain IPs +locmeship=`dig @"$locdns" +short $meshdomain` +remmeship=`dig @8.8.8.8 +short $meshdomain` + +if [ "$locmeship" = "$remmeship" ]; then + echo -ne ${GREEN} Success $meshdomain is Locally Resolved: "$locmeship" Remotely Resolved: "$remmeship" | tee -a checklog.log + printf >&2 "\n\n" | tee -a checklog.log +else + echo -ne ${RED} Locally Resolved: "$locmeship" Remotely Resolved: "$remmeship" | tee -a checklog.log + printf >&2 "\n\n" | tee -a checklog.log + echo -ne ${RED} Your Local and Remote IP for $meshdomain all agents will require non-public DNS to find TRMM server | tee -a checklog.log + printf >&2 "\n\n" | tee -a checklog.log + +fi + + echo -ne ${YELLOW} Checking Services | tee -a checklog.log + printf >&2 "\n\n" + +# Check if services are running +rmmstatus=$(systemctl is-active rmm) +daphnestatus=$(systemctl is-active daphne) +celerystatus=$(systemctl is-active celery) +celerybeatstatus=$(systemctl is-active celerybeat) +nginxstatus=$(systemctl is-active nginx) +natsstatus=$(systemctl is-active nats) + +# RMM Service +if [ $rmmstatus = active ]; then + echo -ne ${GREEN} Success RMM Service is Running | tee -a checklog.log + printf >&2 "\n\n" +else + printf >&2 "\n\n" | tee -a checklog.log + echo -ne ${RED} 'RMM Service isnt running (Tactical wont work without this)' | tee -a checklog.log + printf >&2 "\n\n" + +fi + +# daphne Service +if [ $daphnestatus = active ]; then + echo -ne ${GREEN} Success daphne Service is Running | tee -a checklog.log + printf >&2 "\n\n" +else + printf >&2 "\n\n" | tee -a checklog.log + echo -ne ${RED} 'daphne Service isnt running (Tactical wont work without this)' | tee -a checklog.log + printf >&2 "\n\n" + +fi + +# celery Service +if [ $celerystatus = active ]; then + echo -ne ${GREEN} Success celery Service is Running | tee -a checklog.log + printf >&2 "\n\n" +else + printf >&2 "\n\n" | tee -a checklog.log + echo -ne ${RED} 'celery Service isnt running (Tactical wont work without this)' | tee -a checklog.log + printf >&2 "\n\n" + +fi + +# celerybeat Service +if [ $celerybeatstatus = active ]; then + echo -ne ${GREEN} Success celerybeat Service is Running | tee -a checklog.log + printf >&2 "\n\n" +else + printf >&2 "\n\n" | tee -a checklog.log + echo -ne ${RED} 'celerybeat Service isnt running (Tactical wont work without this)' | tee -a checklog.log + printf >&2 "\n\n" + +fi + +# nginx Service +if [ $nginxstatus = active ]; then + echo -ne ${GREEN} Success nginx Service is Running | tee -a checklog.log + printf >&2 "\n\n" +else + printf >&2 "\n\n" | tee -a checklog.log + echo -ne ${RED} 'nginx Service isnt running (Tactical wont work without this)' | tee -a checklog.log + printf >&2 "\n\n" + +fi + +# nats Service +if [ $natsstatus = active ]; then + echo -ne ${GREEN} Success nats Service is running | tee -a checklog.log + printf >&2 "\n\n" +else + printf >&2 "\n\n" | tee -a checklog.log + echo -ne ${RED} 'nats Service isnt running (Tactical wont work without this)' | tee -a checklog.log + printf >&2 "\n\n" + +fi + + echo -ne ${YELLOW} Checking Open Ports | tee -a checklog.log + printf >&2 "\n\n" + +#Get WAN IP +wanip=$(dig @resolver4.opendns.com myip.opendns.com +short) + +echo -ne ${GREEN} WAN IP is $wanip | tee -a checklog.log +printf >&2 "\n\n" + +#Check if NATs Port is open +if ( nc -zv $wanip 4222 2>&1 >/dev/null ); then + echo -ne ${GREEN} 'NATs Port is open' | tee -a checklog.log + printf >&2 "\n\n" +else + echo -ne ${RED} 'NATs port is closed (you may want this if running locally only)' | tee -a checklog.log + printf >&2 "\n\n" +fi + +#Check if HTTPs Port is open +if ( nc -zv $wanip 443 2>&1 >/dev/null ); then + echo -ne ${GREEN} 'HTTPs Port is open' | tee -a checklog.log + printf >&2 "\n\n" +else + echo -ne ${RED} 'HTTPs port is closed (you may want this if running locally only)' | tee -a checklog.log + printf >&2 "\n\n" +fi + + echo -ne ${YELLOW} Checking For Proxy | tee -a checklog.log + printf >&2 "\n\n" + echo -ne ${YELLOW} ......this might take a while!! + printf >&2 "\n\n" + +# Detect Proxy via cert +proxyext=$(openssl s_client -showcerts -servername $remapiip -connect $remapiip:443 2>/dev/null | openssl x509 -inform pem -noout -text) +proxyint=$(openssl s_client -showcerts -servername 127.0.0.1 -connect 127.0.0.1:443 2>/dev/null | openssl x509 -inform pem -noout -text) + +if [[ $proxyext == $proxyint ]]; then + echo -ne ${GREEN} No Proxy detected using Certificate | tee -a checklog.log + printf >&2 "\n\n" +else + echo -ne ${RED} Proxy detected using Certificate | tee -a checklog.log + printf >&2 "\n\n" +fi + +# Detect Proxy via IP +if [ $wanip != $remrmmip ]; then + echo -ne ${RED} Proxy detected using IP | tee -a checklog.log + printf >&2 "\n\n" +else + echo -ne ${GREEN} No Proxy detected using IP | tee -a checklog.log + printf >&2 "\n\n" +fi + + echo -ne ${YELLOW} Checking SSL Certificate is up to date | tee -a checklog.log + printf >&2 "\n\n" + +#SSL Certificate check +cert=$(openssl verify -CAfile /etc/letsencrypt/live/$domain/chain.pem /etc/letsencrypt/live/$domain/cert.pem) + +if [[ "$cert" == *"OK"* ]]; then + echo -ne ${GREEN} SSL Certificate for $domain is fine | tee -a checklog.log + printf >&2 "\n\n" + +else + echo -ne ${RED} SSL Certificate has expired or doesnt exist for $domain | tee -a checklog.log + printf >&2 "\n\n" +fi + + +printf >&2 "\n\n" +echo -ne ${YELLOW} +printf >&2 "You will have a log file called checklog.log in the directory you ran this script from\n\n" +echo -ne ${NC} diff --git a/web/package-lock.json b/web/package-lock.json index 1fb14ca728..d28cd583eb 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -8,19 +8,19 @@ "name": "web", "version": "0.1.8", "dependencies": { - "@quasar/extras": "^1.10.12", + "@quasar/extras": "^1.11.1", "apexcharts": "^3.27.1", - "axios": "^0.21.3", + "axios": "^0.22.0", "dotenv": "^8.6.0", "prismjs": "^1.23.0", "qrcode.vue": "^3.2.2", - "quasar": "^2.0.4", + "quasar": "^2.1.0", "vue-prism-editor": "^2.0.0-alpha.2", "vue3-apexcharts": "^1.4.0", "vuex": "^4.0.2" }, "devDependencies": { - "@quasar/app": "^3.1.0", + "@quasar/app": "^3.1.2", "@quasar/cli": "^1.2.1" } }, @@ -397,6 +397,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -516,9 +517,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.6.tgz", - "integrity": "sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1770,6 +1771,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.14.5", "to-fast-properties": "^2.0.0" @@ -1778,69 +1780,6 @@ "node": ">=6.9.0" } }, - "node_modules/@electron/get": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.12.4.tgz", - "integrity": "sha512-6nr9DbJPUR9Xujw6zD3y+rS95TyItEVM0NVjt1EehY2vUWfIgPiIPVHxCvaTS0xr2B+DRxovYVKbuOWqC35kjg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^9.6.0", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=8.6" - }, - "optionalDependencies": { - "global-agent": "^2.0.2", - "global-tunnel-ng": "^2.7.1" - } - }, - "node_modules/@electron/get/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@electron/get/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/get/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@electron/get/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1892,24 +1831,22 @@ } }, "node_modules/@quasar/app": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@quasar/app/-/app-3.1.0.tgz", - "integrity": "sha512-b0yCblS5yVYxNjFIuCf2xoZZsNXlq1RQM/b2PxZqlGxOWG4AM02HxLSUrb1YvhwnYsYxo2qm1dbF52Ut6oE/iw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@quasar/app/-/app-3.1.2.tgz", + "integrity": "sha512-uJ77V+W5+qDRTom24xBUF0BJp8/GrVhnRNDmhTPpzvt0pXT5lDWiu8QItnZLSi98MwyFFg4dmxx2M9VR28kR5w==", "dev": true, "dependencies": { "@quasar/babel-preset-app": "2.0.1", "@quasar/fastclick": "1.1.4", "@quasar/ssr-helpers": "2.1.1", "@types/cordova": "0.0.34", - "@types/electron-packager": "14.0.0", - "@types/express": "4.17.11", - "@types/terser-webpack-plugin": "5.0.3", - "@types/webpack-bundle-analyzer": "4.4.0", - "@types/webpack-dev-server": "3.11.3", - "@vue/compiler-sfc": "3.2.4", - "@vue/server-renderer": "3.2.4", + "@types/express": "4.17.13", + "@types/webpack-bundle-analyzer": "4.4.1", + "@types/webpack-dev-server": "4.1.0", + "@vue/compiler-sfc": "3.2.19", + "@vue/server-renderer": "3.2.19", "archiver": "5.3.0", - "autoprefixer": "10.3.1", + "autoprefixer": "10.3.6", "browserslist": "^4.12.0", "chalk": "4.1.2", "chokidar": "3.5.2", @@ -1926,12 +1863,12 @@ "express": "4.17.1", "fast-glob": "3.2.7", "file-loader": "6.2.0", - "fork-ts-checker-webpack-plugin": "6.1.0", + "fork-ts-checker-webpack-plugin": "6.3.3", "fs-extra": "10.0.0", "hash-sum": "2.0.0", "html-minifier": "4.0.0", "html-webpack-plugin": "5.3.2", - "inquirer": "8.1.2", + "inquirer": "8.1.5", "isbinaryfile": "4.0.8", "launch-editor-middleware": "2.2.1", "lodash.debounce": "4.0.8", @@ -1947,25 +1884,25 @@ "ouch": "2.0.0", "postcss": "^8.2.10", "postcss-loader": "6.1.1", - "postcss-rtlcss": "3.3.4", + "postcss-rtlcss": "3.4.1", "pretty-error": "3.0.4", "register-service-worker": "1.7.2", "sass": "1.32.12", "sass-loader": "12.1.0", "semver": "7.3.5", "table": "6.7.1", - "terser-webpack-plugin": "5.1.4", - "ts-loader": "8.0.17", - "typescript": "4.2.2", + "terser-webpack-plugin": "5.2.3", + "ts-loader": "9.2.5", + "typescript": "4.4.2", "url-loader": "4.1.1", - "vue": "3.2.4", - "vue-loader": "16.4.1", + "vue": "3.2.19", + "vue-loader": "16.5.0", "vue-router": "4.0.11", "vue-style-loader": "4.1.3", "webpack": "^5.35.0", "webpack-bundle-analyzer": "4.4.2", "webpack-chain": "6.5.1", - "webpack-dev-server": "4.0.0", + "webpack-dev-server": "4.3.0", "webpack-merge": "5.8.0", "webpack-node-externals": "3.0.0" }, @@ -1980,6 +1917,18 @@ "funding": { "type": "github", "url": "https://donate.quasar.dev" + }, + "peerDependencies": { + "electron-builder": "^22.0.0", + "electron-packager": "^15.0.0" + }, + "peerDependenciesMeta": { + "electron-builder": { + "optional": true + }, + "electron-packager": { + "optional": true + } } }, "node_modules/@quasar/app/node_modules/chalk": { @@ -2148,9 +2097,9 @@ } }, "node_modules/@quasar/extras": { - "version": "1.10.12", - "resolved": "https://registry.npmjs.org/@quasar/extras/-/extras-1.10.12.tgz", - "integrity": "sha512-CVSxLw/Z6kaEYrooJX7mpby6YDm0eSa8D9/1+KEfiTYfLrPE4wTRuNGKN5liuLtVhFMdGrEkj6T6DInKpQWW9A==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@quasar/extras/-/extras-1.11.1.tgz", + "integrity": "sha512-/h6EH4+7peanrgT1ErTSG2KwHuVrpnvS3lkmtuErCXrdpiV0z0DpGxdfIjsbhKqAPkAb6h5Zsdh72nBdKp1tsg==", "funding": { "type": "github", "url": "https://donate.quasar.dev" @@ -2209,28 +2158,37 @@ } }, "node_modules/@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz", + "integrity": "sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==", "dev": true, "dependencies": { "@types/connect": "*", "@types/node": "*" } }, + "node_modules/@types/bonjour": { + "version": "3.5.9", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.9.tgz", + "integrity": "sha512-VkZUiYevvtPyFu5XtpYw9a8moCSzxgjs5PAFF4yXjA7eYHvzBlXe+eJdqBBNWWVzI1r7Ki0KxMYvaQuhm+6f5A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/connect": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", - "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.4.tgz", - "integrity": "sha512-Kf8v0wljR5GSCOCF/VQWdV3ZhKOVA73drXtY3geMTQgHy9dgqQ0dLrf31M0hcuWkhFzK5sP0kkS3mJzcKVtZbw==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", "dev": true, "dependencies": { "@types/express-serve-static-core": "*", @@ -2243,18 +2201,6 @@ "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=", "dev": true }, - "node_modules/@types/electron-packager": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@types/electron-packager/-/electron-packager-14.0.0.tgz", - "integrity": "sha512-n47/AbT4DEYPyXtES2myPyKCxVE3hICAB3MnpoVg+Ba8CLBGOpUUsNJ5fyLhfKt5N06sT9nTk4eAc+rtYVpvTQ==", - "dev": true, - "dependencies": { - "@electron/get": "^1.3.1", - "@types/node": "*", - "electron-notarize": "^0.1.1", - "electron-osx-sign": "^0.4.11" - } - }, "node_modules/@types/eslint": { "version": "7.2.13", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.13.tgz", @@ -2282,9 +2228,9 @@ "dev": true }, "node_modules/@types/express": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.11.tgz", - "integrity": "sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg==", + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", "dev": true, "dependencies": { "@types/body-parser": "*", @@ -2294,9 +2240,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.21.tgz", - "integrity": "sha512-gwCiEZqW6f7EoR8TTEfalyEhb1zA5jQJnRngr97+3pzMaO1RKoI1w2bw07TK72renMUVWcWS5mLI6rk1NqN0nA==", + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz", + "integrity": "sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==", "dev": true, "dependencies": { "@types/node": "*", @@ -2350,15 +2296,15 @@ "dev": true }, "node_modules/@types/qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==", + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", "dev": true }, "node_modules/@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, "node_modules/@types/retry": { @@ -2367,10 +2313,19 @@ "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", "dev": true }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, "node_modules/@types/serve-static": { - "version": "1.13.9", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", - "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", "dev": true, "dependencies": { "@types/mime": "^1", @@ -2384,25 +2339,15 @@ "dev": true }, "node_modules/@types/tapable": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.7.tgz", - "integrity": "sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", + "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==", "dev": true }, - "node_modules/@types/terser-webpack-plugin": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/terser-webpack-plugin/-/terser-webpack-plugin-5.0.3.tgz", - "integrity": "sha512-Ef60BOY9hV+yXjkMCuJI17cu1R8/H31n5Rnt1cElJFyBSkbRV3UWyBIYn8YpijsOG05R4bZf3G2azyBHkksu/A==", - "dev": true, - "dependencies": { - "terser": "^5.3.8", - "webpack": "^5.1.0" - } - }, "node_modules/@types/uglify-js": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz", - "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", + "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", "dev": true, "dependencies": { "source-map": "^0.6.1" @@ -2418,9 +2363,9 @@ } }, "node_modules/@types/webpack": { - "version": "4.41.29", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.29.tgz", - "integrity": "sha512-6pLaORaVNZxiB3FSHbyBiWM7QdazAWda1zvAq4SbZObZqHSDbWLi62iFdblVea6SK9eyBIVp5yHhKt/yNQdR7Q==", + "version": "4.41.31", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.31.tgz", + "integrity": "sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ==", "dev": true, "dependencies": { "@types/node": "*", @@ -2432,9 +2377,9 @@ } }, "node_modules/@types/webpack-bundle-analyzer": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.0.tgz", - "integrity": "sha512-8evCbPtT2jOUhVGgVDSzk3Y2g4oaxIkakqTj66vRrYjbOoIGmKJSnS4COObwffByiOEYxW7U8ymq9ae9qlH62Q==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.1.tgz", + "integrity": "sha512-yQAj3l7bIYL+QRRlNJt6gyP+zrXZOlgaR4wsX0WY4yzZIbv41ZibREfZvuYjxY0iVtvQQlbhx0AeokkCuqUAQg==", "dev": true, "dependencies": { "@types/node": "*", @@ -2442,39 +2387,38 @@ "webpack": "^5" } }, + "node_modules/@types/webpack-dev-middleware": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/webpack-dev-middleware/-/webpack-dev-middleware-5.0.2.tgz", + "integrity": "sha512-S3WUtef//Vx6WETyWZkM45WqgRxWSaqbpWtPcKySNRhiQNyhCqM9EueggaMX3L9N2IbG4dJIK5PgYcAWUifUbA==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "tapable": "^2.1.1", + "webpack": "^5.38.1" + } + }, "node_modules/@types/webpack-dev-server": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", - "integrity": "sha512-p9B/QClflreKDeamKhBwuo5zqtI++wwb9QNG/CdIZUFtHvtaq0dWVgbtV7iMl4Sr4vWzEFj0rn16pgUFANjLPA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-4.1.0.tgz", + "integrity": "sha512-7nylorFi/q2+TDro3U6q7S/AKIKs0x1hQUqgXAGNRC84owYVH/Av6ishEhgU2z9YUx2pNYU9BWz0qF4S34b6/g==", "dev": true, "dependencies": { + "@types/bonjour": "*", "@types/connect-history-api-fallback": "*", "@types/express": "*", + "@types/serve-index": "*", "@types/serve-static": "*", "@types/webpack": "^4", - "http-proxy-middleware": "^1.0.0" - } - }, - "node_modules/@types/webpack-dev-server/node_modules/http-proxy-middleware": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz", - "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==", - "dev": true, - "dependencies": { - "@types/http-proxy": "^1.17.5", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=8.0.0" + "@types/webpack-dev-middleware": "*", + "chokidar": "^3.5.1", + "http-proxy-middleware": "^2.0.0" } }, "node_modules/@types/webpack-sources": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", - "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", "dev": true, "dependencies": { "@types/node": "*", @@ -2501,14 +2445,13 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.4.tgz", - "integrity": "sha512-c8NuQq7mUXXxA4iqD5VUKpyVeklK53+DMbojYMyZ0VPPrb0BUWrZWFiqSDT+MFDv0f6Hv3QuLiHWb1BWMXBbrw==", - "dependencies": { - "@babel/parser": "^7.12.0", - "@babel/types": "^7.12.0", - "@vue/shared": "3.2.4", - "estree-walker": "^2.0.1", + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.19.tgz", + "integrity": "sha512-8dOPX0YOtaXol0Zf2cfLQ4NU/yHYl2H7DCKsLEZ7gdvPK6ZSEwGLJ7IdghhY2YEshEpC5RB9QKdC5I07z8Dtjg==", + "dependencies": { + "@babel/parser": "^7.15.0", + "@vue/shared": "3.2.19", + "estree-walker": "^2.0.2", "source-map": "^0.6.1" } }, @@ -2521,62 +2464,46 @@ } }, "node_modules/@vue/compiler-dom": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.4.tgz", - "integrity": "sha512-uj1nwO4794fw2YsYas5QT+FU/YGrXbS0Qk+1c7Kp1kV7idhZIghWLTjyvYibpGoseFbYLPd+sW2/noJG5H04EQ==", + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.19.tgz", + "integrity": "sha512-WzQoE8rfkFjPtIioc7SSgTsnz9g2oG61DU8KHnzPrRS7fW/lji6H2uCYJfp4Z6kZE8GjnHc1Ljwl3/gxDes0cw==", "dependencies": { - "@vue/compiler-core": "3.2.4", - "@vue/shared": "3.2.4" + "@vue/compiler-core": "3.2.19", + "@vue/shared": "3.2.19" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.4.tgz", - "integrity": "sha512-GM+ouDdDzhqgkLmBH4bgq4kiZxJQArSppJiZHWHIx9XRaefHLmc1LBNPmN8ivm4SVfi2i7M2t9k8ZnjsScgzPQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.13.9", - "@babel/types": "^7.13.0", - "@types/estree": "^0.0.48", - "@vue/compiler-core": "3.2.4", - "@vue/compiler-dom": "3.2.4", - "@vue/compiler-ssr": "3.2.4", - "@vue/shared": "3.2.4", - "consolidate": "^0.16.0", - "estree-walker": "^2.0.1", - "hash-sum": "^2.0.0", - "lru-cache": "^5.1.1", + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.19.tgz", + "integrity": "sha512-pLlbgkO1UHTO02MSpa/sFOXUwIDxSMiKZ1ozE5n71CY4DM+YmI+G3gT/ZHZ46WBId7f3VTF/D8pGwMygcQbrQA==", + "dependencies": { + "@babel/parser": "^7.15.0", + "@vue/compiler-core": "3.2.19", + "@vue/compiler-dom": "3.2.19", + "@vue/compiler-ssr": "3.2.19", + "@vue/ref-transform": "3.2.19", + "@vue/shared": "3.2.19", + "estree-walker": "^2.0.2", "magic-string": "^0.25.7", - "merge-source-map": "^1.1.0", "postcss": "^8.1.10", - "postcss-modules": "^4.0.0", - "postcss-selector-parser": "^6.0.4", "source-map": "^0.6.1" } }, - "node_modules/@vue/compiler-sfc/node_modules/@types/estree": { - "version": "0.0.48", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.48.tgz", - "integrity": "sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew==", - "dev": true - }, "node_modules/@vue/compiler-sfc/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.4.tgz", - "integrity": "sha512-bKZuXu9/4XwsFHFWIKQK+5kN7mxIIWmMmT2L4VVek7cvY/vm3p4WTsXYDGZJy0htOTXvM2ifr6sflg012T0hsw==", - "dev": true, + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.19.tgz", + "integrity": "sha512-oLon0Cn3O7WEYzzmzZavGoqXH+199LT+smdjBT3Uf3UX4HwDNuBFCmvL0TsqV9SQnIgKvBRbQ7lhbpnd4lqM3w==", "dependencies": { - "@vue/compiler-dom": "3.2.4", - "@vue/shared": "3.2.4" + "@vue/compiler-dom": "3.2.19", + "@vue/shared": "3.2.19" } }, "node_modules/@vue/devtools-api": { @@ -2585,49 +2512,60 @@ "integrity": "sha512-44fPrrN1cqcs6bFkT0C+yxTM6PZXLbR+ESh1U1j8UD22yO04gXvxH62HApMjLbS3WqJO/iCNC+CYT+evPQh2EQ==" }, "node_modules/@vue/reactivity": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.4.tgz", - "integrity": "sha512-ljWTR0hr8Tn09hM2tlmWxZzCBPlgGLnq/k8K8X6EcJhtV+C8OzFySnbWqMWataojbrQOocThwsC8awKthSl2uQ==", + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.19.tgz", + "integrity": "sha512-FtachoYs2SnyrWup5UikP54xDX6ZJ1s5VgHcJp4rkGoutU3Ry61jhs+nCX7J64zjX992Mh9gGUC0LqTs8q9vCA==", + "dependencies": { + "@vue/shared": "3.2.19" + } + }, + "node_modules/@vue/ref-transform": { + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@vue/ref-transform/-/ref-transform-3.2.19.tgz", + "integrity": "sha512-03wwUnoIAeKti5IGGx6Vk/HEBJ+zUcm5wrUM3+PQsGf7IYnXTbeIfHHpx4HeSeWhnLAjqZjADQwW8uA4rBmVbg==", "dependencies": { - "@vue/shared": "3.2.4" + "@babel/parser": "^7.15.0", + "@vue/compiler-core": "3.2.19", + "@vue/shared": "3.2.19", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" } }, "node_modules/@vue/runtime-core": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.4.tgz", - "integrity": "sha512-W6PtEOs8P8jKYPo3JwaMAozZQivxInUleGfNwI2pK1t8ZLZIxn4kAf7p4VF4jJdQB8SZBzpfWdLUc06j7IOmpQ==", + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.19.tgz", + "integrity": "sha512-qArZSWKxWsgKfxk9BelZ32nY0MZ31CAW2kUUyVJyxh4cTfHaXGbjiQB5JgsvKc49ROMNffv9t3/qjasQqAH+RQ==", "dependencies": { - "@vue/reactivity": "3.2.4", - "@vue/shared": "3.2.4" + "@vue/reactivity": "3.2.19", + "@vue/shared": "3.2.19" } }, "node_modules/@vue/runtime-dom": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.4.tgz", - "integrity": "sha512-HcVtLyn2SGwsf6BFPwkvDPDOhOqkOKcfHDpBp5R1coX+qMsOFrY8lJnGXIY+JnxqFjND00E9+u+lq5cs/W7ooA==", + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.19.tgz", + "integrity": "sha512-hIRboxXwafeHhbZEkZYNV0MiJXPNf4fP0X6hM2TJb0vssz8BKhD9cF92BkRgZztTQevecbhk0gu4uAPJ3dxL9A==", "dependencies": { - "@vue/runtime-core": "3.2.4", - "@vue/shared": "3.2.4", + "@vue/runtime-core": "3.2.19", + "@vue/shared": "3.2.19", "csstype": "^2.6.8" } }, "node_modules/@vue/server-renderer": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.4.tgz", - "integrity": "sha512-ai9WxJ78nnUDk+26vwZhlA1Quz3tA+90DgJX6iseen2Wwnndd91xicFW+6ROR/ZP0yFNuQ017eZJBw8OqoPL+w==", - "dev": true, + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.19.tgz", + "integrity": "sha512-A9FNT7fgQJXItwdzWREntAgWKVtKYuXHBKGev/H4+ByTu8vB7gQXGcim01QxaJshdNg4dYuH2tEBZXCNCNx+/w==", "dependencies": { - "@vue/compiler-ssr": "3.2.4", - "@vue/shared": "3.2.4" + "@vue/compiler-ssr": "3.2.19", + "@vue/shared": "3.2.19" }, "peerDependencies": { - "vue": "3.2.4" + "vue": "3.2.19" } }, "node_modules/@vue/shared": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.4.tgz", - "integrity": "sha512-j2j1MRmjalVKr3YBTxl/BClSIc8UQ8NnPpLYclxerK65JIowI4O7n8O8lElveEtEoHxy1d7BelPUDI0Q4bumqg==" + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.19.tgz", + "integrity": "sha512-Knqhx7WieLdVgwCAZgTVrDCXZ50uItuecLh9JdLC8O+a5ayaSyIQYveUK3hCRNC7ws5zalHmZwfdLMGaS8r4Ew==" }, "node_modules/@webassemblyjs/ast": { "version": "1.11.0", @@ -2945,10 +2883,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true, "engines": [ "node >= 0.8.0" @@ -3182,15 +3120,15 @@ } }, "node_modules/autoprefixer": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.1.tgz", - "integrity": "sha512-L8AmtKzdiRyYg7BUXJTzigmhbQRCXFKz6SA1Lqo0+AR2FBbQ4aTAPFSDlOutnFkjhiz8my4agGXog1xlMjPJ6A==", + "version": "10.3.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.6.tgz", + "integrity": "sha512-3bDjTfF0MfZntwVCSd18XAT2Zndufh3Mep+mafbzdIQEeWbncVRUVDjH8/EPANV9Hq40seJ24QcYAyhUsFz7gQ==", "dev": true, "dependencies": { - "browserslist": "^4.16.6", - "caniuse-lite": "^1.0.30001243", - "colorette": "^1.2.2", + "browserslist": "^4.17.1", + "caniuse-lite": "^1.0.30001260", "fraction.js": "^4.1.1", + "nanocolors": "^0.2.8", "normalize-range": "^0.1.2", "postcss-value-parser": "^4.1.0" }, @@ -3209,11 +3147,11 @@ } }, "node_modules/axios": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.3.tgz", - "integrity": "sha512-JtoZ3Ndke/+Iwt5n+BgSli/3idTvpt5OjKyoCmz4LX5+lPiY5l7C1colYezhlxThjNa/NhngCUWZSZFypIFuaA==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.22.0.tgz", + "integrity": "sha512-Z0U3uhqQeg1oNcihswf4ZD57O3NrR1+ZXhxaROaWpDmsDTx7T2HNBV2ulBtie2hwJptu8UvgnJoK+BIqdzh/1w==", "dependencies": { - "follow-redirects": "^1.14.0" + "follow-redirects": "^1.14.4" } }, "node_modules/babel-loader": { @@ -3446,13 +3384,6 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, - "node_modules/boolean": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.1.2.tgz", - "integrity": "sha512-YN6UmV0FfLlBVvRvNPx3pz5W/mUoYB24J4WSXOKP/OOJpi+Oq6WYqPaNTHzjI0QzwWtnvEd5CGYyQPgp1jFxnw==", - "dev": true, - "optional": true - }, "node_modules/boxen": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.1.tgz", @@ -3527,16 +3458,16 @@ } }, "node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz", + "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==", "dev": true, "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001264", + "electron-to-chromium": "^1.3.857", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^1.1.77", + "picocolors": "^0.2.1" }, "bin": { "browserslist": "cli.js" @@ -3730,9 +3661,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001248", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001248.tgz", - "integrity": "sha512-NwlQbJkxUFJ8nMErnGtT0QTM2TJ33xgz4KXJSMIrjXIbDVdaYueGyjOrLKRtJC+rTiWfi6j5cnZN1NBiSBJGNw==", + "version": "1.0.30001265", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz", + "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==", "dev": true, "funding": { "type": "opencollective", @@ -4037,8 +3968,7 @@ "node_modules/colorette": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" }, "node_modules/commander": { "version": "2.20.3", @@ -4052,15 +3982,6 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "node_modules/compare-version": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/compress-commons": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", @@ -4769,9 +4690,9 @@ } }, "node_modules/csstype": { - "version": "2.6.17", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.17.tgz", - "integrity": "sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A==" + "version": "2.6.18", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.18.tgz", + "integrity": "sha512-RSU6Hyeg14am3Ah4VZEmeX8H7kLwEEirXe6aU2IPfKNvhXwTflK5HQRDNI0ypQXoqmm+QPyG2IaPuQE5zMwSIQ==" }, "node_modules/debug": { "version": "4.3.1", @@ -5514,100 +5435,10 @@ "node": ">=0.10.0" } }, - "node_modules/electron-notarize": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-0.1.1.tgz", - "integrity": "sha512-TpKfJcz4LXl5jiGvZTs5fbEx+wUFXV5u8voeG5WCHWfY/cdgdD8lDZIZRqLVOtR3VO+drgJ9aiSHIO9TYn/fKg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^8.0.1" - } - }, - "node_modules/electron-notarize/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/electron-notarize/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-notarize/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/electron-osx-sign": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.17.tgz", - "integrity": "sha512-wUJPmZJQCs1zgdlQgeIpRcvrf7M5/COQaOV68Va1J/SgmWx5KL2otgg+fAae7luw6qz9R8Gvu/Qpe9tAOu/3xQ==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.0", - "compare-version": "^0.1.2", - "debug": "^2.6.8", - "isbinaryfile": "^3.0.2", - "minimist": "^1.2.0", - "plist": "^3.0.1" - }, - "bin": { - "electron-osx-flat": "bin/electron-osx-flat.js", - "electron-osx-sign": "bin/electron-osx-sign.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/electron-osx-sign/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/electron-osx-sign/node_modules/isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dev": true, - "dependencies": { - "buffer-alloc": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/electron-osx-sign/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "node_modules/electron-to-chromium": { - "version": "1.3.752", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.752.tgz", - "integrity": "sha512-2Tg+7jSl3oPxgsBsWKh5H83QazTkmWG/cnNwJplmyZc7KcN61+I10oUgaXSVk/NwfvN3BdkKDR4FYuRBQQ2v0A==", + "version": "1.3.862", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.862.tgz", + "integrity": "sha512-o+FMbCD+hAUJ9S8bfz/FaqA0gE8OpCCm58KhhGogOEqiA1BLFSoVYLi+tW+S/ZavnqBn++n0XZm7HQiBVPs8Jg==", "dev": true }, "node_modules/elementtree": { @@ -5665,26 +5496,16 @@ } }, "node_modules/enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", + "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/enhanced-resolve/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true, - "engines": { - "node": ">=6" + "node": ">=10.13.0" } }, "node_modules/entities": { @@ -5696,15 +5517,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/errno": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", @@ -5741,13 +5553,6 @@ "integrity": "sha512-f8kcHX1ArhllUtb/wVSyvygoKCznIjnxhLxy7TCvIiMdT7fL4ZDTIKaadMe6eLvOXg6Wk02UeoFgUoZ2EKZZUA==", "dev": true }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "optional": true - }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -6302,9 +6107,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==", "funding": [ { "type": "individual", @@ -6321,9 +6126,9 @@ } }, "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.1.0.tgz", - "integrity": "sha512-xLNufWQ1dfQUdZe48TGQlER/0OkcMnUB6lfbN9Tt13wsYyo+2DwcCbnOaPBo1PoFow/WL8pJPktGIdbJaHxAnw==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.3.3.tgz", + "integrity": "sha512-S3uMSg8IsIvs0H6VAfojtbf6RcnEXxEpDMT2Q41M2l0m20JO8eA1t4cCJybvrasC8SvvPEtK4B8ztxxfLljhNg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.8.3", @@ -6333,6 +6138,7 @@ "cosmiconfig": "^6.0.0", "deepmerge": "^4.2.2", "fs-extra": "^9.0.0", + "glob": "^7.1.6", "memfs": "^3.1.2", "minimatch": "^3.0.4", "schema-utils": "2.7.0", @@ -6519,15 +6325,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "node_modules/generic-names": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-2.0.1.tgz", - "integrity": "sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==", - "dev": true, - "dependencies": { - "loader-utils": "^1.1.0" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -6616,25 +6413,6 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "node_modules/global-agent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.2.0.tgz", - "integrity": "sha512-+20KpaW6DDLqhG7JDiJpD1JvNvb8ts+TNl7BPOYcURqCrXqnN1Vf+XVOrkKJAFPqfX+oEhsdzOj1hLWkBTdNJg==", - "dev": true, - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "core-js": "^3.6.5", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, "node_modules/global-dirs": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", @@ -6659,22 +6437,6 @@ "node": ">=10" } }, - "node_modules/global-tunnel-ng": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", - "integrity": "sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==", - "dev": true, - "optional": true, - "dependencies": { - "encodeurl": "^1.0.2", - "lodash": "^4.17.10", - "npm-conf": "^1.1.3", - "tunnel": "^0.0.6" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -6684,22 +6446,6 @@ "node": ">=4" } }, - "node_modules/globalthis": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz", - "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", - "dev": true, - "optional": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/globby": { "version": "11.0.4", "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", @@ -7240,12 +6986,6 @@ "node": ">=0.10.0" } }, - "node_modules/icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, "node_modules/icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", @@ -7353,9 +7093,9 @@ "dev": true }, "node_modules/inquirer": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.2.tgz", - "integrity": "sha512-DHLKJwLPNgkfwNmsuEUKSejJFbkv0FMO9SMiQbjI3n5NQuCrSIBqP66ggqyz2a6t2qEolKrMjhQ3+W/xXgUQ+Q==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.5.tgz", + "integrity": "sha512-G6/9xUqmt/r+UvufSyrPpt84NYwhKZ9jLsgMbQzlx804XErNupor8WQdBnBRrXmBfTPpuwf1sV+ss2ovjgdXIg==", "dev": true, "dependencies": { "ansi-escapes": "^4.2.1", @@ -7366,7 +7106,7 @@ "figures": "^3.0.0", "lodash": "^4.17.21", "mute-stream": "0.0.8", - "ora": "^5.3.0", + "ora": "^5.4.1", "run-async": "^2.4.0", "rxjs": "^7.2.0", "string-width": "^4.1.0", @@ -7377,10 +7117,33 @@ "node": ">=8.0.0" } }, + "node_modules/inquirer/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/inquirer/node_modules/rxjs": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.3.0.tgz", - "integrity": "sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", + "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", "dev": true, "dependencies": { "tslib": "~2.1.0" @@ -7884,9 +7647,9 @@ "dev": true }, "node_modules/jest-worker": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.2.tgz", - "integrity": "sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg==", + "version": "27.2.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.4.tgz", + "integrity": "sha512-Zq9A2Pw59KkVjBBKD1i3iE2e22oSjXhUKKuAK1HGX8flGwkm6NMozyEYzKd41hXc64dbd/0eWFeEEuxqXyhM+g==", "dev": true, "dependencies": { "@types/node": "*", @@ -7967,13 +7730,6 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true, - "optional": true - }, "node_modules/json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", @@ -8240,12 +7996,6 @@ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", "dev": true }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, "node_modules/lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -8380,20 +8130,10 @@ "node": ">=0.10.0" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, "node_modules/magic-string": { "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, "dependencies": { "sourcemap-codec": "^1.4.4" } @@ -8422,44 +8162,6 @@ "semver": "bin/semver.js" } }, - "node_modules/map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "dependencies": { - "p-defer": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, - "optional": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/matcher/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", @@ -8475,35 +8177,10 @@ "node": ">= 0.6" } }, - "node_modules/mem": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", - "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", - "dev": true, - "dependencies": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/mem?sponsor=1" - } - }, - "node_modules/mem/node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/memfs": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.2.2.tgz", - "integrity": "sha512-RE0CwmIM3CEvpcdK3rZ19BC4E6hv9kADkMN5rPduRak58cNArWLi/9jFLsa4rhsjfVxMP3v0jO7FHXq7SvFY5Q==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.3.0.tgz", + "integrity": "sha512-BEE62uMfKOavX3iG7GYX43QJ+hAeeWnwIAuJ/R6q96jaMtiLzhsxHJC8B1L7fK7Pt/vXDRwb3SG/yBpNGDPqzg==", "dev": true, "dependencies": { "fs-monkey": "1.0.3" @@ -8555,24 +8232,6 @@ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, - "node_modules/merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/merge-source-map/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -8895,11 +8554,16 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "node_modules/nanocolors": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.12.tgz", + "integrity": "sha512-SFNdALvzW+rVlzqexid6epYdt8H9Zol7xDoQarioEFcFN0JHo4CYNztAxmtfgGTVRCmFlEOqqhBpoFGKqSAMug==", + "dev": true + }, "node_modules/nanoid": { "version": "3.1.23", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", - "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -8974,9 +8638,9 @@ } }, "node_modules/node-releases": { - "version": "1.1.73", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", - "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", "dev": true }, "node_modules/normalize-path": { @@ -9279,15 +8943,6 @@ "node": ">=6" } }, - "node_modules/p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/p-event": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", @@ -9570,6 +9225,12 @@ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", "dev": true }, + "node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "node_modules/picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -9688,20 +9349,6 @@ "node": ">=6" } }, - "node_modules/plist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.2.tgz", - "integrity": "sha512-MSrkwZBdQ6YapHy87/8hDU8MnIcyxBKjeF+McXnr5A9MtffPewTs7G3hlpodT5TacyfIyFTaJEhh3GGcmasTgQ==", - "dev": true, - "dependencies": { - "base64-js": "^1.5.1", - "xmlbuilder": "^9.0.7", - "xmldom": "^0.5.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -9750,7 +9397,6 @@ "version": "8.3.5", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", - "dev": true, "dependencies": { "colorette": "^1.2.2", "nanoid": "^3.1.23", @@ -9983,25 +9629,6 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-modules": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.2.2.tgz", - "integrity": "sha512-/H08MGEmaalv/OU8j6bUKi/kZr2kqGF6huAW8m9UAgOLWtpFdhA14+gPBoymtqyv+D4MLsmqaF2zvIegdCxJXg==", - "dev": true, - "dependencies": { - "generic-names": "^2.0.1", - "icss-replace-symbols": "^1.1.0", - "lodash.camelcase": "^4.3.0", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "string-hash": "^1.1.1" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, "node_modules/postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", @@ -10260,12 +9887,12 @@ } }, "node_modules/postcss-rtlcss": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/postcss-rtlcss/-/postcss-rtlcss-3.3.4.tgz", - "integrity": "sha512-3UM3E1uJvtc5mR5UIXYX1bgUxZgupgUi8cfk0alOT0rwHQ5evoJPFDYbGsaUsj6PWLJpWuh3zCY3zYFtS2sHTw==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/postcss-rtlcss/-/postcss-rtlcss-3.4.1.tgz", + "integrity": "sha512-4SOkC34IJ086dYjmqGCeIOqQe4JTDk+jwETvq1M/57+bQA6CXEWAjGtqifjcSH75nd0vfW7+hve0Ec4ZYHmMtA==", "dev": true, "dependencies": { - "rtlcss": "^3.2.0" + "rtlcss": "^3.3.0" }, "engines": { "node": ">=12.0.0" @@ -10371,15 +9998,6 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -10460,9 +10078,9 @@ } }, "node_modules/quasar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/quasar/-/quasar-2.0.4.tgz", - "integrity": "sha512-W53vn99KKeJI+xHT7ah1qOGCqEDG2+x7G47se8lf93wFTXQAyBw+O0TbuOdZqoKpguwT4T2yo4dTMz7WRmRqGA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/quasar/-/quasar-2.1.0.tgz", + "integrity": "sha512-TSAAoHrRYNYcSO0zEz3yqYA00Blfwzt8tl7o3/fVyLD6XRrePwB3K0P3ATTQEWISTIUkSklXo5d/c5oXlAQO+g==", "engines": { "node": ">= 10.18.1", "npm": ">= 6.13.4", @@ -10904,31 +10522,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/roarr/node_modules/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true, - "optional": true - }, "node_modules/route-cache": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/route-cache/-/route-cache-0.4.5.tgz", @@ -10971,9 +10564,9 @@ "dev": true }, "node_modules/rtlcss": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.2.0.tgz", - "integrity": "sha512-nV3UmaTmA5TkP2dYOR16ULu6FkMOqZRbiXbFZnmWIN9coPfx3gin31VGOPV7vrVMPjNds7pCS2UYy0mwQUdFCQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.3.0.tgz", + "integrity": "sha512-XZ2KEatH2nU5yPlts1Wu8SGIuZ3ndN025HQX5MqtUCUiOn5WkCDbcpJ2VJWjpuFmM2cUTQ1xtH21fhMCSseI5A==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -11222,13 +10815,6 @@ "node": ">=10" } }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", - "dev": true, - "optional": true - }, "node_modules/semver-diff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", @@ -11313,35 +10899,6 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, - "optional": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/serialize-javascript": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", @@ -11592,15 +11149,14 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", - "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", "dev": true, "dependencies": { "buffer-from": "^1.0.0", @@ -11619,8 +11175,7 @@ "node_modules/sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, "node_modules/spdy": { "version": "4.0.2", @@ -11723,12 +11278,6 @@ } ] }, - "node_modules/string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", - "dev": true - }, "node_modules/string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", @@ -11813,18 +11362,6 @@ "postcss": "^8.2.15" } }, - "node_modules/sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dev": true, - "dependencies": { - "debug": "^4.1.0" - }, - "engines": { - "node": ">= 8.0" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -12015,14 +11552,14 @@ } }, "node_modules/terser": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.0.tgz", - "integrity": "sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", "dev": true, "dependencies": { "commander": "^2.20.0", "source-map": "~0.7.2", - "source-map-support": "~0.5.19" + "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" @@ -12032,17 +11569,17 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.4.tgz", - "integrity": "sha512-C2WkFwstHDhVEmsmlCxrXUtVklS+Ir1A7twrYzrDrQQOIMOaVAYykaoo/Aq1K0QRkMoY2hhvDQY1cm4jnIMFwA==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.3.tgz", + "integrity": "sha512-eDbuaDlXhVaaoKuLD3DTNTozKqln6xOG6Us0SzlKG5tNlazG+/cdl8pm9qiF1Di89iWScTI0HcO+CDcf2dkXiw==", "dev": true, "dependencies": { - "jest-worker": "^27.0.2", + "jest-worker": "^27.0.6", "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", + "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", - "terser": "^5.7.0" + "terser": "^5.7.2" }, "engines": { "node": ">= 10.13.0" @@ -12053,15 +11590,26 @@ }, "peerDependencies": { "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -12179,6 +11727,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, "engines": { "node": ">=4" } @@ -12241,37 +11790,22 @@ } }, "node_modules/ts-loader": { - "version": "8.0.17", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.17.tgz", - "integrity": "sha512-OeVfSshx6ot/TCxRwpBHQ/4lRzfgyTkvi7ghDVrLXOHzTbSK413ROgu/xNqM72i3AFeAIJgQy78FwSMKmOW68w==", + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.5.tgz", + "integrity": "sha512-al/ATFEffybdRMUIr5zMEWQdVnCGMUA9d3fXJ8dBVvBlzytPvIszoG9kZoR+94k6/i293RnVOXwMaWbXhNy9pQ==", "dev": true, "dependencies": { "chalk": "^4.1.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^2.0.0", + "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", "semver": "^7.3.4" }, "engines": { - "node": ">=10.0.0" + "node": ">=12.0.0" }, "peerDependencies": { "typescript": "*", - "webpack": "*" - } - }, - "node_modules/ts-loader/node_modules/loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" + "webpack": "^5.0.0" } }, "node_modules/tslib": { @@ -12280,16 +11814,6 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -12337,9 +11861,9 @@ } }, "node_modules/typescript": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.2.tgz", - "integrity": "sha512-tbb+NVrLfnsJy3M59lsDgrzWIflR4d4TIUjz+heUnHZwdF7YsrMTKoRERiIvI2lvBG95dfpLxB21WZhys1bgaQ==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.2.tgz", + "integrity": "sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -12655,19 +12179,21 @@ } }, "node_modules/vue": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.4.tgz", - "integrity": "sha512-rNCFmoewm8IwmTK0nj3ysKq53iRpNEFKoBJ4inar6tIh7Oj7juubS39RI8UI+VE7x+Cs2z6PBsadtZu7z2qppg==", + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.19.tgz", + "integrity": "sha512-6KAMdIfAtlK+qohTIUE4urwAv4A3YRuo8uAbByApUmiB0CziGAAPs6qVugN6oHPia8YIafHB/37K0O6KZ7sGmA==", "dependencies": { - "@vue/compiler-dom": "3.2.4", - "@vue/runtime-dom": "3.2.4", - "@vue/shared": "3.2.4" + "@vue/compiler-dom": "3.2.19", + "@vue/compiler-sfc": "3.2.19", + "@vue/runtime-dom": "3.2.19", + "@vue/server-renderer": "3.2.19", + "@vue/shared": "3.2.19" } }, "node_modules/vue-loader": { - "version": "16.4.1", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.4.1.tgz", - "integrity": "sha512-nL1bDhfMAZgTVmVkOXQaK/WJa9zFDLM9vKHbh5uGv6HeH1TmZrXMWUEVhUrACT38XPhXM4Awtjj25EvhChEgXw==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.5.0.tgz", + "integrity": "sha512-WXh+7AgFxGTgb5QAkQtFeUcHNIEq3PGVQ8WskY5ZiFbWBkOwcCPRs4w/2tVyTbh2q6TVRlO3xfvIukUtjsu62A==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -12898,17 +12424,16 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.0.0.tgz", - "integrity": "sha512-9zng2Z60pm6A98YoRcA0wSxw1EYn7B7y5owX/Tckyt9KGyULTkLtiavjaXlWqOMkM0YtqGgL3PvMOFgyFLq8vw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.2.1.tgz", + "integrity": "sha512-Kx1X+36Rn9JaZcQMrJ7qN3PMAuKmEDD9ZISjUj3Cgq4A6PtwYsC4mpaKotSRYH3iOF6HsUa8viHKS59FlyVifQ==", "dev": true, "dependencies": { - "colorette": "^1.2.2", - "mem": "^8.1.1", + "colorette": "^2.0.10", "memfs": "^3.2.2", "mime-types": "^2.1.31", "range-parser": "^1.2.1", - "schema-utils": "^3.0.0" + "schema-utils": "^3.1.0" }, "engines": { "node": ">= 12.13.0" @@ -12921,6 +12446,12 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/webpack-dev-middleware/node_modules/colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -12940,15 +12471,15 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.0.0.tgz", - "integrity": "sha512-ya5cjoBSf3LqrshZn2HMaRZQx8YRNBE+tx+CQNFGaLLHrvs4Y1aik0sl5SFhLz2cW1O9/NtyaZhthc+8UiuvkQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.3.0.tgz", + "integrity": "sha512-kuqP9Xn4OzcKe7f0rJwd4p8xqiD+4b5Lzu8tJa8OttRL3E1Q8gI2KmUtouJTgDswjjvHOHlZDV8LTQfSY5qZSA==", "dev": true, "dependencies": { - "ansi-html": "^0.0.7", + "ansi-html-community": "^0.0.8", "bonjour": "^3.5.0", "chokidar": "^3.5.1", - "colorette": "^1.2.2", + "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", "del": "^6.0.0", @@ -12968,7 +12499,7 @@ "spdy": "^4.0.2", "strip-ansi": "^7.0.0", "url": "^0.11.0", - "webpack-dev-middleware": "^5.0.0", + "webpack-dev-middleware": "^5.2.1", "ws": "^8.1.0" }, "bin": { @@ -12987,9 +12518,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ansi-regex": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.0.tgz", - "integrity": "sha512-tAaOSrWCHF+1Ear1Z4wnJCXA9GGox4K6Ic85a5qalES2aeEwQGr7UC93mwef49536PkCYjzkp0zIxfFvexJ6zQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "engines": { "node": ">=12" @@ -12998,6 +12529,12 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, + "node_modules/webpack-dev-server/node_modules/colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, "node_modules/webpack-dev-server/node_modules/ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", @@ -13008,9 +12545,9 @@ } }, "node_modules/webpack-dev-server/node_modules/open": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz", - "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.3.0.tgz", + "integrity": "sha512-7INcPWb1UcOwSQxAXTnBJ+FxVV4MPs/X++FWWBtgY69/J5lc+tCteMt/oFK1MnkyHC4VILLa9ntmwKTwDR4Q9w==", "dev": true, "dependencies": { "define-lazy-prop": "^2.0.0", @@ -13043,12 +12580,12 @@ } }, "node_modules/webpack-dev-server/node_modules/strip-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.0.tgz", - "integrity": "sha512-UhDTSnGF1dc0DRbUqr1aXwNoY3RgVkSWG8BrpnuFIxhP57IqbS7IRta2Gfiavds4yCxc5+fEAVVOgBZWnYkvzg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.0" + "ansi-regex": "^6.0.1" }, "engines": { "node": ">=12" @@ -13058,9 +12595,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.0.tgz", - "integrity": "sha512-uYhVJ/m9oXwEI04iIVmgLmugh2qrZihkywG9y5FfZV2ATeLIzHf93qs+tUNqlttbQK957/VX3mtwAS+UfIwA4g==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "dev": true, "engines": { "node": ">=10.0.0" @@ -13119,19 +12656,6 @@ "node": ">=0.10.0" } }, - "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", - "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/webpack/node_modules/schema-utils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", @@ -13316,24 +12840,6 @@ "node": ">=8" } }, - "node_modules/xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmldom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.5.0.tgz", - "integrity": "sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -13343,12 +12849,6 @@ "node": ">=0.4" } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", @@ -13686,7 +13186,8 @@ "@babel/helper-validator-identifier": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==" + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true }, "@babel/helper-validator-option": { "version": "7.14.5", @@ -13781,9 +13282,9 @@ } }, "@babel/parser": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.6.tgz", - "integrity": "sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ==" + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==" }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.14.5", @@ -14625,62 +14126,12 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.5", "to-fast-properties": "^2.0.0" } }, - "@electron/get": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.12.4.tgz", - "integrity": "sha512-6nr9DbJPUR9Xujw6zD3y+rS95TyItEVM0NVjt1EehY2vUWfIgPiIPVHxCvaTS0xr2B+DRxovYVKbuOWqC35kjg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "global-agent": "^2.0.2", - "global-tunnel-ng": "^2.7.1", - "got": "^9.6.0", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -14720,24 +14171,22 @@ "dev": true }, "@quasar/app": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@quasar/app/-/app-3.1.0.tgz", - "integrity": "sha512-b0yCblS5yVYxNjFIuCf2xoZZsNXlq1RQM/b2PxZqlGxOWG4AM02HxLSUrb1YvhwnYsYxo2qm1dbF52Ut6oE/iw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@quasar/app/-/app-3.1.2.tgz", + "integrity": "sha512-uJ77V+W5+qDRTom24xBUF0BJp8/GrVhnRNDmhTPpzvt0pXT5lDWiu8QItnZLSi98MwyFFg4dmxx2M9VR28kR5w==", "dev": true, "requires": { "@quasar/babel-preset-app": "2.0.1", "@quasar/fastclick": "1.1.4", "@quasar/ssr-helpers": "2.1.1", "@types/cordova": "0.0.34", - "@types/electron-packager": "14.0.0", - "@types/express": "4.17.11", - "@types/terser-webpack-plugin": "5.0.3", - "@types/webpack-bundle-analyzer": "4.4.0", - "@types/webpack-dev-server": "3.11.3", - "@vue/compiler-sfc": "3.2.4", - "@vue/server-renderer": "3.2.4", + "@types/express": "4.17.13", + "@types/webpack-bundle-analyzer": "4.4.1", + "@types/webpack-dev-server": "4.1.0", + "@vue/compiler-sfc": "3.2.19", + "@vue/server-renderer": "3.2.19", "archiver": "5.3.0", - "autoprefixer": "10.3.1", + "autoprefixer": "10.3.6", "browserslist": "^4.12.0", "chalk": "4.1.2", "chokidar": "3.5.2", @@ -14754,12 +14203,12 @@ "express": "4.17.1", "fast-glob": "3.2.7", "file-loader": "6.2.0", - "fork-ts-checker-webpack-plugin": "6.1.0", + "fork-ts-checker-webpack-plugin": "6.3.3", "fs-extra": "10.0.0", "hash-sum": "2.0.0", "html-minifier": "4.0.0", "html-webpack-plugin": "5.3.2", - "inquirer": "8.1.2", + "inquirer": "8.1.5", "isbinaryfile": "4.0.8", "launch-editor-middleware": "2.2.1", "lodash.debounce": "4.0.8", @@ -14775,25 +14224,25 @@ "ouch": "2.0.0", "postcss": "^8.2.10", "postcss-loader": "6.1.1", - "postcss-rtlcss": "3.3.4", + "postcss-rtlcss": "3.4.1", "pretty-error": "3.0.4", "register-service-worker": "1.7.2", "sass": "1.32.12", "sass-loader": "12.1.0", "semver": "7.3.5", "table": "6.7.1", - "terser-webpack-plugin": "5.1.4", - "ts-loader": "8.0.17", - "typescript": "4.2.2", + "terser-webpack-plugin": "5.2.3", + "ts-loader": "9.2.5", + "typescript": "4.4.2", "url-loader": "4.1.1", - "vue": "3.2.4", - "vue-loader": "16.4.1", + "vue": "3.2.19", + "vue-loader": "16.5.0", "vue-router": "4.0.11", "vue-style-loader": "4.1.3", "webpack": "^5.35.0", "webpack-bundle-analyzer": "4.4.2", "webpack-chain": "6.5.1", - "webpack-dev-server": "4.0.0", + "webpack-dev-server": "4.3.0", "webpack-merge": "5.8.0", "webpack-node-externals": "3.0.0" }, @@ -14926,9 +14375,9 @@ } }, "@quasar/extras": { - "version": "1.10.12", - "resolved": "https://registry.npmjs.org/@quasar/extras/-/extras-1.10.12.tgz", - "integrity": "sha512-CVSxLw/Z6kaEYrooJX7mpby6YDm0eSa8D9/1+KEfiTYfLrPE4wTRuNGKN5liuLtVhFMdGrEkj6T6DInKpQWW9A==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@quasar/extras/-/extras-1.11.1.tgz", + "integrity": "sha512-/h6EH4+7peanrgT1ErTSG2KwHuVrpnvS3lkmtuErCXrdpiV0z0DpGxdfIjsbhKqAPkAb6h5Zsdh72nBdKp1tsg==" }, "@quasar/fastclick": { "version": "1.1.4", @@ -14967,28 +14416,37 @@ "dev": true }, "@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz", + "integrity": "sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==", "dev": true, "requires": { "@types/connect": "*", "@types/node": "*" } }, + "@types/bonjour": { + "version": "3.5.9", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.9.tgz", + "integrity": "sha512-VkZUiYevvtPyFu5XtpYw9a8moCSzxgjs5PAFF4yXjA7eYHvzBlXe+eJdqBBNWWVzI1r7Ki0KxMYvaQuhm+6f5A==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/connect": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", - "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", "dev": true, "requires": { "@types/node": "*" } }, "@types/connect-history-api-fallback": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.4.tgz", - "integrity": "sha512-Kf8v0wljR5GSCOCF/VQWdV3ZhKOVA73drXtY3geMTQgHy9dgqQ0dLrf31M0hcuWkhFzK5sP0kkS3mJzcKVtZbw==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", "dev": true, "requires": { "@types/express-serve-static-core": "*", @@ -15001,18 +14459,6 @@ "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=", "dev": true }, - "@types/electron-packager": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@types/electron-packager/-/electron-packager-14.0.0.tgz", - "integrity": "sha512-n47/AbT4DEYPyXtES2myPyKCxVE3hICAB3MnpoVg+Ba8CLBGOpUUsNJ5fyLhfKt5N06sT9nTk4eAc+rtYVpvTQ==", - "dev": true, - "requires": { - "@electron/get": "^1.3.1", - "@types/node": "*", - "electron-notarize": "^0.1.1", - "electron-osx-sign": "^0.4.11" - } - }, "@types/eslint": { "version": "7.2.13", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.13.tgz", @@ -15040,9 +14486,9 @@ "dev": true }, "@types/express": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.11.tgz", - "integrity": "sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg==", + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", "dev": true, "requires": { "@types/body-parser": "*", @@ -15052,9 +14498,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.21.tgz", - "integrity": "sha512-gwCiEZqW6f7EoR8TTEfalyEhb1zA5jQJnRngr97+3pzMaO1RKoI1w2bw07TK72renMUVWcWS5mLI6rk1NqN0nA==", + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz", + "integrity": "sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==", "dev": true, "requires": { "@types/node": "*", @@ -15108,15 +14554,15 @@ "dev": true }, "@types/qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==", + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", "dev": true }, "@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, "@types/retry": { @@ -15125,10 +14571,19 @@ "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", "dev": true }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, "@types/serve-static": { - "version": "1.13.9", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", - "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", "dev": true, "requires": { "@types/mime": "^1", @@ -15142,25 +14597,15 @@ "dev": true }, "@types/tapable": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.7.tgz", - "integrity": "sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", + "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==", "dev": true }, - "@types/terser-webpack-plugin": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/terser-webpack-plugin/-/terser-webpack-plugin-5.0.3.tgz", - "integrity": "sha512-Ef60BOY9hV+yXjkMCuJI17cu1R8/H31n5Rnt1cElJFyBSkbRV3UWyBIYn8YpijsOG05R4bZf3G2azyBHkksu/A==", - "dev": true, - "requires": { - "terser": "^5.3.8", - "webpack": "^5.1.0" - } - }, "@types/uglify-js": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz", - "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", + "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", "dev": true, "requires": { "source-map": "^0.6.1" @@ -15175,9 +14620,9 @@ } }, "@types/webpack": { - "version": "4.41.29", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.29.tgz", - "integrity": "sha512-6pLaORaVNZxiB3FSHbyBiWM7QdazAWda1zvAq4SbZObZqHSDbWLi62iFdblVea6SK9eyBIVp5yHhKt/yNQdR7Q==", + "version": "4.41.31", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.31.tgz", + "integrity": "sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ==", "dev": true, "requires": { "@types/node": "*", @@ -15197,9 +14642,9 @@ } }, "@types/webpack-bundle-analyzer": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.0.tgz", - "integrity": "sha512-8evCbPtT2jOUhVGgVDSzk3Y2g4oaxIkakqTj66vRrYjbOoIGmKJSnS4COObwffByiOEYxW7U8ymq9ae9qlH62Q==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.1.tgz", + "integrity": "sha512-yQAj3l7bIYL+QRRlNJt6gyP+zrXZOlgaR4wsX0WY4yzZIbv41ZibREfZvuYjxY0iVtvQQlbhx0AeokkCuqUAQg==", "dev": true, "requires": { "@types/node": "*", @@ -15207,38 +14652,38 @@ "webpack": "^5" } }, + "@types/webpack-dev-middleware": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/webpack-dev-middleware/-/webpack-dev-middleware-5.0.2.tgz", + "integrity": "sha512-S3WUtef//Vx6WETyWZkM45WqgRxWSaqbpWtPcKySNRhiQNyhCqM9EueggaMX3L9N2IbG4dJIK5PgYcAWUifUbA==", + "dev": true, + "requires": { + "@types/connect": "*", + "tapable": "^2.1.1", + "webpack": "^5.38.1" + } + }, "@types/webpack-dev-server": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", - "integrity": "sha512-p9B/QClflreKDeamKhBwuo5zqtI++wwb9QNG/CdIZUFtHvtaq0dWVgbtV7iMl4Sr4vWzEFj0rn16pgUFANjLPA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-4.1.0.tgz", + "integrity": "sha512-7nylorFi/q2+TDro3U6q7S/AKIKs0x1hQUqgXAGNRC84owYVH/Av6ishEhgU2z9YUx2pNYU9BWz0qF4S34b6/g==", "dev": true, "requires": { + "@types/bonjour": "*", "@types/connect-history-api-fallback": "*", "@types/express": "*", + "@types/serve-index": "*", "@types/serve-static": "*", "@types/webpack": "^4", - "http-proxy-middleware": "^1.0.0" - }, - "dependencies": { - "http-proxy-middleware": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz", - "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==", - "dev": true, - "requires": { - "@types/http-proxy": "^1.17.5", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - } - } + "@types/webpack-dev-middleware": "*", + "chokidar": "^3.5.1", + "http-proxy-middleware": "^2.0.0" } }, "@types/webpack-sources": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", - "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", "dev": true, "requires": { "@types/node": "*", @@ -15255,14 +14700,13 @@ } }, "@vue/compiler-core": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.4.tgz", - "integrity": "sha512-c8NuQq7mUXXxA4iqD5VUKpyVeklK53+DMbojYMyZ0VPPrb0BUWrZWFiqSDT+MFDv0f6Hv3QuLiHWb1BWMXBbrw==", - "requires": { - "@babel/parser": "^7.12.0", - "@babel/types": "^7.12.0", - "@vue/shared": "3.2.4", - "estree-walker": "^2.0.1", + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.19.tgz", + "integrity": "sha512-8dOPX0YOtaXol0Zf2cfLQ4NU/yHYl2H7DCKsLEZ7gdvPK6ZSEwGLJ7IdghhY2YEshEpC5RB9QKdC5I07z8Dtjg==", + "requires": { + "@babel/parser": "^7.15.0", + "@vue/shared": "3.2.19", + "estree-walker": "^2.0.2", "source-map": "^0.6.1" }, "dependencies": { @@ -15274,61 +14718,45 @@ } }, "@vue/compiler-dom": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.4.tgz", - "integrity": "sha512-uj1nwO4794fw2YsYas5QT+FU/YGrXbS0Qk+1c7Kp1kV7idhZIghWLTjyvYibpGoseFbYLPd+sW2/noJG5H04EQ==", + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.19.tgz", + "integrity": "sha512-WzQoE8rfkFjPtIioc7SSgTsnz9g2oG61DU8KHnzPrRS7fW/lji6H2uCYJfp4Z6kZE8GjnHc1Ljwl3/gxDes0cw==", "requires": { - "@vue/compiler-core": "3.2.4", - "@vue/shared": "3.2.4" + "@vue/compiler-core": "3.2.19", + "@vue/shared": "3.2.19" } }, "@vue/compiler-sfc": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.4.tgz", - "integrity": "sha512-GM+ouDdDzhqgkLmBH4bgq4kiZxJQArSppJiZHWHIx9XRaefHLmc1LBNPmN8ivm4SVfi2i7M2t9k8ZnjsScgzPQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.13.9", - "@babel/types": "^7.13.0", - "@types/estree": "^0.0.48", - "@vue/compiler-core": "3.2.4", - "@vue/compiler-dom": "3.2.4", - "@vue/compiler-ssr": "3.2.4", - "@vue/shared": "3.2.4", - "consolidate": "^0.16.0", - "estree-walker": "^2.0.1", - "hash-sum": "^2.0.0", - "lru-cache": "^5.1.1", + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.19.tgz", + "integrity": "sha512-pLlbgkO1UHTO02MSpa/sFOXUwIDxSMiKZ1ozE5n71CY4DM+YmI+G3gT/ZHZ46WBId7f3VTF/D8pGwMygcQbrQA==", + "requires": { + "@babel/parser": "^7.15.0", + "@vue/compiler-core": "3.2.19", + "@vue/compiler-dom": "3.2.19", + "@vue/compiler-ssr": "3.2.19", + "@vue/ref-transform": "3.2.19", + "@vue/shared": "3.2.19", + "estree-walker": "^2.0.2", "magic-string": "^0.25.7", - "merge-source-map": "^1.1.0", "postcss": "^8.1.10", - "postcss-modules": "^4.0.0", - "postcss-selector-parser": "^6.0.4", "source-map": "^0.6.1" }, "dependencies": { - "@types/estree": { - "version": "0.0.48", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.48.tgz", - "integrity": "sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "@vue/compiler-ssr": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.4.tgz", - "integrity": "sha512-bKZuXu9/4XwsFHFWIKQK+5kN7mxIIWmMmT2L4VVek7cvY/vm3p4WTsXYDGZJy0htOTXvM2ifr6sflg012T0hsw==", - "dev": true, + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.19.tgz", + "integrity": "sha512-oLon0Cn3O7WEYzzmzZavGoqXH+199LT+smdjBT3Uf3UX4HwDNuBFCmvL0TsqV9SQnIgKvBRbQ7lhbpnd4lqM3w==", "requires": { - "@vue/compiler-dom": "3.2.4", - "@vue/shared": "3.2.4" + "@vue/compiler-dom": "3.2.19", + "@vue/shared": "3.2.19" } }, "@vue/devtools-api": { @@ -15337,46 +14765,57 @@ "integrity": "sha512-44fPrrN1cqcs6bFkT0C+yxTM6PZXLbR+ESh1U1j8UD22yO04gXvxH62HApMjLbS3WqJO/iCNC+CYT+evPQh2EQ==" }, "@vue/reactivity": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.4.tgz", - "integrity": "sha512-ljWTR0hr8Tn09hM2tlmWxZzCBPlgGLnq/k8K8X6EcJhtV+C8OzFySnbWqMWataojbrQOocThwsC8awKthSl2uQ==", + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.19.tgz", + "integrity": "sha512-FtachoYs2SnyrWup5UikP54xDX6ZJ1s5VgHcJp4rkGoutU3Ry61jhs+nCX7J64zjX992Mh9gGUC0LqTs8q9vCA==", "requires": { - "@vue/shared": "3.2.4" + "@vue/shared": "3.2.19" + } + }, + "@vue/ref-transform": { + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@vue/ref-transform/-/ref-transform-3.2.19.tgz", + "integrity": "sha512-03wwUnoIAeKti5IGGx6Vk/HEBJ+zUcm5wrUM3+PQsGf7IYnXTbeIfHHpx4HeSeWhnLAjqZjADQwW8uA4rBmVbg==", + "requires": { + "@babel/parser": "^7.15.0", + "@vue/compiler-core": "3.2.19", + "@vue/shared": "3.2.19", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" } }, "@vue/runtime-core": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.4.tgz", - "integrity": "sha512-W6PtEOs8P8jKYPo3JwaMAozZQivxInUleGfNwI2pK1t8ZLZIxn4kAf7p4VF4jJdQB8SZBzpfWdLUc06j7IOmpQ==", + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.19.tgz", + "integrity": "sha512-qArZSWKxWsgKfxk9BelZ32nY0MZ31CAW2kUUyVJyxh4cTfHaXGbjiQB5JgsvKc49ROMNffv9t3/qjasQqAH+RQ==", "requires": { - "@vue/reactivity": "3.2.4", - "@vue/shared": "3.2.4" + "@vue/reactivity": "3.2.19", + "@vue/shared": "3.2.19" } }, "@vue/runtime-dom": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.4.tgz", - "integrity": "sha512-HcVtLyn2SGwsf6BFPwkvDPDOhOqkOKcfHDpBp5R1coX+qMsOFrY8lJnGXIY+JnxqFjND00E9+u+lq5cs/W7ooA==", + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.19.tgz", + "integrity": "sha512-hIRboxXwafeHhbZEkZYNV0MiJXPNf4fP0X6hM2TJb0vssz8BKhD9cF92BkRgZztTQevecbhk0gu4uAPJ3dxL9A==", "requires": { - "@vue/runtime-core": "3.2.4", - "@vue/shared": "3.2.4", + "@vue/runtime-core": "3.2.19", + "@vue/shared": "3.2.19", "csstype": "^2.6.8" } }, "@vue/server-renderer": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.4.tgz", - "integrity": "sha512-ai9WxJ78nnUDk+26vwZhlA1Quz3tA+90DgJX6iseen2Wwnndd91xicFW+6ROR/ZP0yFNuQ017eZJBw8OqoPL+w==", - "dev": true, + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.19.tgz", + "integrity": "sha512-A9FNT7fgQJXItwdzWREntAgWKVtKYuXHBKGev/H4+ByTu8vB7gQXGcim01QxaJshdNg4dYuH2tEBZXCNCNx+/w==", "requires": { - "@vue/compiler-ssr": "3.2.4", - "@vue/shared": "3.2.4" + "@vue/compiler-ssr": "3.2.19", + "@vue/shared": "3.2.19" } }, "@vue/shared": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.4.tgz", - "integrity": "sha512-j2j1MRmjalVKr3YBTxl/BClSIc8UQ8NnPpLYclxerK65JIowI4O7n8O8lElveEtEoHxy1d7BelPUDI0Q4bumqg==" + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.19.tgz", + "integrity": "sha512-Knqhx7WieLdVgwCAZgTVrDCXZ50uItuecLh9JdLC8O+a5ayaSyIQYveUK3hCRNC7ws5zalHmZwfdLMGaS8r4Ew==" }, "@webassemblyjs/ast": { "version": "1.11.0", @@ -15657,10 +15096,10 @@ "type-fest": "^0.21.3" } }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true }, "ansi-red": { @@ -15844,25 +15283,25 @@ "dev": true }, "autoprefixer": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.1.tgz", - "integrity": "sha512-L8AmtKzdiRyYg7BUXJTzigmhbQRCXFKz6SA1Lqo0+AR2FBbQ4aTAPFSDlOutnFkjhiz8my4agGXog1xlMjPJ6A==", + "version": "10.3.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.6.tgz", + "integrity": "sha512-3bDjTfF0MfZntwVCSd18XAT2Zndufh3Mep+mafbzdIQEeWbncVRUVDjH8/EPANV9Hq40seJ24QcYAyhUsFz7gQ==", "dev": true, "requires": { - "browserslist": "^4.16.6", - "caniuse-lite": "^1.0.30001243", - "colorette": "^1.2.2", + "browserslist": "^4.17.1", + "caniuse-lite": "^1.0.30001260", "fraction.js": "^4.1.1", + "nanocolors": "^0.2.8", "normalize-range": "^0.1.2", "postcss-value-parser": "^4.1.0" } }, "axios": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.3.tgz", - "integrity": "sha512-JtoZ3Ndke/+Iwt5n+BgSli/3idTvpt5OjKyoCmz4LX5+lPiY5l7C1colYezhlxThjNa/NhngCUWZSZFypIFuaA==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.22.0.tgz", + "integrity": "sha512-Z0U3uhqQeg1oNcihswf4ZD57O3NrR1+ZXhxaROaWpDmsDTx7T2HNBV2ulBtie2hwJptu8UvgnJoK+BIqdzh/1w==", "requires": { - "follow-redirects": "^1.14.0" + "follow-redirects": "^1.14.4" } }, "babel-loader": { @@ -16053,13 +15492,6 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, - "boolean": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.1.2.tgz", - "integrity": "sha512-YN6UmV0FfLlBVvRvNPx3pz5W/mUoYB24J4WSXOKP/OOJpi+Oq6WYqPaNTHzjI0QzwWtnvEd5CGYyQPgp1jFxnw==", - "dev": true, - "optional": true - }, "boxen": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.1.tgz", @@ -16115,16 +15547,16 @@ } }, "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz", + "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001264", + "electron-to-chromium": "^1.3.857", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^1.1.77", + "picocolors": "^0.2.1" } }, "buffer": { @@ -16266,9 +15698,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001248", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001248.tgz", - "integrity": "sha512-NwlQbJkxUFJ8nMErnGtT0QTM2TJ33xgz4KXJSMIrjXIbDVdaYueGyjOrLKRtJC+rTiWfi6j5cnZN1NBiSBJGNw==", + "version": "1.0.30001265", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz", + "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==", "dev": true }, "caw": { @@ -16509,8 +15941,7 @@ "colorette": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" }, "commander": { "version": "2.20.3", @@ -16524,12 +15955,6 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "compare-version": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=", - "dev": true - }, "compress-commons": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", @@ -17052,9 +16477,9 @@ } }, "csstype": { - "version": "2.6.17", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.17.tgz", - "integrity": "sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A==" + "version": "2.6.18", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.18.tgz", + "integrity": "sha512-RSU6Hyeg14am3Ah4VZEmeX8H7kLwEEirXe6aU2IPfKNvhXwTflK5HQRDNI0ypQXoqmm+QPyG2IaPuQE5zMwSIQ==" }, "debug": { "version": "4.3.1", @@ -17666,88 +17091,10 @@ "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", "dev": true }, - "electron-notarize": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-0.1.1.tgz", - "integrity": "sha512-TpKfJcz4LXl5jiGvZTs5fbEx+wUFXV5u8voeG5WCHWfY/cdgdD8lDZIZRqLVOtR3VO+drgJ9aiSHIO9TYn/fKg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "fs-extra": "^8.0.1" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, - "electron-osx-sign": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.17.tgz", - "integrity": "sha512-wUJPmZJQCs1zgdlQgeIpRcvrf7M5/COQaOV68Va1J/SgmWx5KL2otgg+fAae7luw6qz9R8Gvu/Qpe9tAOu/3xQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.0", - "compare-version": "^0.1.2", - "debug": "^2.6.8", - "isbinaryfile": "^3.0.2", - "minimist": "^1.2.0", - "plist": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dev": true, - "requires": { - "buffer-alloc": "^1.2.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, "electron-to-chromium": { - "version": "1.3.752", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.752.tgz", - "integrity": "sha512-2Tg+7jSl3oPxgsBsWKh5H83QazTkmWG/cnNwJplmyZc7KcN61+I10oUgaXSVk/NwfvN3BdkKDR4FYuRBQQ2v0A==", + "version": "1.3.862", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.862.tgz", + "integrity": "sha512-o+FMbCD+hAUJ9S8bfz/FaqA0gE8OpCCm58KhhGogOEqiA1BLFSoVYLi+tW+S/ZavnqBn++n0XZm7HQiBVPs8Jg==", "dev": true }, "elementtree": { @@ -17793,22 +17140,13 @@ } }, "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", + "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - } + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" } }, "entities": { @@ -17817,12 +17155,6 @@ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true - }, "errno": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", @@ -17856,13 +17188,6 @@ "integrity": "sha512-f8kcHX1ArhllUtb/wVSyvygoKCznIjnxhLxy7TCvIiMdT7fL4ZDTIKaadMe6eLvOXg6Wk02UeoFgUoZ2EKZZUA==", "dev": true }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "optional": true - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -18293,14 +17618,14 @@ } }, "follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" }, "fork-ts-checker-webpack-plugin": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.1.0.tgz", - "integrity": "sha512-xLNufWQ1dfQUdZe48TGQlER/0OkcMnUB6lfbN9Tt13wsYyo+2DwcCbnOaPBo1PoFow/WL8pJPktGIdbJaHxAnw==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.3.3.tgz", + "integrity": "sha512-S3uMSg8IsIvs0H6VAfojtbf6RcnEXxEpDMT2Q41M2l0m20JO8eA1t4cCJybvrasC8SvvPEtK4B8ztxxfLljhNg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", @@ -18310,6 +17635,7 @@ "cosmiconfig": "^6.0.0", "deepmerge": "^4.2.2", "fs-extra": "^9.0.0", + "glob": "^7.1.6", "memfs": "^3.1.2", "minimatch": "^3.0.4", "schema-utils": "2.7.0", @@ -18457,15 +17783,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "generic-names": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-2.0.1.tgz", - "integrity": "sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0" - } - }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -18533,22 +17850,6 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "global-agent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.2.0.tgz", - "integrity": "sha512-+20KpaW6DDLqhG7JDiJpD1JvNvb8ts+TNl7BPOYcURqCrXqnN1Vf+XVOrkKJAFPqfX+oEhsdzOj1hLWkBTdNJg==", - "dev": true, - "optional": true, - "requires": { - "boolean": "^3.0.1", - "core-js": "^3.6.5", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - } - }, "global-dirs": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", @@ -18566,35 +17867,12 @@ } } }, - "global-tunnel-ng": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", - "integrity": "sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==", - "dev": true, - "optional": true, - "requires": { - "encodeurl": "^1.0.2", - "lodash": "^4.17.10", - "npm-conf": "^1.1.3", - "tunnel": "^0.0.6" - } - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "globalthis": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz", - "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", - "dev": true, - "optional": true, - "requires": { - "define-properties": "^1.1.3" - } - }, "globby": { "version": "11.0.4", "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", @@ -19025,12 +18303,6 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, "icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", @@ -19101,9 +18373,9 @@ "dev": true }, "inquirer": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.2.tgz", - "integrity": "sha512-DHLKJwLPNgkfwNmsuEUKSejJFbkv0FMO9SMiQbjI3n5NQuCrSIBqP66ggqyz2a6t2qEolKrMjhQ3+W/xXgUQ+Q==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.5.tgz", + "integrity": "sha512-G6/9xUqmt/r+UvufSyrPpt84NYwhKZ9jLsgMbQzlx804XErNupor8WQdBnBRrXmBfTPpuwf1sV+ss2ovjgdXIg==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", @@ -19114,7 +18386,7 @@ "figures": "^3.0.0", "lodash": "^4.17.21", "mute-stream": "0.0.8", - "ora": "^5.3.0", + "ora": "^5.4.1", "run-async": "^2.4.0", "rxjs": "^7.2.0", "string-width": "^4.1.0", @@ -19122,10 +18394,27 @@ "through": "^2.3.6" }, "dependencies": { + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, "rxjs": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.3.0.tgz", - "integrity": "sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", + "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", "dev": true, "requires": { "tslib": "~2.1.0" @@ -19488,9 +18777,9 @@ "dev": true }, "jest-worker": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.2.tgz", - "integrity": "sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg==", + "version": "27.2.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.4.tgz", + "integrity": "sha512-Zq9A2Pw59KkVjBBKD1i3iE2e22oSjXhUKKuAK1HGX8flGwkm6NMozyEYzKd41hXc64dbd/0eWFeEEuxqXyhM+g==", "dev": true, "requires": { "@types/node": "*", @@ -19555,13 +18844,6 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true, - "optional": true - }, "json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", @@ -19787,12 +19069,6 @@ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", "dev": true }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -19912,20 +19188,10 @@ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "dev": true }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, "magic-string": { "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, "requires": { "sourcemap-codec": "^1.4.4" } @@ -19947,34 +19213,6 @@ } } }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, - "optional": true, - "requires": { - "escape-string-regexp": "^4.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "optional": true - } - } - }, "mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", @@ -19987,28 +19225,10 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, - "mem": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", - "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^3.1.0" - }, - "dependencies": { - "mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "dev": true - } - } - }, "memfs": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.2.2.tgz", - "integrity": "sha512-RE0CwmIM3CEvpcdK3rZ19BC4E6hv9kADkMN5rPduRak58cNArWLi/9jFLsa4rhsjfVxMP3v0jO7FHXq7SvFY5Q==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.3.0.tgz", + "integrity": "sha512-BEE62uMfKOavX3iG7GYX43QJ+hAeeWnwIAuJ/R6q96jaMtiLzhsxHJC8B1L7fK7Pt/vXDRwb3SG/yBpNGDPqzg==", "dev": true, "requires": { "fs-monkey": "1.0.3" @@ -20056,23 +19276,6 @@ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -20312,11 +19515,16 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "nanocolors": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.12.tgz", + "integrity": "sha512-SFNdALvzW+rVlzqexid6epYdt8H9Zol7xDoQarioEFcFN0JHo4CYNztAxmtfgGTVRCmFlEOqqhBpoFGKqSAMug==", + "dev": true + }, "nanoid": { "version": "3.1.23", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", - "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", - "dev": true + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==" }, "negotiator": { "version": "0.6.2", @@ -20368,9 +19576,9 @@ } }, "node-releases": { - "version": "1.1.73", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", - "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", "dev": true }, "normalize-path": { @@ -20583,12 +19791,6 @@ "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "dev": true }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, "p-event": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", @@ -20808,6 +20010,12 @@ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", "dev": true }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -20892,17 +20100,6 @@ } } }, - "plist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.2.tgz", - "integrity": "sha512-MSrkwZBdQ6YapHy87/8hDU8MnIcyxBKjeF+McXnr5A9MtffPewTs7G3hlpodT5TacyfIyFTaJEhh3GGcmasTgQ==", - "dev": true, - "requires": { - "base64-js": "^1.5.1", - "xmlbuilder": "^9.0.7", - "xmldom": "^0.5.0" - } - }, "portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -20947,7 +20144,6 @@ "version": "8.3.5", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", - "dev": true, "requires": { "colorette": "^1.2.2", "nanoid": "^3.1.23", @@ -21091,22 +20287,6 @@ "postcss-selector-parser": "^6.0.5" } }, - "postcss-modules": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.2.2.tgz", - "integrity": "sha512-/H08MGEmaalv/OU8j6bUKi/kZr2kqGF6huAW8m9UAgOLWtpFdhA14+gPBoymtqyv+D4MLsmqaF2zvIegdCxJXg==", - "dev": true, - "requires": { - "generic-names": "^2.0.1", - "icss-replace-symbols": "^1.1.0", - "lodash.camelcase": "^4.3.0", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "string-hash": "^1.1.1" - } - }, "postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", @@ -21267,12 +20447,12 @@ } }, "postcss-rtlcss": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/postcss-rtlcss/-/postcss-rtlcss-3.3.4.tgz", - "integrity": "sha512-3UM3E1uJvtc5mR5UIXYX1bgUxZgupgUi8cfk0alOT0rwHQ5evoJPFDYbGsaUsj6PWLJpWuh3zCY3zYFtS2sHTw==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/postcss-rtlcss/-/postcss-rtlcss-3.4.1.tgz", + "integrity": "sha512-4SOkC34IJ086dYjmqGCeIOqQe4JTDk+jwETvq1M/57+bQA6CXEWAjGtqifjcSH75nd0vfW7+hve0Ec4ZYHmMtA==", "dev": true, "requires": { - "rtlcss": "^3.2.0" + "rtlcss": "^3.3.0" } }, "postcss-selector-parser": { @@ -21348,12 +20528,6 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -21420,9 +20594,9 @@ "dev": true }, "quasar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/quasar/-/quasar-2.0.4.tgz", - "integrity": "sha512-W53vn99KKeJI+xHT7ah1qOGCqEDG2+x7G47se8lf93wFTXQAyBw+O0TbuOdZqoKpguwT4T2yo4dTMz7WRmRqGA==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/quasar/-/quasar-2.1.0.tgz", + "integrity": "sha512-TSAAoHrRYNYcSO0zEz3yqYA00Blfwzt8tl7o3/fVyLD6XRrePwB3K0P3ATTQEWISTIUkSklXo5d/c5oXlAQO+g==" }, "query-string": { "version": "5.1.1", @@ -21760,30 +20934,6 @@ "glob": "^7.1.3" } }, - "roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, - "optional": true, - "requires": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true, - "optional": true - } - } - }, "route-cache": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/route-cache/-/route-cache-0.4.5.tgz", @@ -21828,9 +20978,9 @@ } }, "rtlcss": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.2.0.tgz", - "integrity": "sha512-nV3UmaTmA5TkP2dYOR16ULu6FkMOqZRbiXbFZnmWIN9coPfx3gin31VGOPV7vrVMPjNds7pCS2UYy0mwQUdFCQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.3.0.tgz", + "integrity": "sha512-XZ2KEatH2nU5yPlts1Wu8SGIuZ3ndN025HQX5MqtUCUiOn5WkCDbcpJ2VJWjpuFmM2cUTQ1xtH21fhMCSseI5A==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -22004,13 +21154,6 @@ } } }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", - "dev": true, - "optional": true - }, "semver-diff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", @@ -22074,25 +21217,6 @@ } } }, - "serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, - "optional": true, - "requires": { - "type-fest": "^0.13.1" - }, - "dependencies": { - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "optional": true - } - } - }, "serialize-javascript": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", @@ -22300,13 +21424,12 @@ "source-map-js": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", - "dev": true + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==" }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -22324,8 +21447,7 @@ "sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, "spdy": { "version": "4.0.2", @@ -22407,12 +21529,6 @@ } } }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", - "dev": true - }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", @@ -22473,15 +21589,6 @@ "postcss-selector-parser": "^6.0.4" } }, - "sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dev": true, - "requires": { - "debug": "^4.1.0" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -22632,14 +21739,14 @@ } }, "terser": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.0.tgz", - "integrity": "sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", "dev": true, "requires": { "commander": "^2.20.0", "source-map": "~0.7.2", - "source-map-support": "~0.5.19" + "source-map-support": "~0.5.20" }, "dependencies": { "source-map": { @@ -22651,26 +21758,26 @@ } }, "terser-webpack-plugin": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.4.tgz", - "integrity": "sha512-C2WkFwstHDhVEmsmlCxrXUtVklS+Ir1A7twrYzrDrQQOIMOaVAYykaoo/Aq1K0QRkMoY2hhvDQY1cm4jnIMFwA==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.3.tgz", + "integrity": "sha512-eDbuaDlXhVaaoKuLD3DTNTozKqln6xOG6Us0SzlKG5tNlazG+/cdl8pm9qiF1Di89iWScTI0HcO+CDcf2dkXiw==", "dev": true, "requires": { - "jest-worker": "^27.0.2", + "jest-worker": "^27.0.6", "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", + "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", - "terser": "^5.7.0" + "terser": "^5.7.2" }, "dependencies": { "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -22761,7 +21868,8 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true }, "to-readable-stream": { "version": "1.0.0", @@ -22806,29 +21914,15 @@ } }, "ts-loader": { - "version": "8.0.17", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.17.tgz", - "integrity": "sha512-OeVfSshx6ot/TCxRwpBHQ/4lRzfgyTkvi7ghDVrLXOHzTbSK413ROgu/xNqM72i3AFeAIJgQy78FwSMKmOW68w==", + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.5.tgz", + "integrity": "sha512-al/ATFEffybdRMUIr5zMEWQdVnCGMUA9d3fXJ8dBVvBlzytPvIszoG9kZoR+94k6/i293RnVOXwMaWbXhNy9pQ==", "dev": true, "requires": { "chalk": "^4.1.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^2.0.0", + "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", "semver": "^7.3.4" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - } } }, "tslib": { @@ -22837,13 +21931,6 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true, - "optional": true - }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -22879,9 +21966,9 @@ } }, "typescript": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.2.tgz", - "integrity": "sha512-tbb+NVrLfnsJy3M59lsDgrzWIflR4d4TIUjz+heUnHZwdF7YsrMTKoRERiIvI2lvBG95dfpLxB21WZhys1bgaQ==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.2.tgz", + "integrity": "sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ==", "dev": true }, "uglify-js": { @@ -23115,19 +22202,21 @@ "dev": true }, "vue": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.4.tgz", - "integrity": "sha512-rNCFmoewm8IwmTK0nj3ysKq53iRpNEFKoBJ4inar6tIh7Oj7juubS39RI8UI+VE7x+Cs2z6PBsadtZu7z2qppg==", + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.19.tgz", + "integrity": "sha512-6KAMdIfAtlK+qohTIUE4urwAv4A3YRuo8uAbByApUmiB0CziGAAPs6qVugN6oHPia8YIafHB/37K0O6KZ7sGmA==", "requires": { - "@vue/compiler-dom": "3.2.4", - "@vue/runtime-dom": "3.2.4", - "@vue/shared": "3.2.4" + "@vue/compiler-dom": "3.2.19", + "@vue/compiler-sfc": "3.2.19", + "@vue/runtime-dom": "3.2.19", + "@vue/server-renderer": "3.2.19", + "@vue/shared": "3.2.19" } }, "vue-loader": { - "version": "16.4.1", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.4.1.tgz", - "integrity": "sha512-nL1bDhfMAZgTVmVkOXQaK/WJa9zFDLM9vKHbh5uGv6HeH1TmZrXMWUEVhUrACT38XPhXM4Awtjj25EvhChEgXw==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.5.0.tgz", + "integrity": "sha512-WXh+7AgFxGTgb5QAkQtFeUcHNIEq3PGVQ8WskY5ZiFbWBkOwcCPRs4w/2tVyTbh2q6TVRlO3xfvIukUtjsu62A==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -23263,16 +22352,6 @@ "webpack-sources": "^2.3.0" }, "dependencies": { - "enhanced-resolve": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", - "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, "schema-utils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", @@ -23346,19 +22425,24 @@ } }, "webpack-dev-middleware": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.0.0.tgz", - "integrity": "sha512-9zng2Z60pm6A98YoRcA0wSxw1EYn7B7y5owX/Tckyt9KGyULTkLtiavjaXlWqOMkM0YtqGgL3PvMOFgyFLq8vw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.2.1.tgz", + "integrity": "sha512-Kx1X+36Rn9JaZcQMrJ7qN3PMAuKmEDD9ZISjUj3Cgq4A6PtwYsC4mpaKotSRYH3iOF6HsUa8viHKS59FlyVifQ==", "dev": true, "requires": { - "colorette": "^1.2.2", - "mem": "^8.1.1", + "colorette": "^2.0.10", "memfs": "^3.2.2", "mime-types": "^2.1.31", "range-parser": "^1.2.1", - "schema-utils": "^3.0.0" + "schema-utils": "^3.1.0" }, "dependencies": { + "colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -23373,15 +22457,15 @@ } }, "webpack-dev-server": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.0.0.tgz", - "integrity": "sha512-ya5cjoBSf3LqrshZn2HMaRZQx8YRNBE+tx+CQNFGaLLHrvs4Y1aik0sl5SFhLz2cW1O9/NtyaZhthc+8UiuvkQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.3.0.tgz", + "integrity": "sha512-kuqP9Xn4OzcKe7f0rJwd4p8xqiD+4b5Lzu8tJa8OttRL3E1Q8gI2KmUtouJTgDswjjvHOHlZDV8LTQfSY5qZSA==", "dev": true, "requires": { - "ansi-html": "^0.0.7", + "ansi-html-community": "^0.0.8", "bonjour": "^3.5.0", "chokidar": "^3.5.1", - "colorette": "^1.2.2", + "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", "del": "^6.0.0", @@ -23401,14 +22485,20 @@ "spdy": "^4.0.2", "strip-ansi": "^7.0.0", "url": "^0.11.0", - "webpack-dev-middleware": "^5.0.0", + "webpack-dev-middleware": "^5.2.1", "ws": "^8.1.0" }, "dependencies": { "ansi-regex": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.0.tgz", - "integrity": "sha512-tAaOSrWCHF+1Ear1Z4wnJCXA9GGox4K6Ic85a5qalES2aeEwQGr7UC93mwef49536PkCYjzkp0zIxfFvexJ6zQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, "ipaddr.js": { @@ -23418,9 +22508,9 @@ "dev": true }, "open": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz", - "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.3.0.tgz", + "integrity": "sha512-7INcPWb1UcOwSQxAXTnBJ+FxVV4MPs/X++FWWBtgY69/J5lc+tCteMt/oFK1MnkyHC4VILLa9ntmwKTwDR4Q9w==", "dev": true, "requires": { "define-lazy-prop": "^2.0.0", @@ -23440,18 +22530,18 @@ } }, "strip-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.0.tgz", - "integrity": "sha512-UhDTSnGF1dc0DRbUqr1aXwNoY3RgVkSWG8BrpnuFIxhP57IqbS7IRta2Gfiavds4yCxc5+fEAVVOgBZWnYkvzg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, "requires": { - "ansi-regex": "^6.0.0" + "ansi-regex": "^6.0.1" } }, "ws": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.0.tgz", - "integrity": "sha512-uYhVJ/m9oXwEI04iIVmgLmugh2qrZihkywG9y5FfZV2ATeLIzHf93qs+tUNqlttbQK957/VX3mtwAS+UfIwA4g==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "dev": true, "requires": {} } @@ -23595,30 +22685,12 @@ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "dev": true }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true - }, - "xmldom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.5.0.tgz", - "integrity": "sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA==", - "dev": true - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, "yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", diff --git a/web/package.json b/web/package.json index 0774d4ab52..c1f33ee2e7 100644 --- a/web/package.json +++ b/web/package.json @@ -10,24 +10,25 @@ "test:e2e:ci": "cross-env E2E_TEST=true start-test \"quasar dev\" http-get://localhost:8080 \"cypress run\"" }, "dependencies": { - "@quasar/extras": "^1.10.12", + "@quasar/extras": "^1.11.1", "apexcharts": "^3.27.1", - "axios": "^0.21.3", + "axios": "^0.22.0", "dotenv": "^8.6.0", "prismjs": "^1.23.0", "qrcode.vue": "^3.2.2", - "quasar": "^2.0.4", + "quasar": "^2.1.0", "vue-prism-editor": "^2.0.0-alpha.2", "vue3-apexcharts": "^1.4.0", "vuex": "^4.0.2" }, "devDependencies": { - "@quasar/app": "^3.1.0", + "@quasar/app": "^3.1.2", "@quasar/cli": "^1.2.1" }, "browserslist": [ - "last 3 Chrome versions", - "last 3 Firefox versions", - "last 2 Edge versions" + "last 2 Chrome versions", + "last 2 Firefox versions", + "last 2 Edge versions", + "last 1 Safari versions" ] } \ No newline at end of file diff --git a/web/src/api/core.js b/web/src/api/core.js index d0380107c5..8bb6a56dfa 100644 --- a/web/src/api/core.js +++ b/web/src/api/core.js @@ -7,4 +7,9 @@ export async function fetchCustomFields(params) { const { data } = await axios.get(`${baseUrl}/customfields/`, { params: params }) return data } catch (e) { } +} + +export async function uploadMeshAgent(payload) { + const { data } = await axios.put(`${baseUrl}/uploadmesh/`, payload) + return data } \ No newline at end of file diff --git a/web/src/boot/axios.js b/web/src/boot/axios.js index 222fee1bd1..6cf263fc67 100644 --- a/web/src/boot/axios.js +++ b/web/src/boot/axios.js @@ -68,10 +68,10 @@ export default function ({ app, router, store }) { } else if (error.response.status === 406) { - text = "Missing 64 bit meshagent.exe. Upload it from File > Upload Mesh Agent" + text = "Missing 64 bit meshagent.exe. Upload it from Settings > Global Settings > MeshCentral" } else if (error.response.status === 415) { - text = "Missing 32 bit meshagent-x86.exe. Upload it from File > Upload Mesh Agent" + text = "Missing 32 bit meshagent-x86.exe. Upload it from Settings > Global Settings > MeshCentral" } if (text || error.response) { diff --git a/web/src/components/FileBar.vue b/web/src/components/FileBar.vue index 642380c244..8e577fe6ea 100644 --- a/web/src/components/FileBar.vue +++ b/web/src/components/FileBar.vue @@ -22,9 +22,6 @@ - - Upload MeshAgent - Audit Log @@ -172,10 +169,6 @@ - - - - @@ -206,7 +199,6 @@ import AlertsManager from "@/components/AlertsManager"; import AutomationManager from "@/components/automation/AutomationManager"; import AdminManager from "@/components/AdminManager"; import InstallAgent from "@/components/modals/agents/InstallAgent"; -import UploadMesh from "@/components/modals/core/UploadMesh"; import AuditManager from "@/components/logs/AuditManager"; import BulkAction from "@/components/modals/agents/BulkAction"; import Deployment from "@/components/Deployment"; @@ -222,7 +214,6 @@ export default { UpdateAgents, EditCoreSettings, InstallAgent, - UploadMesh, AdminManager, Deployment, ServerMaintenance, @@ -236,7 +227,6 @@ export default { showEditCoreSettingsModal: false, showAdminManager: false, showInstallAgent: false, - showUploadMesh: false, showPendingActions: false, showDeployment: false, showCodeSign: false, diff --git a/web/src/components/core/APIKeysTable.vue b/web/src/components/core/APIKeysTable.vue index fbba36bd25..2e03ccfb39 100644 --- a/web/src/components/core/APIKeysTable.vue +++ b/web/src/components/core/APIKeysTable.vue @@ -165,7 +165,7 @@ export default { getAPIKeys(); loading.value = false; } catch (e) { - console.log(e); + console.error(e); loading.value = false; } }); diff --git a/web/src/components/core/UploadMesh.vue b/web/src/components/core/UploadMesh.vue new file mode 100644 index 0000000000..9e9a09249b --- /dev/null +++ b/web/src/components/core/UploadMesh.vue @@ -0,0 +1,98 @@ + + + \ No newline at end of file diff --git a/web/src/components/modals/agents/InstallAgent.vue b/web/src/components/modals/agents/InstallAgent.vue index 5a3b5866fb..2765da0170 100644 --- a/web/src/components/modals/agents/InstallAgent.vue +++ b/web/src/components/modals/agents/InstallAgent.vue @@ -189,23 +189,8 @@ export default { link.click(); this.showDLMessage(); }) - .catch(e => { + .catch(() => { this.$q.loading.hide(); - let err; - switch (e.response.status) { - case 406: - err = "Missing 64 bit meshagent.exe. Upload it from File > Upload Mesh Agent"; - break; - case 415: - err = "Missing 32 bit meshagent-x86.exe. Upload it from File > Upload Mesh Agent"; - break; - case 403: - err = "You do not have permissions to perform this action"; - break; - default: - err = "Something went wrong"; - } - this.notifyError(err, 4000); }); } else if (this.installMethod === "powershell") { const psName = `rmm-${clientStripped}-${siteStripped}-${this.agenttype}.ps1`; diff --git a/web/src/components/modals/core/UploadMesh.vue b/web/src/components/modals/core/UploadMesh.vue deleted file mode 100644 index 4b652f28da..0000000000 --- a/web/src/components/modals/core/UploadMesh.vue +++ /dev/null @@ -1,70 +0,0 @@ - - - \ No newline at end of file diff --git a/web/src/components/modals/coresettings/EditCoreSettings.vue b/web/src/components/modals/coresettings/EditCoreSettings.vue index 1e83f22e4d..8c564f2118 100644 --- a/web/src/components/modals/coresettings/EditCoreSettings.vue +++ b/web/src/components/modals/coresettings/EditCoreSettings.vue @@ -316,6 +316,11 @@
+ +
+
+ +
@@ -428,6 +433,7 @@ import CustomFields from "@/components/modals/coresettings/CustomFields"; import KeyStoreTable from "@/components/modals/coresettings/KeyStoreTable"; import URLActionsTable from "@/components/modals/coresettings/URLActionsTable"; import APIKeysTable from "@/components/core/APIKeysTable"; +import UploadMesh from "@/components/core/UploadMesh"; export default { name: "EditCoreSettings", @@ -590,6 +596,11 @@ export default { this.$q.loading.hide(); }); }, + uploadMeshAgentModal() { + this.$q.dialog({ + component: UploadMesh, + }); + }, }, mounted() { this.getCoreSettings(); diff --git a/web/src/components/scripts/ScriptManager.vue b/web/src/components/scripts/ScriptManager.vue index 92ffbf1a75..14a9d76118 100644 --- a/web/src/components/scripts/ScriptManager.vue +++ b/web/src/components/scripts/ScriptManager.vue @@ -489,9 +489,24 @@ export default { // add Unassigned category categoriesTemp.push("Unassigned"); - const sorted = categoriesTemp.sort(); + const sortedCategories = categoriesTemp.sort(); - sorted.forEach(category => { + // sort by name property + const sortedScripts = scriptsTemp.sort(function (a, b) { + const nameA = a.name.toUpperCase(); + const nameB = b.name.toUpperCase(); + + if (nameA < nameB) { + return -1; + } + if (nameA > nameB) { + return 1; + } + // names must be equal + return 0; + }); + + sortedCategories.forEach(category => { let temp = { icon: "folder", iconColor: "yellow-9", @@ -500,13 +515,12 @@ export default { id: category, children: [], }; - for (var i = scriptsTemp.length - 1; i >= 0; i--) { - if (scriptsTemp[i].category === category) { - temp.children.push({ label: scriptsTemp[i].name, header: "script", ...scriptsTemp[i] }); - scriptsTemp.splice(i, 1); - } else if (category === "Unassigned" && !scriptsTemp[i].category) { - temp.children.push({ label: scriptsTemp[i].name, header: "script", ...scriptsTemp[i] }); - scriptsTemp.splice(i, 1); + + for (let x = 0; x < sortedScripts.length; x++) { + if (sortedScripts[x].category === category) { + temp.children.push({ label: sortedScripts[x].name, header: "script", ...sortedScripts[x] }); + } else if (category === "Unassigned" && !sortedScripts[x].category) { + temp.children.push({ label: sortedScripts[x].name, header: "script", ...sortedScripts[x] }); } } @@ -633,4 +647,4 @@ export default { }; }, }; - \ No newline at end of file + \ No newline at end of file diff --git a/web/src/components/scripts/ScriptUploadModal.vue b/web/src/components/scripts/ScriptUploadModal.vue index a837671371..abb506b6fd 100644 --- a/web/src/components/scripts/ScriptUploadModal.vue +++ b/web/src/components/scripts/ScriptUploadModal.vue @@ -131,7 +131,6 @@ export default { loading.value = true; let result = ""; try { - console.log(script.value); result = await saveScript(script.value); onDialogOK(); notifySuccess(result); diff --git a/web/src/views/Login.vue b/web/src/views/Login.vue index 263852e197..d35ffb5e8f 100644 --- a/web/src/views/Login.vue +++ b/web/src/views/Login.vue @@ -17,16 +17,22 @@ lazy-rules :rules="[val => (val && val.length > 0) || 'This field is required']" /> - - + > + +
@@ -34,7 +40,7 @@ - + Two-Factor Token @@ -70,6 +76,7 @@ export default { return { credentials: {}, prompt: false, + isPwd: true, }; },