mirror of
https://github.com/jpros/tacticalrmm-web.git
synced 2026-03-01 15:51:15 +00:00
Merge branch 'develop'
This commit is contained in:
12
package-lock.json
generated
12
package-lock.json
generated
@@ -971,9 +971,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"@quasar/extras": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@quasar/extras/-/extras-1.5.1.tgz",
|
||||
"integrity": "sha512-GfiaDvwzsQv+9Pqfk2mQ2ajC/NUNmytY0cFbuq1KuWdY5MyzGumWIN6USS4c4wDa0SBQJCEXCbgpsC15Zsytlw=="
|
||||
"version": "1.5.2",
|
||||
"resolved": "https://registry.npmjs.org/@quasar/extras/-/extras-1.5.2.tgz",
|
||||
"integrity": "sha512-4hwibnTNHM0OmZl6T3PN6CaHnVOmsCWpNwgFhJS0zMfsQ2z2s1OxObOFVDSSBuPT+sRk3iakhMLRaohNze0HYA=="
|
||||
},
|
||||
"@soda/friendly-errors-webpack-plugin": {
|
||||
"version": "1.7.1",
|
||||
@@ -8451,9 +8451,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"quasar": {
|
||||
"version": "1.8.5",
|
||||
"resolved": "https://registry.npmjs.org/quasar/-/quasar-1.8.5.tgz",
|
||||
"integrity": "sha512-iU9pitB0tEPwlJtNAJLnzIOSpolhZTPnfHBPNgLLxJSNXrgt5uQAuCcLXuG61AxRNhyrKdmsGIEMOYl/Aakv2Q=="
|
||||
"version": "1.9.3",
|
||||
"resolved": "https://registry.npmjs.org/quasar/-/quasar-1.9.3.tgz",
|
||||
"integrity": "sha512-wmxeaNYTGXBFDReJT1MkOR29thlDrNwrnMjDUXLeOwfmhZBqRl2gDCn1/7v6Ri3fvM1pjF7yUnJkhlcGrHFgmw=="
|
||||
},
|
||||
"query-string": {
|
||||
"version": "4.3.4",
|
||||
|
||||
@@ -7,10 +7,10 @@
|
||||
"build": "vue-cli-service build"
|
||||
},
|
||||
"dependencies": {
|
||||
"@quasar/extras": "^1.5.1",
|
||||
"@quasar/extras": "^1.5.2",
|
||||
"axios": "^0.19.2",
|
||||
"core-js": "^3.6.4",
|
||||
"quasar": "^1.8.5",
|
||||
"quasar": "^1.9.3",
|
||||
"vue": "^2.6.11",
|
||||
"vue-router": "^3.1.5",
|
||||
"vuex": "^3.1.2"
|
||||
|
||||
@@ -26,11 +26,12 @@
|
||||
<q-icon name="system_update_alt" size="1.5em" color="warning"><q-tooltip>Patches Pending</q-tooltip></q-icon>
|
||||
</q-th>
|
||||
</template>
|
||||
<!--
|
||||
<template v-slot:header-cell-antivirus="props">
|
||||
<q-th auto-width :props="props">
|
||||
<q-icon name="fas fa-shield-alt" size="1.2em" color="primary"><q-tooltip>Anti Virus</q-tooltip></q-icon>
|
||||
</q-th>
|
||||
</template>
|
||||
</template> -->
|
||||
<template v-slot:header-cell-agentstatus="props">
|
||||
<q-th auto-width :props="props">
|
||||
<q-icon name="fas fa-signal" size="1.2em" color="accent"><q-tooltip>Agent Status</q-tooltip></q-icon>
|
||||
@@ -48,9 +49,6 @@
|
||||
<!-- context menu -->
|
||||
<q-menu context-menu>
|
||||
<q-list dense style="min-width: 200px">
|
||||
<q-item clickable v-close-popup>
|
||||
<q-item-section>Open...</q-item-section>
|
||||
</q-item>
|
||||
<q-item clickable v-close-popup @click="showEditAgentModal = true">
|
||||
<q-item-section avatar>
|
||||
<q-icon style="font-size: 0.9rem;" name="edit" />
|
||||
@@ -190,6 +188,7 @@
|
||||
<q-tooltip>Patches Pending</q-tooltip>
|
||||
</q-icon>
|
||||
</q-td>
|
||||
<!--
|
||||
<q-td :props="props" key="antivirus">
|
||||
<q-icon v-if="props.row.antivirus !== 'n/a' && props.row.antivirus === 'windowsdefender'" name="fas fa-exclamation" color="warning">
|
||||
<q-tooltip>{{ props.row.antivirus }}</q-tooltip>
|
||||
@@ -198,7 +197,7 @@
|
||||
<q-tooltip>{{ props.row.antivirus }}</q-tooltip>
|
||||
</q-icon>
|
||||
<q-icon v-else name="fas fa-times-circle" color="negative" />
|
||||
</q-td>
|
||||
</q-td> -->
|
||||
<q-td key="agentstatus">
|
||||
<q-icon v-if="props.row.status ==='overdue'" name="fas fa-exclamation-triangle" color="negative">
|
||||
<q-tooltip>Agent overdue</q-tooltip>
|
||||
|
||||
@@ -11,10 +11,10 @@
|
||||
narrow-indicator
|
||||
no-caps
|
||||
>
|
||||
<q-tab name="summary" icon="fas fa-server" size="xs" label="Summary" />
|
||||
<q-tab name="checks" icon="computer" label="Checks" />
|
||||
<q-tab name="patches" label="Patches" />
|
||||
<q-tab name="software" label="Software" />
|
||||
<q-tab name="summary" icon="fas fa-info-circle" size="xs" label="Summary" />
|
||||
<q-tab name="checks" icon="fas fa-check-double" label="Checks" />
|
||||
<q-tab name="patches" icon="system_update" label="Patches" />
|
||||
<q-tab name="software" icon="fab fa-windows" label="Software" />
|
||||
</q-tabs>
|
||||
<q-separator />
|
||||
<q-tab-panels v-model="subtab" :animated="false">
|
||||
|
||||
@@ -1,26 +1,145 @@
|
||||
<template>
|
||||
<div v-if="Object.keys(summary).length === 0">
|
||||
No agent selected
|
||||
</div>
|
||||
<div v-else>
|
||||
{{ summary.operating_system }}
|
||||
<div v-if="Object.keys(summary).length === 0">No agent selected</div>
|
||||
<div v-else>
|
||||
<span>
|
||||
<b>{{ summary.hostname }}</b>
|
||||
• {{ summary.operating_system }} • Agent v{{ summary.version }}
|
||||
</span>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="col-4">
|
||||
<!-- left -->
|
||||
<q-list dense>
|
||||
<q-item>
|
||||
<q-item-section avatar>
|
||||
<q-icon name="fas fa-desktop" />
|
||||
</q-item-section>
|
||||
<q-item-section>{{ makeModel }}</q-item-section>
|
||||
</q-item>
|
||||
<q-item>
|
||||
<q-item-section avatar>
|
||||
<q-icon name="fas fa-microchip" />
|
||||
</q-item-section>
|
||||
<q-item-section>{{ summary.cpu_info[0].name}}</q-item-section>
|
||||
</q-item>
|
||||
<q-item>
|
||||
<q-item-section avatar>
|
||||
<q-icon name="fas fa-memory" />
|
||||
</q-item-section>
|
||||
<q-item-section>{{ summary.total_ram}} GB RAM</q-item-section>
|
||||
</q-item>
|
||||
|
||||
<!-- physical disks -->
|
||||
<q-item v-for="disk in physicalDisks" :key="disk.model">
|
||||
<q-item-section avatar>
|
||||
<q-icon name="far fa-hdd" />
|
||||
</q-item-section>
|
||||
<q-item-section>{{ disk.model }} {{ disk.size }}GB {{ disk.interfaceType }}</q-item-section>
|
||||
</q-item>
|
||||
<q-item>
|
||||
<q-item-section avatar>
|
||||
<q-icon name="fas fa-globe-americas" />
|
||||
</q-item-section>
|
||||
<q-item-section>Public IP: {{ summary.public_ip}}</q-item-section>
|
||||
</q-item>
|
||||
<q-item>
|
||||
<q-item-section avatar>
|
||||
<q-icon name="fas fa-network-wired" />
|
||||
</q-item-section>
|
||||
<q-item-section>LAN IP: {{ localIPs }}</q-item-section>
|
||||
</q-item>
|
||||
</q-list>
|
||||
</div>
|
||||
<div class="col-5"></div>
|
||||
<!-- right -->
|
||||
<div class="col-3">
|
||||
<span class="text-subtitle2 text-bold">Disks</span>
|
||||
<div v-for="disk in disks" :key="disk.device">
|
||||
<span>{{ disk.device }} ({{ disk.fstype }})</span>
|
||||
<q-linear-progress
|
||||
rounded
|
||||
size="15px"
|
||||
:value="disk.percent / 100"
|
||||
color="green"
|
||||
class="q-mt-sm"
|
||||
/>
|
||||
<span>{{ disk.free }} free of {{ disk.total }}</span>
|
||||
<hr />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import axios from 'axios';
|
||||
export default {
|
||||
name: 'SummaryTab',
|
||||
data() {
|
||||
return {
|
||||
|
||||
}
|
||||
name: "SummaryTab",
|
||||
data() {
|
||||
return {};
|
||||
},
|
||||
methods: {
|
||||
bytesToGB(bytes) {
|
||||
return Math.round(parseInt(bytes) / 1073741824);
|
||||
},
|
||||
computed: {
|
||||
summary() {
|
||||
return this.$store.state.agentSummary;
|
||||
}
|
||||
validateIPv4(ip) {
|
||||
const rx = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/;
|
||||
if (rx.test(ip)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
summary() {
|
||||
return this.$store.state.agentSummary;
|
||||
},
|
||||
disks() {
|
||||
const entries = Object.entries(this.summary.disks);
|
||||
const ret = [];
|
||||
for (let [k, v] of entries) {
|
||||
ret.push(v);
|
||||
}
|
||||
return ret;
|
||||
},
|
||||
makeModel() {
|
||||
const ret = this.summary.wmi_detail.make_model[0];
|
||||
return ret.filter(k => k.Version).map(k => k.Version)[0];
|
||||
},
|
||||
physicalDisks() {
|
||||
const ret = this.summary.wmi_detail.disk;
|
||||
const phys = [];
|
||||
ret.forEach(disk => {
|
||||
const model = disk.filter(k => k.Caption).map(k => k.Caption)[0];
|
||||
const size = disk.filter(k => k.Size).map(k => k.Size)[0];
|
||||
const interfaceType = disk
|
||||
.filter(k => k.InterfaceType)
|
||||
.map(k => k.InterfaceType)[0];
|
||||
|
||||
phys.push({
|
||||
model: model,
|
||||
size: this.bytesToGB(size),
|
||||
interfaceType: interfaceType
|
||||
});
|
||||
});
|
||||
|
||||
return phys;
|
||||
},
|
||||
localIPs() {
|
||||
const ret = this.summary.wmi_detail.network_config;
|
||||
const ips = [];
|
||||
ret.forEach(ip => {
|
||||
const x = ip.filter(k => k.IPAddress).map(k => k.IPAddress)[0];
|
||||
if (x !== undefined) {
|
||||
x.forEach(i => {
|
||||
if (this.validateIPv4(i)) {
|
||||
ips.push(i);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
return (ips.length === 1 ? ips[0] : ips.join(", "))
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
@@ -86,7 +86,7 @@ export default {
|
||||
methods: {
|
||||
getChocos() {
|
||||
axios.get("/software/chocos/").then(r => {
|
||||
this.chocos = r.data.chocos;
|
||||
this.chocos = r.data;
|
||||
});
|
||||
},
|
||||
showDescription(name) {
|
||||
|
||||
@@ -148,10 +148,10 @@ export default {
|
||||
name: "patchespending",
|
||||
align: "left"
|
||||
},
|
||||
{
|
||||
/* {
|
||||
name: "antivirus",
|
||||
align: "left"
|
||||
},
|
||||
}, */
|
||||
{
|
||||
name: "agentstatus",
|
||||
field: "status",
|
||||
@@ -177,7 +177,13 @@ export default {
|
||||
methods: {
|
||||
refreshEntireSite() {
|
||||
this.$store.dispatch("loadTree");
|
||||
this.loadAllClients();
|
||||
|
||||
if (this.allClientsActive) {
|
||||
this.loadAllClients();
|
||||
} else {
|
||||
this.loadFrame(this.selectedTree, false);
|
||||
}
|
||||
|
||||
if (this.selectedAgentPk) {
|
||||
const pk = this.selectedAgentPk;
|
||||
this.$store.dispatch("loadSummary", pk);
|
||||
@@ -186,8 +192,9 @@ export default {
|
||||
this.$store.dispatch("loadInstalledSoftware", pk);
|
||||
}
|
||||
},
|
||||
loadFrame(activenode) {
|
||||
this.$store.commit("destroySubTable");
|
||||
loadFrame(activenode, destroySub=true) {
|
||||
if (destroySub) this.$store.commit("destroySubTable");
|
||||
|
||||
let client, site, url;
|
||||
try {
|
||||
client = this.$refs.tree.meta[activenode].parent.key.split('|')[0];
|
||||
|
||||
Reference in New Issue
Block a user