rookout 0.1.3 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ff23aa23db05a25f0bfa7f20ef0d7969d2b26d1a3480667f6165c95d4530ddc7
4
- data.tar.gz: 4e5f6d7b5e9f34aa4cc9cd98c9b73152e7b25f73b49f02ee668d1f676ca8046e
3
+ metadata.gz: 8e07553e631fcf24cda02a212f87ded60d516f649efe6f610917071e8db7af7e
4
+ data.tar.gz: 3fecac876939f846a4e98c00956fef5aaba247944e90fb46a03b495316c7759c
5
5
  SHA512:
6
- metadata.gz: 658f60902cf42a6935b368d96ee466f3f0c2e341bf773961ced22d7a6bf706ccbc64ed91ea52c4bbf3df1a53bfec49f54c5285c99799494b1aca8fcee49c7593
7
- data.tar.gz: 641ece8d6554713fa18e1b5c6999cb2b8783cd1e49114bee1ffc4843198cac6f4fca90f3f85a59781485c1d7017ee7047aaaf8c7ed94af0ec78d17d1668e9ba7
6
+ metadata.gz: fcbc6c8640299f43aaab4cd161200f3454260593839ee8e11c5d593066b65a529410af18ce161e1b5530f8e2d2035c1084998238880314a7ba671ae4d25c09b8
7
+ data.tar.gz: 8a1d38bae4157be95db520e8195de09938ea25acd5dd8ddbcb1a9b687123c8847e45ff6024ce8920408138986ce34386f010a127dec17e3aa3d615df197142af
@@ -0,0 +1,92 @@
1
+ require "bundler/setup"
2
+ require "bundler/gem_tasks"
3
+
4
+ spec = Gem::Specification.load("rookout.gemspec")
5
+
6
+ require "rake/testtask"
7
+ desc "Run tests."
8
+ Rake::TestTask.new do |t|
9
+ t.pattern = "test/**/*_test.rb"
10
+ t.warning = false
11
+ end
12
+
13
+ desc "Run the CI build"
14
+ task :ci do
15
+ header "BUILDING rookout", "#"
16
+ header "rookout rubocop", "*"
17
+ require "rubocop/rake_task"
18
+ RuboCop::RakeTask.new
19
+ Rake::Task[:rubocop].invoke
20
+ header "rookout test", "*"
21
+ Rake::Task[:test].invoke
22
+ end
23
+
24
+ desc "Set commit hash"
25
+ task :set_commit do
26
+ header "Setting commit hash in file", "#"
27
+ write_commit_file read_commit
28
+ puts "Done!"
29
+ end
30
+
31
+ desc "Bump gem vesrion"
32
+ task :bump_version do
33
+ header "Bumpding version", "#"
34
+
35
+ version = read_version
36
+ minor_version = version[0...version.rindex(".")]
37
+ patch_version = version[version.rindex(".") + 1...version.length]
38
+ new_patch_version = patch_version.to_i + 1
39
+ new_version = "#{minor_version}.#{new_patch_version}"
40
+
41
+ write_version_file new_version
42
+
43
+ puts "Done! New version is #{new_version}"
44
+ end
45
+
46
+ desc "Print version configuration"
47
+ task :print_version do
48
+ puts "export ROOK_VERSION=#{read_version}"
49
+ puts "export ROOK_COMMIT=#{read_commit}"
50
+ end
51
+
52
+ task :default => :test
53
+
54
+ def read_version
55
+ require_relative "lib/rookout/version"
56
+ Rookout::VERSION
57
+ end
58
+
59
+ def read_commit
60
+ `git rev-parse HEAD`.strip
61
+ end
62
+
63
+ def write_version_file new_version
64
+ contents = ""
65
+ contents += "module Rookout\n"
66
+ contents += " VERSION = \"#{new_version}\".freeze\n"
67
+ contents += "end\n"
68
+
69
+ f = File.new "lib/rookout/version.rb", "wb"
70
+ f.write contents
71
+ f.close
72
+ end
73
+
74
+ def write_commit_file commit
75
+ contents = ""
76
+ contents += "module Rookout\n"
77
+ contents += " COMMIT = \"#{commit}\".freeze\n"
78
+ contents += "end\n"
79
+
80
+ f = File.new "lib/rookout/commit.rb", "wb"
81
+ f.write contents
82
+ f.close
83
+ end
84
+
85
+ def header str, token
86
+ line_length = str.length + 8
87
+ puts ""
88
+ puts token * line_length
89
+ puts "#{token * 3} #{str} #{token * 3}"
90
+ puts token * line_length
91
+ puts ""
92
+ end
@@ -0,0 +1,23 @@
1
+ require "rubygems"
2
+ require "rubygems/command.rb"
3
+ require "rubygems/dependency_installer.rb"
4
+
5
+ # We override platform comparison to only match source gems
6
+ class Gem::Platform
7
+ def self.match platform
8
+ platform.nil? || platform == Gem::Platform::RUBY
9
+ end
10
+ end
11
+
12
+ inst = Gem::DependencyInstaller.new
13
+ begin
14
+ puts "[Rookout] installing appropriate google-protobuf gem"
15
+ if File.exist? "/etc/alpine-release"
16
+ installed = inst.install "google-protobuf", [">= 3.0.0", "< 3.10.0"]
17
+ else
18
+ installed = inst.install "google-protobuf", ">= 3.0.0"
19
+ end
20
+ puts "[Rookout] Installed additional dependencies: #{installed}"
21
+ rescue
22
+ exit 1
23
+ end
@@ -0,0 +1,73 @@
1
+ module Rookout
2
+ class ForkManager
3
+ require "singleton"
4
+ include Singleton
5
+
6
+ def initialize
7
+ @active = false
8
+ end
9
+
10
+ def activate!
11
+ @active = true
12
+ end
13
+
14
+ def disable!
15
+ @active = false
16
+ end
17
+
18
+ def active?
19
+ @active
20
+ end
21
+
22
+ def fork_hook original_fork
23
+ if block_given?
24
+ original_fork.call do
25
+ post_fork_child if active?
26
+ yield
27
+ end
28
+ else
29
+ res = original_fork.call
30
+ post_fork_child if active? && !res
31
+ res
32
+ end
33
+ end
34
+
35
+ def post_fork_child
36
+ require_relative "rookout_singleton"
37
+ require_relative "interface"
38
+
39
+ RookoutSingleton.instance.post_fork_clean
40
+ Interface.instance.stop
41
+ Interface.instance.start post_fork: true
42
+
43
+ # Disable fork handler in child process
44
+ disable!
45
+ end
46
+ end
47
+ end
48
+
49
+ alias _rookout_original_fork fork
50
+
51
+ def self.fork &block
52
+ Rookout::ForkManager.instance.fork_hook method(:_rookout_original_fork), &block
53
+ end
54
+
55
+ def fork &block
56
+ Rookout::ForkManager.instance.fork_hook method(:_rookout_original_fork), &block
57
+ end
58
+
59
+ module Kernel
60
+ alias _rookout_original_fork fork
61
+
62
+ def self.fork &block
63
+ Rookout::ForkManager.instance.fork_hook method(:_rookout_original_fork), &block
64
+ end
65
+ end
66
+
67
+ module Process
68
+ alias _rookout_original_fork fork
69
+
70
+ def self.fork &block
71
+ Rookout::ForkManager.instance.fork_hook method(:_rookout_original_fork), &block
72
+ end
73
+ end
@@ -46,7 +46,8 @@ module Rookout
46
46
  "store" => Processor::Namespaces::ContainerNamespace.new,
47
47
  "temp" => Processor::Namespaces::ContainerNamespace.new,
48
48
  "utils" => Processor::Namespaces::RubyUtilsNamespace.new,
49
- "trace" => Processor::Namespaces::NoopNamespace.new
49
+ "trace" => Processor::Namespaces::NoopNamespace.new,
50
+ "state" => Processor::Namespaces::NoopNamespace.new
50
51
  )
51
52
  end
52
53
  end
@@ -39,7 +39,8 @@ module Rookout
39
39
  @info = Information.new labels
40
40
  reset_id
41
41
 
42
- @thread = nil
42
+ @main_thread = nil
43
+ @outgoing_thread = nil
43
44
  @pending_messages = Queue.new
44
45
 
45
46
  @running = false
@@ -64,8 +65,17 @@ module Rookout
64
65
  def connect
65
66
  @running = true
66
67
 
67
- @thread = Thread.new { connection_thread }
68
- @thread.name = "rookout-connection-thread"
68
+ @main_thread = Thread.new { connection_thread }
69
+ @main_thread.name = "rookout-connection-thread"
70
+ end
71
+
72
+ def stop
73
+ @running = false
74
+
75
+ # Ask outgoing thread to exit (if running)
76
+ @pending_messages << ExitMessage.new(@outgoing_thread)
77
+
78
+ @main_thread.join
69
79
  end
70
80
 
71
81
  def wait_for_ready
@@ -133,8 +143,8 @@ module Rookout
133
143
 
134
144
  def connection_pump client
135
145
  on_outgoing_exit = proc { client.close }
136
- send_thread = Thread.new { outgoing client, on_outgoing_exit }
137
- send_thread.name = "rookout-outgoing-thread"
146
+ @outgoing_thread = Thread.new { outgoing client, on_outgoing_exit }
147
+ @outgoing_thread.name = "rookout-outgoing-thread"
138
148
 
139
149
  message_handler = proc do |raw_message|
140
150
  envelope = Com::Rookout::Envelope.decode raw_message.pack("c*")
@@ -150,7 +160,8 @@ module Rookout
150
160
  Logger.instance.debug "Incoming loop - socket disconnected"
151
161
 
152
162
  @pending_messages.push ExitMessage.new(send_thread)
153
- send_thread.join
163
+ @outgoing_thread.join
164
+ @outgoing_thread = nil
154
165
  end
155
166
 
156
167
  def outgoing client, on_exit
@@ -105,7 +105,7 @@ module Rookout
105
105
  end
106
106
 
107
107
  class RookInvalidToken < ToolException
108
- def initialize token
108
+ def initialize token = ""
109
109
  super "The Rookout token supplied #{token[0..6]} is not valid; please check the token and try again",
110
110
  { token: token[0...6] }
111
111
  end
@@ -9,6 +9,7 @@ module Rookout
9
9
 
10
10
  def initialize
11
11
  @rook = nil
12
+ @start_options = nil
12
13
  end
13
14
 
14
15
  def start options = {}
@@ -19,14 +20,20 @@ module Rookout
19
20
  begin
20
21
  require_relative "rookout_singleton"
21
22
 
22
- configure_logging options
23
- configure_git options
23
+ # If we are running post fork, use previous start_options
24
+ if options[:post_fork]
25
+ # Don't re-enable the fork handler
26
+ @start_options[:fork] = false
27
+ else
28
+ configure_logging options
29
+ configure_git options
24
30
 
25
- start_options = configure_start_options options
26
- print_config start_options
31
+ @start_options = configure_start_options options
32
+ print_config @start_options
33
+ end
27
34
 
28
35
  rook = RookoutSingleton.instance
29
- rook.connect(**start_options)
36
+ rook.connect(**@start_options)
30
37
  rescue RookMissingToken, RookInvalidToken, RookInvalidOptions, RookVersionNotSupported => e
31
38
  raise if throw_errors
32
39
  STDERR.puts "[Rookout] Failed to start Rookout: #{e.message}"
@@ -12,6 +12,7 @@ module Rookout
12
12
  end
13
13
 
14
14
  def read_attribute name
15
+ return RubyObjectNamespace.new @binding.receiver if name == "self"
15
16
  raise Exceptions::RookAttributeNotFound, name unless @binding.local_variable_defined? name
16
17
  RubyObjectNamespace.new @binding.local_variable_get name
17
18
  end
@@ -123,6 +123,7 @@ module Rookout
123
123
  end
124
124
 
125
125
  def dump_string obj, variant, config
126
+ obj = obj.to_s
126
127
  if obj.length > config.max_string
127
128
  final_obj = obj[0...config.max_string]
128
129
  else
@@ -40,9 +40,14 @@ module Rookout
40
40
  @services_started = false
41
41
  end
42
42
 
43
- def connect token: nil, host: nil, port: nil, proxy: nil, labels: [], async_start: false, **_
43
+ def connect token: nil, host: nil, port: nil, proxy: nil, labels: [], async_start: false, fork: false
44
44
  raise Exceptions::RookInterfaceException, "Multiple connection attempts not supported!" unless @agent_com.nil?
45
45
 
46
+ if fork
47
+ require_relative "atfork"
48
+ Rookout::ForkManager.instance.activate!
49
+ end
50
+
46
51
  start_trigger_services
47
52
 
48
53
  Logger.instance.debug "Initiating AgentCom-\t#{host}:#{port}"
@@ -61,6 +66,16 @@ module Rookout
61
66
  @output.flush_messages if !@output.nil && !@agent_com.nil?
62
67
  end
63
68
 
69
+ def post_fork_clean
70
+ @agent_com.stop
71
+ @agent_com = nil
72
+
73
+ @command_handler = nil
74
+
75
+ # We don't disable services because we will lose all loaded scripts
76
+ @services.clear_augs
77
+ end
78
+
64
79
  attr_reader :services
65
80
 
66
81
  private
@@ -18,14 +18,14 @@ module Rookout
18
18
  def initialize tracer
19
19
  @tracer = tracer
20
20
  @augs = {}
21
- @iseqs = {}
21
+ @iseqs = []
22
22
  @trace_point = TracePoint.new :script_compiled do |tp|
23
23
  begin
24
24
  begin
25
25
  iseq = tp.instruction_sequence
26
26
  # Ignore script without sources
27
27
  if iseq.absolute_path
28
- @iseqs[tp.path] = iseq
28
+ @iseqs << iseq
29
29
  evaluate_script iseq
30
30
  end
31
31
  rescue Exception => e
@@ -83,7 +83,7 @@ module Rookout
83
83
 
84
84
  def evaluate_all_scripts_to_location location
85
85
  positions = []
86
- @iseqs.each_value do |iseq|
86
+ @iseqs.each do |iseq|
87
87
  position = evaluate_script_to_location iseq, iseq.absolute_path, location
88
88
  next if position.nil?
89
89
 
@@ -1,3 +1,3 @@
1
1
  module Rookout
2
- VERSION = "0.1.3".freeze
2
+ VERSION = "0.1.8".freeze
3
3
  end
@@ -0,0 +1,39 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require_relative "lib/rookout/version"
3
+
4
+ Gem::Specification.new do |spec|
5
+ spec.name = "rookout"
6
+ spec.version = Rookout::VERSION
7
+
8
+ spec.authors = ["Liran Haimovitch"]
9
+ spec.email = ["support@rookout.com"]
10
+ spec.description = "rookout is the Ruby SDK for the Rookout Debugging Platform"
11
+ spec.summary = "rookout is the Ruby SDK for the Rookout Debugging Platform"
12
+ spec.homepage = "https://rookout.com"
13
+ spec.license = "Proprietary"
14
+
15
+ spec.metadata["homepage_uri"] = spec.homepage
16
+
17
+ spec.files = `git ls-files -- ext/* lib/* bin/*`.split("\n") +
18
+ ["lib/rookout/commit.rb", "LICENSE", "Rakefile", "rookout.gemspec"]
19
+ spec.extensions = ["ext/mkrf_conf.rb"]
20
+ spec.executables = ["rookout"]
21
+
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.required_ruby_version = ">= 2.6"
25
+
26
+ spec.add_dependency "binding_of_caller", ">= 0.7"
27
+ spec.add_dependency "concurrent-ruby", ">= 1.1"
28
+ spec.add_dependency "websocket-driver", ">= 0.5.0"
29
+ spec.add_dependency "event_emitter", ">= 0.2.6"
30
+
31
+ spec.add_development_dependency "google-protobuf", ">= 3.0.0"
32
+ spec.add_development_dependency "google-style", ">= 1.24.0"
33
+ spec.add_development_dependency "minitest", ">= 5.14"
34
+ spec.add_development_dependency "minitest-autotest", ">= 1.0"
35
+ spec.add_development_dependency "minitest-focus", ">= 1.1"
36
+ spec.add_development_dependency "minitest-rg", ">= 5.2"
37
+ spec.add_development_dependency "autotest-suffix", ">= 1.1"
38
+ spec.add_development_dependency "rake-compiler", ">= 1.0"
39
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rookout
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Liran Haimovitch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-08 00:00:00.000000000 Z
11
+ date: 2020-12-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: binding_of_caller
@@ -53,33 +53,33 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.5.0
55
55
  - !ruby/object:Gem::Dependency
56
- name: google-protobuf
56
+ name: event_emitter
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 3.0.0
61
+ version: 0.2.6
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: 3.0.0
68
+ version: 0.2.6
69
69
  - !ruby/object:Gem::Dependency
70
- name: event_emitter
70
+ name: google-protobuf
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: 0.2.6
76
- type: :runtime
75
+ version: 3.0.0
76
+ type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: 0.2.6
82
+ version: 3.0.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: google-style
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -183,12 +183,16 @@ email:
183
183
  - support@rookout.com
184
184
  executables:
185
185
  - rookout
186
- extensions: []
186
+ extensions:
187
+ - ext/mkrf_conf.rb
187
188
  extra_rdoc_files: []
188
189
  files:
189
190
  - LICENSE
191
+ - Rakefile
190
192
  - bin/rookout
193
+ - ext/mkrf_conf.rb
191
194
  - lib/rookout.rb
195
+ - lib/rookout/atfork.rb
192
196
  - lib/rookout/augs/actions/action.rb
193
197
  - lib/rookout/augs/actions/action_run_processor.rb
194
198
  - lib/rookout/augs/aug.rb
@@ -247,6 +251,7 @@ files:
247
251
  - lib/rookout/user_warnings.rb
248
252
  - lib/rookout/utils.rb
249
253
  - lib/rookout/version.rb
254
+ - rookout.gemspec
250
255
  homepage: https://rookout.com
251
256
  licenses:
252
257
  - Proprietary