Compare commits

...

24 Commits

Author SHA1 Message Date
wh1te909
42cdf70cb4 Release 0.6.15 2021-06-12 20:41:19 +00:00
wh1te909
6beb6be131 bump version 2021-06-12 20:40:54 +00:00
wh1te909
fa4fc2a708 only parse script args for script checks 2021-06-12 20:24:51 +00:00
wh1te909
2db9758260 fix custom fields in script checks #568 2021-06-12 19:41:49 +00:00
wh1te909
715982e40a Release 0.6.14 2021-06-11 04:41:48 +00:00
wh1te909
d00cd4453a bump versions 2021-06-11 04:40:57 +00:00
wh1te909
429c08c24a fix width on q-file caused by recent quasar update 2021-06-11 03:58:57 +00:00
wh1te909
6a71490e20 update reqs 2021-06-11 02:40:22 +00:00
Dan
9bceda0646 Merge pull request #562 from diekinderwelt/nginx_enable_ipv6
enable ipv6 in nginx config
2021-06-10 18:59:34 -07:00
Dan
a1027a6773 Merge pull request #565 from silversword411/develop
Docs Update - adding design and tipsntricks
2021-06-10 18:59:12 -07:00
silversword411
302d4b75f9 formatting fix 2021-06-08 15:39:43 -04:00
silversword411
5f6ee0e883 Docs Update - adding design and tipsntricks 2021-06-08 14:45:02 -04:00
Silvio
27f9720de1 enable ipv6 in nginx config
Signed-off-by: Silvio <silvio.zimmer@die-kinderwelt.com>
2021-06-08 11:43:55 +02:00
sadnub
22aa3fdbbc fix bug with policy copy and task that triggers on check failure. Fix check history tests 2021-06-06 23:19:07 -04:00
sadnub
069ecdd33f apply redis configuration after restore 2021-06-06 22:58:32 -04:00
sadnub
dd545ae933 catch an exception that a celery task could potentially throw and configure automation task retries 2021-06-06 22:55:47 -04:00
sadnub
6650b705c4 configure redis to use an appendonly file for celery task reliability 2021-06-06 22:54:52 -04:00
sadnub
59b0350289 fix duplicate tasks when there is an assigned check 2021-06-06 22:54:06 -04:00
sadnub
1ad159f820 remove foreign key from checkhistory to make mass check deletes reliable. (This will not migrate check history data) 2021-06-06 22:53:11 -04:00
Dan
0bf42190e9 Merge pull request #544 from bbrendon/patch-1
check for proper OS support
2021-05-30 23:10:21 -07:00
bbrendon
d2fa836232 check for proper OS support 2021-05-30 10:39:08 -07:00
Dan
c387774093 Merge pull request #543 from bbrendon/develop
fixed an edge case and warning notes
2021-05-29 22:39:52 -07:00
bbrendon
e99736ba3c fixed an edge case and warning notes 2021-05-29 19:25:53 -07:00
wh1te909
16cb54fcc9 fix multiline output not working for automation task 2021-05-29 18:47:09 +00:00
32 changed files with 320 additions and 104 deletions

View File

@@ -115,7 +115,10 @@ services:
redis-dev:
container_name: trmm-redis-dev
restart: always
command: redis-server --appendonly yes
image: redis:6.0-alpine
volumes:
- redis-data-dev:/data
networks:
dev:
aliases:
@@ -247,6 +250,7 @@ volumes:
postgres-data-dev:
mongo-dev-data:
mesh-data-dev:
redis-data-dev:
networks:
dev:

View File

@@ -3,7 +3,7 @@ from typing import Any, Dict, List, Union
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(
policy: int = None,
site: int = None,
@@ -57,7 +57,9 @@ def generate_agent_checks_task(
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
def update_policy_check_fields_task(check: int) -> str:
from checks.models import Check
@@ -73,7 +75,7 @@ def update_policy_check_fields_task(check: int) -> str:
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
def generate_agent_autotasks_task(policy: int = None) -> str:
from agents.models import Agent
@@ -100,7 +102,12 @@ def generate_agent_autotasks_task(policy: int = None) -> str:
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:
from autotasks.models import AutomatedTask
@@ -120,7 +127,12 @@ def run_win_policy_autotasks_task(task: int) -> str:
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:
from autotasks.models import AutomatedTask

View File

@@ -10,6 +10,7 @@ from django.conf import settings
from django.contrib.postgres.fields import ArrayField
from django.db import models
from django.db.models.fields import DateTimeField
from django.db.utils import DatabaseError
from django.utils import timezone as djangotime
from logs.models import BaseAuditModel
from loguru import logger
@@ -183,6 +184,7 @@ class AutomatedTask(BaseAuditModel):
"remove_if_not_scheduled",
"run_asap_after_missed",
"custom_field",
"collector_all_output",
]
@staticmethod
@@ -364,9 +366,14 @@ class AutomatedTask(BaseAuditModel):
if r != "ok" and "The system cannot find the file specified" not in r:
self.sync_status = "pendingdeletion"
self.save(update_fields=["sync_status"])
try:
self.save(update_fields=["sync_status"])
except DatabaseError:
pass
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"
else:

View 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),
),
]

View File

@@ -313,7 +313,7 @@ class Check(BaseAuditModel):
)
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):
from alerts.models import Alert
@@ -509,7 +509,12 @@ class Check(BaseAuditModel):
)
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:
setattr(check, field, getattr(self, field))
@@ -683,14 +688,10 @@ class Check(BaseAuditModel):
class CheckHistory(models.Model):
check_history = models.ForeignKey(
Check,
related_name="check_history",
on_delete=models.CASCADE,
)
check_id = models.PositiveIntegerField(default=0)
x = models.DateTimeField(auto_now_add=True)
y = models.PositiveIntegerField(null=True, blank=True, default=None)
results = models.JSONField(null=True, blank=True)
def __str__(self):
return self.check_history.readable_desc
return self.x

View File

@@ -6,6 +6,7 @@ from autotasks.models import AutomatedTask
from scripts.serializers import ScriptCheckSerializer, ScriptSerializer
from .models import Check, CheckHistory
from scripts.models import Script
class AssignedTaskField(serializers.ModelSerializer):
@@ -159,6 +160,15 @@ class AssignedTaskCheckRunnerField(serializers.ModelSerializer):
class CheckRunnerGetSerializer(serializers.ModelSerializer):
# only send data needed for agent to run a check
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:
model = Check

View File

@@ -363,10 +363,10 @@ class TestCheckViews(TacticalTestCase):
# setup data
agent = baker.make_recipe("agents.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(
"checks.CheckHistory",
check_history=check,
check_id=check.id,
_quantity=30,
)
@@ -407,10 +407,10 @@ class TestCheckTasks(TacticalTestCase):
# setup data
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(
"checks.CheckHistory",
check_history=check,
check_id=check.id,
_quantity=30,
)

View File

@@ -8,5 +8,5 @@ urlpatterns = [
path("<pk>/loadchecks/", views.load_checks),
path("getalldisks/", views.get_disks_for_policies),
path("runchecks/<pk>/", views.run_checks),
path("history/<int:checkpk>/", views.CheckHistory.as_view()),
path("history/<int:checkpk>/", views.GetCheckHistory.as_view()),
]

View File

@@ -15,7 +15,7 @@ from automation.models import Policy
from scripts.models import Script
from tacticalrmm.utils import notify_error
from .models import Check
from .models import Check, CheckHistory
from .permissions import ManageChecksPerms, RunChecksPerms
from .serializers import CheckHistorySerializer, CheckSerializer
@@ -146,7 +146,7 @@ class GetUpdateDeleteCheck(APIView):
return Response(f"{check.readable_desc} was deleted!")
class CheckHistory(APIView):
class GetCheckHistory(APIView):
def patch(self, request, checkpk):
check = get_object_or_404(Check, pk=checkpk)
@@ -160,7 +160,7 @@ class CheckHistory(APIView):
- 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(
CheckHistorySerializer(

View File

@@ -1,14 +1,14 @@
asgiref==3.3.4
asyncio-nats-client==0.11.4
celery==5.1.0
certifi==2020.12.5
certifi==2021.5.30
cffi==1.14.5
channels==3.0.3
channels_redis==3.2.0
chardet==4.0.0
cryptography==3.4.7
daphne==3.0.2
Django==3.2.3
Django==3.2.4
django-cors-headers==3.7.0
django-rest-knox==4.1.0
djangorestframework==3.12.4
@@ -27,7 +27,7 @@ redis==3.5.3
requests==2.25.1
six==1.16.0
sqlparse==0.4.1
twilio==6.59.0
twilio==6.59.1
urllib3==1.26.5
uWSGI==2.0.19.1
validators==0.18.2

View File

@@ -15,20 +15,20 @@ EXE_DIR = os.path.join(BASE_DIR, "tacticalrmm/private/exe")
AUTH_USER_MODEL = "accounts.User"
# latest release
TRMM_VERSION = "0.6.13"
TRMM_VERSION = "0.6.15"
# bump this version everytime vue code is changed
# 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
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
PIP_VER = "17"
NPM_VER = "16"
PIP_VER = "18"
NPM_VER = "17"
SETUPTOOLS_VER = "57.0.0"
WHEEL_VER = "0.36.2"

View File

@@ -1,6 +1,6 @@
#!/bin/bash
SCRIPT_VERSION="12"
SCRIPT_VERSION="13"
SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/backup.sh'
GREEN='\033[0;32m'
@@ -59,6 +59,7 @@ mkdir ${tmp_dir}/nginx
mkdir ${tmp_dir}/systemd
mkdir ${tmp_dir}/rmm
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
@@ -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}/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/
if [ -f "${sysd}/daphne.service" ]; then
sudo cp ${sysd}/daphne.service ${tmp_dir}/systemd/

View File

@@ -18,6 +18,7 @@ volumes:
postgres_data:
mongo_data:
mesh_data:
redis_data:
services:
# postgres database for api service
@@ -38,7 +39,10 @@ services:
tactical-redis:
container_name: trmm-redis
image: redis:6.0-alpine
command: redis-server --appendonly yes
restart: always
volumes:
- redis_data:/data
networks:
- redis

View File

@@ -61,6 +61,8 @@ Category or Function - What It Does
![json_name_examples](images/community_scripts_name_field_example1.png)
*****
## Making Script Files
### Good Habits
@@ -117,6 +119,8 @@ c:\ProgramData\TacticalRMM\
- Doesn't play well with other community scripts (reused names etc.)
*****
## Useful Reference Script Examples
RunAsUser (since Tactical RMM runs as system)
@@ -128,6 +132,8 @@ Command Paramater Ninja
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)
*****
## 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)

View File

@@ -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
*****
## Reference
### Customizing the Admin Web Interface

View 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`
![MeshService](images/trmm_services_mesh.png)
![MeshAgentTaskManager](images/trmm_services__taskmanager_mesh.png)
**AND**
* `TacticalAgent` and `Tactical RMM RPC Service`
![TacticalAgentServices](images/trmm_services.png)
![TacticalAgentTaskManager](images/trmm_services__taskmanager_agent.png)
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)

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

52
docs/docs/tipsntricks.md Normal file
View 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
![User Preferences](images/trmm_user_preferences.png)
*****
## 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
```
###

View File

@@ -1,6 +1,6 @@
#!/bin/bash
SCRIPT_VERSION="49"
SCRIPT_VERSION="50"
SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/install.sh'
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'
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'
echo "$postgresql_repo" | sudo tee /etc/apt/sources.list.d/pgdg.list
@@ -487,12 +491,14 @@ map \$http_user_agent \$ignore_ua {
server {
listen 80;
listen [::]:80;
server_name ${rmmdomain};
return 301 https://\$server_name\$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name ${rmmdomain};
client_max_body_size 300M;
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
server {
listen 80;
listen [::]:80;
server_name ${meshdomain};
return 301 https://\$server_name\$request_uri;
}
@@ -556,6 +563,7 @@ server {
server {
listen 443 ssl;
listen [::]:443 ssl;
proxy_send_timeout 330s;
proxy_read_timeout 330s;
server_name ${meshdomain};
@@ -710,6 +718,7 @@ server {
access_log /var/log/nginx/frontend-access.log;
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate ${CERT_PUB_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';
@@ -720,7 +729,8 @@ server {
return 301 https://\$host\$request_uri;
}
listen 80;
listen 80;
listen [::]:80;
server_name ${frontenddomain};
return 404;
}

View File

@@ -1,6 +1,6 @@
#!/bin/bash
SCRIPT_VERSION="27"
SCRIPT_VERSION="28"
SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/restore.sh'
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'
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'
echo "$postgresql_repo" | sudo tee /etc/apt/sources.list.d/pgdg.list

View File

@@ -4,6 +4,8 @@
#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
# OS Build must be greater than 14393 to support this script. If it's not it returns exit code 2
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 |
Where-Object {

View File

@@ -1,4 +1,9 @@
## 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 {
Param
(
@@ -22,7 +27,7 @@ function Log-Message {
$log = "BitlockerReport.txt"
#Find BL info
$mbde = [string](manage-bde -status)
$mbde = [string](manage-bde -status C:)
$mbdeProt = (manage-bde -protectors -get c: | Select-Object -Skip 6)
#Dig out the recovery password, check for PIN
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
Write-Host "Script check passed"
exit 0
}
}

View File

@@ -1,6 +1,6 @@
#!/bin/bash
SCRIPT_VERSION="122"
SCRIPT_VERSION="123"
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'
YELLOW='\033[1;33m'
@@ -307,5 +307,9 @@ if [[ "${CURRENT_MESH_VER}" != "${LATEST_MESH_VER}" ]] || [[ "$force" = true ]];
sudo systemctl start meshcentral
fi
# apply redis configuration
sudo redis-cli config set appendonly yes
sudo redis-cli config rewrite
rm -f $TMP_SETTINGS
printf >&2 "${GREEN}Update finished!${NC}\n"

120
web/package-lock.json generated
View File

@@ -7,20 +7,20 @@
"": {
"version": "0.1.8",
"dependencies": {
"@quasar/extras": "^1.10.5",
"@quasar/extras": "^1.10.6",
"apexcharts": "^3.23.1",
"axios": "^0.21.1",
"dotenv": "^8.2.0",
"prismjs": "^1.22.0",
"qrcode.vue": "^1.7.0",
"quasar": "^1.15.18",
"quasar": "^1.15.20",
"vue-apexcharts": "^1.6.0",
"vue-prism-editor": "^1.2.2"
},
"devDependencies": {
"@quasar/app": "^2.2.7",
"@quasar/cli": "^1.2.0",
"core-js": "^3.13.0",
"@quasar/app": "^2.2.10",
"@quasar/cli": "^1.2.1",
"core-js": "^3.14.0",
"eslint-plugin-cypress": "^2.11.2",
"flush-promises": "^1.0.2",
"fs-extra": "^9.1.0"
@@ -1660,11 +1660,10 @@
}
},
"node_modules/@quasar/app": {
"version": "2.2.7",
"resolved": "https://registry.npmjs.org/@quasar/app/-/app-2.2.7.tgz",
"integrity": "sha512-twFtT5215fLDcaN4XVi1Aa/mmSxnRBAb0WZePii6JkMqcWwo9tK4IFDbwvzabbssjOD71px9aoPAlD55xUSQlA==",
"version": "2.2.10",
"resolved": "https://registry.npmjs.org/@quasar/app/-/app-2.2.10.tgz",
"integrity": "sha512-Gx8YY6KNxiLo13bbNMIhx64dn/PYRobhDb/P44QAQKJ4WNnHjqU56T1A5rrBhMZATnuW+7usEupuFduRyG8KvQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@quasar/babel-preset-app": "2.0.1",
"@quasar/fastclick": "1.1.4",
@@ -1728,12 +1727,12 @@
"ts-loader": "8.0.17",
"typescript": "4.2.2",
"url-loader": "4.1.1",
"vue": "2.6.12",
"vue": "2.6.14",
"vue-loader": "15.9.7",
"vue-router": "3.5.1",
"vue-server-renderer": "2.6.12",
"vue-server-renderer": "2.6.14",
"vue-style-loader": "4.1.3",
"vue-template-compiler": "2.6.12",
"vue-template-compiler": "2.6.14",
"vuex": "3.6.2",
"webpack": "4.44.2",
"webpack-bundle-analyzer": "4.4.2",
@@ -1835,10 +1834,11 @@
}
},
"node_modules/@quasar/cli": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@quasar/cli/-/cli-1.2.0.tgz",
"integrity": "sha512-tungPBaMrJyo/8gtH0cS7VhxWXrG+az0ZUXpvdWqsN9Ymrm+Ld1GZ3zhZLcMLi76VfMfxvYdQRcAbkweGtrprw==",
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@quasar/cli/-/cli-1.2.1.tgz",
"integrity": "sha512-WsfsDOlxSpOW8TlCSdmkrSb1Mop54omUlm6clmRuDvlu6Blt7i/ffklfls+3dPNnD/aISy5pPeqB8KNDKChAGg==",
"dev": true,
"license": "MIT",
"dependencies": {
"async": "3.2.0",
"chalk": "4.1.1",
@@ -1995,9 +1995,9 @@
}
},
"node_modules/@quasar/extras": {
"version": "1.10.5",
"resolved": "https://registry.npmjs.org/@quasar/extras/-/extras-1.10.5.tgz",
"integrity": "sha512-iBI9bRfomvxfnE2RUYMK0q7tki7Y0I0KMLuxoSEQC0OsOghJ/3ANENyGm1S0AsVMmNYwj0bzQWYVA6KD7/NwHg==",
"version": "1.10.6",
"resolved": "https://registry.npmjs.org/@quasar/extras/-/extras-1.10.6.tgz",
"integrity": "sha512-LdqgITUDWr6c3bTS0Br/UIE+92JvUdZ0mu08qM4C+y0t6Q4i4WYgbjurLJKpU55g5zUXvzra868qbljLbNSLxg==",
"funding": {
"type": "github",
"url": "https://donate.quasar.dev"
@@ -4826,9 +4826,9 @@
}
},
"node_modules/core-js": {
"version": "3.13.0",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.13.0.tgz",
"integrity": "sha512-iWDbiyha1M5vFwPFmQnvRv+tJzGbFAm6XimJUT0NgHYW3xZEs1SkCAcasWSVFxpI2Xb/V1DDJckq3v90+bQnog==",
"version": "3.14.0",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.14.0.tgz",
"integrity": "sha512-3s+ed8er9ahK+zJpp9ZtuVcDoFzHNiZsPbNAAE4KXgrRHbjSqqNN6xGSXq6bq7TZIbKj4NLrLb6bJ5i+vSVjHA==",
"dev": true,
"hasInstallScript": true,
"funding": {
@@ -13267,9 +13267,9 @@
}
},
"node_modules/quasar": {
"version": "1.15.18",
"resolved": "https://registry.npmjs.org/quasar/-/quasar-1.15.18.tgz",
"integrity": "sha512-LZYB/gQwkmNAO3CUdZwZir7C6mi+beqdW8LZzF52tdUUYPu3D32eqLdUQITL4X2pKJjJCPr+NefldOxYC/444A==",
"version": "1.15.20",
"resolved": "https://registry.npmjs.org/quasar/-/quasar-1.15.20.tgz",
"integrity": "sha512-mZAsHTc2CnPxflpy8DqaTeURF5JK34TA3fw6Fg3SQmqAGzoe5H1Nr5WvbE/KikZCtt5q50sI67TqtKUIBrCSuQ==",
"engines": {
"node": ">= 10.0.0",
"npm": ">= 5.6.0",
@@ -16783,9 +16783,9 @@
"dev": true
},
"node_modules/vue": {
"version": "2.6.12",
"resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz",
"integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg=="
"version": "2.6.14",
"resolved": "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz",
"integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ=="
},
"node_modules/vue-apexcharts": {
"version": "1.6.0",
@@ -16844,9 +16844,9 @@
"dev": true
},
"node_modules/vue-server-renderer": {
"version": "2.6.12",
"resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.6.12.tgz",
"integrity": "sha512-3LODaOsnQx7iMFTBLjki8xSyOxhCtbZ+nQie0wWY4iOVeEtTg1a3YQAjd82WvKxrWHHTshjvLb7OXMc2/dYuxw==",
"version": "2.6.14",
"resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.6.14.tgz",
"integrity": "sha512-HifYRa/LW7cKywg9gd4ZtvtRuBlstQBao5ZCWlg40fyB4OPoGfEXAzxb0emSLv4pBDOHYx0UjpqvxpiQFEuoLA==",
"dev": true,
"dependencies": {
"chalk": "^1.1.3",
@@ -16943,9 +16943,9 @@
}
},
"node_modules/vue-template-compiler": {
"version": "2.6.12",
"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz",
"integrity": "sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg==",
"version": "2.6.14",
"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz",
"integrity": "sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==",
"dev": true,
"dependencies": {
"de-indent": "^1.0.2",
@@ -20434,9 +20434,9 @@
"dev": true
},
"@quasar/app": {
"version": "2.2.7",
"resolved": "https://registry.npmjs.org/@quasar/app/-/app-2.2.7.tgz",
"integrity": "sha512-twFtT5215fLDcaN4XVi1Aa/mmSxnRBAb0WZePii6JkMqcWwo9tK4IFDbwvzabbssjOD71px9aoPAlD55xUSQlA==",
"version": "2.2.10",
"resolved": "https://registry.npmjs.org/@quasar/app/-/app-2.2.10.tgz",
"integrity": "sha512-Gx8YY6KNxiLo13bbNMIhx64dn/PYRobhDb/P44QAQKJ4WNnHjqU56T1A5rrBhMZATnuW+7usEupuFduRyG8KvQ==",
"dev": true,
"requires": {
"@quasar/babel-preset-app": "2.0.1",
@@ -20501,12 +20501,12 @@
"ts-loader": "8.0.17",
"typescript": "4.2.2",
"url-loader": "4.1.1",
"vue": "2.6.12",
"vue": "2.6.14",
"vue-loader": "15.9.7",
"vue-router": "3.5.1",
"vue-server-renderer": "2.6.12",
"vue-server-renderer": "2.6.14",
"vue-style-loader": "4.1.3",
"vue-template-compiler": "2.6.12",
"vue-template-compiler": "2.6.14",
"vuex": "3.6.2",
"webpack": "4.44.2",
"webpack-bundle-analyzer": "4.4.2",
@@ -20577,9 +20577,9 @@
}
},
"@quasar/cli": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@quasar/cli/-/cli-1.2.0.tgz",
"integrity": "sha512-tungPBaMrJyo/8gtH0cS7VhxWXrG+az0ZUXpvdWqsN9Ymrm+Ld1GZ3zhZLcMLi76VfMfxvYdQRcAbkweGtrprw==",
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@quasar/cli/-/cli-1.2.1.tgz",
"integrity": "sha512-WsfsDOlxSpOW8TlCSdmkrSb1Mop54omUlm6clmRuDvlu6Blt7i/ffklfls+3dPNnD/aISy5pPeqB8KNDKChAGg==",
"dev": true,
"requires": {
"async": "3.2.0",
@@ -20700,9 +20700,9 @@
}
},
"@quasar/extras": {
"version": "1.10.5",
"resolved": "https://registry.npmjs.org/@quasar/extras/-/extras-1.10.5.tgz",
"integrity": "sha512-iBI9bRfomvxfnE2RUYMK0q7tki7Y0I0KMLuxoSEQC0OsOghJ/3ANENyGm1S0AsVMmNYwj0bzQWYVA6KD7/NwHg=="
"version": "1.10.6",
"resolved": "https://registry.npmjs.org/@quasar/extras/-/extras-1.10.6.tgz",
"integrity": "sha512-LdqgITUDWr6c3bTS0Br/UIE+92JvUdZ0mu08qM4C+y0t6Q4i4WYgbjurLJKpU55g5zUXvzra868qbljLbNSLxg=="
},
"@quasar/fastclick": {
"version": "1.1.4",
@@ -23084,9 +23084,9 @@
}
},
"core-js": {
"version": "3.13.0",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.13.0.tgz",
"integrity": "sha512-iWDbiyha1M5vFwPFmQnvRv+tJzGbFAm6XimJUT0NgHYW3xZEs1SkCAcasWSVFxpI2Xb/V1DDJckq3v90+bQnog==",
"version": "3.14.0",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.14.0.tgz",
"integrity": "sha512-3s+ed8er9ahK+zJpp9ZtuVcDoFzHNiZsPbNAAE4KXgrRHbjSqqNN6xGSXq6bq7TZIbKj4NLrLb6bJ5i+vSVjHA==",
"dev": true
},
"core-js-compat": {
@@ -29932,9 +29932,9 @@
"dev": true
},
"quasar": {
"version": "1.15.18",
"resolved": "https://registry.npmjs.org/quasar/-/quasar-1.15.18.tgz",
"integrity": "sha512-LZYB/gQwkmNAO3CUdZwZir7C6mi+beqdW8LZzF52tdUUYPu3D32eqLdUQITL4X2pKJjJCPr+NefldOxYC/444A=="
"version": "1.15.20",
"resolved": "https://registry.npmjs.org/quasar/-/quasar-1.15.20.tgz",
"integrity": "sha512-mZAsHTc2CnPxflpy8DqaTeURF5JK34TA3fw6Fg3SQmqAGzoe5H1Nr5WvbE/KikZCtt5q50sI67TqtKUIBrCSuQ=="
},
"query-string": {
"version": "5.1.1",
@@ -32778,9 +32778,9 @@
"dev": true
},
"vue": {
"version": "2.6.12",
"resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz",
"integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg=="
"version": "2.6.14",
"resolved": "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz",
"integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ=="
},
"vue-apexcharts": {
"version": "1.6.0",
@@ -32820,9 +32820,9 @@
"dev": true
},
"vue-server-renderer": {
"version": "2.6.12",
"resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.6.12.tgz",
"integrity": "sha512-3LODaOsnQx7iMFTBLjki8xSyOxhCtbZ+nQie0wWY4iOVeEtTg1a3YQAjd82WvKxrWHHTshjvLb7OXMc2/dYuxw==",
"version": "2.6.14",
"resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.6.14.tgz",
"integrity": "sha512-HifYRa/LW7cKywg9gd4ZtvtRuBlstQBao5ZCWlg40fyB4OPoGfEXAzxb0emSLv4pBDOHYx0UjpqvxpiQFEuoLA==",
"dev": true,
"requires": {
"chalk": "^1.1.3",
@@ -32903,9 +32903,9 @@
}
},
"vue-template-compiler": {
"version": "2.6.12",
"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz",
"integrity": "sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg==",
"version": "2.6.14",
"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz",
"integrity": "sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==",
"dev": true,
"requires": {
"de-indent": "^1.0.2",

View File

@@ -10,20 +10,20 @@
"test:e2e:ci": "cross-env E2E_TEST=true start-test \"quasar dev\" http-get://localhost:8080 \"cypress run\""
},
"dependencies": {
"@quasar/extras": "^1.10.5",
"@quasar/extras": "^1.10.6",
"apexcharts": "^3.23.1",
"axios": "^0.21.1",
"dotenv": "^8.2.0",
"prismjs": "^1.22.0",
"qrcode.vue": "^1.7.0",
"quasar": "^1.15.18",
"quasar": "^1.15.20",
"vue-apexcharts": "^1.6.0",
"vue-prism-editor": "^1.2.2"
},
"devDependencies": {
"@quasar/app": "^2.2.7",
"@quasar/cli": "^1.2.0",
"core-js": "^3.13.0",
"@quasar/app": "^2.2.10",
"@quasar/cli": "^1.2.1",
"core-js": "^3.14.0",
"eslint-plugin-cypress": "^2.11.2",
"flush-promises": "^1.0.2",
"fs-extra": "^9.1.0"

View File

@@ -19,6 +19,7 @@
stack-label
filled
counter
class="full-width"
accept=".exe"
>
<template v-slot:prepend>

View File

@@ -46,6 +46,7 @@
stack-label
filled
counter
class="full-width"
accept=".ps1, .bat, .py"
>
<template v-slot:prepend>

View File

@@ -37,6 +37,7 @@
stack-label
filled
counter
class="full-width"
accept=".exe"
>
<template v-slot:prepend>