ngrok-wrapper 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +2 -2
- data/.github/workflows/codeql-analysis.yml +1 -1
- data/.rubocop.yml +7 -1
- data/.ruby-version +1 -1
- data/.tool-versions +1 -1
- data/CHANGELOG.md +35 -0
- data/README.md +9 -4
- data/lib/ngrok/wrapper/version.rb +1 -1
- data/lib/ngrok/wrapper.rb +31 -13
- data/spec/ngrok/wrapper_spec.rb +286 -269
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: af2e280f5efacf50a98453cbd8bbc26840b00fa74d31eff6346abc14fed1650f
|
4
|
+
data.tar.gz: 383a1dd7792b1dbff611f6f826ba24e9b904e41005622c8a7b68edbe45a82646
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd6252001dbc722e9e087131e3eb8abc8561dce031d323a5a649b228233e6ebb7b39ceb04e9966c27701fd779aa6e3056c223331b1353175da1ac9715e0e28e5
|
7
|
+
data.tar.gz: 79e8891907659df3e858cad810b30e209139c1e9c1de0dee5834598ab2f4fd2e89a90aad17600bad8f8f084fd9273b8e89f97879a2660ce9787783ee013203ac
|
data/.github/workflows/ci.yml
CHANGED
@@ -25,7 +25,7 @@ jobs:
|
|
25
25
|
|
26
26
|
steps:
|
27
27
|
- name: Checkout
|
28
|
-
uses: actions/checkout@
|
28
|
+
uses: actions/checkout@v3
|
29
29
|
|
30
30
|
- name: Set up Ruby
|
31
31
|
uses: ruby/setup-ruby@v1
|
@@ -40,6 +40,6 @@ jobs:
|
|
40
40
|
run: bundle exec rspec
|
41
41
|
|
42
42
|
- name: Code Climate
|
43
|
-
uses: paambaati/codeclimate-action@v3.
|
43
|
+
uses: paambaati/codeclimate-action@v3.2.0
|
44
44
|
env:
|
45
45
|
CC_TEST_REPORTER_ID: d1116c05a48e27785cb11369bde3a5e7f9d9e5a114d294bcbefa19cd193b029c
|
data/.rubocop.yml
CHANGED
@@ -65,8 +65,14 @@ Metrics/BlockLength:
|
|
65
65
|
RSpec/MultipleExpectations:
|
66
66
|
Max: 13
|
67
67
|
|
68
|
-
RSpec/
|
68
|
+
RSpec/MultipleMemoizedHelpers:
|
69
|
+
Description: Checks if example groups contain too many `let` and `subject` calls.
|
70
|
+
Enabled: true
|
71
|
+
AllowSubject: true
|
69
72
|
Max: 7
|
70
73
|
|
74
|
+
RSpec/NestedGroups:
|
75
|
+
Max: 8
|
76
|
+
|
71
77
|
Style/StringLiterals:
|
72
78
|
ConsistentQuotesInMultiline: true
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.6
|
1
|
+
2.7.6
|
data/.tool-versions
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby 2.6
|
1
|
+
ruby 2.7.6
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,40 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [v0.3.0](https://github.com/texpert/ngrok-wrapper/tree/v0.3.0) (2022-11-19)
|
4
|
+
|
5
|
+
[Full Changelog](https://github.com/texpert/ngrok-wrapper/compare/v0.2.0...v0.3.0)
|
6
|
+
|
7
|
+
Both Ngrok v2, and v3 are now supported.
|
8
|
+
|
9
|
+
Tested and working on Ubuntu Linux and macOS.
|
10
|
+
|
11
|
+
**Merged pull requests:**
|
12
|
+
|
13
|
+
- Added compatibility with Ngrok v3.x \(specs also enhanced to test both 2 and 3 versions\) [\#24](https://github.com/texpert/ngrok-wrapper/pull/24) ([texpert](https://github.com/texpert))
|
14
|
+
- Prepare for different ngrok versions params, still for version 2 [\#23](https://github.com/texpert/ngrok-wrapper/pull/23) ([texpert](https://github.com/texpert))
|
15
|
+
- Allow region subdomains - modify Rails config.hosts example to parse the host from NGROK\_URL [\#22](https://github.com/texpert/ngrok-wrapper/pull/22) ([texpert](https://github.com/texpert))
|
16
|
+
- Set main Ruby version to 2.7.6 [\#21](https://github.com/texpert/ngrok-wrapper/pull/21) ([texpert](https://github.com/texpert))
|
17
|
+
- Bump actions/checkout from 2 to 3 [\#19](https://github.com/texpert/ngrok-wrapper/pull/19) ([texpert](https://github.com/texpert))
|
18
|
+
|
19
|
+
## [v0.2.0](https://github.com/texpert/ngrok-wrapper/tree/v0.2.0) (2022-02-19)
|
20
|
+
|
21
|
+
[Full Changelog](https://github.com/texpert/ngrok-wrapper/compare/v0.1.0...v0.2.0)
|
22
|
+
|
23
|
+
### Making Ngrok process survive server stop on Linux
|
24
|
+
|
25
|
+
It was working OK on Mac OS on the 0.1.0 release, but not on Linux.
|
26
|
+
|
27
|
+
It came out that `Process.setsid` should be applied to the spawned process to establish this process as a new session
|
28
|
+
and process group leader. This is completely detaching it from the parent process, so it won't be killed when the
|
29
|
+
parent will go down.
|
30
|
+
|
31
|
+
|
32
|
+
**Merged pull requests:**
|
33
|
+
|
34
|
+
- Add config.hosts example for Rails \>= 6.0.0 [\#18](https://github.com/texpert/ngrok-wrapper/pull/18) ([texpert](https://github.com/texpert))
|
35
|
+
- Ngrok.start should try to return first @ngrok\_url\_https or then @ngrok\_url [\#17](https://github.com/texpert/ngrok-wrapper/pull/17) ([texpert](https://github.com/texpert))
|
36
|
+
- Use fork, Process.setsid and spawn instead of just spawn, to change the owner of ngrok process [\#16](https://github.com/texpert/ngrok-wrapper/pull/16) ([texpert](https://github.com/texpert))
|
37
|
+
|
3
38
|
## [v0.1.0](https://github.com/texpert/ngrok-wrapper/tree/v0.1.0) (2022-01-09)
|
4
39
|
|
5
40
|
[Full Changelog](https://github.com/texpert/ngrok-wrapper/compare/3e032fa019c91ee7338a7ad3a3335e6c5597b394...v0.1.0)
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Ngrok::Wrapper
|
2
2
|
|
3
|
-
Ngrok-wrapper gem is a ruby wrapper for ngrok v2.
|
3
|
+
Ngrok-wrapper gem is a ruby wrapper for ngrok v2.x or v3.x.
|
4
4
|
|
5
5
|
[](https://codeclimate.com/github/texpert/ngrok-wrapper/maintainability)
|
6
6
|
[](https://codeclimate.com/github/texpert/ngrok-wrapper/test_coverage)
|
@@ -22,7 +22,9 @@ So, excuse me, [Anton Bogdanovich](https://github.com/bogdanovich), but I've dec
|
|
22
22
|
|
23
23
|
## Installation
|
24
24
|
|
25
|
-
|
25
|
+
**Pre-requisites:** You must have `ngrok` v2+ or v3+ installed available in your `PATH`.
|
26
|
+
|
27
|
+
**Upgrade Note:** Do not forget to run `ngrok config upgrade` after upgrading `ngrok` from v2.x to v3.x
|
26
28
|
|
27
29
|
Add this line to your application's Gemfile:
|
28
30
|
|
@@ -32,7 +34,7 @@ gem 'ngrok-wrapper'
|
|
32
34
|
|
33
35
|
And then execute:
|
34
36
|
|
35
|
-
$ bundle
|
37
|
+
$ bundle install
|
36
38
|
|
37
39
|
Or install it yourself as:
|
38
40
|
|
@@ -139,7 +141,10 @@ end
|
|
139
141
|
- And in `config/environments/development.rb`:
|
140
142
|
|
141
143
|
```ruby
|
142
|
-
|
144
|
+
if NGROK_ENABLED
|
145
|
+
config.force_ssl = true
|
146
|
+
config.hosts << URI.parse(NGROK_URL).host # for Rails >= 6.0.0
|
147
|
+
end
|
143
148
|
|
144
149
|
config.action_mailer.default_url_options = {
|
145
150
|
host: NGROK_ENABLED ? NGROK_URL.delete_prefix('https://') : 'myapp.local',
|
data/lib/ngrok/wrapper.rb
CHANGED
@@ -4,7 +4,16 @@ require_relative 'wrapper/version'
|
|
4
4
|
require 'tempfile'
|
5
5
|
|
6
6
|
module Ngrok
|
7
|
-
|
7
|
+
VERSION_PARAMS = {
|
8
|
+
'2' => {
|
9
|
+
flag_prefix: '-',
|
10
|
+
http_tunnel_flags: %i[config authtoken bind_tls host_header hostname inspect region subdomain].freeze
|
11
|
+
},
|
12
|
+
'3' => {
|
13
|
+
flag_prefix: '--',
|
14
|
+
http_tunnel_flags: %i[config authtoken scheme host_header hostname inspect region subdomain].freeze
|
15
|
+
}
|
16
|
+
}.freeze
|
8
17
|
|
9
18
|
class NotFound < StandardError; end
|
10
19
|
class FetchUrlError < StandardError; end
|
@@ -24,6 +33,9 @@ module Ngrok
|
|
24
33
|
|
25
34
|
def start(params = {})
|
26
35
|
ensure_binary
|
36
|
+
@current_version_params = VERSION_PARAMS[@major_version]
|
37
|
+
@flag_prefix = @current_version_params[:flag_prefix]
|
38
|
+
|
27
39
|
init(params)
|
28
40
|
|
29
41
|
persistent_ngrok = @params[:persistence] == true
|
@@ -38,7 +50,7 @@ module Ngrok
|
|
38
50
|
File.write(@persistence_file, { pid: @pid, ngrok_url: @ngrok_url, ngrok_url_https: @ngrok_url_https }.to_json)
|
39
51
|
end
|
40
52
|
|
41
|
-
@ngrok_url
|
53
|
+
@ngrok_url_https || @ngrok_url
|
42
54
|
end
|
43
55
|
|
44
56
|
def stop
|
@@ -84,7 +96,7 @@ module Ngrok
|
|
84
96
|
def raise_if_similar_ngroks(pid)
|
85
97
|
other_ngrok_on_port = ngrok_process_status_lines.find do |line|
|
86
98
|
# If found an Ngrok process with other pid, tunneling on the port, specified in Ngrok::Wrapper.start params
|
87
|
-
line.include?(
|
99
|
+
line.include?("ngrok http #{@flag_prefix}log") && !line.start_with?(pid || '') && line.end_with?(addr.to_s)
|
88
100
|
end
|
89
101
|
|
90
102
|
raise Ngrok::Error, "ERROR: Other ngrok instances tunneling to port #{addr} found" if other_ngrok_on_port
|
@@ -93,7 +105,7 @@ module Ngrok
|
|
93
105
|
|
94
106
|
tunnel_on_other_port = ngrok_process_status_lines.find do |line|
|
95
107
|
# If the line starts with this pid, but the port is other than specified in Ngrok::Wrapper.start params
|
96
|
-
line.include?(
|
108
|
+
line.include?("ngrok http #{@flag_prefix}log") && line.start_with?(pid) && !line.end_with?(addr.to_s)
|
97
109
|
end
|
98
110
|
|
99
111
|
return unless tunnel_on_other_port
|
@@ -104,7 +116,7 @@ module Ngrok
|
|
104
116
|
def ngrok_process_status_lines(refetch: false)
|
105
117
|
return @ngrok_process_status_lines if defined?(@ngrok_process_status_lines) && !refetch
|
106
118
|
|
107
|
-
@ngrok_process_status_lines = (`ps ax | grep "ngrok http"`).split("\n")
|
119
|
+
@ngrok_process_status_lines = (`ps ax | grep "ngrok http"`).split("\n").map(&:strip)
|
108
120
|
end
|
109
121
|
|
110
122
|
def try_params_from_running_ngrok
|
@@ -125,7 +137,7 @@ module Ngrok
|
|
125
137
|
def ngrok_running?(pid)
|
126
138
|
ngrok_process_status_lines.find do |line|
|
127
139
|
# If found the Ngrok process with correct pid, tunneling on the port, specified in Ngrok::Wrapper.start params
|
128
|
-
line.include?(
|
140
|
+
line.include?("ngrok http #{@flag_prefix}log") && line.start_with?(pid) && line.end_with?(addr.to_s)
|
129
141
|
end
|
130
142
|
end
|
131
143
|
|
@@ -134,9 +146,15 @@ module Ngrok
|
|
134
146
|
# Prepare the log file into which ngrok output will be redirected in `ngrok_exec_params`
|
135
147
|
@params[:log] = @params[:log] ? File.open(@params[:log], 'w+') : Tempfile.new('ngrok')
|
136
148
|
if persistent_ngrok
|
137
|
-
|
149
|
+
fork do
|
150
|
+
Process.setsid
|
151
|
+
system("exec nohup ngrok http #{ngrok_exec_params} &")
|
152
|
+
end
|
153
|
+
|
154
|
+
sleep 0.5
|
155
|
+
|
138
156
|
@pid = ngrok_process_status_lines(refetch: true)
|
139
|
-
.find { |line| line.include?(
|
157
|
+
.find { |line| line.include?("ngrok http #{@flag_prefix}log") && line.end_with?(addr.to_s) }.split[0]
|
140
158
|
else
|
141
159
|
@pid = Process.spawn("exec ngrok http #{ngrok_exec_params}")
|
142
160
|
at_exit { Ngrok::Wrapper.stop }
|
@@ -146,11 +164,11 @@ module Ngrok
|
|
146
164
|
end
|
147
165
|
|
148
166
|
def ngrok_exec_params
|
149
|
-
exec_params = +
|
150
|
-
|
151
|
-
exec_params << "
|
167
|
+
exec_params = +"#{@flag_prefix}log=stdout #{@flag_prefix}log-level=debug "
|
168
|
+
@current_version_params[:http_tunnel_flags].each do |flag|
|
169
|
+
exec_params << "#{@flag_prefix}#{flag.to_s.tr('_', '-')}=#{@params[flag]} " if @params.key?(flag)
|
152
170
|
end
|
153
|
-
exec_params << "
|
171
|
+
exec_params << " #{@params[:addr]} > #{@params[:log].path}"
|
154
172
|
end
|
155
173
|
|
156
174
|
def fetch_urls
|
@@ -185,7 +203,7 @@ module Ngrok
|
|
185
203
|
end
|
186
204
|
|
187
205
|
def ensure_binary
|
188
|
-
`ngrok version
|
206
|
+
@major_version, * = `ngrok version`.chomp.delete_prefix('ngrok version ').split('.')
|
189
207
|
rescue Errno::ENOENT
|
190
208
|
raise Ngrok::NotFound, 'Ngrok binary not found'
|
191
209
|
end
|
data/spec/ngrok/wrapper_spec.rb
CHANGED
@@ -4,352 +4,369 @@ RSpec.describe 'Ngrok::Wrapper' do
|
|
4
4
|
let(:log) { File.read("#{RSPEC_ROOT}/fixtures/ngrok.sample.log") }
|
5
5
|
let(:fake_pid) { rand(99_999) }
|
6
6
|
|
7
|
-
|
8
|
-
allow(Ngrok::Wrapper).to receive(:ensure_binary)
|
9
|
-
allow(Ngrok::Wrapper).to receive(:raise_if_similar_ngroks)
|
10
|
-
allow(Process).to receive(:spawn).and_return(fake_pid)
|
11
|
-
allow(Process).to receive(:kill)
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'has a version number' do
|
15
|
-
expect(Ngrok::Wrapper::VERSION).not_to be nil
|
16
|
-
end
|
17
|
-
|
18
|
-
describe 'Before start' do
|
19
|
-
before { allow_any_instance_of(Tempfile).to receive(:read).and_return(log) }
|
7
|
+
ngrok_versions = %w[2 3]
|
20
8
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
it 'is stopped' do
|
26
|
-
expect(Ngrok::Wrapper.stopped?).to be true
|
27
|
-
end
|
9
|
+
ngrok_versions.each do |ngrok_version|
|
10
|
+
describe "Ngrok v#{ngrok_version}" do
|
11
|
+
let(:flag_prefix) { Ngrok::VERSION_PARAMS[ngrok_version][:flag_prefix] }
|
12
|
+
let(:config_path) { "#{flag_prefix}config /Users/thunder/.ngrok2/ngrok.yml" }
|
28
13
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
14
|
+
before do
|
15
|
+
Ngrok::Wrapper.instance_variable_set(:@major_version, ngrok_version)
|
16
|
+
allow(Ngrok::Wrapper).to receive(:ensure_binary)
|
17
|
+
allow(Ngrok::Wrapper).to receive(:ngrok_process_status_lines)
|
18
|
+
allow(Ngrok::Wrapper).to receive(:raise_if_similar_ngroks)
|
19
|
+
allow(Process).to receive(:spawn).and_return(fake_pid)
|
20
|
+
allow(Process).to receive(:kill)
|
21
|
+
end
|
33
22
|
|
34
|
-
|
35
|
-
|
36
|
-
|
23
|
+
it 'has a version number' do
|
24
|
+
expect(Ngrok::Wrapper::VERSION).not_to be nil
|
25
|
+
end
|
37
26
|
|
38
|
-
|
39
|
-
|
27
|
+
describe 'Before start' do
|
28
|
+
before { allow_any_instance_of(Tempfile).to receive(:read).and_return(log) }
|
40
29
|
|
41
|
-
|
30
|
+
it 'is not running' do
|
31
|
+
expect(Ngrok::Wrapper.running?).to be false
|
32
|
+
end
|
42
33
|
|
43
|
-
|
44
|
-
|
45
|
-
|
34
|
+
it 'is stopped' do
|
35
|
+
expect(Ngrok::Wrapper.stopped?).to be true
|
36
|
+
end
|
46
37
|
|
47
|
-
|
48
|
-
|
49
|
-
|
38
|
+
it 'has :stopped status' do
|
39
|
+
expect(Ngrok::Wrapper.status).to eq :stopped
|
40
|
+
end
|
41
|
+
end
|
50
42
|
|
51
|
-
|
52
|
-
|
53
|
-
|
43
|
+
describe 'After start' do
|
44
|
+
before do
|
45
|
+
allow_any_instance_of(Tempfile).to receive(:read).and_return(log)
|
54
46
|
|
55
|
-
|
56
|
-
|
57
|
-
end
|
47
|
+
Ngrok::Wrapper.start
|
48
|
+
end
|
58
49
|
|
59
|
-
|
60
|
-
expect(Ngrok::Wrapper.addr).to eq(3001)
|
61
|
-
end
|
50
|
+
after { Ngrok::Wrapper.stop }
|
62
51
|
|
63
|
-
|
64
|
-
|
65
|
-
|
52
|
+
it 'is running' do
|
53
|
+
expect(Ngrok::Wrapper.running?).to be true
|
54
|
+
end
|
66
55
|
|
67
|
-
|
68
|
-
|
69
|
-
|
56
|
+
it 'is not stopped' do
|
57
|
+
expect(Ngrok::Wrapper.stopped?).to be false
|
58
|
+
end
|
70
59
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
end
|
60
|
+
it 'has :running status' do
|
61
|
+
expect(Ngrok::Wrapper.status).to eq :running
|
62
|
+
end
|
75
63
|
|
76
|
-
|
77
|
-
|
64
|
+
it 'has correct port property' do
|
65
|
+
expect(Ngrok::Wrapper.port).to eq(3001)
|
66
|
+
end
|
78
67
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
expect(Ngrok::Wrapper.params[:log].path).to eq 'test.log'
|
83
|
-
Ngrok::Wrapper.stop
|
84
|
-
expect(Ngrok::Wrapper.stopped?).to eq true
|
85
|
-
end
|
86
|
-
end
|
68
|
+
it 'has correct addr property' do
|
69
|
+
expect(Ngrok::Wrapper.addr).to eq(3001)
|
70
|
+
end
|
87
71
|
|
88
|
-
|
89
|
-
|
90
|
-
|
72
|
+
it 'has valid ngrok_url' do
|
73
|
+
expect(Ngrok::Wrapper.ngrok_url).to be =~ %r{http://.*ngrok\.io$}
|
74
|
+
end
|
91
75
|
|
92
|
-
|
93
|
-
|
76
|
+
it 'has valid ngrok_url_https' do
|
77
|
+
expect(Ngrok::Wrapper.ngrok_url_https).to be =~ %r{https://.*ngrok\.io$}
|
78
|
+
end
|
94
79
|
|
95
|
-
|
80
|
+
it 'has correct pid property' do
|
81
|
+
expect(Ngrok::Wrapper.pid).to be > 0
|
82
|
+
end
|
96
83
|
end
|
97
|
-
end
|
98
84
|
|
99
|
-
|
100
|
-
|
85
|
+
describe 'Custom log file' do
|
86
|
+
before { allow_any_instance_of(File).to receive(:read).and_return(log) }
|
101
87
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
Ngrok::Wrapper.
|
107
|
-
|
88
|
+
it 'uses custom log file' do
|
89
|
+
Ngrok::Wrapper.start(log: 'test.log')
|
90
|
+
expect(Ngrok::Wrapper.running?).to eq true
|
91
|
+
expect(Ngrok::Wrapper.params[:log].path).to eq 'test.log'
|
92
|
+
Ngrok::Wrapper.stop
|
93
|
+
expect(Ngrok::Wrapper.stopped?).to eq true
|
94
|
+
end
|
108
95
|
end
|
109
|
-
end
|
110
|
-
end
|
111
96
|
|
112
|
-
|
113
|
-
|
97
|
+
describe 'Invalid or missing authtoken' do
|
98
|
+
describe 'when no authtoken is specified in ngrok config file' do
|
99
|
+
let(:no_auth_log) { File.read("#{RSPEC_ROOT}/fixtures/ngrok.no_auth_token.log") }
|
114
100
|
|
115
|
-
|
116
|
-
|
117
|
-
Ngrok::Wrapper.start(port: port)
|
118
|
-
expect(Ngrok::Wrapper.addr).to eq port
|
119
|
-
Ngrok::Wrapper.stop
|
120
|
-
end
|
101
|
+
it 'raises Ngrok::Error exception' do
|
102
|
+
allow_any_instance_of(Tempfile).to receive(:read).and_return(no_auth_log)
|
121
103
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
expect(Ngrok::Wrapper.port).to eq 10_010
|
126
|
-
Ngrok::Wrapper.stop
|
127
|
-
end
|
104
|
+
expect { Ngrok::Wrapper.start }.to raise_error Ngrok::Error
|
105
|
+
end
|
106
|
+
end
|
128
107
|
|
129
|
-
|
130
|
-
|
131
|
-
Ngrok::Wrapper.start(addr: addr)
|
132
|
-
expect(Ngrok::Wrapper.addr).to eq addr
|
133
|
-
Ngrok::Wrapper.stop
|
134
|
-
end
|
135
|
-
end
|
108
|
+
describe 'when an invalid authtoken is specified in ngrok config file' do
|
109
|
+
let(:invalid_auth_log) { File.read("#{RSPEC_ROOT}/fixtures/ngrok.no_auth_token.log") }
|
136
110
|
|
137
|
-
|
138
|
-
|
111
|
+
it 'fails with incorrect authtoken' do
|
112
|
+
allow_any_instance_of(Tempfile).to receive(:read).and_return(invalid_auth_log)
|
139
113
|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
114
|
+
expect do
|
115
|
+
Ngrok::Wrapper.start(authtoken: 'incorrect_token')
|
116
|
+
end.to raise_error Ngrok::Error
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
145
120
|
|
146
|
-
|
147
|
-
|
148
|
-
Ngrok::Wrapper.start(region: region)
|
149
|
-
expect(Ngrok::Wrapper.__send__(:ngrok_exec_params)).to include("-region=#{region}")
|
150
|
-
Ngrok::Wrapper.stop
|
151
|
-
end
|
152
|
-
end
|
121
|
+
describe 'Custom addr' do
|
122
|
+
before { allow_any_instance_of(Tempfile).to receive(:read).and_return(log) }
|
153
123
|
|
154
|
-
|
155
|
-
before { allow_any_instance_of(Tempfile).to receive(:read).and_return(log) }
|
124
|
+
after { Ngrok::Wrapper.stop }
|
156
125
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
126
|
+
it 'maps port param to addr' do
|
127
|
+
port = 10_010
|
128
|
+
Ngrok::Wrapper.start(port: port)
|
129
|
+
expect(Ngrok::Wrapper.addr).to eq port
|
130
|
+
end
|
162
131
|
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
end
|
132
|
+
it 'returns just the port when the address contains a host' do
|
133
|
+
addr = '192.168.0.5:10010'
|
134
|
+
Ngrok::Wrapper.start(addr: addr)
|
135
|
+
expect(Ngrok::Wrapper.port).to eq 10_010
|
136
|
+
end
|
169
137
|
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
end
|
138
|
+
it 'supports remote addresses' do
|
139
|
+
addr = '192.168.0.5:10010'
|
140
|
+
Ngrok::Wrapper.start(addr: addr)
|
141
|
+
expect(Ngrok::Wrapper.addr).to eq addr
|
142
|
+
end
|
143
|
+
end
|
177
144
|
|
178
|
-
|
179
|
-
|
145
|
+
describe 'Custom region' do
|
146
|
+
before { allow_any_instance_of(Tempfile).to receive(:read).and_return(log) }
|
180
147
|
|
181
|
-
|
182
|
-
expect(Ngrok::Wrapper).to receive(:fetch_urls)
|
183
|
-
Ngrok::Wrapper.start
|
184
|
-
expect(Ngrok::Wrapper.__send__(:ngrok_exec_params)).not_to include('-host-header=')
|
185
|
-
end
|
148
|
+
after { Ngrok::Wrapper.stop }
|
186
149
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
expect(Ngrok::Wrapper.__send__(:ngrok_exec_params)).to include("-host-header=#{host_header}")
|
192
|
-
end
|
193
|
-
end
|
150
|
+
it "doesn't include the -region parameter when it is not provided" do
|
151
|
+
Ngrok::Wrapper.start
|
152
|
+
expect(Ngrok::Wrapper.__send__(:ngrok_exec_params)).not_to include('-region=')
|
153
|
+
end
|
194
154
|
|
195
|
-
|
196
|
-
|
155
|
+
it 'includes the -region parameter with the correct value when it is provided' do
|
156
|
+
region = 'eu'
|
157
|
+
Ngrok::Wrapper.start(region: region)
|
158
|
+
expect(Ngrok::Wrapper.__send__(:ngrok_exec_params)).to include("-region=#{region}")
|
159
|
+
end
|
160
|
+
end
|
197
161
|
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
Ngrok::Wrapper.stop
|
202
|
-
end
|
162
|
+
describe 'Custom bind-tls' do
|
163
|
+
# It is 'bind_tls' for Ngrok v2, and 'scheme' for Ngrok v3
|
164
|
+
let(:bind_tls_flag) { Ngrok::VERSION_PARAMS[ngrok_version][:http_tunnel_flags][2] }
|
203
165
|
|
204
|
-
|
205
|
-
Ngrok::Wrapper.start(inspect: true)
|
206
|
-
expect(Ngrok::Wrapper.__send__(:ngrok_exec_params)).to include('-inspect=true')
|
207
|
-
Ngrok::Wrapper.stop
|
166
|
+
before { allow_any_instance_of(Tempfile).to receive(:read).and_return(log) }
|
208
167
|
|
209
|
-
|
210
|
-
expect(Ngrok::Wrapper.__send__(:ngrok_exec_params)).to include('-inspect=false')
|
211
|
-
Ngrok::Wrapper.stop
|
212
|
-
end
|
213
|
-
end
|
168
|
+
after { Ngrok::Wrapper.stop }
|
214
169
|
|
215
|
-
|
216
|
-
|
170
|
+
it "doesn't include the -bind-tls parameter when it is not provided" do
|
171
|
+
Ngrok::Wrapper.start
|
172
|
+
expect(Ngrok::Wrapper.__send__(:ngrok_exec_params))
|
173
|
+
.not_to include("#{flag_prefix}#{bind_tls_flag.to_s.tr('_', '-')}=")
|
174
|
+
end
|
217
175
|
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
end
|
176
|
+
it 'includes the -bind-tls parameter with the correct value when it is true' do
|
177
|
+
Ngrok::Wrapper.start(bind_tls_flag => true)
|
178
|
+
expect(Ngrok::Wrapper.__send__(:ngrok_exec_params))
|
179
|
+
.to include("#{flag_prefix}#{bind_tls_flag.to_s.tr('_', '-')}=true")
|
180
|
+
end
|
224
181
|
|
225
|
-
|
226
|
-
|
227
|
-
|
182
|
+
it 'includes the -bind-tls parameter with the correct value when it is false' do
|
183
|
+
Ngrok::Wrapper.start(bind_tls_flag => false)
|
184
|
+
expect(Ngrok::Wrapper.__send__(:ngrok_exec_params))
|
185
|
+
.to include("#{flag_prefix}#{bind_tls_flag.to_s.tr('_', '-')}=false")
|
186
|
+
end
|
187
|
+
end
|
228
188
|
|
229
|
-
|
230
|
-
|
231
|
-
expect(Ngrok::Wrapper).not_to receive(:raise_if_similar_ngroks)
|
232
|
-
expect(Ngrok::Wrapper).not_to receive(:ngrok_running?)
|
233
|
-
expect(Ngrok::Wrapper).to receive(:spawn_new_ngrok).with(persistent_ngrok: true)
|
234
|
-
expect(File).to receive(:write)
|
189
|
+
describe 'Custom host header' do
|
190
|
+
after { Ngrok::Wrapper.stop }
|
235
191
|
|
236
|
-
|
237
|
-
|
192
|
+
it "doesn't include the -host-header parameter when it is not provided" do
|
193
|
+
expect(Ngrok::Wrapper).to receive(:fetch_urls)
|
194
|
+
Ngrok::Wrapper.start
|
195
|
+
expect(Ngrok::Wrapper.__send__(:ngrok_exec_params)).not_to include('-host-header=')
|
238
196
|
end
|
239
197
|
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
198
|
+
it 'includes the -host-header parameter with the correct value when it is provided' do
|
199
|
+
expect(Ngrok::Wrapper).to receive(:fetch_urls)
|
200
|
+
host_header = 'foo.bar'
|
201
|
+
Ngrok::Wrapper.start(host_header: host_header)
|
202
|
+
expect(Ngrok::Wrapper.__send__(:ngrok_exec_params)).to include("-host-header=#{host_header}")
|
203
|
+
end
|
204
|
+
end
|
246
205
|
|
247
|
-
|
248
|
-
|
249
|
-
allow(Ngrok::Wrapper).to receive(:raise_if_similar_ngroks).and_call_original
|
250
|
-
allow(Ngrok::Wrapper).to receive(:ngrok_process_status_lines).and_return(ngrok_ps_lines)
|
206
|
+
describe 'Custom parameters provided' do
|
207
|
+
before { allow_any_instance_of(Tempfile).to receive(:read).and_return(log) }
|
251
208
|
|
252
|
-
|
253
|
-
|
209
|
+
it "doesn't include the -inspect parameter when it is not provided" do
|
210
|
+
Ngrok::Wrapper.start
|
211
|
+
expect(Ngrok::Wrapper.__send__(:ngrok_exec_params)).not_to include('-inspect=')
|
212
|
+
Ngrok::Wrapper.stop
|
213
|
+
end
|
254
214
|
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
215
|
+
it 'includes the -inspect parameter with the correct value when it is provided' do
|
216
|
+
Ngrok::Wrapper.start(inspect: true)
|
217
|
+
expect(Ngrok::Wrapper.__send__(:ngrok_exec_params)).to include('-inspect=true')
|
218
|
+
Ngrok::Wrapper.stop
|
259
219
|
|
260
|
-
|
261
|
-
|
220
|
+
Ngrok::Wrapper.start(inspect: false)
|
221
|
+
expect(Ngrok::Wrapper.__send__(:ngrok_exec_params)).to include('-inspect=false')
|
222
|
+
Ngrok::Wrapper.stop
|
223
|
+
end
|
224
|
+
end
|
262
225
|
|
263
|
-
|
226
|
+
describe '#start' do
|
227
|
+
after { Ngrok::Wrapper.stop }
|
264
228
|
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
229
|
+
describe 'when persistence param is true' do
|
230
|
+
before do
|
231
|
+
allow(File).to receive(:write)
|
232
|
+
allow(Ngrok::Wrapper).to receive(:try_params_from_running_ngrok).and_call_original
|
233
|
+
allow(Ngrok::Wrapper).to receive(:parse_persistence_file).and_return(state)
|
234
|
+
end
|
271
235
|
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
end
|
236
|
+
describe 'tries fetching params of an already running Ngrok and store Ngrok process data into a file' do
|
237
|
+
describe 'when fetching params returns nil' do
|
238
|
+
let(:state) { nil }
|
276
239
|
|
277
|
-
it '
|
278
|
-
expect(Ngrok::Wrapper).
|
240
|
+
it "doesn't check for similar ngroks running" do
|
241
|
+
expect(Ngrok::Wrapper).to receive(:try_params_from_running_ngrok)
|
242
|
+
expect(Ngrok::Wrapper).not_to receive(:raise_if_similar_ngroks)
|
243
|
+
expect(Ngrok::Wrapper).not_to receive(:ngrok_running?)
|
244
|
+
expect(Ngrok::Wrapper).to receive(:spawn_new_ngrok).with(persistent_ngrok: true)
|
245
|
+
expect(File).to receive(:write)
|
279
246
|
|
280
|
-
|
281
|
-
.to raise_error(Ngrok::Error, 'ERROR: Other ngrok instances tunneling to port 3001 found')
|
247
|
+
Ngrok::Wrapper.start(persistence: true)
|
282
248
|
end
|
283
249
|
end
|
284
250
|
|
285
|
-
describe 'when
|
251
|
+
describe 'when fetching params returns a legit hash' do
|
286
252
|
let(:ngrok_ps_lines) do
|
287
|
-
[
|
253
|
+
["795 ?? S 0:04.81 ngrok http #{flag_prefix}log -config #{config_path} https://localhost:3001"]
|
288
254
|
end
|
289
255
|
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
.to raise_error(Ngrok::Error, 'ERROR: Ngrok pid #795 tunneling on other port 3000')
|
295
|
-
end
|
296
|
-
end
|
297
|
-
|
298
|
-
describe 'when no Ngrok process with params from the persisted file or similar is running' do
|
299
|
-
let(:ngrok_ps_lines) do
|
300
|
-
['834 ?? S 0:04.81 ngrok http -log -config /Users/thunder/.ngrok2/ngrok.yml https://localhost:5001']
|
256
|
+
let(:state) do
|
257
|
+
{ 'pid' => '795',
|
258
|
+
'ngrok_url' => 'http://b1cd-109-185-141-9.ngrok.io',
|
259
|
+
'ngrok_url_https' => 'https://b1cd-109-185-141-9.ngrok.io' }
|
301
260
|
end
|
302
261
|
|
303
|
-
|
304
|
-
|
262
|
+
before { allow(Ngrok::Wrapper).to receive(:ngrok_process_status_lines).and_return(ngrok_ps_lines) }
|
263
|
+
|
264
|
+
describe 'checking if a similar Ngrok is running' do
|
265
|
+
before do
|
266
|
+
allow(Ngrok::Wrapper).to receive(:raise_if_similar_ngroks).and_call_original
|
267
|
+
|
268
|
+
expect(Ngrok::Wrapper).to receive(:try_params_from_running_ngrok)
|
269
|
+
end
|
270
|
+
|
271
|
+
describe 'when Ngrok process with params from the persisted file is running' do
|
272
|
+
it 'set Ngrok::Wrapper pid and status attributes' do
|
273
|
+
expect(Ngrok::Wrapper).not_to receive(:spawn_new_ngrok)
|
274
|
+
|
275
|
+
result = Ngrok::Wrapper.start(persistence: true)
|
276
|
+
|
277
|
+
expect(Ngrok::Wrapper.pid).to eql('795')
|
278
|
+
expect(Ngrok::Wrapper.status).to eql(:running)
|
279
|
+
expect(Ngrok::Wrapper.ngrok_url).to eql('http://b1cd-109-185-141-9.ngrok.io')
|
280
|
+
expect(Ngrok::Wrapper.ngrok_url_https).to eql('https://b1cd-109-185-141-9.ngrok.io')
|
281
|
+
expect(result).to eql('https://b1cd-109-185-141-9.ngrok.io')
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
describe 'when a similar Ngrok with other pid is already running' do
|
286
|
+
let(:ngrok_ps_lines) do
|
287
|
+
["71986 ?? S 0:04.81 ngrok http #{flag_prefix}log -config #{config_path} https://localhost:3001"]
|
288
|
+
end
|
289
|
+
|
290
|
+
it 'raises exception' do
|
291
|
+
expect(Ngrok::Wrapper).not_to receive(:spawn_new_ngrok)
|
292
|
+
|
293
|
+
expect { Ngrok::Wrapper.start(persistence: true) }
|
294
|
+
.to raise_error(Ngrok::Error, 'ERROR: Other ngrok instances tunneling to port 3001 found')
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
describe 'when Ngrok with the persisted pid is already running, but on a different port' do
|
299
|
+
let(:ngrok_ps_lines) do
|
300
|
+
["795 ?? S 0:04.81 ngrok http #{flag_prefix}log -config #{config_path} https://localhost:3000"]
|
301
|
+
end
|
302
|
+
|
303
|
+
it 'raises exception' do
|
304
|
+
expect(Ngrok::Wrapper).not_to receive(:spawn_new_ngrok)
|
305
|
+
|
306
|
+
expect { Ngrok::Wrapper.start(persistence: true) }
|
307
|
+
.to raise_error(Ngrok::Error, 'ERROR: Ngrok pid #795 tunneling on other port 3000')
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
describe 'when no Ngrok process with params from the persisted file or similar is running' do
|
312
|
+
let(:ngrok_ps_lines) do
|
313
|
+
["834 ?? S 0:04.81 ngrok http #{flag_prefix}log -config #{config_path} https://localhost:5001"]
|
314
|
+
end
|
315
|
+
|
316
|
+
let(:new_ngrok_ps_lines) do
|
317
|
+
["835 ?? S 0:04.81 ngrok http #{flag_prefix}log -config #{config_path} https://localhost:3001"]
|
318
|
+
end
|
319
|
+
|
320
|
+
it 'sets Ngrok::Wrapper pid and status attributes' do
|
321
|
+
allow(Ngrok::Wrapper).to receive(:spawn_new_ngrok).with(persistent_ngrok: true).and_call_original
|
322
|
+
allow(Ngrok::Wrapper).to receive(:fork)
|
323
|
+
allow(Ngrok::Wrapper)
|
324
|
+
.to receive(:ngrok_process_status_lines).with(refetch: true).and_return(new_ngrok_ps_lines)
|
325
|
+
allow(Ngrok::Wrapper).to receive(:fetch_urls)
|
326
|
+
|
327
|
+
expect(Ngrok::Wrapper).to receive(:spawn_new_ngrok).with(persistent_ngrok: true)
|
328
|
+
expect(Ngrok::Wrapper).to receive(:fork)
|
329
|
+
expect(Ngrok::Wrapper).to receive(:ngrok_process_status_lines).with(refetch: true)
|
330
|
+
allow(Ngrok::Wrapper).to receive(:fetch_urls)
|
331
|
+
|
332
|
+
Ngrok::Wrapper.start(persistence: true)
|
333
|
+
|
334
|
+
expect(Ngrok::Wrapper.pid).to eql('835')
|
335
|
+
expect(Ngrok::Wrapper.status).to eql(:running)
|
336
|
+
end
|
337
|
+
end
|
305
338
|
end
|
306
339
|
|
307
|
-
it '
|
308
|
-
|
309
|
-
|
310
|
-
.to receive(:ngrok_process_status_lines).with(refetch: true).and_return(new_ngrok_ps_lines)
|
311
|
-
allow(Ngrok::Wrapper).to receive(:fetch_urls)
|
312
|
-
|
313
|
-
expect(Ngrok::Wrapper).to receive(:spawn_new_ngrok).with(persistent_ngrok: true)
|
314
|
-
expect(Ngrok::Wrapper)
|
315
|
-
.to receive(:ngrok_process_status_lines).with(refetch: true)
|
316
|
-
allow(Ngrok::Wrapper).to receive(:fetch_urls)
|
340
|
+
it 'tries fetching params of an already running Ngrok and store Ngrok process data into a file' do
|
341
|
+
expect(Ngrok::Wrapper).to receive(:try_params_from_running_ngrok)
|
342
|
+
expect(File).to receive(:write)
|
317
343
|
|
318
344
|
Ngrok::Wrapper.start(persistence: true)
|
319
|
-
|
320
|
-
expect(Ngrok::Wrapper.pid).to eql('835')
|
321
|
-
expect(Ngrok::Wrapper.status).to eql(:running)
|
322
345
|
end
|
323
346
|
end
|
324
347
|
end
|
348
|
+
end
|
349
|
+
|
350
|
+
describe 'when persistence param is not true' do
|
351
|
+
after { Ngrok::Wrapper.stop }
|
325
352
|
|
326
|
-
it '
|
327
|
-
expect(Ngrok::Wrapper).
|
328
|
-
expect(Ngrok::Wrapper).to receive(:spawn_new_ngrok).with(persistent_ngrok:
|
329
|
-
|
353
|
+
it "doesn't try to fetch params of an already running Ngrok" do
|
354
|
+
expect(Ngrok::Wrapper).not_to receive(:try_params_from_running_ngrok)
|
355
|
+
expect(Ngrok::Wrapper).to receive(:spawn_new_ngrok).with(persistent_ngrok: false)
|
356
|
+
expect_any_instance_of(File).not_to receive(:write)
|
330
357
|
|
331
|
-
Ngrok::Wrapper.start(persistence:
|
358
|
+
Ngrok::Wrapper.start(persistence: false)
|
332
359
|
end
|
333
360
|
end
|
334
|
-
end
|
335
|
-
end
|
336
|
-
|
337
|
-
describe 'when persistence param is not true' do
|
338
|
-
it "doesn't try to fetch params of an already running Ngrok" do
|
339
|
-
expect(Ngrok::Wrapper).not_to receive(:try_params_from_running_ngrok)
|
340
|
-
expect(Ngrok::Wrapper).to receive(:spawn_new_ngrok).with(persistent_ngrok: false)
|
341
|
-
expect_any_instance_of(File).not_to receive(:write)
|
342
361
|
|
343
|
-
Ngrok::Wrapper
|
344
|
-
|
345
|
-
|
362
|
+
describe 'when Ngrok::Wrapper is already running' do
|
363
|
+
it "doesn't try to spawn a new Ngrok process" do
|
364
|
+
allow(Ngrok::Wrapper).to receive(:stopped?).and_return(false)
|
365
|
+
expect(Ngrok::Wrapper).not_to receive(:spawn_new_ngrok)
|
346
366
|
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
expect(Ngrok::Wrapper).not_to receive(:spawn_new_ngrok)
|
351
|
-
|
352
|
-
Ngrok::Wrapper.start
|
367
|
+
Ngrok::Wrapper.start
|
368
|
+
end
|
369
|
+
end
|
353
370
|
end
|
354
371
|
end
|
355
372
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ngrok-wrapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anton Bogdanovich
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2022-
|
12
|
+
date: 2022-11-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: github_changelog_generator
|
@@ -151,7 +151,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
153
|
requirements: []
|
154
|
-
rubygems_version: 3.
|
154
|
+
rubygems_version: 3.3.10
|
155
155
|
signing_key:
|
156
156
|
specification_version: 4
|
157
157
|
summary: Ngrok-wrapper gem is a ruby wrapper for ngrok2
|