From 1b5cf0af89cc79f19d1338ce11251fd60ca663a8 Mon Sep 17 00:00:00 2001 From: sadnub Date: Sat, 9 Oct 2021 22:52:56 -0400 Subject: [PATCH] agent per site/client permissions initial, uri updates, comp api rework --- src/App.vue | 13 +- src/api/accounts.js | 26 +- src/api/agents.js | 109 +- src/api/checks.js | 32 + src/api/clients.js | 4 +- src/api/core.js | 7 +- src/api/scripts.js | 6 +- src/api/services.js | 31 + src/api/software.js | 35 + src/api/tasks.js | 32 + src/api/winupdates.js | 22 + src/boot/axios.js | 21 +- src/components/AgentTable.vue | 86 +- src/components/AssetsTab.vue | 138 -- src/components/AutomatedTasksTab.vue | 423 ------ src/components/ChecksTab.vue | 529 -------- src/components/EventLog.vue | 134 -- src/components/FileBar.vue | 4 +- src/components/NotesTab.vue | 220 --- src/components/PermissionsManager.vue | 127 -- src/components/ProcessManager.vue | 220 --- src/components/Services.vue | 329 ----- src/components/SoftwareTab.vue | 133 -- src/components/SubTableTabs.vue | 146 +- src/components/WindowsUpdates.vue | 205 --- src/components/WmiDetail.vue | 32 - .../accounts/PermissionsManager.vue | 160 +++ src/components/accounts/RolesForm.vue | 330 +++++ src/components/agents/AssetsTab.vue | 123 ++ src/components/agents/AutomatedTasksTab.vue | 435 ++++++ src/components/agents/ChecksTab.vue | 495 +++++++ src/components/agents/HistoryTab.vue | 15 +- src/components/agents/NotesTab.vue | 225 ++++ src/components/agents/SoftwareTab.vue | 167 +++ src/components/{ => agents}/SummaryTab.vue | 115 +- src/components/agents/WinUpdateTab.vue | 276 ++++ src/components/agents/WmiDetail.vue | 36 + .../agents/remotebg/EventLogManager.vue | 140 ++ .../agents/remotebg/ProcessManager.vue | 231 ++++ .../agents/remotebg/ServicesManager.vue | 373 ++++++ .../automation/PolicyAutomatedTasksTab.vue | 4 +- src/components/automation/PolicyChecksTab.vue | 18 +- .../automation/modals/PolicyAdd.vue | 5 +- .../automation/modals/PolicyStatus.vue | 4 +- src/components/checks/CpuLoadCheck.vue | 110 ++ src/components/checks/DiskSpaceCheck.vue | 116 ++ src/components/checks/EventLogCheck.vue | 232 ++++ src/components/checks/EventLogCheckOutput.vue | 87 ++ src/components/checks/MemCheck.vue | 110 ++ src/components/checks/PingCheck.vue | 143 ++ src/components/checks/ScriptCheck.vue | 186 +++ .../{modals => }/checks/ScriptOutput.vue | 29 +- src/components/checks/WinSvcCheck.vue | 204 +++ src/components/graphs/CheckGraph.vue | 2 +- src/components/modals/admin/RolesForm.vue | 266 ---- .../modals/agents/AgentRecovery.vue | 5 +- src/components/modals/agents/EditAgent.vue | 6 +- src/components/modals/agents/InstallAgent.vue | 6 +- src/components/modals/agents/RebootLater.vue | 6 +- src/components/modals/agents/SendCommand.vue | 5 +- .../modals/alerts/AlertsOverview.vue | 2 +- src/components/modals/checks/CpuLoadCheck.vue | 134 -- .../modals/checks/DiskSpaceCheck.vue | 165 --- .../modals/checks/EventLogCheck.vue | 270 ---- .../modals/checks/EventLogCheckOutput.vue | 52 - src/components/modals/checks/MemCheck.vue | 134 -- src/components/modals/checks/PingCheck.vue | 134 -- src/components/modals/checks/ScriptCheck.vue | 213 --- src/components/modals/checks/WinSvcCheck.vue | 247 ---- .../modals/software/InstallSoftware.vue | 112 -- src/components/scripts/TestScriptModal.vue | 3 +- src/components/software/InstallSoftware.vue | 136 ++ .../{modals => }/tasks/AddAutomatedTask.vue | 8 +- .../{modals => }/tasks/EditAutomatedTask.vue | 0 src/composables/checks.js | 1174 +++++++++++++++++ src/composables/clients.js | 10 +- src/composables/scripts.js | 2 +- src/mixins/mixins.js | 2 +- src/router/routes.js | 4 +- src/store/index.js | 133 +- src/utils/format.js | 33 +- src/utils/validation.js | 37 + src/views/Dashboard.vue | 40 +- src/views/RemoteBackground.vue | 103 +- src/views/TakeControl.vue | 198 ++- 85 files changed, 6293 insertions(+), 4782 deletions(-) create mode 100644 src/api/checks.js create mode 100644 src/api/services.js create mode 100644 src/api/software.js create mode 100644 src/api/tasks.js create mode 100644 src/api/winupdates.js delete mode 100644 src/components/AssetsTab.vue delete mode 100644 src/components/AutomatedTasksTab.vue delete mode 100644 src/components/ChecksTab.vue delete mode 100644 src/components/EventLog.vue delete mode 100644 src/components/NotesTab.vue delete mode 100644 src/components/PermissionsManager.vue delete mode 100644 src/components/ProcessManager.vue delete mode 100644 src/components/Services.vue delete mode 100644 src/components/SoftwareTab.vue delete mode 100644 src/components/WindowsUpdates.vue delete mode 100644 src/components/WmiDetail.vue create mode 100644 src/components/accounts/PermissionsManager.vue create mode 100644 src/components/accounts/RolesForm.vue create mode 100644 src/components/agents/AssetsTab.vue create mode 100644 src/components/agents/AutomatedTasksTab.vue create mode 100644 src/components/agents/ChecksTab.vue create mode 100644 src/components/agents/NotesTab.vue create mode 100644 src/components/agents/SoftwareTab.vue rename src/components/{ => agents}/SummaryTab.vue (67%) create mode 100644 src/components/agents/WinUpdateTab.vue create mode 100644 src/components/agents/WmiDetail.vue create mode 100644 src/components/agents/remotebg/EventLogManager.vue create mode 100644 src/components/agents/remotebg/ProcessManager.vue create mode 100644 src/components/agents/remotebg/ServicesManager.vue create mode 100644 src/components/checks/CpuLoadCheck.vue create mode 100644 src/components/checks/DiskSpaceCheck.vue create mode 100644 src/components/checks/EventLogCheck.vue create mode 100644 src/components/checks/EventLogCheckOutput.vue create mode 100644 src/components/checks/MemCheck.vue create mode 100644 src/components/checks/PingCheck.vue create mode 100644 src/components/checks/ScriptCheck.vue rename src/components/{modals => }/checks/ScriptOutput.vue (72%) create mode 100644 src/components/checks/WinSvcCheck.vue delete mode 100644 src/components/modals/admin/RolesForm.vue delete mode 100644 src/components/modals/checks/CpuLoadCheck.vue delete mode 100644 src/components/modals/checks/DiskSpaceCheck.vue delete mode 100644 src/components/modals/checks/EventLogCheck.vue delete mode 100644 src/components/modals/checks/EventLogCheckOutput.vue delete mode 100644 src/components/modals/checks/MemCheck.vue delete mode 100644 src/components/modals/checks/PingCheck.vue delete mode 100644 src/components/modals/checks/ScriptCheck.vue delete mode 100644 src/components/modals/checks/WinSvcCheck.vue delete mode 100644 src/components/modals/software/InstallSoftware.vue create mode 100644 src/components/software/InstallSoftware.vue rename src/components/{modals => }/tasks/AddAutomatedTask.vue (96%) rename src/components/{modals => }/tasks/EditAutomatedTask.vue (100%) create mode 100644 src/composables/checks.js create mode 100644 src/utils/validation.js diff --git a/src/App.vue b/src/App.vue index 2087333..9cf7df4 100644 --- a/src/App.vue +++ b/src/App.vue @@ -9,6 +9,9 @@ export default { \ No newline at end of file diff --git a/src/api/accounts.js b/src/api/accounts.js index 1dc01fc..3ca976a 100644 --- a/src/api/accounts.js +++ b/src/api/accounts.js @@ -7,16 +7,38 @@ export async function fetchUsers(params = {}) { try { const { data } = await axios.get(`${baseUrl}/users/`, { params: params }) return data - } catch (e) { } + } catch (e) { console.error(e) } } +// role api function +export async function fetchRoles(params = {}) { + try { + const { data } = await axios.get(`${baseUrl}/roles/`, { params: params }) + return data + } catch (e) { console.error(e) } +} + +export async function removeRole(id) { + const { data } = await axios.delete(`${baseUrl}/roles/${id}/`) + return data +} + +export async function saveRole(payload) { + const { data } = await axios.post(`${baseUrl}/roles/`, payload) + return data +} + +export async function editRole(id, payload) { + const { data } = await axios.put(`${baseUrl}/roles/${id}/`, payload) + return data +} // api key api functions export async function fetchAPIKeys(params = {}) { try { const { data } = await axios.get(`${baseUrl}/apikeys/`, { params: params }) return data - } catch (e) { } + } catch (e) { console.error(e) } } export async function saveAPIKey(payload) { diff --git a/src/api/agents.js b/src/api/agents.js index 4069ceb..b161b5f 100644 --- a/src/api/agents.js +++ b/src/api/agents.js @@ -2,30 +2,115 @@ import axios from "axios" const baseUrl = "/agents" -export async function fetchAgents() { +export async function fetchAgents(params = {}) { try { - const { data } = await axios.get(`${baseUrl}/listagentsnodetail/`) + const { data } = await axios.get(`${baseUrl}/`, { params: params }) return data - } catch (e) { } + } catch (e) { + console.error(e) + } } -export async function fetchAgentHistory(pk) { +export async function fetchAgent(agent_id, params = {}) { try { - const { data } = await axios.get(`${baseUrl}/history/${pk}/`) + const { data } = await axios.get(`${baseUrl}/${agent_id}/`, { params: params }) return data - } catch (e) { } + } catch (e) { console.error(e) } } -export async function runScript(payload) { +export async function fetchAgentHistory(agent_id, params = {}) { try { - const { data } = await axios.post(`${baseUrl}/runscript/`, payload) + const { data } = await axios.get(`${baseUrl}/${agent_id}/history/`, { params: params }) return data - } catch (e) { } + } catch (e) { console.error(e) } +} + +export async function fetchAgentChecks(agent_id, params = {}) { + try { + const { data } = await axios.get(`${baseUrl}/${agent_id}/checks/`, { params: params }) + return data + } catch (e) { console.error(e) } +} + +export async function fetchAgentTasks(agent_id, params = {}) { + try { + const { data } = await axios.get(`${baseUrl}/${agent_id}/tasks/`, { params: params }) + return data + } catch (e) { console.error(e) } +} + + +export async function refreshAgentWMI(agent_id) { + const { data } = await axios.post(`${baseUrl}/${agent_id}/wmi/`) + return data +} + +export async function runScript(agent_id, payload) { + const { data } = await axios.post(`${baseUrl}/${agent_id}/runscript/`, payload) + return data } export async function runBulkAction(payload) { - - const { data } = await axios.post("/agents/bulk/", payload) + const { data } = await axios.post(`${baseUrl}/bulk/`, payload) return data +} -} \ No newline at end of file +export async function fetchAgentProcesses(agent_id, params = {}) { + try { + const { data } = await axios.get(`${baseUrl}/${agent_id}/processes/`, { params: params }) + return data + } catch (e) { + console.error(e) + } +} + +export async function killAgentProcess(agent_id, pid, params = {}) { + const { data } = await axios.delete(`${baseUrl}/${agent_id}/processes/${pid}/`, { params: params }) + return data +} + +export async function fetchAgentEventLog(agent_id, logType, days, params = {}) { + try { + const { data } = await axios.get(`${baseUrl}/${agent_id}/eventlog/${logType}/${days}/`, { params: params }) + return data + } catch (e) { + console.error(e) + } +} + +export async function fetchAgentMeshCentralURLs(agent_id, params = {}) { + try { + const { data } = await axios.get(`${baseUrl}/${agent_id}/meshcentral/`, { params: params }) + return data + } catch (e) { + console.error(e) + } +} + +export async function sendAgentRecoverMesh(agent_id, params = {}) { + const { data } = await axios.post(`${baseUrl}/${agent_id}/meshcentral/recover/`, { params: params }) + return data +} + +// agent notes +export async function fetchAgentNotes(agent_id, params = {}) { + try { + const { data } = await axios.get(`${baseUrl}/${agent_id}/notes/`, { params: params }) + return data + } catch (e) { console.error(e) } +} + +export async function saveAgentNote(payload) { + const { data } = await axios.post(`${baseUrl}/notes/`, payload) + return data +} + +export async function editAgentNote(pk, payload) { + const { data } = await axios.put(`${baseUrl}/notes/${pk}/`, payload) + return data +} + +export async function removeAgentNote(pk) { + const { data } = await axios.delete(`${baseUrl}/notes/${pk}/`) + return data +} diff --git a/src/api/checks.js b/src/api/checks.js new file mode 100644 index 0000000..ec5436a --- /dev/null +++ b/src/api/checks.js @@ -0,0 +1,32 @@ +import axios from "axios" + +const baseUrl = "/checks" + +export async function fetchChecks(params = {}) { + try { + const { data } = await axios.get(`${baseUrl}/`, { params: params }) + return data + } catch (e) { + console.error(e) + } +} + +export async function saveCheck(payload) { + const { data } = await axios.post(`${baseUrl}/`, payload) + return data +} + +export async function updateCheck(id, payload) { + const { data } = await axios.put(`${baseUrl}/${id}/`, payload) + return data +} + +export async function removeCheck(id) { + const { data } = await axios.delete(`${baseUrl}/${id}/`) + return data +} + +export async function resetCheck(id) { + const { data } = await axios.post(`${baseUrl}/${id}/reset/`) + return data +} \ No newline at end of file diff --git a/src/api/clients.js b/src/api/clients.js index a6a8ff2..04fc59c 100644 --- a/src/api/clients.js +++ b/src/api/clients.js @@ -6,12 +6,12 @@ export async function fetchClients() { try { const { data } = await axios.get(`${baseUrl}/clients/`) return data - } catch (e) { } + } catch (e) { console.error(e) } } export async function fetchSites() { try { const { data } = await axios.get(`${baseUrl}/sites/`) return data - } catch (e) { } + } catch (e) { console.error(e) } } \ No newline at end of file diff --git a/src/api/core.js b/src/api/core.js index 8bb6a56..6e61e56 100644 --- a/src/api/core.js +++ b/src/api/core.js @@ -2,7 +2,7 @@ import axios from "axios" const baseUrl = "/core" -export async function fetchCustomFields(params) { +export async function fetchCustomFields(params = {}) { try { const { data } = await axios.get(`${baseUrl}/customfields/`, { params: params }) return data @@ -12,4 +12,9 @@ export async function fetchCustomFields(params) { export async function uploadMeshAgent(payload) { const { data } = await axios.put(`${baseUrl}/uploadmesh/`, payload) return data +} + +export async function fetchDashboardInfo(params = {}) { + const { data } = await axios.get(`${baseUrl}/dashinfo/`, { params: params }) + return data } \ No newline at end of file diff --git a/src/api/scripts.js b/src/api/scripts.js index 192bdb6..62b5b70 100644 --- a/src/api/scripts.js +++ b/src/api/scripts.js @@ -10,9 +10,9 @@ export async function fetchScripts(params = {}) { } catch (e) { } } -export async function testScript(payload) { +export async function testScript(agent_id, payload) { try { - const { data } = await axios.post(`${baseUrl}/testscript/`, payload) + const { data } = await axios.post(`${baseUrl}/${agent_id}/test/`, payload) return data } catch (e) { } } @@ -34,7 +34,7 @@ export async function removeScript(id) { export async function downloadScript(id, params = {}) { try { - const { data } = await axios.get(`${baseUrl}/download/${id}/`, { params: params }) + const { data } = await axios.get(`${baseUrl}/${id}/download/`, { params: params }) return data } catch (e) { } } diff --git a/src/api/services.js b/src/api/services.js new file mode 100644 index 0000000..ddd9a04 --- /dev/null +++ b/src/api/services.js @@ -0,0 +1,31 @@ +import axios from "axios" + +const baseUrl = "/services" + +export async function getAgentServices(agent_id, params = {}) { + try { + const { data } = await axios.get(`${baseUrl}/${agent_id}/`, { params: params }) + return data + } catch (e) { + console.error(e) + } +} + +export async function getAgentServiceDetails(agent_id, svcname, params = {}) { + try { + const { data } = await axios.get(`${baseUrl}/${agent_id}/${svcname}/`, { params: params }) + return data + } catch (e) { + console.error(e) + } +} + +export async function editAgentServiceStartType(agent_id, svcname, payload) { + const { data } = await axios.put(`${baseUrl}/${agent_id}/${svcname}/`, payload) + return data +} + +export async function sendAgentServiceAction(agent_id, svcname, payload) { + const { data } = await axios.post(`${baseUrl}/${agent_id}/${svcname}/`, payload) + return data +} diff --git a/src/api/software.js b/src/api/software.js new file mode 100644 index 0000000..22c525e --- /dev/null +++ b/src/api/software.js @@ -0,0 +1,35 @@ +import axios from "axios" + +const baseUrl = "/software" + +export async function fetchChocosSoftware(params = {}) { + try { + const { data } = await axios.get(`${baseUrl}/chocos/`, { params: params }) + return data + } catch (e) { + console.error(e) + } +} + +export async function fetchAgentSoftware(agent_id, params = {}) { + try { + const { data } = await axios.get(`${baseUrl}/${agent_id}/`, { params: params }) + return data.software + } catch (e) { + console.error(e) + } +} + +export async function installAgentSoftware(agent_id, payload) { + const { data } = await axios.post(`${baseUrl}/${agent_id}/`, payload) + return data +} + +export async function refreshAgentSoftware(agent_id) { + try { + const { data } = await axios.put(`${baseUrl}/${agent_id}/`) + return data + } catch (e) { + console.error(e) + } +} \ No newline at end of file diff --git a/src/api/tasks.js b/src/api/tasks.js new file mode 100644 index 0000000..5d7eb33 --- /dev/null +++ b/src/api/tasks.js @@ -0,0 +1,32 @@ +import axios from "axios" + +const baseUrl = "/tasks" + +export async function fetchTasks(params = {}) { + try { + const { data } = await axios.get(`${baseUrl}/`, { params: params }) + return data + } catch (e) { + console.error(e) + } +} + +export async function saveTasks(payload) { + const { data } = await axios.post(`${baseUrl}/`, payload) + return data +} + +export async function updateTask(id, payload) { + const { data } = await axios.put(`${baseUrl}/${id}/`, payload) + return data +} + +export async function removeTask(id) { + const { data } = await axios.delete(`${baseUrl}/${id}/`) + return data +} + +export async function runTask(id) { + const { data } = await axios.post(`${baseUrl}/${id}/run/`) + return data +} \ No newline at end of file diff --git a/src/api/winupdates.js b/src/api/winupdates.js new file mode 100644 index 0000000..50e9734 --- /dev/null +++ b/src/api/winupdates.js @@ -0,0 +1,22 @@ +import axios from "axios" + +const baseUrl = "/winupdate" + +// win updates api functions +export async function fetchAgentUpdates(agent_id, params = {}) { + try { + const { data } = await axios.get(`${baseUrl}/${agent_id}/`, { params: params }) + return data + } catch (e) { console.error(e) } +} + +export async function runAgentUpdateScan(agent_id) { + const { data } = await axios.post(`${baseUrl}/${agent_id}/scan/`) + return data + +} + +export async function editAgentUpdate(id, payload) { + const { data } = await axios.put(`${baseUrl}/${id}/`, payload) + return data +} diff --git a/src/boot/axios.js b/src/boot/axios.js index 6cf263f..ee1e4c9 100644 --- a/src/boot/axios.js +++ b/src/boot/axios.js @@ -35,15 +35,12 @@ export default function ({ app, router, store }) { function (response) { return response; }, - function (error) { + async function (error) { let text if (!error.response) { text = error.message } - else if (error.config.url === "/checkcreds/") { - text = "Bad credentials" - } // unauthorized else if (error.response.status === 401) { router.push({ path: "/expired" }); @@ -52,9 +49,14 @@ export default function ({ app, router, store }) { else if (error.response.status === 403) { text = error.response.data.detail; } - else if (error.response.status === 400) { + // catch all for other 400 error messages + else if (error.response.status >= 400 && error.response.status < 500) { - if (error.response.data.non_field_errors) { + if (error.config.responseType === "blob") { + text = (await error.response.data.text()).replace(/^"|"$/g, '') + } + + else if (error.response.data.non_field_errors) { text = error.response.data.non_field_errors[0] } else { @@ -65,13 +67,6 @@ export default function ({ app, router, store }) { text = key + ": " + value[0] } } - - } - else if (error.response.status === 406) { - text = "Missing 64 bit meshagent.exe. Upload it from Settings > Global Settings > MeshCentral" - } - else if (error.response.status === 415) { - text = "Missing 32 bit meshagent-x86.exe. Upload it from Settings > Global Settings > MeshCentral" } if (text || error.response) { diff --git a/src/components/AgentTable.vue b/src/components/AgentTable.vue index 38febfe..c9d71aa 100644 --- a/src/components/AgentTable.vue +++ b/src/components/AgentTable.vue @@ -1,5 +1,5 @@