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:
|
||||
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:
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
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:
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
|
||||
@@ -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()),
|
||||
]
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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/
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -61,6 +61,8 @@ Category or Function - What It Does
|
||||
|
||||

|
||||
|
||||
*****
|
||||
|
||||
## 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)
|
||||
|
||||
@@ -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
|
||||
|
||||
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
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
120
web/package-lock.json
generated
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
stack-label
|
||||
filled
|
||||
counter
|
||||
class="full-width"
|
||||
accept=".exe"
|
||||
>
|
||||
<template v-slot:prepend>
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
stack-label
|
||||
filled
|
||||
counter
|
||||
class="full-width"
|
||||
accept=".ps1, .bat, .py"
|
||||
>
|
||||
<template v-slot:prepend>
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
stack-label
|
||||
filled
|
||||
counter
|
||||
class="full-width"
|
||||
accept=".exe"
|
||||
>
|
||||
<template v-slot:prepend>
|
||||
|
||||
Reference in New Issue
Block a user