Adds full GravityZone API integration to ClaudeTools. Key additions: - api/services/gravityzone_service.py: JSON-RPC client with Basic auth, methods for company/endpoint/quarantine/licensing data, and security_sweep which paginates all endpoints, enriches with malware/agent status, and sorts infected > outdated > clean - api/schemas/gravityzone.py: Pydantic response models for all endpoints - api/routers/gravityzone.py: 7 REST endpoints at /api/gravityzone/*, JWT-protected, returns 502 on downstream GZ errors - api/config.py: GRAVITYZONE_API_KEY + GRAVITYZONE_API_BASE_URL settings - api/main.py: router registered under /api/gravityzone Vault entry: msp-tools/gravityzone.sops.yaml (partner-level key, 14 modules) Server .env updated, ticktick router synced, service restarted and verified. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
53 lines
1.1 KiB
Python
53 lines
1.1 KiB
Python
from typing import Optional
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
class GZEndpointItem(BaseModel):
|
|
id: str
|
|
name: str
|
|
fqdn: Optional[str] = None
|
|
ip: Optional[str] = None
|
|
os_version: Optional[str] = None
|
|
is_managed: bool
|
|
policy_name: Optional[str] = None
|
|
|
|
|
|
class GZEndpointDetail(BaseModel):
|
|
id: str
|
|
name: str
|
|
company_id: Optional[str] = None
|
|
infected: bool
|
|
detection_active: bool
|
|
signature_outdated: bool
|
|
product_outdated: bool
|
|
agent_version: Optional[str] = None
|
|
engine_version: Optional[str] = None
|
|
last_seen: Optional[str] = None
|
|
last_update: Optional[str] = None
|
|
state: int
|
|
modules: Optional[dict] = None
|
|
|
|
|
|
class GZCompanyItem(BaseModel):
|
|
id: str
|
|
name: str
|
|
type: int
|
|
|
|
|
|
class GZSweepResult(BaseModel):
|
|
total: int
|
|
infected: int
|
|
signature_outdated: int
|
|
product_outdated: int
|
|
not_seen_recently: int
|
|
endpoints: list[dict]
|
|
|
|
|
|
class GZStatusResponse(BaseModel):
|
|
enabled_apis: list[str]
|
|
key_created_at: Optional[str] = None
|
|
used_slots: Optional[int] = None
|
|
total_slots: Optional[int] = None
|
|
expiry_date: Optional[str] = None
|