binalyze-air-sdk 1.0.2__py3-none-any.whl → 1.0.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- binalyze_air/__init__.py +77 -77
- binalyze_air/apis/__init__.py +67 -27
- binalyze_air/apis/acquisitions.py +107 -0
- binalyze_air/apis/api_tokens.py +49 -0
- binalyze_air/apis/assets.py +161 -0
- binalyze_air/apis/audit_logs.py +26 -0
- binalyze_air/apis/{authentication.py → auth.py} +29 -27
- binalyze_air/apis/auto_asset_tags.py +79 -75
- binalyze_air/apis/backup.py +177 -0
- binalyze_air/apis/baseline.py +46 -0
- binalyze_air/apis/cases.py +225 -0
- binalyze_air/apis/cloud_forensics.py +116 -0
- binalyze_air/apis/event_subscription.py +96 -96
- binalyze_air/apis/evidence.py +249 -53
- binalyze_air/apis/interact.py +153 -36
- binalyze_air/apis/investigation_hub.py +234 -0
- binalyze_air/apis/license.py +104 -0
- binalyze_air/apis/logger.py +83 -0
- binalyze_air/apis/multipart_upload.py +201 -0
- binalyze_air/apis/notifications.py +115 -0
- binalyze_air/apis/organizations.py +267 -0
- binalyze_air/apis/params.py +44 -39
- binalyze_air/apis/policies.py +186 -0
- binalyze_air/apis/preset_filters.py +79 -0
- binalyze_air/apis/recent_activities.py +71 -0
- binalyze_air/apis/relay_server.py +104 -0
- binalyze_air/apis/settings.py +395 -27
- binalyze_air/apis/tasks.py +80 -0
- binalyze_air/apis/triage.py +197 -0
- binalyze_air/apis/user_management.py +183 -74
- binalyze_air/apis/webhook_executions.py +50 -0
- binalyze_air/apis/webhooks.py +322 -230
- binalyze_air/base.py +207 -133
- binalyze_air/client.py +217 -1337
- binalyze_air/commands/__init__.py +175 -145
- binalyze_air/commands/acquisitions.py +661 -387
- binalyze_air/commands/api_tokens.py +55 -0
- binalyze_air/commands/assets.py +324 -362
- binalyze_air/commands/{authentication.py → auth.py} +36 -36
- binalyze_air/commands/auto_asset_tags.py +230 -230
- binalyze_air/commands/backup.py +47 -0
- binalyze_air/commands/baseline.py +32 -396
- binalyze_air/commands/cases.py +609 -602
- binalyze_air/commands/cloud_forensics.py +88 -0
- binalyze_air/commands/event_subscription.py +101 -101
- binalyze_air/commands/evidences.py +918 -988
- binalyze_air/commands/interact.py +172 -58
- binalyze_air/commands/investigation_hub.py +315 -0
- binalyze_air/commands/license.py +183 -0
- binalyze_air/commands/logger.py +126 -0
- binalyze_air/commands/multipart_upload.py +363 -0
- binalyze_air/commands/notifications.py +45 -0
- binalyze_air/commands/organizations.py +200 -221
- binalyze_air/commands/policies.py +175 -203
- binalyze_air/commands/preset_filters.py +55 -0
- binalyze_air/commands/recent_activities.py +32 -0
- binalyze_air/commands/relay_server.py +144 -0
- binalyze_air/commands/settings.py +431 -29
- binalyze_air/commands/tasks.py +95 -56
- binalyze_air/commands/triage.py +224 -360
- binalyze_air/commands/user_management.py +351 -126
- binalyze_air/commands/webhook_executions.py +77 -0
- binalyze_air/config.py +244 -244
- binalyze_air/exceptions.py +49 -49
- binalyze_air/http_client.py +426 -305
- binalyze_air/models/__init__.py +287 -285
- binalyze_air/models/acquisitions.py +365 -250
- binalyze_air/models/api_tokens.py +73 -0
- binalyze_air/models/assets.py +438 -438
- binalyze_air/models/audit.py +247 -272
- binalyze_air/models/audit_logs.py +14 -0
- binalyze_air/models/{authentication.py → auth.py} +69 -69
- binalyze_air/models/auto_asset_tags.py +227 -116
- binalyze_air/models/backup.py +138 -0
- binalyze_air/models/baseline.py +231 -231
- binalyze_air/models/cases.py +275 -275
- binalyze_air/models/cloud_forensics.py +145 -0
- binalyze_air/models/event_subscription.py +170 -171
- binalyze_air/models/evidence.py +65 -65
- binalyze_air/models/evidences.py +367 -348
- binalyze_air/models/interact.py +266 -135
- binalyze_air/models/investigation_hub.py +265 -0
- binalyze_air/models/license.py +150 -0
- binalyze_air/models/logger.py +83 -0
- binalyze_air/models/multipart_upload.py +352 -0
- binalyze_air/models/notifications.py +138 -0
- binalyze_air/models/organizations.py +293 -293
- binalyze_air/models/params.py +153 -127
- binalyze_air/models/policies.py +260 -249
- binalyze_air/models/preset_filters.py +79 -0
- binalyze_air/models/recent_activities.py +70 -0
- binalyze_air/models/relay_server.py +121 -0
- binalyze_air/models/settings.py +538 -84
- binalyze_air/models/tasks.py +215 -149
- binalyze_air/models/triage.py +141 -142
- binalyze_air/models/user_management.py +200 -97
- binalyze_air/models/webhook_executions.py +33 -0
- binalyze_air/queries/__init__.py +121 -133
- binalyze_air/queries/acquisitions.py +155 -155
- binalyze_air/queries/api_tokens.py +46 -0
- binalyze_air/queries/assets.py +186 -105
- binalyze_air/queries/audit.py +400 -416
- binalyze_air/queries/{authentication.py → auth.py} +55 -55
- binalyze_air/queries/auto_asset_tags.py +59 -59
- binalyze_air/queries/backup.py +66 -0
- binalyze_air/queries/baseline.py +21 -185
- binalyze_air/queries/cases.py +292 -292
- binalyze_air/queries/cloud_forensics.py +137 -0
- binalyze_air/queries/event_subscription.py +54 -54
- binalyze_air/queries/evidence.py +139 -139
- binalyze_air/queries/evidences.py +279 -279
- binalyze_air/queries/interact.py +140 -28
- binalyze_air/queries/investigation_hub.py +329 -0
- binalyze_air/queries/license.py +85 -0
- binalyze_air/queries/logger.py +58 -0
- binalyze_air/queries/multipart_upload.py +180 -0
- binalyze_air/queries/notifications.py +71 -0
- binalyze_air/queries/organizations.py +222 -222
- binalyze_air/queries/params.py +154 -115
- binalyze_air/queries/policies.py +149 -149
- binalyze_air/queries/preset_filters.py +60 -0
- binalyze_air/queries/recent_activities.py +44 -0
- binalyze_air/queries/relay_server.py +42 -0
- binalyze_air/queries/settings.py +533 -20
- binalyze_air/queries/tasks.py +125 -81
- binalyze_air/queries/triage.py +230 -230
- binalyze_air/queries/user_management.py +193 -83
- binalyze_air/queries/webhook_executions.py +39 -0
- binalyze_air_sdk-1.0.3.dist-info/METADATA +752 -0
- binalyze_air_sdk-1.0.3.dist-info/RECORD +132 -0
- {binalyze_air_sdk-1.0.2.dist-info → binalyze_air_sdk-1.0.3.dist-info}/WHEEL +1 -1
- binalyze_air/apis/endpoints.py +0 -22
- binalyze_air/apis/evidences.py +0 -216
- binalyze_air/apis/users.py +0 -68
- binalyze_air/commands/users.py +0 -101
- binalyze_air/models/endpoints.py +0 -76
- binalyze_air/models/users.py +0 -82
- binalyze_air/queries/endpoints.py +0 -25
- binalyze_air/queries/users.py +0 -69
- binalyze_air_sdk-1.0.2.dist-info/METADATA +0 -706
- binalyze_air_sdk-1.0.2.dist-info/RECORD +0 -82
- {binalyze_air_sdk-1.0.2.dist-info → binalyze_air_sdk-1.0.3.dist-info}/top_level.txt +0 -0
binalyze_air/models/tasks.py
CHANGED
@@ -1,149 +1,215 @@
|
|
1
|
-
"""
|
2
|
-
Task-related data models for the Binalyze AIR SDK.
|
3
|
-
"""
|
4
|
-
|
5
|
-
from typing import List, Optional, Dict, Any
|
6
|
-
from datetime import datetime
|
7
|
-
from enum import Enum
|
8
|
-
from pydantic import Field
|
9
|
-
|
10
|
-
from ..base import AIRBaseModel, Filter
|
11
|
-
|
12
|
-
|
13
|
-
class TaskStatus(str, Enum):
|
14
|
-
"""Task status."""
|
15
|
-
PENDING = "pending"
|
16
|
-
RUNNING = "running"
|
17
|
-
COMPLETED = "completed"
|
18
|
-
FAILED = "failed"
|
19
|
-
CANCELLED = "cancelled"
|
20
|
-
|
21
|
-
|
22
|
-
class TaskType(str, Enum):
|
23
|
-
"""Task type."""
|
24
|
-
ACQUISITION = "acquisition"
|
25
|
-
TRIAGE = "triage"
|
26
|
-
ISOLATION = "isolation"
|
27
|
-
REBOOT = "reboot"
|
28
|
-
SHUTDOWN = "shutdown"
|
29
|
-
IMAGE_ACQUISITION = "image-acquisition"
|
30
|
-
|
31
|
-
|
32
|
-
class NetworkCaptureConfig(AIRBaseModel):
|
33
|
-
"""Network capture configuration."""
|
34
|
-
|
35
|
-
enabled: bool = False
|
36
|
-
duration: int = 60
|
37
|
-
pcap: Optional[Dict[str, bool]] = None
|
38
|
-
network_flow: Optional[Dict[str, bool]] = Field(default=None, alias="networkFlow")
|
39
|
-
|
40
|
-
|
41
|
-
class PlatformEvidenceConfig(AIRBaseModel):
|
42
|
-
"""Platform-specific evidence configuration."""
|
43
|
-
|
44
|
-
evidence_types: List[str] = Field(default=[], alias="evidenceTypes")
|
45
|
-
custom: List[Any] = []
|
46
|
-
network_capture: Optional[NetworkCaptureConfig] = Field(default=None, alias="networkCapture")
|
47
|
-
|
48
|
-
|
49
|
-
class SaveLocationConfig(AIRBaseModel):
|
50
|
-
"""Save location configuration."""
|
51
|
-
|
52
|
-
location: str
|
53
|
-
path: str
|
54
|
-
use_most_free_volume: bool = Field(default=False, alias="useMostFreeVolume")
|
55
|
-
volume: str = ""
|
56
|
-
tmp: str = ""
|
57
|
-
|
58
|
-
|
59
|
-
class CompressionConfig(AIRBaseModel):
|
60
|
-
"""Compression configuration."""
|
61
|
-
|
62
|
-
enabled: bool = False
|
63
|
-
encryption: Optional[Dict[str, Any]] = None
|
64
|
-
|
65
|
-
|
66
|
-
class TaskConfig(AIRBaseModel):
|
67
|
-
"""Task configuration."""
|
68
|
-
|
69
|
-
choice: Optional[str] = None
|
70
|
-
save_to: Optional[Dict[str, SaveLocationConfig]] = Field(default=None, alias="saveTo")
|
71
|
-
cpu: Optional[Dict[str, int]] = None
|
72
|
-
compression: Optional[CompressionConfig] = None
|
73
|
-
|
74
|
-
|
75
|
-
class DroneConfig(AIRBaseModel):
|
76
|
-
"""Drone (analysis) configuration."""
|
77
|
-
|
78
|
-
min_score: int = Field(default=0, alias="minScore")
|
79
|
-
auto_pilot: bool = Field(default=False, alias="autoPilot")
|
80
|
-
enabled: bool = False
|
81
|
-
analyzers: List[str] = []
|
82
|
-
keywords: List[str] = []
|
83
|
-
|
84
|
-
|
85
|
-
class TaskData(AIRBaseModel):
|
86
|
-
"""Task data containing configuration."""
|
87
|
-
|
88
|
-
profile_id: Optional[str] = Field(default=None, alias="profileId")
|
89
|
-
profile_name: Optional[str] = Field(default=None, alias="profileName")
|
90
|
-
windows: Optional[PlatformEvidenceConfig] = None
|
91
|
-
linux: Optional[PlatformEvidenceConfig] = None
|
92
|
-
config: Optional[TaskConfig] = None
|
93
|
-
drone: Optional[DroneConfig] = None
|
94
|
-
|
95
|
-
|
96
|
-
class TaskAssignment(AIRBaseModel):
|
97
|
-
"""Task assignment model representing a task assigned to a specific endpoint."""
|
98
|
-
|
99
|
-
id: str = Field(alias="_id")
|
100
|
-
task_id: str = Field(alias="taskId")
|
101
|
-
name: str
|
102
|
-
type: str
|
103
|
-
endpoint_id: str = Field(alias="endpointId")
|
104
|
-
endpoint_name: str = Field(alias="endpointName")
|
105
|
-
organization_id: int = Field(default=0, alias="organizationId")
|
106
|
-
status: str
|
107
|
-
recurrence: Optional[str] = None
|
108
|
-
progress: int = 0
|
109
|
-
duration: Optional[int] = None
|
110
|
-
durations: Optional[Dict[str, int]] = None
|
111
|
-
case_ids: List[str] = Field(default=[], alias="caseIds")
|
112
|
-
metadata: Optional[Dict[str, Any]] = None
|
113
|
-
created_at: Optional[datetime] = Field(default=None, alias="createdAt")
|
114
|
-
created_by: Optional[str] = Field(default=None, alias="createdBy")
|
115
|
-
updated_at: Optional[datetime] = Field(default=None, alias="updatedAt")
|
116
|
-
response: Optional[Dict[str, Any]] = None
|
117
|
-
|
118
|
-
|
119
|
-
class Task(AIRBaseModel):
|
120
|
-
"""Task model with proper field aliases for API mapping."""
|
121
|
-
|
122
|
-
id: str = Field(alias="_id")
|
123
|
-
source: Optional[str] = None
|
124
|
-
total_assigned_endpoints: int = Field(default=0, alias="totalAssignedEndpoints")
|
125
|
-
total_completed_endpoints: int = Field(default=0, alias="totalCompletedEndpoints")
|
126
|
-
total_failed_endpoints: int = Field(default=0, alias="totalFailedEndpoints")
|
127
|
-
total_cancelled_endpoints: int = Field(default=0, alias="totalCancelledEndpoints")
|
128
|
-
is_scheduled: bool = Field(default=False, alias="isScheduled")
|
129
|
-
name: str
|
130
|
-
type: str
|
131
|
-
organization_id: int = Field(default=0, alias="organizationId")
|
132
|
-
status: str
|
133
|
-
created_by: str = Field(alias="createdBy")
|
134
|
-
base_task_id: Optional[str] = Field(default=None, alias="baseTaskId")
|
135
|
-
start_date: Optional[datetime] = Field(default=None, alias="startDate")
|
136
|
-
recurrence: Optional[str] = None
|
137
|
-
created_at: Optional[datetime] = Field(default=None, alias="createdAt")
|
138
|
-
updated_at: Optional[datetime] = Field(default=None, alias="updatedAt")
|
139
|
-
data: Optional[TaskData] = None
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
1
|
+
"""
|
2
|
+
Task-related data models for the Binalyze AIR SDK.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from typing import List, Optional, Dict, Any, Union
|
6
|
+
from datetime import datetime
|
7
|
+
from enum import Enum
|
8
|
+
from pydantic import Field, field_validator
|
9
|
+
|
10
|
+
from ..base import AIRBaseModel, Filter
|
11
|
+
|
12
|
+
|
13
|
+
class TaskStatus(str, Enum):
|
14
|
+
"""Task status."""
|
15
|
+
PENDING = "pending"
|
16
|
+
RUNNING = "running"
|
17
|
+
COMPLETED = "completed"
|
18
|
+
FAILED = "failed"
|
19
|
+
CANCELLED = "cancelled"
|
20
|
+
|
21
|
+
|
22
|
+
class TaskType(str, Enum):
|
23
|
+
"""Task type."""
|
24
|
+
ACQUISITION = "acquisition"
|
25
|
+
TRIAGE = "triage"
|
26
|
+
ISOLATION = "isolation"
|
27
|
+
REBOOT = "reboot"
|
28
|
+
SHUTDOWN = "shutdown"
|
29
|
+
IMAGE_ACQUISITION = "image-acquisition"
|
30
|
+
|
31
|
+
|
32
|
+
class NetworkCaptureConfig(AIRBaseModel):
|
33
|
+
"""Network capture configuration."""
|
34
|
+
|
35
|
+
enabled: bool = False
|
36
|
+
duration: int = 60
|
37
|
+
pcap: Optional[Dict[str, bool]] = None
|
38
|
+
network_flow: Optional[Dict[str, bool]] = Field(default=None, alias="networkFlow")
|
39
|
+
|
40
|
+
|
41
|
+
class PlatformEvidenceConfig(AIRBaseModel):
|
42
|
+
"""Platform-specific evidence configuration."""
|
43
|
+
|
44
|
+
evidence_types: List[str] = Field(default=[], alias="evidenceTypes")
|
45
|
+
custom: List[Any] = []
|
46
|
+
network_capture: Optional[NetworkCaptureConfig] = Field(default=None, alias="networkCapture")
|
47
|
+
|
48
|
+
|
49
|
+
class SaveLocationConfig(AIRBaseModel):
|
50
|
+
"""Save location configuration."""
|
51
|
+
|
52
|
+
location: str
|
53
|
+
path: str
|
54
|
+
use_most_free_volume: bool = Field(default=False, alias="useMostFreeVolume")
|
55
|
+
volume: str = ""
|
56
|
+
tmp: str = ""
|
57
|
+
|
58
|
+
|
59
|
+
class CompressionConfig(AIRBaseModel):
|
60
|
+
"""Compression configuration."""
|
61
|
+
|
62
|
+
enabled: bool = False
|
63
|
+
encryption: Optional[Dict[str, Any]] = None
|
64
|
+
|
65
|
+
|
66
|
+
class TaskConfig(AIRBaseModel):
|
67
|
+
"""Task configuration."""
|
68
|
+
|
69
|
+
choice: Optional[str] = None
|
70
|
+
save_to: Optional[Dict[str, SaveLocationConfig]] = Field(default=None, alias="saveTo")
|
71
|
+
cpu: Optional[Dict[str, int]] = None
|
72
|
+
compression: Optional[CompressionConfig] = None
|
73
|
+
|
74
|
+
|
75
|
+
class DroneConfig(AIRBaseModel):
|
76
|
+
"""Drone (analysis) configuration."""
|
77
|
+
|
78
|
+
min_score: int = Field(default=0, alias="minScore")
|
79
|
+
auto_pilot: bool = Field(default=False, alias="autoPilot")
|
80
|
+
enabled: bool = False
|
81
|
+
analyzers: List[str] = []
|
82
|
+
keywords: List[str] = []
|
83
|
+
|
84
|
+
|
85
|
+
class TaskData(AIRBaseModel):
|
86
|
+
"""Task data containing configuration."""
|
87
|
+
|
88
|
+
profile_id: Optional[str] = Field(default=None, alias="profileId")
|
89
|
+
profile_name: Optional[str] = Field(default=None, alias="profileName")
|
90
|
+
windows: Optional[PlatformEvidenceConfig] = None
|
91
|
+
linux: Optional[PlatformEvidenceConfig] = None
|
92
|
+
config: Optional[TaskConfig] = None
|
93
|
+
drone: Optional[DroneConfig] = None
|
94
|
+
|
95
|
+
|
96
|
+
class TaskAssignment(AIRBaseModel):
|
97
|
+
"""Task assignment model representing a task assigned to a specific endpoint."""
|
98
|
+
|
99
|
+
id: str = Field(alias="_id")
|
100
|
+
task_id: str = Field(alias="taskId")
|
101
|
+
name: str
|
102
|
+
type: str
|
103
|
+
endpoint_id: str = Field(alias="endpointId")
|
104
|
+
endpoint_name: str = Field(alias="endpointName")
|
105
|
+
organization_id: int = Field(default=0, alias="organizationId")
|
106
|
+
status: str
|
107
|
+
recurrence: Optional[str] = None
|
108
|
+
progress: int = 0
|
109
|
+
duration: Optional[int] = None
|
110
|
+
durations: Optional[Dict[str, int]] = None
|
111
|
+
case_ids: List[str] = Field(default=[], alias="caseIds")
|
112
|
+
metadata: Optional[Dict[str, Any]] = None
|
113
|
+
created_at: Optional[datetime] = Field(default=None, alias="createdAt")
|
114
|
+
created_by: Optional[str] = Field(default=None, alias="createdBy")
|
115
|
+
updated_at: Optional[datetime] = Field(default=None, alias="updatedAt")
|
116
|
+
response: Optional[Dict[str, Any]] = None
|
117
|
+
|
118
|
+
|
119
|
+
class Task(AIRBaseModel):
|
120
|
+
"""Task model with proper field aliases for API mapping."""
|
121
|
+
|
122
|
+
id: str = Field(alias="_id")
|
123
|
+
source: Optional[str] = None
|
124
|
+
total_assigned_endpoints: int = Field(default=0, alias="totalAssignedEndpoints")
|
125
|
+
total_completed_endpoints: int = Field(default=0, alias="totalCompletedEndpoints")
|
126
|
+
total_failed_endpoints: int = Field(default=0, alias="totalFailedEndpoints")
|
127
|
+
total_cancelled_endpoints: int = Field(default=0, alias="totalCancelledEndpoints")
|
128
|
+
is_scheduled: bool = Field(default=False, alias="isScheduled")
|
129
|
+
name: str
|
130
|
+
type: str
|
131
|
+
organization_id: int = Field(default=0, alias="organizationId")
|
132
|
+
status: str
|
133
|
+
created_by: str = Field(alias="createdBy")
|
134
|
+
base_task_id: Optional[str] = Field(default=None, alias="baseTaskId")
|
135
|
+
start_date: Optional[datetime] = Field(default=None, alias="startDate")
|
136
|
+
recurrence: Optional[str] = None
|
137
|
+
created_at: Optional[datetime] = Field(default=None, alias="createdAt")
|
138
|
+
updated_at: Optional[datetime] = Field(default=None, alias="updatedAt")
|
139
|
+
data: Optional[Union[TaskData, List[Any], Dict[str, Any]]] = None
|
140
|
+
|
141
|
+
@field_validator('data', mode='before')
|
142
|
+
@classmethod
|
143
|
+
def validate_data(cls, v):
|
144
|
+
"""Handle API returning list, dict, or TaskData object for data field."""
|
145
|
+
if v is None:
|
146
|
+
return None
|
147
|
+
if isinstance(v, list):
|
148
|
+
# API sometimes returns list - take first item if available
|
149
|
+
if len(v) > 0 and isinstance(v[0], dict):
|
150
|
+
return v[0]
|
151
|
+
else:
|
152
|
+
# Return None if list is empty or contains non-dict items
|
153
|
+
return None
|
154
|
+
if isinstance(v, dict):
|
155
|
+
return v
|
156
|
+
return v
|
157
|
+
|
158
|
+
|
159
|
+
class TaskFilter(Filter):
|
160
|
+
"""Filter for task queries."""
|
161
|
+
|
162
|
+
name: Optional[str] = None
|
163
|
+
type: Optional[List[str]] = None
|
164
|
+
status: Optional[List[str]] = None
|
165
|
+
created_by: Optional[str] = Field(default=None, alias="createdBy")
|
166
|
+
is_scheduled: Optional[bool] = Field(default=None, alias="isScheduled")
|
167
|
+
|
168
|
+
def to_params(self) -> Dict[str, Any]:
|
169
|
+
"""Convert filter to API parameters with proper camelCase mapping."""
|
170
|
+
params: Dict[str, Any] = {}
|
171
|
+
|
172
|
+
# Pagination / sorting from base Filter
|
173
|
+
if self.page_number is not None:
|
174
|
+
params["pageNumber"] = self.page_number
|
175
|
+
if self.page_size is not None:
|
176
|
+
params["pageSize"] = self.page_size
|
177
|
+
if self.sort_by is not None:
|
178
|
+
params["sortBy"] = self.sort_by
|
179
|
+
if self.sort_type is not None:
|
180
|
+
params["sortType"] = self.sort_type
|
181
|
+
|
182
|
+
field_mapping = {
|
183
|
+
"name": "name",
|
184
|
+
"type": "type",
|
185
|
+
"status": "status",
|
186
|
+
"created_by": "createdBy",
|
187
|
+
"is_scheduled": "isScheduled",
|
188
|
+
}
|
189
|
+
|
190
|
+
for field_name, value in self.model_dump(exclude_none=True).items():
|
191
|
+
if field_name in ["page_number", "page_size", "sort_by", "sort_type"]:
|
192
|
+
continue
|
193
|
+
|
194
|
+
api_field = field_mapping.get(field_name, field_name)
|
195
|
+
if isinstance(value, list):
|
196
|
+
params[f"filter[{api_field}]"] = ",".join([str(v) for v in value])
|
197
|
+
else:
|
198
|
+
params[f"filter[{api_field}]"] = str(value).lower() if isinstance(value, bool) else str(value)
|
199
|
+
|
200
|
+
return params
|
201
|
+
|
202
|
+
|
203
|
+
# Request models for additional Tasks API methods
|
204
|
+
class CancelTaskByFilterRequest(AIRBaseModel):
|
205
|
+
"""Request model for canceling tasks by filter."""
|
206
|
+
|
207
|
+
included_task_ids: List[str] = Field(alias="includedTaskIds")
|
208
|
+
organization_ids: List[str] = Field(alias="organizationIds") # API expects UUID strings
|
209
|
+
|
210
|
+
|
211
|
+
class GenerateOffNetworkZipPasswordRequest(AIRBaseModel):
|
212
|
+
"""Request model for generating off-network zip password."""
|
213
|
+
|
214
|
+
uid: str
|
215
|
+
zip_encryption_key: str = Field(alias="zipEncryptionKey")
|
binalyze_air/models/triage.py
CHANGED
@@ -1,143 +1,142 @@
|
|
1
|
-
"""
|
2
|
-
Triage-related data models for the Binalyze AIR SDK.
|
3
|
-
"""
|
4
|
-
|
5
|
-
from typing import List, Optional, Dict, Any
|
6
|
-
from datetime import datetime
|
7
|
-
from enum import Enum
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
auto_apply: bool = False
|
1
|
+
"""
|
2
|
+
Triage-related data models for the Binalyze AIR SDK.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from typing import List, Optional, Dict, Any
|
6
|
+
from datetime import datetime
|
7
|
+
from enum import Enum
|
8
|
+
from pydantic import Field
|
9
|
+
|
10
|
+
from ..base import AIRBaseModel, Filter
|
11
|
+
|
12
|
+
|
13
|
+
class TriageStatus(str, Enum):
|
14
|
+
"""Triage status."""
|
15
|
+
PENDING = "pending"
|
16
|
+
PROCESSING = "processing"
|
17
|
+
COMPLETED = "completed"
|
18
|
+
FAILED = "failed"
|
19
|
+
|
20
|
+
|
21
|
+
class TriageSeverity(str, Enum):
|
22
|
+
"""Triage severity level."""
|
23
|
+
LOW = "low"
|
24
|
+
MEDIUM = "medium"
|
25
|
+
HIGH = "high"
|
26
|
+
CRITICAL = "critical"
|
27
|
+
|
28
|
+
|
29
|
+
class TriageRuleType(str, Enum):
|
30
|
+
"""Triage rule type."""
|
31
|
+
YARA = "yara"
|
32
|
+
SIGMA = "sigma"
|
33
|
+
OSQUERY = "osquery"
|
34
|
+
REGEX = "regex"
|
35
|
+
HASH = "hash"
|
36
|
+
CUSTOM = "custom"
|
37
|
+
|
38
|
+
|
39
|
+
class TriageTag(AIRBaseModel):
|
40
|
+
"""Triage tag model."""
|
41
|
+
|
42
|
+
id: str
|
43
|
+
name: str
|
44
|
+
description: Optional[str] = None
|
45
|
+
color: str = "#3498db"
|
46
|
+
created_at: Optional[datetime] = None
|
47
|
+
created_by: str
|
48
|
+
organization_id: int = 0
|
49
|
+
usage_count: int = 0
|
50
|
+
|
51
|
+
|
52
|
+
class TriageRule(AIRBaseModel):
|
53
|
+
"""Triage rule model."""
|
54
|
+
|
55
|
+
id: str
|
56
|
+
name: str
|
57
|
+
description: Optional[str] = None
|
58
|
+
type: TriageRuleType
|
59
|
+
rule_content: str
|
60
|
+
enabled: bool = True
|
61
|
+
severity: TriageSeverity = TriageSeverity.MEDIUM
|
62
|
+
tags: List[str] = []
|
63
|
+
search_in: Optional[str] = None
|
64
|
+
organization_id: int = 0
|
65
|
+
organization_ids: List[int] = []
|
66
|
+
created_at: Optional[datetime] = None
|
67
|
+
updated_at: Optional[datetime] = None
|
68
|
+
created_by: str
|
69
|
+
updated_by: Optional[str] = None
|
70
|
+
match_count: int = 0
|
71
|
+
last_match: Optional[datetime] = None
|
72
|
+
deletable: Optional[bool] = None
|
73
|
+
|
74
|
+
|
75
|
+
class TriageProfile(AIRBaseModel):
|
76
|
+
"""Triage profile model."""
|
77
|
+
|
78
|
+
id: str
|
79
|
+
name: str
|
80
|
+
description: Optional[str] = None
|
81
|
+
rules: List[str] = [] # Rule IDs
|
82
|
+
auto_apply: bool = False
|
83
|
+
organization_id: int = 0
|
84
|
+
created_at: Optional[datetime] = None
|
85
|
+
updated_at: Optional[datetime] = None
|
86
|
+
created_by: str
|
87
|
+
updated_by: Optional[str] = None
|
88
|
+
usage_count: int = 0
|
89
|
+
|
90
|
+
|
91
|
+
class TriageFilter(Filter):
|
92
|
+
"""Filter for triage queries."""
|
93
|
+
|
94
|
+
rule_name: Optional[str] = None
|
95
|
+
rule_type: Optional[List[TriageRuleType]] = None
|
96
|
+
severity: Optional[List[TriageSeverity]] = None
|
97
|
+
status: Optional[List[TriageStatus]] = None
|
98
|
+
tags: Optional[List[str]] = None
|
99
|
+
endpoint_id: Optional[str] = None
|
100
|
+
task_id: Optional[str] = None
|
101
|
+
created_by: Optional[str] = None
|
102
|
+
enabled: Optional[bool] = None
|
103
|
+
|
104
|
+
|
105
|
+
class CreateTriageRuleRequest(AIRBaseModel):
|
106
|
+
"""Request model for creating a triage rule."""
|
107
|
+
|
108
|
+
name: str
|
109
|
+
description: Optional[str] = None
|
110
|
+
type: TriageRuleType
|
111
|
+
rule_content: str
|
112
|
+
severity: TriageSeverity = TriageSeverity.MEDIUM
|
113
|
+
tags: List[str] = []
|
114
|
+
organization_id: int = 0
|
115
|
+
|
116
|
+
|
117
|
+
class UpdateTriageRuleRequest(AIRBaseModel):
|
118
|
+
"""Request model for updating a triage rule."""
|
119
|
+
|
120
|
+
name: Optional[str] = None
|
121
|
+
description: Optional[str] = None
|
122
|
+
rule_content: Optional[str] = None
|
123
|
+
enabled: Optional[bool] = None
|
124
|
+
severity: Optional[TriageSeverity] = None
|
125
|
+
tags: Optional[List[str]] = None
|
126
|
+
|
127
|
+
|
128
|
+
class CreateTriageTagRequest(AIRBaseModel):
|
129
|
+
"""Request model for creating a triage tag."""
|
130
|
+
|
131
|
+
name: str
|
132
|
+
organization_id: int = Field(default=0, serialization_alias="organizationId")
|
133
|
+
|
134
|
+
|
135
|
+
class CreateTriageProfileRequest(AIRBaseModel):
|
136
|
+
"""Request model for creating a triage profile."""
|
137
|
+
|
138
|
+
name: str
|
139
|
+
description: Optional[str] = None
|
140
|
+
rules: List[str] = [] # Rule IDs
|
141
|
+
auto_apply: bool = False
|
143
142
|
organization_id: int = 0
|