From b13db0304cef02e2359a152ba4602c0c2c49e749 Mon Sep 17 00:00:00 2001 From: Daniel Watts <34212312+Deenk@users.noreply.github.com> Date: Tue, 7 Apr 2026 09:32:12 +0100 Subject: [PATCH 1/8] ninjaone lcp new version --- plugins/NinjaOne/v1/cspell.json | 3 + plugins/NinjaOne/v1/custom_types.json | 30 + .../NinjaOne/v1/dataStreams/activities.json | 125 ++++ plugins/NinjaOne/v1/dataStreams/alerts.json | 131 ++++ .../v1/dataStreams/antivirusStatus.json | 102 +++ .../v1/dataStreams/antivirusThreats.json | 118 ++++ .../NinjaOne/v1/dataStreams/backupJobs.json | 191 ++++++ .../NinjaOne/v1/dataStreams/backupUsage.json | 130 ++++ .../v1/dataStreams/computerSystems.json | 102 +++ .../NinjaOne/v1/dataStreams/deviceGroups.json | 93 +++ .../NinjaOne/v1/dataStreams/deviceHealth.json | 226 +++++++ plugins/NinjaOne/v1/dataStreams/devices.json | 181 ++++++ plugins/NinjaOne/v1/dataStreams/disks.json | 127 ++++ plugins/NinjaOne/v1/dataStreams/health.json | 58 ++ plugins/NinjaOne/v1/dataStreams/jobs.json | 282 ++++++++ .../v1/dataStreams/locationDevices.json | 73 +++ .../NinjaOne/v1/dataStreams/locations.json | 87 +++ .../v1/dataStreams/loggedOnUsers.json | 77 +++ .../v1/dataStreams/networkInterfaces.json | 132 ++++ .../v1/dataStreams/operatingSystems.json | 112 ++++ .../v1/dataStreams/organizationDevices.json | 94 +++ .../v1/dataStreams/organizationLocations.json | 55 ++ .../v1/dataStreams/organizations.json | 61 ++ .../NinjaOne/v1/dataStreams/osPatches.json | 113 ++++ plugins/NinjaOne/v1/dataStreams/policies.json | 72 +++ .../v1/dataStreams/policyOverrides.json | 107 +++ .../NinjaOne/v1/dataStreams/processors.json | 117 ++++ .../v1/dataStreams/scripts/arrayCursor.js | 11 + .../v1/dataStreams/scripts/backupUsage.js | 3 + .../v1/dataStreams/scripts/devices.js | 44 ++ .../v1/dataStreams/scripts/locations.js | 9 + .../v1/dataStreams/scripts/organizations.js | 9 + .../v1/dataStreams/scripts/tickets.js | 44 ++ plugins/NinjaOne/v1/dataStreams/software.json | 76 +++ .../v1/dataStreams/softwareGlobal.json | 110 ++++ .../v1/dataStreams/softwarePatches.json | 118 ++++ plugins/NinjaOne/v1/dataStreams/tasks.json | 88 +++ .../NinjaOne/v1/dataStreams/ticketBoards.json | 78 +++ plugins/NinjaOne/v1/dataStreams/tickets.json | 160 +++++ plugins/NinjaOne/v1/dataStreams/volumes.json | 76 +++ .../v1/dataStreams/volumesGlobal.json | 120 ++++ .../v1/dataStreams/windowsServices.json | 102 +++ .../Devices/deviceDetail.dash.json | 609 ++++++++++++++++++ .../Locations/locationDetail.dash.json | 123 ++++ .../organizationDetail.dash.json | 199 ++++++ .../TicketBoards/ticketBoard.dash.json | 530 +++++++++++++++ .../v1/defaultContent/activityLog.dash.json | 402 ++++++++++++ .../defaultContent/backupManagement.dash.json | 379 +++++++++++ .../defaultContent/deviceOverview.dash.json | 478 ++++++++++++++ .../v1/defaultContent/jobsTasks.dash.json | 572 ++++++++++++++++ .../NinjaOne/v1/defaultContent/manifest.json | 48 ++ .../organizationOverview.dash.json | 439 +++++++++++++ .../defaultContent/patchManagement.dash.json | 515 +++++++++++++++ .../NinjaOne/v1/defaultContent/scopes.json | 62 ++ .../defaultContent/securityOverview.dash.json | 463 +++++++++++++ plugins/NinjaOne/v1/docs/README.md | 89 +++ plugins/NinjaOne/v1/icon.png | Bin 0 -> 4845 bytes .../NinjaOne/v1/indexDefinitions/default.json | 71 ++ plugins/NinjaOne/v1/metadata.json | 46 ++ plugins/NinjaOne/v1/ui.json | 78 +++ 60 files changed, 9150 insertions(+) create mode 100644 plugins/NinjaOne/v1/cspell.json create mode 100644 plugins/NinjaOne/v1/custom_types.json create mode 100644 plugins/NinjaOne/v1/dataStreams/activities.json create mode 100644 plugins/NinjaOne/v1/dataStreams/alerts.json create mode 100644 plugins/NinjaOne/v1/dataStreams/antivirusStatus.json create mode 100644 plugins/NinjaOne/v1/dataStreams/antivirusThreats.json create mode 100644 plugins/NinjaOne/v1/dataStreams/backupJobs.json create mode 100644 plugins/NinjaOne/v1/dataStreams/backupUsage.json create mode 100644 plugins/NinjaOne/v1/dataStreams/computerSystems.json create mode 100644 plugins/NinjaOne/v1/dataStreams/deviceGroups.json create mode 100644 plugins/NinjaOne/v1/dataStreams/deviceHealth.json create mode 100644 plugins/NinjaOne/v1/dataStreams/devices.json create mode 100644 plugins/NinjaOne/v1/dataStreams/disks.json create mode 100644 plugins/NinjaOne/v1/dataStreams/health.json create mode 100644 plugins/NinjaOne/v1/dataStreams/jobs.json create mode 100644 plugins/NinjaOne/v1/dataStreams/locationDevices.json create mode 100644 plugins/NinjaOne/v1/dataStreams/locations.json create mode 100644 plugins/NinjaOne/v1/dataStreams/loggedOnUsers.json create mode 100644 plugins/NinjaOne/v1/dataStreams/networkInterfaces.json create mode 100644 plugins/NinjaOne/v1/dataStreams/operatingSystems.json create mode 100644 plugins/NinjaOne/v1/dataStreams/organizationDevices.json create mode 100644 plugins/NinjaOne/v1/dataStreams/organizationLocations.json create mode 100644 plugins/NinjaOne/v1/dataStreams/organizations.json create mode 100644 plugins/NinjaOne/v1/dataStreams/osPatches.json create mode 100644 plugins/NinjaOne/v1/dataStreams/policies.json create mode 100644 plugins/NinjaOne/v1/dataStreams/policyOverrides.json create mode 100644 plugins/NinjaOne/v1/dataStreams/processors.json create mode 100644 plugins/NinjaOne/v1/dataStreams/scripts/arrayCursor.js create mode 100644 plugins/NinjaOne/v1/dataStreams/scripts/backupUsage.js create mode 100644 plugins/NinjaOne/v1/dataStreams/scripts/devices.js create mode 100644 plugins/NinjaOne/v1/dataStreams/scripts/locations.js create mode 100644 plugins/NinjaOne/v1/dataStreams/scripts/organizations.js create mode 100644 plugins/NinjaOne/v1/dataStreams/scripts/tickets.js create mode 100644 plugins/NinjaOne/v1/dataStreams/software.json create mode 100644 plugins/NinjaOne/v1/dataStreams/softwareGlobal.json create mode 100644 plugins/NinjaOne/v1/dataStreams/softwarePatches.json create mode 100644 plugins/NinjaOne/v1/dataStreams/tasks.json create mode 100644 plugins/NinjaOne/v1/dataStreams/ticketBoards.json create mode 100644 plugins/NinjaOne/v1/dataStreams/tickets.json create mode 100644 plugins/NinjaOne/v1/dataStreams/volumes.json create mode 100644 plugins/NinjaOne/v1/dataStreams/volumesGlobal.json create mode 100644 plugins/NinjaOne/v1/dataStreams/windowsServices.json create mode 100644 plugins/NinjaOne/v1/defaultContent/Devices/deviceDetail.dash.json create mode 100644 plugins/NinjaOne/v1/defaultContent/Locations/locationDetail.dash.json create mode 100644 plugins/NinjaOne/v1/defaultContent/Organizations/organizationDetail.dash.json create mode 100644 plugins/NinjaOne/v1/defaultContent/TicketBoards/ticketBoard.dash.json create mode 100644 plugins/NinjaOne/v1/defaultContent/activityLog.dash.json create mode 100644 plugins/NinjaOne/v1/defaultContent/backupManagement.dash.json create mode 100644 plugins/NinjaOne/v1/defaultContent/deviceOverview.dash.json create mode 100644 plugins/NinjaOne/v1/defaultContent/jobsTasks.dash.json create mode 100644 plugins/NinjaOne/v1/defaultContent/manifest.json create mode 100644 plugins/NinjaOne/v1/defaultContent/organizationOverview.dash.json create mode 100644 plugins/NinjaOne/v1/defaultContent/patchManagement.dash.json create mode 100644 plugins/NinjaOne/v1/defaultContent/scopes.json create mode 100644 plugins/NinjaOne/v1/defaultContent/securityOverview.dash.json create mode 100644 plugins/NinjaOne/v1/docs/README.md create mode 100644 plugins/NinjaOne/v1/icon.png create mode 100644 plugins/NinjaOne/v1/indexDefinitions/default.json create mode 100644 plugins/NinjaOne/v1/metadata.json create mode 100644 plugins/NinjaOne/v1/ui.json diff --git a/plugins/NinjaOne/v1/cspell.json b/plugins/NinjaOne/v1/cspell.json new file mode 100644 index 0000000..1cdfbf4 --- /dev/null +++ b/plugins/NinjaOne/v1/cspell.json @@ -0,0 +1,3 @@ +{ + "words": ["ninjarmm", "ninjaone", "bitlocker", "antivirus", "vulnerability", "vulnerabilities", "quarantined", "quarantinedthreatscount", "loggedin", "submask"] +} diff --git a/plugins/NinjaOne/v1/custom_types.json b/plugins/NinjaOne/v1/custom_types.json new file mode 100644 index 0000000..52a9cfc --- /dev/null +++ b/plugins/NinjaOne/v1/custom_types.json @@ -0,0 +1,30 @@ +[ + { + "name": "NinjaOne Organization", + "sourceType": "ninja-one", + "icon": "building", + "singular": "Organization", + "plural": "Organizations" + }, + { + "name": "NinjaOne Device", + "sourceType": "ninja-one", + "icon": "desktop", + "singular": "Device", + "plural": "Devices" + }, + { + "name": "NinjaOne Location", + "sourceType": "ninja-one", + "icon": "map-marker-alt", + "singular": "Location", + "plural": "Locations" + }, + { + "name": "NinjaOne Ticket Board", + "sourceType": "ninja-one", + "icon": "kanban", + "singular": "Ticket Board", + "plural": "Ticket Boards" + } +] diff --git a/plugins/NinjaOne/v1/dataStreams/activities.json b/plugins/NinjaOne/v1/dataStreams/activities.json new file mode 100644 index 0000000..ef5efda --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/activities.json @@ -0,0 +1,125 @@ +{ + "name": "activities", + "displayName": "Activities", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "lastActivityId" + }, + "out": { + "realm": "queryArg", + "path": "olderThan" + } + }, + "expandInnerObjects": true, + "endpointPath": "/v2/activities", + "pathToData": "activities", + "getArgs": [ + { + "key": "after", + "value": "{{timeframe.start}}" + }, + { + "key": "before", + "value": "{{timeframe.end}}" + } + ], + "headers": [] + }, + "metadata": [ + { + "name": "activityTime", + "displayName": "Activity Time", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "activity", + "displayName": "Activity", + "shape": "string", + "role": "label" + }, + { + "name": "activityId", + "displayName": "Activity ID", + "shape": "number", + "role": "id", + "visible": false + }, + { + "name": "description", + "displayName": "Description", + "shape": "string" + }, + { + "name": "activityType", + "displayName": "Activity Type", + "shape": "string" + }, + { + "name": "source", + "displayName": "Source", + "shape": "string" + }, + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "string" + }, + { + "name": "deviceName", + "displayName": "Device Name", + "shape": "string" + }, + { + "name": "organizationId", + "displayName": "Organization ID", + "shape": "string" + }, + { + "name": "organizationName", + "displayName": "Organization Name", + "shape": "string" + }, + { + "name": "userId", + "displayName": "User ID", + "shape": "string" + }, + { + "name": "userName", + "displayName": "User Name", + "shape": "string" + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear", + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/alerts.json b/plugins/NinjaOne/v1/dataStreams/alerts.json new file mode 100644 index 0000000..8402e2f --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/alerts.json @@ -0,0 +1,131 @@ +{ + "name": "alerts", + "displayName": "Alerts", + "description": "Active alerts and triggered conditions", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "/v2/alerts", + "pathToData": "", + "getArgs": [], + "headers": [] + }, + "metadata": [ + { + "name": "conditionHealthStatus", + "displayName": "Health Status", + "shape": [ + "state", + { + "map": { + "error": ["UNHEALTHY"], + "warning": ["NEEDS_ATTENTION"], + "success": ["HEALTHY"], + "unknown": ["UNKNOWN"] + } + } + ] + }, + { + "name": "uid", + "displayName": "Alert ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "sourceName", + "displayName": "Alert Name", + "shape": "string", + "role": "label" + }, + { + "name": "message", + "displayName": "Message", + "shape": "string" + }, + { + "name": "subject", + "displayName": "Subject", + "shape": "string" + }, + { + "name": "severity", + "displayName": "Severity", + "shape": "string" + }, + { + "name": "sourceType", + "displayName": "Source Type", + "shape": "string" + }, + { + "name": "createTime", + "displayName": "Created At", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "updateTime", + "displayName": "Updated At", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "device_id", + "displayName": "Device ID", + "shape": "string", + "visible": false + }, + { + "name": "device_displayName", + "displayName": "Device", + "shape": "string" + }, + { + "name": "device_organizationId", + "displayName": "Organization ID", + "shape": "string", + "visible": false + }, + { + "name": "device_references_organization_name", + "displayName": "Organization", + "shape": "string" + }, + { + "name": "device_locationId", + "displayName": "Location ID", + "shape": "string", + "visible": false + }, + { + "name": "device_references_location_name", + "displayName": "Location", + "shape": "string" + }, + { + "name": "device_offline", + "displayName": "Device Offline", + "shape": "boolean" + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/antivirusStatus.json b/plugins/NinjaOne/v1/dataStreams/antivirusStatus.json new file mode 100644 index 0000000..a1315cf --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/antivirusStatus.json @@ -0,0 +1,102 @@ +{ + "name": "antivirusStatus", + "displayName": "Antivirus Status", + "description": "Antivirus product status and definition updates", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "cursor.name" + }, + "out": { + "realm": "queryArg", + "path": "cursor" + } + }, + "expandInnerObjects": false, + "endpointPath": "/v2/queries/antivirus-status", + "pathToData": "results", + "getArgs": [ + { + "key": "ts", + "value": "{{timeframe.end}}" + } + ], + "headers": [] + }, + "metadata": [ + { + "name": "productState", + "displayName": "Product State", + "shape": [ + "state", + { + "map": { + "error": ["disabled", "off"], + "warning": ["partial"], + "success": ["enabled", "on"], + "unknown": [] + } + } + ] + }, + { + "name": "productName", + "displayName": "Product Name", + "shape": "string", + "role": "label" + }, + { + "name": "definitionStatus", + "displayName": "Definition Status", + "shape": "string" + }, + { + "name": "version", + "displayName": "Version", + "shape": "string" + }, + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "timestamp", + "displayName": "Last Updated", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear", + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/antivirusThreats.json b/plugins/NinjaOne/v1/dataStreams/antivirusThreats.json new file mode 100644 index 0000000..861860e --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/antivirusThreats.json @@ -0,0 +1,118 @@ +{ + "name": "antivirusThreats", + "displayName": "Antivirus Threats", + "description": "Detected antivirus threats with quarantine status", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "cursor.name" + }, + "out": { + "realm": "queryArg", + "path": "cursor" + } + }, + "expandInnerObjects": false, + "endpointPath": "/v2/queries/antivirus-threats", + "pathToData": "results", + "getArgs": [ + { + "key": "ts", + "value": "{{timeframe.end}}" + } + ], + "headers": [] + }, + "metadata": [ + { + "name": "status", + "displayName": "Status", + "shape": [ + "state", + { + "map": { + "error": ["active", "detected"], + "warning": ["quarantined", "remediation_failed"], + "success": ["removed", "cleaned"], + "unknown": [] + } + } + ] + }, + { + "name": "name", + "displayName": "Threat Name", + "shape": "string", + "role": "label" + }, + { + "name": "id", + "displayName": "ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "string", + "visible": false + }, + { + "name": "severity", + "displayName": "Severity", + "shape": "string" + }, + { + "name": "category", + "displayName": "Category", + "shape": "string" + }, + { + "name": "path", + "displayName": "File Path", + "shape": "string" + }, + { + "name": "detectedAt", + "displayName": "Detected At", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "actionTaken", + "displayName": "Action Taken", + "shape": "string" + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear", + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/backupJobs.json b/plugins/NinjaOne/v1/dataStreams/backupJobs.json new file mode 100644 index 0000000..03802f9 --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/backupJobs.json @@ -0,0 +1,191 @@ +{ + "name": "backupJobs", + "displayName": "Backup Jobs", + "description": "Backup job execution history and status", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "cursor.name" + }, + "out": { + "realm": "queryArg", + "path": "cursor" + } + }, + "expandInnerObjects": false, + "endpointPath": "/v2/backup/jobs", + "pathToData": "results", + "getArgs": [ + { + "key": "stf", + "value": "{{timeframe.start}}" + } + ], + "headers": [] + }, + "metadata": [ + { + "name": "jobStatus", + "displayName": "Status", + "shape": [ + "state", + { + "map": { + "error": ["FAILED", "ERROR", "CANCELLED"], + "warning": ["RUNNING", "IN_PROGRESS", "PENDING", "STARTED"], + "success": ["COMPLETED", "SUCCESS"], + "unknown": [] + } + } + ] + }, + { + "name": "planName", + "displayName": "Backup Plan", + "shape": "string", + "role": "label" + }, + { + "name": "jobId", + "displayName": "Job ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "planType", + "displayName": "Plan Type", + "shape": "string" + }, + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "string" + }, + { + "name": "organizationId", + "displayName": "Organization ID", + "shape": "string", + "visible": false + }, + { + "name": "locationId", + "displayName": "Location ID", + "shape": "string", + "visible": false + }, + { + "name": "jobStartTime", + "displayName": "Started At", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "jobEndTime", + "displayName": "Completed At", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "upsyncJob.startTime", + "displayName": "Upsync Started At", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "upsyncJob.endTime", + "displayName": "Upsync Completed At", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "sourceJobId", + "displayName": "Source Job ID", + "shape": "string", + "visible": false + }, + { + "name": "planGuid", + "displayName": "Plan GUID", + "shape": "string", + "visible": false + }, + { + "name": "destination", + "displayName": "Destination", + "shape": "string" + }, + { + "name": "totalActualStorageBytes", + "displayName": "Storage Used (Bytes)", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "totalStoredBytes", + "displayName": "Total Stored (Bytes)", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "filesUploaded", + "displayName": "Files Uploaded", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear", + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/backupUsage.json b/plugins/NinjaOne/v1/dataStreams/backupUsage.json new file mode 100644 index 0000000..4c8b402 --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/backupUsage.json @@ -0,0 +1,130 @@ +{ + "name": "backupUsage", + "displayName": "Backup Usage", + "description": "Backup storage usage by device with organization and location details", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "cursor.name" + }, + "out": { + "realm": "queryArg", + "path": "cursor" + } + }, + "expandInnerObjects": true, + "endpointPath": "/v2/queries/backup/usage", + "postRequestScript": "backupUsage.js", + "getArgs": [], + "headers": [] + }, + "matches": "none", + "rowPath": [], + "metadata": [ + { + "name": "id", + "displayName": "Device ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "organizationId", + "displayName": "Organization ID", + "shape": "string", + "visible": false + }, + { + "name": "references_organization_name", + "displayName": "Organization", + "shape": "string", + "role": "label" + }, + { + "name": "locationId", + "displayName": "Location ID", + "shape": "string", + "visible": false + }, + { + "name": "references_location_name", + "displayName": "Location", + "shape": "string" + }, + { + "name": "references_backupUsage_revisionsTotalSize", + "displayName": "Total Used (Bytes)", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "references_backupUsage_cloudTotalSize", + "displayName": "Cloud (Bytes)", + "shape": [ + "number", + { + "decimalPlaces": 1 + } + ] + }, + { + "name": "references_backupUsage_localTotalSize", + "displayName": "Local (Bytes)", + "shape": [ + "number", + { + "decimalPlaces": 1 + } + ] + }, + { + "name": "references_backupUsage_lastSuccessfulBackupJob", + "displayName": "Last Successful Backup", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "references_backupUsage_lastFailedBackupJob", + "displayName": "Last Failed Backup", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "displayName", + "displayName": "Device Name", + "shape": "string" + }, + { + "name": "offline", + "displayName": "Offline", + "shape": "boolean" + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/computerSystems.json b/plugins/NinjaOne/v1/dataStreams/computerSystems.json new file mode 100644 index 0000000..c98d23f --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/computerSystems.json @@ -0,0 +1,102 @@ +{ + "name": "computerSystems", + "displayName": "Computer Systems", + "description": "Hardware information including manufacturer, model, and serial number", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "cursor.name" + }, + "out": { + "realm": "queryArg", + "path": "cursor" + } + }, + "expandInnerObjects": false, + "endpointPath": "/v2/queries/computer-systems", + "pathToData": "results", + "getArgs": [ + { + "key": "ts", + "value": "{{timeframe.end}}" + } + ], + "headers": [] + }, + "metadata": [ + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "manufacturer", + "displayName": "Manufacturer", + "shape": "string", + "role": "label" + }, + { + "name": "model", + "displayName": "Model", + "shape": "string" + }, + { + "name": "serialNumber", + "displayName": "Serial Number", + "shape": "string" + }, + { + "name": "systemType", + "displayName": "System Type", + "shape": "string" + }, + { + "name": "totalPhysicalMemory", + "displayName": "Total Memory (Bytes)", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "domain", + "displayName": "Domain", + "shape": "string" + }, + { + "name": "workgroup", + "displayName": "Workgroup", + "shape": "string" + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear", + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/deviceGroups.json b/plugins/NinjaOne/v1/dataStreams/deviceGroups.json new file mode 100644 index 0000000..af7938c --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/deviceGroups.json @@ -0,0 +1,93 @@ +{ + "name": "deviceGroups", + "displayName": "Device Groups", + "description": "Device groups for filtering and organization", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "none" + }, + "expandInnerObjects": false, + "endpointPath": "/v2/groups", + "pathToData": "", + "getArgs": [], + "headers": [] + }, + "metadata": [ + { + "name": "name", + "displayName": "Group Name", + "shape": "string", + "role": "label" + }, + { + "name": "id", + "displayName": "Group ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "organizationId", + "displayName": "Organization ID", + "shape": "string" + }, + { + "name": "type", + "displayName": "Type", + "shape": "string" + }, + { + "name": "deviceCount", + "displayName": "Device Count", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "isDynamic", + "displayName": "Dynamic", + "shape": "boolean" + }, + { + "name": "created", + "displayName": "Created", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "lastEvaluated", + "displayName": "Last Evaluated", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "updated", + "displayName": "Updated", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/deviceHealth.json b/plugins/NinjaOne/v1/dataStreams/deviceHealth.json new file mode 100644 index 0000000..fc15b19 --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/deviceHealth.json @@ -0,0 +1,226 @@ +{ + "name": "deviceHealth", + "displayName": "Device Health", + "description": "Device health overview including threats, patches, and vulnerabilities", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "cursor.name" + }, + "out": { + "realm": "queryArg", + "path": "cursor" + } + }, + "expandInnerObjects": false, + "endpointPath": "/v2/queries/device-health", + "pathToData": "results", + "getArgs": [], + "headers": [] + }, + "metadata": [ + { + "name": "healthStatus", + "displayName": "Health Status", + "shape": [ + "state", + { + "map": { + "error": ["UNHEALTHY"], + "warning": ["NEEDS_ATTENTION"], + "success": ["HEALTHY"], + "unknown": ["UNKNOWN"] + } + } + ] + }, + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "parentDeviceId", + "displayName": "Parent Device ID", + "shape": "string", + "visible": false + }, + { + "name": "offline", + "displayName": "Offline", + "shape": "boolean" + }, + { + "name": "parentOffline", + "displayName": "Parent Offline", + "shape": "boolean" + }, + { + "name": "activeThreatsCount", + "displayName": "Active Threats", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "quarantinedThreatsCount", + "displayName": "Quarantined Threats", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "blockedThreatsCount", + "displayName": "Blocked Threats", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "alertCount", + "displayName": "Alert Count", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "activeJobCount", + "displayName": "Active Jobs", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "failedOSPatchesCount", + "displayName": "Failed OS Patches", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "pendingOSPatchesCount", + "displayName": "Pending OS Patches", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "failedSoftwarePatchesCount", + "displayName": "Failed Software Patches", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "pendingSoftwarePatchesCount", + "displayName": "Pending Software Patches", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "pendingRebootReason", + "displayName": "Pending Reboot Reason", + "shape": "string" + }, + { + "name": "avInstallStatus", + "displayName": "AV Install Status", + "shape": "string" + }, + { + "name": "installationIssuesCount", + "displayName": "Installation Issues", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "criticalVulnerabilityCount", + "displayName": "Critical Vulnerabilities", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "highVulnerabilityCount", + "displayName": "High Vulnerabilities", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "mediumVulnerabilityCount", + "displayName": "Medium Vulnerabilities", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "lowVulnerabilityCount", + "displayName": "Low Vulnerabilities", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/devices.json b/plugins/NinjaOne/v1/dataStreams/devices.json new file mode 100644 index 0000000..ca3a78f --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/devices.json @@ -0,0 +1,181 @@ +{ + "name": "devices", + "displayName": "Devices", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "metadata.next_page_token" + }, + "out": { + "realm": "queryArg", + "path": "after" + } + }, + "expandInnerObjects": true, + "endpointPath": "/v2/devices", + "postRequestScript": "devices.js", + "pathToData": "", + "getArgs": [], + "headers": [] + }, + "metadata": [ + { + "name": "id", + "displayName": "Device ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "displayName", + "displayName": "Device Name", + "shape": "string", + "role": "label" + }, + { + "name": "created", + "displayName": "Created", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "lastContact", + "displayName": "Last Contact", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "lastUpdate", + "displayName": "Last Update", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "maintenance.start", + "displayName": "Maintenance Start", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "maintenance.end", + "displayName": "Maintenance End", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "references.backupUsage.lastSuccessfulBackupJob", + "displayName": "Last Successful Backup", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "references.backupUsage.lastFailedBackupJob", + "displayName": "Last Failed Backup", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "references.policy.updated", + "displayName": "Policy Updated", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "references.role.created", + "displayName": "Role Created", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "references.rolePolicy.updated", + "displayName": "Role Policy Updated", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "references.warranty.startDate", + "displayName": "Warranty Start", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "references.warranty.endDate", + "displayName": "Warranty End", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "references.warranty.manufacturerFulfillmentDate", + "displayName": "Manufacturer Fulfillment Date", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "none" + ] +} \ No newline at end of file diff --git a/plugins/NinjaOne/v1/dataStreams/disks.json b/plugins/NinjaOne/v1/dataStreams/disks.json new file mode 100644 index 0000000..da92773 --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/disks.json @@ -0,0 +1,127 @@ +{ + "name": "disks", + "displayName": "Disks", + "description": "Physical disk inventory with SMART status", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "cursor.name" + }, + "out": { + "realm": "queryArg", + "path": "cursor" + } + }, + "expandInnerObjects": false, + "endpointPath": "/v2/queries/disks", + "pathToData": "results", + "getArgs": [ + { + "key": "ts", + "value": "{{timeframe.end}}" + } + ], + "headers": [] + }, + "metadata": [ + { + "name": "status", + "displayName": "Status", + "shape": [ + "state", + { + "map": { + "error": ["error", "failed", "pred fail"], + "success": ["ok"], + "warning": ["warning"], + "unknown": [] + } + } + ] + }, + { + "name": "name", + "displayName": "Disk Name", + "shape": "string", + "role": "label" + }, + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "model", + "displayName": "Model", + "shape": "string" + }, + { + "name": "manufacturer", + "displayName": "Manufacturer", + "shape": "string" + }, + { + "name": "mediaType", + "displayName": "Media Type", + "shape": "string" + }, + { + "name": "size", + "displayName": "Size (Bytes)", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "interfaceType", + "displayName": "Interface", + "shape": "string" + }, + { + "name": "smartCapable", + "displayName": "SMART Capable", + "shape": "boolean" + }, + { + "name": "partitionCount", + "displayName": "Partition Count", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear", + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/health.json b/plugins/NinjaOne/v1/dataStreams/health.json new file mode 100644 index 0000000..c4d756a --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/health.json @@ -0,0 +1,58 @@ +{ + "name": "health", + "displayName": "Health", + "description": "Device health status", + "baseDataSourceName": "httpRequestScoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "/v2/queries/device-health", + "pathToData": "results", + "getArgs": [ + { + "name": "df", + "value": "deviceId = {{objects[0].deviceId}}" + } + ], + "headers": [] + }, + "matches": { + "sourceType": { + "type": "oneOf", + "values": ["NinjaOne Device"] + } + }, + "metadata": [ + { + "name": "healthStatus", + "displayName": "Health Status", + "shape": [ + "state", + { + "map": { + "error": ["UNHEALTHY"], + "warning": ["NEEDS_ATTENTION"], + "success": ["HEALTHY"], + "unknown": ["UNKNOWN"] + } + } + ] + }, + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "none" + ] +} \ No newline at end of file diff --git a/plugins/NinjaOne/v1/dataStreams/jobs.json b/plugins/NinjaOne/v1/dataStreams/jobs.json new file mode 100644 index 0000000..3cc3157 --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/jobs.json @@ -0,0 +1,282 @@ +{ + "name": "jobs", + "displayName": "Jobs", + "description": "Script and patch job execution status", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "/v2/jobs", + "pathToData": "", + "getArgs": [], + "headers": [] + }, + "metadata": [ + { + "name": "status", + "displayName": "Status", + "shape": [ + "state", + { + "map": { + "error": ["failed", "error"], + "warning": ["running", "in_progress", "pending"], + "success": ["completed", "success"], + "unknown": [] + } + } + ] + }, + { + "name": "name", + "displayName": "Job Name", + "shape": "string", + "role": "label" + }, + { + "name": "uid", + "displayName": "Job ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "message", + "displayName": "Message", + "shape": "string" + }, + { + "name": "sourceType", + "displayName": "Source Type", + "shape": "string" + }, + { + "name": "sourceConfigUid", + "displayName": "Source Config UID", + "shape": "string", + "visible": false + }, + { + "name": "sourceName", + "displayName": "Source Name", + "shape": "string" + }, + { + "name": "subject", + "displayName": "Subject", + "shape": "string" + }, + { + "name": "userId", + "displayName": "User ID", + "shape": "string", + "visible": false + }, + { + "name": "psaTicketId", + "displayName": "PSA Ticket ID", + "shape": "string", + "visible": false + }, + { + "name": "ticketTemplateId", + "displayName": "Ticket Template ID", + "shape": "string", + "visible": false + }, + { + "name": "jobStatus", + "displayName": "Job Status", + "shape": "string" + }, + { + "name": "jobResult", + "displayName": "Job Result", + "shape": "string" + }, + { + "name": "jobType", + "displayName": "Job Type", + "shape": "string" + }, + { + "name": "type", + "displayName": "Type", + "shape": "string" + }, + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "number" + }, + { + "name": "organizationId", + "displayName": "Organization ID", + "shape": "number" + }, + { + "name": "createTime", + "displayName": "Created", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "updateTime", + "displayName": "Updated", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "device_created", + "displayName": "Device Created", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "device_lastContact", + "displayName": "Device Last Contact", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "device_lastUpdate", + "displayName": "Device Last Update", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "device_maintenance_start", + "displayName": "Device Maintenance Start", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "device_maintenance_end", + "displayName": "Device Maintenance End", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "device_references_rolePolicy_updated", + "displayName": "Device Role Policy Updated", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "device_references_policy_updated", + "displayName": "Device Policy Updated", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "device_references_role_created", + "displayName": "Device Role Created", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "device_references_backupUsage_lastSuccessfulBackupJob", + "displayName": "Device Last Successful Backup", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "device_references_backupUsage_lastFailedBackupJob", + "displayName": "Device Last Failed Backup", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "device_references_warranty_startDate", + "displayName": "Device Warranty Start", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "device_references_warranty_endDate", + "displayName": "Device Warranty End", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "device_references_warranty_manufacturerFulfillmentDate", + "displayName": "Device Manufacturer Fulfillment Date", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "duration", + "displayName": "Duration", + "shape": "seconds" + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/locationDevices.json b/plugins/NinjaOne/v1/dataStreams/locationDevices.json new file mode 100644 index 0000000..bdce174 --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/locationDevices.json @@ -0,0 +1,73 @@ +{ + "name": "locationDevices", + "displayName": "Location Devices", + "description": "Devices for a specific location", + "baseDataSourceName": "httpRequestScoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "metadata.next_page_token" + }, + "out": { + "realm": "queryArg", + "path": "after" + } + }, + "expandInnerObjects": true, + "endpointPath": "/v2/devices", + "postRequestScript": "devices.js", + "pathToData": "", + "getArgs": [ + { + "name": "df", + "value": "locationId={{objects[0].locationId}}" + } + ], + "headers": [] + }, + "matches": { + "sourceType": { + "type": "oneOf", + "values": ["NinjaOne Location"] + } + }, + "metadata": [ + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "displayName", + "displayName": "Device Name", + "shape": "string", + "role": "label" + }, + { + "name": "lastContact", + "displayName": "Last Contact", + "shape": "date" + }, + { + "name": "lastUpdate", + "displayName": "Last Update", + "shape": "date" + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "none" + ] +} \ No newline at end of file diff --git a/plugins/NinjaOne/v1/dataStreams/locations.json b/plugins/NinjaOne/v1/dataStreams/locations.json new file mode 100644 index 0000000..d6e2ea7 --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/locations.json @@ -0,0 +1,87 @@ +{ + "name": "locations", + "displayName": "Locations", + "description": "Organization locations and sites", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "metadata.next_page_token" + }, + "out": { + "realm": "queryArg", + "path": "after" + } + }, + "expandInnerObjects": true, + "endpointPath": "/v2/locations", + "postRequestScript": "locations.js", + "pathToData": "", + "getArgs": [], + "headers": [] + }, + "metadata": [ + { + "name": "name", + "displayName": "Location Name", + "shape": "string", + "role": "label" + }, + { + "name": "id", + "displayName": "Location ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "organizationId", + "displayName": "Organization ID", + "shape": "string" + }, + { + "name": "organizationName", + "displayName": "Organization", + "shape": "string" + }, + { + "name": "description", + "displayName": "Description", + "shape": "string" + }, + { + "name": "address", + "displayName": "Address", + "shape": "string" + }, + { + "name": "city", + "displayName": "City", + "shape": "string" + }, + { + "name": "country", + "displayName": "Country", + "shape": "string" + }, + { + "name": "timezone", + "displayName": "Timezone", + "shape": "string" + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/loggedOnUsers.json b/plugins/NinjaOne/v1/dataStreams/loggedOnUsers.json new file mode 100644 index 0000000..47e26a1 --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/loggedOnUsers.json @@ -0,0 +1,77 @@ +{ + "name": "loggedOnUsers", + "displayName": "Logged On Users", + "description": "Last logged-on user activity", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "cursor.name" + }, + "out": { + "realm": "queryArg", + "path": "cursor" + } + }, + "expandInnerObjects": false, + "endpointPath": "/v2/queries/logged-on-users", + "pathToData": "results", + "getArgs": [ + { + "key": "ts", + "value": "{{timeframe.end}}" + } + ], + "headers": [] + }, + "metadata": [ + { + "name": "userName", + "displayName": "User Name", + "shape": "string", + "role": "label" + }, + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "logonTime", + "displayName": "Logon Time", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear", + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/networkInterfaces.json b/plugins/NinjaOne/v1/dataStreams/networkInterfaces.json new file mode 100644 index 0000000..a1d25fd --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/networkInterfaces.json @@ -0,0 +1,132 @@ +{ + "name": "networkInterfaces", + "displayName": "Network Interfaces", + "description": "Network adapters with IP, MAC, and link speed", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "cursor.name" + }, + "out": { + "realm": "queryArg", + "path": "cursor" + } + }, + "expandInnerObjects": true, + "endpointPath": "/v2/queries/network-interfaces", + "pathToData": "results", + "getArgs": [ + { + "key": "ts", + "value": "{{timeframe.end}}" + } + ], + "headers": [] + }, + "metadata": [ + { + "name": "status", + "displayName": "Status", + "shape": [ + "state", + { + "map": { + "error": ["down", "disabled"], + "success": ["up", "connected"], + "warning": ["degraded"], + "unknown": [] + } + } + ] + }, + { + "name": "interfaceName", + "displayName": "Interface Name", + "shape": "string", + "role": "label" + }, + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "adapterName", + "displayName": "Adapter Name", + "shape": "string" + }, + { + "name": "ipAddress", + "displayName": "IP Address", + "shape": "string" + }, + { + "name": "macAddress", + "displayName": "MAC Address", + "shape": "string" + }, + { + "name": "subnetMask", + "displayName": "Subnet Mask", + "shape": "string" + }, + { + "name": "defaultGateway", + "displayName": "Default Gateway", + "shape": "string" + }, + { + "name": "linkSpeed", + "displayName": "Link Speed", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "interfaceType", + "displayName": "Interface Type", + "shape": "string" + }, + { + "name": "mtu", + "displayName": "MTU", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear", + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/operatingSystems.json b/plugins/NinjaOne/v1/dataStreams/operatingSystems.json new file mode 100644 index 0000000..f25f18e --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/operatingSystems.json @@ -0,0 +1,112 @@ +{ + "name": "operatingSystems", + "displayName": "Operating Systems", + "description": "OS details with reboot requirements", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "cursor.name" + }, + "out": { + "realm": "queryArg", + "path": "cursor" + } + }, + "expandInnerObjects": false, + "endpointPath": "/v2/queries/operating-systems", + "pathToData": "results", + "getArgs": [ + { + "key": "ts", + "value": "{{timeframe.end}}" + } + ], + "headers": [] + }, + "metadata": [ + { + "name": "needsReboot", + "displayName": "Needs Reboot", + "shape": [ + "state", + { + "map": { + "error": ["true"], + "success": ["false"], + "warning": [], + "unknown": [] + } + } + ] + }, + { + "name": "name", + "displayName": "OS Name", + "shape": "string", + "role": "label" + }, + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "manufacturer", + "displayName": "Manufacturer", + "shape": "string" + }, + { + "name": "architecture", + "displayName": "Architecture", + "shape": "string" + }, + { + "name": "buildNumber", + "displayName": "Build Number", + "shape": "string" + }, + { + "name": "releaseId", + "displayName": "Release ID", + "shape": "string" + }, + { + "name": "lastBootTime", + "displayName": "Last Boot Time", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear", + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/organizationDevices.json b/plugins/NinjaOne/v1/dataStreams/organizationDevices.json new file mode 100644 index 0000000..bfb2e0b --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/organizationDevices.json @@ -0,0 +1,94 @@ +{ + "name": "organizationDevices", + "displayName": "Organization Devices", + "description": "Devices for a specific organization", + "baseDataSourceName": "httpRequestScoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "next_page_token" + }, + "out": { + "realm": "queryArg", + "path": "after" + } + }, + "expandInnerObjects": true, + "endpointPath": "/v2/organization/{{objects[0].organizationId}}/devices", + "preRequestScript": "arrayCursor.js", + "postRequestScript": "devices.js", + "pathToData": "results", + "getArgs": [], + "headers": [] + }, + "matches": { + "sourceType": { + "type": "oneOf", + "values": ["NinjaOne Organization"] + } + }, + "metadata": [ + { + "name": "displayName", + "displayName": "Device Name", + "shape": "string", + "role": "label" + }, + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "systemName", + "displayName": "System Name", + "shape": "string" + }, + { + "name": "lastContact", + "displayName": "Last Contact", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "lastUpdate", + "displayName": "Last Update", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "organizationId", + "displayName": "Organization ID", + "shape": "string" + }, + { + "name": "locationId", + "displayName": "Location ID", + "shape": "string" + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/organizationLocations.json b/plugins/NinjaOne/v1/dataStreams/organizationLocations.json new file mode 100644 index 0000000..d09b047 --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/organizationLocations.json @@ -0,0 +1,55 @@ +{ + "name": "organizationLocations", + "displayName": "Organization Locations", + "description": "Locations for a specific organization", + "baseDataSourceName": "httpRequestScoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "/v2/organization/{{objects[0].organizationId}}/locations", + "postRequestScript": "locations.js", + "pathToData": "", + "getArgs": [], + "headers": [] + }, + "matches": { + "sourceType": { + "type": "oneOf", + "values": ["NinjaOne Organization"] + } + }, + "metadata": [ + { + "name": "name", + "displayName": "Location Name", + "shape": "string", + "role": "label" + }, + { + "name": "locationId", + "displayName": "Location ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "description", + "displayName": "Description", + "shape": "string" + }, + { + "name": "address", + "displayName": "Address", + "shape": "string" + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/organizations.json b/plugins/NinjaOne/v1/dataStreams/organizations.json new file mode 100644 index 0000000..c6ae3fb --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/organizations.json @@ -0,0 +1,61 @@ +{ + "name": "organizations", + "displayName": "Organizations", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "metadata.next_page_token" + }, + "out": { + "realm": "queryArg", + "path": "after" + } + }, + "expandInnerObjects": true, + "endpointPath": "/v2/organizations", + "postRequestScript": "organizations.js", + "pathToData": "", + "getArgs": [], + "headers": [] + }, + "metadata": [ + { + "name": "name", + "displayName": "Organization Name", + "shape": "string", + "role": "label" + }, + { + "name": "id", + "displayName": "Organization ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "description", + "displayName": "Description", + "shape": "string" + }, + { + "name": "nodeApprovalMode", + "displayName": "Node Approval Mode", + "shape": "string" + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/osPatches.json b/plugins/NinjaOne/v1/dataStreams/osPatches.json new file mode 100644 index 0000000..abb7f9d --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/osPatches.json @@ -0,0 +1,113 @@ +{ + "name": "osPatches", + "displayName": "OS Patches", + "description": "OS patch compliance status including pending, failed, and installed patches", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "cursor.name" + }, + "out": { + "realm": "queryArg", + "path": "cursor" + } + }, + "expandInnerObjects": false, + "endpointPath": "/v2/queries/os-patches", + "pathToData": "results", + "getArgs": [ + { + "key": "ts", + "value": "{{timeframe.end}}" + } + ], + "headers": [] + }, + "metadata": [ + { + "name": "status", + "displayName": "Status", + "shape": [ + "state", + { + "map": { + "error": ["failed", "rejected"], + "warning": ["pending"], + "success": ["installed"], + "unknown": [] + } + } + ] + }, + { + "name": "name", + "displayName": "Patch Name", + "shape": "string", + "role": "label" + }, + { + "name": "id", + "displayName": "ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "severity", + "displayName": "Severity", + "shape": "string" + }, + { + "name": "type", + "displayName": "Type", + "shape": "string" + }, + { + "name": "kbNumber", + "displayName": "KB Number", + "shape": "string" + }, + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "string", + "visible": false + }, + { + "name": "installedAt", + "displayName": "Installed At", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear", + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/policies.json b/plugins/NinjaOne/v1/dataStreams/policies.json new file mode 100644 index 0000000..91ecc22 --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/policies.json @@ -0,0 +1,72 @@ +{ + "name": "policies", + "displayName": "Policies", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "none" + }, + "expandInnerObjects": false, + "endpointPath": "/v2/policies", + "pathToData": "", + "getArgs": [], + "headers": [] + }, + "metadata": [ + { + "name": "name", + "displayName": "Policy Name", + "shape": "string", + "role": "label" + }, + { + "name": "id", + "displayName": "Policy ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "description", + "displayName": "Description", + "shape": "string" + }, + { + "name": "organizationId", + "displayName": "Organization ID", + "shape": "string" + }, + { + "name": "enabled", + "displayName": "Enabled", + "shape": "boolean" + }, + { + "name": "created", + "displayName": "Created At", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "updated", + "displayName": "Updated At", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/policyOverrides.json b/plugins/NinjaOne/v1/dataStreams/policyOverrides.json new file mode 100644 index 0000000..5250a84 --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/policyOverrides.json @@ -0,0 +1,107 @@ +{ + "name": "policyOverrides", + "displayName": "Policy Overrides", + "description": "Device policy exceptions and overrides", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "cursor.name" + }, + "out": { + "realm": "queryArg", + "path": "cursor" + } + }, + "expandInnerObjects": true, + "endpointPath": "/v2/queries/policy-overrides", + "pathToData": "results", + "getArgs": [ + { + "key": "ts", + "value": "{{timeframe.end}}" + } + ], + "headers": [] + }, + "metadata": [ + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "policyId", + "displayName": "Policy ID", + "shape": "string" + }, + { + "name": "policyName", + "displayName": "Policy Name", + "shape": "string", + "role": "label" + }, + { + "name": "conditionType", + "displayName": "Condition Type", + "shape": "string" + }, + { + "name": "conditionId", + "displayName": "Condition ID", + "shape": "string" + }, + { + "name": "enabled", + "displayName": "Enabled", + "shape": "boolean" + }, + { + "name": "createdAt", + "displayName": "Created At", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "updatedAt", + "displayName": "Updated At", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear", + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/processors.json b/plugins/NinjaOne/v1/dataStreams/processors.json new file mode 100644 index 0000000..479ca0e --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/processors.json @@ -0,0 +1,117 @@ +{ + "name": "processors", + "displayName": "Processors", + "description": "CPU information and specifications", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "cursor.name" + }, + "out": { + "realm": "queryArg", + "path": "cursor" + } + }, + "expandInnerObjects": false, + "endpointPath": "/v2/queries/processors", + "pathToData": "results", + "getArgs": [ + { + "key": "ts", + "value": "{{timeframe.end}}" + } + ], + "headers": [] + }, + "metadata": [ + { + "name": "name", + "displayName": "Processor Name", + "shape": "string", + "role": "label" + }, + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "manufacturer", + "displayName": "Manufacturer", + "shape": "string" + }, + { + "name": "architecture", + "displayName": "Architecture", + "shape": "string" + }, + { + "name": "numCores", + "displayName": "Cores", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "numLogicalCores", + "displayName": "Logical Cores", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "maxClockSpeed", + "displayName": "Max Clock Speed (MHz)", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "clockSpeed", + "displayName": "Current Clock Speed (MHz)", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear", + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/scripts/arrayCursor.js b/plugins/NinjaOne/v1/dataStreams/scripts/arrayCursor.js new file mode 100644 index 0000000..d8e5e8a --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/scripts/arrayCursor.js @@ -0,0 +1,11 @@ +/** + * Generic script to handle pagination for NinjaOne array-based endpoints. + * + * It takes the flat response array AND converts it into a "results" array + * alongside a "next_page_token" which is the ID of the last element. + */ +const items = Array.isArray(data) ? data : []; +result = { + results: items, + next_page_token: items.length > 0 ? items[items.length - 1].id : null +}; diff --git a/plugins/NinjaOne/v1/dataStreams/scripts/backupUsage.js b/plugins/NinjaOne/v1/dataStreams/scripts/backupUsage.js new file mode 100644 index 0000000..0cc5bde --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/scripts/backupUsage.js @@ -0,0 +1,3 @@ +// Handle NinjaOne paged response for backup usage +const items = (data && data.results ? data.results : []); +result = items.map(item => ({ ...item, id: item.id ? item.id.toString() : null })); diff --git a/plugins/NinjaOne/v1/dataStreams/scripts/devices.js b/plugins/NinjaOne/v1/dataStreams/scripts/devices.js new file mode 100644 index 0000000..c780ab5 --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/scripts/devices.js @@ -0,0 +1,44 @@ +// Handle NinjaOne array or paged response and convert numeric IDs to strings for SquaredUp compatibility +const items = (data && data.results ? data.results : (Array.isArray(data) ? data : [])); + +/** + * Recursively converts NinjaOne Unix timestamps (seconds) to ISO strings. + * NinjaOne typically returns timestamps as floats/integers in seconds. + * SquaredUp's date shape/JS Date expects milliseconds or ISO strings. + * @param {any} obj + * @returns {any} + */ +const convertTimestamps = (obj) => { + if (!obj || typeof obj !== 'object') return obj; + for (const key in obj) { + const val = obj[key]; + if (typeof val === 'number') { + // Heuristic: check if key name suggests a timestamp and value is in seconds range (1e9 to 1e10) + const lowerKey = key.toLowerCase(); + if (lowerKey.includes('time') || lowerKey.includes('date') || lowerKey.includes('contact') || lowerKey.includes('update') || lowerKey.includes('start') || lowerKey.includes('end')) { + if (val > 1000000000 && val < 10000000000) { + obj[key] = new Date(val * 1000).toISOString(); + } + } + } else if (typeof val === 'object' && val !== null) { + convertTimestamps(val); + } + } + return obj; +}; + +result = items.map(item => { + // Recursively convert timestamps in the item (modifies in place but we are mapping to a new object) + const converted = convertTimestamps(item); + + return { + ...converted, + deviceId: converted.id ? converted.id.toString() : null, + id: converted.id ? converted.id.toString() : null, + // Ensure displayName is present for the import engine (maps to systemName if missing) + displayName: converted.displayName || converted.systemName || converted.dnsName || (converted.id ? `Device ${converted.id}` : 'Unknown Device'), + // Add organizationId and locationId as strings if they are there + organizationId: converted.organizationId ? converted.organizationId.toString() : null, + locationId: converted.locationId ? converted.locationId.toString() : null + }; +}); diff --git a/plugins/NinjaOne/v1/dataStreams/scripts/locations.js b/plugins/NinjaOne/v1/dataStreams/scripts/locations.js new file mode 100644 index 0000000..53b5356 --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/scripts/locations.js @@ -0,0 +1,9 @@ +// Handle NinjaOne array or paged response and convert numeric IDs to strings for SquaredUp compatibility +const items = (data && data.results ? data.results : (Array.isArray(data) ? data : [])); +result = items.map(item => ({ + ...item, + locationId: item.id ? item.id.toString() : null, + id: item.id ? item.id.toString() : null, + // Add organizationId as string if it's there + organizationId: item.organizationId ? item.organizationId.toString() : null +})); diff --git a/plugins/NinjaOne/v1/dataStreams/scripts/organizations.js b/plugins/NinjaOne/v1/dataStreams/scripts/organizations.js new file mode 100644 index 0000000..e40f439 --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/scripts/organizations.js @@ -0,0 +1,9 @@ +// Handle NinjaOne array or paged response and convert numeric IDs to strings for SquaredUp compatibility +const items = (data && data.results ? data.results : (Array.isArray(data) ? data : [])); +result = items.map(item => ({ + ...item, + id: item.id ? item.id.toString() : null, + organizationId: item.id ? item.id.toString() : null, + // Add parent.id for scoped child requests (LCP convention) + 'parent.id': item.id ? item.id.toString() : null +})); diff --git a/plugins/NinjaOne/v1/dataStreams/scripts/tickets.js b/plugins/NinjaOne/v1/dataStreams/scripts/tickets.js new file mode 100644 index 0000000..913a71c --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/scripts/tickets.js @@ -0,0 +1,44 @@ +// Process NinjaOne ticketing board data +const items = (data && data.data ? data.data : (Array.isArray(data) ? data : [])); + +/** + * Recursively converts NinjaOne Unix timestamps (seconds) to ISO strings. + * @param {any} obj + * @returns {any} + */ +const convertTimestamps = (obj) => { + if (!obj || typeof obj !== 'object') return obj; + for (const key in obj) { + const val = obj[key]; + if (typeof val === 'number') { + const lowerKey = key.toLowerCase(); + // NinjaOne ticketing uses createdAt, updatedAt, closedAt, etc. + if (lowerKey.includes('time') || lowerKey.includes('date') || lowerKey.includes('at')) { + if (val > 1000000000 && val < 10000000000) { + obj[key] = new Date(val * 1000).toISOString(); + } + } + } else if (typeof val === 'object' && val !== null) { + convertTimestamps(val); + } + } + return obj; +}; + +result = items.map(item => { + const converted = convertTimestamps(item); + + return { + ...converted, + // Normalize IDs as strings for SquaredUp correlation + id: converted.id ? converted.id.toString() : null, + organizationId: (converted.organizationId || converted.clientId) ? (converted.organizationId || converted.clientId).toString() : null, + deviceId: (converted.deviceId || converted.nodeId) ? (converted.deviceId || converted.nodeId).toString() : null, + boardId: converted.boardId ? converted.boardId.toString() : null, + requesterId: converted.requesterId ? converted.requesterId.toString() : null, + assigneeId: (converted.assigneeId || converted.assignedAppUserId) ? (converted.assigneeId || converted.assignedAppUserId).toString() : null, + ticketFormId: converted.ticketFormId ? converted.ticketFormId.toString() : null, + // Ensure tags are a comma-separated string if they are an array + tags: Array.isArray(converted.tags) ? converted.tags.join(', ') : converted.tags + }; +}); diff --git a/plugins/NinjaOne/v1/dataStreams/software.json b/plugins/NinjaOne/v1/dataStreams/software.json new file mode 100644 index 0000000..bd3f892 --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/software.json @@ -0,0 +1,76 @@ +{ + "name": "software", + "displayName": "Software", + "description": "Installed software inventory", + "baseDataSourceName": "httpRequestScoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "none" + }, + "expandInnerObjects": false, + "endpointPath": "/v2/device/{{objects[0].deviceId}}/software", + "getArgs": [], + "headers": [] + }, + "matches": { + "sourceType": { + "type": "oneOf", + "values": ["NinjaOne Device"] + } + }, + "metadata": [ + { + "name": "name", + "displayName": "Software Name", + "shape": "string", + "role": "label" + }, + { + "name": "publisher", + "displayName": "Publisher", + "shape": "string" + }, + { + "name": "version", + "displayName": "Version", + "shape": "string" + }, + { + "name": "installDate", + "displayName": "Install Date", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "size", + "displayName": "Size (Bytes)", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "location", + "displayName": "Location", + "shape": "string" + }, + { + "name": "productCode", + "displayName": "Product Code", + "shape": "string" + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/softwareGlobal.json b/plugins/NinjaOne/v1/dataStreams/softwareGlobal.json new file mode 100644 index 0000000..28b606f --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/softwareGlobal.json @@ -0,0 +1,110 @@ +{ + "name": "softwareGlobal", + "displayName": "Software (Global)", + "description": "Global software inventory across all devices", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "cursor.name" + }, + "out": { + "realm": "queryArg", + "path": "cursor" + } + }, + "expandInnerObjects": false, + "endpointPath": "/v2/queries/software", + "pathToData": "results", + "getArgs": [ + { + "key": "installedAfter", + "value": "{{timeframe.start}}" + }, + { + "key": "installedBefore", + "value": "{{timeframe.end}}" + } + ], + "headers": [] + }, + "metadata": [ + { + "name": "name", + "displayName": "Software Name", + "shape": "string", + "role": "label" + }, + { + "name": "publisher", + "displayName": "Publisher", + "shape": "string" + }, + { + "name": "version", + "displayName": "Version", + "shape": "string" + }, + { + "name": "installDate", + "displayName": "Install Date", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "size", + "displayName": "Size (Bytes)", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "number", + "visible": false + }, + { + "name": "location", + "displayName": "Location", + "shape": "string" + }, + { + "name": "productCode", + "displayName": "Product Code", + "shape": "string" + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear", + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/softwarePatches.json b/plugins/NinjaOne/v1/dataStreams/softwarePatches.json new file mode 100644 index 0000000..04fabfb --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/softwarePatches.json @@ -0,0 +1,118 @@ +{ + "name": "softwarePatches", + "displayName": "Software Patches", + "description": "Third-party software patch compliance status including pending, failed, and installed patches", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "cursor.name" + }, + "out": { + "realm": "queryArg", + "path": "cursor" + } + }, + "expandInnerObjects": false, + "endpointPath": "/v2/queries/software-patches", + "pathToData": "results", + "getArgs": [ + { + "key": "ts", + "value": "{{timeframe.end}}" + } + ], + "headers": [] + }, + "metadata": [ + { + "name": "status", + "displayName": "Status", + "shape": [ + "state", + { + "map": { + "error": ["failed", "rejected"], + "warning": ["pending"], + "success": ["installed"], + "unknown": [] + } + } + ] + }, + { + "name": "name", + "displayName": "Patch Name", + "shape": "string", + "role": "label" + }, + { + "name": "id", + "displayName": "ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "softwareName", + "displayName": "Software", + "shape": "string" + }, + { + "name": "softwarePublisher", + "displayName": "Publisher", + "shape": "string" + }, + { + "name": "severity", + "displayName": "Severity", + "shape": "string" + }, + { + "name": "version", + "displayName": "Version", + "shape": "string" + }, + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "string", + "visible": false + }, + { + "name": "installedAt", + "displayName": "Installed At", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear", + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/tasks.json b/plugins/NinjaOne/v1/dataStreams/tasks.json new file mode 100644 index 0000000..4cb5201 --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/tasks.json @@ -0,0 +1,88 @@ +{ + "name": "tasks", + "displayName": "Tasks", + "description": "Scheduled and running automation tasks", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "none" + }, + "expandInnerObjects": false, + "endpointPath": "/v2/tasks", + "pathToData": "", + "getArgs": [], + "headers": [] + }, + "metadata": [ + { + "name": "status", + "displayName": "Status", + "shape": [ + "state", + { + "map": { + "error": ["failed", "cancelled"], + "warning": ["running", "pending"], + "success": ["completed", "success"], + "unknown": [] + } + } + ] + }, + { + "name": "name", + "displayName": "Task Name", + "shape": "string", + "role": "label" + }, + { + "name": "id", + "displayName": "Task ID", + "shape": "number", + "role": "id", + "visible": false + }, + { + "name": "description", + "displayName": "Description", + "shape": "string" + }, + { + "name": "enabled", + "displayName": "Enabled", + "shape": "boolean" + }, + { + "name": "runCount", + "displayName": "Run Count", + "shape": "number" + }, + { + "name": "created", + "displayName": "Created", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "lastRun", + "displayName": "Last Run", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/ticketBoards.json b/plugins/NinjaOne/v1/dataStreams/ticketBoards.json new file mode 100644 index 0000000..6beb110 --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/ticketBoards.json @@ -0,0 +1,78 @@ +{ + "name": "ticketBoards", + "displayName": "Ticket Boards", + "description": "Ticketing boards for organizing and viewing tickets", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "/v2/ticketing/trigger/boards", + "pathToData": "", + "getArgs": [], + "headers": [] + }, + "metadata": [ + { + "name": "name", + "displayName": "Board Name", + "shape": "string", + "role": "label" + }, + { + "name": "id", + "displayName": "Board ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "uid", + "displayName": "UID", + "shape": "string" + }, + { + "name": "description", + "displayName": "Description", + "shape": "string" + }, + { + "name": "createTime", + "displayName": "Created At", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "updateTime", + "displayName": "Updated At", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "system", + "displayName": "System", + "shape": "boolean" + }, + { + "name": "ticketCount", + "displayName": "Ticket Count", + "shape": "number" + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/tickets.json b/plugins/NinjaOne/v1/dataStreams/tickets.json new file mode 100644 index 0000000..b214cc6 --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/tickets.json @@ -0,0 +1,160 @@ +{ + "name": "tickets", + "displayName": "Tickets", + "description": "Tickets from a specific board", + "baseDataSourceName": "httpRequestScoped", + "config": { + "httpMethod": "post", + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "/v2/ticketing/trigger/board/{{objects[0].boardId}}/run", + "postRequestScript": "tickets.js", + "pathToData": "", + "getArgs": [], + "headers": [], + "postBody": { + "pageSize": 100, + "filters": [] + } + }, + "matches": { + "sourceType": { + "type": "oneOf", + "values": ["NinjaOne Ticket Board"] + } + }, + "metadata": [ + { + "name": "status.displayName", + "displayName": "Status", + "shape": "string" + }, + { + "name": "status.statusId", + "displayName": "Status ID", + "shape": "string", + "visible": false + }, + { + "name": "subject", + "displayName": "Subject", + "shape": "string", + "role": "label" + }, + { + "name": "id", + "displayName": "Ticket ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "ticketNumber", + "displayName": "Ticket Number", + "shape": "string" + }, + { + "name": "priority", + "displayName": "Priority", + "shape": "string" + }, + { + "name": "severity", + "displayName": "Severity", + "shape": "string" + }, + { + "name": "type", + "displayName": "Type", + "shape": "string" + }, + { + "name": "source", + "displayName": "Source", + "shape": "string" + }, + { + "name": "tags", + "displayName": "Tags", + "shape": "string" + }, + { + "name": "requesterName", + "displayName": "Requester", + "shape": "string" + }, + { + "name": "assigneeName", + "displayName": "Assignee", + "shape": "string" + }, + { + "name": "organizationId", + "displayName": "Organization ID", + "shape": "string" + }, + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "string" + }, + { + "name": "createdAt", + "displayName": "Created At", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "updatedAt", + "displayName": "Updated At", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "closedAt", + "displayName": "Closed At", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "lastActivityAt", + "displayName": "Last Activity", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "name": "followupTime", + "displayName": "Follow-up Time", + "shape": [ + "date", + { + "timeZone": "Etc/UTC" + } + ] + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/volumes.json b/plugins/NinjaOne/v1/dataStreams/volumes.json new file mode 100644 index 0000000..d5befae --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/volumes.json @@ -0,0 +1,76 @@ +{ + "name": "volumes", + "displayName": "Volumes", + "description": "Disk volumes with capacity, free space, and BitLocker status", + "baseDataSourceName": "httpRequestScoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "/v2/device/{{objects[0].deviceId}}/volumes", + "getArgs": [], + "headers": [] + }, + "matches": { + "sourceType": { + "type": "oneOf", + "values": ["NinjaOne Device"] + } + }, + "metadata": [ + { + "name": "name", + "displayName": "Volume Name", + "shape": "string", + "role": "label" + }, + { + "name": "driveLetter", + "displayName": "Drive Letter", + "shape": "string" + }, + { + "name": "label", + "displayName": "Label", + "shape": "string" + }, + { + "name": "fileSystem", + "displayName": "File System", + "shape": "string" + }, + { + "name": "capacity", + "displayName": "Capacity (Bytes)", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "freeSpace", + "displayName": "Free Space (Bytes)", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "serialNumber", + "displayName": "Serial Number", + "shape": "string" + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/volumesGlobal.json b/plugins/NinjaOne/v1/dataStreams/volumesGlobal.json new file mode 100644 index 0000000..e18e6e8 --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/volumesGlobal.json @@ -0,0 +1,120 @@ +{ + "name": "volumesGlobal", + "displayName": "Volumes (Global)", + "description": "Global disk volume report across all devices", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "cursor.name" + }, + "out": { + "realm": "queryArg", + "path": "cursor" + } + }, + "expandInnerObjects": true, + "endpointPath": "/v2/queries/volumes", + "pathToData": "results", + "getArgs": [ + { + "key": "include", + "value": "bl" + }, + { + "key": "ts", + "value": "{{timeframe.end}}" + } + ], + "headers": [] + }, + "metadata": [ + { + "name": "name", + "displayName": "Volume Name", + "shape": "string", + "role": "label" + }, + { + "name": "driveLetter", + "displayName": "Drive Letter", + "shape": "string" + }, + { + "name": "label", + "displayName": "Label", + "shape": "string" + }, + { + "name": "fileSystem", + "displayName": "File System", + "shape": "string" + }, + { + "name": "capacity", + "displayName": "Capacity (Bytes)", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "freeSpace", + "displayName": "Free Space (Bytes)", + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ] + }, + { + "name": "serialNumber", + "displayName": "Serial Number", + "shape": "string" + }, + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "number", + "visible": false + }, + { + "name": "bitLockerStatus.protectionStatus", + "displayName": "BitLocker Protection", + "shape": "string" + }, + { + "name": "bitLockerStatus.lockStatus", + "displayName": "BitLocker Lock", + "shape": "string" + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear", + "none" + ] +} diff --git a/plugins/NinjaOne/v1/dataStreams/windowsServices.json b/plugins/NinjaOne/v1/dataStreams/windowsServices.json new file mode 100644 index 0000000..8328a9e --- /dev/null +++ b/plugins/NinjaOne/v1/dataStreams/windowsServices.json @@ -0,0 +1,102 @@ +{ + "name": "windowsServices", + "displayName": "Windows Services", + "description": "Windows service status and configurations", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "paging": { + "mode": "token", + "pageSize": { + "realm": "queryArg", + "path": "pageSize", + "value": "1000" + }, + "in": { + "realm": "payload", + "path": "cursor.name" + }, + "out": { + "realm": "queryArg", + "path": "cursor" + } + }, + "expandInnerObjects": false, + "endpointPath": "/v2/queries/windows-services", + "pathToData": "results", + "getArgs": [ + { + "key": "ts", + "value": "{{timeframe.end}}" + } + ], + "headers": [] + }, + "metadata": [ + { + "name": "state", + "displayName": "State", + "shape": [ + "state", + { + "map": { + "error": ["stopped"], + "success": ["running"], + "warning": ["paused", "start pending", "stop pending"], + "unknown": [] + } + } + ] + }, + { + "name": "name", + "displayName": "Service Name", + "shape": "string", + "role": "label" + }, + { + "name": "deviceId", + "displayName": "Device ID", + "shape": "string", + "role": "id", + "visible": false + }, + { + "name": "displayName", + "displayName": "Display Name", + "shape": "string" + }, + { + "name": "startType", + "displayName": "Start Type", + "shape": "string" + }, + { + "name": "userName", + "displayName": "Account", + "shape": "string" + }, + { + "name": "description", + "displayName": "Description", + "shape": "string" + }, + { + "pattern": ".*" + } + ], + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear", + "none" + ] +} diff --git a/plugins/NinjaOne/v1/defaultContent/Devices/deviceDetail.dash.json b/plugins/NinjaOne/v1/defaultContent/Devices/deviceDetail.dash.json new file mode 100644 index 0000000..c33222c --- /dev/null +++ b/plugins/NinjaOne/v1/defaultContent/Devices/deviceDetail.dash.json @@ -0,0 +1,609 @@ +{ + "name": "Device Detail", + "schemaVersion": "1.4", + "path": "devices/device-detail", + "variables": ["{{variables.[NinjaOne Device]}}"], + "dashboard": { + "_type": "layout/grid", + "columns": 4, + "contents": [ + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 0, + "y": 0, + "i": "dev-kpi-alerts-001", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.deviceHealth}}", + "name": "deviceHealth", + "group": { + "by": [], + "aggregate": [ + { + "type": "sum", + "names": ["alertCount"] + } + ] + } + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Devices]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Device]}}" + }, + "timeframe": "none", + "title": "Alert Count", + "variables": ["{{variables.[NinjaOne Device]}}"], + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "alertCount_sum", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 1, + "y": 0, + "i": "dev-kpi-threats-002", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.deviceHealth}}", + "name": "deviceHealth", + "group": { + "by": [], + "aggregate": [ + { + "type": "sum", + "names": ["activeThreatsCount"] + } + ] + } + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Devices]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Device]}}" + }, + "timeframe": "none", + "title": "Active Threats", + "variables": ["{{variables.[NinjaOne Device]}}"], + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "activeThreatsCount_sum", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 2, + "y": 0, + "i": "dev-kpi-patches-003", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.deviceHealth}}", + "name": "deviceHealth", + "group": { + "by": [], + "aggregate": [ + { + "type": "sum", + "names": ["pendingOSPatchesCount", "pendingSoftwarePatchesCount"] + } + ] + } + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Devices]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Device]}}" + }, + "timeframe": "none", + "title": "Pending Patches", + "variables": ["{{variables.[NinjaOne Device]}}"], + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "pendingOSPatchesCount_sum", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 3, + "y": 0, + "i": "dev-kpi-vuln-004", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.deviceHealth}}", + "name": "deviceHealth", + "group": { + "by": [], + "aggregate": [ + { + "type": "sum", + "names": ["criticalVulnerabilityCount"] + } + ] + } + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Devices]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Device]}}" + }, + "timeframe": "none", + "title": "Critical Vulnerabilities", + "variables": ["{{variables.[NinjaOne Device]}}"], + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "criticalVulnerabilityCount_sum", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 2, + "i": "dev-bar-storage-001", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.volumes}}", + "name": "volumes" + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Devices]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Device]}}" + }, + "timeframe": "none", + "title": "Storage Volumes", + "variables": ["{{variables.[NinjaOne Device]}}"], + "visualisation": { + "type": "data-stream-bar-chart", + "config": { + "data-stream-bar-chart": { + "xAxisData": "driveLetter", + "yAxisData": ["capacity", "freeSpace"], + "xAxisGroup": "none", + "xAxisLabel": "Drive", + "yAxisLabel": "Bytes", + "showXAxisLabel": true, + "showYAxisLabel": true, + "showLegend": true, + "legendPosition": "bottom", + "showGrid": true, + "showValue": false, + "showTotals": false, + "displayMode": "actual", + "horizontalLayout": "vertical", + "grouping": false, + "range": { "type": "auto" } + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 2, + "i": "d1a2b3c4-5d6e-7890-abcd-ef12345678d1", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "datastream-properties", + "name": "properties" + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Devices]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Device]}}" + }, + "timeframe": "none", + "title": "Device Properties", + "variables": ["{{variables.[NinjaOne Device]}}"], + "visualisation": { + "config": { + "data-stream-table": { + "columnOrder": ["name", "sourceId", "sourceType", "label"], + "hiddenColumns": ["id", "links", "type"], + "transpose": true + } + }, + "type": "data-stream-table" + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 3, + "x": 0, + "y": 6, + "i": "d5e6f7890-1234-5678-ef01-12345678d5", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.computerSystems}}", + "name": "computerSystems" + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Devices]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Device]}}" + }, + "timeframe": "none", + "title": "Computer System", + "variables": ["{{variables.[NinjaOne Device]}}"], + "visualisation": { + "config": { + "data-stream-table": { + "columnOrder": [ + "manufacturer", + "model", + "serialNumber", + "systemType", + "totalPhysicalMemory", + "domain", + "workgroup" + ], + "hiddenColumns": ["deviceId"], + "transpose": true + } + }, + "type": "data-stream-table" + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 3, + "x": 2, + "y": 6, + "i": "d2b3c4d5-6e7f-8901-bcde-f12345678d2", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.volumes}}", + "name": "volumes" + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Devices]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Device]}}" + }, + "timeframe": "none", + "title": "Storage Volumes Detail", + "variables": ["{{variables.[NinjaOne Device]}}"], + "visualisation": { + "config": { + "data-stream-table": { + "columnOrder": [ + "name", + "driveLetter", + "label", + "capacity", + "freeSpace", + "fileSystem", + "serialNumber" + ], + "hiddenColumns": [], + "transpose": false + } + }, + "type": "data-stream-table" + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 9, + "i": "d4d5e6f7-8901-2345-def0-12345678d4", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.software}}", + "name": "software" + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Devices]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Device]}}" + }, + "timeframe": "none", + "title": "Installed Software", + "variables": ["{{variables.[NinjaOne Device]}}"], + "visualisation": { + "config": { + "data-stream-table": { + "columnOrder": ["name", "publisher", "version", "installDate", "size"], + "hiddenColumns": ["location", "productCode"], + "transpose": false + } + }, + "type": "data-stream-table" + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 3, + "x": 2, + "y": 9, + "i": "d7g789012-3456-7890-f012-12345678d7", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.processors}}", + "name": "processors" + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Devices]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Device]}}" + }, + "timeframe": "none", + "title": "Processors", + "variables": ["{{variables.[NinjaOne Device]}}"], + "visualisation": { + "config": { + "data-stream-table": { + "columnOrder": [ + "name", + "manufacturer", + "architecture", + "numCores", + "numLogicalCores", + "maxClockSpeed", + "clockSpeed" + ], + "hiddenColumns": ["deviceId"], + "transpose": false + } + }, + "type": "data-stream-table" + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 3, + "x": 0, + "y": 13, + "i": "d8h789012-3456-7890-f012-12345678d8", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.disks}}", + "name": "disks" + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Devices]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Device]}}" + }, + "timeframe": "none", + "title": "Physical Disks", + "variables": ["{{variables.[NinjaOne Device]}}"], + "visualisation": { + "config": { + "data-stream-table": { + "columnOrder": [ + "name", + "status", + "model", + "manufacturer", + "mediaType", + "size", + "smartCapable", + "partitionCount" + ], + "hiddenColumns": ["deviceId", "interfaceType"], + "transpose": false + } + }, + "type": "data-stream-table" + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 3, + "x": 2, + "y": 13, + "i": "d9i789012-3456-7890-f012-12345678d9", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.networkInterfaces}}", + "name": "networkInterfaces" + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Devices]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Device]}}" + }, + "timeframe": "none", + "title": "Network Interfaces", + "variables": ["{{variables.[NinjaOne Device]}}"], + "visualisation": { + "config": { + "data-stream-table": { + "columnOrder": [ + "interfaceName", + "status", + "adapterName", + "ipAddress", + "macAddress", + "subnetMask", + "defaultGateway", + "linkSpeed", + "interfaceType", + "mtu" + ], + "hiddenColumns": ["deviceId"], + "transpose": false + } + }, + "type": "data-stream-table" + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 3, + "x": 0, + "y": 16, + "i": "d0j789012-3456-7890-f012-12345678d0", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.loggedOnUsers}}", + "name": "loggedOnUsers" + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Devices]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Device]}}" + }, + "timeframe": "none", + "title": "Logged On Users", + "variables": ["{{variables.[NinjaOne Device]}}"], + "visualisation": { + "config": { + "data-stream-table": { + "columnOrder": ["userName", "logonTime"], + "hiddenColumns": ["deviceId"], + "transpose": false + } + }, + "type": "data-stream-table" + } + } + }, + { + "static": false, + "w": 4, + "moved": false, + "h": 4, + "x": 0, + "y": 19, + "i": "d1k789012-3456-7890-f012-12345678k1", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.windowsServices}}", + "name": "windowsServices" + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Devices]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Device]}}" + }, + "timeframe": "none", + "title": "Windows Services", + "variables": ["{{variables.[NinjaOne Device]}}"], + "visualisation": { + "config": { + "data-stream-table": { + "columnOrder": ["name", "displayName", "state", "startType", "userName", "description"], + "hiddenColumns": ["deviceId"], + "transpose": false + } + }, + "type": "data-stream-table" + } + } + } + ] + } +} diff --git a/plugins/NinjaOne/v1/defaultContent/Locations/locationDetail.dash.json b/plugins/NinjaOne/v1/defaultContent/Locations/locationDetail.dash.json new file mode 100644 index 0000000..71b8c22 --- /dev/null +++ b/plugins/NinjaOne/v1/defaultContent/Locations/locationDetail.dash.json @@ -0,0 +1,123 @@ +{ + "name": "Location Detail", + "schemaVersion": "1.4", + "variables": ["{{variables.[NinjaOne Location]}}"], + "dashboard": { + "_type": "layout/grid", + "columns": 4, + "contents": [ + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 0, + "y": 0, + "i": "loc-kpi-dev-001", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.locationDevices}}", + "name": "locationDevices", + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + } + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Locations]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Location]}}" + }, + "timeframe": "none", + "title": "Devices", + "variables": ["{{variables.[NinjaOne Location]}}"], + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 3, + "moved": false, + "h": 4, + "x": 0, + "y": 2, + "i": "loc-table-dev-001", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.locationDevices}}", + "name": "locationDevices" + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Locations]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Location]}}" + }, + "timeframe": "none", + "title": "Location Devices", + "variables": ["{{variables.[NinjaOne Location]}}"], + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["displayName", "systemName", "organizationId"], + "hiddenColumns": ["id", "deviceId", "locationId"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 4, + "moved": false, + "h": 4, + "x": 0, + "y": 6, + "i": "loc-prop-001", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "datastream-properties", + "name": "properties" + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Locations]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Location]}}" + }, + "timeframe": "none", + "title": "Location Properties", + "variables": ["{{variables.[NinjaOne Location]}}"], + "visualisation": { + "config": { + "data-stream-table": { + "columnOrder": ["name", "sourceId", "sourceType", "label"], + "hiddenColumns": ["id", "links", "type"], + "transpose": true + } + }, + "type": "data-stream-table" + } + } + } + ] + } +} \ No newline at end of file diff --git a/plugins/NinjaOne/v1/defaultContent/Organizations/organizationDetail.dash.json b/plugins/NinjaOne/v1/defaultContent/Organizations/organizationDetail.dash.json new file mode 100644 index 0000000..67b7ae7 --- /dev/null +++ b/plugins/NinjaOne/v1/defaultContent/Organizations/organizationDetail.dash.json @@ -0,0 +1,199 @@ +{ + "name": "Organization Detail", + "schemaVersion": "1.4", + "variables": ["{{variables.[NinjaOne Organization]}}"], + "dashboard": { + "_type": "layout/grid", + "columns": 4, + "contents": [ + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 0, + "y": 0, + "i": "org-kpi-loc-001", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.organizationLocations}}", + "name": "organizationLocations", + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + } + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Organizations]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Organization]}}" + }, + "timeframe": "none", + "title": "Locations", + "variables": ["{{variables.[NinjaOne Organization]}}"], + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 1, + "y": 0, + "i": "org-kpi-dev-002", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.organizationDevices}}", + "name": "organizationDevices", + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + } + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Organizations]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Organization]}}" + }, + "timeframe": "none", + "title": "Devices", + "variables": ["{{variables.[NinjaOne Organization]}}"], + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 2, + "i": "org-table-loc-001", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.organizationLocations}}", + "name": "organizationLocations" + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Organizations]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Organization]}}" + }, + "timeframe": "none", + "title": "Organization Locations", + "variables": ["{{variables.[NinjaOne Organization]}}"], + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["name", "address", "description"], + "hiddenColumns": ["id", "locationId"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 2, + "i": "org-table-dev-002", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.organizationDevices}}", + "name": "organizationDevices" + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Organizations]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Organization]}}" + }, + "timeframe": "none", + "title": "Organization Devices", + "variables": ["{{variables.[NinjaOne Organization]}}"], + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["displayName", "systemName", "locationId"], + "hiddenColumns": ["id", "deviceId", "organizationId"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 4, + "moved": false, + "h": 4, + "x": 0, + "y": 6, + "i": "org-prop-001", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "datastream-properties", + "name": "properties" + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Organizations]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Organization]}}" + }, + "timeframe": "none", + "title": "Organization Properties", + "variables": ["{{variables.[NinjaOne Organization]}}"], + "visualisation": { + "config": { + "data-stream-table": { + "columnOrder": ["name", "sourceId", "sourceType", "label"], + "hiddenColumns": ["id", "links", "type"], + "transpose": true + } + }, + "type": "data-stream-table" + } + } + } + ] + } +} \ No newline at end of file diff --git a/plugins/NinjaOne/v1/defaultContent/TicketBoards/ticketBoard.dash.json b/plugins/NinjaOne/v1/defaultContent/TicketBoards/ticketBoard.dash.json new file mode 100644 index 0000000..ca53e3c --- /dev/null +++ b/plugins/NinjaOne/v1/defaultContent/TicketBoards/ticketBoard.dash.json @@ -0,0 +1,530 @@ +{ + "name": "Ticket Board", + "schemaVersion": "1.4", + "path": "ticket-boards/ticket-board", + "variables": ["{{variables.[NinjaOne Ticket Board]}}"], + "dashboard": { + "_type": "layout/grid", + "columns": 4, + "contents": [ + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 0, + "y": 0, + "i": "tkt-kpi-total-001", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.tickets}}", + "name": "tickets", + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + } + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Ticket Boards]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Ticket Board]}}" + }, + "timeframe": "none", + "title": "Total Tickets", + "variables": ["{{variables.[NinjaOne Ticket Board]}}"], + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 1, + "y": 0, + "i": "tkt-kpi-open-002", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "status.displayName", + "operation": "equals", + "value": "Open" + } + ] + }, + "id": "{{dataStreams.tickets}}", + "name": "tickets", + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + } + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Ticket Boards]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Ticket Board]}}" + }, + "timeframe": "none", + "title": "Open Tickets", + "variables": ["{{variables.[NinjaOne Ticket Board]}}"], + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 2, + "y": 0, + "i": "tkt-kpi-high-003", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "filter": { + "multiOperation": "or", + "filters": [ + { + "column": "priority", + "operation": "equals", + "value": "HIGH" + } + ] + }, + "id": "{{dataStreams.tickets}}", + "name": "tickets", + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + } + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Ticket Boards]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Ticket Board]}}" + }, + "timeframe": "none", + "title": "High Priority", + "variables": ["{{variables.[NinjaOne Ticket Board]}}"], + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 3, + "y": 0, + "i": "tkt-kpi-critical-004", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "filter": { + "multiOperation": "or", + "filters": [ + { + "column": "priority", + "operation": "equals", + "value": "critical" + } + ] + }, + "id": "{{dataStreams.tickets}}", + "name": "tickets", + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + } + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Ticket Boards]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Ticket Board]}}" + }, + "timeframe": "none", + "title": "Critical", + "variables": ["{{variables.[NinjaOne Ticket Board]}}"], + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 2, + "i": "tkt-donut-status-001", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.tickets}}", + "name": "tickets", + "metadata": [ + { + "name": "status.displayName_uniqueValues", + "displayName": "Status" + } + ], + "group": { + "by": [["status.displayName", "uniqueValues"]], + "aggregate": [{ "type": "count" }] + } + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Ticket Boards]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Ticket Board]}}" + }, + "timeframe": "none", + "title": "Tickets by Status", + "variables": ["{{variables.[NinjaOne Ticket Board]}}"], + "visualisation": { + "type": "data-stream-donut-chart", + "config": { + "data-stream-donut-chart": { + "labelColumn": "status.displayName_uniqueValues", + "valueColumn": "count", + "showValuesAsPercentage": true, + "hideCenterValue": false, + "legendPosition": "auto", + "legendMode": "inline" + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 2, + "i": "tkt-donut-priority-001", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.tickets}}", + "name": "tickets", + "metadata": [ + { + "name": "priority_uniqueValues", + "displayName": "Priority" + } + ], + "group": { + "by": [["priority", "uniqueValues"]], + "aggregate": [{ "type": "count" }] + } + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Ticket Boards]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Ticket Board]}}" + }, + "timeframe": "none", + "title": "Tickets by Priority", + "variables": ["{{variables.[NinjaOne Ticket Board]}}"], + "visualisation": { + "type": "data-stream-donut-chart", + "config": { + "data-stream-donut-chart": { + "labelColumn": "priority_uniqueValues", + "valueColumn": "count", + "showValuesAsPercentage": true, + "hideCenterValue": false, + "legendPosition": "auto", + "legendMode": "inline" + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 3, + "x": 0, + "y": 6, + "i": "t1a2b3c4-5d6e-7890-abcd-ef12345678t1", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "datastream-properties", + "name": "properties" + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Ticket Boards]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Ticket Board]}}" + }, + "timeframe": "none", + "title": "Board Properties", + "variables": ["{{variables.[NinjaOne Ticket Board]}}"], + "visualisation": { + "config": { + "data-stream-table": { + "columnOrder": ["name", "sourceId", "sourceType", "label"], + "hiddenColumns": ["id", "links", "type"], + "transpose": true + } + }, + "type": "data-stream-table" + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 3, + "x": 2, + "y": 6, + "i": "t2b3c4d5-6e7f-8901-bcde-f12345678t2", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.ticketBoards}}", + "name": "ticketBoards" + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Ticket Boards]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Ticket Board]}}" + }, + "timeframe": "none", + "title": "Board Information", + "variables": ["{{variables.[NinjaOne Ticket Board]}}"], + "visualisation": { + "config": { + "data-stream-table": { + "columnOrder": ["name", "description", "organizationId", "isPublic", "createdAt"], + "hiddenColumns": ["id"], + "transpose": true + } + }, + "type": "data-stream-table" + } + } + }, + { + "static": false, + "w": 4, + "moved": false, + "h": 6, + "x": 0, + "y": 9, + "i": "t3c4d5e6-7f89-0123-cdef-12345678t3", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "id": "{{dataStreams.tickets}}", + "name": "tickets" + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Ticket Boards]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Ticket Board]}}" + }, + "timeframe": "none", + "title": "All Tickets", + "variables": ["{{variables.[NinjaOne Ticket Board]}}"], + "visualisation": { + "config": { + "data-stream-table": { + "columnOrder": [ + "ticketNumber", + "subject", + "status.displayName", + "priority", + "type", + "requesterName", + "assigneeName", + "organizationId", + "createdAt", + "updatedAt" + ], + "hiddenColumns": ["id"], + "transpose": false + } + }, + "type": "data-stream-table" + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 15, + "i": "t4d5e6f7-8901-2345-def0-12345678t4", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "status.displayName", + "operation": "equals", + "value": "Open" + } + ] + }, + "id": "{{dataStreams.tickets}}", + "name": "tickets" + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Ticket Boards]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Ticket Board]}}" + }, + "timeframe": "none", + "title": "Open Tickets", + "variables": ["{{variables.[NinjaOne Ticket Board]}}"], + "visualisation": { + "config": { + "data-stream-table": { + "columnOrder": [ + "ticketNumber", + "subject", + "priority", + "type", + "assigneeName", + "createdAt" + ], + "hiddenColumns": ["id", "status", "requesterName", "organizationId", "updatedAt"], + "transpose": false + } + }, + "type": "data-stream-table" + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 15, + "i": "t5e6f7890-1234-5678-ef01-12345678t5", + "z": 0, + "config": { + "_type": "tile/data-stream", + "dataStream": { + "filter": { + "multiOperation": "or", + "filters": [ + { + "column": "priority", + "operation": "equals", + "value": "CRITICAL" + }, + { + "column": "priority", + "operation": "equals", + "value": "HIGH" + } + ] + }, + "id": "{{dataStreams.tickets}}", + "name": "tickets" + }, + "description": "", + "scope": { + "scope": "{{scopes.[NinjaOne Ticket Boards]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[NinjaOne Ticket Board]}}" + }, + "timeframe": "none", + "title": "High Priority Tickets", + "variables": ["{{variables.[NinjaOne Ticket Board]}}"], + "visualisation": { + "config": { + "data-stream-table": { + "columnOrder": [ + "ticketNumber", + "subject", + "status", + "priority", + "assigneeName", + "createdAt" + ], + "hiddenColumns": ["id", "type", "requesterName", "organizationId", "updatedAt"], + "transpose": false + } + }, + "type": "data-stream-table" + } + } + } + ] + } +} diff --git a/plugins/NinjaOne/v1/defaultContent/activityLog.dash.json b/plugins/NinjaOne/v1/defaultContent/activityLog.dash.json new file mode 100644 index 0000000..54400c8 --- /dev/null +++ b/plugins/NinjaOne/v1/defaultContent/activityLog.dash.json @@ -0,0 +1,402 @@ +{ + "name": "Activity Log", + "schemaVersion": "1.4", + "dashboard": { + "_type": "layout/grid", + "columns": 4, + "contents": [ + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 0, + "y": 0, + "i": "act-kpi-total-001", + "z": 0, + "config": { + "timeframe": "last24hours", + "dataStream": { + "name": "activities", + "id": "{{dataStreams.activities}}", + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Total Activities", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 1, + "y": 0, + "i": "act-kpi-failed-002", + "z": 0, + "config": { + "timeframe": "last7days", + "dataStream": { + "name": "activities", + "id": "{{dataStreams.activities}}", + "filter": { + "multiOperation": "or", + "filters": [ + { + "column": "status", + "operation": "equals", + "value": "failed" + }, + { + "column": "status", + "operation": "equals", + "value": "error" + } + ] + }, + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Failed Activities", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 2, + "y": 0, + "i": "act-kpi-alerts-003", + "z": 0, + "config": { + "timeframe": "last24hours", + "dataStream": { + "name": "alerts", + "id": "{{dataStreams.alerts}}", + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Recent Alerts", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 3, + "y": 0, + "i": "act-kpi-warnings-004", + "z": 0, + "config": { + "timeframe": "last7days", + "dataStream": { + "name": "activities", + "id": "{{dataStreams.activities}}", + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "status", + "operation": "equals", + "value": "warning" + } + ] + }, + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Warnings", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 2, + "i": "act-bar-type-001", + "z": 0, + "config": { + "timeframe": "last24hours", + "dataStream": { + "name": "activities", + "id": "{{dataStreams.activities}}", + "metadata": [ + { + "name": "activityType_uniqueValues", + "displayName": "Activity Type" + } + ], + "group": { + "by": [["activityType", "uniqueValues"]], + "aggregate": [{ "type": "count" }] + }, + "sort": { + "top": 10, + "by": [["count", "desc"]] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Activities by Type", + "visualisation": { + "type": "data-stream-bar-chart", + "config": { + "data-stream-bar-chart": { + "xAxisData": "activityType_uniqueValues", + "yAxisData": ["count"], + "xAxisGroup": "none", + "xAxisLabel": "Activity Type", + "yAxisLabel": "Count", + "showXAxisLabel": true, + "showYAxisLabel": true, + "showLegend": false, + "legendPosition": "bottom", + "showGrid": true, + "showValue": true, + "showTotals": false, + "displayMode": "actual", + "horizontalLayout": "vertical", + "grouping": false, + "range": { "type": "auto" } + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 2, + "i": "act-donut-status-001", + "z": 0, + "config": { + "timeframe": "last24hours", + "dataStream": { + "name": "activities", + "id": "{{dataStreams.activities}}", + "metadata": [ + { + "name": "status_uniqueValues", + "displayName": "Status" + } + ], + "group": { + "by": [["status", "uniqueValues"]], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Activities by Status", + "visualisation": { + "type": "data-stream-donut-chart", + "config": { + "data-stream-donut-chart": { + "labelColumn": "status_uniqueValues", + "valueColumn": "count", + "showValuesAsPercentage": true, + "hideCenterValue": false, + "legendPosition": "auto", + "legendMode": "inline" + } + } + } + } + }, + { + "static": false, + "w": 4, + "moved": false, + "h": 6, + "x": 0, + "y": 6, + "i": "a1a2b3c4-5d6e-7890-abcd-ef12345678a1", + "z": 0, + "config": { + "timeframe": "last24hours", + "dataStream": { + "name": "activities", + "id": "{{dataStreams.activities}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Recent Activities", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "activityType", + "displayName", + "status", + "organizationId", + "deviceId", + "userId", + "createdAt" + ], + "hiddenColumns": ["id"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 12, + "i": "a2b3c4d5-6e7f-8901-bcde-f12345678a2", + "z": 0, + "config": { + "timeframe": "last7days", + "dataStream": { + "name": "activities", + "filter": { + "multiOperation": "or", + "filters": [ + { + "column": "status", + "operation": "equals", + "value": "failed" + }, + { + "column": "status", + "operation": "equals", + "value": "error" + } + ] + }, + "id": "{{dataStreams.activities}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Failed Activities", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["activityType", "displayName", "status", "organizationId", "createdAt"], + "hiddenColumns": ["id", "deviceId", "userId"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 12, + "i": "a3c4d5e6-7f89-0123-cdef-12345678a3", + "z": 0, + "config": { + "timeframe": "last7days", + "dataStream": { + "name": "alerts", + "id": "{{dataStreams.alerts}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Recent Alerts", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["displayName", "severity", "status", "createdAt"], + "hiddenColumns": ["id", "deviceId", "organizationId"], + "transpose": false + } + } + } + } + } + ] + } +} diff --git a/plugins/NinjaOne/v1/defaultContent/backupManagement.dash.json b/plugins/NinjaOne/v1/defaultContent/backupManagement.dash.json new file mode 100644 index 0000000..32caa4b --- /dev/null +++ b/plugins/NinjaOne/v1/defaultContent/backupManagement.dash.json @@ -0,0 +1,379 @@ +{ + "name": "Backup Management", + "schemaVersion": "1.4", + "dashboard": { + "_type": "layout/grid", + "columns": 4, + "contents": [ + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 0, + "y": 0, + "i": "backup-kpi-used-001", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "backupUsage", + "id": "{{dataStreams.backupUsage}}", + "group": { + "by": [], + "aggregate": [ + { + "type": "sum", + "names": ["references_backupUsage_revisionsTotalSize"] + } + ] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Total Storage Used", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "references_backupUsage_revisionsTotalSize_sum", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 1, + "y": 0, + "i": "backup-kpi-cloud-002", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "backupUsage", + "id": "{{dataStreams.backupUsage}}", + "group": { + "by": [], + "aggregate": [ + { + "type": "sum", + "names": ["references_backupUsage_cloudTotalSize"] + } + ] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Cloud Storage Used", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "references_backupUsage_cloudTotalSize_sum", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 2, + "y": 0, + "i": "backup-kpi-devices-003", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "backupUsage", + "id": "{{dataStreams.backupUsage}}", + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Devices Backed Up", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 2, + "y": 0, + "i": "backup-kpi-locations-004", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "backupUsage", + "id": "{{dataStreams.backupUsage}}", + "group": { + "by": ["references_location_name"], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Backup Locations", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 4, + "moved": false, + "h": 4, + "x": 0, + "y": 2, + "i": "backup-bar-usage-001", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "backupUsage", + "id": "{{dataStreams.backupUsage}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Backup Storage by Organization", + "visualisation": { + "type": "data-stream-bar-chart", + "config": { + "data-stream-bar-chart": { + "xAxisData": "references_organization_name", + "yAxisData": [ + "references_backupUsage_revisionsTotalSize", + "references_backupUsage_cloudTotalSize", + "references_backupUsage_localTotalSize" + ], + "xAxisGroup": "none", + "xAxisLabel": "Organization", + "yAxisLabel": "Bytes", + "showXAxisLabel": true, + "showYAxisLabel": true, + "showLegend": true, + "legendPosition": "bottom", + "showGrid": true, + "showValue": false, + "showTotals": false, + "displayMode": "actual", + "horizontalLayout": "vertical", + "grouping": false, + "range": { "type": "auto" } + } + } + } + } + }, + { + "static": false, + "w": 4, + "moved": false, + "h": 4, + "x": 0, + "y": 6, + "i": "b1a2b3c4-5d6e-7890-abcd-ef12345678b1", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "backupUsage", + "id": "{{dataStreams.backupUsage}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Backup Storage Usage by Device", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "displayName", + "references_organization_name", + "references_location_name", + "references_backupUsage_revisionsTotalSize", + "references_backupUsage_cloudTotalSize", + "references_backupUsage_localTotalSize" + ], + "hiddenColumns": ["id", "organizationId", "locationId"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 10, + "i": "b2b3c4d5-6e7f-8901-bcde-f12345678b2", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "deviceHealth", + "id": "{{dataStreams.deviceHealth}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Device Health Overview", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["healthStatus", "offline", "alertCount"], + "hiddenColumns": [ + "deviceId", + "activeThreatsCount", + "quarantinedThreatsCount", + "blockedThreatsCount", + "pendingOSPatchesCount", + "failedOSPatchesCount", + "pendingSoftwarePatchesCount", + "failedSoftwarePatchesCount", + "criticalVulnerabilityCount", + "highVulnerabilityCount", + "mediumVulnerabilityCount", + "lowVulnerabilityCount", + "activeJobCount", + "parentDeviceId", + "parentOffline" + ], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 10, + "i": "b3c4d5e6-7f89-0123-cdef-12345678b3", + "z": 0, + "config": { + "timeframe": "last7days", + "dataStream": { + "name": "backupJobs", + "id": "{{dataStreams.backupJobs}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Recent Backup Jobs", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["planName", "jobStatus", "jobStartTime", "jobEndTime", "destination"], + "hiddenColumns": ["jobId", "planType", "deviceId", "organizationId", "locationId"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 4, + "moved": false, + "h": 4, + "x": 0, + "y": 14, + "i": "b4d5e6f7-8901-2345-def0-12345678b4", + "z": 0, + "config": { + "timeframe": "last24hours", + "dataStream": { + "name": "alerts", + "filter": { + "multiOperation": "or", + "filters": [ + { + "column": "sourceName", + "operation": "contains", + "value": "backup" + }, + { + "column": "sourceType", + "operation": "contains", + "value": "BACKUP" + } + ] + }, + "id": "{{dataStreams.alerts}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Backup-Related Alerts", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["sourceName", "severity", "conditionHealthStatus", "createTime"], + "hiddenColumns": ["uid", "device_id", "device_organizationId"], + "transpose": false + } + } + } + } + } + ] + } +} diff --git a/plugins/NinjaOne/v1/defaultContent/deviceOverview.dash.json b/plugins/NinjaOne/v1/defaultContent/deviceOverview.dash.json new file mode 100644 index 0000000..2ea05b1 --- /dev/null +++ b/plugins/NinjaOne/v1/defaultContent/deviceOverview.dash.json @@ -0,0 +1,478 @@ +{ + "name": "Device Overview", + "schemaVersion": "1.4", + "dashboard": { + "_type": "layout/grid", + "columns": 4, + "contents": [ + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 0, + "y": 0, + "i": "kpi-devices-001", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "devices", + "id": "{{dataStreams.devices}}", + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Total Devices", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 1, + "y": 0, + "i": "kpi-offline-002", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "devices", + "id": "{{dataStreams.devices}}", + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "offline", + "operation": "equals", + "value": "true" + } + ] + }, + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Offline Devices", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 2, + "y": 0, + "i": "kpi-criticalvuln-003", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "deviceHealth", + "id": "{{dataStreams.deviceHealth}}", + "group": { + "by": [], + "aggregate": [ + { + "type": "sum", + "names": ["criticalVulnerabilityCount"] + } + ] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Critical Vulnerabilities", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "criticalVulnerabilityCount_sum", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 3, + "y": 0, + "i": "kpi-activethreats-004", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "deviceHealth", + "id": "{{dataStreams.deviceHealth}}", + "group": { + "by": [], + "aggregate": [ + { + "type": "sum", + "names": ["activeThreatsCount"] + } + ] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Active Threats", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "activeThreatsCount_sum", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 2, + "i": "a1b2c3d4-5e6f-7890-abcd-ef1234567890", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "deviceHealth", + "id": "{{dataStreams.deviceHealth}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Device Health Status", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "healthStatus", + "activeThreatsCount", + "alertCount", + "pendingOSPatchesCount", + "failedOSPatchesCount", + "pendingSoftwarePatchesCount", + "failedSoftwarePatchesCount", + "criticalVulnerabilityCount", + "highVulnerabilityCount", + "offline" + ], + "hiddenColumns": [ + "deviceId", + "quarantinedThreatsCount", + "mediumVulnerabilityCount", + "lowVulnerabilityCount" + ], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 2, + "i": "b2c3d4e5-6f78-9012-cdef-234567890123", + "z": 0, + "config": { + "timeframe": "last24hours", + "dataStream": { + "name": "alerts", + "id": "{{dataStreams.alerts}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Recent Alerts", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["displayName", "severity", "status", "createdAt"], + "hiddenColumns": ["id", "deviceId", "organizationId"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 3, + "x": 0, + "y": 6, + "i": "f1a2b3c4-5d6e-7890-abcd-ef1234567891", + "z": 0, + "config": { + "timeframe": "last7days", + "dataStream": { + "name": "antivirusThreats", + "id": "{{dataStreams.antivirusThreats}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Antivirus Threats", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["name", "status", "severity", "category", "detectedAt", "actionTaken"], + "hiddenColumns": ["id", "deviceId", "path"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 3, + "x": 2, + "y": 6, + "i": "f2b3c4d5-6e7f-8901-bcde-f12345678902", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "antivirusStatus", + "id": "{{dataStreams.antivirusStatus}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Antivirus Status", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "productName", + "productState", + "definitionStatus", + "version", + "timestamp" + ], + "hiddenColumns": ["deviceId"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 3, + "x": 0, + "y": 9, + "i": "c3d4e5f6-7890-1234-def0-345678901234", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "operatingSystems", + "id": "{{dataStreams.operatingSystems}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Operating Systems", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["name", "architecture", "buildNumber", "lastBootTime", "needsReboot"], + "hiddenColumns": ["deviceId", "manufacturer", "releaseId"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 3, + "x": 2, + "y": 9, + "i": "f3c4d5e6-7f89-0123-cdef-123456789003", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "computerSystems", + "id": "{{dataStreams.computerSystems}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Computer Systems", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "manufacturer", + "model", + "serialNumber", + "systemType", + "domain", + "workgroup" + ], + "hiddenColumns": ["deviceId", "totalPhysicalMemory"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 12, + "i": "d4e5f678-9012-3456-ef01-456789012345", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "backupUsage", + "id": "{{dataStreams.backupUsage}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Backup Usage by Location", + "visualisation": { + "type": "data-stream-bar-chart", + "config": { + "data-stream-bar-chart": { + "xAxisData": "locationName", + "yAxisData": ["usedBytes", "includedBytes"], + "xAxisGroup": "none", + "xAxisLabel": "Location", + "yAxisLabel": "Bytes", + "showXAxisLabel": true, + "showYAxisLabel": true, + "showLegend": true, + "legendPosition": "bottom", + "showGrid": true, + "showValue": false, + "showTotals": false, + "displayMode": "actual", + "horizontalLayout": "horizontal", + "grouping": false, + "range": { "type": "auto" } + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 12, + "i": "f6789012-3456-7890-0123-678901234567", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "devices", + "id": "{{dataStreams.devices}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "All Devices", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "displayName", + "systemName", + "offline", + "lastContact", + "organizationId" + ], + "hiddenColumns": ["id", "uid", "nodeClass", "locationId", "policyId"], + "transpose": false + } + } + } + } + } + ] + } +} diff --git a/plugins/NinjaOne/v1/defaultContent/jobsTasks.dash.json b/plugins/NinjaOne/v1/defaultContent/jobsTasks.dash.json new file mode 100644 index 0000000..e17dc29 --- /dev/null +++ b/plugins/NinjaOne/v1/defaultContent/jobsTasks.dash.json @@ -0,0 +1,572 @@ +{ + "name": "Jobs & Tasks", + "schemaVersion": "1.4", + "dashboard": { + "_type": "layout/grid", + "columns": 4, + "contents": [ + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 0, + "y": 0, + "i": "job-kpi-running-001", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "jobs", + "id": "{{dataStreams.jobs}}", + "filter": { + "multiOperation": "or", + "filters": [ + { + "column": "status", + "operation": "equals", + "value": "running" + }, + { + "column": "status", + "operation": "equals", + "value": "in_progress" + } + ] + }, + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Running Jobs", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 1, + "y": 0, + "i": "job-kpi-failed-002", + "z": 0, + "config": { + "timeframe": "last7days", + "dataStream": { + "name": "jobs", + "id": "{{dataStreams.jobs}}", + "filter": { + "multiOperation": "or", + "filters": [ + { + "column": "status", + "operation": "equals", + "value": "failed" + }, + { + "column": "status", + "operation": "equals", + "value": "error" + } + ] + }, + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Failed Jobs", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 2, + "y": 0, + "i": "job-kpi-completed-003", + "z": 0, + "config": { + "timeframe": "last7days", + "dataStream": { + "name": "jobs", + "id": "{{dataStreams.jobs}}", + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "status", + "operation": "equals", + "value": "completed" + } + ] + }, + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Completed Jobs", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 3, + "y": 0, + "i": "job-kpi-activetasks-004", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "tasks", + "id": "{{dataStreams.tasks}}", + "filter": { + "multiOperation": "or", + "filters": [ + { + "column": "status", + "operation": "equals", + "value": "running" + }, + { + "column": "status", + "operation": "equals", + "value": "pending" + } + ] + }, + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Active Tasks", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 2, + "i": "job-donut-status-001", + "z": 0, + "config": { + "timeframe": "last7days", + "dataStream": { + "name": "jobs", + "id": "{{dataStreams.jobs}}", + "metadata": [ + { + "name": "status_uniqueValues", + "displayName": "Status" + } + ], + "group": { + "by": [["status", "uniqueValues"]], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Jobs by Status", + "visualisation": { + "type": "data-stream-donut-chart", + "config": { + "data-stream-donut-chart": { + "labelColumn": "status_uniqueValues", + "valueColumn": "count", + "showValuesAsPercentage": true, + "hideCenterValue": false, + "legendPosition": "auto", + "legendMode": "inline" + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 2, + "i": "task-donut-status-001", + "z": 0, + "config": { + "timeframe": "last7days", + "dataStream": { + "name": "tasks", + "id": "{{dataStreams.tasks}}", + "metadata": [ + { + "name": "status_uniqueValues", + "displayName": "Status" + } + ], + "group": { + "by": [["status", "uniqueValues"]], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Tasks by Status", + "visualisation": { + "type": "data-stream-donut-chart", + "config": { + "data-stream-donut-chart": { + "labelColumn": "status_uniqueValues", + "valueColumn": "count", + "showValuesAsPercentage": true, + "hideCenterValue": false, + "legendPosition": "auto", + "legendMode": "inline" + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 5, + "x": 0, + "y": 6, + "i": "j1a2b3c4-5d6e-7890-abcd-ef12345678j1", + "z": 0, + "config": { + "timeframe": "last7days", + "dataStream": { + "name": "jobs", + "id": "{{dataStreams.jobs}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Recent Jobs", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "name", + "type", + "status", + "organizationId", + "startedAt", + "completedAt", + "duration" + ], + "hiddenColumns": ["id", "deviceId"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 5, + "x": 2, + "y": 6, + "i": "j2b3c4d5-6e7f-8901-bcde-f12345678j2", + "z": 0, + "config": { + "timeframe": "last7days", + "dataStream": { + "name": "tasks", + "id": "{{dataStreams.tasks}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Recent Tasks", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "name", + "type", + "status", + "organizationId", + "createdAt", + "startedAt", + "completedAt" + ], + "hiddenColumns": ["id"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 11, + "i": "j3c4d5e6-7f89-0123-cdef-12345678j3", + "z": 0, + "config": { + "timeframe": "last7days", + "dataStream": { + "name": "jobs", + "filter": { + "multiOperation": "or", + "filters": [ + { + "column": "status", + "operation": "equals", + "value": "failed" + }, + { + "column": "status", + "operation": "equals", + "value": "error" + } + ] + }, + "id": "{{dataStreams.jobs}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Failed Jobs", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["name", "type", "status", "deviceId", "startedAt", "completedAt"], + "hiddenColumns": ["id", "organizationId", "duration"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 11, + "i": "j4d5e6f7-8901-2345-def0-12345678j4", + "z": 0, + "config": { + "timeframe": "last7days", + "dataStream": { + "name": "tasks", + "filter": { + "multiOperation": "or", + "filters": [ + { + "column": "status", + "operation": "equals", + "value": "failed" + }, + { + "column": "status", + "operation": "equals", + "value": "cancelled" + } + ] + }, + "id": "{{dataStreams.tasks}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Failed Tasks", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["name", "type", "status", "organizationId", "startedAt", "completedAt"], + "hiddenColumns": ["id", "createdAt"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 15, + "i": "j5e6f7890-1234-5678-ef01-12345678j5", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "jobs", + "filter": { + "multiOperation": "or", + "filters": [ + { + "column": "status", + "operation": "equals", + "value": "running" + }, + { + "column": "status", + "operation": "equals", + "value": "in_progress" + }, + { + "column": "status", + "operation": "equals", + "value": "pending" + } + ] + }, + "id": "{{dataStreams.jobs}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Active Jobs", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["name", "type", "status", "deviceId", "startedAt"], + "hiddenColumns": ["id", "organizationId", "completedAt", "duration"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 15, + "i": "j6f789012-3456-7890-f012-12345678j6", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "tasks", + "filter": { + "multiOperation": "or", + "filters": [ + { + "column": "status", + "operation": "equals", + "value": "running" + }, + { + "column": "status", + "operation": "equals", + "value": "pending" + } + ] + }, + "id": "{{dataStreams.tasks}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Active Tasks", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["name", "type", "status", "organizationId", "startedAt"], + "hiddenColumns": ["id", "createdAt", "completedAt"], + "transpose": false + } + } + } + } + } + ] + } +} diff --git a/plugins/NinjaOne/v1/defaultContent/manifest.json b/plugins/NinjaOne/v1/defaultContent/manifest.json new file mode 100644 index 0000000..804fd57 --- /dev/null +++ b/plugins/NinjaOne/v1/defaultContent/manifest.json @@ -0,0 +1,48 @@ +{ + "items": [ + { + "name": "deviceOverview", + "type": "dashboard" + }, + { + "name": "patchManagement", + "type": "dashboard" + }, + { + "name": "securityOverview", + "type": "dashboard" + }, + { + "name": "backupManagement", + "type": "dashboard" + }, + { + "name": "organizationOverview", + "type": "dashboard" + }, + { + "name": "Organizations/organizationDetail", + "type": "dashboard" + }, + { + "name": "Locations/locationDetail", + "type": "dashboard" + }, + { + "name": "jobsTasks", + "type": "dashboard" + }, + { + "name": "activityLog", + "type": "dashboard" + }, + { + "name": "Devices/deviceDetail", + "type": "dashboard" + }, + { + "name": "TicketBoards/ticketBoard", + "type": "dashboard" + } + ] +} diff --git a/plugins/NinjaOne/v1/defaultContent/organizationOverview.dash.json b/plugins/NinjaOne/v1/defaultContent/organizationOverview.dash.json new file mode 100644 index 0000000..a20a9dc --- /dev/null +++ b/plugins/NinjaOne/v1/defaultContent/organizationOverview.dash.json @@ -0,0 +1,439 @@ +{ + "name": "Organization Overview", + "schemaVersion": "1.4", + "dashboard": { + "_type": "layout/grid", + "columns": 4, + "contents": [ + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 0, + "y": 0, + "i": "org-kpi-orgs-001", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "organizations", + "id": "{{dataStreams.organizations}}", + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Organizations", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 1, + "y": 0, + "i": "org-kpi-locations-002", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "locations", + "id": "{{dataStreams.locations}}", + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Locations", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 2, + "y": 0, + "i": "org-kpi-devices-003", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "devices", + "id": "{{dataStreams.devices}}", + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Total Devices", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 3, + "y": 0, + "i": "org-kpi-policies-004", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "policies", + "id": "{{dataStreams.policies}}", + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Policies", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 2, + "i": "org-bar-groups-001", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "deviceGroups", + "id": "{{dataStreams.deviceGroups}}", + "sort": { + "top": 10, + "by": [["deviceCount", "desc"]] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Device Groups by Size", + "visualisation": { + "type": "data-stream-bar-chart", + "config": { + "data-stream-bar-chart": { + "xAxisData": "name", + "yAxisData": ["deviceCount"], + "xAxisGroup": "none", + "xAxisLabel": "Group", + "yAxisLabel": "Devices", + "showXAxisLabel": true, + "showYAxisLabel": true, + "showLegend": false, + "legendPosition": "bottom", + "showGrid": true, + "showValue": true, + "showTotals": false, + "displayMode": "actual", + "horizontalLayout": "horizontal", + "grouping": false, + "range": { "type": "auto" } + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 2, + "i": "org-bar-tickets-001", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "ticketBoards", + "id": "{{dataStreams.ticketBoards}}", + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Ticket Boards", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 6, + "i": "o1a2b3c4-5d6e-7890-abcd-ef12345678o1", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "organizations", + "id": "{{dataStreams.organizations}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Organizations", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["name", "id", "description"], + "hiddenColumns": [], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 6, + "i": "o2b3c4d5-6e7f-8901-bcde-f12345678o2", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "locations", + "id": "{{dataStreams.locations}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Locations", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["name", "organizationName", "city", "country", "timezone"], + "hiddenColumns": ["id", "organizationId", "description", "address"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 10, + "i": "o3c4d5e6-7f89-0123-cdef-12345678o3", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "deviceGroups", + "id": "{{dataStreams.deviceGroups}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Device Groups", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["name", "organizationId", "type", "deviceCount", "isDynamic"], + "hiddenColumns": ["id"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 10, + "i": "o4d5e6f7-8901-2345-def0-12345678o4", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "policies", + "id": "{{dataStreams.policies}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Policies", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["name", "id", "description"], + "hiddenColumns": [], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 14, + "i": "o5e6f7890-1234-5678-ef01-12345678o5", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "devices", + "id": "{{dataStreams.devices}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "All Devices", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "displayName", + "systemName", + "organizationId", + "locationId", + "policyId", + "offline", + "lastContact" + ], + "hiddenColumns": ["id", "uid", "nodeClass"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 14, + "i": "o6f789012-3456-7890-f012-12345678o6", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "ticketBoards", + "id": "{{dataStreams.ticketBoards}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Ticket Boards", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["name", "organizationId", "description", "isPublic", "createdAt"], + "hiddenColumns": ["id"], + "transpose": false + } + } + } + } + } + ] + } +} diff --git a/plugins/NinjaOne/v1/defaultContent/patchManagement.dash.json b/plugins/NinjaOne/v1/defaultContent/patchManagement.dash.json new file mode 100644 index 0000000..9b28fe3 --- /dev/null +++ b/plugins/NinjaOne/v1/defaultContent/patchManagement.dash.json @@ -0,0 +1,515 @@ +{ + "name": "Patch Management", + "schemaVersion": "1.4", + "dashboard": { + "_type": "layout/grid", + "columns": 4, + "contents": [ + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 0, + "y": 0, + "i": "patch-kpi-pendingos-001", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "deviceHealth", + "id": "{{dataStreams.deviceHealth}}", + "group": { + "by": [], + "aggregate": [ + { + "type": "sum", + "names": ["pendingOSPatchesCount"] + } + ] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Pending OS Patches", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "pendingOSPatchesCount_sum", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 1, + "y": 0, + "i": "patch-kpi-failedos-002", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "deviceHealth", + "id": "{{dataStreams.deviceHealth}}", + "group": { + "by": [], + "aggregate": [ + { + "type": "sum", + "names": ["failedOSPatchesCount"] + } + ] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Failed OS Patches", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "failedOSPatchesCount_sum", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 2, + "y": 0, + "i": "patch-kpi-pendingsoft-003", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "deviceHealth", + "id": "{{dataStreams.deviceHealth}}", + "group": { + "by": [], + "aggregate": [ + { + "type": "sum", + "names": ["pendingSoftwarePatchesCount"] + } + ] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Pending Software Patches", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "pendingSoftwarePatchesCount_sum", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 3, + "y": 0, + "i": "patch-kpi-reboot-004", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "operatingSystems", + "id": "{{dataStreams.operatingSystems}}", + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "needsReboot", + "operation": "equals", + "value": "true" + } + ] + }, + "group": { + "by": [], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Need Reboot", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "count", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 2, + "i": "patch-donut-osstatus-001", + "z": 0, + "config": { + "timeframe": "last7days", + "dataStream": { + "name": "osPatches", + "id": "{{dataStreams.osPatches}}", + "metadata": [ + { + "name": "status_uniqueValues", + "displayName": "Status" + } + ], + "group": { + "by": [["status", "uniqueValues"]], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "OS Patches by Status", + "visualisation": { + "type": "data-stream-donut-chart", + "config": { + "data-stream-donut-chart": { + "labelColumn": "status_uniqueValues", + "valueColumn": "count", + "showValuesAsPercentage": true, + "hideCenterValue": false, + "legendPosition": "auto", + "legendMode": "inline" + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 2, + "i": "patch-donut-softstatus-002", + "z": 0, + "config": { + "timeframe": "last7days", + "dataStream": { + "name": "softwarePatches", + "id": "{{dataStreams.softwarePatches}}", + "metadata": [ + { + "name": "status_uniqueValues", + "displayName": "Status" + } + ], + "group": { + "by": [["status", "uniqueValues"]], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Software Patches by Status", + "visualisation": { + "type": "data-stream-donut-chart", + "config": { + "data-stream-donut-chart": { + "labelColumn": "status_uniqueValues", + "valueColumn": "count", + "showValuesAsPercentage": true, + "hideCenterValue": false, + "legendPosition": "auto", + "legendMode": "inline" + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 5, + "x": 0, + "y": 6, + "i": "a1b2c3d4-5e6f-7890-abcd-ef1234567891", + "z": 0, + "config": { + "timeframe": "last7days", + "dataStream": { + "name": "osPatches", + "id": "{{dataStreams.osPatches}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "OS Patch Status", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["name", "status", "severity", "type", "kbNumber", "installedAt"], + "hiddenColumns": ["id", "deviceId"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 5, + "x": 2, + "y": 6, + "i": "b2c3d4e5-6f78-9012-cdef-234567890124", + "z": 0, + "config": { + "timeframe": "last7days", + "dataStream": { + "name": "softwarePatches", + "id": "{{dataStreams.softwarePatches}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Software Patch Status", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "name", + "softwareName", + "softwarePublisher", + "status", + "severity", + "version", + "installedAt" + ], + "hiddenColumns": ["id", "deviceId"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 11, + "i": "c3d4e5f6-7890-1234-def0-345678901235", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "operatingSystems", + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "needsReboot", + "operation": "equals", + "value": "true" + } + ] + }, + "id": "{{dataStreams.operatingSystems}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Devices Needing Reboot", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["name", "buildNumber", "lastBootTime", "needsReboot"], + "hiddenColumns": ["deviceId", "manufacturer", "architecture", "releaseId"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 11, + "i": "p1a2b3c4-5d6e-7890-abcd-ef12345678a1", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "deviceHealth", + "id": "{{dataStreams.deviceHealth}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Patch Compliance Summary", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "healthStatus", + "pendingOSPatchesCount", + "failedOSPatchesCount", + "pendingSoftwarePatchesCount", + "failedSoftwarePatchesCount" + ], + "hiddenColumns": [ + "deviceId", + "activeThreatsCount", + "quarantinedThreatsCount", + "alertCount", + "criticalVulnerabilityCount", + "highVulnerabilityCount", + "mediumVulnerabilityCount", + "lowVulnerabilityCount", + "offline" + ], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 15, + "i": "p2b3c4d5-6e7f-8901-bcde-f12345678a2", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "policyOverrides", + "id": "{{dataStreams.policyOverrides}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Policy Overrides", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["policyName", "conditionType", "enabled", "createdAt", "updatedAt"], + "hiddenColumns": ["deviceId", "policyId", "conditionId"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 15, + "i": "d4e5f678-9012-3456-ef01-456789012346", + "z": 0, + "config": { + "timeframe": "last7days", + "dataStream": { + "name": "jobs", + "filter": { + "multiOperation": "or", + "filters": [ + { + "column": "type", + "operation": "equals", + "value": "patch" + }, + { + "column": "type", + "operation": "equals", + "value": "os_patch" + }, + { + "column": "type", + "operation": "equals", + "value": "software_patch" + } + ] + }, + "id": "{{dataStreams.jobs}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Recent Patch Jobs", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["name", "type", "status", "startedAt", "completedAt", "duration"], + "hiddenColumns": ["id", "deviceId", "organizationId"], + "transpose": false + } + } + } + } + } + ] + } +} diff --git a/plugins/NinjaOne/v1/defaultContent/scopes.json b/plugins/NinjaOne/v1/defaultContent/scopes.json new file mode 100644 index 0000000..98a4d77 --- /dev/null +++ b/plugins/NinjaOne/v1/defaultContent/scopes.json @@ -0,0 +1,62 @@ +[ + { + "matches": { + "sourceType": { + "type": "oneOf", + "values": ["NinjaOne Organization"] + } + }, + "name": "NinjaOne Organizations", + "variable": { + "allowMultipleSelection": false, + "default": "none", + "name": "NinjaOne Organization", + "type": "object" + } + }, + { + "matches": { + "sourceType": { + "type": "oneOf", + "values": ["NinjaOne Location"] + } + }, + "name": "NinjaOne Locations", + "variable": { + "allowMultipleSelection": false, + "default": "none", + "name": "NinjaOne Location", + "type": "object" + } + }, + { + "matches": { + "sourceType": { + "type": "oneOf", + "values": ["NinjaOne Device"] + } + }, + "name": "NinjaOne Devices", + "variable": { + "allowMultipleSelection": false, + "default": "none", + "name": "NinjaOne Device", + "type": "object" + } + }, + { + "matches": { + "sourceType": { + "type": "oneOf", + "values": ["NinjaOne Ticket Board"] + } + }, + "name": "NinjaOne Ticket Boards", + "variable": { + "allowMultipleSelection": false, + "default": "none", + "name": "NinjaOne Ticket Board", + "type": "object" + } + } +] diff --git a/plugins/NinjaOne/v1/defaultContent/securityOverview.dash.json b/plugins/NinjaOne/v1/defaultContent/securityOverview.dash.json new file mode 100644 index 0000000..f4df800 --- /dev/null +++ b/plugins/NinjaOne/v1/defaultContent/securityOverview.dash.json @@ -0,0 +1,463 @@ +{ + "name": "Security Overview", + "schemaVersion": "1.4", + "dashboard": { + "_type": "layout/grid", + "columns": 4, + "contents": [ + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 0, + "y": 0, + "i": "sec-kpi-activethreats-001", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "deviceHealth", + "id": "{{dataStreams.deviceHealth}}", + "group": { + "by": [], + "aggregate": [ + { + "type": "sum", + "names": ["activeThreatsCount"] + } + ] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Active Threats", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "activeThreatsCount_sum", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 1, + "y": 0, + "i": "sec-kpi-alertcount-002", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "deviceHealth", + "id": "{{dataStreams.deviceHealth}}", + "group": { + "by": [], + "aggregate": [ + { + "type": "sum", + "names": ["alertCount"] + } + ] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Total Alerts", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "alertCount_sum", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 2, + "y": 0, + "i": "sec-kpi-criticalvuln-003", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "deviceHealth", + "id": "{{dataStreams.deviceHealth}}", + "group": { + "by": [], + "aggregate": [ + { + "type": "sum", + "names": ["criticalVulnerabilityCount"] + } + ] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Critical Vulnerabilities", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "criticalVulnerabilityCount_sum", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 3, + "y": 0, + "i": "sec-kpi-highvuln-004", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "deviceHealth", + "id": "{{dataStreams.deviceHealth}}", + "group": { + "by": [], + "aggregate": [ + { + "type": "sum", + "names": ["highVulnerabilityCount"] + } + ] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "High Vulnerabilities", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "highVulnerabilityCount_sum", + "comparisonColumn": "none", + "formatted": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 2, + "i": "sec-donut-threats-001", + "z": 0, + "config": { + "timeframe": "last7days", + "dataStream": { + "name": "antivirusThreats", + "id": "{{dataStreams.antivirusThreats}}", + "metadata": [ + { + "name": "severity_uniqueValues", + "displayName": "Severity" + } + ], + "group": { + "by": [["severity", "uniqueValues"]], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Threats by Severity", + "visualisation": { + "type": "data-stream-donut-chart", + "config": { + "data-stream-donut-chart": { + "labelColumn": "severity_uniqueValues", + "valueColumn": "count", + "showValuesAsPercentage": true, + "hideCenterValue": false, + "legendPosition": "auto", + "legendMode": "inline" + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 2, + "i": "sec-donut-alerts-002", + "z": 0, + "config": { + "timeframe": "last24hours", + "dataStream": { + "name": "alerts", + "id": "{{dataStreams.alerts}}", + "metadata": [ + { + "name": "severity_uniqueValues", + "displayName": "Severity" + } + ], + "group": { + "by": [["severity", "uniqueValues"]], + "aggregate": [{ "type": "count" }] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Alerts by Severity", + "visualisation": { + "type": "data-stream-donut-chart", + "config": { + "data-stream-donut-chart": { + "labelColumn": "severity_uniqueValues", + "valueColumn": "count", + "showValuesAsPercentage": true, + "hideCenterValue": false, + "legendPosition": "auto", + "legendMode": "inline" + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 6, + "i": "s1a2b3c4-5d6e-7890-abcd-ef12345678s1", + "z": 0, + "config": { + "timeframe": "last7days", + "dataStream": { + "name": "antivirusThreats", + "id": "{{dataStreams.antivirusThreats}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Antivirus Threats", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "name", + "status", + "severity", + "category", + "detectedAt", + "actionTaken", + "path" + ], + "hiddenColumns": ["id", "deviceId"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 6, + "i": "s2b3c4d5-6e7f-8901-bcde-f12345678s2", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "antivirusStatus", + "id": "{{dataStreams.antivirusStatus}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Antivirus Product Status", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "productName", + "productState", + "definitionStatus", + "version", + "timestamp" + ], + "hiddenColumns": ["deviceId"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 10, + "i": "s3c4d5e6-7f89-0123-cdef-12345678s3", + "z": 0, + "config": { + "timeframe": "last24hours", + "dataStream": { + "name": "alerts", + "id": "{{dataStreams.alerts}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Recent Security Alerts", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": ["displayName", "severity", "status", "createdAt"], + "hiddenColumns": ["id", "deviceId", "organizationId"], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 10, + "i": "s4d5e6f7-8901-2345-def0-12345678s4", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "deviceHealth", + "id": "{{dataStreams.deviceHealth}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Device Security Health", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "healthStatus", + "activeThreatsCount", + "quarantinedThreatsCount", + "alertCount", + "criticalVulnerabilityCount", + "highVulnerabilityCount" + ], + "hiddenColumns": [ + "deviceId", + "pendingOSPatchesCount", + "failedOSPatchesCount", + "pendingSoftwarePatchesCount", + "failedSoftwarePatchesCount", + "mediumVulnerabilityCount", + "lowVulnerabilityCount", + "offline" + ], + "transpose": false + } + } + } + } + }, + { + "static": false, + "w": 4, + "moved": false, + "h": 4, + "x": 0, + "y": 14, + "i": "s5e6f7890-1234-5678-ef01-12345678s5", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "disks", + "id": "{{dataStreams.disks}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": ["{{configId}}"], + "title": "Disk Health (SMART Status)", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "name", + "status", + "model", + "manufacturer", + "mediaType", + "size", + "smartCapable", + "partitionCount" + ], + "hiddenColumns": ["deviceId", "interfaceType"], + "transpose": false + } + } + } + } + } + ] + } +} diff --git a/plugins/NinjaOne/v1/docs/README.md b/plugins/NinjaOne/v1/docs/README.md new file mode 100644 index 0000000..3d2ab83 --- /dev/null +++ b/plugins/NinjaOne/v1/docs/README.md @@ -0,0 +1,89 @@ +# Before you start + +To use this data source, you will need to create OAuth2 API credentials in your NinjaOne portal. + +## Create NinjaOne API Credentials + +1. Log in to your NinjaOne portal +2. Navigate to **Administration** > **API** > **Add Application** +3. Configure the application: + - **Application Name**: Enter a descriptive name (e.g., "SquaredUp Integration") + - **Allowed Grant Types**: Ensure "Client Credentials" is enabled + - **Scopes**: Select the following scopes: + - `monitoring` - Required for device monitoring data + - `management` - Required for management operations + - `control` - Required for control operations + - `offline_access` - Required for refresh tokens +4. Click **Create Application** +5. Copy the **Client ID** and **Client Secret** - you will need these when configuring the plugin in SquaredUp + +## Configure the Plugin in SquaredUp + +When adding the NinjaOne data source in SquaredUp, you will need to provide: + +1. **Region**: Select your NinjaOne instance region (US, EU, Canada, or OC). The API URL will be automatically configured based on your selection. + +2. **Client ID**: Paste the Client ID from your NinjaOne API application + +3. **Client Secret**: Paste the Client Secret from your NinjaOne API application + +That's it! The plugin will automatically authenticate using Client Credentials flow when you save the configuration. + +## Available Data Streams + +This plugin provides the following data streams for monitoring your NinjaOne environment: + +### Core Monitoring + +- **Devices** - All managed devices with status and organization details +- **Alerts** - Active alerts across all devices +- **Policies** - Configuration policies applied to devices +- **Organizations** - Customer/organization information +- **Activities** - Recent activity log +- **Device Groups** - Device groups for filtering and organization +- **Locations** - Organization locations and sites + +### Health & Security + +- **Device Health** - Comprehensive health overview including threats, patches, and vulnerabilities +- **Antivirus Status** - Antivirus product status and definition updates +- **Antivirus Threats** - Detected antivirus threats with quarantine status +- **OS Patches** - OS patch compliance with pending, failed, and installed status +- **Software Patches** - Third-party software patch compliance (Chrome, Adobe, etc.) +- **Volumes** - Disk volumes with capacity, free space, and BitLocker status +- **Backup Usage** - Backup storage usage by organization and location + +### System Information + +- **Disks** - Physical disk inventory with SMART status +- **Network Interfaces** - Network adapters with IP, MAC, and link speed +- **Processors** - CPU information and specifications +- **Operating Systems** - OS details with reboot requirements +- **Computer Systems** - Hardware information including manufacturer, model, and serial number +- **Software** - Installed software inventory +- **Windows Services** - Windows service status and configurations +- **Logged On Users** - Last logged-on user activity + +### Operations & Automation + +- **Tasks** - Scheduled and running automation tasks +- **Jobs** - Script and patch job execution status +- **Policy Overrides** - Device policy exceptions and overrides + +### Ticketing + +- **Ticket Boards** - Ticketing boards for organizing and viewing tickets +- **Tickets** - Tickets from a specific board (scoped to Ticket Board) + +## Troubleshooting + +**Authentication Failed**: Ensure your Client ID and Client Secret are correct and that "Client Credentials" is enabled as an allowed grant type in your NinjaOne API application. + +**No Data Returned**: Verify that the selected API Region matches your NinjaOne instance region. + +**Insufficient Permissions**: Ensure the API application has all required scopes (`monitoring`, `management`, `control`, `offline_access`). + +## Additional Resources + +- [NinjaOne API Documentation](https://app.ninjarmm.com/apidocs/) +- [NinjaOne Support](https://support.ninjaone.com/) diff --git a/plugins/NinjaOne/v1/icon.png b/plugins/NinjaOne/v1/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fa9f59446512a3c09478124ecad3837af54c9c58 GIT binary patch literal 4845 zcmeHLX+Trg5>xr|6^SOYD2oteHxLMWlMq56@7(siKkxVZSASei?m1`X%zQKR%{^Q@;^e5Y zL~jWIK;yvvJYfy zDw=z&${83tzA-bYOr3PxR)a8!1rgWcQeN{ukNEJKTZoIUTusw7EWK0-*tP{My$6?k zFNoh3#Tj@XQ3C_pSD~-_-5#czKE9d3U|~9R6_ArTLx0VvTg7jdIrvb1dcKXeUDlLd zJvEQ282ME1C7sQUVIKY7J+W$*1^;rml{ZZsD;&=JsC-s{@nJs zwO*{?@JWyM;&bWO`9H#S1p!8xeHU<^iFU!4@M0#KTZTpP?q)0D*?-) z^_od>Deok4w4fP6N*ZocOWt;lu`t_#H^P5y074^z;++EBl&=mHP99!E-)Y72AKwN1vpbFOipc{sP`WL-nti2sKO% zp`(gjy5*wH+5TSYQ=`Za@{KHb)|{0OPnM$1gLo7cOAnVt{5hc+WK1x{5J-oZuY3Ix zAQrEWX0)iIo8!sEWX-1JnGf9Y!sx(mE5$l(Aj~Yzj=p$Dl|3+ao7~kEI+;51ng^ez zFy-XD?p%s-))hd{d$L(}t;uTa-neHh1jtSu!%{TX0>Zc_+0o}&dM^0Z)fozNsHoOHn#VYvHngYBCqEuVX~uvyxF4x92K=&Oyv)K6!Z6ci zQd#PNp1~ISHxx?dJ|!seS1BNA5TkVa4>aSjehc2aWI5c&nZ8!Qa6Fw}X%+MGN8*jU zW$H9-j8GX~UKx2_BnYQcF%AXqXgNYW@Hdu3L0k#*u z0W5fql+;rwaUjo)-_fCY`4w9pw_jLz;Cs4WZqa%N^xZAFWH1qx!Yd_SH=?$~M7$3C z4gi9#+2Yt0EImO9jNN*Z9uyrRK9dq=m!zi!@)dPxVLm)!^-4_ZRe-pjnI@N_I1L!| zm^IWxazNmurJd#3>1QU(wmY)f>C|H)oFV9QiRjd-42}NjxmjxD<55d2?0lwE!<}n= z7qcvGJo;V%(7)r5$(5wbY%D;o-`H`LJ=0a>lDKOF1{}$N#ad{CcM;)~RsgUPA1?j< zF%YK$kOfDEApm}T$NfL&0P$TobuH5>IO34u{5}9$>oQR0gE@h_vK)ZzP=~KB5@Q4f z&OjuRso{^HC8+!mEUjGS!eJ#q&`6yZ!Jv89r~yQ;P`$=W8%jd4O4yqH{HUY9SSxf` zL35u%w|mrU(zM|6i!B#lj%wkK!0CGE^&Swl8=n3Ucw0bc?&I6^!q?qOgL-1TFN87R z#w~E8=6eIXlOpU=90oM2qELPQ63bwDBT&M=V2hO-Tv`s7OopC$-mWalYHHm%pSMLo_}(I0A9UcuzkiU~-D$Q-FnfqBxZoC5{xa`*Z|?^O z^52y2ajN0=M+!x!8`94YxlhNLXt#OuAUs?DGR6>iBOZ`_p)7~pVi4s!{>C$wV|{RA z<~G<;fks^E>G?=i(;^HJ)-p2heFzUM_JP+EY-p)uAu zyX+p!^0vnsNzgoHz#K9n@U@|5yakRmyMrbpx=FtHjqAvDOQ7uZN7qbIE%~oCh>lC* zwk@{U{T3Y<ZdGW0(?$V7$_L2g!2?P8Q{1m9_OwFA-L_69cvjAzy!#_7#OpjI@X^ zKY_qs)UDcp5>r8qxs8f<>1qt&=I4=sW%J?GjGzu;H?(! zlTG+(09oQeqlg2i!5f-t`$S+;xJ8Vo2vtf*P4KYzTu=>#{-JN(43L zo)zl=qfi|9Y*dRL48s!_@1B^t*Y)iO&TQnGEqI88Zon>A|8aNBlx?2kSraIJDf?X8 zC@gDem8+eKa2*CPz2~bb2^czF0h9~Tz&}&rrcN^SG1A`vV(umrWK{Nhg0ASbhEO5> z&=kf#W7!)P`A$UMv ztrfjj4e&1olK(RfQ_5PV3F}eR%_Bg*7gqs<{Ro?uts)TOF#yCWfzVoiB$oO=x2q1L zJdBD;EI`(TC@;q;eZ6x118 Date: Tue, 7 Apr 2026 10:20:41 +0100 Subject: [PATCH 2/8] fix duplicate tile placement --- plugins/NinjaOne/v1/defaultContent/backupManagement.dash.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/NinjaOne/v1/defaultContent/backupManagement.dash.json b/plugins/NinjaOne/v1/defaultContent/backupManagement.dash.json index 32caa4b..67da02d 100644 --- a/plugins/NinjaOne/v1/defaultContent/backupManagement.dash.json +++ b/plugins/NinjaOne/v1/defaultContent/backupManagement.dash.json @@ -128,7 +128,7 @@ "w": 1, "moved": false, "h": 2, - "x": 2, + "x": 3, "y": 0, "i": "backup-kpi-locations-004", "z": 0, From 28483ce951fb150b95a6e71824d513b15284e3cc Mon Sep 17 00:00:00 2001 From: Daniel Watts <34212312+Deenk@users.noreply.github.com> Date: Tue, 7 Apr 2026 10:21:44 +0100 Subject: [PATCH 3/8] add tags --- plugins/NinjaOne/v1/dataStreams/activities.json | 1 + plugins/NinjaOne/v1/dataStreams/alerts.json | 1 + plugins/NinjaOne/v1/dataStreams/antivirusStatus.json | 1 + plugins/NinjaOne/v1/dataStreams/antivirusThreats.json | 1 + plugins/NinjaOne/v1/dataStreams/backupJobs.json | 1 + plugins/NinjaOne/v1/dataStreams/backupUsage.json | 1 + plugins/NinjaOne/v1/dataStreams/computerSystems.json | 1 + plugins/NinjaOne/v1/dataStreams/deviceGroups.json | 1 + plugins/NinjaOne/v1/dataStreams/deviceHealth.json | 1 + plugins/NinjaOne/v1/dataStreams/devices.json | 1 + plugins/NinjaOne/v1/dataStreams/disks.json | 1 + plugins/NinjaOne/v1/dataStreams/health.json | 1 + plugins/NinjaOne/v1/dataStreams/jobs.json | 1 + plugins/NinjaOne/v1/dataStreams/locationDevices.json | 1 + plugins/NinjaOne/v1/dataStreams/locations.json | 1 + plugins/NinjaOne/v1/dataStreams/loggedOnUsers.json | 1 + plugins/NinjaOne/v1/dataStreams/networkInterfaces.json | 1 + plugins/NinjaOne/v1/dataStreams/operatingSystems.json | 1 + plugins/NinjaOne/v1/dataStreams/organizationDevices.json | 1 + plugins/NinjaOne/v1/dataStreams/organizationLocations.json | 1 + plugins/NinjaOne/v1/dataStreams/organizations.json | 1 + plugins/NinjaOne/v1/dataStreams/osPatches.json | 1 + plugins/NinjaOne/v1/dataStreams/policies.json | 1 + plugins/NinjaOne/v1/dataStreams/policyOverrides.json | 1 + plugins/NinjaOne/v1/dataStreams/processors.json | 1 + plugins/NinjaOne/v1/dataStreams/software.json | 1 + plugins/NinjaOne/v1/dataStreams/softwareGlobal.json | 1 + plugins/NinjaOne/v1/dataStreams/softwarePatches.json | 1 + plugins/NinjaOne/v1/dataStreams/tasks.json | 1 + plugins/NinjaOne/v1/dataStreams/ticketBoards.json | 1 + plugins/NinjaOne/v1/dataStreams/tickets.json | 1 + plugins/NinjaOne/v1/dataStreams/volumes.json | 1 + plugins/NinjaOne/v1/dataStreams/volumesGlobal.json | 1 + plugins/NinjaOne/v1/dataStreams/windowsServices.json | 1 + 34 files changed, 34 insertions(+) diff --git a/plugins/NinjaOne/v1/dataStreams/activities.json b/plugins/NinjaOne/v1/dataStreams/activities.json index ef5efda..82dcfe0 100644 --- a/plugins/NinjaOne/v1/dataStreams/activities.json +++ b/plugins/NinjaOne/v1/dataStreams/activities.json @@ -1,6 +1,7 @@ { "name": "activities", "displayName": "Activities", + "tags": ["Monitoring"], "baseDataSourceName": "httpRequestUnscoped", "config": { "httpMethod": "get", diff --git a/plugins/NinjaOne/v1/dataStreams/alerts.json b/plugins/NinjaOne/v1/dataStreams/alerts.json index 8402e2f..f6e6e5d 100644 --- a/plugins/NinjaOne/v1/dataStreams/alerts.json +++ b/plugins/NinjaOne/v1/dataStreams/alerts.json @@ -1,6 +1,7 @@ { "name": "alerts", "displayName": "Alerts", + "tags": ["Monitoring"], "description": "Active alerts and triggered conditions", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/antivirusStatus.json b/plugins/NinjaOne/v1/dataStreams/antivirusStatus.json index a1315cf..e12c25e 100644 --- a/plugins/NinjaOne/v1/dataStreams/antivirusStatus.json +++ b/plugins/NinjaOne/v1/dataStreams/antivirusStatus.json @@ -1,6 +1,7 @@ { "name": "antivirusStatus", "displayName": "Antivirus Status", + "tags": ["Security"], "description": "Antivirus product status and definition updates", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/antivirusThreats.json b/plugins/NinjaOne/v1/dataStreams/antivirusThreats.json index 861860e..2412044 100644 --- a/plugins/NinjaOne/v1/dataStreams/antivirusThreats.json +++ b/plugins/NinjaOne/v1/dataStreams/antivirusThreats.json @@ -1,6 +1,7 @@ { "name": "antivirusThreats", "displayName": "Antivirus Threats", + "tags": ["Security"], "description": "Detected antivirus threats with quarantine status", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/backupJobs.json b/plugins/NinjaOne/v1/dataStreams/backupJobs.json index 03802f9..392f2d7 100644 --- a/plugins/NinjaOne/v1/dataStreams/backupJobs.json +++ b/plugins/NinjaOne/v1/dataStreams/backupJobs.json @@ -1,6 +1,7 @@ { "name": "backupJobs", "displayName": "Backup Jobs", + "tags": ["Backup"], "description": "Backup job execution history and status", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/backupUsage.json b/plugins/NinjaOne/v1/dataStreams/backupUsage.json index 4c8b402..54a7be0 100644 --- a/plugins/NinjaOne/v1/dataStreams/backupUsage.json +++ b/plugins/NinjaOne/v1/dataStreams/backupUsage.json @@ -1,6 +1,7 @@ { "name": "backupUsage", "displayName": "Backup Usage", + "tags": ["Backup"], "description": "Backup storage usage by device with organization and location details", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/computerSystems.json b/plugins/NinjaOne/v1/dataStreams/computerSystems.json index c98d23f..81f60e6 100644 --- a/plugins/NinjaOne/v1/dataStreams/computerSystems.json +++ b/plugins/NinjaOne/v1/dataStreams/computerSystems.json @@ -1,6 +1,7 @@ { "name": "computerSystems", "displayName": "Computer Systems", + "tags": ["Monitoring"], "description": "Hardware information including manufacturer, model, and serial number", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/deviceGroups.json b/plugins/NinjaOne/v1/dataStreams/deviceGroups.json index af7938c..b369562 100644 --- a/plugins/NinjaOne/v1/dataStreams/deviceGroups.json +++ b/plugins/NinjaOne/v1/dataStreams/deviceGroups.json @@ -1,6 +1,7 @@ { "name": "deviceGroups", "displayName": "Device Groups", + "tags": ["Monitoring"], "description": "Device groups for filtering and organization", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/deviceHealth.json b/plugins/NinjaOne/v1/dataStreams/deviceHealth.json index fc15b19..8524f2a 100644 --- a/plugins/NinjaOne/v1/dataStreams/deviceHealth.json +++ b/plugins/NinjaOne/v1/dataStreams/deviceHealth.json @@ -1,6 +1,7 @@ { "name": "deviceHealth", "displayName": "Device Health", + "tags": ["Monitoring"], "description": "Device health overview including threats, patches, and vulnerabilities", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/devices.json b/plugins/NinjaOne/v1/dataStreams/devices.json index ca3a78f..91b7236 100644 --- a/plugins/NinjaOne/v1/dataStreams/devices.json +++ b/plugins/NinjaOne/v1/dataStreams/devices.json @@ -1,6 +1,7 @@ { "name": "devices", "displayName": "Devices", + "tags": ["Monitoring"], "baseDataSourceName": "httpRequestUnscoped", "config": { "httpMethod": "get", diff --git a/plugins/NinjaOne/v1/dataStreams/disks.json b/plugins/NinjaOne/v1/dataStreams/disks.json index da92773..6554b08 100644 --- a/plugins/NinjaOne/v1/dataStreams/disks.json +++ b/plugins/NinjaOne/v1/dataStreams/disks.json @@ -1,6 +1,7 @@ { "name": "disks", "displayName": "Disks", + "tags": ["Monitoring"], "description": "Physical disk inventory with SMART status", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/health.json b/plugins/NinjaOne/v1/dataStreams/health.json index c4d756a..93bd64c 100644 --- a/plugins/NinjaOne/v1/dataStreams/health.json +++ b/plugins/NinjaOne/v1/dataStreams/health.json @@ -1,6 +1,7 @@ { "name": "health", "displayName": "Health", + "tags": ["Monitoring"], "description": "Device health status", "baseDataSourceName": "httpRequestScoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/jobs.json b/plugins/NinjaOne/v1/dataStreams/jobs.json index 3cc3157..f188db4 100644 --- a/plugins/NinjaOne/v1/dataStreams/jobs.json +++ b/plugins/NinjaOne/v1/dataStreams/jobs.json @@ -1,6 +1,7 @@ { "name": "jobs", "displayName": "Jobs", + "tags": ["Monitoring"], "description": "Script and patch job execution status", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/locationDevices.json b/plugins/NinjaOne/v1/dataStreams/locationDevices.json index bdce174..c07fcd2 100644 --- a/plugins/NinjaOne/v1/dataStreams/locationDevices.json +++ b/plugins/NinjaOne/v1/dataStreams/locationDevices.json @@ -1,6 +1,7 @@ { "name": "locationDevices", "displayName": "Location Devices", + "tags": ["Monitoring"], "description": "Devices for a specific location", "baseDataSourceName": "httpRequestScoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/locations.json b/plugins/NinjaOne/v1/dataStreams/locations.json index d6e2ea7..b41a3ab 100644 --- a/plugins/NinjaOne/v1/dataStreams/locations.json +++ b/plugins/NinjaOne/v1/dataStreams/locations.json @@ -1,6 +1,7 @@ { "name": "locations", "displayName": "Locations", + "tags": ["Monitoring"], "description": "Organization locations and sites", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/loggedOnUsers.json b/plugins/NinjaOne/v1/dataStreams/loggedOnUsers.json index 47e26a1..2bc98f8 100644 --- a/plugins/NinjaOne/v1/dataStreams/loggedOnUsers.json +++ b/plugins/NinjaOne/v1/dataStreams/loggedOnUsers.json @@ -1,6 +1,7 @@ { "name": "loggedOnUsers", "displayName": "Logged On Users", + "tags": ["Monitoring"], "description": "Last logged-on user activity", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/networkInterfaces.json b/plugins/NinjaOne/v1/dataStreams/networkInterfaces.json index a1d25fd..6b6af53 100644 --- a/plugins/NinjaOne/v1/dataStreams/networkInterfaces.json +++ b/plugins/NinjaOne/v1/dataStreams/networkInterfaces.json @@ -1,6 +1,7 @@ { "name": "networkInterfaces", "displayName": "Network Interfaces", + "tags": ["Monitoring"], "description": "Network adapters with IP, MAC, and link speed", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/operatingSystems.json b/plugins/NinjaOne/v1/dataStreams/operatingSystems.json index f25f18e..a107fdd 100644 --- a/plugins/NinjaOne/v1/dataStreams/operatingSystems.json +++ b/plugins/NinjaOne/v1/dataStreams/operatingSystems.json @@ -1,6 +1,7 @@ { "name": "operatingSystems", "displayName": "Operating Systems", + "tags": ["Monitoring"], "description": "OS details with reboot requirements", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/organizationDevices.json b/plugins/NinjaOne/v1/dataStreams/organizationDevices.json index bfb2e0b..bf8ce9e 100644 --- a/plugins/NinjaOne/v1/dataStreams/organizationDevices.json +++ b/plugins/NinjaOne/v1/dataStreams/organizationDevices.json @@ -1,6 +1,7 @@ { "name": "organizationDevices", "displayName": "Organization Devices", + "tags": ["Monitoring"], "description": "Devices for a specific organization", "baseDataSourceName": "httpRequestScoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/organizationLocations.json b/plugins/NinjaOne/v1/dataStreams/organizationLocations.json index d09b047..ab4daf6 100644 --- a/plugins/NinjaOne/v1/dataStreams/organizationLocations.json +++ b/plugins/NinjaOne/v1/dataStreams/organizationLocations.json @@ -1,6 +1,7 @@ { "name": "organizationLocations", "displayName": "Organization Locations", + "tags": ["Monitoring"], "description": "Locations for a specific organization", "baseDataSourceName": "httpRequestScoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/organizations.json b/plugins/NinjaOne/v1/dataStreams/organizations.json index c6ae3fb..2bfb804 100644 --- a/plugins/NinjaOne/v1/dataStreams/organizations.json +++ b/plugins/NinjaOne/v1/dataStreams/organizations.json @@ -1,6 +1,7 @@ { "name": "organizations", "displayName": "Organizations", + "tags": ["Monitoring"], "baseDataSourceName": "httpRequestUnscoped", "config": { "httpMethod": "get", diff --git a/plugins/NinjaOne/v1/dataStreams/osPatches.json b/plugins/NinjaOne/v1/dataStreams/osPatches.json index abb7f9d..aa7b80b 100644 --- a/plugins/NinjaOne/v1/dataStreams/osPatches.json +++ b/plugins/NinjaOne/v1/dataStreams/osPatches.json @@ -1,6 +1,7 @@ { "name": "osPatches", "displayName": "OS Patches", + "tags": ["Security"], "description": "OS patch compliance status including pending, failed, and installed patches", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/policies.json b/plugins/NinjaOne/v1/dataStreams/policies.json index 91ecc22..f7b49b3 100644 --- a/plugins/NinjaOne/v1/dataStreams/policies.json +++ b/plugins/NinjaOne/v1/dataStreams/policies.json @@ -1,6 +1,7 @@ { "name": "policies", "displayName": "Policies", + "tags": ["Monitoring"], "baseDataSourceName": "httpRequestUnscoped", "config": { "httpMethod": "get", diff --git a/plugins/NinjaOne/v1/dataStreams/policyOverrides.json b/plugins/NinjaOne/v1/dataStreams/policyOverrides.json index 5250a84..771293f 100644 --- a/plugins/NinjaOne/v1/dataStreams/policyOverrides.json +++ b/plugins/NinjaOne/v1/dataStreams/policyOverrides.json @@ -1,6 +1,7 @@ { "name": "policyOverrides", "displayName": "Policy Overrides", + "tags": ["Monitoring"], "description": "Device policy exceptions and overrides", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/processors.json b/plugins/NinjaOne/v1/dataStreams/processors.json index 479ca0e..b4e90f2 100644 --- a/plugins/NinjaOne/v1/dataStreams/processors.json +++ b/plugins/NinjaOne/v1/dataStreams/processors.json @@ -1,6 +1,7 @@ { "name": "processors", "displayName": "Processors", + "tags": ["Monitoring"], "description": "CPU information and specifications", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/software.json b/plugins/NinjaOne/v1/dataStreams/software.json index bd3f892..5205126 100644 --- a/plugins/NinjaOne/v1/dataStreams/software.json +++ b/plugins/NinjaOne/v1/dataStreams/software.json @@ -1,6 +1,7 @@ { "name": "software", "displayName": "Software", + "tags": ["Security"], "description": "Installed software inventory", "baseDataSourceName": "httpRequestScoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/softwareGlobal.json b/plugins/NinjaOne/v1/dataStreams/softwareGlobal.json index 28b606f..59b18ae 100644 --- a/plugins/NinjaOne/v1/dataStreams/softwareGlobal.json +++ b/plugins/NinjaOne/v1/dataStreams/softwareGlobal.json @@ -1,6 +1,7 @@ { "name": "softwareGlobal", "displayName": "Software (Global)", + "tags": ["Security"], "description": "Global software inventory across all devices", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/softwarePatches.json b/plugins/NinjaOne/v1/dataStreams/softwarePatches.json index 04fabfb..aefa140 100644 --- a/plugins/NinjaOne/v1/dataStreams/softwarePatches.json +++ b/plugins/NinjaOne/v1/dataStreams/softwarePatches.json @@ -1,6 +1,7 @@ { "name": "softwarePatches", "displayName": "Software Patches", + "tags": ["Security"], "description": "Third-party software patch compliance status including pending, failed, and installed patches", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/tasks.json b/plugins/NinjaOne/v1/dataStreams/tasks.json index 4cb5201..e47109b 100644 --- a/plugins/NinjaOne/v1/dataStreams/tasks.json +++ b/plugins/NinjaOne/v1/dataStreams/tasks.json @@ -1,6 +1,7 @@ { "name": "tasks", "displayName": "Tasks", + "tags": ["Monitoring"], "description": "Scheduled and running automation tasks", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/ticketBoards.json b/plugins/NinjaOne/v1/dataStreams/ticketBoards.json index 6beb110..382bb5d 100644 --- a/plugins/NinjaOne/v1/dataStreams/ticketBoards.json +++ b/plugins/NinjaOne/v1/dataStreams/ticketBoards.json @@ -1,6 +1,7 @@ { "name": "ticketBoards", "displayName": "Ticket Boards", + "tags": ["Ticketing"], "description": "Ticketing boards for organizing and viewing tickets", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/tickets.json b/plugins/NinjaOne/v1/dataStreams/tickets.json index b214cc6..07f16c8 100644 --- a/plugins/NinjaOne/v1/dataStreams/tickets.json +++ b/plugins/NinjaOne/v1/dataStreams/tickets.json @@ -1,6 +1,7 @@ { "name": "tickets", "displayName": "Tickets", + "tags": ["Ticketing"], "description": "Tickets from a specific board", "baseDataSourceName": "httpRequestScoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/volumes.json b/plugins/NinjaOne/v1/dataStreams/volumes.json index d5befae..f7e24aa 100644 --- a/plugins/NinjaOne/v1/dataStreams/volumes.json +++ b/plugins/NinjaOne/v1/dataStreams/volumes.json @@ -1,6 +1,7 @@ { "name": "volumes", "displayName": "Volumes", + "tags": ["Security"], "description": "Disk volumes with capacity, free space, and BitLocker status", "baseDataSourceName": "httpRequestScoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/volumesGlobal.json b/plugins/NinjaOne/v1/dataStreams/volumesGlobal.json index e18e6e8..8dd019d 100644 --- a/plugins/NinjaOne/v1/dataStreams/volumesGlobal.json +++ b/plugins/NinjaOne/v1/dataStreams/volumesGlobal.json @@ -1,6 +1,7 @@ { "name": "volumesGlobal", "displayName": "Volumes (Global)", + "tags": ["Security"], "description": "Global disk volume report across all devices", "baseDataSourceName": "httpRequestUnscoped", "config": { diff --git a/plugins/NinjaOne/v1/dataStreams/windowsServices.json b/plugins/NinjaOne/v1/dataStreams/windowsServices.json index 8328a9e..a356b47 100644 --- a/plugins/NinjaOne/v1/dataStreams/windowsServices.json +++ b/plugins/NinjaOne/v1/dataStreams/windowsServices.json @@ -1,6 +1,7 @@ { "name": "windowsServices", "displayName": "Windows Services", + "tags": ["Monitoring"], "description": "Windows service status and configurations", "baseDataSourceName": "httpRequestUnscoped", "config": { From ce672b02233423bee8691d3ab4843de163f6308b Mon Sep 17 00:00:00 2001 From: Daniel Watts <34212312+Deenk@users.noreply.github.com> Date: Tue, 7 Apr 2026 10:25:39 +0100 Subject: [PATCH 4/8] remove arrayCursor --- .../v1/dataStreams/organizationDevices.json | 1 - .../v1/dataStreams/scripts/arrayCursor.js | 11 ----------- .../NinjaOne/v1/dataStreams/scripts/devices.js | 17 ++++++++++++++++- plugins/NinjaOne/v1/metadata.json | 2 +- 4 files changed, 17 insertions(+), 14 deletions(-) delete mode 100644 plugins/NinjaOne/v1/dataStreams/scripts/arrayCursor.js diff --git a/plugins/NinjaOne/v1/dataStreams/organizationDevices.json b/plugins/NinjaOne/v1/dataStreams/organizationDevices.json index bf8ce9e..39e0426 100644 --- a/plugins/NinjaOne/v1/dataStreams/organizationDevices.json +++ b/plugins/NinjaOne/v1/dataStreams/organizationDevices.json @@ -24,7 +24,6 @@ }, "expandInnerObjects": true, "endpointPath": "/v2/organization/{{objects[0].organizationId}}/devices", - "preRequestScript": "arrayCursor.js", "postRequestScript": "devices.js", "pathToData": "results", "getArgs": [], diff --git a/plugins/NinjaOne/v1/dataStreams/scripts/arrayCursor.js b/plugins/NinjaOne/v1/dataStreams/scripts/arrayCursor.js deleted file mode 100644 index d8e5e8a..0000000 --- a/plugins/NinjaOne/v1/dataStreams/scripts/arrayCursor.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Generic script to handle pagination for NinjaOne array-based endpoints. - * - * It takes the flat response array AND converts it into a "results" array - * alongside a "next_page_token" which is the ID of the last element. - */ -const items = Array.isArray(data) ? data : []; -result = { - results: items, - next_page_token: items.length > 0 ? items[items.length - 1].id : null -}; diff --git a/plugins/NinjaOne/v1/dataStreams/scripts/devices.js b/plugins/NinjaOne/v1/dataStreams/scripts/devices.js index c780ab5..ab56ed3 100644 --- a/plugins/NinjaOne/v1/dataStreams/scripts/devices.js +++ b/plugins/NinjaOne/v1/dataStreams/scripts/devices.js @@ -27,7 +27,7 @@ const convertTimestamps = (obj) => { return obj; }; -result = items.map(item => { +const processedItems = items.map(item => { // Recursively convert timestamps in the item (modifies in place but we are mapping to a new object) const converted = convertTimestamps(item); @@ -42,3 +42,18 @@ result = items.map(item => { locationId: converted.locationId ? converted.locationId.toString() : null }; }); + +// For flat array responses (like /v2/organization/{id}/devices), wrap the output +// so pagination can find `next_page_token` and `results`. +// For already wrapped responses (like /v2/devices), return an array and preserve metadata. +if (Array.isArray(data)) { + result = { + results: processedItems, + next_page_token: processedItems.length > 0 ? processedItems[processedItems.length - 1].id : null + }; +} else { + result = processedItems; + if (data && data.metadata) { + result.metadata = data.metadata; + } +} diff --git a/plugins/NinjaOne/v1/metadata.json b/plugins/NinjaOne/v1/metadata.json index c2a0d52..92d903e 100644 --- a/plugins/NinjaOne/v1/metadata.json +++ b/plugins/NinjaOne/v1/metadata.json @@ -1,7 +1,7 @@ { "name": "ninja-one", "displayName": "NinjaOne", - "version": "1.1.0", + "version": "1.1.1", "author": { "name": "SquaredUp Labs", "type": "labs" From c98ec16b13fc7fa6bdca4c763d3bff9b4fc0b1b0 Mon Sep 17 00:00:00 2001 From: Daniel Watts <34212312+Deenk@users.noreply.github.com> Date: Tue, 7 Apr 2026 10:49:51 +0100 Subject: [PATCH 5/8] fix multiple radio buttons in ui --- plugins/NinjaOne/v1/metadata.json | 4 ++-- plugins/NinjaOne/v1/ui.json | 32 ++----------------------------- 2 files changed, 4 insertions(+), 32 deletions(-) diff --git a/plugins/NinjaOne/v1/metadata.json b/plugins/NinjaOne/v1/metadata.json index 92d903e..bf6f455 100644 --- a/plugins/NinjaOne/v1/metadata.json +++ b/plugins/NinjaOne/v1/metadata.json @@ -1,7 +1,7 @@ { "name": "ninja-one", "displayName": "NinjaOne", - "version": "1.1.1", + "version": "1.1.3", "author": { "name": "SquaredUp Labs", "type": "labs" @@ -21,7 +21,7 @@ "baseUrl": "{{apiBaseUrl}}", "oauth2ClientId": "{{clientId}}", "oauth2ClientSecret": "{{clientSecret}}", - "oauth2TokenUrl": "{{instanceUrl}}/oauth/token", + "oauth2TokenUrl": "{{apiBaseUrl}}/oauth/token", "oauth2ClientSecretLocationDuringAuth": "body", "oauth2Scope": "monitoring management control offline_access" } diff --git a/plugins/NinjaOne/v1/ui.json b/plugins/NinjaOne/v1/ui.json index ab4dc8d..7c01795 100644 --- a/plugins/NinjaOne/v1/ui.json +++ b/plugins/NinjaOne/v1/ui.json @@ -1,37 +1,9 @@ [ - { - "type": "radio", - "name": "instanceUrl", - "label": "Region", - "help": "Select your NinjaOne instance region", - "defaultValue": "https://ca.ninjarmm.com", - "options": [ - { - "value": "https://app.ninjarmm.com", - "label": "US" - }, - { - "value": "https://eu.ninjarmm.com", - "label": "EU" - }, - { - "value": "https://ca.ninjarmm.com", - "label": "Canada" - }, - { - "value": "https://oc.ninjarmm.com", - "label": "OC" - } - ], - "validation": { - "required": true - } - }, { "type": "radio", "name": "apiBaseUrl", - "label": "API Region", - "help": "Confirm the API region for your instance", + "label": "Region", + "help": "Select your NinjaOne region", "defaultValue": "https://ca-api.ninjarmm.com", "options": [ { From 2bc23b1814c810c05282b2a6585db94501a9c407 Mon Sep 17 00:00:00 2001 From: Daniel Watts <34212312+Deenk@users.noreply.github.com> Date: Tue, 7 Apr 2026 11:10:04 +0100 Subject: [PATCH 6/8] revert ui changes --- plugins/NinjaOne/v1/metadata.json | 4 ++-- plugins/NinjaOne/v1/ui.json | 25 ++++++++++++++++++------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/plugins/NinjaOne/v1/metadata.json b/plugins/NinjaOne/v1/metadata.json index bf6f455..a1054c8 100644 --- a/plugins/NinjaOne/v1/metadata.json +++ b/plugins/NinjaOne/v1/metadata.json @@ -1,7 +1,7 @@ { "name": "ninja-one", "displayName": "NinjaOne", - "version": "1.1.3", + "version": "1.1.4", "author": { "name": "SquaredUp Labs", "type": "labs" @@ -21,7 +21,7 @@ "baseUrl": "{{apiBaseUrl}}", "oauth2ClientId": "{{clientId}}", "oauth2ClientSecret": "{{clientSecret}}", - "oauth2TokenUrl": "{{apiBaseUrl}}/oauth/token", + "oauth2TokenUrl": "{{instanceUrl}}/oauth/token", "oauth2ClientSecretLocationDuringAuth": "body", "oauth2Scope": "monitoring management control offline_access" } diff --git a/plugins/NinjaOne/v1/ui.json b/plugins/NinjaOne/v1/ui.json index 7c01795..426ee82 100644 --- a/plugins/NinjaOne/v1/ui.json +++ b/plugins/NinjaOne/v1/ui.json @@ -1,25 +1,25 @@ [ { "type": "radio", - "name": "apiBaseUrl", + "name": "instanceUrl", "label": "Region", - "help": "Select your NinjaOne region", - "defaultValue": "https://ca-api.ninjarmm.com", + "help": "Select your NinjaOne instance region", + "defaultValue": "https://ca.ninjarmm.com", "options": [ { - "value": "https://api.ninjarmm.com", + "value": "https://app.ninjarmm.com", "label": "US" }, { - "value": "https://eu-api.ninjarmm.com", + "value": "https://eu.ninjarmm.com", "label": "EU" }, { - "value": "https://ca-api.ninjarmm.com", + "value": "https://ca.ninjarmm.com", "label": "Canada" }, { - "value": "https://oc-api.ninjarmm.com", + "value": "https://oc.ninjarmm.com", "label": "OC" } ], @@ -27,6 +27,17 @@ "required": true } }, + { + "type": "text", + "name": "apiBaseUrl", + "label": "API Region", + "help": "Enter the API URL mapped to your region (US: https://api.ninjarmm.com, EU: https://eu-api.ninjarmm.com, Canada: https://ca-api.ninjarmm.com, OC: https://oc-api.ninjarmm.com)", + "defaultValue": "https://ca-api.ninjarmm.com", + "placeholder": "https://ca-api.ninjarmm.com", + "validation": { + "required": true + } + }, { "type": "text", "name": "clientId", From f408f420520f6acb0f02fa5603cd1774b12c5889 Mon Sep 17 00:00:00 2001 From: Daniel Watts <34212312+Deenk@users.noreply.github.com> Date: Tue, 7 Apr 2026 11:12:24 +0100 Subject: [PATCH 7/8] Revert "revert ui changes" This reverts commit 2bc23b1814c810c05282b2a6585db94501a9c407. --- plugins/NinjaOne/v1/metadata.json | 4 ++-- plugins/NinjaOne/v1/ui.json | 25 +++++++------------------ 2 files changed, 9 insertions(+), 20 deletions(-) diff --git a/plugins/NinjaOne/v1/metadata.json b/plugins/NinjaOne/v1/metadata.json index a1054c8..bf6f455 100644 --- a/plugins/NinjaOne/v1/metadata.json +++ b/plugins/NinjaOne/v1/metadata.json @@ -1,7 +1,7 @@ { "name": "ninja-one", "displayName": "NinjaOne", - "version": "1.1.4", + "version": "1.1.3", "author": { "name": "SquaredUp Labs", "type": "labs" @@ -21,7 +21,7 @@ "baseUrl": "{{apiBaseUrl}}", "oauth2ClientId": "{{clientId}}", "oauth2ClientSecret": "{{clientSecret}}", - "oauth2TokenUrl": "{{instanceUrl}}/oauth/token", + "oauth2TokenUrl": "{{apiBaseUrl}}/oauth/token", "oauth2ClientSecretLocationDuringAuth": "body", "oauth2Scope": "monitoring management control offline_access" } diff --git a/plugins/NinjaOne/v1/ui.json b/plugins/NinjaOne/v1/ui.json index 426ee82..7c01795 100644 --- a/plugins/NinjaOne/v1/ui.json +++ b/plugins/NinjaOne/v1/ui.json @@ -1,25 +1,25 @@ [ { "type": "radio", - "name": "instanceUrl", + "name": "apiBaseUrl", "label": "Region", - "help": "Select your NinjaOne instance region", - "defaultValue": "https://ca.ninjarmm.com", + "help": "Select your NinjaOne region", + "defaultValue": "https://ca-api.ninjarmm.com", "options": [ { - "value": "https://app.ninjarmm.com", + "value": "https://api.ninjarmm.com", "label": "US" }, { - "value": "https://eu.ninjarmm.com", + "value": "https://eu-api.ninjarmm.com", "label": "EU" }, { - "value": "https://ca.ninjarmm.com", + "value": "https://ca-api.ninjarmm.com", "label": "Canada" }, { - "value": "https://oc.ninjarmm.com", + "value": "https://oc-api.ninjarmm.com", "label": "OC" } ], @@ -27,17 +27,6 @@ "required": true } }, - { - "type": "text", - "name": "apiBaseUrl", - "label": "API Region", - "help": "Enter the API URL mapped to your region (US: https://api.ninjarmm.com, EU: https://eu-api.ninjarmm.com, Canada: https://ca-api.ninjarmm.com, OC: https://oc-api.ninjarmm.com)", - "defaultValue": "https://ca-api.ninjarmm.com", - "placeholder": "https://ca-api.ninjarmm.com", - "validation": { - "required": true - } - }, { "type": "text", "name": "clientId", From adc9b7957a7389bda89acbe7bb8ae3894f5b4f6f Mon Sep 17 00:00:00 2001 From: Daniel Watts <34212312+Deenk@users.noreply.github.com> Date: Tue, 7 Apr 2026 11:12:31 +0100 Subject: [PATCH 8/8] Revert "fix multiple radio buttons in ui" This reverts commit c98ec16b13fc7fa6bdca4c763d3bff9b4fc0b1b0. --- plugins/NinjaOne/v1/metadata.json | 4 ++-- plugins/NinjaOne/v1/ui.json | 32 +++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/plugins/NinjaOne/v1/metadata.json b/plugins/NinjaOne/v1/metadata.json index bf6f455..92d903e 100644 --- a/plugins/NinjaOne/v1/metadata.json +++ b/plugins/NinjaOne/v1/metadata.json @@ -1,7 +1,7 @@ { "name": "ninja-one", "displayName": "NinjaOne", - "version": "1.1.3", + "version": "1.1.1", "author": { "name": "SquaredUp Labs", "type": "labs" @@ -21,7 +21,7 @@ "baseUrl": "{{apiBaseUrl}}", "oauth2ClientId": "{{clientId}}", "oauth2ClientSecret": "{{clientSecret}}", - "oauth2TokenUrl": "{{apiBaseUrl}}/oauth/token", + "oauth2TokenUrl": "{{instanceUrl}}/oauth/token", "oauth2ClientSecretLocationDuringAuth": "body", "oauth2Scope": "monitoring management control offline_access" } diff --git a/plugins/NinjaOne/v1/ui.json b/plugins/NinjaOne/v1/ui.json index 7c01795..ab4dc8d 100644 --- a/plugins/NinjaOne/v1/ui.json +++ b/plugins/NinjaOne/v1/ui.json @@ -1,9 +1,37 @@ [ { "type": "radio", - "name": "apiBaseUrl", + "name": "instanceUrl", "label": "Region", - "help": "Select your NinjaOne region", + "help": "Select your NinjaOne instance region", + "defaultValue": "https://ca.ninjarmm.com", + "options": [ + { + "value": "https://app.ninjarmm.com", + "label": "US" + }, + { + "value": "https://eu.ninjarmm.com", + "label": "EU" + }, + { + "value": "https://ca.ninjarmm.com", + "label": "Canada" + }, + { + "value": "https://oc.ninjarmm.com", + "label": "OC" + } + ], + "validation": { + "required": true + } + }, + { + "type": "radio", + "name": "apiBaseUrl", + "label": "API Region", + "help": "Confirm the API region for your instance", "defaultValue": "https://ca-api.ninjarmm.com", "options": [ {