Compare commits
48 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aa8b84a302 | ||
|
|
b987d041b0 | ||
|
|
b62e37307e | ||
|
|
61a59aa6ac | ||
|
|
f79ec27f1d | ||
|
|
b993fe380f | ||
|
|
d974b5f55f | ||
|
|
f21ae93197 | ||
|
|
342ff18be8 | ||
|
|
a8236f69bf | ||
|
|
ab15a2448d | ||
|
|
6ff4d8f558 | ||
|
|
bb04ba528c | ||
|
|
b94a795189 | ||
|
|
9968184733 | ||
|
|
1be6f8f87a | ||
|
|
426821cceb | ||
|
|
4fec0deaf7 | ||
|
|
144ac5b6ce | ||
|
|
97c73786fa | ||
|
|
82e59d7da0 | ||
|
|
b2c10de6af | ||
|
|
d72029c2c6 | ||
|
|
17b9987063 | ||
|
|
fde07da2b7 | ||
|
|
c23bc29511 | ||
|
|
714cad2a52 | ||
|
|
357d5d2fde | ||
|
|
d477cce901 | ||
|
|
eb6af52ad1 | ||
|
|
aae75023a7 | ||
|
|
41dcd4f458 | ||
|
|
4651ae4495 | ||
|
|
ed61e0b0fc | ||
|
|
1eefc6fbf4 | ||
|
|
09ebf2cea2 | ||
|
|
b3b0c4cd65 | ||
|
|
f4b7924e8f | ||
|
|
ea68d38b82 | ||
|
|
dfbaa71132 | ||
|
|
6c328deb08 | ||
|
|
add564d5bf | ||
|
|
fa94acb426 | ||
|
|
6827468f13 | ||
|
|
53fd43868f | ||
|
|
9ced7561c5 | ||
|
|
31d55d3425 | ||
|
|
171d2a5bb9 |
@@ -2,6 +2,7 @@ version: '3.4'
|
||||
|
||||
services:
|
||||
api-dev:
|
||||
container_name: trmm-api-dev
|
||||
image: api-dev
|
||||
restart: always
|
||||
build:
|
||||
@@ -21,6 +22,7 @@ services:
|
||||
- tactical-backend
|
||||
|
||||
app-dev:
|
||||
container_name: trmm-app-dev
|
||||
image: node:14-alpine
|
||||
restart: always
|
||||
command: /bin/sh -c "npm install npm@latest -g && npm install && npm run serve -- --host 0.0.0.0 --port ${APP_PORT}"
|
||||
@@ -36,6 +38,7 @@ services:
|
||||
|
||||
# nats
|
||||
nats-dev:
|
||||
container_name: trmm-nats-dev
|
||||
image: ${IMAGE_REPO}tactical-nats:${VERSION}
|
||||
restart: always
|
||||
environment:
|
||||
@@ -55,6 +58,7 @@ services:
|
||||
|
||||
# meshcentral container
|
||||
meshcentral-dev:
|
||||
container_name: trmm-meshcentral-dev
|
||||
image: ${IMAGE_REPO}tactical-meshcentral:${VERSION}
|
||||
restart: always
|
||||
environment:
|
||||
@@ -77,6 +81,7 @@ services:
|
||||
|
||||
# mongodb container for meshcentral
|
||||
mongodb-dev:
|
||||
container_name: trmm-mongodb-dev
|
||||
image: mongo:4.4
|
||||
restart: always
|
||||
environment:
|
||||
@@ -92,6 +97,7 @@ services:
|
||||
|
||||
# postgres database for api service
|
||||
postgres-dev:
|
||||
container_name: trmm-postgres-dev
|
||||
image: postgres:13-alpine
|
||||
restart: always
|
||||
environment:
|
||||
@@ -107,6 +113,7 @@ services:
|
||||
|
||||
# redis container for celery tasks
|
||||
redis-dev:
|
||||
container_name: trmm-redis-dev
|
||||
restart: always
|
||||
image: redis:6.0-alpine
|
||||
networks:
|
||||
@@ -115,6 +122,7 @@ services:
|
||||
- tactical-redis
|
||||
|
||||
init-dev:
|
||||
container_name: trmm-init-dev
|
||||
image: api-dev
|
||||
build:
|
||||
context: .
|
||||
@@ -143,6 +151,7 @@ services:
|
||||
|
||||
# container for celery worker service
|
||||
celery-dev:
|
||||
container_name: trmm-celery-dev
|
||||
image: api-dev
|
||||
build:
|
||||
context: .
|
||||
@@ -160,6 +169,7 @@ services:
|
||||
|
||||
# container for celery beat service
|
||||
celerybeat-dev:
|
||||
container_name: trmm-celerybeat-dev
|
||||
image: api-dev
|
||||
build:
|
||||
context: .
|
||||
@@ -175,8 +185,9 @@ services:
|
||||
- postgres-dev
|
||||
- redis-dev
|
||||
|
||||
# container for celery beat service
|
||||
# container for websockets communication
|
||||
websockets-dev:
|
||||
container_name: trmm-websockets-dev
|
||||
image: api-dev
|
||||
build:
|
||||
context: .
|
||||
@@ -194,8 +205,9 @@ services:
|
||||
- postgres-dev
|
||||
- redis-dev
|
||||
|
||||
nginx-dev:
|
||||
# container for tactical reverse proxy
|
||||
nginx-dev:
|
||||
container_name: trmm-nginx-dev
|
||||
image: ${IMAGE_REPO}tactical-nginx:${VERSION}
|
||||
restart: always
|
||||
environment:
|
||||
|
||||
@@ -136,10 +136,11 @@ if [ "$1" = 'tactical-init-dev' ]; then
|
||||
webenv="$(cat << EOF
|
||||
PROD_URL = "${HTTP_PROTOCOL}://${API_HOST}"
|
||||
DEV_URL = "${HTTP_PROTOCOL}://${API_HOST}"
|
||||
APP_URL = https://${APP_HOST}
|
||||
APP_URL = "https://${APP_HOST}"
|
||||
DOCKER_BUILD = 1
|
||||
EOF
|
||||
)"
|
||||
echo "${webenv}" | tee ${WORKSPACE_DIR}/web/.env > /dev/null
|
||||
echo "${webenv}" | tee "${WORKSPACE_DIR}"/web/.env > /dev/null
|
||||
|
||||
# chown everything to tactical user
|
||||
chown -R "${TACTICAL_USER}":"${TACTICAL_USER}" "${WORKSPACE_DIR}"
|
||||
|
||||
@@ -651,7 +651,11 @@ class Agent(BaseAuditModel):
|
||||
except ErrTimeout:
|
||||
ret = "timeout"
|
||||
else:
|
||||
ret = msgpack.loads(msg.data) # type: ignore
|
||||
try:
|
||||
ret = msgpack.loads(msg.data) # type: ignore
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
ret = str(e)
|
||||
|
||||
await nc.close()
|
||||
return ret
|
||||
|
||||
@@ -667,16 +667,7 @@ class Check(BaseAuditModel):
|
||||
body = subject + f" - Average memory usage: {avg}%, {text}"
|
||||
|
||||
elif self.check_type == "winsvc":
|
||||
|
||||
try:
|
||||
status = list(
|
||||
filter(lambda x: x["name"] == self.svc_name, self.agent.services)
|
||||
)[0]["status"]
|
||||
# catch services that don't exist if policy check
|
||||
except:
|
||||
status = "Unknown"
|
||||
|
||||
body = subject + f" - Status: {status.upper()}"
|
||||
body = subject + f" - Status: {self.more_info}"
|
||||
|
||||
elif self.check_type == "eventlog":
|
||||
|
||||
@@ -741,10 +732,7 @@ class Check(BaseAuditModel):
|
||||
elif self.check_type == "memory":
|
||||
body = subject + f" - Average memory usage: {avg}%, {text}"
|
||||
elif self.check_type == "winsvc":
|
||||
status = list(
|
||||
filter(lambda x: x["name"] == self.svc_name, self.agent.services)
|
||||
)[0]["status"]
|
||||
body = subject + f" - Status: {status.upper()}"
|
||||
body = subject + f" - Status: {self.more_info}"
|
||||
elif self.check_type == "eventlog":
|
||||
body = subject
|
||||
|
||||
|
||||
@@ -10,6 +10,8 @@ $ping = pingchange
|
||||
$auth = '"tokenchange"'
|
||||
$downloadlink = 'downloadchange'
|
||||
|
||||
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
||||
|
||||
$serviceName = 'tacticalagent'
|
||||
If (Get-Service $serviceName -ErrorAction SilentlyContinue) {
|
||||
write-host ('Tactical RMM Is Already Installed')
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
asgiref==3.3.1
|
||||
asgiref==3.3.4
|
||||
asyncio-nats-client==0.11.4
|
||||
celery==5.0.5
|
||||
certifi==2020.12.5
|
||||
@@ -6,7 +6,8 @@ cffi==1.14.5
|
||||
channels==3.0.3
|
||||
chardet==4.0.0
|
||||
cryptography==3.4.7
|
||||
Django==3.1.7
|
||||
daphne==3.0.2
|
||||
Django==3.2.0
|
||||
django-cors-headers==3.7.0
|
||||
django-rest-knox==4.1.0
|
||||
djangorestframework==3.12.4
|
||||
@@ -26,7 +27,7 @@ redis==3.5.3
|
||||
requests==2.25.1
|
||||
six==1.15.0
|
||||
sqlparse==0.4.1
|
||||
twilio==6.55.0
|
||||
twilio==6.56.0
|
||||
urllib3==1.26.4
|
||||
uWSGI==2.0.19.1
|
||||
validators==0.18.2
|
||||
|
||||
@@ -1,26 +1,33 @@
|
||||
[
|
||||
{
|
||||
"filename": "ClearFirefoxCache.ps1",
|
||||
"guid": "6820cb5e-5a7f-4d9b-8c22-d54677e3cc04",
|
||||
"filename": "Win_Clear_Firefox_Cache.ps1",
|
||||
"submittedBy": "https://github.com/Omnicef",
|
||||
"name": "Clear Firefox Cache",
|
||||
"description": "This script will clean up Mozilla Firefox for all users.",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Browsers"
|
||||
},
|
||||
{
|
||||
"filename": "ClearGoogleChromeCache.ps1",
|
||||
"guid": "3ff6a386-11d1-4f9d-8cca-1b0563bb6443",
|
||||
"filename": "Win_Clear_Google_Chrome_Cache.ps1",
|
||||
"submittedBy": "https://github.com/Omnicef",
|
||||
"name": "Clear Google Chrome Cache",
|
||||
"description": "This script will clean up Google Chrome for all users.",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Browsers"
|
||||
},
|
||||
{
|
||||
"filename": "InstallAdobeReader.ps1",
|
||||
"guid": "be1de837-f677-4ac5-aa0c-37a0fc9991fc",
|
||||
"filename": "Win_Install_Adobe_Reader.ps1",
|
||||
"submittedBy": "https://github.com/Omnicef",
|
||||
"name": "Install Adobe Reader DC",
|
||||
"description": "Installs Adobe Reader DC.",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):3rd Party Software>Chocolatey"
|
||||
},
|
||||
{
|
||||
"guid": "2ee134d5-76aa-4160-b334-a1efbc62079f",
|
||||
"filename": "Win_Install_Duplicati.ps1",
|
||||
"submittedBy": "https://github.com/Omnicef",
|
||||
"name": "Install Duplicati",
|
||||
@@ -29,55 +36,70 @@
|
||||
"category": "TRMM (Win):3rd Party Software"
|
||||
},
|
||||
{
|
||||
"filename": "Reset-WindowsUpdate.ps1",
|
||||
"guid": "81cc5bcb-01bf-4b0c-89b9-0ac0f3fe0c04",
|
||||
"filename": "Win_Reset_Windows_Update.ps1",
|
||||
"submittedBy": "https://github.com/Omnicef",
|
||||
"name": "Reset Windows Update",
|
||||
"description": "This script will reset all of the Windows Updates components to DEFAULT SETTINGS.",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Updates"
|
||||
},
|
||||
{
|
||||
"filename": "Start-Cleanup.ps1",
|
||||
"guid": "8db87ff0-a9b4-4d9d-bc55-377bbcb85b6d",
|
||||
"filename": "Win_Start_Cleanup.ps1",
|
||||
"submittedBy": "https://github.com/Omnicef",
|
||||
"name": "Cleanup C: drive",
|
||||
"description": "Cleans the C: drive's Window Temperary files, Windows SoftwareDistribution folder, the local users Temperary folder, IIS logs (if applicable) and empties the recycling bin. All deleted files will go into a log transcript in $env:TEMP. By default this script leaves files that are newer than 7 days old however this variable can be edited.",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Other"
|
||||
},
|
||||
{
|
||||
"filename": "WindowsDefenderFullScanBackground.ps1",
|
||||
"guid": "2f28e8c1-ae0f-4b46-a826-f513974526a3",
|
||||
"filename": "Win_Defender_FullScan_Background.ps1",
|
||||
"submittedBy": "https://github.com/Omnicef",
|
||||
"name": "Windows Defender Full Scan",
|
||||
"description": "Runs a Windows Defender Full background scan.",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Security>Antivirus"
|
||||
},
|
||||
{
|
||||
"filename": "WindowsDefenderQuickScanBackground.ps1",
|
||||
"guid": "adf81ddb-3b77-415c-a89b-2ccc826b5aa7",
|
||||
"filename": "Win_Defender_QuickScan_Background.ps1",
|
||||
"submittedBy": "https://github.com/Omnicef",
|
||||
"name": "Windows Defender Quick Scan",
|
||||
"description": "Runs a Quick Scan using Windows Defender in the Background.",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Security>Antivirus"
|
||||
},
|
||||
{
|
||||
"filename": "speedtest.py",
|
||||
"guid": "3c46290b-85db-4cd2-93a2-943c8c93b3b1",
|
||||
"filename": "Speedtest.py",
|
||||
"submittedBy": "https://github.com/wh1te909",
|
||||
"name": "Speed Test",
|
||||
"description": "Runs a Speed Test",
|
||||
"shell": "python"
|
||||
"description": "Runs a Speed Test using Python",
|
||||
"shell": "python",
|
||||
"category": "TRMM (Win):Network"
|
||||
},
|
||||
{
|
||||
"filename": "Rename-Installed-App.ps1",
|
||||
"guid": "9d34f482-1f0c-4b2f-b65f-a9cf3c13ef5f",
|
||||
"filename": "Win_Rename_Installed_App.ps1",
|
||||
"submittedBy": "https://github.com/bradhawkins85",
|
||||
"name": "Rename Tactical RMM Agent",
|
||||
"description": "Updates the DisplayName registry entry for the Tactical RMM windows agent to your desired name. This script takes 1 required argument: the name you wish to set.",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):TacticalRMM Related"
|
||||
},
|
||||
{
|
||||
"filename": "bitlocker_encrypted_drive_c.ps1",
|
||||
"guid": "525ae965-1dcf-4c17-92b3-5da3cf6819f5",
|
||||
"filename": "Win_Bitlocker_Encrypted_Drive_c.ps1",
|
||||
"submittedBy": "https://github.com/ThatsNASt",
|
||||
"name": "Check C Drive for Bitlocker Status",
|
||||
"description": "Runs a check on drive C for Bitlocker status.",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Storage"
|
||||
},
|
||||
{
|
||||
"guid": "2ea35fa2-c227-4d17-a40e-4d39f252e27a",
|
||||
"filename": "Win_Bitlocker_Create_Status_Report.ps1",
|
||||
"submittedBy": "https://github.com/ThatsNASt",
|
||||
"name": "Create Bitlocker Status Report",
|
||||
@@ -86,13 +108,16 @@
|
||||
"category": "TRMM (Win):Storage"
|
||||
},
|
||||
{
|
||||
"filename": "bitlocker_retrieve_status_report.ps1",
|
||||
"guid": "9e5769c1-3873-4941-bf70-e851e0afbd6d",
|
||||
"filename": "Win_Bitlocker_Retrieve_Status_Report.ps1",
|
||||
"submittedBy": "https://github.com/ThatsNASt",
|
||||
"name": "Retreive Bitlocker Status Report",
|
||||
"description": "Retreives a Bitlocker status report.",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Storage"
|
||||
},
|
||||
{
|
||||
"guid": "cfa14c28-4dfc-4d4e-95ee-a380652e058d",
|
||||
"filename": "Win_Bios_Check.ps1",
|
||||
"submittedBy": "https://github.com/ThatsNASt",
|
||||
"name": "Check BIOS Information",
|
||||
@@ -101,125 +126,160 @@
|
||||
"category": "TRMM (Win):Hardware"
|
||||
},
|
||||
{
|
||||
"filename": "ResetHighPerformancePowerProfiletoDefaults.ps1",
|
||||
"guid": "95a2ee6f-b89b-4551-856e-3081b041caa7",
|
||||
"filename": "Win_Reset_High_Performance_Power_Profile_to_Defaults.ps1",
|
||||
"submittedBy": "https://github.com/azulskyknight",
|
||||
"name": "Reset High Perf Power Profile",
|
||||
"description": "Resets monitor, disk, standby, and hibernate timers in the default High Performance power profile to their default values. It also re-indexes the AC and DC power profiles into their default order.",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Power"
|
||||
},
|
||||
{
|
||||
"filename": "SetHighPerformancePowerProfile.ps1",
|
||||
"guid": "2cbd30b0-84dd-4388-a36d-2e2e980f1a3e",
|
||||
"filename": "Win_Set_High_Performance_Power_Profile.ps1",
|
||||
"submittedBy": "https://github.com/azulskyknight",
|
||||
"name": "Set High Perf Power Profile",
|
||||
"description": "Sets the High Performance Power profile to the active power profile. Use this to keep machines from falling asleep.",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Power"
|
||||
},
|
||||
{
|
||||
"filename": "Windows10Upgrade.ps1",
|
||||
"guid": "553236d3-81bc-49f4-af8a-0cff925a7f6d",
|
||||
"filename": "Win_10_Upgrade.ps1",
|
||||
"submittedBy": "https://github.com/RVL-Solutions and https://github.com/darimm",
|
||||
"name": "Windows 10 Upgrade",
|
||||
"description": "Forces an upgrade to the latest release of Windows 10.",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Updates"
|
||||
},
|
||||
{
|
||||
"filename": "DiskStatus.ps1",
|
||||
"guid": "375323e5-cac6-4f35-a304-bb7cef35902d",
|
||||
"filename": "Win_Disk_Status.ps1",
|
||||
"submittedBy": "https://github.com/dinger1986",
|
||||
"name": "Check Disks",
|
||||
"name": "Check Disk Hardware Health (using Event Viewer errors)",
|
||||
"description": "Checks local disks for errors reported in event viewer within the last 24 hours",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Hardware"
|
||||
},
|
||||
{
|
||||
"filename": "DuplicatiStatus.ps1",
|
||||
"guid": "7c14beb4-d1c3-41aa-8e70-92a267d6e080",
|
||||
"filename": "Win_Duplicati_Status.ps1",
|
||||
"submittedBy": "https://github.com/dinger1986",
|
||||
"name": "Check Duplicati",
|
||||
"description": "Checks Duplicati Backup is running properly over the last 24 hours",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):3rd Party Software"
|
||||
},
|
||||
{
|
||||
"filename": "EnableDefender.ps1",
|
||||
"guid": "da51111c-aff6-4d87-9d76-0608e1f67fe5",
|
||||
"filename": "Win_Defender_Enable.ps1",
|
||||
"submittedBy": "https://github.com/dinger1986",
|
||||
"name": "Enable Windows Defender",
|
||||
"description": "Enables Windows Defender and sets preferences",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Security>Antivirus"
|
||||
},
|
||||
{
|
||||
"filename": "OpenSSHServerInstall.ps1",
|
||||
"guid": "a223d03a-e22e-40e0-94f2-92dd8c481d14",
|
||||
"filename": "Win_Open_SSH_Server_Install.ps1",
|
||||
"submittedBy": "https://github.com/dinger1986",
|
||||
"name": "Install SSH",
|
||||
"description": "Installs and enabled OpenSSH Server",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Windows Features"
|
||||
},
|
||||
{
|
||||
"filename": "RDP_enable.bat",
|
||||
"guid": "2435297a-6263-4e90-8688-1847400d0e22",
|
||||
"filename": "Win_RDP_enable.bat",
|
||||
"submittedBy": "https://github.com/dinger1986",
|
||||
"name": "Enable RDP",
|
||||
"description": "Enables RDP",
|
||||
"shell": "cmd"
|
||||
"shell": "cmd",
|
||||
"category": "TRMM (Win):Windows Features"
|
||||
},
|
||||
{
|
||||
"filename": "Speedtest.ps1",
|
||||
"guid": "24f19ead-fdfe-46b4-9dcb-4cd0e12a3940",
|
||||
"filename": "Win_Speedtest.ps1",
|
||||
"submittedBy": "https://github.com/dinger1986",
|
||||
"name": "PS Speed Test",
|
||||
"description": "Powershell speed test (win 10 or server2016+)",
|
||||
"shell": "powershell"
|
||||
"name": "Speed Test Powershell",
|
||||
"description": "Speed Test with Powershell(win 10 or server2016+)",
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Network"
|
||||
},
|
||||
{
|
||||
"filename": "SyncTime.bat",
|
||||
"guid": "a821975c-60df-4d58-8990-6cf8a55b4ee0",
|
||||
"filename": "Win_Sync_Time.bat",
|
||||
"submittedBy": "https://github.com/dinger1986",
|
||||
"name": "Sync DC Time",
|
||||
"description": "Syncs time with domain controller",
|
||||
"shell": "cmd"
|
||||
"shell": "cmd",
|
||||
"category": "TRMM (Win):Active Directory"
|
||||
},
|
||||
{
|
||||
"filename": "WinDefenderClearLogs.ps1",
|
||||
"guid": "b720e320-7755-4c89-9992-e1a6c43699ed",
|
||||
"filename": "Win_Defender_Clear_Logs.ps1",
|
||||
"submittedBy": "https://github.com/dinger1986",
|
||||
"name": "Clear Defender Logs",
|
||||
"description": "Clears Windows Defender Logs",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Security>Antivirus"
|
||||
},
|
||||
{
|
||||
"filename": "WinDefenderStatus.ps1",
|
||||
"guid": "d980fda3-a068-47eb-8495-1aab07a24e64",
|
||||
"filename": "Win_Defender_Status.ps1",
|
||||
"submittedBy": "https://github.com/dinger1986",
|
||||
"name": "Defender Status",
|
||||
"description": "This will check for Malware, Antispyware, that Windows Defender is Healthy, last scan etc within the last 24 hours",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Security>Antivirus"
|
||||
},
|
||||
{
|
||||
"filename": "disable_FastStartup.bat",
|
||||
"guid": "9956e936-6fdb-4488-a9d8-8b274658037f",
|
||||
"filename": "Win_Disable_Fast_Startup.bat",
|
||||
"submittedBy": "https://github.com/dinger1986",
|
||||
"name": "Disable Fast Startup",
|
||||
"description": "Disables Faststartup on Windows 10",
|
||||
"shell": "cmd"
|
||||
"shell": "cmd",
|
||||
"category": "TRMM (Win):Power"
|
||||
},
|
||||
{
|
||||
"filename": "updatetacticalexclusion.ps1",
|
||||
"guid": "2472bbaf-1941-4722-8a58-d1dd0f528801",
|
||||
"filename": "Win_Update_Tactical_Exclusion.ps1",
|
||||
"submittedBy": "https://github.com/dinger1986",
|
||||
"name": "TRMM Defender Exclusions",
|
||||
"description": "Windows Defender Exclusions for Tactical RMM",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Security>Antivirus"
|
||||
},
|
||||
{
|
||||
"filename": "Display_Message_To_User.ps1",
|
||||
"guid": "b253dc76-41a0-48ca-9cea-bee4277402c4",
|
||||
"filename": "Win_Display_Message_To_User.ps1",
|
||||
"submittedBy": "https://github.com/bradhawkins85",
|
||||
"name": "Display Message To User",
|
||||
"description": "Displays a popup message to the currently logged on user",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Other"
|
||||
},
|
||||
{
|
||||
"filename": "VerifyAntivirus.ps1",
|
||||
"guid": "19224d21-bd39-44bc-b9cf-8f1ba3ca9c11",
|
||||
"filename": "Win_Antivirus_Verify.ps1",
|
||||
"submittedBy": "https://github.com/beejayzed",
|
||||
"name": "Verify Antivirus Status",
|
||||
"description": "Verify and display status for all installed Antiviruses",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Security>Antivirus"
|
||||
},
|
||||
{
|
||||
"filename": "CreateAllUserLogonScript.ps1",
|
||||
"guid": "f88c5c52-c6fe-44db-b727-b7912a4279ed",
|
||||
"filename": "Win_Create_All_User_Logon_Script.ps1",
|
||||
"submittedBy": "https://github.com/nr-plaxon",
|
||||
"name": "Create User Logon Script",
|
||||
"description": "Creates a powershell script that runs at logon of any user on the machine in the security context of the user.",
|
||||
"shell": "powershell"
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Other"
|
||||
},
|
||||
{
|
||||
"guid": "5615aa90-0272-427b-8acf-0ca019612501",
|
||||
"filename": "Win_Chocolatey_Update_Installed.bat",
|
||||
"submittedBy": "https://github.com/silversword411",
|
||||
"name": "Chocolatey Update Installed Apps",
|
||||
@@ -228,6 +288,7 @@
|
||||
"category": "TRMM (Win):3rd Party Software>Chocolatey"
|
||||
},
|
||||
{
|
||||
"guid": "fff8024d-d72e-4457-84fa-6c780f69a16f",
|
||||
"filename": "Win_AD_Check_And_Enable_AD_Recycle_Bin.ps1",
|
||||
"submittedBy": "https://github.com/silversword411",
|
||||
"name": "AD - Check and Enable AD Recycle Bin",
|
||||
@@ -236,7 +297,8 @@
|
||||
"category": "TRMM (Win):Active Directory"
|
||||
},
|
||||
{
|
||||
"filename": "Check_Events_for_Bluescreens.ps1",
|
||||
"guid": "71090fc4-faa6-460b-adb0-95d7863544e1",
|
||||
"filename": "Win_Check_Events_for_Bluescreens.ps1",
|
||||
"submittedBy": "https://github.com/dinger1986",
|
||||
"name": "Event Viewer - Check for Bluescreens",
|
||||
"description": "This will check for Bluescreen events on your system",
|
||||
@@ -244,6 +306,7 @@
|
||||
"category": "TRMM (Win):Monitoring"
|
||||
},
|
||||
{
|
||||
"guid": "5d905886-9eb1-4129-8b81-a013f842eb24",
|
||||
"filename": "Win_Rename_Computer.ps1",
|
||||
"submittedBy": "https://github.com/silversword411",
|
||||
"name": "Rename Computer",
|
||||
@@ -253,7 +316,8 @@
|
||||
"default_timeout": 30
|
||||
},
|
||||
{
|
||||
"filename": "Finish_updates_and_restart.ps1",
|
||||
"guid": "f396dae2-c768-45c5-bd6c-176e56ed3614",
|
||||
"filename": "Win_Finish_updates_and_restart.ps1",
|
||||
"submittedBy": "https://github.com/tremor021",
|
||||
"name": "Finish updates and restart",
|
||||
"description": "Finish installing updates and restart PC",
|
||||
@@ -261,11 +325,77 @@
|
||||
"category": "TRMM (Win):Other"
|
||||
},
|
||||
{
|
||||
"filename": "Finish_updates_and_shutdown.ps1",
|
||||
"guid": "63f89be0-a9c9-4c61-9b55-bce0b28b90b2",
|
||||
"filename": "Win_Finish_updates_and_shutdown.ps1",
|
||||
"submittedBy": "https://github.com/tremor021",
|
||||
"name": "Finish updates and shutdown",
|
||||
"description": "Finish installing updates and shutdown PC",
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Other"
|
||||
},
|
||||
{
|
||||
"guid": "e09895d5-ca13-44a2-a38c-6e77c740f0e8",
|
||||
"filename": "Win_ScreenConnectAIO.ps1",
|
||||
"submittedBy": "https://github.com/bradhawkins85",
|
||||
"name": "ScreenConnect AIO",
|
||||
"description": "Install, Uninstall, Start and Stop ScreenConnect Access Agent",
|
||||
"args": [
|
||||
"-serviceName {{client.ScreenConnectService}}",
|
||||
"-url {{client.ScreenConnectInstaller}}",
|
||||
"-action install"
|
||||
],
|
||||
"default_timeout": "90",
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):3rd Party Software"
|
||||
},
|
||||
{
|
||||
"guid": "3abbb62a-3757-492c-8979-b4fc6174845d",
|
||||
"filename": "Win_Disable_AutoRun.bat",
|
||||
"submittedBy": "https://github.com/silversword411",
|
||||
"name": "Disable Autorun",
|
||||
"description": "Disable Autorun System Wide",
|
||||
"shell": "cmd",
|
||||
"category": "TRMM (Win):Other",
|
||||
"default_timeout": "30"
|
||||
},
|
||||
{
|
||||
"guid": "4a11877a-7555-494c-ac74-29d6df3c1989",
|
||||
"filename": "Win_Disable_Cortana.bat",
|
||||
"submittedBy": "https://github.com/silversword411",
|
||||
"name": "Disable Cortana",
|
||||
"description": "Disable Cortana System Wide",
|
||||
"shell": "cmd",
|
||||
"category": "TRMM (Win):Other",
|
||||
"default_timeout": "30"
|
||||
},
|
||||
{
|
||||
"guid": "28ef1387-dd4f-4bab-b042-26250914e370",
|
||||
"filename": "Win_WOL_Enable_Status.ps1",
|
||||
"submittedBy": "https://github.com/silversword411",
|
||||
"name": "WoL - Enable function",
|
||||
"description": "Wake on Lan enable on Dell, HP, Lenovo",
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Network",
|
||||
"default_timeout": "90"
|
||||
},
|
||||
{
|
||||
"guid": "685d5432-0b84-46d5-98e8-3ec2054150fe",
|
||||
"filename": "Win_WOL_Test_State.ps1",
|
||||
"submittedBy": "https://github.com/silversword411",
|
||||
"name": "WoL - Test State",
|
||||
"description": "Wake on Lan test status",
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Network",
|
||||
"default_timeout": "90"
|
||||
},
|
||||
{
|
||||
"guid": "6ce5682a-49db-4c0b-9417-609cf905ac43",
|
||||
"filename": "Win_Win10_Change_Key_and_Activate.ps1",
|
||||
"submittedBy": "https://github.com/silversword411",
|
||||
"name": "Change Win10 Product Key and Activate",
|
||||
"description": "Insert new product key and Activate. Requires 1 parameter the product key you want to use",
|
||||
"shell": "powershell",
|
||||
"category": "TRMM (Win):Other",
|
||||
"default_timeout": "90"
|
||||
}
|
||||
]
|
||||
@@ -87,7 +87,7 @@ class Script(BaseAuditModel):
|
||||
)
|
||||
|
||||
default_timeout = (
|
||||
script["default_timeout"]
|
||||
int(script["default_timeout"])
|
||||
if "default_timeout" in script.keys()
|
||||
else 90
|
||||
)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from email.policy import default
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
@@ -206,6 +207,7 @@ class TestScriptViews(TacticalTestCase):
|
||||
) as f:
|
||||
info = json.load(f)
|
||||
|
||||
guids = []
|
||||
for script in info:
|
||||
fn: str = script["filename"]
|
||||
self.assertTrue(os.path.exists(os.path.join(scripts_dir, fn)))
|
||||
@@ -222,6 +224,19 @@ class TestScriptViews(TacticalTestCase):
|
||||
elif fn.endswith(".py"):
|
||||
self.assertEqual(script["shell"], "python")
|
||||
|
||||
if "args" in script.keys():
|
||||
self.assertIsInstance(script["args"], list)
|
||||
|
||||
# allows strings as long as they can be type casted to int
|
||||
if "default_timeout" in script.keys():
|
||||
self.assertIsInstance(int(script["default_timeout"]), int)
|
||||
|
||||
self.assertIn("guid", script.keys())
|
||||
guids.append(script["guid"])
|
||||
|
||||
# check guids are unique
|
||||
self.assertEqual(len(guids), len(set(guids)))
|
||||
|
||||
def test_load_community_scripts(self):
|
||||
with open(
|
||||
os.path.join(settings.BASE_DIR, "scripts/community_scripts.json")
|
||||
|
||||
@@ -15,11 +15,11 @@ EXE_DIR = os.path.join(BASE_DIR, "tacticalrmm/private/exe")
|
||||
AUTH_USER_MODEL = "accounts.User"
|
||||
|
||||
# latest release
|
||||
TRMM_VERSION = "0.5.0"
|
||||
TRMM_VERSION = "0.5.2"
|
||||
|
||||
# bump this version everytime vue code is changed
|
||||
# to alert user they need to manually refresh their browser
|
||||
APP_VER = "0.0.126"
|
||||
APP_VER = "0.0.127"
|
||||
|
||||
# https://github.com/wh1te909/rmmagent
|
||||
LATEST_AGENT_VER = "1.4.13"
|
||||
@@ -27,16 +27,19 @@ LATEST_AGENT_VER = "1.4.13"
|
||||
MESH_VER = "0.7.93"
|
||||
|
||||
# for the update script, bump when need to recreate venv or npm install
|
||||
PIP_VER = "14"
|
||||
NPM_VER = "13"
|
||||
PIP_VER = "15"
|
||||
NPM_VER = "14"
|
||||
|
||||
DL_64 = f"https://github.com/wh1te909/rmmagent/releases/download/v{LATEST_AGENT_VER}/winagent-v{LATEST_AGENT_VER}.exe"
|
||||
DL_32 = f"https://github.com/wh1te909/rmmagent/releases/download/v{LATEST_AGENT_VER}/winagent-v{LATEST_AGENT_VER}-x86.exe"
|
||||
|
||||
EXE_GEN_URLS = [
|
||||
"https://exe2.tacticalrmm.io/api/v1/exe",
|
||||
"https://exe.tacticalrmm.io/api/v1/exe",
|
||||
]
|
||||
|
||||
DEFAULT_AUTO_FIELD = "django.db.models.AutoField"
|
||||
|
||||
ASGI_APPLICATION = "tacticalrmm.asgi.application"
|
||||
|
||||
try:
|
||||
|
||||
@@ -27,7 +27,7 @@ jobs:
|
||||
source env/bin/activate
|
||||
cd /myagent/_work/1/s/api/tacticalrmm
|
||||
pip install --no-cache-dir --upgrade pip
|
||||
pip install --no-cache-dir setuptools==53.0.0 wheel==0.36.2
|
||||
pip install --no-cache-dir setuptools==54.2.0 wheel==0.36.2
|
||||
pip install --no-cache-dir -r requirements.txt -r requirements-test.txt -r requirements-dev.txt
|
||||
displayName: "Install Python Dependencies"
|
||||
|
||||
|
||||
@@ -29,15 +29,15 @@ function check_tactical_ready {
|
||||
# tactical-init
|
||||
if [ "$1" = 'tactical-init' ]; then
|
||||
|
||||
mkdir -p ${TACTICAL_DIR}/tmp
|
||||
mkdir -p ${TACTICAL_DIR}/scripts/userdefined
|
||||
mkdir -p ${TACTICAL_DIR}/api/tacticalrmm/private/exe
|
||||
|
||||
test -f "${TACTICAL_READY_FILE}" && rm "${TACTICAL_READY_FILE}"
|
||||
|
||||
# copy container data to volume
|
||||
rsync -a --no-perms --no-owner --delete --exclude "tmp/*" --exclude "certs/*" --exclude="api/tacticalrmm/private/*" "${TACTICAL_TMP_DIR}/" "${TACTICAL_DIR}/"
|
||||
|
||||
mkdir -p ${TACTICAL_DIR}/tmp
|
||||
mkdir -p ${TACTICAL_DIR}/api/tacticalrmm/private/exe
|
||||
mkdir -p ${TACTICAL_DIR}/api/tacticalrmm/logs
|
||||
|
||||
until (echo > /dev/tcp/"${POSTGRES_HOST}"/"${POSTGRES_PORT}") &> /dev/null; do
|
||||
echo "waiting for postgresql container to be ready..."
|
||||
sleep 5
|
||||
|
||||
@@ -22,6 +22,7 @@ volumes:
|
||||
services:
|
||||
# postgres database for api service
|
||||
tactical-postgres:
|
||||
container_name: trmm-postgres
|
||||
image: postgres:13-alpine
|
||||
restart: always
|
||||
environment:
|
||||
@@ -35,6 +36,7 @@ services:
|
||||
|
||||
# redis container for celery tasks
|
||||
tactical-redis:
|
||||
container_name: trmm-redis
|
||||
image: redis:6.0-alpine
|
||||
restart: always
|
||||
networks:
|
||||
@@ -42,6 +44,7 @@ services:
|
||||
|
||||
# used to initialize the docker environment
|
||||
tactical-init:
|
||||
container_name: trmm-init
|
||||
image: ${IMAGE_REPO}tactical:${VERSION}
|
||||
restart: on-failure
|
||||
command: ["tactical-init"]
|
||||
@@ -65,6 +68,7 @@ services:
|
||||
|
||||
# nats
|
||||
tactical-nats:
|
||||
container_name: trmm-nats
|
||||
image: ${IMAGE_REPO}tactical-nats:${VERSION}
|
||||
restart: always
|
||||
environment:
|
||||
@@ -80,6 +84,7 @@ services:
|
||||
|
||||
# meshcentral container
|
||||
tactical-meshcentral:
|
||||
container_name: trmm-meshcentral
|
||||
image: ${IMAGE_REPO}tactical-meshcentral:${VERSION}
|
||||
restart: always
|
||||
environment:
|
||||
@@ -101,6 +106,7 @@ services:
|
||||
|
||||
# mongodb container for meshcentral
|
||||
tactical-mongodb:
|
||||
container_name: trmm-mongodb
|
||||
image: mongo:4.4
|
||||
restart: always
|
||||
environment:
|
||||
@@ -114,6 +120,7 @@ services:
|
||||
|
||||
# container that hosts vue frontend
|
||||
tactical-frontend:
|
||||
container_name: trmm-frontend
|
||||
image: ${IMAGE_REPO}tactical-frontend:${VERSION}
|
||||
restart: always
|
||||
networks:
|
||||
@@ -123,6 +130,7 @@ services:
|
||||
|
||||
# container for django backend
|
||||
tactical-backend:
|
||||
container_name: trmm-backend
|
||||
image: ${IMAGE_REPO}tactical:${VERSION}
|
||||
command: ["tactical-backend"]
|
||||
restart: always
|
||||
@@ -135,8 +143,9 @@ services:
|
||||
depends_on:
|
||||
- tactical-postgres
|
||||
|
||||
# container for django backend
|
||||
# container for django websockets connections
|
||||
tactical-websockets:
|
||||
container_name: trmm-websockets
|
||||
image: ${IMAGE_REPO}tactical:${VERSION}
|
||||
command: ["tactical-websockets"]
|
||||
restart: always
|
||||
@@ -150,8 +159,9 @@ services:
|
||||
- tactical-postgres
|
||||
- tactical-backend
|
||||
|
||||
tactical-nginx:
|
||||
# container for tactical reverse proxy
|
||||
tactical-nginx:
|
||||
container_name: trmm-nginx
|
||||
image: ${IMAGE_REPO}tactical-nginx:${VERSION}
|
||||
restart: always
|
||||
environment:
|
||||
@@ -171,6 +181,7 @@ services:
|
||||
|
||||
# container for celery worker service
|
||||
tactical-celery:
|
||||
container_name: trmm-celery
|
||||
image: ${IMAGE_REPO}tactical:${VERSION}
|
||||
command: ["tactical-celery"]
|
||||
restart: always
|
||||
@@ -186,6 +197,7 @@ services:
|
||||
|
||||
# container for celery beat service
|
||||
tactical-celerybeat:
|
||||
container_name: trmm-celerybeat
|
||||
image: ${IMAGE_REPO}tactical:${VERSION}
|
||||
command: ["tactical-celerybeat"]
|
||||
restart: always
|
||||
|
||||
104
docs/docs/contributing_using_devbox.md
Normal file
104
docs/docs/contributing_using_devbox.md
Normal file
@@ -0,0 +1,104 @@
|
||||
|
||||
Hidden docs, needs work
|
||||
|
||||
For local Hyper-v Devbox notes
|
||||
|
||||
From https://raw.githubusercontent.com/silversword411/tacticalrmm-devdocs
|
||||
|
||||
Needs an official install_devbox.sh script
|
||||
|
||||
# Setup local devbox in hyper-v VM
|
||||
|
||||
|
||||
|
||||
|
||||
## Install Ubuntu 20.04 LTS
|
||||
Don't forget to
|
||||
|
||||
```
|
||||
sudo apt-get updates && sudo apt-get upgrade
|
||||
```
|
||||
|
||||
### Optional
|
||||
Set all users in sudo group not to require password every time:
|
||||
|
||||
```
|
||||
sudo visudo
|
||||
```
|
||||
|
||||
Add this:
|
||||
|
||||
```
|
||||
%sudo ALL=(ALL) NOPASSWD: ALL
|
||||
```
|
||||
|
||||
## Download customized install script and tweak
|
||||
|
||||
Create folder to dump into
|
||||
|
||||
```
|
||||
sudo mkdir /rmm
|
||||
sudo chown ${USER}:${USER} -R /rmm
|
||||
cd /rmm
|
||||
```
|
||||
|
||||
Get dev install script
|
||||
```
|
||||
wget https://raw.githubusercontent.com/silversword411/tacticalrmm-devdocs/blob/main/install_devbox.sh
|
||||
```
|
||||
|
||||
Edit, and search for `REPLACEMEWITHYOURFORKEDREPOURL`
|
||||
|
||||
and replace with your forked repo URL (example commented out below)
|
||||
|
||||
## Run it
|
||||
|
||||
```
|
||||
./install_devbox.sh
|
||||
```
|
||||
## Watch for
|
||||
|
||||

|
||||
|
||||
!!!Note Unlike regular installs, don't worry about the QR code
|
||||
|
||||
## Celebrate
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Misc commands
|
||||
|
||||
### Start mkdocs on dev box
|
||||
|
||||
```bash
|
||||
cd /rmm/api
|
||||
source env/bin/activate
|
||||
pip install --upgrade pip
|
||||
pip install --upgrade setuptools wheel
|
||||
pip install -r tacticalrmm/requirements-dev.txt
|
||||
cd /rmm/docs
|
||||
mkdocs serve
|
||||
```
|
||||
|
||||
### Running tests locally
|
||||
|
||||
Prep and update
|
||||
|
||||
```bash
|
||||
source /rmm/api/env/bin/activate
|
||||
cd /rmm/api/tacticalrmm
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
Then run tests
|
||||
|
||||
```
|
||||
python manage.py test
|
||||
```
|
||||
|
||||
97
docs/docs/contributing_using_vscode.md
Normal file
97
docs/docs/contributing_using_vscode.md
Normal file
@@ -0,0 +1,97 @@
|
||||
|
||||
|
||||
### 1. Install vscode
|
||||
[https://code.visualstudio.com/download](https://code.visualstudio.com/download)
|
||||
|
||||
### 2. Fork Project in Github
|
||||
|
||||
This is making a duplicate of the code under your Github that you can edit
|
||||
|
||||
[https://github.com/wh1te909/tacticalrmm](https://github.com/wh1te909/tacticalrmm)
|
||||
|
||||

|
||||
|
||||
### 3. Add your (forked) repo to vscode
|
||||
|
||||
Clone repository
|
||||
|
||||
Login to your Github
|
||||
|
||||
Choose local folder
|
||||
|
||||
### 3a. Install extra vscode Extensions
|
||||
|
||||
GitLens
|
||||
|
||||
Remote - SSH
|
||||
|
||||
### 4. Open Terminal
|
||||
|
||||
[https://code.visualstudio.com/docs/editor/integrated-terminal](https://code.visualstudio.com/docs/editor/integrated-terminal)
|
||||
|
||||
```
|
||||
Ctrl+`
|
||||
```
|
||||
|
||||
### 5. Configure a remote for your fork (in vscode)
|
||||
|
||||
[https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/configuring-a-remote-for-a-fork](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/configuring-a-remote-for-a-fork)
|
||||
|
||||
Configure your local fork and tell it where the original code repo is so you can compare and merge updates later when official repo is updated
|
||||
|
||||
Check repos
|
||||
|
||||
```
|
||||
git remote -v
|
||||
```
|
||||
|
||||
Add upstream repo
|
||||
|
||||
```
|
||||
git remote add upstream https://github.com/wh1te909/tacticalrmm
|
||||
```
|
||||
|
||||
Confirm changes
|
||||
|
||||
```
|
||||
git remote -v
|
||||
```
|
||||
|
||||
|
||||
### 6. Contribute code
|
||||
|
||||
Make changes to something.
|
||||
|
||||
`Commit` (update something) and notate what you did
|
||||
|
||||
`Push` (from your local vscode to your github fork)
|
||||
|
||||
Open browser and look at your repo (It should reflect your commit)
|
||||
|
||||
|
||||
#### 6a. Request your changes to be pulled into the primary repo (Pull Request)
|
||||
|
||||

|
||||
|
||||
In browser create pull request
|
||||
|
||||
### 7. Sync your local fork
|
||||
|
||||
[https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/syncing-a-fork](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/syncing-a-fork)
|
||||
|
||||
Bring changes from original repo to your local vscode copy so you're current with changes made in original Github repo
|
||||
|
||||

|
||||
|
||||
```
|
||||
git pull --rebase upstream develop
|
||||
```
|
||||
#### 7a. Push your local updated copy to your Github fork
|
||||
|
||||
Then you're `push`ing that updated local repo to your online Github fork
|
||||
|
||||

|
||||
|
||||
### 8. Verify and Repeat
|
||||
|
||||
Check your Github fork in browser, should be up to date now with original. Repeat 6 or 7 as necessary
|
||||
BIN
docs/docs/images/trmm_contribute-notice.png
Normal file
BIN
docs/docs/images/trmm_contribute-notice.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 22 KiB |
BIN
docs/docs/images/trmm_need_sync_local_fork.png
Normal file
BIN
docs/docs/images/trmm_need_sync_local_fork.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 23 KiB |
BIN
docs/docs/images/trmm_vscode_git_pending.png
Normal file
BIN
docs/docs/images/trmm_vscode_git_pending.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 21 KiB |
BIN
docs/docs/images/vscode-forkit.png
Normal file
BIN
docs/docs/images/vscode-forkit.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.9 KiB |
@@ -53,7 +53,7 @@ Please then copy/paste the logs and post them either in our [Discord support cha
|
||||
|
||||
<br/>
|
||||
|
||||
#### Web UI frozen or not loading / website errors / general errors
|
||||
#### All other errors
|
||||
|
||||
First, run the [update script](update_server.md#updating-to-the-latest-rmm-version) with the `--force` flag. <br/>This will fix permissions and reinstall python/node packages that might have gotten corrupted.
|
||||
|
||||
@@ -61,10 +61,15 @@ First, run the [update script](update_server.md#updating-to-the-latest-rmm-versi
|
||||
./update.sh --force
|
||||
```
|
||||
|
||||
Check the debug log from the web UI: **File > Debug Log**
|
||||
|
||||
Open your browser's dev tools (ctrl + shift + j on chrome) and check the Console tab for any errors
|
||||
|
||||
Check all the systemd services that the rmm uses to function and check to make sure they're all active/running and enabled:
|
||||
|
||||
```bash
|
||||
sudo systemctl status rmm
|
||||
sudo systemctl status daphne
|
||||
sudo systemctl status celery
|
||||
sudo systemctl status celerybeat
|
||||
sudo systemctl status nginx
|
||||
|
||||
@@ -23,7 +23,9 @@ nav:
|
||||
- FAQ: faq.md
|
||||
- Management Commands: management_cmds.md
|
||||
- MeshCentral Integration: mesh_integration.md
|
||||
- Contributing: contributing.md
|
||||
- Contributing:
|
||||
- "Contributing to Docs": contributing.md
|
||||
- "Contributing using VSCode": contributing_using_vscode.md
|
||||
- License: license.md
|
||||
site_description: "A remote monitoring and management tool"
|
||||
site_author: "wh1te909"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
SCRIPT_VERSION="45"
|
||||
SCRIPT_VERSION="46"
|
||||
SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/install.sh'
|
||||
|
||||
sudo apt install -y curl wget dirmngr gnupg lsb-release
|
||||
@@ -359,7 +359,7 @@ python3.9 -m venv env
|
||||
source /rmm/api/env/bin/activate
|
||||
cd /rmm/api/tacticalrmm
|
||||
pip install --no-cache-dir --upgrade pip
|
||||
pip install --no-cache-dir setuptools==53.0.0 wheel==0.36.2
|
||||
pip install --no-cache-dir setuptools==54.2.0 wheel==0.36.2
|
||||
pip install --no-cache-dir -r /rmm/api/tacticalrmm/requirements.txt
|
||||
python manage.py migrate
|
||||
python manage.py collectstatic --no-input
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
SCRIPT_VERSION="23"
|
||||
SCRIPT_VERSION="24"
|
||||
SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/restore.sh'
|
||||
|
||||
sudo apt update
|
||||
@@ -291,8 +291,9 @@ python3.9 -m venv env
|
||||
source /rmm/api/env/bin/activate
|
||||
cd /rmm/api/tacticalrmm
|
||||
pip install --no-cache-dir --upgrade pip
|
||||
pip install --no-cache-dir setuptools==53.0.0 wheel==0.36.2
|
||||
pip install --no-cache-dir setuptools==54.2.0 wheel==0.36.2
|
||||
pip install --no-cache-dir -r /rmm/api/tacticalrmm/requirements.txt
|
||||
python manage.py migrate
|
||||
python manage.py collectstatic --no-input
|
||||
python manage.py reload_nats
|
||||
deactivate
|
||||
|
||||
1
scripts/Win_Disable_AutoRun.bat
Normal file
1
scripts/Win_Disable_AutoRun.bat
Normal file
@@ -0,0 +1 @@
|
||||
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer" /v NoDriveTypeAutoRun /t REG_DWORD /d 255 /f
|
||||
1
scripts/Win_Disable_Cortana.bat
Normal file
1
scripts/Win_Disable_Cortana.bat
Normal file
@@ -0,0 +1 @@
|
||||
reg add "hklm\SOFTWARE\Policies\Microsoft\Windows\Windows Search" /d "AllowCortana"=dword:00000000
|
||||
103
scripts/Win_ScreenConnectAIO.ps1
Normal file
103
scripts/Win_ScreenConnectAIO.ps1
Normal file
@@ -0,0 +1,103 @@
|
||||
<#
|
||||
Requires global variables for serviceName "ScreenConnectService" and url "ScreenConnectInstaller"
|
||||
serviceName is the name of the ScreenConnect Service once it is installed EG: "ScreenConnect Client (1327465grctq84yrtocq)"
|
||||
url is the path the download the exe version of the ScreenConnect Access installer
|
||||
Both variables values must start and end with "
|
||||
Also accepts uninstall variable to remove the installed instance if required.
|
||||
#>
|
||||
|
||||
param (
|
||||
[string] $serviceName,
|
||||
[string] $url,
|
||||
[string] $action
|
||||
)
|
||||
|
||||
$ErrorCount = 0
|
||||
|
||||
if (!$serviceName) {
|
||||
write-output "Variable not specified ScreenConnectService, please create a global custom field under Client called ScreenConnectService, Example Value: `"ScreenConnect Client (1327465grctq84yrtocq)`" `n"
|
||||
$ErrorCount += 1
|
||||
}
|
||||
if (!$url) {
|
||||
write-output "Variable not specified ScreenConnectInstaller, please create a global custom field under Client called ScreenConnectInstaller, Example Value: `"https://myinstance.screenconnect.com/Bin/ConnectWiseControl.ClientSetup.exe?h=stupidlylongurlhere`" `n"
|
||||
$ErrorCount += 1
|
||||
}
|
||||
|
||||
if (!$ErrorCount -eq 0) {
|
||||
exit 1
|
||||
}
|
||||
|
||||
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
||||
if ($action -eq "uninstall") {
|
||||
$MyApp = Get-WmiObject -Class Win32_Product | Where-Object{$_.Name -eq "$serviceName"}
|
||||
$MyApp.Uninstall()
|
||||
} else {
|
||||
If (Get-Service $serviceName -ErrorAction SilentlyContinue) {
|
||||
|
||||
If ((Get-Service $serviceName).Status -eq 'Running') {
|
||||
Try
|
||||
{
|
||||
Write-Output "Stopping $serviceName"
|
||||
Set-Service -Name $serviceName -Status stopped -StartupType disabled
|
||||
exit 0
|
||||
}
|
||||
Catch
|
||||
{
|
||||
$ErrorMessage = $_.Exception.Message
|
||||
$FailedItem = $_.Exception.ItemName
|
||||
Write-Error -Message "$ErrorMessage $FailedItem"
|
||||
exit 1
|
||||
}
|
||||
Finally
|
||||
{
|
||||
}
|
||||
|
||||
} Else {
|
||||
|
||||
Try
|
||||
{
|
||||
Write-Host "Starting $serviceName"
|
||||
Set-Service -Name $serviceName -Status running -StartupType automatic
|
||||
exit 0
|
||||
}
|
||||
Catch
|
||||
{
|
||||
$ErrorMessage = $_.Exception.Message
|
||||
$FailedItem = $_.Exception.ItemName
|
||||
Write-Error -Message "$ErrorMessage $FailedItem"
|
||||
exit 1
|
||||
}
|
||||
Finally
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} Else {
|
||||
|
||||
$OutPath = $env:TMP
|
||||
$output = "screenconnect.exe"
|
||||
|
||||
Try
|
||||
{
|
||||
$start_time = Get-Date
|
||||
$wc = New-Object System.Net.WebClient
|
||||
$wc.DownloadFile("$url", "$OutPath\$output")
|
||||
Start-Process -FilePath $OutPath\$output -Wait
|
||||
Write-Output "Time taken to download and install: $((Get-Date).Subtract($start_time).Seconds) second(s)"
|
||||
exit 0
|
||||
}
|
||||
Catch
|
||||
{
|
||||
$ErrorMessage = $_.Exception.Message
|
||||
$FailedItem = $_.Exception.ItemName
|
||||
Write-Error -Message "$ErrorMessage $FailedItem"
|
||||
exit 1
|
||||
}
|
||||
Finally
|
||||
{
|
||||
Remove-Item -Path $OutPath\$output
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -10,7 +10,7 @@
|
||||
script leaves files that are newer than 7 days old however this variable can be edited.
|
||||
|
||||
.EXAMPLE
|
||||
PS C:\> .\Start-Cleanup.ps1
|
||||
PS C:\> .\Win_Start_Cleanup.ps1
|
||||
Save the file to your hard drive with a .PS1 extention and run the file from an elavated PowerShell prompt.
|
||||
|
||||
.NOTES
|
||||
90
scripts/Win_WOL_Enable_Status.ps1
Normal file
90
scripts/Win_WOL_Enable_Status.ps1
Normal file
@@ -0,0 +1,90 @@
|
||||
[CmdletBinding()]
|
||||
param ()
|
||||
|
||||
begin {
|
||||
$PPNuGet = Get-PackageProvider -ListAvailable | Where-Object { $_.Name -eq 'Nuget' }
|
||||
if (!$PPNuget) {
|
||||
Write-Output 'Installing Nuget provider'
|
||||
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force
|
||||
}
|
||||
$PSGallery = Get-PSRepository -Name PsGallery
|
||||
if (!$PSGallery) {
|
||||
Write-Output 'Setting PSGallery as trusted Repository'
|
||||
Set-PSRepository -InstallationPolicy Trusted -Name PSGallery
|
||||
}
|
||||
$PsGetVersion = (Get-Module PowerShellGet).version
|
||||
if ($PsGetVersion -lt [version]'2.0') {
|
||||
Write-Output 'Installing latest version of PowerShellGet provider'
|
||||
Install-Module PowerShellGet -MinimumVersion 2.2 -Force
|
||||
Write-Output 'Reloading Modules'
|
||||
Remove-Module PowerShellGet -Force
|
||||
Remove-Module PackageManagement -Force
|
||||
Import-Module PowerShellGet -MinimumVersion 2.2 -Force
|
||||
Write-Output 'Updating PowerShellGet'
|
||||
Install-Module -Name PowerShellGet -MinimumVersion 2.2.3 -Force
|
||||
Write-Output 'PowerShellGet update requires all active PS Sessions to be restarted before it can continue.'
|
||||
|
||||
Exit 1
|
||||
}
|
||||
}
|
||||
|
||||
process {
|
||||
Write-Output 'Checking device Manufacturer'
|
||||
$Manufacturer = (Get-WmiObject -Class:Win32_ComputerSystem).Manufacturer
|
||||
if ($Manufacturer -like '*Dell*') {
|
||||
Write-Output 'Manufacturer is Dell. Installing Module and trying to enable Wake on LAN.'
|
||||
Write-Output 'Installing Dell Bios Provider'
|
||||
Install-Module -Name DellBIOSProvider -Force
|
||||
Import-Module DellBIOSProvider
|
||||
try {
|
||||
Set-Item -Path 'DellSmBios:\PowerManagement\WakeOnLan' -Value 'LANOnly' -ErrorAction Stop
|
||||
}
|
||||
catch {
|
||||
Write-Output 'An error occured. Was unable to set WakeOnLan.'
|
||||
|
||||
Exit 2
|
||||
}
|
||||
}
|
||||
if ($Manufacturer -like '*HP*' -or $Manufacturer -like '*Hewlett*') {
|
||||
Write-Output 'Manufacturer is HP. Installing module and trying to enable WakeOnLan. All HP Drivers are required for this operation to succeed.'
|
||||
Write-Output 'Installing HP Provider'
|
||||
Install-Module -Name HPCMSL -Force -AcceptLicense
|
||||
Import-Module HPCMSL
|
||||
try {
|
||||
$WolTypes = get-hpbiossettingslist | Where-Object { $_.Name -like '*Wake On Lan*' }
|
||||
ForEach ($WolType in $WolTypes) {
|
||||
Write-Output "Setting WOL Type: $($WOLType.Name)"
|
||||
Set-HPBIOSSettingValue -name $($WolType.name) -Value 'Boot to Hard Drive' -ErrorAction Stop
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Output 'An error occured. Was unable to set WakeOnLan.'
|
||||
|
||||
Exit 2
|
||||
}
|
||||
}
|
||||
if ($Manufacturer -like '*Lenovo*') {
|
||||
Write-Output 'Manufacturer is Lenovo. Trying to set via WMI. All Lenovo Drivers are required for this operation to succeed.'
|
||||
try {
|
||||
Write-Output 'Setting BIOS.'
|
||||
(Get-WmiObject -ErrorAction Stop -class 'Lenovo_SetBiosSetting' -namespace 'root\wmi').SetBiosSetting('WakeOnLAN,Primary') | Out-Null
|
||||
Write-Output 'Saving BIOS.'
|
||||
(Get-WmiObject -ErrorAction Stop -class 'Lenovo_SaveBiosSettings' -namespace 'root\wmi').SaveBiosSettings() | Out-Null
|
||||
}
|
||||
catch {
|
||||
Write-Output 'An error occured. Was unable to set WakeOnLan.'
|
||||
|
||||
Exit 2
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
end {
|
||||
Write-Output 'Setting NIC to enable WOL'
|
||||
$NicsWithWake = Get-CimInstance -ClassName 'MSPower_DeviceWakeEnable' -Namespace 'root/wmi'
|
||||
foreach ($Nic in $NicsWithWake) {
|
||||
Write-Output 'Enabling for NIC'
|
||||
Set-CimInstance $NIC -Property @{Enable = $true }
|
||||
}
|
||||
Exit 0
|
||||
}
|
||||
105
scripts/Win_WOL_Test_State.ps1
Normal file
105
scripts/Win_WOL_Test_State.ps1
Normal file
@@ -0,0 +1,105 @@
|
||||
[CmdletBinding()]
|
||||
param ()
|
||||
|
||||
begin {
|
||||
$PPNuGet = Get-PackageProvider -ListAvailable | Where-Object { $_.Name -eq 'Nuget' }
|
||||
if (!$PPNuget) {
|
||||
Write-Output 'Installing Nuget provider'
|
||||
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force
|
||||
}
|
||||
$PSGallery = Get-PSRepository -Name PsGallery
|
||||
if (!$PSGallery) {
|
||||
Write-Output 'Installing PSGallery'
|
||||
Set-PSRepository -InstallationPolicy Trusted -Name PSGallery
|
||||
}
|
||||
$PsGetVersion = (Get-Module PowerShellGet).version
|
||||
if ($PsGetVersion -lt [version]'2.0') {
|
||||
Write-Output 'Installing latest version of PowerShellGet provider'
|
||||
Install-Module PowerShellGet -MinimumVersion 2.2 -Force
|
||||
Write-Output 'Reloading Modules'
|
||||
Remove-Module PowerShellGet -Force
|
||||
Remove-Module PackageManagement -Force
|
||||
Import-Module PowerShellGet -MinimumVersion 2.2 -Force
|
||||
Write-Output 'Updating PowerShellGet'
|
||||
Install-Module -Name PowerShellGet -MinimumVersion 2.2.3 -Force
|
||||
Write-Output 'PowerShellGet update requires all active PS Sessions to be restarted before it can continue.'
|
||||
|
||||
Exit 1
|
||||
}
|
||||
}
|
||||
|
||||
process {
|
||||
Write-Output 'Checking Manufacturer'
|
||||
$Manufacturer = (Get-WmiObject -Class:Win32_ComputerSystem).Manufacturer
|
||||
if ($Manufacturer -like '*Dell*') {
|
||||
Write-Output 'Manufacturer is Dell. Installing Module and trying to get WOL state'
|
||||
Write-Output 'Installing Dell Bios Provider if needed'
|
||||
$Mod = Get-Module DellBIOSProvider
|
||||
if (!$mod) {
|
||||
Install-Module -Name DellBIOSProvider -Force
|
||||
}
|
||||
Import-Module DellBIOSProvider
|
||||
try {
|
||||
$WOLMonitor = Get-Item -Path 'DellSmBios:\PowerManagement\WakeOnLan' -ErrorAction SilentlyContinue
|
||||
if ($WOLMonitor.currentvalue -eq 'LanOnly') { $WOLState = 'Healthy' }
|
||||
}
|
||||
catch {
|
||||
Write-Output 'An error occured. Could not get WOL setting.'
|
||||
|
||||
Exit 3
|
||||
}
|
||||
}
|
||||
if ($Manufacturer -like '*HP*' -or $Manufacturer -like '*Hewlett*') {
|
||||
Write-Output 'Manufacturer is HP. Installing module and trying to get WOL State.'
|
||||
Write-Output 'Installing HP Provider if needed.'
|
||||
$Mod = Get-Module HPCMSL
|
||||
if (!$mod) {
|
||||
Install-Module -Name HPCMSL -Force -AcceptLicense
|
||||
}
|
||||
Import-Module HPCMSL
|
||||
try {
|
||||
$WolTypes = get-hpbiossettingslist | Where-Object { $_.Name -like '*Wake On Lan*' }
|
||||
$WOLState = ForEach ($WolType in $WolTypes) {
|
||||
Write-Output "Setting WOL Type: $($WOLType.Name)"
|
||||
get-HPBIOSSettingValue -name $($WolType.name) -ErrorAction Stop
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Output 'An error occured. Could not find WOL state'
|
||||
|
||||
Exit 3
|
||||
}
|
||||
}
|
||||
if ($Manufacturer -like '*Lenovo*') {
|
||||
Write-Output 'Manufacturer is Lenovo. Trying to get via WMI'
|
||||
try {
|
||||
Write-Output 'Getting BIOS.'
|
||||
$currentSetting = (Get-WmiObject -ErrorAction Stop -class 'Lenovo_BiosSetting' -namespace 'root\wmi') | Where-Object { $_.CurrentSetting -ne '' }
|
||||
$WOLStatus = $currentSetting.currentsetting | ConvertFrom-Csv -Delimiter ',' -Header 'Setting', 'Status' | Where-Object { $_.setting -eq 'Wake on lan' }
|
||||
$WOLStatus = $WOLStatus.status -split ';'
|
||||
if ($WOLStatus[0] -eq 'Primary') { $WOLState = 'Healthy' }
|
||||
}
|
||||
catch {
|
||||
Write-Output 'An error occured. Could not find WOL state'
|
||||
|
||||
Exit 3
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
end {
|
||||
$NicsWithWake = Get-CimInstance -ClassName 'MSPower_DeviceWakeEnable' -Namespace 'root/wmi' | Where-Object { $_.Enable -eq $False }
|
||||
if (!$NicsWithWake) {
|
||||
$NICWOL = 'Healthy - All NICs enabled for WOL within the OS.'
|
||||
Exit 0
|
||||
}
|
||||
else {
|
||||
$NICWOL = 'Unhealthy - NIC does not have WOL enabled inside of the OS.'
|
||||
Exit 4
|
||||
}
|
||||
if (!$WOLState) {
|
||||
$NICWOL = 'Unhealthy - Could not find WOL state'
|
||||
Exit 3
|
||||
}
|
||||
return $NICWOL
|
||||
}
|
||||
48
scripts/Win_Win10_Change_Key_and_Activate.ps1
Normal file
48
scripts/Win_Win10_Change_Key_and_Activate.ps1
Normal file
@@ -0,0 +1,48 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
License Windows 10
|
||||
|
||||
.DESCRIPTION
|
||||
Insert License key into Windows 10 and activate
|
||||
|
||||
.NOTES
|
||||
For Windows installations in different languages, you will need to edit the following:
|
||||
Select-String -Pattern "^License Status:"
|
||||
and
|
||||
$LicenseStatus -match "Licensed"
|
||||
to match your specific language translation.
|
||||
|
||||
.FUNCTIONALITY
|
||||
PowerShell v3+
|
||||
#>
|
||||
|
||||
if ($Args.Count -eq 0) {
|
||||
Write-Output "New Product Key is Required"
|
||||
exit 1
|
||||
}
|
||||
|
||||
$param1 = $args[0]
|
||||
|
||||
$OSKey = "$param1"
|
||||
$SLMgr = "C:\Windows\System32\slmgr.vbs"
|
||||
|
||||
Write-Output "Inserting license key: $OSKey"
|
||||
$InsertKey = & cscript $SLMgr /ipk $OSKey
|
||||
$RetryCount = 3
|
||||
|
||||
while ($RetryCount -gt 0) {
|
||||
Write-Output "Activating license key..."
|
||||
& cscript $SLMgr /ato
|
||||
|
||||
Write-Output "Verifying activation status"
|
||||
$SLMgrResult = & cscript $SLMgr /dli
|
||||
$LicenseStatus = ([string]($SLMgrResult | Select-String -Pattern "^License Status:")).Remove(0, 16)
|
||||
if ($LicenseStatus -match "Licensed") {
|
||||
Write-Host "Activation Successful" -ForegroundColor Green
|
||||
$retryCount = 0
|
||||
}
|
||||
else {
|
||||
Write-Error "Activation failed."
|
||||
$RetryCount -= 1
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
SCRIPT_VERSION="117"
|
||||
SCRIPT_VERSION="118"
|
||||
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'
|
||||
@@ -256,7 +256,7 @@ if [[ "${CURRENT_PIP_VER}" != "${LATEST_PIP_VER}" ]] || [[ "$force" = true ]]; t
|
||||
source /rmm/api/env/bin/activate
|
||||
cd /rmm/api/tacticalrmm
|
||||
pip install --no-cache-dir --upgrade pip
|
||||
pip install --no-cache-dir setuptools==53.0.0 wheel==0.36.2
|
||||
pip install --no-cache-dir setuptools==54.2.0 wheel==0.36.2
|
||||
pip install --no-cache-dir -r requirements.txt
|
||||
else
|
||||
source /rmm/api/env/bin/activate
|
||||
|
||||
2792
web/package-lock.json
generated
2792
web/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -16,14 +16,14 @@
|
||||
"dotenv": "^8.2.0",
|
||||
"prismjs": "^1.22.0",
|
||||
"qrcode.vue": "^1.7.0",
|
||||
"quasar": "^1.15.9",
|
||||
"quasar": "^1.15.10",
|
||||
"vue-apexcharts": "^1.6.0",
|
||||
"vue-prism-editor": "^1.2.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@quasar/app": "^2.2.3",
|
||||
"@quasar/app": "^2.2.4",
|
||||
"@quasar/cli": "^1.1.3",
|
||||
"core-js": "^3.10.0",
|
||||
"core-js": "^3.10.1",
|
||||
"eslint-plugin-cypress": "^2.11.2",
|
||||
"flush-promises": "^1.0.2",
|
||||
"fs-extra": "^9.1.0"
|
||||
|
||||
@@ -186,13 +186,16 @@ export default {
|
||||
|
||||
categories.forEach(cat => {
|
||||
options.push({ category: cat });
|
||||
let tmp = [];
|
||||
scripts.forEach(script => {
|
||||
if (script.category === cat) {
|
||||
options.push({ label: script.name, value: script.id, timeout: script.default_timeout, args: script.args });
|
||||
tmp.push({ label: script.name, value: script.id, timeout: script.default_timeout, args: script.args });
|
||||
} else if (cat === "Unassigned" && !script.category) {
|
||||
options.push({ label: script.name, value: script.id, timeout: script.default_timeout, args: script.args });
|
||||
tmp.push({ label: script.name, value: script.id, timeout: script.default_timeout, args: script.args });
|
||||
}
|
||||
})
|
||||
const sorted = tmp.sort((a, b) => a.label.localeCompare(b.label));
|
||||
options.push(...sorted);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user