Compare commits

...

23 Commits

Author SHA1 Message Date
wh1te909
52ee98f6f8 Release 0.101.0 2022-09-24 02:43:53 +00:00
wh1te909
d6da8b4a96 bump version 2022-09-24 02:10:26 +00:00
wh1te909
9264cf4044 change dl command 2022-09-24 02:10:03 +00:00
wh1te909
3a45c2a309 mac agent 2022-09-23 22:58:56 +00:00
wh1te909
59de35c698 update reqs 2022-09-23 16:18:06 +00:00
wh1te909
d270b877c9 Release 0.100.9 2022-08-23 05:04:57 +00:00
wh1te909
5b8ac2c809 bump version 2022-08-23 05:04:43 +00:00
wh1te909
83d0ff1c0a bump dev ver 2022-08-22 06:08:34 +00:00
wh1te909
8a6ec6ceab add copy to clipboard for assets tab closes amidaware/tacticalrmm#1246 2022-08-17 17:42:39 +00:00
wh1te909
93dbc74e33 add more fields to search 2022-08-12 01:05:28 +00:00
wh1te909
5f2add48a9 more fuckery 2022-08-10 07:10:32 +00:00
wh1te909
b7369875af remove stuff from payload 2022-08-10 05:57:12 +00:00
wh1te909
2eb6580fed update reqs 2022-08-10 05:56:53 +00:00
wh1te909
fd8b2a1d98 Release 0.100.8 2022-08-09 20:40:48 +00:00
wh1te909
9f85fbb330 bump version 2022-08-09 20:40:39 +00:00
sadnub
ee9715a4cf fix for web for docker dev 2022-08-05 12:07:22 -04:00
wh1te909
76f330fb9c remove seconds 2022-08-05 06:54:23 +00:00
wh1te909
f518043d8d Release 0.100.7 2022-08-01 17:36:11 +00:00
wh1te909
e67c1ff331 bump version 2022-08-01 17:36:00 +00:00
wh1te909
cc2335558d Release 0.100.6 2022-07-27 06:15:49 +00:00
wh1te909
a8a171ba2c Release 0.100.5 2022-07-10 00:00:08 +00:00
wh1te909
24a63f477e Release 0.100.4 2022-07-07 16:38:14 +00:00
wh1te909
ddeb6293a1 init 2022-05-17 20:46:22 +00:00
13 changed files with 921 additions and 573 deletions

View File

@@ -0,0 +1,7 @@
COMPOSE_PROJECT_NAME=trmm
IMAGE_REPO=tacticalrmm/
VERSION=latest
# DEV SETTINGS
APP_PORT=443
DOCKER_NETWORK=172.21.0.0/24

View File

@@ -0,0 +1,26 @@
version: '3.4'
services:
app-dev:
container_name: trmm-app-dev
image: node:16-alpine
restart: always
command: /bin/sh -c "npm install --cache ~/.npm && npm run serve"
user: 1000:1000
working_dir: /workspace/web
volumes:
- ..:/workspace:cached
ports:
- "8080:443"
networks:
dev:
aliases:
- tactical-frontend
networks:
dev:
driver: bridge
ipam:
driver: default
config:
- subnet: ${DOCKER_NETWORK}

1
.gitignore vendored
View File

@@ -33,3 +33,4 @@ yarn-error.log*
*.sln
.env
/public/env-config.js

1271
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "web",
"version": "0.100.7-dev",
"version": "0.101.0",
"private": true,
"productName": "Tactical RMM",
"scripts": {
@@ -10,31 +10,31 @@
"format": "prettier --write \"**/*.{js,ts,vue,,html,md,json}\" --ignore-path .gitignore"
},
"dependencies": {
"@quasar/extras": "1.15.0",
"apexcharts": "3.35.4",
"@quasar/extras": "1.15.3",
"apexcharts": "3.35.5",
"axios": "0.27.2",
"dotenv": "16.0.1",
"dotenv": "16.0.2",
"qrcode.vue": "3.3.3",
"quasar": "2.7.5",
"vue": "3.2.37",
"quasar": "2.8.4",
"vue": "3.2.39",
"vue3-ace-editor": "2.2.2",
"vue3-apexcharts": "1.4.1",
"vuedraggable": "4.1.0",
"vue-router": "4.1.2",
"vue-router": "4.1.5",
"vuex": "4.0.2"
},
"devDependencies": {
"@quasar/cli": "^1.3.2",
"@intlify/vite-plugin-vue-i18n": "^5.0.1",
"@quasar/app-vite": "^1.0.5",
"@types/node": "^18.6.1",
"@typescript-eslint/eslint-plugin": "^5.30.5",
"@typescript-eslint/parser": "^5.30.5",
"autoprefixer": "^10.4.7",
"eslint": "^8.20.0",
"@intlify/vite-plugin-vue-i18n": "^6.0.1",
"@quasar/app-vite": "^1.1.2",
"@types/node": "^18.7.18",
"@typescript-eslint/eslint-plugin": "^5.38.0",
"@typescript-eslint/parser": "^5.38.0",
"autoprefixer": "^10.4.11",
"eslint": "^8.21.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-vue": "^8.5.0",
"prettier": "^2.7.1",
"typescript": "^4.7.4"
"typescript": "^4.8.3"
}
}
}

View File

@@ -196,6 +196,14 @@
>
<q-tooltip>Linux</q-tooltip>
</q-icon>
<q-icon
v-else-if="props.row.plat === 'darwin'"
name="mdi-apple"
size="sm"
color="primary"
>
<q-tooltip>macOS</q-tooltip>
</q-icon>
</q-td>
<q-td key="checks-status" :props="props">
@@ -356,6 +364,27 @@ export default {
},
methods: {
filterTable(rows, terms, cols, cellValue) {
const hiddenFields = [
"version",
"operating_system",
"public_ip",
"cpu_model",
"graphics",
"local_ips",
"make_model",
"physical_disks",
];
// quasar filter only does visible columns so this is a hack to add hidden columns we want to filter
for (const elem of hiddenFields) {
if (!cols.find((o) => o.name === elem)) {
cols.push({
name: elem,
field: elem,
});
}
}
const lowerTerms = terms ? terms.toLowerCase() : "";
let advancedFilter = false;
let availability = null;

View File

@@ -7,6 +7,17 @@
<q-badge color="primary" class="q-ml-sm text-caption">{{
v
}}</q-badge>
<q-btn
v-if="!!v"
size="sm"
class="q-ml-xs"
flat
round
icon="content_copy"
@click="copyValueToClip(v)"
>
<q-tooltip>Copy to Clipboard</q-tooltip>
</q-btn>
</div>
</div>
<q-separator v-if="info.length > 1" />
@@ -15,6 +26,8 @@
</template>
<script>
import { copyToClipboard } from "quasar";
import { notifySuccess } from "@/utils/notify";
// composition imports
import { computed } from "vue";
import { useStore } from "vuex";
@@ -28,9 +41,17 @@ export default {
const store = useStore();
const tabHeight = computed(() => store.state.tabHeight);
function copyValueToClip(val) {
copyToClipboard(val)
.then(() => {
notifySuccess("Copied to clipboard");
})
}
return {
tabHeight,
uid,
copyValueToClip,
};
},
};

View File

@@ -10,10 +10,13 @@
</q-card-actions>
</q-card-section>
<q-card-section>
<p class="text-subtitle1">
<p v-if="info.plat === 'windows'" class="text-subtitle1">
Download the agent then run the following command from an elevated
command prompt on the device you want to add.
</p>
<p v-else-if="info.plat === 'darwin'" class="text-subtitle1">
Run the following command from a terminal
</p>
<p>
<q-field outlined :color="$q.dark.isActive ? 'white' : 'black'">
<code>{{ info.data.cmd }}</code>
@@ -37,7 +40,7 @@
</q-badge>
<span>Do not popup any message boxes during install</span>
</div>
<div class="q-pa-xs q-gutter-xs">
<div v-if="info.plat === 'windows'" class="q-pa-xs q-gutter-xs">
<q-badge class="text-caption q-mr-xs" color="grey" text-color="black">
<code
>-local-mesh "C:\\&lt;some folder or
@@ -46,7 +49,7 @@
</q-badge>
<span> To skip downloading the Mesh Agent during the install.</span>
</div>
<div class="q-pa-xs q-gutter-xs">
<div v-if="info.plat === 'windows'" class="q-pa-xs q-gutter-xs">
<q-badge class="text-caption q-mr-xs" color="grey" text-color="black">
<code
>-meshdir "C:\Program Files\Your Company Name\Mesh Agent"</code
@@ -63,7 +66,7 @@
</q-badge>
<span>Don't install the mesh agent</span>
</div>
<div class="q-pa-xs q-gutter-xs">
<div v-if="info.plat === 'windows'" class="q-pa-xs q-gutter-xs">
<q-badge class="text-caption q-mr-xs" color="grey" text-color="black">
<code>-cert "C:\\&lt;some folder or path&gt;\\ca.pem"</code>
</q-badge>
@@ -86,12 +89,12 @@
<p class="text-italic">
Note: the auth token above will be valid for {{ info.expires }} hours.
</p>
<q-btn
<q-btn v-if="info.plat === 'windows'"
type="a"
:href="info.data.url"
color="primary"
label="Download Agent"
/>
></q-btn>
</q-card-section>
</q-card>
</template>

View File

@@ -223,6 +223,7 @@ const monTypeOptions = [
const osTypeOptions = [
{ label: "Windows", value: "windows" },
{ label: "Linux", value: "linux" },
{ label: "macOS", value: "darwin" },
{ label: "All", value: "all" },
];

View File

@@ -465,8 +465,51 @@ export default {
});
},
editAgent() {
delete this.agent.all_timezones;
delete this.agent.timezone;
// TODO we need to fix the serializer to not send this stuff
const toRemove = [
"created_by",
"created_time",
"modified_by",
"modified_time",
"all_timezones",
"timezone",
"wmi_detail",
"services",
"status",
"cpu_model",
"local_ips",
"make_model",
"physical_disks",
"graphics",
"checks",
"patches_last_installed",
"last_seen",
"applied_policies",
"effective_patch_policy",
"version",
"operating_system",
"plat",
"goarch",
"hostname",
"public_ip",
"total_ram",
"disks",
"boot_time",
"logged_in_username",
"last_logged_in_user",
"needs_reboot",
"choco_installed",
"policy",
"mesh_node_id",
"block_policy_inheritance",
"maintenance_mode",
"alert_template",
"client",
"site_name",
];
for (const elem of toRemove) {
delete this.agent[elem];
}
// only send the timezone data if it has changed
// this way django will keep the db column as null and inherit from the global setting
@@ -503,7 +546,7 @@ export default {
else if (day === 0) result += "Sun, ";
}
return result.trimRight(",");
return result.trimEnd(",");
},
},
mounted() {

View File

@@ -52,6 +52,15 @@
goarch = GOARCH_AMD64;
"
/>
<q-radio
v-model="agentOS"
val="darwin"
label="macOS"
@update:model-value="
installMethod = 'mac';
goarch = GOARCH_AMD64;
"
/>
</div>
</q-card-section>
<q-card-section>
@@ -105,37 +114,37 @@
v-model="goarch"
:val="GOARCH_AMD64"
label="64 bit"
v-show="agentOS === 'windows'"
/>
<q-radio
v-model="goarch"
:val="GOARCH_i386"
label="32 bit"
v-show="agentOS === 'windows'"
v-show="agentOS === 'windows' || agentOS === 'linux'"
/>
<q-radio
v-model="goarch"
:val="GOARCH_AMD64"
label="64 bit"
v-show="agentOS !== 'windows'"
label="Intel 64 bit"
v-show="agentOS === 'darwin'"
/>
<q-radio
v-model="goarch"
:val="GOARCH_i386"
label="32 bit"
v-show="agentOS !== 'windows'"
v-show="agentOS !== 'darwin'"
/>
<q-radio
v-model="goarch"
:val="GOARCH_ARM64"
label="ARM 64 bit"
v-show="agentOS !== 'windows'"
v-show="agentOS === 'linux'"
/>
<q-radio
v-model="goarch"
:val="GOARCH_ARM64"
label="Apple Silicon (M1, M2)"
v-show="agentOS === 'darwin'"
/>
<q-radio
v-model="goarch"
:val="GOARCH_ARM32"
label="ARM 32 bit (Rasp Pi)"
v-show="agentOS !== 'windows'"
v-show="agentOS === 'linux'"
/>
</div>
</q-card-section>
@@ -266,12 +275,13 @@ export default {
plat: this.agentOS,
};
if (this.installMethod === "manual") {
if (this.installMethod === "manual" || this.installMethod === "mac") {
this.$axios.post("/agents/installer/", data).then((r) => {
this.info = {
expires: this.expires,
data: r.data,
goarch: this.goarch,
plat: this.agentOS,
};
this.showAgentDownload = true;
});
@@ -343,6 +353,9 @@ export default {
case "bash":
text = "Download linux install script";
break;
case "mac":
text = "Show installation instructions";
break;
}
return text;

View File

@@ -37,4 +37,5 @@ export function cmdPlaceholder(shell) {
export const agentPlatformOptions = [
{ value: "windows", label: "Windows" },
{ value: "linux", label: "Linux" },
{ value: "darwin", label: "macOS" },
];

View File

@@ -285,7 +285,7 @@ export function formatDateInputField(isoDateString, noTimezone = false) {
if (noTimezone) {
isoDateString = isoDateString.replace("Z", "");
}
return date.formatDate(isoDateString, "YYYY-MM-DDTHH:mm:ss");
return date.formatDate(isoDateString, "YYYY-MM-DDTHH:mm");
}
// converts a local date string "YYYY-MM-DDTHH:mm:ss" to an iso date string with the local timezone