tbm 0.1.2 → 0.2.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,14 @@
1
+ def stub_messages
2
+ @messages = []
3
+ $stdout.stub( :write ) { |message| @messages << message }
4
+ end
5
+
6
+ def surpress_messages
7
+ $stdout.stub( :write )
8
+ end
9
+
10
+ RSpec::Matchers.define :include_match do |expected|
11
+ match do |actual|
12
+ !actual.grep( expected ).empty?
13
+ end
14
+ end
@@ -0,0 +1,40 @@
1
+ require 'TBM/target'
2
+ require 'rspec'
3
+
4
+ describe TBM::Target do
5
+ context "with name 'Foo'" do
6
+ subject { TBM::Target.new( 'Foo','host','user' ) }
7
+
8
+ it "should have name 'Foo'" do
9
+ subject.should have_name( 'Foo' )
10
+ end
11
+
12
+ it "should describe itself as 'Foo'" do
13
+ subject.to_s.should eq('Foo')
14
+ end
15
+
16
+ context "and aliases 'Bar', 'Baz'" do
17
+ before do
18
+ subject.add_alias('Bar')
19
+ subject.add_alias('Baz')
20
+ end
21
+
22
+ it "should have name 'Foo'" do
23
+ subject.should have_name( 'Foo' )
24
+ end
25
+
26
+ it "should have name 'Bar'" do
27
+ subject.should have_name( 'Foo' )
28
+ end
29
+
30
+ it "should have name 'Baz'" do
31
+ subject.should have_name( 'Foo' )
32
+ end
33
+
34
+ it "should describe itself as 'Foo (Bar, Baz)'" do
35
+ subject.to_s.should eq('Foo (Bar, Baz)')
36
+ end
37
+
38
+ end
39
+ end
40
+ end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tbm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
5
- prerelease:
4
+ version: 0.2.0.rc1
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Geoffrey Wiseman
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-23 00:00:00.000000000 Z
12
+ date: 2012-12-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: net-ssh
@@ -36,11 +36,18 @@ executables:
36
36
  extensions: []
37
37
  extra_rdoc_files: []
38
38
  files:
39
+ - lib/TBM/cli.rb
40
+ - lib/TBM/config.rb
41
+ - lib/TBM/config_parser.rb
42
+ - lib/TBM/machine.rb
43
+ - lib/TBM/meta.rb
44
+ - lib/TBM/target.rb
45
+ - lib/TBM/tunnel.rb
39
46
  - lib/tbm.rb
40
- - lib/tunnel/cli.rb
41
- - lib/tunnel/config.rb
42
- - lib/tunnel/meta.rb
43
- - lib/tunnel/target.rb
47
+ - spec/cli_spec.rb
48
+ - spec/config_spec.rb
49
+ - spec/spec_helper.rb
50
+ - spec/target_spec.rb
44
51
  - bin/tbm
45
52
  - Rakefile
46
53
  - README.md
@@ -59,17 +66,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
59
66
  version: '0'
60
67
  segments:
61
68
  - 0
62
- hash: 518991908318749501
69
+ hash: -3696541644893645018
63
70
  required_rubygems_version: !ruby/object:Gem::Requirement
64
71
  none: false
65
72
  requirements:
66
- - - ! '>='
73
+ - - ! '>'
67
74
  - !ruby/object:Gem::Version
68
- version: '0'
75
+ version: 1.3.1
69
76
  requirements: []
70
77
  rubyforge_project:
71
78
  rubygems_version: 1.8.24
72
79
  signing_key:
73
80
  specification_version: 3
74
- summary: Named SSH tunnels, like bookmarks.
81
+ summary: Manages SSH Tunnels by creating an SSH connection and forwarding ports based
82
+ on named targets defined in configuration.
75
83
  test_files: []
data/lib/tunnel/cli.rb DELETED
@@ -1,69 +0,0 @@
1
- require 'net/ssh'
2
-
3
- module Tunnel
4
- class CommandLineInterface
5
- def initialize( config )
6
- @config = config
7
- @target = nil
8
- @cancelled = false
9
- end
10
-
11
- def parse
12
- if ARGV.size != 1
13
- print_targets "SYNTAX: tbm <target>\n\nWhere target is one of:"
14
- else
15
- target_name = ARGV[0]
16
- @target = @config.get_target( target_name )
17
- print_targets( "Cannot find target: #{target_name}\n\nThese are the targets currently defined:" ) if @target.nil?
18
- end
19
- end
20
-
21
- def print_targets( message )
22
- puts message
23
- @config.each_target { |target| puts "\t#{target.name}" }
24
- end
25
-
26
-
27
- def valid?
28
- !@target.nil?
29
- end
30
-
31
- def bore
32
- puts "Starting #{APP_NAME} v#{VERSION}"
33
- puts
34
-
35
- trap("INT") { @cancelled = true }
36
- Net::SSH.start( @target.host, @target.username ) do |session|
37
- forward_ports( session )
38
- end
39
-
40
- puts "Shutting down the machine."
41
- end
42
-
43
- def forward_ports( session )
44
- begin
45
- puts "Opened connection to #{@target.username}@#{@target.host}:"
46
- @target.each_forward do |fwd|
47
- remote_server, port = fwd
48
- session.forward.local( port, remote_server, port )
49
- puts "\tforwarded port #{port} to #{remote_server}:#{port}"
50
- end
51
- puts "\twaiting for Ctrl-C..."
52
- session.loop(0.1) { not @cancelled }
53
- puts "\n\tCtrl-C pressed. Exiting."
54
- rescue Errno::EACCES
55
- @cancelled = true
56
- puts "\tCould not open all ports; you may need to sudo if port < 1000."
57
- end
58
- end
59
-
60
- def self.parse_and_run
61
- config = Config.new
62
- if config.valid?
63
- cli = CommandLineInterface.new( config )
64
- cli.parse
65
- cli.bore if cli.valid?
66
- end
67
- end
68
- end
69
- end
data/lib/tunnel/config.rb DELETED
@@ -1,94 +0,0 @@
1
- require 'etc'
2
- require 'yaml'
3
-
4
- module Tunnel
5
- class Config
6
- CONFIG_FILE = File.expand_path( '~/.tunnels' )
7
-
8
- def initialize
9
- @valid = nil
10
- @targets = []
11
- if File.file? CONFIG_FILE
12
- config_data = YAML.load_file( CONFIG_FILE )
13
- parse config_data if config_data.is_a? Hash
14
- else
15
- puts "Configure your tunnels in ~/.tunnels in YAML form."
16
- end
17
- end
18
-
19
- def valid?
20
- @valid
21
- end
22
-
23
- def get_target( name )
24
- @targets.find { |target| target.has_name?(name) }
25
- end
26
-
27
- def each_target( &block )
28
- @targets.each { |target| yield target }
29
- end
30
-
31
- private
32
-
33
- def parse( targets )
34
- targets.each_key { |name| parse_target name, targets[name] }
35
- @valid = true if @valid.nil? && !@targets.empty?
36
- end
37
-
38
- def parse_target( name, config )
39
- if config.is_a? Hash
40
- target = create_target( name, config )
41
- unless target.nil?
42
- @targets << target
43
- parse_forward( target, config['forward'] )
44
- end
45
- else
46
- puts "Cannot parse target '#{name}' (#{config.class})"
47
- @valid = false
48
- end
49
- end
50
-
51
- def create_target( name, config )
52
- if config.has_key? 'host' then
53
- if config.has_key? 'username' then
54
- username = config['username']
55
- else
56
- username = Etc.getlogin
57
- end
58
- Target.new name, config['host'], username
59
- else
60
- puts "Cannot parse target '#{name}': no host found."
61
- @valid = false
62
- end
63
- end
64
-
65
- def parse_forward( target, config )
66
- case config
67
- when nil
68
- puts "Target #{target.name} has no forwards defined."
69
- @valid = false
70
- when Fixnum
71
- target.forward_port( config )
72
- when Array
73
- config.each { |port| target.forward_port(port) }
74
- when Hash
75
- config.each_key do |server|
76
- server_config = config[ server ]
77
- case server_config
78
- when Fixnum
79
- target.forward_port( server_config, server )
80
- when Array
81
- server_config.each { |port| target.forward_port( port, server ) }
82
- else
83
- puts "Not sure how to handle forward from #{target.host} to #{server}: #{server_config.class}"
84
- end
85
- end
86
- else
87
- puts "Not sure how to handle forward for '#{target.host}': #{config.class}"
88
- @valid = false
89
- end
90
- end
91
-
92
- end
93
-
94
- end
data/lib/tunnel/meta.rb DELETED
@@ -1,5 +0,0 @@
1
- module Tunnel
2
- APP_NAME = "Tunnel Boring Machine"
3
- VERSION = "0.1.2"
4
- DATE = '2012-11-23'
5
- end
data/lib/tunnel/target.rb DELETED
@@ -1,24 +0,0 @@
1
- module Tunnel
2
- class Target
3
- attr_reader :name, :host, :username
4
-
5
- def initialize( name, host, username )
6
- @name = name
7
- @host = host
8
- @username = username
9
- @forwards = []
10
- end
11
-
12
- def forward_port( port, server='localhost' )
13
- @forwards << [ server, port ]
14
- end
15
-
16
- def has_name?( name )
17
- @name==name
18
- end
19
-
20
- def each_forward( &block )
21
- @forwards.each { |fwd| yield fwd }
22
- end
23
- end
24
- end