dory 0.5.0 → 0.5.1
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/lib/dory/dnsmasq.rb +49 -65
- data/lib/dory/docker_service.rb +1 -1
- data/lib/dory/port_utils.rb +28 -0
- data/lib/dory/proxy.rb +1 -1
- data/lib/dory/systemd.rb +30 -0
- data/lib/dory/version.rb +2 -2
- metadata +19 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1c9a8eb4e309988a08bc4418c313cc5fcd942fef
|
4
|
+
data.tar.gz: ea5da1d8d1541824b3566669565c614414e27ad3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af839401db81b131b4bdd0a7f45d401f3cb796240dc8b256647f8073386dfc84093ab403d1d1adc31a5cb451e0ae67e6417c13b2beb19bb989ca959d4c683c3b
|
7
|
+
data.tar.gz: eb51a6604b6539d11c164113557718ac2f028b636f283ee8293477416a3f4d88bbe038db5884bcf8bc070664614a0a1bfa26c053564313bdbc74608d57c066bc
|
data/lib/dory/dnsmasq.rb
CHANGED
@@ -8,22 +8,45 @@ module Dory
|
|
8
8
|
# I really hate these globals. It would be great to refactor these out
|
9
9
|
#
|
10
10
|
@@first_attempt_failed = false
|
11
|
-
@@handle_systemd_services =
|
11
|
+
@@handle_systemd_services = []
|
12
12
|
|
13
13
|
def self.dnsmasq_image_name
|
14
14
|
'freedomben/dory-dnsmasq:1.1.0'
|
15
15
|
end
|
16
16
|
|
17
|
+
def self.first_attempt_failed?
|
18
|
+
@@first_attempt_failed ||= false if @first_attempt_failed.nil?
|
19
|
+
@@first_attempt_failed
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.set_first_attempt_failed(failed)
|
23
|
+
@@first_attempt_failed = failed
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.systemd_services?
|
27
|
+
return false unless self.systemd_services
|
28
|
+
self.systemd_services.count > 0
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.systemd_services
|
32
|
+
@@systemd_services ||= []
|
33
|
+
@@systemd_services
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.set_systemd_services(services)
|
37
|
+
@@systemd_services = services
|
38
|
+
end
|
39
|
+
|
17
40
|
def self.run_preconditions
|
18
41
|
puts "[DEBUG] dnsmasq service running preconditions" if Dory::Config.debug?
|
19
42
|
|
20
43
|
# we don't want to hassle the user with checking the port unless necessary
|
21
|
-
if
|
22
|
-
|
23
|
-
self.down_systemd_services if
|
44
|
+
if first_attempt_failed?
|
45
|
+
self.set_systemd_services(self.running_services_that_block_dnsmasq)
|
46
|
+
self.down_systemd_services if self.systemd_services?
|
24
47
|
|
25
48
|
puts "[DEBUG] First attempt failed. Checking port #{self.port}" if Dory::Config.debug?
|
26
|
-
listener_list =
|
49
|
+
listener_list = Dory::PortUtils.check_port(self.port)
|
27
50
|
unless listener_list.empty?
|
28
51
|
return self.offer_to_kill(listener_list)
|
29
52
|
end
|
@@ -37,13 +60,13 @@ module Dory
|
|
37
60
|
|
38
61
|
def self.run_postconditions
|
39
62
|
puts "[DEBUG] dnsmasq service running postconditions" if Dory::Config.debug?
|
40
|
-
self.up_systemd_services if
|
63
|
+
self.up_systemd_services if self.systemd_services?
|
41
64
|
end
|
42
65
|
|
43
|
-
def self.handle_error(
|
66
|
+
def self.handle_error(_command_output)
|
44
67
|
puts "[DEBUG] handling dnsmasq start error" if Dory::Config.debug?
|
45
68
|
# If we've already tried to handle failure, prevent infinite recursion
|
46
|
-
if
|
69
|
+
if first_attempt_failed?
|
47
70
|
puts "[DEBUG] Attempt to kill conflicting service failed" if Dory::Config.debug?
|
48
71
|
return false
|
49
72
|
else
|
@@ -51,7 +74,7 @@ module Dory
|
|
51
74
|
puts "[DEBUG] First attempt to start dnsmasq failed." \
|
52
75
|
"There is probably a conflicting service present"
|
53
76
|
end
|
54
|
-
|
77
|
+
set_first_attempt_failed(true)
|
55
78
|
self.start(handle_error: false)
|
56
79
|
end
|
57
80
|
end
|
@@ -101,36 +124,13 @@ module Dory
|
|
101
124
|
end
|
102
125
|
end
|
103
126
|
|
104
|
-
def self.run_command
|
127
|
+
def self.run_command
|
105
128
|
"docker run -d -p #{self.port}:#{self.port}/tcp -p #{self.port}:#{self.port}/udp " \
|
106
129
|
"--name=#{Shellwords.escape(self.container_name)} " \
|
107
130
|
"--cap-add=NET_ADMIN #{Shellwords.escape(self.dnsmasq_image_name)} " \
|
108
131
|
"#{self.domain_addr_arg_string}"
|
109
132
|
end
|
110
133
|
|
111
|
-
def self.check_port(port_num)
|
112
|
-
puts "Requesting sudo to check if something is bound to port #{self.port}".green
|
113
|
-
ret = Sh.run_command("sudo lsof -i :#{self.port}")
|
114
|
-
return [] unless ret.success?
|
115
|
-
|
116
|
-
list = ret.stdout.split("\n")
|
117
|
-
list.shift # get rid of the column headers
|
118
|
-
list.map! do |process|
|
119
|
-
command, pid, user, fd, type, device, size, node, name = process.split(/\s+/)
|
120
|
-
OpenStruct.new({
|
121
|
-
command: command,
|
122
|
-
pid: pid,
|
123
|
-
user: user,
|
124
|
-
fd: fd,
|
125
|
-
type: type,
|
126
|
-
device: device,
|
127
|
-
size: size,
|
128
|
-
node: node,
|
129
|
-
name: name
|
130
|
-
})
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
134
|
def self.offer_to_kill(listener_list, answer: nil)
|
135
135
|
listener_list.each do |process|
|
136
136
|
puts "Process '#{process.command}' with PID '#{process.pid}' is listening on #{process.node} port #{self.port}.".yellow
|
@@ -149,14 +149,6 @@ module Dory
|
|
149
149
|
end
|
150
150
|
end
|
151
151
|
|
152
|
-
def self.has_systemd?
|
153
|
-
Sh.run_command('which systemctl').success?
|
154
|
-
end
|
155
|
-
|
156
|
-
def self.systemd_service_installed?(service)
|
157
|
-
!(Sh.run_command("systemctl status #{service} | head -1").stdout =~ /unit.*not.*found/i)
|
158
|
-
end
|
159
|
-
|
160
152
|
def self.services_that_block_dnsmasq
|
161
153
|
%w[
|
162
154
|
NetworkManager.service
|
@@ -165,23 +157,22 @@ module Dory
|
|
165
157
|
end
|
166
158
|
|
167
159
|
def self.has_services_that_block_dnsmasq?
|
168
|
-
!self.
|
160
|
+
!self.running_services_that_block_dnsmasq.empty?
|
169
161
|
end
|
170
162
|
|
171
|
-
def self.
|
163
|
+
def self.running_services_that_block_dnsmasq
|
172
164
|
self.services_that_block_dnsmasq.select do |service|
|
173
|
-
|
165
|
+
Dory::Systemd.systemd_service_running?(service)
|
174
166
|
end
|
175
167
|
end
|
176
168
|
|
177
169
|
def self.down_systemd_services
|
178
170
|
puts "[DEBUG] Putting systemd services down" if Dory::Config.debug?
|
179
171
|
|
180
|
-
services = self.enabled_services_that_block_dnsmasq
|
181
172
|
conf = if ask_about_killing?
|
182
173
|
puts "You have some systemd services running that will race against us \n" \
|
183
174
|
"to bind to port 53 (and usually they win):".yellow
|
184
|
-
puts "\n #{
|
175
|
+
puts "\n #{self.systemd_services.join(', ')}\n".yellow
|
185
176
|
puts "If we don't stop these services temporarily while putting up the \n" \
|
186
177
|
"dnsmasq container, starting it will likely fail.".yellow
|
187
178
|
print "Would you like me to put them down while we start dns \n" \
|
@@ -190,42 +181,35 @@ module Dory
|
|
190
181
|
else
|
191
182
|
answer_from_settings
|
192
183
|
end
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
self.set_systemd_service(service: service, up: false)
|
184
|
+
if conf =~ /y/i
|
185
|
+
if self.systemd_services.all? { |service|
|
186
|
+
Dory::Systemd.set_systemd_service(service: service, up: false)
|
197
187
|
}
|
198
188
|
puts "Putting down services succeeded".green
|
199
189
|
else
|
200
|
-
puts "One or more services failed to
|
190
|
+
puts "One or more services failed to stop".red
|
201
191
|
end
|
202
192
|
else
|
203
193
|
puts 'OK, not putting down the services'.yellow
|
194
|
+
set_systemd_services([])
|
204
195
|
end
|
205
196
|
end
|
206
197
|
|
207
198
|
def self.up_systemd_services
|
208
|
-
if
|
209
|
-
puts "[DEBUG] Putting systemd services back up" if Dory::Config.debug?
|
210
|
-
|
211
|
-
|
212
|
-
self.set_systemd_service(service: service, up: true)
|
199
|
+
if self.systemd_services?
|
200
|
+
puts "[DEBUG] Putting systemd services back up: #{self.systemd_services.join(', ')}" if Dory::Config.debug?
|
201
|
+
if self.systemd_services.reverse.all? { |service|
|
202
|
+
Dory::Systemd.set_systemd_service(service: service, up: true)
|
213
203
|
}
|
214
|
-
puts "#{
|
204
|
+
puts "#{self.systemd_services.join(', ')} were successfully restarted".green
|
215
205
|
else
|
216
|
-
puts "#{
|
206
|
+
puts "#{self.systemd_services.join(', ')} failed to restart".red
|
217
207
|
end
|
218
208
|
else
|
219
|
-
puts "[DEBUG] Not putting systemd services back up cause
|
209
|
+
puts "[DEBUG] Not putting systemd services back up cause array was empty " if Dory::Config.debug?
|
220
210
|
end
|
221
211
|
end
|
222
212
|
|
223
|
-
def self.set_systemd_service(service:, up:)
|
224
|
-
action = up ? 'start' : 'stop'
|
225
|
-
puts "Requesting sudo to #{action} #{service}".green
|
226
|
-
Sh.run_command("sudo systemctl #{action} #{service}").success?
|
227
|
-
end
|
228
|
-
|
229
213
|
def self.ask_about_killing?
|
230
214
|
!self.answer_from_settings
|
231
215
|
end
|
data/lib/dory/docker_service.rb
CHANGED
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative 'docker_service'
|
2
|
+
|
3
|
+
module Dory
|
4
|
+
module PortUtils
|
5
|
+
def self.check_port(port_num = self.port)
|
6
|
+
puts "Requesting sudo to check if something is bound to port #{port_num}".green
|
7
|
+
ret = Dory::Sh.run_command("sudo lsof -i :#{port_num}")
|
8
|
+
return [] unless ret.success?
|
9
|
+
|
10
|
+
list = ret.stdout.split("\n")
|
11
|
+
list.shift # get rid of the column headers
|
12
|
+
list.map! do |process|
|
13
|
+
command, pid, user, fd, type, device, size, node, name = process.split(/\s+/)
|
14
|
+
OpenStruct.new({
|
15
|
+
command: command,
|
16
|
+
pid: pid,
|
17
|
+
user: user,
|
18
|
+
fd: fd,
|
19
|
+
type: type,
|
20
|
+
device: device,
|
21
|
+
size: size,
|
22
|
+
node: node,
|
23
|
+
name: name
|
24
|
+
})
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/dory/proxy.rb
CHANGED
data/lib/dory/systemd.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require_relative 'docker_service'
|
2
|
+
|
3
|
+
module Dory
|
4
|
+
module Systemd
|
5
|
+
def self.has_systemd?
|
6
|
+
Sh.run_command('which systemctl').success?
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.systemd_service_installed?(service)
|
10
|
+
return false unless self.has_systemd?
|
11
|
+
!(Sh.run_command("systemctl status #{service} | head -1").stdout =~ /not-found/)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.systemd_service_running?(service)
|
15
|
+
return false unless self.has_systemd?
|
16
|
+
!!(Sh.run_command("systemctl status #{service} | head -3").stdout =~ /Active:\s+active.*running/)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.systemd_service_enabled?(service)
|
20
|
+
return false unless self.has_systemd?
|
21
|
+
!!(Sh.run_command("systemctl status #{service} | head -3").stdout.gsub(/Loaded.*?;/, '') =~ /^\s*enabled;/)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.set_systemd_service(service:, up:)
|
25
|
+
action = up ? 'start' : 'stop'
|
26
|
+
puts "Requesting sudo to #{action} #{service}".green
|
27
|
+
Sh.run_command("sudo systemctl #{action} #{service}").success?
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/dory/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dory
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Porter
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|
@@ -122,6 +122,20 @@ dependencies:
|
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0.6'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rubocop
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0.47'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0.47'
|
125
139
|
description: 'Dory lets you forget about IP addresses and port numbers while you are
|
126
140
|
developing your application. Through the magic of local DNS and a reverse proxy,
|
127
141
|
you can access your app at the domain of your choosing. For example, http://myapp.docker
|
@@ -140,11 +154,13 @@ files:
|
|
140
154
|
- lib/dory/dnsmasq.rb
|
141
155
|
- lib/dory/docker_service.rb
|
142
156
|
- lib/dory/os.rb
|
157
|
+
- lib/dory/port_utils.rb
|
143
158
|
- lib/dory/proxy.rb
|
144
159
|
- lib/dory/resolv.rb
|
145
160
|
- lib/dory/resolv/linux.rb
|
146
161
|
- lib/dory/resolv/macos.rb
|
147
162
|
- lib/dory/shell.rb
|
163
|
+
- lib/dory/systemd.rb
|
148
164
|
- lib/dory/upgrade.rb
|
149
165
|
- lib/dory/version.rb
|
150
166
|
homepage: https://github.com/FreedomBen/dory
|
@@ -167,7 +183,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
167
183
|
version: '0'
|
168
184
|
requirements: []
|
169
185
|
rubyforge_project:
|
170
|
-
rubygems_version: 2.5
|
186
|
+
rubygems_version: 2.2.5
|
171
187
|
signing_key:
|
172
188
|
specification_version: 4
|
173
189
|
summary: Your development proxy for Docker
|