sqreen 1.19.1 → 1.21.0.beta1
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/CHANGELOG.md +18 -0
- data/lib/sqreen/agent_message.rb +20 -0
- data/lib/sqreen/aggregated_metric.rb +25 -0
- data/lib/sqreen/attack_detected.html +1 -2
- data/lib/sqreen/ca.crt +24 -0
- data/lib/sqreen/configuration.rb +10 -4
- data/lib/sqreen/deliveries/batch.rb +12 -2
- data/lib/sqreen/deliveries/simple.rb +4 -0
- data/lib/sqreen/ecosystem.rb +80 -0
- data/lib/sqreen/ecosystem/dispatch_table.rb +43 -0
- data/lib/sqreen/ecosystem/http/net_http.rb +51 -0
- data/lib/sqreen/ecosystem/http/rack_request.rb +38 -0
- data/lib/sqreen/ecosystem/loggable.rb +13 -0
- data/lib/sqreen/ecosystem/module_api.rb +30 -0
- data/lib/sqreen/ecosystem/module_api/event_listener.rb +18 -0
- data/lib/sqreen/ecosystem/module_api/instrumentation.rb +23 -0
- data/lib/sqreen/ecosystem/module_api/signal_producer.rb +26 -0
- data/lib/sqreen/ecosystem/module_api/tracing_push_down.rb +34 -0
- data/lib/sqreen/ecosystem/module_api/transaction_storage.rb +71 -0
- data/lib/sqreen/ecosystem/module_registry.rb +39 -0
- data/lib/sqreen/ecosystem/redis/redis_connection.rb +35 -0
- data/lib/sqreen/ecosystem/tracing/sampler.rb +160 -0
- data/lib/sqreen/ecosystem/tracing/sampling_configuration.rb +150 -0
- data/lib/sqreen/ecosystem/tracing/signals/tracing_client.rb +53 -0
- data/lib/sqreen/ecosystem/tracing/signals/tracing_server.rb +53 -0
- data/lib/sqreen/ecosystem/tracing_id_setup.rb +34 -0
- data/lib/sqreen/ecosystem/transaction_storage.rb +64 -0
- data/lib/sqreen/ecosystem_integration.rb +70 -0
- data/lib/sqreen/ecosystem_integration/around_callbacks.rb +89 -0
- data/lib/sqreen/ecosystem_integration/instrumentation_service.rb +38 -0
- data/lib/sqreen/ecosystem_integration/request_lifecycle_tracking.rb +56 -0
- data/lib/sqreen/ecosystem_integration/signal_consumption.rb +35 -0
- data/lib/sqreen/endpoint_testing.rb +184 -0
- data/lib/sqreen/event.rb +7 -5
- data/lib/sqreen/events/attack.rb +23 -18
- data/lib/sqreen/events/remote_exception.rb +0 -22
- data/lib/sqreen/events/request_record.rb +15 -70
- data/lib/sqreen/frameworks/generic.rb +15 -1
- data/lib/sqreen/frameworks/request_recorder.rb +13 -2
- data/lib/sqreen/graft/call.rb +9 -0
- data/lib/sqreen/kit/signals/specialized/aggregated_metric.rb +72 -0
- data/lib/sqreen/kit/signals/specialized/attack.rb +57 -0
- data/lib/sqreen/kit/signals/specialized/binning_metric.rb +76 -0
- data/lib/sqreen/kit/signals/specialized/http_trace.rb +26 -0
- data/lib/sqreen/kit/signals/specialized/sdk_track_call.rb +50 -0
- data/lib/sqreen/kit/signals/specialized/sqreen_exception.rb +57 -0
- data/lib/sqreen/legacy/old_event_submission_strategy.rb +227 -0
- data/lib/sqreen/legacy/waf_redactions.rb +49 -0
- data/lib/sqreen/log/loggable.rb +1 -1
- data/lib/sqreen/metrics/base.rb +3 -0
- data/lib/sqreen/metrics_store.rb +22 -12
- data/lib/sqreen/performance_notifications/binned_metrics.rb +8 -2
- data/lib/sqreen/remote_command.rb +3 -0
- data/lib/sqreen/rules.rb +4 -2
- data/lib/sqreen/rules/not_found_cb.rb +2 -0
- data/lib/sqreen/rules/rule_cb.rb +2 -0
- data/lib/sqreen/rules/waf_cb.rb +13 -10
- data/lib/sqreen/runner.rb +94 -13
- data/lib/sqreen/sensitive_data_redactor.rb +19 -31
- data/lib/sqreen/session.rb +53 -43
- data/lib/sqreen/signals/conversions.rb +288 -0
- data/lib/sqreen/signals/http_trace_redaction.rb +111 -0
- data/lib/sqreen/signals/signals_submission_strategy.rb +78 -0
- data/lib/sqreen/version.rb +1 -1
- data/lib/sqreen/weave/legacy/instrumentation.rb +4 -4
- metadata +74 -10
- data/lib/sqreen/backport.rb +0 -9
- data/lib/sqreen/backport/clock_gettime.rb +0 -74
- data/lib/sqreen/backport/original_name.rb +0 -88
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'sqreen/kit/loggable'
|
3
|
+
require 'sqreen/kit/signals/specialized/http_trace'
|
4
|
+
|
5
|
+
module Sqreen
|
6
|
+
module Signals
|
7
|
+
module HttpTraceRedaction
|
8
|
+
class << self
|
9
|
+
include Sqreen::Kit::Loggable
|
10
|
+
|
11
|
+
# @param [Sqreen::Kit::Signals::Specialized::HttpTrace] trace
|
12
|
+
# @param [Sqreen::SensitiveDataRedactor] redactor
|
13
|
+
def redact_trace!(trace, redactor)
|
14
|
+
return unless redactor
|
15
|
+
# redact headers (keys unsafe)
|
16
|
+
# @type [Sqreen::Kit::Signals::Context::HttpContext]
|
17
|
+
http_context = trace.context
|
18
|
+
|
19
|
+
all_redacted = []
|
20
|
+
|
21
|
+
# Redact headers; save redacted values
|
22
|
+
# headers are encoded as [key, value], not a hash, so
|
23
|
+
# they require some transformation
|
24
|
+
orig_headers = http_context.headers
|
25
|
+
if orig_headers
|
26
|
+
headers = orig_headers.map { |(k, v)| { k => v } }
|
27
|
+
headers, redacted = redactor.redact(headers)
|
28
|
+
http_context.headers = headers.map(&:first)
|
29
|
+
all_redacted += redacted
|
30
|
+
end
|
31
|
+
|
32
|
+
# Redact params; save redacted values
|
33
|
+
Kit::Signals::Context::HttpContext::PARAMS_ATTRS.each do |attr|
|
34
|
+
value = http_context.public_send(attr)
|
35
|
+
next unless value
|
36
|
+
value, redacted = redactor.redact(value)
|
37
|
+
all_redacted += redacted
|
38
|
+
http_context.public_send(:"#{attr}=", value)
|
39
|
+
end
|
40
|
+
|
41
|
+
all_redacted = all_redacted.uniq.map(&:downcase)
|
42
|
+
|
43
|
+
# Redact attacks and exceptions
|
44
|
+
# XXX: no redaction for infos in attacks/exceptions except for WAF data
|
45
|
+
# Is this the correct behavior?
|
46
|
+
redact_attacks!(trace, redactor, all_redacted)
|
47
|
+
redact_exceptions!(trace, redactor, all_redacted)
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
# @param [Sqreen::Kit::Signals::Specialized::HttpTrace] trace
|
53
|
+
# @param [Sqreen::SensitiveDataRedactor] redactor
|
54
|
+
# Redacts WAF data according to specific rules therefor
|
55
|
+
# Redacts infos according to general rules
|
56
|
+
def redact_attacks!(trace, redactor, redacted_data)
|
57
|
+
trace.data.each do |signal|
|
58
|
+
next unless signal.is_a?(Kit::Signals::Specialized::Attack)
|
59
|
+
# @type [Sqreen::Kit::Signals::Specialized::Attack::Payload] payload
|
60
|
+
payload = signal.payload
|
61
|
+
next unless payload.infos
|
62
|
+
|
63
|
+
if payload.infos[:waf_data]
|
64
|
+
redact_waf_attack_data!(payload.infos, redacted_data)
|
65
|
+
end
|
66
|
+
payload.infos, = redactor.redact(payload.infos)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def redact_exceptions!(trace, redactor, redacted_data)
|
71
|
+
trace.data.each do |signal|
|
72
|
+
next unless signal.is_a?(Kit::Signals::Specialized::SqreenException)
|
73
|
+
infos = signal.infos
|
74
|
+
next unless infos
|
75
|
+
|
76
|
+
redact_waf_exception_data!(signal.infos, redacted_data) if signal.infos[:waf]
|
77
|
+
signal.infos, = redactor.redact(infos)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# @param [Hash] infos from WAF attack
|
82
|
+
def redact_waf_attack_data!(infos, redacted_data)
|
83
|
+
begin
|
84
|
+
parsed = JSON.parse(infos[:waf_data])
|
85
|
+
rescue JSON::JSONError => e
|
86
|
+
logger.warn("waf_data is not valid json: #{e.message}")
|
87
|
+
return
|
88
|
+
end
|
89
|
+
redacted = parsed.each do |w|
|
90
|
+
next unless (filters = w['filter'])
|
91
|
+
|
92
|
+
filters.each do |f|
|
93
|
+
next unless (v = f['resolved_value'])
|
94
|
+
next unless redacted_data.include?(v.downcase)
|
95
|
+
|
96
|
+
f['match_status'] = SensitiveDataRedactor::MASK
|
97
|
+
f['resolved_value'] = SensitiveDataRedactor::MASK
|
98
|
+
end
|
99
|
+
end
|
100
|
+
infos[:waf_data] = JSON.dump(redacted)
|
101
|
+
end
|
102
|
+
|
103
|
+
# see https://github.com/sqreen/TechDoc/blob/master/content/specs/spec000022-waf-data-sanitization.md#changes-to-the-agents
|
104
|
+
def redact_waf_exception_data!(infos, redacted_data)
|
105
|
+
return if redacted_data.empty?
|
106
|
+
infos[:waf].delete(:args)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'sqreen/aggregated_metric'
|
2
|
+
require 'sqreen/kit'
|
3
|
+
require 'sqreen/kit/string_sanitizer'
|
4
|
+
require 'sqreen/signals/conversions'
|
5
|
+
require 'sqreen/log/loggable'
|
6
|
+
|
7
|
+
module Sqreen
|
8
|
+
module Signals
|
9
|
+
# see also Sqreen::Legacy::OldEventSubmissionStrategy
|
10
|
+
# usage in Sqreen:Session
|
11
|
+
class SignalsSubmissionStrategy
|
12
|
+
include Sqreen::Log::Loggable
|
13
|
+
|
14
|
+
# @param [Array<Sqreen::AggregatedMetric>] metrics
|
15
|
+
def post_metrics(metrics)
|
16
|
+
return if metrics.nil? || metrics.empty?
|
17
|
+
|
18
|
+
guarded 'Failed to serialize or submit aggregated metrics' do
|
19
|
+
batch = metrics.map do |m|
|
20
|
+
Conversions.convert_metric_sample(m)
|
21
|
+
end
|
22
|
+
client.report_batch(batch)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# @param _attack [Sqreen::Attack]
|
27
|
+
# XXX: unused
|
28
|
+
def post_attack(_attack)
|
29
|
+
raise NotImplementedError
|
30
|
+
end
|
31
|
+
|
32
|
+
# @param request_record [Sqreen::RequestRecord]
|
33
|
+
def post_request_record(request_record)
|
34
|
+
guarded 'Failed to serialize or submit request record' do
|
35
|
+
trace = Conversions.convert_req_record(request_record)
|
36
|
+
append_sanitizing_filter(trace)
|
37
|
+
client.report_trace(trace)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Post an exception to Sqreen for analysis
|
42
|
+
# @param exception [RemoteException] Exception and context to be sent over
|
43
|
+
def post_sqreen_exception(exception)
|
44
|
+
guarded 'Failed to serialize or submit exception', false do
|
45
|
+
data = Conversions.convert_exception(exception)
|
46
|
+
append_sanitizing_filter(data)
|
47
|
+
client.report_signal(data)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def post_batch(events)
|
52
|
+
guarded 'Failed to serialize or submit batch of events' do
|
53
|
+
batch = Conversions.convert_batch(events)
|
54
|
+
batch.each { |sig_or_trace| append_sanitizing_filter(sig_or_trace) }
|
55
|
+
client.report_batch(batch)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def append_sanitizing_filter(sig_or_trace)
|
62
|
+
sig_or_trace.append_to_h_filter Kit::StringSanitizer.method(:sanitize)
|
63
|
+
end
|
64
|
+
|
65
|
+
# we don't want exceptions to propagate and kill the worker thread
|
66
|
+
def guarded(msg, report = true)
|
67
|
+
yield
|
68
|
+
rescue StandardError => e
|
69
|
+
logger.warn "#{msg}: #{e.message}\n#{e.backtrace.map { |x| " #{x}" }.join("\n")}"
|
70
|
+
post_sqreen_exception(RemoteException.new(e)) if report
|
71
|
+
end
|
72
|
+
|
73
|
+
def client
|
74
|
+
Sqreen::Kit.auth_signals_client
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
data/lib/sqreen/version.rb
CHANGED
@@ -296,7 +296,7 @@ class Sqreen::Weave::Legacy::Instrumentation
|
|
296
296
|
when :raise, 'raise'
|
297
297
|
throw(b, b.raise(ret[:exception])) if ret.key?(:exception)
|
298
298
|
throw(b, b.raise(Sqreen::AttackBlocked.new("Sqreen blocked a security threat (type: #{callback.rule_name}). No action is required.")))
|
299
|
-
end unless ret.nil?
|
299
|
+
end unless ret.nil? || !ret.is_a?(Hash)
|
300
300
|
end
|
301
301
|
end
|
302
302
|
|
@@ -328,7 +328,7 @@ class Sqreen::Weave::Legacy::Instrumentation
|
|
328
328
|
when :raise, 'raise'
|
329
329
|
throw(b, b.raise(ret[:exception])) if ret.key?(:exception)
|
330
330
|
throw(b, b.raise(Sqreen::AttackBlocked.new("Sqreen blocked a security threat (type: #{callback.rule_name}). No action is required.")))
|
331
|
-
end unless ret.nil?
|
331
|
+
end unless ret.nil? || !ret.is_a?(Hash)
|
332
332
|
end
|
333
333
|
end
|
334
334
|
|
@@ -354,7 +354,7 @@ class Sqreen::Weave::Legacy::Instrumentation
|
|
354
354
|
end
|
355
355
|
Sqreen::Weave.logger.debug { "#{rule} klass=#{callback.klass} method=#{callback.method} when=#failing instance=#{i} => return=#{ret.inspect}" }
|
356
356
|
|
357
|
-
raise
|
357
|
+
throw(b, b.raise(e)) if ret.nil? || !ret.is_a?(Hash)
|
358
358
|
|
359
359
|
case ret[:status]
|
360
360
|
when :override, 'override'
|
@@ -368,7 +368,7 @@ class Sqreen::Weave::Legacy::Instrumentation
|
|
368
368
|
throw(b, b.raise(e))
|
369
369
|
else
|
370
370
|
throw(b, b.raise(e))
|
371
|
-
end unless ret.nil?
|
371
|
+
end unless ret.nil? || !ret.is_a?(Hash)
|
372
372
|
end
|
373
373
|
end
|
374
374
|
end.install
|
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sqreen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.21.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sqreen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-06-
|
11
|
+
date: 2020-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sqreen-backport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.1.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.1.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: sqreen-kit
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.2.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.2.1
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: sq_mini_racer
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -65,11 +93,10 @@ files:
|
|
65
93
|
- lib/sqreen/actions/user_action_class.rb
|
66
94
|
- lib/sqreen/actions/users_index.rb
|
67
95
|
- lib/sqreen/agent.rb
|
96
|
+
- lib/sqreen/agent_message.rb
|
97
|
+
- lib/sqreen/aggregated_metric.rb
|
68
98
|
- lib/sqreen/attack_blocked.rb
|
69
99
|
- lib/sqreen/attack_detected.html
|
70
|
-
- lib/sqreen/backport.rb
|
71
|
-
- lib/sqreen/backport/clock_gettime.rb
|
72
|
-
- lib/sqreen/backport/original_name.rb
|
73
100
|
- lib/sqreen/binding_accessor.rb
|
74
101
|
- lib/sqreen/binding_accessor/path_elem.rb
|
75
102
|
- lib/sqreen/binding_accessor/transforms.rb
|
@@ -95,7 +122,32 @@ files:
|
|
95
122
|
- lib/sqreen/dependency/rails.rb
|
96
123
|
- lib/sqreen/dependency/sentry.rb
|
97
124
|
- lib/sqreen/dependency/sinatra.rb
|
125
|
+
- lib/sqreen/ecosystem.rb
|
126
|
+
- lib/sqreen/ecosystem/dispatch_table.rb
|
127
|
+
- lib/sqreen/ecosystem/http/net_http.rb
|
128
|
+
- lib/sqreen/ecosystem/http/rack_request.rb
|
129
|
+
- lib/sqreen/ecosystem/loggable.rb
|
130
|
+
- lib/sqreen/ecosystem/module_api.rb
|
131
|
+
- lib/sqreen/ecosystem/module_api/event_listener.rb
|
132
|
+
- lib/sqreen/ecosystem/module_api/instrumentation.rb
|
133
|
+
- lib/sqreen/ecosystem/module_api/signal_producer.rb
|
134
|
+
- lib/sqreen/ecosystem/module_api/tracing_push_down.rb
|
135
|
+
- lib/sqreen/ecosystem/module_api/transaction_storage.rb
|
136
|
+
- lib/sqreen/ecosystem/module_registry.rb
|
137
|
+
- lib/sqreen/ecosystem/redis/redis_connection.rb
|
138
|
+
- lib/sqreen/ecosystem/tracing/sampler.rb
|
139
|
+
- lib/sqreen/ecosystem/tracing/sampling_configuration.rb
|
140
|
+
- lib/sqreen/ecosystem/tracing/signals/tracing_client.rb
|
141
|
+
- lib/sqreen/ecosystem/tracing/signals/tracing_server.rb
|
142
|
+
- lib/sqreen/ecosystem/tracing_id_setup.rb
|
143
|
+
- lib/sqreen/ecosystem/transaction_storage.rb
|
144
|
+
- lib/sqreen/ecosystem_integration.rb
|
145
|
+
- lib/sqreen/ecosystem_integration/around_callbacks.rb
|
146
|
+
- lib/sqreen/ecosystem_integration/instrumentation_service.rb
|
147
|
+
- lib/sqreen/ecosystem_integration/request_lifecycle_tracking.rb
|
148
|
+
- lib/sqreen/ecosystem_integration/signal_consumption.rb
|
98
149
|
- lib/sqreen/encoding_sanitizer.rb
|
150
|
+
- lib/sqreen/endpoint_testing.rb
|
99
151
|
- lib/sqreen/error_handling_middleware.rb
|
100
152
|
- lib/sqreen/event.rb
|
101
153
|
- lib/sqreen/events/attack.rb
|
@@ -129,8 +181,16 @@ files:
|
|
129
181
|
- lib/sqreen/js/mini_racer_adapter.rb
|
130
182
|
- lib/sqreen/js/mini_racer_executable_js.rb
|
131
183
|
- lib/sqreen/js/thread_local_exec_js_runnable.rb
|
184
|
+
- lib/sqreen/kit/signals/specialized/aggregated_metric.rb
|
185
|
+
- lib/sqreen/kit/signals/specialized/attack.rb
|
186
|
+
- lib/sqreen/kit/signals/specialized/binning_metric.rb
|
187
|
+
- lib/sqreen/kit/signals/specialized/http_trace.rb
|
188
|
+
- lib/sqreen/kit/signals/specialized/sdk_track_call.rb
|
189
|
+
- lib/sqreen/kit/signals/specialized/sqreen_exception.rb
|
132
190
|
- lib/sqreen/legacy.rb
|
133
191
|
- lib/sqreen/legacy/instrumentation.rb
|
192
|
+
- lib/sqreen/legacy/old_event_submission_strategy.rb
|
193
|
+
- lib/sqreen/legacy/waf_redactions.rb
|
134
194
|
- lib/sqreen/log.rb
|
135
195
|
- lib/sqreen/log/loggable.rb
|
136
196
|
- lib/sqreen/logger.rb
|
@@ -201,6 +261,9 @@ files:
|
|
201
261
|
- lib/sqreen/shared_storage.rb
|
202
262
|
- lib/sqreen/shared_storage23.rb
|
203
263
|
- lib/sqreen/shrink_wrap.rb
|
264
|
+
- lib/sqreen/signals/conversions.rb
|
265
|
+
- lib/sqreen/signals/http_trace_redaction.rb
|
266
|
+
- lib/sqreen/signals/signals_submission_strategy.rb
|
204
267
|
- lib/sqreen/signature_verifier.rb
|
205
268
|
- lib/sqreen/sinatra_middleware.rb
|
206
269
|
- lib/sqreen/sqreen_signed_verifier.rb
|
@@ -238,7 +301,9 @@ metadata:
|
|
238
301
|
changelog_uri: https://docs.sqreen.com/ruby/release-notes/
|
239
302
|
source_code_uri: https://github.com/sqreen/ruby-agent
|
240
303
|
bug_tracker_uri: https://github.com/sqreen/ruby-agent/issues
|
241
|
-
post_install_message:
|
304
|
+
post_install_message: |2
|
305
|
+
This is a Sqreen beta release and may not work in all situations.
|
306
|
+
Make sure to review CHANGELOG.md for important details.
|
242
307
|
rdoc_options: []
|
243
308
|
require_paths:
|
244
309
|
- lib
|
@@ -249,12 +314,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
249
314
|
version: 1.9.3
|
250
315
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
251
316
|
requirements:
|
252
|
-
- - "
|
317
|
+
- - ">"
|
253
318
|
- !ruby/object:Gem::Version
|
254
|
-
version:
|
319
|
+
version: 1.3.1
|
255
320
|
requirements: []
|
256
|
-
|
257
|
-
rubygems_version: 2.7.7
|
321
|
+
rubygems_version: 3.1.2
|
258
322
|
signing_key:
|
259
323
|
specification_version: 4
|
260
324
|
summary: Sqreen Ruby agent
|
data/lib/sqreen/backport.rb
DELETED
@@ -1,74 +0,0 @@
|
|
1
|
-
# typed: ignore
|
2
|
-
|
3
|
-
# Copyright (c) 2015 Sqreen. All Rights Reserved.
|
4
|
-
# Please refer to our terms for more information: https://www.sqreen.com/terms.html
|
5
|
-
|
6
|
-
require 'sqreen/backport'
|
7
|
-
|
8
|
-
module Sqreen
|
9
|
-
module Backport
|
10
|
-
module ClockGettime
|
11
|
-
class << self
|
12
|
-
def supported?
|
13
|
-
Process.respond_to?(:clock_gettime)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
unless supported?
|
18
|
-
require 'ffi'
|
19
|
-
|
20
|
-
class Timespec < FFI::Struct
|
21
|
-
layout :tv_sec => :time_t, :tv_nsec => :long
|
22
|
-
end
|
23
|
-
|
24
|
-
module LibC
|
25
|
-
extend FFI::Library
|
26
|
-
ffi_lib FFI::Library::LIBC
|
27
|
-
|
28
|
-
# TODO: FFI::NotFoundError
|
29
|
-
|
30
|
-
if RUBY_PLATFORM =~ /darwin/
|
31
|
-
attach_function :mach_absolute_time, [], :uint64
|
32
|
-
end
|
33
|
-
|
34
|
-
attach_function :clock_gettime, [:int, :pointer], :int
|
35
|
-
end
|
36
|
-
|
37
|
-
module Constants
|
38
|
-
case RUBY_PLATFORM
|
39
|
-
when /darwin/
|
40
|
-
CLOCK_REALTIME = 0
|
41
|
-
CLOCK_MONOTONIC = 6
|
42
|
-
CLOCK_PROCESS_CPUTIME_ID = 12
|
43
|
-
CLOCK_THERAD_CPUTIME_ID = 16
|
44
|
-
when /linux/
|
45
|
-
CLOCK_REALTIME = 0
|
46
|
-
CLOCK_MONOTONIC = 1
|
47
|
-
CLOCK_PROCESS_CPUTIME_ID = 2
|
48
|
-
CLOCK_THREAD_CPUTIME_ID = 3
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def clock_gettime(clock_id, unit = :float_second)
|
53
|
-
unless unit == :float_second
|
54
|
-
raise "Process.clock_gettime: unsupported unit #{unit.inspect}"
|
55
|
-
end
|
56
|
-
|
57
|
-
t = Timespec.new
|
58
|
-
ret = LibC.clock_gettime(clock_id, t.pointer)
|
59
|
-
|
60
|
-
raise SystemCallError, "Errno #{FFI.errno}" if ret == -1
|
61
|
-
|
62
|
-
t[:tv_sec].to_f + t[:tv_nsec].to_f / 1_000_000_000
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
unless Sqreen::Backport::ClockGettime.supported?
|
70
|
-
Process.instance_eval do
|
71
|
-
extend Sqreen::Backport::ClockGettime
|
72
|
-
include Sqreen::Backport::ClockGettime::Constants
|
73
|
-
end
|
74
|
-
end
|