ileitch-hijack 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
data/COPYING ADDED
@@ -0,0 +1,18 @@
1
+ Copyright (c) 2009 Ian Leitch
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to
5
+ deal in the Software without restriction, including without limitation the
6
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7
+ sell copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
16
+ THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
17
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile CHANGED
@@ -1,9 +1,4 @@
1
- require 'rubygems'
2
- require 'rake/gempackagetask'
3
-
4
- spec = eval(File.read('hijack.gemspec'))
5
-
6
- Rake::GemPackageTask.new(spec) do |pkg|
7
- pkg.gem_spec = spec
8
- end
1
+ require 'rake'
2
+ require 'rake/clean'
9
3
 
4
+ Dir['tasks/**/*.rake'].each { |rake| load rake }
data/TODO CHANGED
@@ -3,4 +3,3 @@
3
3
  * Improve startup experience
4
4
  * Check if attached process is in fact a ruby process
5
5
  * Require actual remote script if possible so that if it defines any classes we can dump those too.
6
- * (eval):211: [BUG] object allocation during garbage collection phase
@@ -11,7 +11,7 @@ module Hijack
11
11
  end
12
12
 
13
13
  def self.payload(pid)
14
- <<-EOS
14
+ <<-RUBY
15
15
  require 'stringio'
16
16
  require 'drb'
17
17
 
@@ -19,16 +19,32 @@ module Hijack
19
19
  module Hijack
20
20
  class OutputCopier
21
21
  def self.remote
22
- @@remote
22
+ @remote
23
+ end
24
+
25
+ def self.stop
26
+ @remote = nil
27
+ [$stdout, $stderr].each do |io|
28
+ if io.respond_to?(:write_with_copying)
29
+ class << io
30
+ alias_method :write, :write_without_copying
31
+ remove_method :write_with_copying
32
+ end
33
+ end
34
+ end
23
35
  end
24
36
 
25
37
  def self.start(pid)
26
- @@remote = DRbObject.new(nil, 'drbunix://tmp/hijack.' + pid + '.sock')
38
+ @remote = DRbObject.new(nil, 'drbunix://tmp/hijack.' + pid + '.sock')
27
39
 
28
40
  class << $stdout
29
41
  def write_with_copying(str)
30
42
  write_without_copying(str)
31
- Hijack::OutputCopier.remote.write('stdout', str) rescue nil
43
+ begin
44
+ Hijack::OutputCopier.remote.write('stdout', str)
45
+ rescue Exception
46
+ Hijack.stop
47
+ end
32
48
  end
33
49
  alias_method :write_without_copying, :write
34
50
  alias_method :write, :write_with_copying
@@ -37,7 +53,11 @@ module Hijack
37
53
  class << $stderr
38
54
  def write_with_copying(str)
39
55
  write_without_copying(str)
40
- Hijack::OutputCopier.remote.write('stderr', str) rescue nil
56
+ begin
57
+ Hijack::OutputCopier.remote.write('stderr', str)
58
+ rescue Exception
59
+ Hijack.stop
60
+ end
41
61
  end
42
62
  alias_method :write_without_copying, :write
43
63
  alias_method :write, :write_with_copying
@@ -56,6 +76,8 @@ module Hijack
56
76
  OutputCopier.start($1)
57
77
  elsif rb =~ /__hijack_get_remote_file_name/
58
78
  @file
79
+ elsif rb =~ /__hijack_exit/
80
+ Hijack.stop
59
81
  else
60
82
  @context.instance_eval(rb)
61
83
  end
@@ -68,11 +90,20 @@ module Hijack
68
90
  @service = DRb.start_service('#{Hijack.socket_for(pid)}', evaluator)
69
91
  File.chmod(0600, '#{Hijack.socket_path_for(pid)}')
70
92
  end
93
+
94
+ def self.stop
95
+ begin
96
+ OutputCopier.stop
97
+ @service.stop_service
98
+ @service = nil
99
+ rescue Exception
100
+ end
101
+ end
71
102
  end
72
103
  end
73
104
  __hijack_context = self
74
105
  Signal.trap('USR2') { Hijack.start(__hijack_context) }
75
- EOS
106
+ RUBY
76
107
  end
77
108
  end
78
109
  end
@@ -12,7 +12,10 @@ module Hijack
12
12
  class Workspace < IRB::WorkSpace
13
13
  attr_accessor :remote, :pid
14
14
  def evaluate(context, statements, file = __FILE__, line = __LINE__)
15
- if statements =~ /(IRB\.|exit)/
15
+ if statements =~ /IRB\./
16
+ super
17
+ elsif statements.strip =~ /^exit/
18
+ remote.evaluate('__hijack_exit') rescue nil
16
19
  super
17
20
  elsif helper = Hijack::Helper.find_helper(statements)
18
21
  Hijack::Helper.send(helper, remote)
data/tasks/gem.rake ADDED
@@ -0,0 +1,41 @@
1
+ require 'rake/gempackagetask'
2
+ require 'yaml'
3
+
4
+ HIJACK_VERSION = '0.1.7'
5
+
6
+ task :clean => :clobber_package
7
+
8
+ spec = Gem::Specification.new do |s|
9
+ s.name = 'hijack'
10
+ s.version = HIJACK_VERSION
11
+ s.platform = Gem::Platform::RUBY
12
+ s.summary =
13
+ s.description = 'Provides an irb session to an existing ruby process.'
14
+ s.author = "Ian Leitch"
15
+ s.email = 'ian.leitch@systino.net'
16
+ s.homepage = 'http://github.com/ileitch/hijack'
17
+ s.has_rdoc = false
18
+ s.files = %w(COPYING TODO README.rdoc Rakefile) + Dir.glob("{lib,test,tasks,bin,examples}/**/*")
19
+ s.bindir = "bin"
20
+ s.executables = %w( hijack )
21
+ s.require_path = "lib"
22
+ end
23
+
24
+ Rake::GemPackageTask.new(spec) do |p|
25
+ p.gem_spec = spec
26
+ end
27
+
28
+ namespace :gem do
29
+ desc "Update the gemspec for GitHub's gem server"
30
+ task :github do
31
+ File.open("hijack.gemspec", 'w') { |f| f << YAML.dump(spec) }
32
+ end
33
+ end
34
+
35
+ task :install => [:clean, :clobber, :package] do
36
+ sh "sudo gem install pkg/#{spec.full_name}.gem"
37
+ end
38
+
39
+ task :uninstall => :clean do
40
+ sh "sudo gem uninstall -v #{HIJACK_VERSION} -x hijack"
41
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ileitch-hijack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ian Leitch
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-05-16 00:00:00 -07:00
12
+ date: 2009-09-13 21:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -19,24 +19,26 @@ executables:
19
19
  - hijack
20
20
  extensions: []
21
21
 
22
- extra_rdoc_files:
23
- - README.rdoc
22
+ extra_rdoc_files: []
23
+
24
24
  files:
25
+ - COPYING
26
+ - TODO
25
27
  - README.rdoc
26
28
  - Rakefile
27
- - TODO
28
29
  - lib/hijack
29
- - lib/hijack.rb
30
30
  - lib/hijack/console.rb
31
31
  - lib/hijack/gdb.rb
32
32
  - lib/hijack/helper.rb
33
33
  - lib/hijack/payload.rb
34
34
  - lib/hijack/workspace.rb
35
- - examples/rails_dispatcher.rb
36
- - bin/hijack
35
+ - lib/hijack.rb
37
36
  - test/app.rb
38
37
  - test/gc.rb
39
38
  - test/test.rb
39
+ - tasks/gem.rake
40
+ - bin/hijack
41
+ - examples/rails_dispatcher.rb
40
42
  has_rdoc: true
41
43
  homepage: http://github.com/ileitch/hijack
42
44
  post_install_message:
@@ -61,7 +63,7 @@ requirements: []
61
63
  rubyforge_project:
62
64
  rubygems_version: 1.2.0
63
65
  signing_key:
64
- specification_version: 2
66
+ specification_version: 3
65
67
  summary: Provides an irb session to an existing ruby process.
66
68
  test_files: []
67
69