Files
claudetools/api/schemas/gravityzone.py
Mike Swanson e2b8fcee21 feat: add Bitdefender GravityZone integration module
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>
2026-04-24 07:13:16 -07:00

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