canals 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +38 -0
- data/.rvmrc +1 -0
- data/Gemfile +8 -0
- data/LICENSE +21 -0
- data/README.md +11 -0
- data/Rakefile +3 -0
- data/assets/canals.sh +53 -0
- data/bin/canal +14 -0
- data/canals.gemspec +27 -0
- data/lib/canals/cli/environment.rb +44 -0
- data/lib/canals/cli/helpers.rb +38 -0
- data/lib/canals/cli/list.rb +43 -0
- data/lib/canals/cli/session.rb +75 -0
- data/lib/canals/cli/setup.rb +98 -0
- data/lib/canals/cli.rb +90 -0
- data/lib/canals/config.rb +37 -0
- data/lib/canals/core.rb +69 -0
- data/lib/canals/core_ext/shell_colors.rb +15 -0
- data/lib/canals/core_ext/string.rb +6 -0
- data/lib/canals/environment.rb +40 -0
- data/lib/canals/options.rb +75 -0
- data/lib/canals/repository.rb +87 -0
- data/lib/canals/session.rb +64 -0
- data/lib/canals/tools/assets.rb +21 -0
- data/lib/canals/tools/completion.rb +47 -0
- data/lib/canals/version.rb +6 -0
- data/lib/canals.rb +39 -0
- data/spec/canals/environment_spec.rb +77 -0
- data/spec/canals/options_spec.rb +203 -0
- data/spec/spec_helper.rb +4 -0
- metadata +119 -0
@@ -0,0 +1,203 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'canals/options'
|
3
|
+
require 'psych'
|
4
|
+
|
5
|
+
describe Canals::CanalOptions do
|
6
|
+
|
7
|
+
let(:name) { "example" }
|
8
|
+
let(:remote_host) { "www.example.com" }
|
9
|
+
let(:remote_port) { 1234 }
|
10
|
+
let(:local_port) { 4321 }
|
11
|
+
let(:bind_address) { "1.2.3.4" }
|
12
|
+
let(:hostname) { "nat.example.com" }
|
13
|
+
let(:user) { "user" }
|
14
|
+
let(:pem) { "/tmp/file.pem" }
|
15
|
+
|
16
|
+
describe "name" do
|
17
|
+
it "contains 'name'" do
|
18
|
+
args = {"name" => name, "remote_host" => remote_host, "remote_port" => remote_port}
|
19
|
+
opt = Canals::CanalOptions.new(args)
|
20
|
+
expect(opt.name).to eq name
|
21
|
+
end
|
22
|
+
|
23
|
+
it "raises error when 'name' is not availble" do
|
24
|
+
args = {"remote_host" => remote_host, "remote_port" => remote_port}
|
25
|
+
expect{Canals::CanalOptions.new(args)}.to raise_error(Canals::CanalOptionError)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "remote_host" do
|
30
|
+
it "contains 'remote_host'" do
|
31
|
+
args = {"name" => name, "remote_host" => remote_host, "remote_port" => remote_port}
|
32
|
+
opt = Canals::CanalOptions.new(args)
|
33
|
+
expect(opt.remote_host).to eq remote_host
|
34
|
+
end
|
35
|
+
|
36
|
+
it "raises error when 'remote_host' is not availble" do
|
37
|
+
args = {"name" => name, "remote_port" => remote_port}
|
38
|
+
expect{Canals::CanalOptions.new(args)}.to raise_error(Canals::CanalOptionError)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "remote_port" do
|
43
|
+
it "contains 'remote_port'" do
|
44
|
+
args = {"name" => name, "remote_host" => remote_host, "remote_port" => remote_port}
|
45
|
+
opt = Canals::CanalOptions.new(args)
|
46
|
+
expect(opt.remote_port).to eq remote_port
|
47
|
+
end
|
48
|
+
|
49
|
+
it "raises error when 'remote_port' is not availble" do
|
50
|
+
args = {"name" => name, "remote_host" => remote_host}
|
51
|
+
expect{Canals::CanalOptions.new(args)}.to raise_error(Canals::CanalOptionError)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "transforms remote_port to int if given in string" do
|
55
|
+
args = {"name" => name, "remote_host" => remote_host, "remote_port" => '1234'}
|
56
|
+
opt = Canals::CanalOptions.new(args)
|
57
|
+
expect(opt.remote_port).to eq 1234
|
58
|
+
expect(opt.local_port).to eq 1234
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "local_port" do
|
64
|
+
it "returns 'local_port' if 'local_port' is availble" do
|
65
|
+
args = {"name" => name, "remote_host" => remote_host, "remote_port" => remote_port, "local_port" => local_port}
|
66
|
+
opt = Canals::CanalOptions.new(args)
|
67
|
+
expect(opt.local_port).to eq local_port
|
68
|
+
end
|
69
|
+
|
70
|
+
it "returns 'remote_port' for 'local_port' if 'local_port' isn't given" do
|
71
|
+
args = {"name" => name, "remote_host" => remote_host, "remote_port" => remote_port}
|
72
|
+
opt = Canals::CanalOptions.new(args)
|
73
|
+
expect(opt.local_port).to eq remote_port
|
74
|
+
end
|
75
|
+
|
76
|
+
it "transforms local_port to int if given in string" do
|
77
|
+
args = {"name" => name, "remote_host" => remote_host, "remote_port" => remote_port, "local_port" => "4321"}
|
78
|
+
opt = Canals::CanalOptions.new(args)
|
79
|
+
expect(opt.local_port).to eq 4321
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "bind_address" do
|
84
|
+
it "returns 'bind_address' if 'bind_address' is availble" do
|
85
|
+
args = {"name" => name, "remote_host" => remote_host, "remote_port" => remote_port, "local_port" => local_port, "bind_address" => bind_address}
|
86
|
+
opt = Canals::CanalOptions.new(args)
|
87
|
+
expect(opt.bind_address).to eq bind_address
|
88
|
+
end
|
89
|
+
|
90
|
+
it "returns 'Canals::CanalOptions::BIND_ADDRESS' for 'bind_address' if 'bind_address' isn't given" do
|
91
|
+
args = {"name" => name, "remote_host" => remote_host, "remote_port" => remote_port, "local_port" => local_port}
|
92
|
+
opt = Canals::CanalOptions.new(args)
|
93
|
+
expect(opt.bind_address).to eq Canals::CanalOptions::BIND_ADDRESS
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "environment variables" do
|
98
|
+
context "without env" do
|
99
|
+
|
100
|
+
before(:each) do
|
101
|
+
expect(Canals.repository).to receive(:environment).and_return(nil)
|
102
|
+
end
|
103
|
+
|
104
|
+
it "returns 'hostname/user/pem' if availble" do
|
105
|
+
args = {"name" => name, "remote_host" => remote_host, "remote_port" => remote_port, "hostname" => hostname, "user" => user, "pem" => pem}
|
106
|
+
opt = Canals::CanalOptions.new(args)
|
107
|
+
expect(opt.hostname).to eq hostname
|
108
|
+
expect(opt.user).to eq user
|
109
|
+
expect(opt.pem).to eq pem
|
110
|
+
end
|
111
|
+
|
112
|
+
it "returns nil under env_name" do
|
113
|
+
args = {"name" => name, "remote_host" => remote_host, "remote_port" => remote_port}
|
114
|
+
opt = Canals::CanalOptions.new(args)
|
115
|
+
expect(opt.env_name).to be nil
|
116
|
+
end
|
117
|
+
|
118
|
+
it "constructs proxy value" do
|
119
|
+
args = {"name" => name, "remote_host" => remote_host, "remote_port" => remote_port, "hostname" => hostname, "user" => user, "pem" => pem}
|
120
|
+
opt = Canals::CanalOptions.new(args)
|
121
|
+
expect(opt.proxy).to eq "-i #{pem} #{user}@#{hostname}"
|
122
|
+
end
|
123
|
+
|
124
|
+
it "constructs proxy value, no pem" do
|
125
|
+
args = {"name" => name, "remote_host" => remote_host, "remote_port" => remote_port, "hostname" => hostname, "user" => user}
|
126
|
+
opt = Canals::CanalOptions.new(args)
|
127
|
+
expect(opt.proxy).to eq "#{user}@#{hostname}"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
context "with env" do
|
132
|
+
let(:env_name) { "env" }
|
133
|
+
|
134
|
+
before(:each) do
|
135
|
+
env = double("environment")
|
136
|
+
|
137
|
+
expect(Canals.repository).to receive(:environment).with(env_name).and_return(env)
|
138
|
+
allow(env).to receive(:hostname).and_return(hostname)
|
139
|
+
allow(env).to receive(:user).and_return(user)
|
140
|
+
allow(env).to receive(:pem).and_return(pem)
|
141
|
+
end
|
142
|
+
|
143
|
+
it "returns 'hostname/user/pem' from env" do
|
144
|
+
args = {"name" => name, "remote_host" => remote_host, "remote_port" => remote_port, "env" => env_name}
|
145
|
+
opt = Canals::CanalOptions.new(args)
|
146
|
+
expect(opt.hostname).to eq hostname
|
147
|
+
expect(opt.user).to eq user
|
148
|
+
expect(opt.pem).to eq pem
|
149
|
+
end
|
150
|
+
|
151
|
+
it "returns environment name under env_name" do
|
152
|
+
args = {"name" => name, "remote_host" => remote_host, "remote_port" => remote_port, "env" => env_name}
|
153
|
+
opt = Canals::CanalOptions.new(args)
|
154
|
+
expect(opt.env_name).to eq env_name
|
155
|
+
end
|
156
|
+
|
157
|
+
it "constructs proxy value" do
|
158
|
+
args = {"name" => name, "remote_host" => remote_host, "remote_port" => remote_port, "env" => env_name}
|
159
|
+
opt = Canals::CanalOptions.new(args)
|
160
|
+
expect(opt.proxy).to eq "-i #{pem} #{user}@#{hostname}"
|
161
|
+
end
|
162
|
+
|
163
|
+
it "returns allows overshadowing of env" do
|
164
|
+
overshadow_hostname = "*hostname*"
|
165
|
+
overshadow_user = "*user*"
|
166
|
+
overshadow_pem = "/tmp/overshadow.pem"
|
167
|
+
|
168
|
+
args = {"name" => name, "remote_host" => remote_host, "remote_port" => remote_port, "env" => env_name, "hostname" => overshadow_hostname, "user" => overshadow_user, "pem" => overshadow_pem}
|
169
|
+
opt = Canals::CanalOptions.new(args)
|
170
|
+
expect(opt.hostname).to eq overshadow_hostname
|
171
|
+
expect(opt.user).to eq overshadow_user
|
172
|
+
expect(opt.pem).to eq overshadow_pem
|
173
|
+
expect(opt.env_name).to eq env_name
|
174
|
+
end
|
175
|
+
|
176
|
+
it "constructs proxy value with overshadowing" do
|
177
|
+
overshadow_hostname = "*hostname*"
|
178
|
+
args = {"name" => name, "remote_host" => remote_host, "remote_port" => remote_port, "env" => env_name, "hostname" => overshadow_hostname}
|
179
|
+
opt = Canals::CanalOptions.new(args)
|
180
|
+
expect(opt.proxy).to eq "-i #{pem} #{user}@#{overshadow_hostname}"
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
|
186
|
+
describe "to_yaml" do
|
187
|
+
it "dumps remote_port as int" do
|
188
|
+
args = {"name" => name, "remote_host" => remote_host, "remote_port" => '1234'}
|
189
|
+
yaml = Canals::CanalOptions.new(args).to_yaml
|
190
|
+
reparsed = Psych.load(yaml)
|
191
|
+
expect(reparsed["remote_port"]).to eq 1234
|
192
|
+
expect(reparsed["local_port"]).to eq 1234
|
193
|
+
end
|
194
|
+
|
195
|
+
it "dumps local_port as int" do
|
196
|
+
args = {"name" => name, "remote_host" => remote_host, "remote_port" => remote_port, "local_port" => "4321"}
|
197
|
+
yaml = Canals::CanalOptions.new(args).to_yaml
|
198
|
+
reparsed = Psych.load(yaml)
|
199
|
+
expect(reparsed["local_port"]).to eq 4321
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: canals
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.8.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ido Abramovich
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-02-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: thor
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.19.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.19.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: terminal-table
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.5'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.5'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.4'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.4'
|
55
|
+
description: A console utility to help build ssh tunnels and keep them up
|
56
|
+
email: canals.sf17@abramovich.info
|
57
|
+
executables:
|
58
|
+
- canal
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- ".gitignore"
|
63
|
+
- ".rvmrc"
|
64
|
+
- Gemfile
|
65
|
+
- LICENSE
|
66
|
+
- README.md
|
67
|
+
- Rakefile
|
68
|
+
- assets/canals.sh
|
69
|
+
- bin/canal
|
70
|
+
- canals.gemspec
|
71
|
+
- lib/canals.rb
|
72
|
+
- lib/canals/cli.rb
|
73
|
+
- lib/canals/cli/environment.rb
|
74
|
+
- lib/canals/cli/helpers.rb
|
75
|
+
- lib/canals/cli/list.rb
|
76
|
+
- lib/canals/cli/session.rb
|
77
|
+
- lib/canals/cli/setup.rb
|
78
|
+
- lib/canals/config.rb
|
79
|
+
- lib/canals/core.rb
|
80
|
+
- lib/canals/core_ext/shell_colors.rb
|
81
|
+
- lib/canals/core_ext/string.rb
|
82
|
+
- lib/canals/environment.rb
|
83
|
+
- lib/canals/options.rb
|
84
|
+
- lib/canals/repository.rb
|
85
|
+
- lib/canals/session.rb
|
86
|
+
- lib/canals/tools/assets.rb
|
87
|
+
- lib/canals/tools/completion.rb
|
88
|
+
- lib/canals/version.rb
|
89
|
+
- spec/canals/environment_spec.rb
|
90
|
+
- spec/canals/options_spec.rb
|
91
|
+
- spec/spec_helper.rb
|
92
|
+
homepage: http://github.com/idoa01/canals
|
93
|
+
licenses:
|
94
|
+
- MIT
|
95
|
+
metadata: {}
|
96
|
+
post_install_message:
|
97
|
+
rdoc_options: []
|
98
|
+
require_paths:
|
99
|
+
- lib
|
100
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: 2.2.0
|
105
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
requirements: []
|
111
|
+
rubyforge_project: canals
|
112
|
+
rubygems_version: 2.4.6
|
113
|
+
signing_key:
|
114
|
+
specification_version: 4
|
115
|
+
summary: Eases the process of creating and managing SSH tunnels
|
116
|
+
test_files:
|
117
|
+
- spec/canals/environment_spec.rb
|
118
|
+
- spec/canals/options_spec.rb
|
119
|
+
- spec/spec_helper.rb
|