feat(sentinelone): count-agents can ask about versions, state and hardware
The count only knew where an agent was, not what it was running or what it runs on. Four filters carry the console's own vocabulary through: agentVersion__gt to count the fleet still below a target build, networkStatuses to keep only the endpoints in a given connection state, operationalStatesNin to leave states out of the tally, and machineTypes to count servers apart from laptops. The list filters are split and re-joined so a hand-typed "connected, disconnected" does not reach the API with the space inside the value.
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
id: sentinelone
|
||||
name: SentinelOne
|
||||
version: 1.4.0
|
||||
version: 1.5.0
|
||||
description: "SentinelOne Singularity (API v2.1) — endpoint detection & response: triage threats, enrich, isolate/reconnect hosts, mitigate, scan."
|
||||
changelog: "1.4.0 — get_threats and get_alerts accept an optional account_ids filter (accountIds), so a multi-tenant console can be scoped to one or more accounts at fetch time. 1.3.0 — Exhaustive OCSF mappers: get_threats (38 fields) and get_alerts (58 fields) now cover device, finding, malware, actor/target process, file, registry, network, indicators and container. 1.2.4 — Re-modelled the OCSF mappers to OCSF actor/target semantics: the initiating process maps to actor.* (actor.process, actor.user), and the process/file acted upon maps to the target (process.*, file.*, user.*). 1.2.3 — Expanded the OCSF mappers (get_threats, get_alerts) with more fields: file hashes (sha1/md5), file ext/size, finding/rule ids, confidence, status, parent process and device/user identity. 1.2.2 — Added pre-built OCSF mappers (get_threats, get_alerts) for the mapper library. 1.2.1 — Added test_connection for the instance Test button. 1.2.0 — Added 13 commands: threat-analysis, threat-download-from-cloud, abort-endpoint-scan, endpoint-fetch-logs, fetch-file, get-remote-script-task-status/results, get-service-users, list-installed-singularity-marketplace-applications, update-uam-alert-status/verdict, run-powerquery and create-tag-rule (83 commands total). 1.1.0 — Command names prefixed with 'sentinelone-' (e.g. sentinelone-isolate-agent) for easier toolbox search; command IDs unchanged. 1.0.0 — Initial release: 70 commands covering agents, threats, alerts, blocklist/exclusions, IOCs, STAR rules, Deep Visibility, remote scripts, tags, firewall and network discovery based on the SentinelOne API v2.1."
|
||||
changelog: "1.5.0 — count_agents takes four more filters: agentVersion__gt to count the fleet still below a target build, networkStatuses to count only the endpoints in a given connection state, operationalStatesNin to leave states out of the count, and machineTypes to count servers apart from laptops. 1.4.0 — get_threats and get_alerts accept an optional account_ids filter (accountIds), so a multi-tenant console can be scoped to one or more accounts at fetch time. 1.3.0 — Exhaustive OCSF mappers: get_threats (38 fields) and get_alerts (58 fields) now cover device, finding, malware, actor/target process, file, registry, network, indicators and container. 1.2.4 — Re-modelled the OCSF mappers to OCSF actor/target semantics: the initiating process maps to actor.* (actor.process, actor.user), and the process/file acted upon maps to the target (process.*, file.*, user.*). 1.2.3 — Expanded the OCSF mappers (get_threats, get_alerts) with more fields: file hashes (sha1/md5), file ext/size, finding/rule ids, confidence, status, parent process and device/user identity. 1.2.2 — Added pre-built OCSF mappers (get_threats, get_alerts) for the mapper library. 1.2.1 — Added test_connection for the instance Test button. 1.2.0 — Added 13 commands: threat-analysis, threat-download-from-cloud, abort-endpoint-scan, endpoint-fetch-logs, fetch-file, get-remote-script-task-status/results, get-service-users, list-installed-singularity-marketplace-applications, update-uam-alert-status/verdict, run-powerquery and create-tag-rule (83 commands total). 1.1.0 — Command names prefixed with 'sentinelone-' (e.g. sentinelone-isolate-agent) for easier toolbox search; command IDs unchanged. 1.0.0 — Initial release: 70 commands covering agents, threats, alerts, blocklist/exclusions, IOCs, STAR rules, Deep Visibility, remote scripts, tags, firewall and network discovery based on the SentinelOne API v2.1."
|
||||
category: endpoint
|
||||
|
||||
# Per-instance configuration. The scripts build the API base as <url>/web/api/v2.1.
|
||||
@@ -187,6 +187,10 @@ commands:
|
||||
scan_status: { type: string, description: "Filter by scan status" }
|
||||
siteIds: { type: string, description: "Comma-separated site IDs" }
|
||||
groupIds: { type: string, description: "Comma-separated group IDs" }
|
||||
agentVersion__gt: { type: string, description: "Only agents on a version strictly greater than this one, e.g. 23.4.2.6" }
|
||||
networkStatuses: { type: string, description: "Comma-separated network statuses: connected | connecting | disconnected | disconnecting" }
|
||||
operationalStatesNin: { type: string, description: "Comma-separated operational states to exclude, e.g. na" }
|
||||
machineTypes: { type: string, description: "Comma-separated machine types: desktop | laptop | server | kubernetes node | storage | unknown" }
|
||||
required: []
|
||||
outputs_schema: { properties: {} }
|
||||
- id: get_agent_mac
|
||||
|
||||
@@ -29,6 +29,14 @@ def main():
|
||||
"scan_status": inputs.get("scan_status"),
|
||||
"siteIds": inputs.get("siteIds"),
|
||||
"groupIds": inputs.get("groupIds"),
|
||||
# Agents strictly newer than the given version, e.g. 23.4.2.6 — the console
|
||||
# answers with the fleet still trailing behind a target build.
|
||||
"agentVersion__gt": inputs.get("agentVersion__gt"),
|
||||
# Comma-separated lists are re-joined so a hand-typed "connected, disconnected"
|
||||
# does not reach the API with the space inside the value.
|
||||
"networkStatuses": ",".join(csv(inputs.get("networkStatuses"))),
|
||||
"operationalStatesNin": ",".join(csv(inputs.get("operationalStatesNin"))),
|
||||
"machineTypes": ",".join(csv(inputs.get("machineTypes"))),
|
||||
}
|
||||
url = base + "/agents/count?" + urllib.parse.urlencode({k: v for k, v in qs.items() if v not in (None, "")})
|
||||
print(json.dumps(request("GET", url, headers)))
|
||||
|
||||
Reference in New Issue
Block a user