Compare commits
24 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
42cdf70cb4 | ||
|
|
6beb6be131 | ||
|
|
fa4fc2a708 | ||
|
|
2db9758260 | ||
|
|
715982e40a | ||
|
|
d00cd4453a | ||
|
|
429c08c24a | ||
|
|
6a71490e20 | ||
|
|
9bceda0646 | ||
|
|
a1027a6773 | ||
|
|
302d4b75f9 | ||
|
|
5f6ee0e883 | ||
|
|
27f9720de1 | ||
|
|
22aa3fdbbc | ||
|
|
069ecdd33f | ||
|
|
dd545ae933 | ||
|
|
6650b705c4 | ||
|
|
59b0350289 | ||
|
|
1ad159f820 | ||
|
|
0bf42190e9 | ||
|
|
d2fa836232 | ||
|
|
c387774093 | ||
|
|
e99736ba3c | ||
|
|
16cb54fcc9 |
@@ -115,7 +115,10 @@ services:
|
|||||||
redis-dev:
|
redis-dev:
|
||||||
container_name: trmm-redis-dev
|
container_name: trmm-redis-dev
|
||||||
restart: always
|
restart: always
|
||||||
|
command: redis-server --appendonly yes
|
||||||
image: redis:6.0-alpine
|
image: redis:6.0-alpine
|
||||||
|
volumes:
|
||||||
|
- redis-data-dev:/data
|
||||||
networks:
|
networks:
|
||||||
dev:
|
dev:
|
||||||
aliases:
|
aliases:
|
||||||
@@ -247,6 +250,7 @@ volumes:
|
|||||||
postgres-data-dev:
|
postgres-data-dev:
|
||||||
mongo-dev-data:
|
mongo-dev-data:
|
||||||
mesh-data-dev:
|
mesh-data-dev:
|
||||||
|
redis-data-dev:
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
dev:
|
dev:
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ from typing import Any, Dict, List, Union
|
|||||||
from tacticalrmm.celery import app
|
from tacticalrmm.celery import app
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(retry_backoff=5, retry_jitter=True, retry_kwargs={"max_retries": 5})
|
||||||
def generate_agent_checks_task(
|
def generate_agent_checks_task(
|
||||||
policy: int = None,
|
policy: int = None,
|
||||||
site: int = None,
|
site: int = None,
|
||||||
@@ -57,7 +57,9 @@ def generate_agent_checks_task(
|
|||||||
return "ok"
|
return "ok"
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(
|
||||||
|
acks_late=True, retry_backoff=5, retry_jitter=True, retry_kwargs={"max_retries": 5}
|
||||||
|
)
|
||||||
# updates policy managed check fields on agents
|
# updates policy managed check fields on agents
|
||||||
def update_policy_check_fields_task(check: int) -> str:
|
def update_policy_check_fields_task(check: int) -> str:
|
||||||
from checks.models import Check
|
from checks.models import Check
|
||||||
@@ -73,7 +75,7 @@ def update_policy_check_fields_task(check: int) -> str:
|
|||||||
return "ok"
|
return "ok"
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(retry_backoff=5, retry_jitter=True, retry_kwargs={"max_retries": 5})
|
||||||
# generates policy tasks on agents affected by a policy
|
# generates policy tasks on agents affected by a policy
|
||||||
def generate_agent_autotasks_task(policy: int = None) -> str:
|
def generate_agent_autotasks_task(policy: int = None) -> str:
|
||||||
from agents.models import Agent
|
from agents.models import Agent
|
||||||
@@ -100,7 +102,12 @@ def generate_agent_autotasks_task(policy: int = None) -> str:
|
|||||||
return "ok"
|
return "ok"
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(
|
||||||
|
acks_late=True,
|
||||||
|
retry_backoff=5,
|
||||||
|
retry_jitter=True,
|
||||||
|
retry_kwargs={"max_retries": 5},
|
||||||
|
)
|
||||||
def delete_policy_autotasks_task(task: int) -> str:
|
def delete_policy_autotasks_task(task: int) -> str:
|
||||||
from autotasks.models import AutomatedTask
|
from autotasks.models import AutomatedTask
|
||||||
|
|
||||||
@@ -120,7 +127,12 @@ def run_win_policy_autotasks_task(task: int) -> str:
|
|||||||
return "ok"
|
return "ok"
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(
|
||||||
|
acks_late=True,
|
||||||
|
retry_backoff=5,
|
||||||
|
retry_jitter=True,
|
||||||
|
retry_kwargs={"max_retries": 5},
|
||||||
|
)
|
||||||
def update_policy_autotasks_fields_task(task: int, update_agent: bool = False) -> str:
|
def update_policy_autotasks_fields_task(task: int, update_agent: bool = False) -> str:
|
||||||
from autotasks.models import AutomatedTask
|
from autotasks.models import AutomatedTask
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ from django.conf import settings
|
|||||||
from django.contrib.postgres.fields import ArrayField
|
from django.contrib.postgres.fields import ArrayField
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.db.models.fields import DateTimeField
|
from django.db.models.fields import DateTimeField
|
||||||
|
from django.db.utils import DatabaseError
|
||||||
from django.utils import timezone as djangotime
|
from django.utils import timezone as djangotime
|
||||||
from logs.models import BaseAuditModel
|
from logs.models import BaseAuditModel
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
@@ -183,6 +184,7 @@ class AutomatedTask(BaseAuditModel):
|
|||||||
"remove_if_not_scheduled",
|
"remove_if_not_scheduled",
|
||||||
"run_asap_after_missed",
|
"run_asap_after_missed",
|
||||||
"custom_field",
|
"custom_field",
|
||||||
|
"collector_all_output",
|
||||||
]
|
]
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@@ -364,9 +366,14 @@ class AutomatedTask(BaseAuditModel):
|
|||||||
|
|
||||||
if r != "ok" and "The system cannot find the file specified" not in r:
|
if r != "ok" and "The system cannot find the file specified" not in r:
|
||||||
self.sync_status = "pendingdeletion"
|
self.sync_status = "pendingdeletion"
|
||||||
self.save(update_fields=["sync_status"])
|
|
||||||
|
try:
|
||||||
|
self.save(update_fields=["sync_status"])
|
||||||
|
except DatabaseError:
|
||||||
|
pass
|
||||||
|
|
||||||
logger.warning(
|
logger.warning(
|
||||||
f"{agent.hostname} task {self.name} was successfully modified"
|
f"{agent.hostname} task {self.name} will be deleted on next checkin"
|
||||||
)
|
)
|
||||||
return "timeout"
|
return "timeout"
|
||||||
else:
|
else:
|
||||||
|
|||||||
22
api/tacticalrmm/checks/migrations/0024_auto_20210606_1632.py
Normal file
22
api/tacticalrmm/checks/migrations/0024_auto_20210606_1632.py
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# Generated by Django 3.2.1 on 2021-06-06 16:32
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('checks', '0023_check_run_interval'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='checkhistory',
|
||||||
|
name='check_history',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='checkhistory',
|
||||||
|
name='check_id',
|
||||||
|
field=models.PositiveIntegerField(default=0),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -313,7 +313,7 @@ class Check(BaseAuditModel):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def add_check_history(self, value: int, more_info: Any = None) -> None:
|
def add_check_history(self, value: int, more_info: Any = None) -> None:
|
||||||
CheckHistory.objects.create(check_history=self, y=value, results=more_info)
|
CheckHistory.objects.create(check_id=self.pk, y=value, results=more_info)
|
||||||
|
|
||||||
def handle_check(self, data):
|
def handle_check(self, data):
|
||||||
from alerts.models import Alert
|
from alerts.models import Alert
|
||||||
@@ -509,7 +509,12 @@ class Check(BaseAuditModel):
|
|||||||
)
|
)
|
||||||
|
|
||||||
for task in self.assignedtask.all(): # type: ignore
|
for task in self.assignedtask.all(): # type: ignore
|
||||||
task.create_policy_task(agent=agent, policy=policy, assigned_check=check)
|
if policy or (
|
||||||
|
agent and not agent.autotasks.filter(parent_task=task.pk).exists()
|
||||||
|
):
|
||||||
|
task.create_policy_task(
|
||||||
|
agent=agent, policy=policy, assigned_check=check
|
||||||
|
)
|
||||||
|
|
||||||
for field in self.policy_fields_to_copy:
|
for field in self.policy_fields_to_copy:
|
||||||
setattr(check, field, getattr(self, field))
|
setattr(check, field, getattr(self, field))
|
||||||
@@ -683,14 +688,10 @@ class Check(BaseAuditModel):
|
|||||||
|
|
||||||
|
|
||||||
class CheckHistory(models.Model):
|
class CheckHistory(models.Model):
|
||||||
check_history = models.ForeignKey(
|
check_id = models.PositiveIntegerField(default=0)
|
||||||
Check,
|
|
||||||
related_name="check_history",
|
|
||||||
on_delete=models.CASCADE,
|
|
||||||
)
|
|
||||||
x = models.DateTimeField(auto_now_add=True)
|
x = models.DateTimeField(auto_now_add=True)
|
||||||
y = models.PositiveIntegerField(null=True, blank=True, default=None)
|
y = models.PositiveIntegerField(null=True, blank=True, default=None)
|
||||||
results = models.JSONField(null=True, blank=True)
|
results = models.JSONField(null=True, blank=True)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.check_history.readable_desc
|
return self.x
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from autotasks.models import AutomatedTask
|
|||||||
from scripts.serializers import ScriptCheckSerializer, ScriptSerializer
|
from scripts.serializers import ScriptCheckSerializer, ScriptSerializer
|
||||||
|
|
||||||
from .models import Check, CheckHistory
|
from .models import Check, CheckHistory
|
||||||
|
from scripts.models import Script
|
||||||
|
|
||||||
|
|
||||||
class AssignedTaskField(serializers.ModelSerializer):
|
class AssignedTaskField(serializers.ModelSerializer):
|
||||||
@@ -159,6 +160,15 @@ class AssignedTaskCheckRunnerField(serializers.ModelSerializer):
|
|||||||
class CheckRunnerGetSerializer(serializers.ModelSerializer):
|
class CheckRunnerGetSerializer(serializers.ModelSerializer):
|
||||||
# only send data needed for agent to run a check
|
# only send data needed for agent to run a check
|
||||||
script = ScriptCheckSerializer(read_only=True)
|
script = ScriptCheckSerializer(read_only=True)
|
||||||
|
script_args = serializers.SerializerMethodField()
|
||||||
|
|
||||||
|
def get_script_args(self, obj):
|
||||||
|
if obj.check_type != "script":
|
||||||
|
return []
|
||||||
|
|
||||||
|
return Script.parse_script_args(
|
||||||
|
agent=obj.agent, shell=obj.script.shell, args=obj.script_args
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Check
|
model = Check
|
||||||
|
|||||||
@@ -363,10 +363,10 @@ class TestCheckViews(TacticalTestCase):
|
|||||||
# setup data
|
# setup data
|
||||||
agent = baker.make_recipe("agents.agent")
|
agent = baker.make_recipe("agents.agent")
|
||||||
check = baker.make_recipe("checks.diskspace_check", agent=agent)
|
check = baker.make_recipe("checks.diskspace_check", agent=agent)
|
||||||
baker.make("checks.CheckHistory", check_history=check, _quantity=30)
|
baker.make("checks.CheckHistory", check_id=check.id, _quantity=30)
|
||||||
check_history_data = baker.make(
|
check_history_data = baker.make(
|
||||||
"checks.CheckHistory",
|
"checks.CheckHistory",
|
||||||
check_history=check,
|
check_id=check.id,
|
||||||
_quantity=30,
|
_quantity=30,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -407,10 +407,10 @@ class TestCheckTasks(TacticalTestCase):
|
|||||||
|
|
||||||
# setup data
|
# setup data
|
||||||
check = baker.make_recipe("checks.diskspace_check")
|
check = baker.make_recipe("checks.diskspace_check")
|
||||||
baker.make("checks.CheckHistory", check_history=check, _quantity=30)
|
baker.make("checks.CheckHistory", check_id=check.id, _quantity=30)
|
||||||
check_history_data = baker.make(
|
check_history_data = baker.make(
|
||||||
"checks.CheckHistory",
|
"checks.CheckHistory",
|
||||||
check_history=check,
|
check_id=check.id,
|
||||||
_quantity=30,
|
_quantity=30,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -8,5 +8,5 @@ urlpatterns = [
|
|||||||
path("<pk>/loadchecks/", views.load_checks),
|
path("<pk>/loadchecks/", views.load_checks),
|
||||||
path("getalldisks/", views.get_disks_for_policies),
|
path("getalldisks/", views.get_disks_for_policies),
|
||||||
path("runchecks/<pk>/", views.run_checks),
|
path("runchecks/<pk>/", views.run_checks),
|
||||||
path("history/<int:checkpk>/", views.CheckHistory.as_view()),
|
path("history/<int:checkpk>/", views.GetCheckHistory.as_view()),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ from automation.models import Policy
|
|||||||
from scripts.models import Script
|
from scripts.models import Script
|
||||||
from tacticalrmm.utils import notify_error
|
from tacticalrmm.utils import notify_error
|
||||||
|
|
||||||
from .models import Check
|
from .models import Check, CheckHistory
|
||||||
from .permissions import ManageChecksPerms, RunChecksPerms
|
from .permissions import ManageChecksPerms, RunChecksPerms
|
||||||
from .serializers import CheckHistorySerializer, CheckSerializer
|
from .serializers import CheckHistorySerializer, CheckSerializer
|
||||||
|
|
||||||
@@ -146,7 +146,7 @@ class GetUpdateDeleteCheck(APIView):
|
|||||||
return Response(f"{check.readable_desc} was deleted!")
|
return Response(f"{check.readable_desc} was deleted!")
|
||||||
|
|
||||||
|
|
||||||
class CheckHistory(APIView):
|
class GetCheckHistory(APIView):
|
||||||
def patch(self, request, checkpk):
|
def patch(self, request, checkpk):
|
||||||
check = get_object_or_404(Check, pk=checkpk)
|
check = get_object_or_404(Check, pk=checkpk)
|
||||||
|
|
||||||
@@ -160,7 +160,7 @@ class CheckHistory(APIView):
|
|||||||
- djangotime.timedelta(days=request.data["timeFilter"]),
|
- djangotime.timedelta(days=request.data["timeFilter"]),
|
||||||
)
|
)
|
||||||
|
|
||||||
check_history = check.check_history.filter(timeFilter).order_by("-x") # type: ignore
|
check_history = CheckHistory.objects.filter(check_id=checkpk).filter(timeFilter).order_by("-x") # type: ignore
|
||||||
|
|
||||||
return Response(
|
return Response(
|
||||||
CheckHistorySerializer(
|
CheckHistorySerializer(
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
asgiref==3.3.4
|
asgiref==3.3.4
|
||||||
asyncio-nats-client==0.11.4
|
asyncio-nats-client==0.11.4
|
||||||
celery==5.1.0
|
celery==5.1.0
|
||||||
certifi==2020.12.5
|
certifi==2021.5.30
|
||||||
cffi==1.14.5
|
cffi==1.14.5
|
||||||
channels==3.0.3
|
channels==3.0.3
|
||||||
channels_redis==3.2.0
|
channels_redis==3.2.0
|
||||||
chardet==4.0.0
|
chardet==4.0.0
|
||||||
cryptography==3.4.7
|
cryptography==3.4.7
|
||||||
daphne==3.0.2
|
daphne==3.0.2
|
||||||
Django==3.2.3
|
Django==3.2.4
|
||||||
django-cors-headers==3.7.0
|
django-cors-headers==3.7.0
|
||||||
django-rest-knox==4.1.0
|
django-rest-knox==4.1.0
|
||||||
djangorestframework==3.12.4
|
djangorestframework==3.12.4
|
||||||
@@ -27,7 +27,7 @@ redis==3.5.3
|
|||||||
requests==2.25.1
|
requests==2.25.1
|
||||||
six==1.16.0
|
six==1.16.0
|
||||||
sqlparse==0.4.1
|
sqlparse==0.4.1
|
||||||
twilio==6.59.0
|
twilio==6.59.1
|
||||||
urllib3==1.26.5
|
urllib3==1.26.5
|
||||||
uWSGI==2.0.19.1
|
uWSGI==2.0.19.1
|
||||||
validators==0.18.2
|
validators==0.18.2
|
||||||
|
|||||||
@@ -15,20 +15,20 @@ EXE_DIR = os.path.join(BASE_DIR, "tacticalrmm/private/exe")
|
|||||||
AUTH_USER_MODEL = "accounts.User"
|
AUTH_USER_MODEL = "accounts.User"
|
||||||
|
|
||||||
# latest release
|
# latest release
|
||||||
TRMM_VERSION = "0.6.13"
|
TRMM_VERSION = "0.6.15"
|
||||||
|
|
||||||
# bump this version everytime vue code is changed
|
# bump this version everytime vue code is changed
|
||||||
# to alert user they need to manually refresh their browser
|
# to alert user they need to manually refresh their browser
|
||||||
APP_VER = "0.0.137"
|
APP_VER = "0.0.138"
|
||||||
|
|
||||||
# https://github.com/wh1te909/rmmagent
|
# https://github.com/wh1te909/rmmagent
|
||||||
LATEST_AGENT_VER = "1.5.7"
|
LATEST_AGENT_VER = "1.5.8"
|
||||||
|
|
||||||
MESH_VER = "0.8.49"
|
MESH_VER = "0.8.60"
|
||||||
|
|
||||||
# for the update script, bump when need to recreate venv or npm install
|
# for the update script, bump when need to recreate venv or npm install
|
||||||
PIP_VER = "17"
|
PIP_VER = "18"
|
||||||
NPM_VER = "16"
|
NPM_VER = "17"
|
||||||
|
|
||||||
SETUPTOOLS_VER = "57.0.0"
|
SETUPTOOLS_VER = "57.0.0"
|
||||||
WHEEL_VER = "0.36.2"
|
WHEEL_VER = "0.36.2"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
SCRIPT_VERSION="12"
|
SCRIPT_VERSION="13"
|
||||||
SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/backup.sh'
|
SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/backup.sh'
|
||||||
|
|
||||||
GREEN='\033[0;32m'
|
GREEN='\033[0;32m'
|
||||||
@@ -59,6 +59,7 @@ mkdir ${tmp_dir}/nginx
|
|||||||
mkdir ${tmp_dir}/systemd
|
mkdir ${tmp_dir}/systemd
|
||||||
mkdir ${tmp_dir}/rmm
|
mkdir ${tmp_dir}/rmm
|
||||||
mkdir ${tmp_dir}/confd
|
mkdir ${tmp_dir}/confd
|
||||||
|
mkdir ${tmp_dir}/redis
|
||||||
|
|
||||||
|
|
||||||
pg_dump --dbname=postgresql://"${POSTGRES_USER}":"${POSTGRES_PW}"@127.0.0.1:5432/tacticalrmm | gzip -9 > ${tmp_dir}/postgres/db-${dt_now}.psql.gz
|
pg_dump --dbname=postgresql://"${POSTGRES_USER}":"${POSTGRES_PW}"@127.0.0.1:5432/tacticalrmm | gzip -9 > ${tmp_dir}/postgres/db-${dt_now}.psql.gz
|
||||||
@@ -72,6 +73,8 @@ sudo tar -czvf ${tmp_dir}/nginx/etc-nginx.tar.gz -C /etc/nginx .
|
|||||||
|
|
||||||
sudo tar -czvf ${tmp_dir}/confd/etc-confd.tar.gz -C /etc/conf.d .
|
sudo tar -czvf ${tmp_dir}/confd/etc-confd.tar.gz -C /etc/conf.d .
|
||||||
|
|
||||||
|
sudo tar -czvf ${tmp_dir}/redis/etc-redis.tar.gz -C /var/lib/redis/appendonly.aof
|
||||||
|
|
||||||
sudo cp ${sysd}/rmm.service ${sysd}/celery.service ${sysd}/celerybeat.service ${sysd}/meshcentral.service ${sysd}/nats.service ${tmp_dir}/systemd/
|
sudo cp ${sysd}/rmm.service ${sysd}/celery.service ${sysd}/celerybeat.service ${sysd}/meshcentral.service ${sysd}/nats.service ${tmp_dir}/systemd/
|
||||||
if [ -f "${sysd}/daphne.service" ]; then
|
if [ -f "${sysd}/daphne.service" ]; then
|
||||||
sudo cp ${sysd}/daphne.service ${tmp_dir}/systemd/
|
sudo cp ${sysd}/daphne.service ${tmp_dir}/systemd/
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ volumes:
|
|||||||
postgres_data:
|
postgres_data:
|
||||||
mongo_data:
|
mongo_data:
|
||||||
mesh_data:
|
mesh_data:
|
||||||
|
redis_data:
|
||||||
|
|
||||||
services:
|
services:
|
||||||
# postgres database for api service
|
# postgres database for api service
|
||||||
@@ -38,7 +39,10 @@ services:
|
|||||||
tactical-redis:
|
tactical-redis:
|
||||||
container_name: trmm-redis
|
container_name: trmm-redis
|
||||||
image: redis:6.0-alpine
|
image: redis:6.0-alpine
|
||||||
|
command: redis-server --appendonly yes
|
||||||
restart: always
|
restart: always
|
||||||
|
volumes:
|
||||||
|
- redis_data:/data
|
||||||
networks:
|
networks:
|
||||||
- redis
|
- redis
|
||||||
|
|
||||||
|
|||||||
@@ -61,6 +61,8 @@ Category or Function - What It Does
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
*****
|
||||||
|
|
||||||
## Making Script Files
|
## Making Script Files
|
||||||
|
|
||||||
### Good Habits
|
### Good Habits
|
||||||
@@ -117,6 +119,8 @@ c:\ProgramData\TacticalRMM\
|
|||||||
- Doesn't play well with other community scripts (reused names etc.)
|
- Doesn't play well with other community scripts (reused names etc.)
|
||||||
|
|
||||||
|
|
||||||
|
*****
|
||||||
|
|
||||||
## Useful Reference Script Examples
|
## Useful Reference Script Examples
|
||||||
|
|
||||||
RunAsUser (since Tactical RMM runs as system)
|
RunAsUser (since Tactical RMM runs as system)
|
||||||
@@ -128,6 +132,8 @@ Command Paramater Ninja
|
|||||||
Optional Command Parameters and testing for errors
|
Optional Command Parameters and testing for errors
|
||||||
[https://github.com/wh1te909/tacticalrmm/blob/develop/scripts/Win_Rename_Computer.ps1](https://github.com/wh1te909/tacticalrmm/blob/develop/scripts/Win_Rename_Computer.ps1)
|
[https://github.com/wh1te909/tacticalrmm/blob/develop/scripts/Win_Rename_Computer.ps1](https://github.com/wh1te909/tacticalrmm/blob/develop/scripts/Win_Rename_Computer.ps1)
|
||||||
|
|
||||||
|
*****
|
||||||
|
|
||||||
## Volunteers Needed
|
## 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 here: [https://github.com/wh1te909/tacticalrmm/tree/develop/scripts_wip](https://github.com/wh1te909/tacticalrmm/tree/develop/scripts_wip)
|
||||||
|
|||||||
@@ -105,6 +105,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
|
Check your Github fork in browser, should be up to date now with original. Repeat 6 or 7 as necessary
|
||||||
|
|
||||||
|
*****
|
||||||
## Reference
|
## Reference
|
||||||
|
|
||||||
### Customizing the Admin Web Interface
|
### Customizing the Admin Web Interface
|
||||||
|
|||||||
58
docs/docs/howitallworks.md
Normal file
58
docs/docs/howitallworks.md
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
# How It All Works
|
||||||
|
|
||||||
|
INSERT WIREFRAME GRAPHIC HERE USING <https://www.yworks.com/yed-live/>
|
||||||
|
|
||||||
|
## Server
|
||||||
|
|
||||||
|
## Windows Agent
|
||||||
|
|
||||||
|
Found in `%programfiles%\TacticalAgent`
|
||||||
|
|
||||||
|
### Services
|
||||||
|
|
||||||
|
3 services exist on all clients
|
||||||
|
|
||||||
|
* `Mesh Agent`
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
**AND**
|
||||||
|
|
||||||
|
* `TacticalAgent` and `Tactical RMM RPC Service`
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
The [MeshCentral](https://meshcentral.com/) system which is accessible from <https://mesh.example.com> and is used
|
||||||
|
|
||||||
|
`Tactical RMM Agent`
|
||||||
|
|
||||||
|
* It runs 2 goroutines
|
||||||
|
* one is the checkrunner which runs all the checks and then just sleeps until it's time to run more checks
|
||||||
|
* 2nd goroutine periodically sends info about the agent to the rmm and also handles agent recovery
|
||||||
|
|
||||||
|
!!!note
|
||||||
|
In Task Manager you will see additional `Tactical RMM Agent` processes appear and disappear. These are your Checks and Tasks running at scheduled intervals
|
||||||
|
|
||||||
|
`Tactical RMM RPC Service`
|
||||||
|
|
||||||
|
* Uses the pub/sub model so anytime you do anything realtime from rmm (like a send command or run script)
|
||||||
|
* It maintains a persistent connection to your to the api.example.com rmm server on port **443 CONFIRM** and is listening for events
|
||||||
|
* It handles your Agent updates (Auto triggers at 35mins past every hour or when run manually from server Agents | Update Agents menu)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
### Agent Installation Process
|
||||||
|
|
||||||
|
Adds Defender AV exclusions
|
||||||
|
|
||||||
|
Copies
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
### Agent Update Process
|
||||||
|
|
||||||
|
Downloads latest `winagent-vx.x.x-x86/64.exe` to `%programfiles%`
|
||||||
|
|
||||||
|
Executes the file (INNO setup exe)
|
||||||
|
|
||||||
|
Files create `c:\Windows\temp\Tacticalxxxx\` folder for install (and log files)
|
||||||
BIN
docs/docs/images/trmm_services.png
Normal file
BIN
docs/docs/images/trmm_services.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 29 KiB |
BIN
docs/docs/images/trmm_services__taskmanager_agent.png
Normal file
BIN
docs/docs/images/trmm_services__taskmanager_agent.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 120 KiB |
BIN
docs/docs/images/trmm_services__taskmanager_mesh.png
Normal file
BIN
docs/docs/images/trmm_services__taskmanager_mesh.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 64 KiB |
BIN
docs/docs/images/trmm_services_mesh.png
Normal file
BIN
docs/docs/images/trmm_services_mesh.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
BIN
docs/docs/images/trmm_user_preferences.png
Normal file
BIN
docs/docs/images/trmm_user_preferences.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.6 KiB |
52
docs/docs/tipsntricks.md
Normal file
52
docs/docs/tipsntricks.md
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
# Tips and Tricks
|
||||||
|
|
||||||
|
## Customize User Interface
|
||||||
|
|
||||||
|
Top right click Username, look at preferences pane. Set default tab: Servers|Workstations|Mixed
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
*****
|
||||||
|
|
||||||
|
## Screenconnect / Connectwise Control
|
||||||
|
|
||||||
|
### Install Tactical RMM via Screeconnect commands window
|
||||||
|
|
||||||
|
1. Create a Deplopment under Agents | Manage Deployments
|
||||||
|
2. Replace `<deployment URL>` below with your Deployment Download Link.
|
||||||
|
|
||||||
|
**x64**
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
#!ps
|
||||||
|
#maxlength=500000
|
||||||
|
#timeout=600000
|
||||||
|
|
||||||
|
Invoke-WebRequest "<deployment URL>" -OutFile ( New-Item -Path "C:\temp\trmminstallx64.exe" -Force )
|
||||||
|
$proc = Start-Process c:\temp\trmminstallx64.exe -ArgumentList '-silent' -PassThru
|
||||||
|
Wait-Process -InputObject $proc
|
||||||
|
|
||||||
|
if ($proc.ExitCode -ne 0) {
|
||||||
|
Write-Warning "$_ exited with status code $($proc.ExitCode)"
|
||||||
|
}
|
||||||
|
Remove-Item -Path "c:\temp\trmminstallx64.exe" -Force
|
||||||
|
```
|
||||||
|
|
||||||
|
**x86**
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
#!ps
|
||||||
|
#maxlength=500000
|
||||||
|
#timeout=600000
|
||||||
|
|
||||||
|
Invoke-WebRequest "<deployment URL>" -OutFile ( New-Item -Path "C:\temp\trmminstallx86.exe" -Force )
|
||||||
|
$proc = Start-Process c:\temp\trmminstallx86.exe -ArgumentList '-silent' -PassThru
|
||||||
|
Wait-Process -InputObject $proc
|
||||||
|
|
||||||
|
if ($proc.ExitCode -ne 0) {
|
||||||
|
Write-Warning "$_ exited with status code $($proc.ExitCode)"
|
||||||
|
}
|
||||||
|
Remove-Item -Path "c:\temp\trmminstallx86.exe" -Force
|
||||||
|
```
|
||||||
|
|
||||||
|
###
|
||||||
14
install.sh
14
install.sh
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
SCRIPT_VERSION="49"
|
SCRIPT_VERSION="50"
|
||||||
SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/install.sh'
|
SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/install.sh'
|
||||||
|
|
||||||
sudo apt install -y curl wget dirmngr gnupg lsb-release
|
sudo apt install -y curl wget dirmngr gnupg lsb-release
|
||||||
@@ -217,6 +217,10 @@ sudo rm -rf Python-3.9.2 Python-3.9.2.tgz
|
|||||||
print_green 'Installing redis and git'
|
print_green 'Installing redis and git'
|
||||||
sudo apt install -y ca-certificates redis git
|
sudo apt install -y ca-certificates redis git
|
||||||
|
|
||||||
|
# apply redis configuration
|
||||||
|
sudo redis-cli config set appendonly yes
|
||||||
|
sudo redis-cli config rewrite
|
||||||
|
|
||||||
print_green 'Installing postgresql'
|
print_green 'Installing postgresql'
|
||||||
|
|
||||||
echo "$postgresql_repo" | sudo tee /etc/apt/sources.list.d/pgdg.list
|
echo "$postgresql_repo" | sudo tee /etc/apt/sources.list.d/pgdg.list
|
||||||
@@ -487,12 +491,14 @@ map \$http_user_agent \$ignore_ua {
|
|||||||
|
|
||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
server_name ${rmmdomain};
|
server_name ${rmmdomain};
|
||||||
return 301 https://\$server_name\$request_uri;
|
return 301 https://\$server_name\$request_uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
server {
|
server {
|
||||||
listen 443 ssl;
|
listen 443 ssl;
|
||||||
|
listen [::]:443 ssl;
|
||||||
server_name ${rmmdomain};
|
server_name ${rmmdomain};
|
||||||
client_max_body_size 300M;
|
client_max_body_size 300M;
|
||||||
access_log /rmm/api/tacticalrmm/tacticalrmm/private/log/access.log combined if=\$ignore_ua;
|
access_log /rmm/api/tacticalrmm/tacticalrmm/private/log/access.log combined if=\$ignore_ua;
|
||||||
@@ -549,6 +555,7 @@ echo "${nginxrmm}" | sudo tee /etc/nginx/sites-available/rmm.conf > /dev/null
|
|||||||
nginxmesh="$(cat << EOF
|
nginxmesh="$(cat << EOF
|
||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
server_name ${meshdomain};
|
server_name ${meshdomain};
|
||||||
return 301 https://\$server_name\$request_uri;
|
return 301 https://\$server_name\$request_uri;
|
||||||
}
|
}
|
||||||
@@ -556,6 +563,7 @@ server {
|
|||||||
server {
|
server {
|
||||||
|
|
||||||
listen 443 ssl;
|
listen 443 ssl;
|
||||||
|
listen [::]:443 ssl;
|
||||||
proxy_send_timeout 330s;
|
proxy_send_timeout 330s;
|
||||||
proxy_read_timeout 330s;
|
proxy_read_timeout 330s;
|
||||||
server_name ${meshdomain};
|
server_name ${meshdomain};
|
||||||
@@ -710,6 +718,7 @@ server {
|
|||||||
access_log /var/log/nginx/frontend-access.log;
|
access_log /var/log/nginx/frontend-access.log;
|
||||||
|
|
||||||
listen 443 ssl;
|
listen 443 ssl;
|
||||||
|
listen [::]:443 ssl;
|
||||||
ssl_certificate ${CERT_PUB_KEY};
|
ssl_certificate ${CERT_PUB_KEY};
|
||||||
ssl_certificate_key ${CERT_PRIV_KEY};
|
ssl_certificate_key ${CERT_PRIV_KEY};
|
||||||
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';
|
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';
|
||||||
@@ -720,7 +729,8 @@ server {
|
|||||||
return 301 https://\$host\$request_uri;
|
return 301 https://\$host\$request_uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
listen 80;
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
server_name ${frontenddomain};
|
server_name ${frontenddomain};
|
||||||
return 404;
|
return 404;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
SCRIPT_VERSION="27"
|
SCRIPT_VERSION="28"
|
||||||
SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/restore.sh'
|
SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/restore.sh'
|
||||||
|
|
||||||
sudo apt update
|
sudo apt update
|
||||||
@@ -189,6 +189,13 @@ sudo rm -rf Python-3.9.2 Python-3.9.2.tgz
|
|||||||
print_green 'Installing redis and git'
|
print_green 'Installing redis and git'
|
||||||
sudo apt install -y ca-certificates redis git
|
sudo apt install -y ca-certificates redis git
|
||||||
|
|
||||||
|
# redis configuration
|
||||||
|
sudo tar -xzf ${tmp_dir}/redis/etc-redis.tar.gz -C /var/lib/redis
|
||||||
|
sudo redis-check-aof --fix /var/lib/redis/appendonly.aof
|
||||||
|
|
||||||
|
sudo redis-cli config set appendonly yes
|
||||||
|
sudo redis-cli config rewrite
|
||||||
|
|
||||||
print_green 'Installing postgresql'
|
print_green 'Installing postgresql'
|
||||||
|
|
||||||
echo "$postgresql_repo" | sudo tee /etc/apt/sources.list.d/pgdg.list
|
echo "$postgresql_repo" | sudo tee /etc/apt/sources.list.d/pgdg.list
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
#antivirusName must match the "displayName" exactly
|
#antivirusName must match the "displayName" exactly
|
||||||
#If no antivirusName parameter is specified, the tool returns success if there is any active up to date antivirus on the system
|
#If no antivirusName parameter is specified, the tool returns success if there is any active up to date antivirus on the system
|
||||||
|
|
||||||
|
# OS Build must be greater than 14393 to support this script. If it's not it returns exit code 2
|
||||||
|
|
||||||
|
|
||||||
param($antivirusName = "*")
|
param($antivirusName = "*")
|
||||||
|
|
||||||
@@ -93,6 +95,11 @@ function Add-ProductStates {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ([environment]::OSVersion.Version.Build -le 14393) {
|
||||||
|
write-host "Antivirus check not supported on this OS. Returning Exit Code 2."
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
$return = Get-CimInstance -Namespace root/SecurityCenter2 -className AntivirusProduct |
|
$return = Get-CimInstance -Namespace root/SecurityCenter2 -className AntivirusProduct |
|
||||||
Where-Object {
|
Where-Object {
|
||||||
|
|||||||
@@ -1,4 +1,9 @@
|
|||||||
## Copied from https://github.com/ThatsNASt/tacticalrmm to add to new pull request for https://github.com/wh1te909/tacticalrmm
|
## Copied from https://github.com/ThatsNASt/tacticalrmm to add to new pull request for https://github.com/wh1te909/tacticalrmm
|
||||||
|
#
|
||||||
|
# WARNING
|
||||||
|
# 1. Only applies to drive C
|
||||||
|
# 2. Assumes you're encrypting more than the used space. "Used Space Only Encrypted" is the default windows behavior which is not compatible here.
|
||||||
|
|
||||||
function Log-Message {
|
function Log-Message {
|
||||||
Param
|
Param
|
||||||
(
|
(
|
||||||
@@ -22,7 +27,7 @@ function Log-Message {
|
|||||||
$log = "BitlockerReport.txt"
|
$log = "BitlockerReport.txt"
|
||||||
|
|
||||||
#Find BL info
|
#Find BL info
|
||||||
$mbde = [string](manage-bde -status)
|
$mbde = [string](manage-bde -status C:)
|
||||||
$mbdeProt = (manage-bde -protectors -get c: | Select-Object -Skip 6)
|
$mbdeProt = (manage-bde -protectors -get c: | Select-Object -Skip 6)
|
||||||
#Dig out the recovery password, check for PIN
|
#Dig out the recovery password, check for PIN
|
||||||
ForEach ($line in $mbdeProt) {
|
ForEach ($line in $mbdeProt) {
|
||||||
@@ -94,4 +99,4 @@ if ($Encrypted -eq "Yes" -and $RecoveryPassword -and $PIN -eq $true) {
|
|||||||
Log-Message "SUCCESS: Encrypted, PIN enabled, password is set." $log e
|
Log-Message "SUCCESS: Encrypted, PIN enabled, password is set." $log e
|
||||||
Write-Host "Script check passed"
|
Write-Host "Script check passed"
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
SCRIPT_VERSION="122"
|
SCRIPT_VERSION="123"
|
||||||
SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/update.sh'
|
SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/update.sh'
|
||||||
LATEST_SETTINGS_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/api/tacticalrmm/tacticalrmm/settings.py'
|
LATEST_SETTINGS_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/api/tacticalrmm/tacticalrmm/settings.py'
|
||||||
YELLOW='\033[1;33m'
|
YELLOW='\033[1;33m'
|
||||||
@@ -307,5 +307,9 @@ if [[ "${CURRENT_MESH_VER}" != "${LATEST_MESH_VER}" ]] || [[ "$force" = true ]];
|
|||||||
sudo systemctl start meshcentral
|
sudo systemctl start meshcentral
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# apply redis configuration
|
||||||
|
sudo redis-cli config set appendonly yes
|
||||||
|
sudo redis-cli config rewrite
|
||||||
|
|
||||||
rm -f $TMP_SETTINGS
|
rm -f $TMP_SETTINGS
|
||||||
printf >&2 "${GREEN}Update finished!${NC}\n"
|
printf >&2 "${GREEN}Update finished!${NC}\n"
|
||||||
120
web/package-lock.json
generated
120
web/package-lock.json
generated
@@ -7,20 +7,20 @@
|
|||||||
"": {
|
"": {
|
||||||
"version": "0.1.8",
|
"version": "0.1.8",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@quasar/extras": "^1.10.5",
|
"@quasar/extras": "^1.10.6",
|
||||||
"apexcharts": "^3.23.1",
|
"apexcharts": "^3.23.1",
|
||||||
"axios": "^0.21.1",
|
"axios": "^0.21.1",
|
||||||
"dotenv": "^8.2.0",
|
"dotenv": "^8.2.0",
|
||||||
"prismjs": "^1.22.0",
|
"prismjs": "^1.22.0",
|
||||||
"qrcode.vue": "^1.7.0",
|
"qrcode.vue": "^1.7.0",
|
||||||
"quasar": "^1.15.18",
|
"quasar": "^1.15.20",
|
||||||
"vue-apexcharts": "^1.6.0",
|
"vue-apexcharts": "^1.6.0",
|
||||||
"vue-prism-editor": "^1.2.2"
|
"vue-prism-editor": "^1.2.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@quasar/app": "^2.2.7",
|
"@quasar/app": "^2.2.10",
|
||||||
"@quasar/cli": "^1.2.0",
|
"@quasar/cli": "^1.2.1",
|
||||||
"core-js": "^3.13.0",
|
"core-js": "^3.14.0",
|
||||||
"eslint-plugin-cypress": "^2.11.2",
|
"eslint-plugin-cypress": "^2.11.2",
|
||||||
"flush-promises": "^1.0.2",
|
"flush-promises": "^1.0.2",
|
||||||
"fs-extra": "^9.1.0"
|
"fs-extra": "^9.1.0"
|
||||||
@@ -1660,11 +1660,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@quasar/app": {
|
"node_modules/@quasar/app": {
|
||||||
"version": "2.2.7",
|
"version": "2.2.10",
|
||||||
"resolved": "https://registry.npmjs.org/@quasar/app/-/app-2.2.7.tgz",
|
"resolved": "https://registry.npmjs.org/@quasar/app/-/app-2.2.10.tgz",
|
||||||
"integrity": "sha512-twFtT5215fLDcaN4XVi1Aa/mmSxnRBAb0WZePii6JkMqcWwo9tK4IFDbwvzabbssjOD71px9aoPAlD55xUSQlA==",
|
"integrity": "sha512-Gx8YY6KNxiLo13bbNMIhx64dn/PYRobhDb/P44QAQKJ4WNnHjqU56T1A5rrBhMZATnuW+7usEupuFduRyG8KvQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@quasar/babel-preset-app": "2.0.1",
|
"@quasar/babel-preset-app": "2.0.1",
|
||||||
"@quasar/fastclick": "1.1.4",
|
"@quasar/fastclick": "1.1.4",
|
||||||
@@ -1728,12 +1727,12 @@
|
|||||||
"ts-loader": "8.0.17",
|
"ts-loader": "8.0.17",
|
||||||
"typescript": "4.2.2",
|
"typescript": "4.2.2",
|
||||||
"url-loader": "4.1.1",
|
"url-loader": "4.1.1",
|
||||||
"vue": "2.6.12",
|
"vue": "2.6.14",
|
||||||
"vue-loader": "15.9.7",
|
"vue-loader": "15.9.7",
|
||||||
"vue-router": "3.5.1",
|
"vue-router": "3.5.1",
|
||||||
"vue-server-renderer": "2.6.12",
|
"vue-server-renderer": "2.6.14",
|
||||||
"vue-style-loader": "4.1.3",
|
"vue-style-loader": "4.1.3",
|
||||||
"vue-template-compiler": "2.6.12",
|
"vue-template-compiler": "2.6.14",
|
||||||
"vuex": "3.6.2",
|
"vuex": "3.6.2",
|
||||||
"webpack": "4.44.2",
|
"webpack": "4.44.2",
|
||||||
"webpack-bundle-analyzer": "4.4.2",
|
"webpack-bundle-analyzer": "4.4.2",
|
||||||
@@ -1835,10 +1834,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@quasar/cli": {
|
"node_modules/@quasar/cli": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/@quasar/cli/-/cli-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/@quasar/cli/-/cli-1.2.1.tgz",
|
||||||
"integrity": "sha512-tungPBaMrJyo/8gtH0cS7VhxWXrG+az0ZUXpvdWqsN9Ymrm+Ld1GZ3zhZLcMLi76VfMfxvYdQRcAbkweGtrprw==",
|
"integrity": "sha512-WsfsDOlxSpOW8TlCSdmkrSb1Mop54omUlm6clmRuDvlu6Blt7i/ffklfls+3dPNnD/aISy5pPeqB8KNDKChAGg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"async": "3.2.0",
|
"async": "3.2.0",
|
||||||
"chalk": "4.1.1",
|
"chalk": "4.1.1",
|
||||||
@@ -1995,9 +1995,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@quasar/extras": {
|
"node_modules/@quasar/extras": {
|
||||||
"version": "1.10.5",
|
"version": "1.10.6",
|
||||||
"resolved": "https://registry.npmjs.org/@quasar/extras/-/extras-1.10.5.tgz",
|
"resolved": "https://registry.npmjs.org/@quasar/extras/-/extras-1.10.6.tgz",
|
||||||
"integrity": "sha512-iBI9bRfomvxfnE2RUYMK0q7tki7Y0I0KMLuxoSEQC0OsOghJ/3ANENyGm1S0AsVMmNYwj0bzQWYVA6KD7/NwHg==",
|
"integrity": "sha512-LdqgITUDWr6c3bTS0Br/UIE+92JvUdZ0mu08qM4C+y0t6Q4i4WYgbjurLJKpU55g5zUXvzra868qbljLbNSLxg==",
|
||||||
"funding": {
|
"funding": {
|
||||||
"type": "github",
|
"type": "github",
|
||||||
"url": "https://donate.quasar.dev"
|
"url": "https://donate.quasar.dev"
|
||||||
@@ -4826,9 +4826,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/core-js": {
|
"node_modules/core-js": {
|
||||||
"version": "3.13.0",
|
"version": "3.14.0",
|
||||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.14.0.tgz",
|
||||||
"integrity": "sha512-iWDbiyha1M5vFwPFmQnvRv+tJzGbFAm6XimJUT0NgHYW3xZEs1SkCAcasWSVFxpI2Xb/V1DDJckq3v90+bQnog==",
|
"integrity": "sha512-3s+ed8er9ahK+zJpp9ZtuVcDoFzHNiZsPbNAAE4KXgrRHbjSqqNN6xGSXq6bq7TZIbKj4NLrLb6bJ5i+vSVjHA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"funding": {
|
"funding": {
|
||||||
@@ -13267,9 +13267,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/quasar": {
|
"node_modules/quasar": {
|
||||||
"version": "1.15.18",
|
"version": "1.15.20",
|
||||||
"resolved": "https://registry.npmjs.org/quasar/-/quasar-1.15.18.tgz",
|
"resolved": "https://registry.npmjs.org/quasar/-/quasar-1.15.20.tgz",
|
||||||
"integrity": "sha512-LZYB/gQwkmNAO3CUdZwZir7C6mi+beqdW8LZzF52tdUUYPu3D32eqLdUQITL4X2pKJjJCPr+NefldOxYC/444A==",
|
"integrity": "sha512-mZAsHTc2CnPxflpy8DqaTeURF5JK34TA3fw6Fg3SQmqAGzoe5H1Nr5WvbE/KikZCtt5q50sI67TqtKUIBrCSuQ==",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 10.0.0",
|
"node": ">= 10.0.0",
|
||||||
"npm": ">= 5.6.0",
|
"npm": ">= 5.6.0",
|
||||||
@@ -16783,9 +16783,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/vue": {
|
"node_modules/vue": {
|
||||||
"version": "2.6.12",
|
"version": "2.6.14",
|
||||||
"resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz",
|
"resolved": "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz",
|
||||||
"integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg=="
|
"integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ=="
|
||||||
},
|
},
|
||||||
"node_modules/vue-apexcharts": {
|
"node_modules/vue-apexcharts": {
|
||||||
"version": "1.6.0",
|
"version": "1.6.0",
|
||||||
@@ -16844,9 +16844,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/vue-server-renderer": {
|
"node_modules/vue-server-renderer": {
|
||||||
"version": "2.6.12",
|
"version": "2.6.14",
|
||||||
"resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.6.12.tgz",
|
"resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.6.14.tgz",
|
||||||
"integrity": "sha512-3LODaOsnQx7iMFTBLjki8xSyOxhCtbZ+nQie0wWY4iOVeEtTg1a3YQAjd82WvKxrWHHTshjvLb7OXMc2/dYuxw==",
|
"integrity": "sha512-HifYRa/LW7cKywg9gd4ZtvtRuBlstQBao5ZCWlg40fyB4OPoGfEXAzxb0emSLv4pBDOHYx0UjpqvxpiQFEuoLA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chalk": "^1.1.3",
|
"chalk": "^1.1.3",
|
||||||
@@ -16943,9 +16943,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/vue-template-compiler": {
|
"node_modules/vue-template-compiler": {
|
||||||
"version": "2.6.12",
|
"version": "2.6.14",
|
||||||
"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz",
|
"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz",
|
||||||
"integrity": "sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg==",
|
"integrity": "sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"de-indent": "^1.0.2",
|
"de-indent": "^1.0.2",
|
||||||
@@ -20434,9 +20434,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@quasar/app": {
|
"@quasar/app": {
|
||||||
"version": "2.2.7",
|
"version": "2.2.10",
|
||||||
"resolved": "https://registry.npmjs.org/@quasar/app/-/app-2.2.7.tgz",
|
"resolved": "https://registry.npmjs.org/@quasar/app/-/app-2.2.10.tgz",
|
||||||
"integrity": "sha512-twFtT5215fLDcaN4XVi1Aa/mmSxnRBAb0WZePii6JkMqcWwo9tK4IFDbwvzabbssjOD71px9aoPAlD55xUSQlA==",
|
"integrity": "sha512-Gx8YY6KNxiLo13bbNMIhx64dn/PYRobhDb/P44QAQKJ4WNnHjqU56T1A5rrBhMZATnuW+7usEupuFduRyG8KvQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@quasar/babel-preset-app": "2.0.1",
|
"@quasar/babel-preset-app": "2.0.1",
|
||||||
@@ -20501,12 +20501,12 @@
|
|||||||
"ts-loader": "8.0.17",
|
"ts-loader": "8.0.17",
|
||||||
"typescript": "4.2.2",
|
"typescript": "4.2.2",
|
||||||
"url-loader": "4.1.1",
|
"url-loader": "4.1.1",
|
||||||
"vue": "2.6.12",
|
"vue": "2.6.14",
|
||||||
"vue-loader": "15.9.7",
|
"vue-loader": "15.9.7",
|
||||||
"vue-router": "3.5.1",
|
"vue-router": "3.5.1",
|
||||||
"vue-server-renderer": "2.6.12",
|
"vue-server-renderer": "2.6.14",
|
||||||
"vue-style-loader": "4.1.3",
|
"vue-style-loader": "4.1.3",
|
||||||
"vue-template-compiler": "2.6.12",
|
"vue-template-compiler": "2.6.14",
|
||||||
"vuex": "3.6.2",
|
"vuex": "3.6.2",
|
||||||
"webpack": "4.44.2",
|
"webpack": "4.44.2",
|
||||||
"webpack-bundle-analyzer": "4.4.2",
|
"webpack-bundle-analyzer": "4.4.2",
|
||||||
@@ -20577,9 +20577,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@quasar/cli": {
|
"@quasar/cli": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/@quasar/cli/-/cli-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/@quasar/cli/-/cli-1.2.1.tgz",
|
||||||
"integrity": "sha512-tungPBaMrJyo/8gtH0cS7VhxWXrG+az0ZUXpvdWqsN9Ymrm+Ld1GZ3zhZLcMLi76VfMfxvYdQRcAbkweGtrprw==",
|
"integrity": "sha512-WsfsDOlxSpOW8TlCSdmkrSb1Mop54omUlm6clmRuDvlu6Blt7i/ffklfls+3dPNnD/aISy5pPeqB8KNDKChAGg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"async": "3.2.0",
|
"async": "3.2.0",
|
||||||
@@ -20700,9 +20700,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@quasar/extras": {
|
"@quasar/extras": {
|
||||||
"version": "1.10.5",
|
"version": "1.10.6",
|
||||||
"resolved": "https://registry.npmjs.org/@quasar/extras/-/extras-1.10.5.tgz",
|
"resolved": "https://registry.npmjs.org/@quasar/extras/-/extras-1.10.6.tgz",
|
||||||
"integrity": "sha512-iBI9bRfomvxfnE2RUYMK0q7tki7Y0I0KMLuxoSEQC0OsOghJ/3ANENyGm1S0AsVMmNYwj0bzQWYVA6KD7/NwHg=="
|
"integrity": "sha512-LdqgITUDWr6c3bTS0Br/UIE+92JvUdZ0mu08qM4C+y0t6Q4i4WYgbjurLJKpU55g5zUXvzra868qbljLbNSLxg=="
|
||||||
},
|
},
|
||||||
"@quasar/fastclick": {
|
"@quasar/fastclick": {
|
||||||
"version": "1.1.4",
|
"version": "1.1.4",
|
||||||
@@ -23084,9 +23084,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"core-js": {
|
"core-js": {
|
||||||
"version": "3.13.0",
|
"version": "3.14.0",
|
||||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.14.0.tgz",
|
||||||
"integrity": "sha512-iWDbiyha1M5vFwPFmQnvRv+tJzGbFAm6XimJUT0NgHYW3xZEs1SkCAcasWSVFxpI2Xb/V1DDJckq3v90+bQnog==",
|
"integrity": "sha512-3s+ed8er9ahK+zJpp9ZtuVcDoFzHNiZsPbNAAE4KXgrRHbjSqqNN6xGSXq6bq7TZIbKj4NLrLb6bJ5i+vSVjHA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"core-js-compat": {
|
"core-js-compat": {
|
||||||
@@ -29932,9 +29932,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"quasar": {
|
"quasar": {
|
||||||
"version": "1.15.18",
|
"version": "1.15.20",
|
||||||
"resolved": "https://registry.npmjs.org/quasar/-/quasar-1.15.18.tgz",
|
"resolved": "https://registry.npmjs.org/quasar/-/quasar-1.15.20.tgz",
|
||||||
"integrity": "sha512-LZYB/gQwkmNAO3CUdZwZir7C6mi+beqdW8LZzF52tdUUYPu3D32eqLdUQITL4X2pKJjJCPr+NefldOxYC/444A=="
|
"integrity": "sha512-mZAsHTc2CnPxflpy8DqaTeURF5JK34TA3fw6Fg3SQmqAGzoe5H1Nr5WvbE/KikZCtt5q50sI67TqtKUIBrCSuQ=="
|
||||||
},
|
},
|
||||||
"query-string": {
|
"query-string": {
|
||||||
"version": "5.1.1",
|
"version": "5.1.1",
|
||||||
@@ -32778,9 +32778,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"vue": {
|
"vue": {
|
||||||
"version": "2.6.12",
|
"version": "2.6.14",
|
||||||
"resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz",
|
"resolved": "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz",
|
||||||
"integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg=="
|
"integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ=="
|
||||||
},
|
},
|
||||||
"vue-apexcharts": {
|
"vue-apexcharts": {
|
||||||
"version": "1.6.0",
|
"version": "1.6.0",
|
||||||
@@ -32820,9 +32820,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"vue-server-renderer": {
|
"vue-server-renderer": {
|
||||||
"version": "2.6.12",
|
"version": "2.6.14",
|
||||||
"resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.6.12.tgz",
|
"resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.6.14.tgz",
|
||||||
"integrity": "sha512-3LODaOsnQx7iMFTBLjki8xSyOxhCtbZ+nQie0wWY4iOVeEtTg1a3YQAjd82WvKxrWHHTshjvLb7OXMc2/dYuxw==",
|
"integrity": "sha512-HifYRa/LW7cKywg9gd4ZtvtRuBlstQBao5ZCWlg40fyB4OPoGfEXAzxb0emSLv4pBDOHYx0UjpqvxpiQFEuoLA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"chalk": "^1.1.3",
|
"chalk": "^1.1.3",
|
||||||
@@ -32903,9 +32903,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"vue-template-compiler": {
|
"vue-template-compiler": {
|
||||||
"version": "2.6.12",
|
"version": "2.6.14",
|
||||||
"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz",
|
"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz",
|
||||||
"integrity": "sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg==",
|
"integrity": "sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"de-indent": "^1.0.2",
|
"de-indent": "^1.0.2",
|
||||||
|
|||||||
@@ -10,20 +10,20 @@
|
|||||||
"test:e2e:ci": "cross-env E2E_TEST=true start-test \"quasar dev\" http-get://localhost:8080 \"cypress run\""
|
"test:e2e:ci": "cross-env E2E_TEST=true start-test \"quasar dev\" http-get://localhost:8080 \"cypress run\""
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@quasar/extras": "^1.10.5",
|
"@quasar/extras": "^1.10.6",
|
||||||
"apexcharts": "^3.23.1",
|
"apexcharts": "^3.23.1",
|
||||||
"axios": "^0.21.1",
|
"axios": "^0.21.1",
|
||||||
"dotenv": "^8.2.0",
|
"dotenv": "^8.2.0",
|
||||||
"prismjs": "^1.22.0",
|
"prismjs": "^1.22.0",
|
||||||
"qrcode.vue": "^1.7.0",
|
"qrcode.vue": "^1.7.0",
|
||||||
"quasar": "^1.15.18",
|
"quasar": "^1.15.20",
|
||||||
"vue-apexcharts": "^1.6.0",
|
"vue-apexcharts": "^1.6.0",
|
||||||
"vue-prism-editor": "^1.2.2"
|
"vue-prism-editor": "^1.2.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@quasar/app": "^2.2.7",
|
"@quasar/app": "^2.2.10",
|
||||||
"@quasar/cli": "^1.2.0",
|
"@quasar/cli": "^1.2.1",
|
||||||
"core-js": "^3.13.0",
|
"core-js": "^3.14.0",
|
||||||
"eslint-plugin-cypress": "^2.11.2",
|
"eslint-plugin-cypress": "^2.11.2",
|
||||||
"flush-promises": "^1.0.2",
|
"flush-promises": "^1.0.2",
|
||||||
"fs-extra": "^9.1.0"
|
"fs-extra": "^9.1.0"
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
stack-label
|
stack-label
|
||||||
filled
|
filled
|
||||||
counter
|
counter
|
||||||
|
class="full-width"
|
||||||
accept=".exe"
|
accept=".exe"
|
||||||
>
|
>
|
||||||
<template v-slot:prepend>
|
<template v-slot:prepend>
|
||||||
|
|||||||
@@ -46,6 +46,7 @@
|
|||||||
stack-label
|
stack-label
|
||||||
filled
|
filled
|
||||||
counter
|
counter
|
||||||
|
class="full-width"
|
||||||
accept=".ps1, .bat, .py"
|
accept=".ps1, .bat, .py"
|
||||||
>
|
>
|
||||||
<template v-slot:prepend>
|
<template v-slot:prepend>
|
||||||
|
|||||||
@@ -37,6 +37,7 @@
|
|||||||
stack-label
|
stack-label
|
||||||
filled
|
filled
|
||||||
counter
|
counter
|
||||||
|
class="full-width"
|
||||||
accept=".exe"
|
accept=".exe"
|
||||||
>
|
>
|
||||||
<template v-slot:prepend>
|
<template v-slot:prepend>
|
||||||
|
|||||||
Reference in New Issue
Block a user