scanner-client 0.1.0rc2__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.
- scanner_client/__init__.py +1 -0
- scanner_client/detection_rule.py +267 -0
- scanner_client/event_sink.py +233 -0
- scanner_client/example.py +75 -0
- scanner_client/http_err.py +12 -0
- scanner_client/query.py +143 -0
- scanner_client/raw_api/__init__.py +8 -0
- scanner_client/raw_api/api/__init__.py +1 -0
- scanner_client/raw_api/api/detection_rule/__init__.py +0 -0
- scanner_client/raw_api/api/detection_rule/create_detection_rule.py +198 -0
- scanner_client/raw_api/api/detection_rule/delete_detection_rule.py +177 -0
- scanner_client/raw_api/api/detection_rule/get_detection_rule.py +177 -0
- scanner_client/raw_api/api/detection_rule/list_detection_rules.py +186 -0
- scanner_client/raw_api/api/detection_rule/update_detection_rule.py +199 -0
- scanner_client/raw_api/api/event_sink/__init__.py +0 -0
- scanner_client/raw_api/api/event_sink/create_event_sink.py +186 -0
- scanner_client/raw_api/api/event_sink/delete_event_sink.py +177 -0
- scanner_client/raw_api/api/event_sink/get_event_sink.py +177 -0
- scanner_client/raw_api/api/event_sink/list_event_sinks.py +186 -0
- scanner_client/raw_api/api/event_sink/update_event_sink.py +199 -0
- scanner_client/raw_api/api/query/__init__.py +0 -0
- scanner_client/raw_api/api/query/query_progress.py +177 -0
- scanner_client/raw_api/api/query/start_blocking_query.py +194 -0
- scanner_client/raw_api/api/query/start_query.py +194 -0
- scanner_client/raw_api/client.py +268 -0
- scanner_client/raw_api/errors.py +14 -0
- scanner_client/raw_api/models/__init__.py +153 -0
- scanner_client/raw_api/models/ad_hoc_query_progress_metadata.py +71 -0
- scanner_client/raw_api/models/ad_hoc_query_progress_response.py +102 -0
- scanner_client/raw_api/models/ad_hoc_row_item.py +110 -0
- scanner_client/raw_api/models/ad_hoc_row_item_columns.py +75 -0
- scanner_client/raw_api/models/ad_hoc_table_result.py +157 -0
- scanner_client/raw_api/models/ad_hoc_table_result_column_tags.py +73 -0
- scanner_client/raw_api/models/create_detection_rule_request_data.py +319 -0
- scanner_client/raw_api/models/create_event_sink_args_type_0.py +60 -0
- scanner_client/raw_api/models/create_event_sink_args_type_1.py +60 -0
- scanner_client/raw_api/models/create_event_sink_request_data.py +130 -0
- scanner_client/raw_api/models/create_slack_event_sink_args.py +79 -0
- scanner_client/raw_api/models/create_webhook_event_sink_args.py +71 -0
- scanner_client/raw_api/models/crud_api_request_and_response_data_for_detection_rule_api_handler_type_0.py +60 -0
- scanner_client/raw_api/models/crud_api_request_and_response_data_for_detection_rule_api_handler_type_1.py +60 -0
- scanner_client/raw_api/models/crud_api_request_and_response_data_for_detection_rule_api_handler_type_2.py +60 -0
- scanner_client/raw_api/models/crud_api_request_and_response_data_for_detection_rule_api_handler_type_3.py +60 -0
- scanner_client/raw_api/models/crud_api_request_and_response_data_for_detection_rule_api_handler_type_4.py +60 -0
- scanner_client/raw_api/models/crud_api_request_and_response_data_for_detection_rule_api_handler_type_5.py +60 -0
- scanner_client/raw_api/models/crud_api_request_and_response_data_for_detection_rule_api_handler_type_6.py +60 -0
- scanner_client/raw_api/models/crud_api_request_and_response_data_for_detection_rule_api_handler_type_7.py +60 -0
- scanner_client/raw_api/models/crud_api_request_and_response_data_for_event_sink_api_handler_type_0.py +60 -0
- scanner_client/raw_api/models/crud_api_request_and_response_data_for_event_sink_api_handler_type_1.py +60 -0
- scanner_client/raw_api/models/crud_api_request_and_response_data_for_event_sink_api_handler_type_2.py +60 -0
- scanner_client/raw_api/models/crud_api_request_and_response_data_for_event_sink_api_handler_type_3.py +60 -0
- scanner_client/raw_api/models/crud_api_request_and_response_data_for_event_sink_api_handler_type_4.py +60 -0
- scanner_client/raw_api/models/crud_api_request_and_response_data_for_event_sink_api_handler_type_5.py +60 -0
- scanner_client/raw_api/models/crud_api_request_and_response_data_for_event_sink_api_handler_type_6.py +60 -0
- scanner_client/raw_api/models/crud_api_request_and_response_data_for_event_sink_api_handler_type_7.py +60 -0
- scanner_client/raw_api/models/delete_detection_rule_request_data.py +71 -0
- scanner_client/raw_api/models/delete_detection_rule_response_data.py +79 -0
- scanner_client/raw_api/models/delete_event_sink_request_data.py +71 -0
- scanner_client/raw_api/models/delete_event_sink_response_data.py +79 -0
- scanner_client/raw_api/models/detection_rule.py +369 -0
- scanner_client/raw_api/models/detection_rule_summary.py +355 -0
- scanner_client/raw_api/models/detection_severity_type_0.py +7 -0
- scanner_client/raw_api/models/detection_severity_type_1.py +7 -0
- scanner_client/raw_api/models/detection_severity_type_2.py +7 -0
- scanner_client/raw_api/models/detection_severity_type_3.py +7 -0
- scanner_client/raw_api/models/detection_severity_type_4.py +7 -0
- scanner_client/raw_api/models/detection_severity_type_5.py +7 -0
- scanner_client/raw_api/models/detection_severity_type_6.py +7 -0
- scanner_client/raw_api/models/detection_severity_type_7.py +7 -0
- scanner_client/raw_api/models/event_sink.py +204 -0
- scanner_client/raw_api/models/event_sink_configuration_type_0.py +7 -0
- scanner_client/raw_api/models/event_sink_configuration_type_1.py +61 -0
- scanner_client/raw_api/models/event_sink_configuration_type_2.py +61 -0
- scanner_client/raw_api/models/event_sink_configuration_type_3.py +60 -0
- scanner_client/raw_api/models/event_sink_type.py +10 -0
- scanner_client/raw_api/models/get_detection_rule_by_sync_key_request_data.py +71 -0
- scanner_client/raw_api/models/get_detection_rule_request_data.py +71 -0
- scanner_client/raw_api/models/get_detection_rule_response_data.py +80 -0
- scanner_client/raw_api/models/get_detection_rule_summary_response_data.py +80 -0
- scanner_client/raw_api/models/get_event_sink_request_data.py +71 -0
- scanner_client/raw_api/models/get_event_sink_response_data.py +80 -0
- scanner_client/raw_api/models/list_detection_rules_request_data.py +71 -0
- scanner_client/raw_api/models/list_detection_rules_response_data.py +93 -0
- scanner_client/raw_api/models/list_event_sinks_request_data.py +71 -0
- scanner_client/raw_api/models/list_event_sinks_response_data.py +93 -0
- scanner_client/raw_api/models/log_event_id.py +79 -0
- scanner_client/raw_api/models/no_data.py +43 -0
- scanner_client/raw_api/models/rbac_detection_rule_permission_type.py +10 -0
- scanner_client/raw_api/models/slack_configuration.py +72 -0
- scanner_client/raw_api/models/start_ad_hoc_query_request_data.py +218 -0
- scanner_client/raw_api/models/start_ad_hoc_query_response.py +71 -0
- scanner_client/raw_api/models/starting_permissions_for_rbac_detection_rule_permission_type.py +81 -0
- scanner_client/raw_api/models/starting_permissions_for_rbac_detection_rule_permission_type_permissions_by_role.py +84 -0
- scanner_client/raw_api/models/table_ui_state_type.py +9 -0
- scanner_client/raw_api/models/tines_configuration.py +80 -0
- scanner_client/raw_api/models/update_detection_rule_request_data.py +408 -0
- scanner_client/raw_api/models/update_event_sink_args_type_0.py +60 -0
- scanner_client/raw_api/models/update_event_sink_args_type_1.py +60 -0
- scanner_client/raw_api/models/update_event_sink_request_data.py +171 -0
- scanner_client/raw_api/models/update_slack_event_sink_args.py +71 -0
- scanner_client/raw_api/models/update_webhook_event_sink_args.py +71 -0
- scanner_client/raw_api/models/webhook_configuration.py +72 -0
- scanner_client/raw_api/py.typed +1 -0
- scanner_client/raw_api/types.py +44 -0
- scanner_client/scanner.py +71 -0
- scanner_client/wasm_transport.py +92 -0
- scanner_client-0.1.0rc2.dist-info/LICENSE +201 -0
- scanner_client-0.1.0rc2.dist-info/METADATA +127 -0
- scanner_client-0.1.0rc2.dist-info/RECORD +111 -0
- scanner_client-0.1.0rc2.dist-info/WHEEL +5 -0
- scanner_client-0.1.0rc2.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .scanner import Scanner, AsyncScanner
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
from .http_err import get_body_and_handle_err
|
|
4
|
+
from .raw_api.api.detection_rule import \
|
|
5
|
+
list_detection_rules, create_detection_rule, get_detection_rule, \
|
|
6
|
+
update_detection_rule, delete_detection_rule
|
|
7
|
+
from .raw_api.models import ListDetectionRulesRequestData, CreateDetectionRuleRequestData, DeleteDetectionRuleResponseData,\
|
|
8
|
+
DetectionRule as DetectionRuleJson, \
|
|
9
|
+
DetectionRuleSummary, \
|
|
10
|
+
UpdateDetectionRuleRequestData, \
|
|
11
|
+
DetectionSeverityType0, DetectionSeverityType1, DetectionSeverityType2, DetectionSeverityType3, \
|
|
12
|
+
DetectionSeverityType4, DetectionSeverityType5, DetectionSeverityType6, DetectionSeverityType7, \
|
|
13
|
+
StartingPermissionsForRbacDetectionRulePermissionType, StartingPermissionsForRbacDetectionRulePermissionTypePermissionsByRole, \
|
|
14
|
+
RbacDetectionRulePermissionType
|
|
15
|
+
from .raw_api.client import AuthenticatedClient
|
|
16
|
+
from .raw_api.types import Unset, UNSET
|
|
17
|
+
|
|
18
|
+
# TODO: this is currently kinda awkward to deal with. Ideally we can get the
|
|
19
|
+
# openapi schema to just include a single DetectionSeverity enum, instead of a
|
|
20
|
+
# union type across 7 enums each with one variant.
|
|
21
|
+
DetectionSeverity = DetectionSeverityType0 \
|
|
22
|
+
| DetectionSeverityType1 \
|
|
23
|
+
| DetectionSeverityType2 \
|
|
24
|
+
| DetectionSeverityType3 \
|
|
25
|
+
| DetectionSeverityType4 \
|
|
26
|
+
| DetectionSeverityType5 \
|
|
27
|
+
| DetectionSeverityType6 \
|
|
28
|
+
| DetectionSeverityType7
|
|
29
|
+
|
|
30
|
+
def starting_permissions_for_detection_rule(
|
|
31
|
+
starting_permissions: dict[str, list[RbacDetectionRulePermissionType]]
|
|
32
|
+
) -> StartingPermissionsForRbacDetectionRulePermissionType:
|
|
33
|
+
return StartingPermissionsForRbacDetectionRulePermissionType(
|
|
34
|
+
permissions_by_role=StartingPermissionsForRbacDetectionRulePermissionTypePermissionsByRole.from_dict(starting_permissions),
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class DetectionRule():
|
|
39
|
+
_client: AuthenticatedClient
|
|
40
|
+
|
|
41
|
+
def __init__(self, client: AuthenticatedClient) -> None:
|
|
42
|
+
self._client = client
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def list_all(self, tenant_id: str) -> list[DetectionRuleSummary]:
|
|
46
|
+
req_body = ListDetectionRulesRequestData(
|
|
47
|
+
tenant_id=tenant_id
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
resp = list_detection_rules.sync_detailed(
|
|
51
|
+
client=self._client,
|
|
52
|
+
body=req_body
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
resp_body = get_body_and_handle_err(resp)
|
|
56
|
+
|
|
57
|
+
return resp_body.detection_rules
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def create(
|
|
61
|
+
self,
|
|
62
|
+
tenant_id: str,
|
|
63
|
+
name: str,
|
|
64
|
+
description: str,
|
|
65
|
+
time_range_s: int,
|
|
66
|
+
run_frequency_s: int,
|
|
67
|
+
enabled: bool,
|
|
68
|
+
severity: DetectionSeverity,
|
|
69
|
+
query_text: str,
|
|
70
|
+
event_sink_ids: list[str],
|
|
71
|
+
starting_permissions: Optional[StartingPermissionsForRbacDetectionRulePermissionType] | Unset = UNSET,
|
|
72
|
+
sync_key: Optional[str] | Unset = UNSET,
|
|
73
|
+
) -> DetectionRuleJson:
|
|
74
|
+
req_body = CreateDetectionRuleRequestData(
|
|
75
|
+
tenant_id = tenant_id,
|
|
76
|
+
name = name,
|
|
77
|
+
description = description,
|
|
78
|
+
time_range_s = time_range_s,
|
|
79
|
+
run_frequency_s = run_frequency_s,
|
|
80
|
+
enabled = enabled,
|
|
81
|
+
severity = severity.value,
|
|
82
|
+
query_text = query_text,
|
|
83
|
+
event_sink_ids = event_sink_ids,
|
|
84
|
+
starting_permissions = starting_permissions,
|
|
85
|
+
sync_key = sync_key,
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
resp = create_detection_rule.sync_detailed(
|
|
89
|
+
client=self._client,
|
|
90
|
+
body=req_body
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
resp_body = get_body_and_handle_err(resp)
|
|
94
|
+
|
|
95
|
+
return resp_body.detection_rule
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def get(self, detection_rule_id: str) -> DetectionRuleJson:
|
|
99
|
+
resp = get_detection_rule.sync_detailed(
|
|
100
|
+
detection_rule_id,
|
|
101
|
+
client=self._client
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
resp_body = get_body_and_handle_err(resp)
|
|
105
|
+
|
|
106
|
+
return resp_body.detection_rule
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def update(
|
|
110
|
+
self,
|
|
111
|
+
detection_rule_id: str,
|
|
112
|
+
name: str | Unset = UNSET,
|
|
113
|
+
description: str | Unset = UNSET,
|
|
114
|
+
time_range_s: int | Unset = UNSET,
|
|
115
|
+
run_frequency_s: int | Unset = UNSET,
|
|
116
|
+
enabled: bool | Unset = UNSET,
|
|
117
|
+
severity: DetectionSeverity | Unset = UNSET,
|
|
118
|
+
query_text: str | Unset = UNSET,
|
|
119
|
+
event_sink_ids: list[str] | Unset = UNSET,
|
|
120
|
+
sync_key: Optional[str] | Unset = UNSET,
|
|
121
|
+
) -> DetectionRuleJson:
|
|
122
|
+
req_body = UpdateDetectionRuleRequestData(
|
|
123
|
+
id=detection_rule_id,
|
|
124
|
+
name=name,
|
|
125
|
+
description=description,
|
|
126
|
+
time_range_s=time_range_s,
|
|
127
|
+
run_frequency_s=run_frequency_s,
|
|
128
|
+
enabled=enabled,
|
|
129
|
+
severity=severity,
|
|
130
|
+
query_text=query_text,
|
|
131
|
+
event_sink_ids=event_sink_ids,
|
|
132
|
+
sync_key=sync_key
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
resp = update_detection_rule.sync_detailed(
|
|
136
|
+
detection_rule_id,
|
|
137
|
+
client=self._client,
|
|
138
|
+
body=req_body
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
resp_body = get_body_and_handle_err(resp)
|
|
142
|
+
|
|
143
|
+
return resp_body.detection_rule
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def delete(self, detection_rule_id: str) -> DeleteDetectionRuleResponseData:
|
|
147
|
+
resp = delete_detection_rule.sync_detailed(
|
|
148
|
+
detection_rule_id,
|
|
149
|
+
client=self._client
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
return get_body_and_handle_err(resp)
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
class AsyncDetectionRule():
|
|
156
|
+
_client: AuthenticatedClient
|
|
157
|
+
|
|
158
|
+
def __init__(self, client: AuthenticatedClient) -> None:
|
|
159
|
+
self._client = client
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
async def list_all(self, tenant_id: str) -> list[DetectionRuleSummary]:
|
|
163
|
+
req_body = ListDetectionRulesRequestData(
|
|
164
|
+
tenant_id=tenant_id
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
resp = await list_detection_rules.asyncio_detailed(
|
|
168
|
+
client=self._client,
|
|
169
|
+
body=req_body
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
resp_body = get_body_and_handle_err(resp)
|
|
173
|
+
|
|
174
|
+
return resp_body.detection_rules
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
async def create(
|
|
178
|
+
self,
|
|
179
|
+
tenant_id: str,
|
|
180
|
+
name: str,
|
|
181
|
+
description: str,
|
|
182
|
+
time_range_s: int,
|
|
183
|
+
run_frequency_s: int,
|
|
184
|
+
enabled: bool,
|
|
185
|
+
severity: DetectionSeverity,
|
|
186
|
+
query_text: str,
|
|
187
|
+
event_sink_ids: list[str],
|
|
188
|
+
sync_key: Optional[str] | Unset = UNSET,
|
|
189
|
+
) -> DetectionRuleJson:
|
|
190
|
+
req_body = CreateDetectionRuleRequestData(
|
|
191
|
+
tenant_id = tenant_id,
|
|
192
|
+
name = name,
|
|
193
|
+
description = description,
|
|
194
|
+
time_range_s = time_range_s,
|
|
195
|
+
run_frequency_s = run_frequency_s,
|
|
196
|
+
enabled = enabled,
|
|
197
|
+
severity = severity.value,
|
|
198
|
+
query_text = query_text,
|
|
199
|
+
event_sink_ids = event_sink_ids,
|
|
200
|
+
sync_key = sync_key,
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
resp = await create_detection_rule.asyncio_detailed(
|
|
204
|
+
client=self._client,
|
|
205
|
+
body=req_body
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
resp_body = get_body_and_handle_err(resp)
|
|
209
|
+
|
|
210
|
+
return resp_body.detection_rule
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
async def get(self, detection_rule_id: str) -> DetectionRuleJson:
|
|
214
|
+
resp = await get_detection_rule.asyncio_detailed(
|
|
215
|
+
detection_rule_id,
|
|
216
|
+
client=self._client
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
resp_body = get_body_and_handle_err(resp)
|
|
220
|
+
|
|
221
|
+
return resp_body.detection_rule
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
async def update(
|
|
225
|
+
self,
|
|
226
|
+
detection_rule_id: str,
|
|
227
|
+
name: str | Unset = UNSET,
|
|
228
|
+
description: str | Unset = UNSET,
|
|
229
|
+
time_range_s: int | Unset = UNSET,
|
|
230
|
+
run_frequency_s: int | Unset = UNSET,
|
|
231
|
+
enabled: bool | Unset = UNSET,
|
|
232
|
+
severity: DetectionSeverity | Unset = UNSET,
|
|
233
|
+
query_text: str | Unset = UNSET,
|
|
234
|
+
event_sink_ids: list[str] | Unset = UNSET,
|
|
235
|
+
sync_key: Optional[str] | Unset = UNSET,
|
|
236
|
+
) -> DetectionRuleJson:
|
|
237
|
+
req_body = UpdateDetectionRuleRequestData(
|
|
238
|
+
id=detection_rule_id,
|
|
239
|
+
name=name,
|
|
240
|
+
description=description,
|
|
241
|
+
time_range_s=time_range_s,
|
|
242
|
+
run_frequency_s=run_frequency_s,
|
|
243
|
+
enabled=enabled,
|
|
244
|
+
severity=severity,
|
|
245
|
+
query_text=query_text,
|
|
246
|
+
event_sink_ids=event_sink_ids,
|
|
247
|
+
sync_key=sync_key
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
resp = await update_detection_rule.asyncio_detailed(
|
|
251
|
+
detection_rule_id,
|
|
252
|
+
client=self._client,
|
|
253
|
+
body=req_body
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
resp_body = get_body_and_handle_err(resp)
|
|
257
|
+
|
|
258
|
+
return resp_body.detection_rule
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
async def delete(self, detection_rule_id: str) -> DeleteDetectionRuleResponseData:
|
|
262
|
+
resp = await delete_detection_rule.asyncio_detailed(
|
|
263
|
+
detection_rule_id,
|
|
264
|
+
client=self._client
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
return get_body_and_handle_err(resp)
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
from .http_err import get_body_and_handle_err
|
|
4
|
+
from .raw_api.api.event_sink import \
|
|
5
|
+
list_event_sinks, create_event_sink, get_event_sink, update_event_sink, delete_event_sink
|
|
6
|
+
from .raw_api.models import ListEventSinksRequestData, CreateEventSinkRequestData, \
|
|
7
|
+
EventSink as EventSinkJson, UpdateEventSinkRequestData, CreateEventSinkArgsType0, \
|
|
8
|
+
CreateEventSinkArgsType1, CreateSlackEventSinkArgs, CreateWebhookEventSinkArgs, \
|
|
9
|
+
UpdateEventSinkArgsType0, UpdateEventSinkArgsType1, UpdateSlackEventSinkArgs, \
|
|
10
|
+
UpdateWebhookEventSinkArgs, DeleteEventSinkResponseData
|
|
11
|
+
from .raw_api.client import AuthenticatedClient
|
|
12
|
+
from .raw_api.types import Unset, UNSET
|
|
13
|
+
|
|
14
|
+
CreateEventSinkArgs = CreateEventSinkArgsType0 | CreateEventSinkArgsType1
|
|
15
|
+
UpdateEventSinkArgs = UpdateEventSinkArgsType0 | UpdateEventSinkArgsType1
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def create_slack_event_sink_args(
|
|
19
|
+
channel: str,
|
|
20
|
+
slack_oauth_code: str
|
|
21
|
+
) -> CreateEventSinkArgsType0:
|
|
22
|
+
return CreateEventSinkArgsType0(
|
|
23
|
+
slack=CreateSlackEventSinkArgs(
|
|
24
|
+
channel=channel,
|
|
25
|
+
slack_oauth_code=slack_oauth_code
|
|
26
|
+
)
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def create_webhook_event_sink_args(url: str) -> CreateEventSinkArgsType1:
|
|
31
|
+
return CreateEventSinkArgsType1(
|
|
32
|
+
webhook=CreateWebhookEventSinkArgs(
|
|
33
|
+
url=url
|
|
34
|
+
)
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def update_slack_event_sink_args(channel: str) -> UpdateEventSinkArgsType0:
|
|
39
|
+
return UpdateEventSinkArgsType0(
|
|
40
|
+
slack=UpdateSlackEventSinkArgs(
|
|
41
|
+
channel=channel,
|
|
42
|
+
)
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def update_webhook_event_sink_args(url: str) -> UpdateEventSinkArgsType1:
|
|
47
|
+
return UpdateEventSinkArgsType1(
|
|
48
|
+
webhook=UpdateWebhookEventSinkArgs(
|
|
49
|
+
url=url
|
|
50
|
+
)
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class EventSink():
|
|
55
|
+
_client: AuthenticatedClient
|
|
56
|
+
|
|
57
|
+
def __init__(self, client: AuthenticatedClient) -> None:
|
|
58
|
+
self._client = client
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def list_all(self, tenant_id: str) -> list[EventSinkJson]:
|
|
62
|
+
req_body = ListEventSinksRequestData(
|
|
63
|
+
tenant_id=tenant_id
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
resp = list_event_sinks.sync_detailed(
|
|
67
|
+
client=self._client,
|
|
68
|
+
body=req_body
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
resp_body = get_body_and_handle_err(resp)
|
|
72
|
+
|
|
73
|
+
return resp_body.event_sinks
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def create(
|
|
77
|
+
self,
|
|
78
|
+
tenant_id: str,
|
|
79
|
+
name: str,
|
|
80
|
+
description: str,
|
|
81
|
+
event_sink_args: CreateEventSinkArgs
|
|
82
|
+
) -> EventSinkJson:
|
|
83
|
+
req_body = CreateEventSinkRequestData(
|
|
84
|
+
tenant_id=tenant_id,
|
|
85
|
+
name=name,
|
|
86
|
+
description=description,
|
|
87
|
+
event_sink_args=event_sink_args
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
resp = create_event_sink.sync_detailed(
|
|
91
|
+
client=self._client,
|
|
92
|
+
body=req_body
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
resp_body = get_body_and_handle_err(resp)
|
|
96
|
+
|
|
97
|
+
return resp_body.event_sink
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def get(self, event_sink_id: str) -> EventSinkJson:
|
|
101
|
+
resp = get_event_sink.sync_detailed(
|
|
102
|
+
event_sink_id,
|
|
103
|
+
client=self._client
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
resp_body = get_body_and_handle_err(resp)
|
|
107
|
+
|
|
108
|
+
return resp_body.event_sink
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def update(
|
|
112
|
+
self,
|
|
113
|
+
event_sink_id: str,
|
|
114
|
+
name: str | Unset = UNSET,
|
|
115
|
+
description: str | Unset = UNSET,
|
|
116
|
+
event_sink_args: UpdateEventSinkArgs | Unset = UNSET
|
|
117
|
+
) -> EventSinkJson:
|
|
118
|
+
req_body = UpdateEventSinkRequestData(
|
|
119
|
+
id=event_sink_id,
|
|
120
|
+
name=name,
|
|
121
|
+
description=description,
|
|
122
|
+
event_sink_args=event_sink_args
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
resp = update_event_sink.sync_detailed(
|
|
126
|
+
event_sink_id,
|
|
127
|
+
client=self._client,
|
|
128
|
+
body=req_body
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
resp_body = get_body_and_handle_err(resp)
|
|
132
|
+
|
|
133
|
+
return resp_body.event_sink
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def delete(self, event_sink_id: str) -> DeleteEventSinkResponseData:
|
|
137
|
+
resp = delete_event_sink.sync_detailed(
|
|
138
|
+
event_sink_id,
|
|
139
|
+
client=self._client
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
return get_body_and_handle_err(resp)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
class AsyncEventSink():
|
|
146
|
+
_client: AuthenticatedClient
|
|
147
|
+
|
|
148
|
+
def __init__(self, client: AuthenticatedClient) -> None:
|
|
149
|
+
self._client = client
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
async def list_all(self, tenant_id: str) -> list[EventSinkJson]:
|
|
153
|
+
req_body = ListEventSinksRequestData(
|
|
154
|
+
tenant_id=tenant_id
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
resp = await list_event_sinks.asyncio_detailed(
|
|
158
|
+
client=self._client,
|
|
159
|
+
body=req_body
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
resp_body = get_body_and_handle_err(resp)
|
|
163
|
+
|
|
164
|
+
return resp_body.event_sinks
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
async def create(
|
|
168
|
+
self,
|
|
169
|
+
tenant_id: str,
|
|
170
|
+
name: str,
|
|
171
|
+
description: str,
|
|
172
|
+
event_sink_args: CreateEventSinkArgs
|
|
173
|
+
) -> EventSinkJson:
|
|
174
|
+
req_body = CreateEventSinkRequestData(
|
|
175
|
+
tenant_id=tenant_id,
|
|
176
|
+
name=name,
|
|
177
|
+
description=description,
|
|
178
|
+
event_sink_args=event_sink_args
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
resp = await create_event_sink.asyncio_detailed(
|
|
182
|
+
client=self._client,
|
|
183
|
+
body=req_body
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
resp_body = get_body_and_handle_err(resp)
|
|
187
|
+
|
|
188
|
+
return resp_body.event_sink
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
async def get(self, event_sink_id: str) -> EventSinkJson:
|
|
192
|
+
resp = await get_event_sink.asyncio_detailed(
|
|
193
|
+
event_sink_id,
|
|
194
|
+
client=self._client
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
resp_body = get_body_and_handle_err(resp)
|
|
198
|
+
|
|
199
|
+
return resp_body.event_sink
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
async def update(
|
|
203
|
+
self,
|
|
204
|
+
event_sink_id: str,
|
|
205
|
+
name: str | Unset = UNSET,
|
|
206
|
+
description: str | Unset = UNSET,
|
|
207
|
+
event_sink_args: UpdateEventSinkArgs | Unset = UNSET
|
|
208
|
+
) -> EventSinkJson:
|
|
209
|
+
req_body = UpdateEventSinkRequestData(
|
|
210
|
+
id=event_sink_id,
|
|
211
|
+
name=name,
|
|
212
|
+
description=description,
|
|
213
|
+
event_sink_args=event_sink_args
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
resp = await update_event_sink.asyncio_detailed(
|
|
217
|
+
event_sink_id,
|
|
218
|
+
client=self._client,
|
|
219
|
+
body=req_body
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
resp_body = get_body_and_handle_err(resp)
|
|
223
|
+
|
|
224
|
+
return resp_body.event_sink
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
async def delete(self, event_sink_id: str) -> DeleteEventSinkResponseData:
|
|
228
|
+
resp = await delete_event_sink.asyncio_detailed(
|
|
229
|
+
event_sink_id,
|
|
230
|
+
client=self._client
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
return get_body_and_handle_err(resp)
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import os
|
|
3
|
+
import time
|
|
4
|
+
|
|
5
|
+
from .scanner import Scanner, AsyncScanner
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def query_example():
|
|
9
|
+
# Create Scanner client
|
|
10
|
+
scanner = Scanner(
|
|
11
|
+
api_url=os.environ["SCANNER_API_URL"],
|
|
12
|
+
api_key=os.environ["SCANNER_API_KEY"],
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
# Start query
|
|
16
|
+
qr_id = scanner.query.start_query(
|
|
17
|
+
query_text="* | count",
|
|
18
|
+
start_time="2024-04-05T23:47:11.575Z",
|
|
19
|
+
end_time="2024-04-06T00:02:11.575Z",
|
|
20
|
+
).qr_id
|
|
21
|
+
|
|
22
|
+
# Check query progress
|
|
23
|
+
while True:
|
|
24
|
+
print("Checking query progress")
|
|
25
|
+
query_progress = scanner.query.query_progress(qr_id)
|
|
26
|
+
if query_progress.is_completed:
|
|
27
|
+
print(query_progress.results)
|
|
28
|
+
break
|
|
29
|
+
|
|
30
|
+
time.sleep(1)
|
|
31
|
+
|
|
32
|
+
# Run blocking query
|
|
33
|
+
response = scanner.query.blocking_query(
|
|
34
|
+
query_text="* | count",
|
|
35
|
+
start_time="2024-04-05T23:47:11.575Z",
|
|
36
|
+
end_time="2024-04-06T00:02:11.575Z",
|
|
37
|
+
)
|
|
38
|
+
print(response.results)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
async def async_query_example():
|
|
42
|
+
# Create AsyncScanner client
|
|
43
|
+
scanner = AsyncScanner(
|
|
44
|
+
api_url=os.environ["SCANNER_API_URL"],
|
|
45
|
+
api_key=os.environ["SCANNER_API_KEY"],
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
# Start query
|
|
49
|
+
qr_id = (await scanner.query.start_query(
|
|
50
|
+
query_text="* | count",
|
|
51
|
+
start_time="2024-04-05T23:47:11.575Z",
|
|
52
|
+
end_time="2024-04-06T00:02:11.575Z",
|
|
53
|
+
)).qr_id
|
|
54
|
+
|
|
55
|
+
# Check query progress
|
|
56
|
+
while True:
|
|
57
|
+
print("Checking query progress")
|
|
58
|
+
query_progress = await scanner.query.query_progress(qr_id)
|
|
59
|
+
if query_progress.is_completed:
|
|
60
|
+
print(query_progress.results)
|
|
61
|
+
break
|
|
62
|
+
|
|
63
|
+
time.sleep(1)
|
|
64
|
+
|
|
65
|
+
# Run blocking query
|
|
66
|
+
response = await scanner.query.blocking_query(
|
|
67
|
+
query_text="* | count",
|
|
68
|
+
start_time="2024-04-05T23:47:11.575Z",
|
|
69
|
+
end_time="2024-04-06T00:02:11.575Z",
|
|
70
|
+
)
|
|
71
|
+
print(response.results)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
#query_example()
|
|
75
|
+
asyncio.run(async_query_example())
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
from typing import TypeVar
|
|
2
|
+
|
|
3
|
+
from .raw_api.types import Response
|
|
4
|
+
|
|
5
|
+
T = TypeVar("T")
|
|
6
|
+
|
|
7
|
+
def get_body_and_handle_err(response: Response[T]) -> T:
|
|
8
|
+
if response.status_code != 200:
|
|
9
|
+
raise Exception(f"Status code={response.status_code}, content={response.content.decode()}")
|
|
10
|
+
if response.parsed is None:
|
|
11
|
+
raise Exception(f"Error parsing response")
|
|
12
|
+
return response.parsed
|