Compare commits

...

13 Commits

Author SHA1 Message Date
wh1te909
4cf5f7a3cb update reqs 2022-10-18 00:20:02 +00:00
wh1te909
9729492d1c make link readable in dark mode amidaware/tacticalrmm#1314 2022-10-14 02:06:15 +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
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
10 changed files with 1259 additions and 679 deletions

1746
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -196,6 +196,14 @@
> >
<q-tooltip>Linux</q-tooltip> <q-tooltip>Linux</q-tooltip>
</q-icon> </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>
<q-td key="checks-status" :props="props"> <q-td key="checks-status" :props="props">
@@ -356,6 +364,27 @@ export default {
}, },
methods: { methods: {
filterTable(rows, terms, cols, cellValue) { 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() : ""; const lowerTerms = terms ? terms.toLowerCase() : "";
let advancedFilter = false; let advancedFilter = false;
let availability = null; let availability = null;

View File

@@ -310,9 +310,10 @@ export default {
} }
function showUpdateDetails(update) { function showUpdateDetails(update) {
const color = $q.dark.isActive ? "white" : "";
let support_urls = ""; let support_urls = "";
update.more_info_urls.forEach((u) => { update.more_info_urls.forEach((u) => {
support_urls += `<a href='${u}' target='_blank'>${u}</a><br/>`; support_urls += `<a style='color: ${color}' href='${u}' target='_blank'>${u}</a><br/>`;
}); });
let cats = update.categories.join(", "); let cats = update.categories.join(", ");
$q.dialog({ $q.dialog({

View File

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

View File

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

View File

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

View File

@@ -465,8 +465,51 @@ export default {
}); });
}, },
editAgent() { editAgent() {
delete this.agent.all_timezones; // TODO we need to fix the serializer to not send this stuff
delete this.agent.timezone; 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 // 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 // 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, "; else if (day === 0) result += "Sun, ";
} }
return result.trimRight(","); return result.trimEnd(",");
}, },
}, },
mounted() { mounted() {

View File

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

View File

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