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.
Files changed (111) hide show
  1. scanner_client/__init__.py +1 -0
  2. scanner_client/detection_rule.py +267 -0
  3. scanner_client/event_sink.py +233 -0
  4. scanner_client/example.py +75 -0
  5. scanner_client/http_err.py +12 -0
  6. scanner_client/query.py +143 -0
  7. scanner_client/raw_api/__init__.py +8 -0
  8. scanner_client/raw_api/api/__init__.py +1 -0
  9. scanner_client/raw_api/api/detection_rule/__init__.py +0 -0
  10. scanner_client/raw_api/api/detection_rule/create_detection_rule.py +198 -0
  11. scanner_client/raw_api/api/detection_rule/delete_detection_rule.py +177 -0
  12. scanner_client/raw_api/api/detection_rule/get_detection_rule.py +177 -0
  13. scanner_client/raw_api/api/detection_rule/list_detection_rules.py +186 -0
  14. scanner_client/raw_api/api/detection_rule/update_detection_rule.py +199 -0
  15. scanner_client/raw_api/api/event_sink/__init__.py +0 -0
  16. scanner_client/raw_api/api/event_sink/create_event_sink.py +186 -0
  17. scanner_client/raw_api/api/event_sink/delete_event_sink.py +177 -0
  18. scanner_client/raw_api/api/event_sink/get_event_sink.py +177 -0
  19. scanner_client/raw_api/api/event_sink/list_event_sinks.py +186 -0
  20. scanner_client/raw_api/api/event_sink/update_event_sink.py +199 -0
  21. scanner_client/raw_api/api/query/__init__.py +0 -0
  22. scanner_client/raw_api/api/query/query_progress.py +177 -0
  23. scanner_client/raw_api/api/query/start_blocking_query.py +194 -0
  24. scanner_client/raw_api/api/query/start_query.py +194 -0
  25. scanner_client/raw_api/client.py +268 -0
  26. scanner_client/raw_api/errors.py +14 -0
  27. scanner_client/raw_api/models/__init__.py +153 -0
  28. scanner_client/raw_api/models/ad_hoc_query_progress_metadata.py +71 -0
  29. scanner_client/raw_api/models/ad_hoc_query_progress_response.py +102 -0
  30. scanner_client/raw_api/models/ad_hoc_row_item.py +110 -0
  31. scanner_client/raw_api/models/ad_hoc_row_item_columns.py +75 -0
  32. scanner_client/raw_api/models/ad_hoc_table_result.py +157 -0
  33. scanner_client/raw_api/models/ad_hoc_table_result_column_tags.py +73 -0
  34. scanner_client/raw_api/models/create_detection_rule_request_data.py +319 -0
  35. scanner_client/raw_api/models/create_event_sink_args_type_0.py +60 -0
  36. scanner_client/raw_api/models/create_event_sink_args_type_1.py +60 -0
  37. scanner_client/raw_api/models/create_event_sink_request_data.py +130 -0
  38. scanner_client/raw_api/models/create_slack_event_sink_args.py +79 -0
  39. scanner_client/raw_api/models/create_webhook_event_sink_args.py +71 -0
  40. scanner_client/raw_api/models/crud_api_request_and_response_data_for_detection_rule_api_handler_type_0.py +60 -0
  41. scanner_client/raw_api/models/crud_api_request_and_response_data_for_detection_rule_api_handler_type_1.py +60 -0
  42. scanner_client/raw_api/models/crud_api_request_and_response_data_for_detection_rule_api_handler_type_2.py +60 -0
  43. scanner_client/raw_api/models/crud_api_request_and_response_data_for_detection_rule_api_handler_type_3.py +60 -0
  44. scanner_client/raw_api/models/crud_api_request_and_response_data_for_detection_rule_api_handler_type_4.py +60 -0
  45. scanner_client/raw_api/models/crud_api_request_and_response_data_for_detection_rule_api_handler_type_5.py +60 -0
  46. scanner_client/raw_api/models/crud_api_request_and_response_data_for_detection_rule_api_handler_type_6.py +60 -0
  47. scanner_client/raw_api/models/crud_api_request_and_response_data_for_detection_rule_api_handler_type_7.py +60 -0
  48. scanner_client/raw_api/models/crud_api_request_and_response_data_for_event_sink_api_handler_type_0.py +60 -0
  49. scanner_client/raw_api/models/crud_api_request_and_response_data_for_event_sink_api_handler_type_1.py +60 -0
  50. scanner_client/raw_api/models/crud_api_request_and_response_data_for_event_sink_api_handler_type_2.py +60 -0
  51. scanner_client/raw_api/models/crud_api_request_and_response_data_for_event_sink_api_handler_type_3.py +60 -0
  52. scanner_client/raw_api/models/crud_api_request_and_response_data_for_event_sink_api_handler_type_4.py +60 -0
  53. scanner_client/raw_api/models/crud_api_request_and_response_data_for_event_sink_api_handler_type_5.py +60 -0
  54. scanner_client/raw_api/models/crud_api_request_and_response_data_for_event_sink_api_handler_type_6.py +60 -0
  55. scanner_client/raw_api/models/crud_api_request_and_response_data_for_event_sink_api_handler_type_7.py +60 -0
  56. scanner_client/raw_api/models/delete_detection_rule_request_data.py +71 -0
  57. scanner_client/raw_api/models/delete_detection_rule_response_data.py +79 -0
  58. scanner_client/raw_api/models/delete_event_sink_request_data.py +71 -0
  59. scanner_client/raw_api/models/delete_event_sink_response_data.py +79 -0
  60. scanner_client/raw_api/models/detection_rule.py +369 -0
  61. scanner_client/raw_api/models/detection_rule_summary.py +355 -0
  62. scanner_client/raw_api/models/detection_severity_type_0.py +7 -0
  63. scanner_client/raw_api/models/detection_severity_type_1.py +7 -0
  64. scanner_client/raw_api/models/detection_severity_type_2.py +7 -0
  65. scanner_client/raw_api/models/detection_severity_type_3.py +7 -0
  66. scanner_client/raw_api/models/detection_severity_type_4.py +7 -0
  67. scanner_client/raw_api/models/detection_severity_type_5.py +7 -0
  68. scanner_client/raw_api/models/detection_severity_type_6.py +7 -0
  69. scanner_client/raw_api/models/detection_severity_type_7.py +7 -0
  70. scanner_client/raw_api/models/event_sink.py +204 -0
  71. scanner_client/raw_api/models/event_sink_configuration_type_0.py +7 -0
  72. scanner_client/raw_api/models/event_sink_configuration_type_1.py +61 -0
  73. scanner_client/raw_api/models/event_sink_configuration_type_2.py +61 -0
  74. scanner_client/raw_api/models/event_sink_configuration_type_3.py +60 -0
  75. scanner_client/raw_api/models/event_sink_type.py +10 -0
  76. scanner_client/raw_api/models/get_detection_rule_by_sync_key_request_data.py +71 -0
  77. scanner_client/raw_api/models/get_detection_rule_request_data.py +71 -0
  78. scanner_client/raw_api/models/get_detection_rule_response_data.py +80 -0
  79. scanner_client/raw_api/models/get_detection_rule_summary_response_data.py +80 -0
  80. scanner_client/raw_api/models/get_event_sink_request_data.py +71 -0
  81. scanner_client/raw_api/models/get_event_sink_response_data.py +80 -0
  82. scanner_client/raw_api/models/list_detection_rules_request_data.py +71 -0
  83. scanner_client/raw_api/models/list_detection_rules_response_data.py +93 -0
  84. scanner_client/raw_api/models/list_event_sinks_request_data.py +71 -0
  85. scanner_client/raw_api/models/list_event_sinks_response_data.py +93 -0
  86. scanner_client/raw_api/models/log_event_id.py +79 -0
  87. scanner_client/raw_api/models/no_data.py +43 -0
  88. scanner_client/raw_api/models/rbac_detection_rule_permission_type.py +10 -0
  89. scanner_client/raw_api/models/slack_configuration.py +72 -0
  90. scanner_client/raw_api/models/start_ad_hoc_query_request_data.py +218 -0
  91. scanner_client/raw_api/models/start_ad_hoc_query_response.py +71 -0
  92. scanner_client/raw_api/models/starting_permissions_for_rbac_detection_rule_permission_type.py +81 -0
  93. scanner_client/raw_api/models/starting_permissions_for_rbac_detection_rule_permission_type_permissions_by_role.py +84 -0
  94. scanner_client/raw_api/models/table_ui_state_type.py +9 -0
  95. scanner_client/raw_api/models/tines_configuration.py +80 -0
  96. scanner_client/raw_api/models/update_detection_rule_request_data.py +408 -0
  97. scanner_client/raw_api/models/update_event_sink_args_type_0.py +60 -0
  98. scanner_client/raw_api/models/update_event_sink_args_type_1.py +60 -0
  99. scanner_client/raw_api/models/update_event_sink_request_data.py +171 -0
  100. scanner_client/raw_api/models/update_slack_event_sink_args.py +71 -0
  101. scanner_client/raw_api/models/update_webhook_event_sink_args.py +71 -0
  102. scanner_client/raw_api/models/webhook_configuration.py +72 -0
  103. scanner_client/raw_api/py.typed +1 -0
  104. scanner_client/raw_api/types.py +44 -0
  105. scanner_client/scanner.py +71 -0
  106. scanner_client/wasm_transport.py +92 -0
  107. scanner_client-0.1.0rc2.dist-info/LICENSE +201 -0
  108. scanner_client-0.1.0rc2.dist-info/METADATA +127 -0
  109. scanner_client-0.1.0rc2.dist-info/RECORD +111 -0
  110. scanner_client-0.1.0rc2.dist-info/WHEEL +5 -0
  111. 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