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.
Files changed (142) hide show
  1. binalyze_air/__init__.py +77 -77
  2. binalyze_air/apis/__init__.py +67 -27
  3. binalyze_air/apis/acquisitions.py +107 -0
  4. binalyze_air/apis/api_tokens.py +49 -0
  5. binalyze_air/apis/assets.py +161 -0
  6. binalyze_air/apis/audit_logs.py +26 -0
  7. binalyze_air/apis/{authentication.py → auth.py} +29 -27
  8. binalyze_air/apis/auto_asset_tags.py +79 -75
  9. binalyze_air/apis/backup.py +177 -0
  10. binalyze_air/apis/baseline.py +46 -0
  11. binalyze_air/apis/cases.py +225 -0
  12. binalyze_air/apis/cloud_forensics.py +116 -0
  13. binalyze_air/apis/event_subscription.py +96 -96
  14. binalyze_air/apis/evidence.py +249 -53
  15. binalyze_air/apis/interact.py +153 -36
  16. binalyze_air/apis/investigation_hub.py +234 -0
  17. binalyze_air/apis/license.py +104 -0
  18. binalyze_air/apis/logger.py +83 -0
  19. binalyze_air/apis/multipart_upload.py +201 -0
  20. binalyze_air/apis/notifications.py +115 -0
  21. binalyze_air/apis/organizations.py +267 -0
  22. binalyze_air/apis/params.py +44 -39
  23. binalyze_air/apis/policies.py +186 -0
  24. binalyze_air/apis/preset_filters.py +79 -0
  25. binalyze_air/apis/recent_activities.py +71 -0
  26. binalyze_air/apis/relay_server.py +104 -0
  27. binalyze_air/apis/settings.py +395 -27
  28. binalyze_air/apis/tasks.py +80 -0
  29. binalyze_air/apis/triage.py +197 -0
  30. binalyze_air/apis/user_management.py +183 -74
  31. binalyze_air/apis/webhook_executions.py +50 -0
  32. binalyze_air/apis/webhooks.py +322 -230
  33. binalyze_air/base.py +207 -133
  34. binalyze_air/client.py +217 -1337
  35. binalyze_air/commands/__init__.py +175 -145
  36. binalyze_air/commands/acquisitions.py +661 -387
  37. binalyze_air/commands/api_tokens.py +55 -0
  38. binalyze_air/commands/assets.py +324 -362
  39. binalyze_air/commands/{authentication.py → auth.py} +36 -36
  40. binalyze_air/commands/auto_asset_tags.py +230 -230
  41. binalyze_air/commands/backup.py +47 -0
  42. binalyze_air/commands/baseline.py +32 -396
  43. binalyze_air/commands/cases.py +609 -602
  44. binalyze_air/commands/cloud_forensics.py +88 -0
  45. binalyze_air/commands/event_subscription.py +101 -101
  46. binalyze_air/commands/evidences.py +918 -988
  47. binalyze_air/commands/interact.py +172 -58
  48. binalyze_air/commands/investigation_hub.py +315 -0
  49. binalyze_air/commands/license.py +183 -0
  50. binalyze_air/commands/logger.py +126 -0
  51. binalyze_air/commands/multipart_upload.py +363 -0
  52. binalyze_air/commands/notifications.py +45 -0
  53. binalyze_air/commands/organizations.py +200 -221
  54. binalyze_air/commands/policies.py +175 -203
  55. binalyze_air/commands/preset_filters.py +55 -0
  56. binalyze_air/commands/recent_activities.py +32 -0
  57. binalyze_air/commands/relay_server.py +144 -0
  58. binalyze_air/commands/settings.py +431 -29
  59. binalyze_air/commands/tasks.py +95 -56
  60. binalyze_air/commands/triage.py +224 -360
  61. binalyze_air/commands/user_management.py +351 -126
  62. binalyze_air/commands/webhook_executions.py +77 -0
  63. binalyze_air/config.py +244 -244
  64. binalyze_air/exceptions.py +49 -49
  65. binalyze_air/http_client.py +426 -305
  66. binalyze_air/models/__init__.py +287 -285
  67. binalyze_air/models/acquisitions.py +365 -250
  68. binalyze_air/models/api_tokens.py +73 -0
  69. binalyze_air/models/assets.py +438 -438
  70. binalyze_air/models/audit.py +247 -272
  71. binalyze_air/models/audit_logs.py +14 -0
  72. binalyze_air/models/{authentication.py → auth.py} +69 -69
  73. binalyze_air/models/auto_asset_tags.py +227 -116
  74. binalyze_air/models/backup.py +138 -0
  75. binalyze_air/models/baseline.py +231 -231
  76. binalyze_air/models/cases.py +275 -275
  77. binalyze_air/models/cloud_forensics.py +145 -0
  78. binalyze_air/models/event_subscription.py +170 -171
  79. binalyze_air/models/evidence.py +65 -65
  80. binalyze_air/models/evidences.py +367 -348
  81. binalyze_air/models/interact.py +266 -135
  82. binalyze_air/models/investigation_hub.py +265 -0
  83. binalyze_air/models/license.py +150 -0
  84. binalyze_air/models/logger.py +83 -0
  85. binalyze_air/models/multipart_upload.py +352 -0
  86. binalyze_air/models/notifications.py +138 -0
  87. binalyze_air/models/organizations.py +293 -293
  88. binalyze_air/models/params.py +153 -127
  89. binalyze_air/models/policies.py +260 -249
  90. binalyze_air/models/preset_filters.py +79 -0
  91. binalyze_air/models/recent_activities.py +70 -0
  92. binalyze_air/models/relay_server.py +121 -0
  93. binalyze_air/models/settings.py +538 -84
  94. binalyze_air/models/tasks.py +215 -149
  95. binalyze_air/models/triage.py +141 -142
  96. binalyze_air/models/user_management.py +200 -97
  97. binalyze_air/models/webhook_executions.py +33 -0
  98. binalyze_air/queries/__init__.py +121 -133
  99. binalyze_air/queries/acquisitions.py +155 -155
  100. binalyze_air/queries/api_tokens.py +46 -0
  101. binalyze_air/queries/assets.py +186 -105
  102. binalyze_air/queries/audit.py +400 -416
  103. binalyze_air/queries/{authentication.py → auth.py} +55 -55
  104. binalyze_air/queries/auto_asset_tags.py +59 -59
  105. binalyze_air/queries/backup.py +66 -0
  106. binalyze_air/queries/baseline.py +21 -185
  107. binalyze_air/queries/cases.py +292 -292
  108. binalyze_air/queries/cloud_forensics.py +137 -0
  109. binalyze_air/queries/event_subscription.py +54 -54
  110. binalyze_air/queries/evidence.py +139 -139
  111. binalyze_air/queries/evidences.py +279 -279
  112. binalyze_air/queries/interact.py +140 -28
  113. binalyze_air/queries/investigation_hub.py +329 -0
  114. binalyze_air/queries/license.py +85 -0
  115. binalyze_air/queries/logger.py +58 -0
  116. binalyze_air/queries/multipart_upload.py +180 -0
  117. binalyze_air/queries/notifications.py +71 -0
  118. binalyze_air/queries/organizations.py +222 -222
  119. binalyze_air/queries/params.py +154 -115
  120. binalyze_air/queries/policies.py +149 -149
  121. binalyze_air/queries/preset_filters.py +60 -0
  122. binalyze_air/queries/recent_activities.py +44 -0
  123. binalyze_air/queries/relay_server.py +42 -0
  124. binalyze_air/queries/settings.py +533 -20
  125. binalyze_air/queries/tasks.py +125 -81
  126. binalyze_air/queries/triage.py +230 -230
  127. binalyze_air/queries/user_management.py +193 -83
  128. binalyze_air/queries/webhook_executions.py +39 -0
  129. binalyze_air_sdk-1.0.3.dist-info/METADATA +752 -0
  130. binalyze_air_sdk-1.0.3.dist-info/RECORD +132 -0
  131. {binalyze_air_sdk-1.0.2.dist-info → binalyze_air_sdk-1.0.3.dist-info}/WHEEL +1 -1
  132. binalyze_air/apis/endpoints.py +0 -22
  133. binalyze_air/apis/evidences.py +0 -216
  134. binalyze_air/apis/users.py +0 -68
  135. binalyze_air/commands/users.py +0 -101
  136. binalyze_air/models/endpoints.py +0 -76
  137. binalyze_air/models/users.py +0 -82
  138. binalyze_air/queries/endpoints.py +0 -25
  139. binalyze_air/queries/users.py +0 -69
  140. binalyze_air_sdk-1.0.2.dist-info/METADATA +0 -706
  141. binalyze_air_sdk-1.0.2.dist-info/RECORD +0 -82
  142. {binalyze_air_sdk-1.0.2.dist-info → binalyze_air_sdk-1.0.3.dist-info}/top_level.txt +0 -0
@@ -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
- class TaskFilter(Filter):
143
- """Filter for task queries."""
144
-
145
- name: Optional[str] = None
146
- type: Optional[List[str]] = None
147
- status: Optional[List[str]] = None
148
- created_by: Optional[str] = None
149
- is_scheduled: Optional[bool] = None
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")
@@ -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
- from ..base import AIRBaseModel, Filter
10
-
11
-
12
- class TriageStatus(str, Enum):
13
- """Triage status."""
14
- PENDING = "pending"
15
- PROCESSING = "processing"
16
- COMPLETED = "completed"
17
- FAILED = "failed"
18
-
19
-
20
- class TriageSeverity(str, Enum):
21
- """Triage severity level."""
22
- LOW = "low"
23
- MEDIUM = "medium"
24
- HIGH = "high"
25
- CRITICAL = "critical"
26
-
27
-
28
- class TriageRuleType(str, Enum):
29
- """Triage rule type."""
30
- YARA = "yara"
31
- SIGMA = "sigma"
32
- OSQUERY = "osquery"
33
- REGEX = "regex"
34
- HASH = "hash"
35
- CUSTOM = "custom"
36
-
37
-
38
- class TriageTag(AIRBaseModel):
39
- """Triage tag model."""
40
-
41
- id: str
42
- name: str
43
- description: Optional[str] = None
44
- color: str = "#3498db"
45
- created_at: Optional[datetime] = None
46
- created_by: str
47
- organization_id: int = 0
48
- usage_count: int = 0
49
-
50
-
51
- class TriageRule(AIRBaseModel):
52
- """Triage rule model."""
53
-
54
- id: str
55
- name: str
56
- description: Optional[str] = None
57
- type: TriageRuleType
58
- rule_content: str
59
- enabled: bool = True
60
- severity: TriageSeverity = TriageSeverity.MEDIUM
61
- tags: List[str] = []
62
- search_in: Optional[str] = None
63
- organization_id: int = 0
64
- organization_ids: List[int] = []
65
- created_at: Optional[datetime] = None
66
- updated_at: Optional[datetime] = None
67
- created_by: str
68
- updated_by: Optional[str] = None
69
- match_count: int = 0
70
- last_match: Optional[datetime] = None
71
- deletable: Optional[bool] = None
72
-
73
-
74
- class TriageProfile(AIRBaseModel):
75
- """Triage profile model."""
76
-
77
- id: str
78
- name: str
79
- description: Optional[str] = None
80
- rules: List[str] = [] # Rule IDs
81
- auto_apply: bool = False
82
- organization_id: int = 0
83
- created_at: Optional[datetime] = None
84
- updated_at: Optional[datetime] = None
85
- created_by: str
86
- updated_by: Optional[str] = None
87
- usage_count: int = 0
88
-
89
-
90
- class TriageFilter(Filter):
91
- """Filter for triage queries."""
92
-
93
- rule_name: Optional[str] = None
94
- rule_type: Optional[List[TriageRuleType]] = None
95
- severity: Optional[List[TriageSeverity]] = None
96
- status: Optional[List[TriageStatus]] = None
97
- tags: Optional[List[str]] = None
98
- endpoint_id: Optional[str] = None
99
- task_id: Optional[str] = None
100
- created_by: Optional[str] = None
101
- enabled: Optional[bool] = None
102
-
103
-
104
- class CreateTriageRuleRequest(AIRBaseModel):
105
- """Request model for creating a triage rule."""
106
-
107
- name: str
108
- description: Optional[str] = None
109
- type: TriageRuleType
110
- rule_content: str
111
- severity: TriageSeverity = TriageSeverity.MEDIUM
112
- tags: List[str] = []
113
- organization_id: int = 0
114
-
115
-
116
- class UpdateTriageRuleRequest(AIRBaseModel):
117
- """Request model for updating a triage rule."""
118
-
119
- name: Optional[str] = None
120
- description: Optional[str] = None
121
- rule_content: Optional[str] = None
122
- enabled: Optional[bool] = None
123
- severity: Optional[TriageSeverity] = None
124
- tags: Optional[List[str]] = None
125
-
126
-
127
- class CreateTriageTagRequest(AIRBaseModel):
128
- """Request model for creating a triage tag."""
129
-
130
- name: str
131
- description: Optional[str] = None
132
- color: str = "#3498db"
133
- organization_id: int = 0
134
-
135
-
136
- class CreateTriageProfileRequest(AIRBaseModel):
137
- """Request model for creating a triage profile."""
138
-
139
- name: str
140
- description: Optional[str] = None
141
- rules: List[str] = [] # Rule IDs
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