smplkit 2.0.14 → 2.0.15
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.
- checksums.yaml +4 -4
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/api/actions_api.rb +2 -69
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/api/events_api.rb +17 -17
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/api/forwarders_api.rb +36 -36
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/api/functions_api.rb +2 -2
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/api/resource_types_api.rb +2 -72
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/api/usage_api.rb +4 -4
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/event.rb +12 -2
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/event_list_response.rb +1 -1
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/event_request.rb +165 -0
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/event_resource.rb +2 -18
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/event_response.rb +1 -1
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/forwarder.rb +17 -17
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/forwarder_delivery.rb +11 -1
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/forwarder_delivery_list_response.rb +1 -0
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/forwarder_delivery_resource.rb +1 -0
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/forwarder_delivery_response.rb +1 -0
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/forwarder_http.rb +40 -1
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/forwarder_list_response.rb +1 -0
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/forwarder_request.rb +165 -0
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/forwarder_resource.rb +2 -17
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/forwarder_response.rb +1 -0
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/http_header.rb +3 -1
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/retry_failed_deliveries_summary.rb +4 -0
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/test_forwarder_request.rb +41 -1
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/test_forwarder_response.rb +7 -1
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/usage_attributes.rb +4 -1
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/wipe_response.rb +3 -0
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/wipe_tables_summary.rb +7 -0
- data/lib/smplkit/_generated/audit/lib/smplkit_audit_client.rb +2 -0
- data/lib/smplkit/_generated/audit/spec/api/actions_api_spec.rb +1 -14
- data/lib/smplkit/_generated/audit/spec/api/events_api_spec.rb +5 -5
- data/lib/smplkit/_generated/audit/spec/api/forwarders_api_spec.rb +11 -11
- data/lib/smplkit/_generated/audit/spec/api/functions_api_spec.rb +1 -1
- data/lib/smplkit/_generated/audit/spec/api/resource_types_api_spec.rb +1 -15
- data/lib/smplkit/_generated/audit/spec/api/usage_api_spec.rb +2 -2
- data/lib/smplkit/_generated/audit/spec/models/event_request_spec.rb +36 -0
- data/lib/smplkit/_generated/audit/spec/models/forwarder_http_spec.rb +4 -0
- data/lib/smplkit/_generated/audit/spec/models/forwarder_request_spec.rb +36 -0
- data/lib/smplkit/_generated/audit/spec/models/forwarder_spec.rb +0 -6
- data/lib/smplkit/_generated/audit/spec/models/test_forwarder_request_spec.rb +4 -0
- data/lib/smplkit/audit/actions.rb +35 -0
- data/lib/smplkit/audit/client.rb +11 -9
- data/lib/smplkit/audit/events.rb +8 -45
- data/lib/smplkit/audit/models.rb +197 -0
- data/lib/smplkit/audit/resource_types.rb +30 -0
- data/lib/smplkit/errors.rb +5 -0
- data/lib/smplkit/management/audit.rb +111 -0
- data/lib/smplkit/management/client.rb +4 -1
- data/lib/smplkit.rb +7 -5
- metadata +9 -3
- data/lib/smplkit/audit/forwarders.rb +0 -282
- data/lib/smplkit/audit/functions.rb +0 -58
|
@@ -1,282 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Smplkit
|
|
4
|
-
module Audit
|
|
5
|
-
# Public-facing enum for SIEM streaming destination types.
|
|
6
|
-
#
|
|
7
|
-
# Mirrors the +ForwarderType+ enum the audit OpenAPI spec emits
|
|
8
|
-
# (ADR-047 §2.12). Customers pass these constants — or any string
|
|
9
|
-
# in {VALUES} — to {Forwarders#create} / {Forwarders#update} /
|
|
10
|
-
# {Forwarders#list}. The wrapper validates membership before
|
|
11
|
-
# round-tripping to the wire.
|
|
12
|
-
module ForwarderType
|
|
13
|
-
HTTP = "HTTP"
|
|
14
|
-
DATADOG = "DATADOG"
|
|
15
|
-
SPLUNK_HEC = "SPLUNK_HEC"
|
|
16
|
-
SUMO_LOGIC = "SUMO_LOGIC"
|
|
17
|
-
NEW_RELIC = "NEW_RELIC"
|
|
18
|
-
HONEYCOMB = "HONEYCOMB"
|
|
19
|
-
ELASTIC = "ELASTIC"
|
|
20
|
-
|
|
21
|
-
# Every supported value, in spec order. Useful for membership
|
|
22
|
-
# checks, dropdown population, or test parametrization.
|
|
23
|
-
VALUES = [HTTP, DATADOG, SPLUNK_HEC, SUMO_LOGIC, NEW_RELIC, HONEYCOMB, ELASTIC].freeze
|
|
24
|
-
|
|
25
|
-
# Coerce +value+ to a known wire-format slug, or raise ArgumentError.
|
|
26
|
-
# Strings round-trip transparently; nil passes through.
|
|
27
|
-
def self.coerce(value)
|
|
28
|
-
return nil if value.nil?
|
|
29
|
-
|
|
30
|
-
s = value.to_s
|
|
31
|
-
return s if VALUES.include?(s)
|
|
32
|
-
|
|
33
|
-
raise ArgumentError,
|
|
34
|
-
"Unknown ForwarderType #{value.inspect}; expected one of #{VALUES.inspect}"
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
# SIEM streaming forwarders for the authenticated account.
|
|
39
|
-
#
|
|
40
|
-
# Pro tier only — every method here raises a wrapped 402
|
|
41
|
-
# +SmplkitGeneratedClient::Audit::ApiError+ on lower tiers.
|
|
42
|
-
class Forwarders
|
|
43
|
-
attr_reader :deliveries, :actions
|
|
44
|
-
|
|
45
|
-
def initialize(api)
|
|
46
|
-
@api = api
|
|
47
|
-
@deliveries = ForwarderDeliveries.new(api)
|
|
48
|
-
@actions = ForwarderActions.new(api)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def create(name:, forwarder_type:, http:, enabled: true,
|
|
52
|
-
filter: nil, transform: nil, data: nil)
|
|
53
|
-
body = wrap_forwarder(nil, name, ForwarderType.coerce(forwarder_type),
|
|
54
|
-
http, enabled, filter, transform, data)
|
|
55
|
-
resp = @api.create_forwarder(body)
|
|
56
|
-
Forwarder.from_resource(resp.data)
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def list(forwarder_type: nil, enabled: nil, page_size: nil, page_after: nil)
|
|
60
|
-
opts = {}
|
|
61
|
-
opts[:filter_forwarder_type] = ForwarderType.coerce(forwarder_type) if forwarder_type
|
|
62
|
-
opts[:filter_enabled] = enabled unless enabled.nil?
|
|
63
|
-
opts[:page_size] = page_size if page_size
|
|
64
|
-
opts[:page_after] = page_after if page_after
|
|
65
|
-
resp = @api.list_forwarders(opts)
|
|
66
|
-
forwarders = (resp.data || []).map { |r| Forwarder.from_resource(r) }
|
|
67
|
-
ListForwardersPage.new(forwarders, Forwarders.next_cursor(resp.links&._next))
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def get(forwarder_id)
|
|
71
|
-
resp = @api.get_forwarder(forwarder_id)
|
|
72
|
-
Forwarder.from_resource(resp.data)
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def update(forwarder_id, name:, forwarder_type:, http:, enabled: true,
|
|
76
|
-
filter: nil, transform: nil, data: nil)
|
|
77
|
-
body = wrap_forwarder(forwarder_id, name, ForwarderType.coerce(forwarder_type),
|
|
78
|
-
http, enabled, filter, transform, data)
|
|
79
|
-
resp = @api.update_forwarder(forwarder_id, body)
|
|
80
|
-
Forwarder.from_resource(resp.data)
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
def delete(forwarder_id)
|
|
84
|
-
@api.delete_forwarder(forwarder_id)
|
|
85
|
-
nil
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def self.next_cursor(link)
|
|
89
|
-
return nil unless link.is_a?(String)
|
|
90
|
-
|
|
91
|
-
idx = link.index("page[after]=")
|
|
92
|
-
return nil if idx.nil?
|
|
93
|
-
|
|
94
|
-
token = link[(idx + "page[after]=".length)..]
|
|
95
|
-
amp = token.index("&")
|
|
96
|
-
amp ? token[0...amp] : token
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
private
|
|
100
|
-
|
|
101
|
-
def wrap_forwarder(id, name, forwarder_type, http, enabled, filter, transform, data)
|
|
102
|
-
attrs = SmplkitGeneratedClient::Audit::Forwarder.new(
|
|
103
|
-
name: name,
|
|
104
|
-
forwarder_type: forwarder_type,
|
|
105
|
-
enabled: enabled,
|
|
106
|
-
# Server-side validation rejects ``data: null`` (the field is
|
|
107
|
-
# required-non-null in the OpenAPI schema). Default to an empty
|
|
108
|
-
# hash mirroring the AuditEvents.record fix.
|
|
109
|
-
data: data || {},
|
|
110
|
-
http: ForwarderHttp.to_wire(http),
|
|
111
|
-
filter: filter,
|
|
112
|
-
transform: transform
|
|
113
|
-
)
|
|
114
|
-
resource = SmplkitGeneratedClient::Audit::ForwarderResource.new(
|
|
115
|
-
id: id ? id.to_s : "",
|
|
116
|
-
type: "forwarder",
|
|
117
|
-
attributes: attrs
|
|
118
|
-
)
|
|
119
|
-
SmplkitGeneratedClient::Audit::ForwarderResponse.new(data: resource)
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
# Sub-namespace for the per-forwarder delivery log + per-delivery retry.
|
|
124
|
-
class ForwarderDeliveries
|
|
125
|
-
attr_reader :actions
|
|
126
|
-
|
|
127
|
-
def initialize(api)
|
|
128
|
-
@api = api
|
|
129
|
-
@actions = DeliveryActions.new(api)
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
def list(forwarder_id, status: nil, created_at_range: nil, event_id: nil, page_size: nil, page_after: nil)
|
|
133
|
-
opts = {}
|
|
134
|
-
opts[:filter_status] = status if status
|
|
135
|
-
opts[:filter_created_at] = created_at_range if created_at_range
|
|
136
|
-
opts[:filter_event_id] = event_id if event_id
|
|
137
|
-
opts[:page_size] = page_size if page_size
|
|
138
|
-
opts[:page_after] = page_after if page_after
|
|
139
|
-
resp = @api.list_forwarder_deliveries(forwarder_id, opts)
|
|
140
|
-
deliveries = (resp.data || []).map { |r| ForwarderDelivery.from_resource(r) }
|
|
141
|
-
ListDeliveriesPage.new(deliveries, Forwarders.next_cursor(resp.links&._next))
|
|
142
|
-
end
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
# +client.audit.forwarders.deliveries.actions.retry(forwarder_id, delivery_id)+
|
|
146
|
-
class DeliveryActions
|
|
147
|
-
def initialize(api)
|
|
148
|
-
@api = api
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
def retry(forwarder_id, delivery_id)
|
|
152
|
-
resp = @api.retry_forwarder_delivery(forwarder_id, delivery_id)
|
|
153
|
-
ForwarderDelivery.from_resource(resp.data)
|
|
154
|
-
end
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
# +client.audit.forwarders.actions.retry_failed_deliveries(forwarder_id)+
|
|
158
|
-
class ForwarderActions
|
|
159
|
-
def initialize(api)
|
|
160
|
-
@api = api
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
def retry_failed_deliveries(forwarder_id)
|
|
164
|
-
resp = @api.retry_failed_forwarder_deliveries(forwarder_id)
|
|
165
|
-
RetryFailedDeliveriesSummary.new(
|
|
166
|
-
attempted: resp.attempted,
|
|
167
|
-
succeeded: resp.succeeded,
|
|
168
|
-
failed: resp.failed
|
|
169
|
-
)
|
|
170
|
-
end
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
# ----------------------------------------------------------------------
|
|
174
|
-
# Public-facing model structs
|
|
175
|
-
# ----------------------------------------------------------------------
|
|
176
|
-
|
|
177
|
-
HttpHeader = Struct.new(:name, :value, keyword_init: true)
|
|
178
|
-
|
|
179
|
-
# rubocop:disable Lint/StructNewOverride -- ``:method`` matches the
|
|
180
|
-
# API attribute and shadowing Struct#method is the expected ergonomics.
|
|
181
|
-
ForwarderHttp = Struct.new(:method, :url, :headers, :body, :success_status, keyword_init: true) do
|
|
182
|
-
def initialize(method: "POST", url: "", headers: nil, body: nil, success_status: "2xx")
|
|
183
|
-
super(method: method, url: url, headers: headers || [], body: body, success_status: success_status)
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
def self.to_wire(src)
|
|
187
|
-
h = src.is_a?(Hash) ? new(**src) : src
|
|
188
|
-
SmplkitGeneratedClient::Audit::ForwarderHttp.new(
|
|
189
|
-
method: h.method,
|
|
190
|
-
url: h.url,
|
|
191
|
-
headers: (h.headers || []).map do |hdr|
|
|
192
|
-
name, value = if hdr.is_a?(Hash)
|
|
193
|
-
[hdr[:name] || hdr["name"],
|
|
194
|
-
hdr[:value] || hdr["value"]]
|
|
195
|
-
else
|
|
196
|
-
[hdr.name, hdr.value]
|
|
197
|
-
end
|
|
198
|
-
SmplkitGeneratedClient::Audit::HttpHeader.new(name: name, value: value)
|
|
199
|
-
end,
|
|
200
|
-
body: h.body,
|
|
201
|
-
success_status: h.success_status
|
|
202
|
-
)
|
|
203
|
-
end
|
|
204
|
-
|
|
205
|
-
def self.from_wire(src)
|
|
206
|
-
return new if src.nil?
|
|
207
|
-
|
|
208
|
-
new(
|
|
209
|
-
method: src.method || "POST",
|
|
210
|
-
url: src.url || "",
|
|
211
|
-
headers: (src.headers || []).map { |h| HttpHeader.new(name: h.name, value: h.value) },
|
|
212
|
-
body: src.body,
|
|
213
|
-
success_status: src.success_status || "2xx"
|
|
214
|
-
)
|
|
215
|
-
end
|
|
216
|
-
end
|
|
217
|
-
# rubocop:enable Lint/StructNewOverride
|
|
218
|
-
|
|
219
|
-
# rubocop:disable Lint/StructNewOverride -- ``:filter`` matches the
|
|
220
|
-
# API attribute and shadowing Struct#filter is the expected ergonomics.
|
|
221
|
-
Forwarder = Struct.new(
|
|
222
|
-
:id, :name, :slug, :forwarder_type, :enabled,
|
|
223
|
-
:filter, :transform, :http, :data,
|
|
224
|
-
:created_at, :updated_at, :deleted_at, :version,
|
|
225
|
-
keyword_init: true
|
|
226
|
-
) do
|
|
227
|
-
def self.from_resource(resource)
|
|
228
|
-
a = resource.attributes
|
|
229
|
-
new(
|
|
230
|
-
id: resource.id,
|
|
231
|
-
name: a.name,
|
|
232
|
-
slug: a.slug,
|
|
233
|
-
forwarder_type: a.forwarder_type,
|
|
234
|
-
enabled: a.enabled.nil? || a.enabled,
|
|
235
|
-
filter: Smplkit::Helpers.deep_stringify_keys(a.filter || {}),
|
|
236
|
-
transform: a.transform,
|
|
237
|
-
http: ForwarderHttp.from_wire(a.http),
|
|
238
|
-
data: Smplkit::Helpers.deep_stringify_keys(a.data || {}),
|
|
239
|
-
created_at: a.created_at,
|
|
240
|
-
updated_at: a.updated_at,
|
|
241
|
-
deleted_at: a.deleted_at,
|
|
242
|
-
version: a.version
|
|
243
|
-
)
|
|
244
|
-
end
|
|
245
|
-
end
|
|
246
|
-
# rubocop:enable Lint/StructNewOverride
|
|
247
|
-
|
|
248
|
-
ListForwardersPage = Struct.new(:forwarders, :next_cursor)
|
|
249
|
-
|
|
250
|
-
ForwarderDelivery = Struct.new(
|
|
251
|
-
:id, :forwarder_id, :event_id, :attempt_number, :status,
|
|
252
|
-
:request, :response_status, :response_body, :latency_ms, :error, :created_at,
|
|
253
|
-
keyword_init: true
|
|
254
|
-
) do
|
|
255
|
-
def self.from_resource(resource)
|
|
256
|
-
a = resource.attributes
|
|
257
|
-
new(
|
|
258
|
-
id: resource.id,
|
|
259
|
-
forwarder_id: a.forwarder_id,
|
|
260
|
-
event_id: a.event_id,
|
|
261
|
-
attempt_number: a.attempt_number,
|
|
262
|
-
status: a.status,
|
|
263
|
-
request: Smplkit::Helpers.deep_stringify_keys(a.request || {}),
|
|
264
|
-
response_status: a.response_status,
|
|
265
|
-
response_body: a.response_body,
|
|
266
|
-
latency_ms: a.latency_ms,
|
|
267
|
-
error: a.error,
|
|
268
|
-
created_at: a.created_at
|
|
269
|
-
)
|
|
270
|
-
end
|
|
271
|
-
end
|
|
272
|
-
|
|
273
|
-
ListDeliveriesPage = Struct.new(:deliveries, :next_cursor)
|
|
274
|
-
|
|
275
|
-
RetryFailedDeliveriesSummary = Struct.new(:attempted, :succeeded, :failed, keyword_init: true)
|
|
276
|
-
|
|
277
|
-
TestForwarderResult = Struct.new(
|
|
278
|
-
:succeeded, :response_status, :response_headers, :response_body, :latency_ms, :error,
|
|
279
|
-
keyword_init: true
|
|
280
|
-
)
|
|
281
|
-
end
|
|
282
|
-
end
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Smplkit
|
|
4
|
-
module Audit
|
|
5
|
-
# +client.audit.functions.test_forwarder.actions.execute(...)+
|
|
6
|
-
class Functions
|
|
7
|
-
attr_reader :test_forwarder
|
|
8
|
-
|
|
9
|
-
def initialize(api)
|
|
10
|
-
@test_forwarder = TestForwarderNamespace.new(api)
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
# Sub-namespace for the test_forwarder action.
|
|
15
|
-
class TestForwarderNamespace
|
|
16
|
-
attr_reader :actions
|
|
17
|
-
|
|
18
|
-
def initialize(api)
|
|
19
|
-
@actions = TestForwarderActions.new(api)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
# +execute+ is a server-side proxy that lets the console preview a
|
|
24
|
-
# destination without browser CORS getting in the way. The audit
|
|
25
|
-
# service applies its SSRF guard before resolving the URL —
|
|
26
|
-
# private/loopback/link-local addresses (incl. the EC2 IMDS at
|
|
27
|
-
# +169.254.169.254+) and disallowed ports are rejected.
|
|
28
|
-
class TestForwarderActions
|
|
29
|
-
def initialize(api)
|
|
30
|
-
@api = api
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def execute(url:, method: "POST", headers: nil, body: nil,
|
|
34
|
-
success_status: "2xx", timeout_ms: nil)
|
|
35
|
-
req = SmplkitGeneratedClient::Audit::TestForwarderRequest.new(
|
|
36
|
-
url: url,
|
|
37
|
-
method: method,
|
|
38
|
-
headers: (headers || []).map do |h|
|
|
39
|
-
name, value = h.is_a?(Hash) ? [h[:name] || h["name"], h[:value] || h["value"]] : [h.name, h.value]
|
|
40
|
-
SmplkitGeneratedClient::Audit::HttpHeader.new(name: name, value: value)
|
|
41
|
-
end,
|
|
42
|
-
body: body,
|
|
43
|
-
success_status: success_status,
|
|
44
|
-
timeout_ms: timeout_ms
|
|
45
|
-
)
|
|
46
|
-
resp = @api.execute_test_forwarder(req)
|
|
47
|
-
TestForwarderResult.new(
|
|
48
|
-
succeeded: resp.succeeded || false,
|
|
49
|
-
response_status: resp.response_status,
|
|
50
|
-
response_headers: resp.response_headers || {},
|
|
51
|
-
response_body: resp.response_body || "",
|
|
52
|
-
latency_ms: resp.latency_ms,
|
|
53
|
-
error: resp.error
|
|
54
|
-
)
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|