Skip to content

NinjaOne LCP#34

Merged
Deenk merged 53 commits into
mainfrom
ninjaone
May 14, 2026
Merged

NinjaOne LCP#34
Deenk merged 53 commits into
mainfrom
ninjaone

Conversation

@Deenk

@Deenk Deenk commented Apr 7, 2026

Copy link
Copy Markdown
Contributor

🔌 Plugin overview

  • Plugin name: NinjaOne
  • Purpose / problem solved: Enable squaredup users to monitor devices, endpoints, tickets via NinjaOne RMM
  • Primary audience (e.g. platform teams, SREs, product teams): Systems and helpdesk (Internal and MSP)
  • Authentication method(s) (e.g. OAuth, Username/Password, API Key): Oauth client secret and id

🖼️ Plugin screenshots

Plugin configuration

image image

Default dashboards

image

🧪 Testing

I have tested that every data stream returns unnested arrays and results. data types should all be correct for strings, numbers, dates


⚠️ Known limitations

There are a number of ninjaone modules/add ons based on the licence tier of the customer. I already support the backups and tickets modules, but there are 5/6 more I could add support for later.


📚 Checklist

  • Plugin, datastream and UI naming follow SquaredUp guidelines
  • Logo added
  • One or more dashboards added
  • README added including configuration guidance
  • No secrets or credentials included
  • I agree to the Code of Conduct

@Deenk Deenk added the new-plugin Used to PR newly added plugins label Apr 7, 2026
@Deenk Deenk marked this pull request as ready for review April 7, 2026 08:38
Comment thread plugins/NinjaOne/v1/metadata.json
Comment thread plugins/NinjaOne/v1/dataStreams/organizationDevices.json Outdated
Comment thread plugins/NinjaOne/v1/defaultContent/backupManagement.dash.json Outdated
Comment thread plugins/NinjaOne/v1/ui.json Outdated
Comment thread plugins/NinjaOne/v1/dataStreams/activities.json
@Deenk Deenk requested a review from clarkd April 7, 2026 10:14
@gdorward

gdorward commented Apr 7, 2026

Copy link
Copy Markdown

@Deenk , I seem to be running into repeated 500 errors on the Backup Management OOB dashboards. Looking at the logs, one of the offending endpoints seems to be https://ca-api.ninjarmm.com/v2/queries/backup/usage?pageSize=1000

ERROR {"message":"handler.readDataSource threw: 500 - Internal Server Error"

@AliceG-Sq AliceG-Sq self-requested a review April 8, 2026 09:06
@Deenk

Deenk commented Apr 8, 2026

Copy link
Copy Markdown
Contributor Author

@Deenk , I seem to be running into repeated 500 errors on the Backup Management OOB dashboards. Looking at the logs, one of the offending endpoints seems to be https://ca-api.ninjarmm.com/v2/queries/backup/usage?pageSize=1000

ERROR {"message":"handler.readDataSource threw: 500 - Internal Server Error"

@gdorward This is probably because our license expired for the 'backups' module in NinjaOne. I'll investigate if that truly is the case and either request they fix it, or fix whatever is broken on our side depending on who's fault it is

@Deenk Deenk self-assigned this Apr 8, 2026
@gdorward

gdorward commented Apr 9, 2026

Copy link
Copy Markdown

I'm getting this error on imports all of a sudden @Deenk - specifically importing devices:

{ "name": "Error", "message": "ID column 'deviceId' not found in data stream response. Available columns: results.0.id, results.0.uid, results.0.organizationId, results.0.locationId, results.0.nodeClass, results.0.nodeRoleId, results.0.rolePolicyId, results.0.approvalStatus, results.0.offline, results.0.systemName, results.0.dnsName, results.0.created, results.0.lastContact, results.0.lastUpdate, results.0.deviceId, results.0.displayName, results.1.id, results.1.uid, results.1.organizationId, results.1.locationId, results.1.nodeClass, results.1.nodeRoleId, results.1.rolePolicyId, results.1.approvalStatus, results.1.offline, results.1.systemName, results.1.dnsName, results.1.created, results.1.lastContact, results.1.lastUpdate, results.1.deviceId, results.1.displayName, metadata.next_page_token", "stack": "Error: ID column 'deviceId' not found in data stream response. Available columns: results.0.id, results.0.uid, results.0.organizationId, results.0.locationId, results.0.nodeClass, results.0.nodeRoleId, results.0.rolePolicyId, results.0.approvalStatus, results.0.offline, results.0.systemName, results.0.dnsName, results.0.created, results.0.lastContact, results.0.lastUpdate, results.0.deviceId, results.0.displayName, results.1.id, results.1.uid, results.1.organizationId, results.1.locationId, results.1.nodeClass, results.1.nodeRoleId, results.1.rolePolicyId, results.1.approvalStatus, results.1.offline, results.1.systemName, results.1.dnsName, results.1.created, results.1.lastContact, results.1.lastUpdate, results.1.deviceId, results.1.displayName, metadata.next_page_token at dUe (/src/stepExecutor/mapStreamDataToVertices.ts:62:15) at E1r (/src/stepExecutor/handler.ts:172:33) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async <anonymous> (/src/createMessageHandler.ts:74:13) at async Promise.all (index 0) at async <anonymous> (/src/createMessageHandler.ts:121:32) at async Hcr (/node_modules/.pnpm/@middy+core@2.5.7/node_modules/@middy/core/index.js:86:26)" }

@Deenk

Deenk commented Apr 9, 2026

Copy link
Copy Markdown
Contributor Author

I'm getting this error on imports all of a sudden @Deenk - specifically importing devices:

{ "name": "Error", "message": "ID column 'deviceId' not found in data stream response. Available columns: results.0.id, results.0.uid, results.0.organizationId, results.0.locationId, results.0.nodeClass, results.0.nodeRoleId, results.0.rolePolicyId, results.0.approvalStatus, results.0.offline, results.0.systemName, results.0.dnsName, results.0.created, results.0.lastContact, results.0.lastUpdate, results.0.deviceId, results.0.displayName, results.1.id, results.1.uid, results.1.organizationId, results.1.locationId, results.1.nodeClass, results.1.nodeRoleId, results.1.rolePolicyId, results.1.approvalStatus, results.1.offline, results.1.systemName, results.1.dnsName, results.1.created, results.1.lastContact, results.1.lastUpdate, results.1.deviceId, results.1.displayName, metadata.next_page_token", "stack": "Error: ID column 'deviceId' not found in data stream response. Available columns: results.0.id, results.0.uid, results.0.organizationId, results.0.locationId, results.0.nodeClass, results.0.nodeRoleId, results.0.rolePolicyId, results.0.approvalStatus, results.0.offline, results.0.systemName, results.0.dnsName, results.0.created, results.0.lastContact, results.0.lastUpdate, results.0.deviceId, results.0.displayName, results.1.id, results.1.uid, results.1.organizationId, results.1.locationId, results.1.nodeClass, results.1.nodeRoleId, results.1.rolePolicyId, results.1.approvalStatus, results.1.offline, results.1.systemName, results.1.dnsName, results.1.created, results.1.lastContact, results.1.lastUpdate, results.1.deviceId, results.1.displayName, metadata.next_page_token at dUe (/src/stepExecutor/mapStreamDataToVertices.ts:62:15) at E1r (/src/stepExecutor/handler.ts:172:33) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async <anonymous> (/src/createMessageHandler.ts:74:13) at async Promise.all (index 0) at async <anonymous> (/src/createMessageHandler.ts:121:32) at async Hcr (/node_modules/.pnpm/@middy+core@2.5.7/node_modules/@middy/core/index.js:86:26)" }

I broke this during my testing adding more devices, pushing a fix for this now

@Deenk

Deenk commented Apr 9, 2026

Copy link
Copy Markdown
Contributor Author

I'm getting this error on imports all of a sudden @Deenk - specifically importing devices:
{ "name": "Error", "message": "ID column 'deviceId' not found in data stream response. Available columns: results.0.id, results.0.uid, results.0.organizationId, results.0.locationId, results.0.nodeClass, results.0.nodeRoleId, results.0.rolePolicyId, results.0.approvalStatus, results.0.offline, results.0.systemName, results.0.dnsName, results.0.created, results.0.lastContact, results.0.lastUpdate, results.0.deviceId, results.0.displayName, results.1.id, results.1.uid, results.1.organizationId, results.1.locationId, results.1.nodeClass, results.1.nodeRoleId, results.1.rolePolicyId, results.1.approvalStatus, results.1.offline, results.1.systemName, results.1.dnsName, results.1.created, results.1.lastContact, results.1.lastUpdate, results.1.deviceId, results.1.displayName, metadata.next_page_token", "stack": "Error: ID column 'deviceId' not found in data stream response. Available columns: results.0.id, results.0.uid, results.0.organizationId, results.0.locationId, results.0.nodeClass, results.0.nodeRoleId, results.0.rolePolicyId, results.0.approvalStatus, results.0.offline, results.0.systemName, results.0.dnsName, results.0.created, results.0.lastContact, results.0.lastUpdate, results.0.deviceId, results.0.displayName, results.1.id, results.1.uid, results.1.organizationId, results.1.locationId, results.1.nodeClass, results.1.nodeRoleId, results.1.rolePolicyId, results.1.approvalStatus, results.1.offline, results.1.systemName, results.1.dnsName, results.1.created, results.1.lastContact, results.1.lastUpdate, results.1.deviceId, results.1.displayName, metadata.next_page_token at dUe (/src/stepExecutor/mapStreamDataToVertices.ts:62:15) at E1r (/src/stepExecutor/handler.ts:172:33) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async <anonymous> (/src/createMessageHandler.ts:74:13) at async Promise.all (index 0) at async <anonymous> (/src/createMessageHandler.ts:121:32) at async Hcr (/node_modules/.pnpm/@middy+core@2.5.7/node_modules/@middy/core/index.js:86:26)" }

I broke this during my testing adding more devices, pushing a fix for this now

@gdorward this is now fixed

Comment thread plugins/NinjaOne/v1/dataStreams/health.json Outdated
Comment thread plugins/NinjaOne/v1/dataStreams/locationDevices.json Outdated
Comment thread plugins/NinjaOne/v1/dataStreams/networkInterfaces.json Outdated
Comment thread plugins/NinjaOne/v1/dataStreams/organizationDevices.json
Comment thread plugins/NinjaOne/v1/dataStreams/processors.json Outdated
Comment thread plugins/NinjaOne/v1/dataStreams/volumes.json Outdated
@Deenk Deenk requested a review from clarkd April 29, 2026 09:44

@clarkd clarkd left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for taking all those changes in! Looks good to me, I'll defer to @gregdorward for any functional review. I've also pinged @shaswot77 RE the failing validation step.

Comment thread plugins/NinjaOne/v1/custom_types.json Outdated
@github-actions

Copy link
Copy Markdown

🧩 Plugin PR Summary

📦 Modified Plugins

  • plugins/NinjaOne/v1

📋 Results

Step Status
Validation ✅ Passed
Deployment 🚀 Deployed

🔍 Validation Details

ninja-one
{
  "valid": true,
  "pluginName": "ninja-one",
  "pluginType": "cloud",
  "summary": {
    "Data Streams": 37,
    "Import Definitions": 1,
    "UI Configuration": true,
    "Has Icon": true,
    "Has Default Content": true,
    "Config Validation": false,
    "Custom Types": true
  }
}

@vinbab

vinbab commented May 11, 2026

Copy link
Copy Markdown
Contributor

@Deenk feedback on the setup screen:

  • Do we need to ask both the Region and API Region? Would one suffice to derive the API endpoint?
  • Client Secret: lowercase secret in field title, placeholder and tooltip

@Deenk let me know when this will be updated or if you have any feedback?

@vinbab

vinbab commented May 11, 2026

Copy link
Copy Markdown
Contributor

@Deenk feedback on the setup screen:

  • Do we need to ask both the Region and API Region? Would one suffice to derive the API endpoint?
  • Client Secret: lowercase secret in field title, placeholder and tooltip

Thanks @vinbab , although LCP does not support deriving URLs like this (from what I can see), I have managed to discover you can get a token from the base url, so I now only need to use one radio selector. I've made the change.

Secret should now also be uppercase in the locations you mentioned

@Deenk can you please sentence case Client Secret to Client secret in field title and placeholder?

@Deenk Deenk merged commit 46747f5 into main May 14, 2026
1 check passed
@Deenk Deenk deleted the ninjaone branch May 14, 2026 13:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new-plugin Used to PR newly added plugins

Development

Successfully merging this pull request may close these issues.

5 participants