Compare commits

...

48 Commits

Author SHA1 Message Date
wh1te909
aa8b84a302 Release 0.5.2 2021-04-09 18:30:30 +00:00
wh1te909
b987d041b0 bump version 2021-04-09 18:29:08 +00:00
wh1te909
b62e37307e revert meshcentral back to 0.7.93 2021-04-09 18:28:43 +00:00
Dan
61a59aa6ac Merge pull request #375 from silversword411/develop
scripts 4 adds and a rename
2021-04-09 00:09:17 -07:00
silversword411
f79ec27f1d Adding 5 new scripts 2021-04-09 01:05:58 -04:00
silversword411
b993fe380f Merge branch 'develop' of https://github.com/silversword411/tacticalrmm into develop 2021-04-09 00:40:24 -04:00
silversword411
d974b5f55f Script screenconnect rename 2021-04-09 00:38:22 -04:00
wh1te909
f21ae93197 Release 0.5.1 2021-04-08 08:05:08 +00:00
wh1te909
342ff18be8 bump versions 2021-04-08 07:58:04 +00:00
wh1te909
a8236f69bf catch msgpack decode errors 2021-04-08 06:48:43 +00:00
wh1te909
ab15a2448d update reqs 2021-04-08 06:09:48 +00:00
wh1te909
6ff4d8f558 run migrations during restore 2021-04-08 05:57:16 +00:00
sadnub
bb04ba528c make sure logs dir exists for api 2021-04-07 19:39:35 -04:00
sadnub
b94a795189 specify names for the dev and prod containers and fix frontend web .env generation 2021-04-07 19:39:35 -04:00
wh1te909
9968184733 fix alert sending the wrong winsvc status text 2021-04-07 20:34:29 +00:00
silversword411
1be6f8f87a Script screenconnect rename 2021-04-07 11:56:02 +00:00
wh1te909
426821cceb django 3.2 2021-04-07 04:58:35 +00:00
wh1te909
4fec0deaf7 add another server for exe gen 2021-04-07 04:52:16 +00:00
Dan
144ac5b6ce Merge pull request #373 from silversword411/develop
Script rename-ageddon v1
2021-04-06 21:41:22 -07:00
Dan
97c73786fa Merge pull request #372 from bradhawkins85/patch-12
Update installer.ps1
2021-04-06 21:40:24 -07:00
silversword411
82e59d7da0 Merge branch 'develop' of https://github.com/silversword411/tacticalrmm into develop 2021-04-07 04:09:24 +00:00
silversword411
b2c10de6af Script rename-ageddon v1 2021-04-07 04:09:04 +00:00
silversword411
d72029c2c6 Script rename-ageddon v1 2021-04-07 04:08:30 +00:00
bradhawkins85
17b9987063 Update installer.ps1
Set TLS version to 1.2
2021-04-07 13:47:26 +10:00
Dan
fde07da2b7 Merge pull request #371 from silversword411/develop
Script Category-geddon v1
2021-04-06 16:32:17 -07:00
silversword411
c23bc29511 Don't tell anyone, secret devbox rockin docs WIP 2021-04-06 04:12:56 +00:00
silversword411
714cad2a52 Script Category-geddon v1 2021-04-06 03:30:59 +00:00
wh1te909
357d5d2fde sort scripts alphabetically 2021-04-05 09:00:32 +00:00
Dan
d477cce901 Merge pull request #369 from bradhawkins85/patch-11
Update ScreenConnectAIO.ps1
2021-04-05 01:11:38 -07:00
bradhawkins85
eb6af52ad1 Update ScreenConnectAIO.ps1
Add error checking to ensure required custom fields have been created, stop the script if they have not been set up.
2021-04-05 17:51:01 +10:00
wh1te909
aae75023a7 add some more tests for community scripts json file 2021-04-05 07:21:47 +00:00
wh1te909
41dcd4f458 fix screenconnect args 2021-04-05 07:21:26 +00:00
Dan
4651ae4495 Merge pull request #368 from bradhawkins85/patch-10
Create ScreenConnectAIO.ps1
2021-04-04 23:45:50 -07:00
bradhawkins85
ed61e0b0fc Create ScreenConnectAIO.ps1
Install, Uninstall, Start and Stop ScreenConnect Access Agent
2021-04-05 16:42:05 +10:00
Dan
1eefc6fbf4 Merge pull request #367 from wh1te909/revert-365-patch-8
Revert "Create ScreenConnectAIO.ps1"
2021-04-04 23:40:33 -07:00
Dan
09ebf2cea2 Revert "Create ScreenConnectAIO.ps1" 2021-04-04 23:40:17 -07:00
Dan
b3b0c4cd65 Merge pull request #366 from bradhawkins85/patch-9
Update community_scripts.json
2021-04-04 23:21:52 -07:00
Dan
f4b7924e8f Merge pull request #365 from bradhawkins85/patch-8
Create ScreenConnectAIO.ps1
2021-04-04 23:21:44 -07:00
bradhawkins85
ea68d38b82 Update community_scripts.json
add ScreenConnectAIO.ps1
2021-04-05 16:18:29 +10:00
bradhawkins85
dfbaa71132 Create ScreenConnectAIO.ps1
Install, Uninstall, Start and Stop ScreenConnect Access agent script.
2021-04-05 15:59:08 +10:00
Dan
6c328deb08 Merge pull request #364 from silversword411/develop
Polishing vscode contribute docs
2021-04-04 22:29:50 -07:00
silversword411
add564d5bf Polishing vscode docs v2 2021-04-05 00:11:56 +00:00
silversword411
fa94acb426 Updating Disk Health and Duplicati scripts 2021-04-05 00:07:24 +00:00
silversword411
6827468f13 Polishing vscode contribute docs 2021-04-04 23:51:39 +00:00
Dan
53fd43868f Merge pull request #362 from silversword411/develop
Adding vscode contributing Howto to docs
2021-04-04 13:45:27 -07:00
silversword411
9ced7561c5 Adding GUID's to all scripts 2021-04-04 18:29:21 +00:00
silversword411
31d55d3425 Adding vscode contributing Howto to docs 2021-04-04 18:10:19 +00:00
wh1te909
171d2a5bb9 update docs 2021-04-04 09:21:17 +00:00
64 changed files with 2276 additions and 1466 deletions

View File

@@ -2,6 +2,7 @@ version: '3.4'
services: services:
api-dev: api-dev:
container_name: trmm-api-dev
image: api-dev image: api-dev
restart: always restart: always
build: build:
@@ -21,6 +22,7 @@ services:
- tactical-backend - tactical-backend
app-dev: app-dev:
container_name: trmm-app-dev
image: node:14-alpine image: node:14-alpine
restart: always restart: always
command: /bin/sh -c "npm install npm@latest -g && npm install && npm run serve -- --host 0.0.0.0 --port ${APP_PORT}" 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
nats-dev: nats-dev:
container_name: trmm-nats-dev
image: ${IMAGE_REPO}tactical-nats:${VERSION} image: ${IMAGE_REPO}tactical-nats:${VERSION}
restart: always restart: always
environment: environment:
@@ -55,6 +58,7 @@ services:
# meshcentral container # meshcentral container
meshcentral-dev: meshcentral-dev:
container_name: trmm-meshcentral-dev
image: ${IMAGE_REPO}tactical-meshcentral:${VERSION} image: ${IMAGE_REPO}tactical-meshcentral:${VERSION}
restart: always restart: always
environment: environment:
@@ -77,6 +81,7 @@ services:
# mongodb container for meshcentral # mongodb container for meshcentral
mongodb-dev: mongodb-dev:
container_name: trmm-mongodb-dev
image: mongo:4.4 image: mongo:4.4
restart: always restart: always
environment: environment:
@@ -92,6 +97,7 @@ services:
# postgres database for api service # postgres database for api service
postgres-dev: postgres-dev:
container_name: trmm-postgres-dev
image: postgres:13-alpine image: postgres:13-alpine
restart: always restart: always
environment: environment:
@@ -107,6 +113,7 @@ services:
# redis container for celery tasks # redis container for celery tasks
redis-dev: redis-dev:
container_name: trmm-redis-dev
restart: always restart: always
image: redis:6.0-alpine image: redis:6.0-alpine
networks: networks:
@@ -115,6 +122,7 @@ services:
- tactical-redis - tactical-redis
init-dev: init-dev:
container_name: trmm-init-dev
image: api-dev image: api-dev
build: build:
context: . context: .
@@ -143,6 +151,7 @@ services:
# container for celery worker service # container for celery worker service
celery-dev: celery-dev:
container_name: trmm-celery-dev
image: api-dev image: api-dev
build: build:
context: . context: .
@@ -160,6 +169,7 @@ services:
# container for celery beat service # container for celery beat service
celerybeat-dev: celerybeat-dev:
container_name: trmm-celerybeat-dev
image: api-dev image: api-dev
build: build:
context: . context: .
@@ -175,8 +185,9 @@ services:
- postgres-dev - postgres-dev
- redis-dev - redis-dev
# container for celery beat service # container for websockets communication
websockets-dev: websockets-dev:
container_name: trmm-websockets-dev
image: api-dev image: api-dev
build: build:
context: . context: .
@@ -194,8 +205,9 @@ services:
- postgres-dev - postgres-dev
- redis-dev - redis-dev
nginx-dev:
# container for tactical reverse proxy # container for tactical reverse proxy
nginx-dev:
container_name: trmm-nginx-dev
image: ${IMAGE_REPO}tactical-nginx:${VERSION} image: ${IMAGE_REPO}tactical-nginx:${VERSION}
restart: always restart: always
environment: environment:

View File

@@ -136,10 +136,11 @@ if [ "$1" = 'tactical-init-dev' ]; then
webenv="$(cat << EOF webenv="$(cat << EOF
PROD_URL = "${HTTP_PROTOCOL}://${API_HOST}" PROD_URL = "${HTTP_PROTOCOL}://${API_HOST}"
DEV_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 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 everything to tactical user
chown -R "${TACTICAL_USER}":"${TACTICAL_USER}" "${WORKSPACE_DIR}" chown -R "${TACTICAL_USER}":"${TACTICAL_USER}" "${WORKSPACE_DIR}"

View File

@@ -651,7 +651,11 @@ class Agent(BaseAuditModel):
except ErrTimeout: except ErrTimeout:
ret = "timeout" ret = "timeout"
else: 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() await nc.close()
return ret return ret

View File

@@ -667,16 +667,7 @@ class Check(BaseAuditModel):
body = subject + f" - Average memory usage: {avg}%, {text}" body = subject + f" - Average memory usage: {avg}%, {text}"
elif self.check_type == "winsvc": elif self.check_type == "winsvc":
body = subject + f" - Status: {self.more_info}"
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()}"
elif self.check_type == "eventlog": elif self.check_type == "eventlog":
@@ -741,10 +732,7 @@ class Check(BaseAuditModel):
elif self.check_type == "memory": elif self.check_type == "memory":
body = subject + f" - Average memory usage: {avg}%, {text}" body = subject + f" - Average memory usage: {avg}%, {text}"
elif self.check_type == "winsvc": elif self.check_type == "winsvc":
status = list( body = subject + f" - Status: {self.more_info}"
filter(lambda x: x["name"] == self.svc_name, self.agent.services)
)[0]["status"]
body = subject + f" - Status: {status.upper()}"
elif self.check_type == "eventlog": elif self.check_type == "eventlog":
body = subject body = subject

View File

@@ -10,6 +10,8 @@ $ping = pingchange
$auth = '"tokenchange"' $auth = '"tokenchange"'
$downloadlink = 'downloadchange' $downloadlink = 'downloadchange'
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$serviceName = 'tacticalagent' $serviceName = 'tacticalagent'
If (Get-Service $serviceName -ErrorAction SilentlyContinue) { If (Get-Service $serviceName -ErrorAction SilentlyContinue) {
write-host ('Tactical RMM Is Already Installed') write-host ('Tactical RMM Is Already Installed')

View File

@@ -1,4 +1,4 @@
asgiref==3.3.1 asgiref==3.3.4
asyncio-nats-client==0.11.4 asyncio-nats-client==0.11.4
celery==5.0.5 celery==5.0.5
certifi==2020.12.5 certifi==2020.12.5
@@ -6,7 +6,8 @@ cffi==1.14.5
channels==3.0.3 channels==3.0.3
chardet==4.0.0 chardet==4.0.0
cryptography==3.4.7 cryptography==3.4.7
Django==3.1.7 daphne==3.0.2
Django==3.2.0
django-cors-headers==3.7.0 django-cors-headers==3.7.0
django-rest-knox==4.1.0 django-rest-knox==4.1.0
djangorestframework==3.12.4 djangorestframework==3.12.4
@@ -26,7 +27,7 @@ redis==3.5.3
requests==2.25.1 requests==2.25.1
six==1.15.0 six==1.15.0
sqlparse==0.4.1 sqlparse==0.4.1
twilio==6.55.0 twilio==6.56.0
urllib3==1.26.4 urllib3==1.26.4
uWSGI==2.0.19.1 uWSGI==2.0.19.1
validators==0.18.2 validators==0.18.2

View File

@@ -1,26 +1,33 @@
[ [
{ {
"filename": "ClearFirefoxCache.ps1", "guid": "6820cb5e-5a7f-4d9b-8c22-d54677e3cc04",
"filename": "Win_Clear_Firefox_Cache.ps1",
"submittedBy": "https://github.com/Omnicef", "submittedBy": "https://github.com/Omnicef",
"name": "Clear Firefox Cache", "name": "Clear Firefox Cache",
"description": "This script will clean up Mozilla Firefox for all users.", "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", "submittedBy": "https://github.com/Omnicef",
"name": "Clear Google Chrome Cache", "name": "Clear Google Chrome Cache",
"description": "This script will clean up Google Chrome for all users.", "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", "submittedBy": "https://github.com/Omnicef",
"name": "Install Adobe Reader DC", "name": "Install Adobe Reader DC",
"description": "Installs 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", "filename": "Win_Install_Duplicati.ps1",
"submittedBy": "https://github.com/Omnicef", "submittedBy": "https://github.com/Omnicef",
"name": "Install Duplicati", "name": "Install Duplicati",
@@ -29,55 +36,70 @@
"category": "TRMM (Win):3rd Party Software" "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", "submittedBy": "https://github.com/Omnicef",
"name": "Reset Windows Update", "name": "Reset Windows Update",
"description": "This script will reset all of the Windows Updates components to DEFAULT SETTINGS.", "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", "submittedBy": "https://github.com/Omnicef",
"name": "Cleanup C: drive", "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.", "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", "submittedBy": "https://github.com/Omnicef",
"name": "Windows Defender Full Scan", "name": "Windows Defender Full Scan",
"description": "Runs a Windows Defender Full background 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", "submittedBy": "https://github.com/Omnicef",
"name": "Windows Defender Quick Scan", "name": "Windows Defender Quick Scan",
"description": "Runs a Quick Scan using Windows Defender in the Background.", "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", "submittedBy": "https://github.com/wh1te909",
"name": "Speed Test", "name": "Speed Test",
"description": "Runs a Speed Test", "description": "Runs a Speed Test using Python",
"shell": "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", "submittedBy": "https://github.com/bradhawkins85",
"name": "Rename Tactical RMM Agent", "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.", "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", "submittedBy": "https://github.com/ThatsNASt",
"name": "Check C Drive for Bitlocker Status", "name": "Check C Drive for Bitlocker Status",
"description": "Runs a check on drive C 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", "filename": "Win_Bitlocker_Create_Status_Report.ps1",
"submittedBy": "https://github.com/ThatsNASt", "submittedBy": "https://github.com/ThatsNASt",
"name": "Create Bitlocker Status Report", "name": "Create Bitlocker Status Report",
@@ -86,13 +108,16 @@
"category": "TRMM (Win):Storage" "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", "submittedBy": "https://github.com/ThatsNASt",
"name": "Retreive Bitlocker Status Report", "name": "Retreive Bitlocker Status Report",
"description": "Retreives a 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", "filename": "Win_Bios_Check.ps1",
"submittedBy": "https://github.com/ThatsNASt", "submittedBy": "https://github.com/ThatsNASt",
"name": "Check BIOS Information", "name": "Check BIOS Information",
@@ -101,125 +126,160 @@
"category": "TRMM (Win):Hardware" "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", "submittedBy": "https://github.com/azulskyknight",
"name": "Reset High Perf Power Profile", "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.", "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", "submittedBy": "https://github.com/azulskyknight",
"name": "Set High Perf Power Profile", "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.", "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", "submittedBy": "https://github.com/RVL-Solutions and https://github.com/darimm",
"name": "Windows 10 Upgrade", "name": "Windows 10 Upgrade",
"description": "Forces an upgrade to the latest release of Windows 10.", "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", "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", "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", "submittedBy": "https://github.com/dinger1986",
"name": "Check Duplicati", "name": "Check Duplicati",
"description": "Checks Duplicati Backup is running properly over the last 24 hours", "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", "submittedBy": "https://github.com/dinger1986",
"name": "Enable Windows Defender", "name": "Enable Windows Defender",
"description": "Enables Windows Defender and sets preferences", "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", "submittedBy": "https://github.com/dinger1986",
"name": "Install SSH", "name": "Install SSH",
"description": "Installs and enabled OpenSSH Server", "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", "submittedBy": "https://github.com/dinger1986",
"name": "Enable RDP", "name": "Enable RDP",
"description": "Enables 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", "submittedBy": "https://github.com/dinger1986",
"name": "PS Speed Test", "name": "Speed Test Powershell",
"description": "Powershell speed test (win 10 or server2016+)", "description": "Speed Test with Powershell(win 10 or server2016+)",
"shell": "powershell" "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", "submittedBy": "https://github.com/dinger1986",
"name": "Sync DC Time", "name": "Sync DC Time",
"description": "Syncs time with domain controller", "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", "submittedBy": "https://github.com/dinger1986",
"name": "Clear Defender Logs", "name": "Clear Defender Logs",
"description": "Clears Windows 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", "submittedBy": "https://github.com/dinger1986",
"name": "Defender Status", "name": "Defender Status",
"description": "This will check for Malware, Antispyware, that Windows Defender is Healthy, last scan etc within the last 24 hours", "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", "submittedBy": "https://github.com/dinger1986",
"name": "Disable Fast Startup", "name": "Disable Fast Startup",
"description": "Disables Faststartup on Windows 10", "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", "submittedBy": "https://github.com/dinger1986",
"name": "TRMM Defender Exclusions", "name": "TRMM Defender Exclusions",
"description": "Windows Defender Exclusions for Tactical RMM", "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", "submittedBy": "https://github.com/bradhawkins85",
"name": "Display Message To User", "name": "Display Message To User",
"description": "Displays a popup message to the currently logged on 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", "submittedBy": "https://github.com/beejayzed",
"name": "Verify Antivirus Status", "name": "Verify Antivirus Status",
"description": "Verify and display status for all installed Antiviruses", "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", "submittedBy": "https://github.com/nr-plaxon",
"name": "Create User Logon Script", "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.", "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", "filename": "Win_Chocolatey_Update_Installed.bat",
"submittedBy": "https://github.com/silversword411", "submittedBy": "https://github.com/silversword411",
"name": "Chocolatey Update Installed Apps", "name": "Chocolatey Update Installed Apps",
@@ -228,6 +288,7 @@
"category": "TRMM (Win):3rd Party Software>Chocolatey" "category": "TRMM (Win):3rd Party Software>Chocolatey"
}, },
{ {
"guid": "fff8024d-d72e-4457-84fa-6c780f69a16f",
"filename": "Win_AD_Check_And_Enable_AD_Recycle_Bin.ps1", "filename": "Win_AD_Check_And_Enable_AD_Recycle_Bin.ps1",
"submittedBy": "https://github.com/silversword411", "submittedBy": "https://github.com/silversword411",
"name": "AD - Check and Enable AD Recycle Bin", "name": "AD - Check and Enable AD Recycle Bin",
@@ -236,7 +297,8 @@
"category": "TRMM (Win):Active Directory" "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", "submittedBy": "https://github.com/dinger1986",
"name": "Event Viewer - Check for Bluescreens", "name": "Event Viewer - Check for Bluescreens",
"description": "This will check for Bluescreen events on your system", "description": "This will check for Bluescreen events on your system",
@@ -244,6 +306,7 @@
"category": "TRMM (Win):Monitoring" "category": "TRMM (Win):Monitoring"
}, },
{ {
"guid": "5d905886-9eb1-4129-8b81-a013f842eb24",
"filename": "Win_Rename_Computer.ps1", "filename": "Win_Rename_Computer.ps1",
"submittedBy": "https://github.com/silversword411", "submittedBy": "https://github.com/silversword411",
"name": "Rename Computer", "name": "Rename Computer",
@@ -253,7 +316,8 @@
"default_timeout": 30 "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", "submittedBy": "https://github.com/tremor021",
"name": "Finish updates and restart", "name": "Finish updates and restart",
"description": "Finish installing updates and restart PC", "description": "Finish installing updates and restart PC",
@@ -261,11 +325,77 @@
"category": "TRMM (Win):Other" "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", "submittedBy": "https://github.com/tremor021",
"name": "Finish updates and shutdown", "name": "Finish updates and shutdown",
"description": "Finish installing updates and shutdown PC", "description": "Finish installing updates and shutdown PC",
"shell": "powershell", "shell": "powershell",
"category": "TRMM (Win):Other" "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"
} }
] ]

View File

@@ -87,7 +87,7 @@ class Script(BaseAuditModel):
) )
default_timeout = ( default_timeout = (
script["default_timeout"] int(script["default_timeout"])
if "default_timeout" in script.keys() if "default_timeout" in script.keys()
else 90 else 90
) )

View File

@@ -1,3 +1,4 @@
from email.policy import default
import json import json
import os import os
from pathlib import Path from pathlib import Path
@@ -206,6 +207,7 @@ class TestScriptViews(TacticalTestCase):
) as f: ) as f:
info = json.load(f) info = json.load(f)
guids = []
for script in info: for script in info:
fn: str = script["filename"] fn: str = script["filename"]
self.assertTrue(os.path.exists(os.path.join(scripts_dir, fn))) self.assertTrue(os.path.exists(os.path.join(scripts_dir, fn)))
@@ -222,6 +224,19 @@ class TestScriptViews(TacticalTestCase):
elif fn.endswith(".py"): elif fn.endswith(".py"):
self.assertEqual(script["shell"], "python") 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): def test_load_community_scripts(self):
with open( with open(
os.path.join(settings.BASE_DIR, "scripts/community_scripts.json") os.path.join(settings.BASE_DIR, "scripts/community_scripts.json")

View File

@@ -15,11 +15,11 @@ EXE_DIR = os.path.join(BASE_DIR, "tacticalrmm/private/exe")
AUTH_USER_MODEL = "accounts.User" AUTH_USER_MODEL = "accounts.User"
# latest release # latest release
TRMM_VERSION = "0.5.0" TRMM_VERSION = "0.5.2"
# bump this version everytime vue code is changed # bump this version everytime vue code is changed
# to alert user they need to manually refresh their browser # to alert user they need to manually refresh their browser
APP_VER = "0.0.126" APP_VER = "0.0.127"
# https://github.com/wh1te909/rmmagent # https://github.com/wh1te909/rmmagent
LATEST_AGENT_VER = "1.4.13" LATEST_AGENT_VER = "1.4.13"
@@ -27,16 +27,19 @@ LATEST_AGENT_VER = "1.4.13"
MESH_VER = "0.7.93" MESH_VER = "0.7.93"
# for the update script, bump when need to recreate venv or npm install # for the update script, bump when need to recreate venv or npm install
PIP_VER = "14" PIP_VER = "15"
NPM_VER = "13" NPM_VER = "14"
DL_64 = f"https://github.com/wh1te909/rmmagent/releases/download/v{LATEST_AGENT_VER}/winagent-v{LATEST_AGENT_VER}.exe" 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" DL_32 = f"https://github.com/wh1te909/rmmagent/releases/download/v{LATEST_AGENT_VER}/winagent-v{LATEST_AGENT_VER}-x86.exe"
EXE_GEN_URLS = [ EXE_GEN_URLS = [
"https://exe2.tacticalrmm.io/api/v1/exe",
"https://exe.tacticalrmm.io/api/v1/exe", "https://exe.tacticalrmm.io/api/v1/exe",
] ]
DEFAULT_AUTO_FIELD = "django.db.models.AutoField"
ASGI_APPLICATION = "tacticalrmm.asgi.application" ASGI_APPLICATION = "tacticalrmm.asgi.application"
try: try:

View File

@@ -27,7 +27,7 @@ jobs:
source env/bin/activate source env/bin/activate
cd /myagent/_work/1/s/api/tacticalrmm cd /myagent/_work/1/s/api/tacticalrmm
pip install --no-cache-dir --upgrade pip 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 pip install --no-cache-dir -r requirements.txt -r requirements-test.txt -r requirements-dev.txt
displayName: "Install Python Dependencies" displayName: "Install Python Dependencies"

View File

@@ -29,15 +29,15 @@ function check_tactical_ready {
# tactical-init # tactical-init
if [ "$1" = 'tactical-init' ]; then 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}" test -f "${TACTICAL_READY_FILE}" && rm "${TACTICAL_READY_FILE}"
# copy container data to volume # 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}/" 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 until (echo > /dev/tcp/"${POSTGRES_HOST}"/"${POSTGRES_PORT}") &> /dev/null; do
echo "waiting for postgresql container to be ready..." echo "waiting for postgresql container to be ready..."
sleep 5 sleep 5

View File

@@ -22,6 +22,7 @@ volumes:
services: services:
# postgres database for api service # postgres database for api service
tactical-postgres: tactical-postgres:
container_name: trmm-postgres
image: postgres:13-alpine image: postgres:13-alpine
restart: always restart: always
environment: environment:
@@ -35,6 +36,7 @@ services:
# redis container for celery tasks # redis container for celery tasks
tactical-redis: tactical-redis:
container_name: trmm-redis
image: redis:6.0-alpine image: redis:6.0-alpine
restart: always restart: always
networks: networks:
@@ -42,6 +44,7 @@ services:
# used to initialize the docker environment # used to initialize the docker environment
tactical-init: tactical-init:
container_name: trmm-init
image: ${IMAGE_REPO}tactical:${VERSION} image: ${IMAGE_REPO}tactical:${VERSION}
restart: on-failure restart: on-failure
command: ["tactical-init"] command: ["tactical-init"]
@@ -65,6 +68,7 @@ services:
# nats # nats
tactical-nats: tactical-nats:
container_name: trmm-nats
image: ${IMAGE_REPO}tactical-nats:${VERSION} image: ${IMAGE_REPO}tactical-nats:${VERSION}
restart: always restart: always
environment: environment:
@@ -80,6 +84,7 @@ services:
# meshcentral container # meshcentral container
tactical-meshcentral: tactical-meshcentral:
container_name: trmm-meshcentral
image: ${IMAGE_REPO}tactical-meshcentral:${VERSION} image: ${IMAGE_REPO}tactical-meshcentral:${VERSION}
restart: always restart: always
environment: environment:
@@ -101,6 +106,7 @@ services:
# mongodb container for meshcentral # mongodb container for meshcentral
tactical-mongodb: tactical-mongodb:
container_name: trmm-mongodb
image: mongo:4.4 image: mongo:4.4
restart: always restart: always
environment: environment:
@@ -114,6 +120,7 @@ services:
# container that hosts vue frontend # container that hosts vue frontend
tactical-frontend: tactical-frontend:
container_name: trmm-frontend
image: ${IMAGE_REPO}tactical-frontend:${VERSION} image: ${IMAGE_REPO}tactical-frontend:${VERSION}
restart: always restart: always
networks: networks:
@@ -123,6 +130,7 @@ services:
# container for django backend # container for django backend
tactical-backend: tactical-backend:
container_name: trmm-backend
image: ${IMAGE_REPO}tactical:${VERSION} image: ${IMAGE_REPO}tactical:${VERSION}
command: ["tactical-backend"] command: ["tactical-backend"]
restart: always restart: always
@@ -135,8 +143,9 @@ services:
depends_on: depends_on:
- tactical-postgres - tactical-postgres
# container for django backend # container for django websockets connections
tactical-websockets: tactical-websockets:
container_name: trmm-websockets
image: ${IMAGE_REPO}tactical:${VERSION} image: ${IMAGE_REPO}tactical:${VERSION}
command: ["tactical-websockets"] command: ["tactical-websockets"]
restart: always restart: always
@@ -150,8 +159,9 @@ services:
- tactical-postgres - tactical-postgres
- tactical-backend - tactical-backend
tactical-nginx:
# container for tactical reverse proxy # container for tactical reverse proxy
tactical-nginx:
container_name: trmm-nginx
image: ${IMAGE_REPO}tactical-nginx:${VERSION} image: ${IMAGE_REPO}tactical-nginx:${VERSION}
restart: always restart: always
environment: environment:
@@ -171,6 +181,7 @@ services:
# container for celery worker service # container for celery worker service
tactical-celery: tactical-celery:
container_name: trmm-celery
image: ${IMAGE_REPO}tactical:${VERSION} image: ${IMAGE_REPO}tactical:${VERSION}
command: ["tactical-celery"] command: ["tactical-celery"]
restart: always restart: always
@@ -186,6 +197,7 @@ services:
# container for celery beat service # container for celery beat service
tactical-celerybeat: tactical-celerybeat:
container_name: trmm-celerybeat
image: ${IMAGE_REPO}tactical:${VERSION} image: ${IMAGE_REPO}tactical:${VERSION}
command: ["tactical-celerybeat"] command: ["tactical-celerybeat"]
restart: always restart: always

View 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
![Image](images/installcomplete.png)
!!!Note Unlike regular installs, don't worry about the QR code
## Celebrate
![Image](images/celebrate.gif)
# 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
```

View 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)
![ForkIt](images/vscode-forkit.png)
### 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)
![Changes you've made need integration with master repo](images/trmm_contribute-notice.png)
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
![Sync Fork](images/trmm_need_sync_local_fork.png)
```
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
![Sync push/pulls](images/trmm_vscode_git_pending.png)
### 8. Verify and Repeat
Check your Github fork in browser, should be up to date now with original. Repeat 6 or 7 as necessary

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

View File

@@ -53,7 +53,7 @@ Please then copy/paste the logs and post them either in our [Discord support cha
<br/> <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. 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 ./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: Check all the systemd services that the rmm uses to function and check to make sure they're all active/running and enabled:
```bash ```bash
sudo systemctl status rmm sudo systemctl status rmm
sudo systemctl status daphne
sudo systemctl status celery sudo systemctl status celery
sudo systemctl status celerybeat sudo systemctl status celerybeat
sudo systemctl status nginx sudo systemctl status nginx

View File

@@ -23,7 +23,9 @@ nav:
- FAQ: faq.md - FAQ: faq.md
- Management Commands: management_cmds.md - Management Commands: management_cmds.md
- MeshCentral Integration: mesh_integration.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 - License: license.md
site_description: "A remote monitoring and management tool" site_description: "A remote monitoring and management tool"
site_author: "wh1te909" site_author: "wh1te909"

View File

@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
SCRIPT_VERSION="45" SCRIPT_VERSION="46"
SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/install.sh' SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/install.sh'
sudo apt install -y curl wget dirmngr gnupg lsb-release sudo apt install -y curl wget dirmngr gnupg lsb-release
@@ -359,7 +359,7 @@ python3.9 -m venv env
source /rmm/api/env/bin/activate source /rmm/api/env/bin/activate
cd /rmm/api/tacticalrmm cd /rmm/api/tacticalrmm
pip install --no-cache-dir --upgrade pip 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 pip install --no-cache-dir -r /rmm/api/tacticalrmm/requirements.txt
python manage.py migrate python manage.py migrate
python manage.py collectstatic --no-input python manage.py collectstatic --no-input

View File

@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
SCRIPT_VERSION="23" SCRIPT_VERSION="24"
SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/restore.sh' SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/restore.sh'
sudo apt update sudo apt update
@@ -291,8 +291,9 @@ python3.9 -m venv env
source /rmm/api/env/bin/activate source /rmm/api/env/bin/activate
cd /rmm/api/tacticalrmm cd /rmm/api/tacticalrmm
pip install --no-cache-dir --upgrade pip 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 pip install --no-cache-dir -r /rmm/api/tacticalrmm/requirements.txt
python manage.py migrate
python manage.py collectstatic --no-input python manage.py collectstatic --no-input
python manage.py reload_nats python manage.py reload_nats
deactivate deactivate

View File

@@ -0,0 +1 @@
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer" /v NoDriveTypeAutoRun /t REG_DWORD /d 255 /f

View File

@@ -0,0 +1 @@
reg add "hklm\SOFTWARE\Policies\Microsoft\Windows\Windows Search" /d "AllowCortana"=dword:00000000

View 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
}
}
}

View File

@@ -10,7 +10,7 @@
script leaves files that are newer than 7 days old however this variable can be edited. script leaves files that are newer than 7 days old however this variable can be edited.
.EXAMPLE .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. Save the file to your hard drive with a .PS1 extention and run the file from an elavated PowerShell prompt.
.NOTES .NOTES

View 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
}

View 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
}

View 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
}
}

View File

@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
SCRIPT_VERSION="117" SCRIPT_VERSION="118"
SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/update.sh' SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/update.sh'
LATEST_SETTINGS_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/api/tacticalrmm/tacticalrmm/settings.py' LATEST_SETTINGS_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/api/tacticalrmm/tacticalrmm/settings.py'
YELLOW='\033[1;33m' YELLOW='\033[1;33m'
@@ -256,7 +256,7 @@ if [[ "${CURRENT_PIP_VER}" != "${LATEST_PIP_VER}" ]] || [[ "$force" = true ]]; t
source /rmm/api/env/bin/activate source /rmm/api/env/bin/activate
cd /rmm/api/tacticalrmm cd /rmm/api/tacticalrmm
pip install --no-cache-dir --upgrade pip 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 pip install --no-cache-dir -r requirements.txt
else else
source /rmm/api/env/bin/activate source /rmm/api/env/bin/activate

2792
web/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -16,14 +16,14 @@
"dotenv": "^8.2.0", "dotenv": "^8.2.0",
"prismjs": "^1.22.0", "prismjs": "^1.22.0",
"qrcode.vue": "^1.7.0", "qrcode.vue": "^1.7.0",
"quasar": "^1.15.9", "quasar": "^1.15.10",
"vue-apexcharts": "^1.6.0", "vue-apexcharts": "^1.6.0",
"vue-prism-editor": "^1.2.2" "vue-prism-editor": "^1.2.2"
}, },
"devDependencies": { "devDependencies": {
"@quasar/app": "^2.2.3", "@quasar/app": "^2.2.4",
"@quasar/cli": "^1.1.3", "@quasar/cli": "^1.1.3",
"core-js": "^3.10.0", "core-js": "^3.10.1",
"eslint-plugin-cypress": "^2.11.2", "eslint-plugin-cypress": "^2.11.2",
"flush-promises": "^1.0.2", "flush-promises": "^1.0.2",
"fs-extra": "^9.1.0" "fs-extra": "^9.1.0"

View File

@@ -186,13 +186,16 @@ export default {
categories.forEach(cat => { categories.forEach(cat => {
options.push({ category: cat }); options.push({ category: cat });
let tmp = [];
scripts.forEach(script => { scripts.forEach(script => {
if (script.category === cat) { 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) { } 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);
}); });
}); });