sqreen 1.19.1 → 1.21.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|