sync: auto-sync from HOWARD-HOME at 2026-06-21 10:42:33

Author: Howard Enos
Machine: HOWARD-HOME
Timestamp: 2026-06-21 10:42:33
This commit is contained in:
2026-06-21 10:43:16 -07:00
parent a254e5f641
commit 5ede4fee26
5 changed files with 836 additions and 1 deletions

View File

@@ -900,6 +900,127 @@ class GravityZoneClient:
params["subscribeToEventTypes"] = subscribe_event_types
return self._jsonrpc_request("push", "setPushEventSettings", params)
def send_test_push_event(self, event_type: str, extra: Optional[dict] = None) -> Any:
"""Send a test push event (push.sendTestPushEvent). Requires `eventType`
(verified). Fires against the configured receiver — STATE-ADJACENT, gate
at the call site behind --confirm."""
params: dict = {"eventType": event_type}
if extra:
params.update(extra)
return self._jsonrpc_request("push", "sendTestPushEvent", params)
# ======================================================================
# PACKAGES (detail) — read
# ======================================================================
def get_package_details(self, package_id: str) -> dict:
"""Installation package detail (packages.getPackageDetails). `packageId`
required (verified)."""
return self._jsonrpc_request(
"packages", "getPackageDetails", {"packageId": package_id}
) or {}
# ======================================================================
# REPORTS (create / delete) — getReportsList + get_report_links above
# ======================================================================
def create_report(self, name: str, extra: Optional[dict] = None) -> Any:
"""Create a report (reports.createReport). `name` required (verified);
`type`, `targetIds`, recurrence/format etc. passed via `extra`.
STATE-CHANGING — gate at the call site behind --confirm."""
params: dict = {"name": name}
if extra:
params.update(extra)
return self._jsonrpc_request("reports", "createReport", params)
def delete_report(self, report_id: str) -> Any:
"""Delete a report (reports.deleteReport). `reportId` required (verified).
STATE-CHANGING — gate at the call site behind --confirm."""
return self._jsonrpc_request(
"reports", "deleteReport", {"reportId": report_id}
)
# ======================================================================
# QUARANTINE (remove / restore) — getQuarantineItemsList above
# ======================================================================
def remove_quarantine_items(
self, quarantine_item_ids: list[str], extra: Optional[dict] = None
) -> Any:
"""Delete quarantined items (quarantine/computers.createRemoveQuarantineItemTask).
`quarantineItemsIds` required (verified). STATE-CHANGING — gate behind --confirm."""
params: dict = {"quarantineItemsIds": quarantine_item_ids}
if extra:
params.update(extra)
return self._jsonrpc_request(
"quarantine/computers", "createRemoveQuarantineItemTask", params
)
def restore_quarantine_items(
self, quarantine_item_ids: list[str], extra: Optional[dict] = None
) -> Any:
"""Restore quarantined items (quarantine/computers.createRestoreQuarantineItemTask).
`quarantineItemsIds` required (verified). `addExclusionInPolicy` etc. via
`extra`. STATE-CHANGING — gate behind --confirm."""
params: dict = {"quarantineItemsIds": quarantine_item_ids}
if extra:
params.update(extra)
return self._jsonrpc_request(
"quarantine/computers", "createRestoreQuarantineItemTask", params
)
# ======================================================================
# INCIDENTS — custom rules + incident status/note (read + state-changing)
# ======================================================================
def list_custom_rules(self, page: int = 1, per_page: int = 100) -> dict:
"""List EDR custom rules (incidents.getCustomRulesList). VERIFIED LIVE."""
return self._jsonrpc_request(
"incidents", "getCustomRulesList", {"page": page, "perPage": per_page}
) or {}
def create_custom_rule(self, name: str, extra: Optional[dict] = None) -> Any:
"""Create an EDR custom rule (incidents.createCustomRule). `name` required
(verified); rule body (settings/companyId/tags) via `extra`.
STATE-CHANGING — gate behind --confirm."""
params: dict = {"name": name}
if extra:
params.update(extra)
return self._jsonrpc_request("incidents", "createCustomRule", params)
def delete_custom_rule(self, rule_id: str) -> Any:
"""Delete an EDR custom rule (incidents.deleteCustomRule). `ruleId` required
(verified). STATE-CHANGING — gate behind --confirm."""
return self._jsonrpc_request(
"incidents", "deleteCustomRule", {"ruleId": rule_id}
)
def change_incident_status(self, incident_type: str, fields: dict) -> Any:
"""Change an incident's status (incidents.changeIncidentStatus). `type`
required (verified) — the incident type/category — plus the incident id +
target status in `fields`. STATE-CHANGING — gate behind --confirm."""
params: dict = {"type": incident_type}
params.update(fields or {})
return self._jsonrpc_request("incidents", "changeIncidentStatus", params)
def update_incident_note(self, incident_type: str, fields: dict) -> Any:
"""Update an incident note (incidents.updateIncidentNote). `type` required
(verified) plus incident id + note text in `fields`. STATE-CHANGING."""
params: dict = {"type": incident_type}
params.update(fields or {})
return self._jsonrpc_request("incidents", "updateIncidentNote", params)
# ======================================================================
# LICENSING (usage) + INTEGRATIONS — read
# ======================================================================
def get_monthly_usage(self) -> dict:
"""Monthly license usage (licensing.getMonthlyUsage). VERIFIED LIVE."""
return self._jsonrpc_request("licensing", "getMonthlyUsage", {}) or {}
def get_configured_integrations(self, page: int = 1, per_page: int = 100) -> dict:
"""Configured third-party integrations (integrations.getConfiguredIntegrations).
VERIFIED LIVE."""
return self._jsonrpc_request(
"integrations", "getConfiguredIntegrations",
{"page": page, "perPage": per_page},
) or {}
# ======================================================================
# CACHE LAYER (identity / structure only — never volatile status)
# ======================================================================