anya 0.9.8

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 663633cc7fd7e7f9d13efc5fdd9580ddf243439adc269de12800fbbd2ab4d68f
4
+ data.tar.gz: a3469ee1618457d699e01b497bad4ca5c2a35246355253f73c934c48c41388c9
5
+ SHA512:
6
+ metadata.gz: ee9116ae28cf870e96bd4078899f5848c5ed0fdd7d85f25e0f7df212d6aa3e342b6b572a00fca07adc313a1162f4905227d68ce6efc2a25115108d5ce3e6f595
7
+ data.tar.gz: 7b11cf542f4bee49751cba23bd4ad9103f513cb97bf0cee67cd1044b68e7d18ee4622d5e30ba17156a76888d0c8ae6e0d428260801fa8ba2679383a4b5bd89c8
@@ -0,0 +1,301 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'thor'
4
+ require 'yaml'
5
+
6
+ require 'pygmy'
7
+
8
+ class PygmyBin < Thor
9
+ class_option :verbose, type: :boolean, aliases: '-v', default: false
10
+
11
+ desc 'up', 'Bring up pygmy services (dnsmasq, haproxy, mailhog, resolv, ssh-agent)'
12
+ long_desc <<-LONGDESC
13
+ Bring up pygmy services (dnsmasq, haproxy, resolv, ssh-agent)
14
+
15
+ When run, there will be two docker containers started:
16
+
17
+ - dnsmasq: to resolve DNS requests for your the domain *.docker.amazee.io
18
+
19
+ - haproxy: to forward HTTP and HTTPs requests to the docker containers running Drupal.
20
+
21
+ - ssh-agent: to keep the ssh-agent at one single place, so that all other docker containers
22
+ can consume the ssh key.
23
+
24
+ On Linux: The local resolver (/etc/resolv.conf) will be configured to use the dnsmasq
25
+ instance as a nameserver.
26
+
27
+ On Mac: A resolver file (/etc/resolver/docker.amazee.io) will be created to use the dnsmasq
28
+ instance as a nameserver for all *.docker.amazee.io domains.
29
+
30
+ > $ pygmy up
31
+ LONGDESC
32
+ def up
33
+ exec_up(options)
34
+ end
35
+
36
+ desc 'update', 'Pulls Docker Images and recreates the Containers'
37
+ long_desc <<-LONGDESC
38
+ Runs 'docker pull' on the Docker images in order to get their newest versions.
39
+ After that restarts all containers with removing them, so that the new images are used.
40
+ LONGDESC
41
+ def update
42
+ exec_update
43
+ end
44
+
45
+ desc 'stop', 'Stop all pygmy services'
46
+ long_desc <<-LONGDESC
47
+ Stops all pygmy services. Can optionally pass [-d|--destroy]
48
+ to destroy the containers when they stop.
49
+
50
+ > $ pygmy stop [-d|--destroy]
51
+ LONGDESC
52
+ option :destroy, type: :boolean, aliases: '-d', default: false
53
+ def stop
54
+ exec_stop(options)
55
+ end
56
+
57
+ desc 'down', 'Stop and destroy all pygmy services'
58
+ long_desc <<-LONGDESC
59
+ Stops all pygmy services and destroy the containers when they stop.
60
+
61
+ > $ pygmy down
62
+ LONGDESC
63
+ def down
64
+ exec_stop({:destroy => true})
65
+ end
66
+
67
+ desc 'addkey [~/.ssh/id_rsa]', 'Add additional ssh-key'
68
+ long_desc <<-LONGDESC
69
+ Adds an additional ssh key to the ssh-agent.
70
+ Needs the absolute path to key as an argument
71
+ or uses ~/.ssh/id_rsa if none provided
72
+
73
+ > $ pygmy addkey [~/.ssh/other_key]
74
+ LONGDESC
75
+ def addkey(key = "#{Dir.home}/.ssh/id_rsa")
76
+ add_ssh_key(key)
77
+ end
78
+
79
+ desc 'version', 'Check current installed version of pygmy'
80
+ def version
81
+ puts "Pygmy - Version: #{Pygmy::VERSION}"
82
+ end
83
+
84
+ desc 'restart', 'Stop and restart all pygmy services'
85
+ long_desc <<-LONGDESC
86
+ Stop and restart pygmy services (dnsmasq, resolv, haproxy, mailhog, ssh-agent)
87
+
88
+ > $ pygmy restart [-d|--destroy]
89
+ LONGDESC
90
+ option :destroy, type: :boolean, aliases: '-d', default: false
91
+ def restart
92
+ exec_stop(options)
93
+ exec_up(options)
94
+ end
95
+
96
+ desc 'status', 'Report status of the pygmy services'
97
+ long_desc <<-LONGDESC
98
+ Checks the current status of the services managed by pygmy.
99
+ This includes dnsmasq, mailhog, and resolv
100
+
101
+ > $ pygmy status
102
+ LONGDESC
103
+ def status
104
+ exec_status(options)
105
+ end
106
+
107
+ private
108
+
109
+ def exec_update
110
+ Pygmy::Haproxy.pull
111
+ Pygmy::Mailhog.pull
112
+ Pygmy::SshAgent.pull
113
+ puts "Done. Recreating containers...".yellow
114
+ exec_stop({:destroy => true})
115
+ exec_up({})
116
+ end
117
+
118
+ def exec_up(options)
119
+
120
+ if Pygmy::Dnsmasq.start
121
+ puts "Successfully started dnsmasq".green
122
+ else
123
+ puts "Error starting dnsmasq".red
124
+ end
125
+
126
+ if Pygmy::Haproxy.start
127
+ puts "Successfully started haproxy".green
128
+ else
129
+ puts "Error starting haproxy".red
130
+ end
131
+
132
+ if Pygmy::DockerNetwork.create
133
+ puts "Successfully created amazeeio network".green
134
+ else
135
+ puts "Error creating amazeeio network".red
136
+ end
137
+
138
+ if Pygmy::DockerNetwork.connect
139
+ puts "Successfully connected haproxy to amazeeio network".green
140
+ else
141
+ puts "Error connecting haproxy to amazeeio network".red
142
+ end
143
+
144
+ if Pygmy::Mailhog.start
145
+ puts "Successfully started mailhog".green
146
+ else
147
+ puts "Error starting mailhog".red
148
+ end
149
+
150
+ if Pygmy::SshAgent.start
151
+ puts "Successfully started ssh-agent".green
152
+ else
153
+ puts "Error starting ssh-agent".red
154
+ end
155
+
156
+ if Pygmy::Resolv.configure
157
+ puts "Successfully configured local resolver".green
158
+ else
159
+ puts "Error configuring local resolver".red
160
+ end
161
+
162
+ if Pygmy::SshAgentAddKey.add_ssh_key
163
+ puts "Successfully injected ssh key".green
164
+ else
165
+ puts "Error injected ssh key".red
166
+ end
167
+ end
168
+
169
+ def exec_status(_options)
170
+
171
+ if Pygmy::Dnsmasq.running?
172
+ puts "[*] Dnsmasq: Running as docker container #{Pygmy::Dnsmasq.container_name}".green
173
+ else
174
+ puts "[*] Dnsmasq is not running".red
175
+ end
176
+
177
+ if Pygmy::Haproxy.running?
178
+ puts "[*] Haproxy: Running as docker container #{Pygmy::Haproxy.container_name}".green
179
+ else
180
+ puts "[*] Haproxy is not running".red
181
+ end
182
+
183
+ if Pygmy::DockerNetwork.exists?
184
+ puts "[*] Network: Exists as name #{Pygmy::DockerNetwork.network_name}".green
185
+ else
186
+ puts "[*] Network does not exist".red
187
+ end
188
+
189
+ if Pygmy::DockerNetwork.haproxy_connected?
190
+ puts "[*] Network: Haproxy #{Pygmy::DockerNetwork.haproxy_name} connected to #{Pygmy::DockerNetwork.network_name}".green
191
+ else
192
+ puts "[*] Haproxy is not connected to #{Pygmy::DockerNetwork.network_name}".red
193
+ end
194
+
195
+ if Pygmy::Mailhog.running?
196
+ puts "[*] Mailhog: Running as docker container #{Pygmy::Mailhog.container_name}".green
197
+ else
198
+ puts "[*] Mailhog is not running".red
199
+ end
200
+
201
+ if Pygmy::Resolv.has_our_nameserver?
202
+ puts "[*] Resolv is properly configured".green
203
+ else
204
+ puts "[*] Resolv is not configured".red
205
+ end
206
+
207
+ if Pygmy::SshAgent.running?
208
+ puts "[*] ssh-agent: Running as docker container #{Pygmy::SshAgent.container_name}, loaded keys:".green
209
+ Pygmy::SshAgentAddKey.show_ssh_keys
210
+ else
211
+ puts "[*] ssh-agent is not running".red
212
+ end
213
+
214
+ end
215
+
216
+
217
+ def add_ssh_key(key)
218
+
219
+ if Pygmy::SshAgent.running?
220
+ if Pygmy::SshAgentAddKey.add_ssh_key(key)
221
+ puts "Successfully added ssh key".green
222
+ else
223
+ puts "Error added ssh key".red
224
+ end
225
+ else
226
+ puts "ssh-agent is not running, cannot add key".red
227
+ end
228
+
229
+ end
230
+
231
+ def exec_stop(options)
232
+ if Pygmy::Resolv.clean
233
+ puts "Resolver removed".green
234
+ else
235
+ puts "Error while removing the resolver".red
236
+ end
237
+
238
+ if Pygmy::Dnsmasq.stop
239
+ puts "Dnsmasq container stopped".green
240
+ if options[:destroy]
241
+ if Pygmy::Dnsmasq.delete
242
+ puts "Dnsmasq container successfully deleted".green
243
+ else
244
+ puts "Dnsmasq container failed to delete".red
245
+ end
246
+ end
247
+ else
248
+ puts "Dnsmasq container failed to stop".red
249
+ end
250
+
251
+ if Pygmy::Mailhog.stop
252
+ puts "Mailhog container stopped".green
253
+ if options[:destroy]
254
+ if Pygmy::Mailhog.delete
255
+ puts "Mailhog container successfully deleted".green
256
+ else
257
+ puts "Mailhog container failed to delete".red
258
+ end
259
+ end
260
+ else
261
+ puts "Mailhog container failed to stop".red
262
+ end
263
+
264
+ if Pygmy::SshAgent.stop
265
+ puts "ssh-agent container stopped".green
266
+ if options[:destroy]
267
+ if Pygmy::SshAgent.delete
268
+ puts "ssh-agent container successfully deleted".green
269
+ else
270
+ puts "ssh-agent container failed to delete".red
271
+ end
272
+ end
273
+ else
274
+ puts "ssh-agent container failed to stop".red
275
+ end
276
+
277
+ if Pygmy::Haproxy.stop
278
+ puts "Haproxy container stopped".green
279
+ if options[:destroy]
280
+ if Pygmy::Haproxy.delete
281
+ puts "Haproxy container successfully deleted".green
282
+ else
283
+ puts "Haproxy container failed to delete".red
284
+ end
285
+ end
286
+ else
287
+ puts "Haproxy container failed to stop".red
288
+ end
289
+
290
+ end
291
+ end
292
+
293
+ aliases = {
294
+ 'start' => 'up',
295
+ }
296
+
297
+ if !ARGV.empty? && %w[-v --version].include?(ARGV.first)
298
+ puts "Pygmy - Version: #{Pygmy::VERSION}"
299
+ else
300
+ PygmyBin.start(ARGV.map { |a| aliases.keys.include?(a) ? aliases[a] : a })
301
+ end
@@ -0,0 +1,3 @@
1
+ Gem.find_files('pygmy/**/*.rb').each do |path|
2
+ require path.gsub(/\.rb$/, '') unless path =~ /bot.*cli/
3
+ end
@@ -0,0 +1,27 @@
1
+ require_relative 'docker_service'
2
+
3
+ module Pygmy
4
+ class Dnsmasq
5
+ extend Pygmy::DockerService
6
+
7
+ def self.image_name
8
+ 'andyshinn/dnsmasq:2.75'
9
+ end
10
+
11
+ def self.container_name
12
+ 'amazeeio-dnsmasq'
13
+ end
14
+
15
+ def self.domain
16
+ 'docker.amazee.io'
17
+ end
18
+
19
+ def self.addr
20
+ '127.0.0.1'
21
+ end
22
+
23
+ def self.run_cmd(domain = self.domain, addr = self.addr)
24
+ "docker run -d -p 53:53/tcp -p 53:53/udp --name=amazeeio-dnsmasq --cap-add=NET_ADMIN andyshinn/dnsmasq:2.75 -A /local.dev/127.0.0.1"
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,74 @@
1
+ require_relative 'docker_service'
2
+
3
+ module Pygmy
4
+ class DockerNetwork
5
+ extend Pygmy::DockerService
6
+
7
+ def self.network_name
8
+ 'amazeeio-network'
9
+ end
10
+
11
+ def self.haproxy_name
12
+ 'amazeeio-haproxy'
13
+ end
14
+
15
+ def self.create_cmd
16
+ "docker network create #{self.network_name}"
17
+ end
18
+
19
+ def self.connect_haproxy_cmd
20
+ "docker network connect #{self.network_name} #{self.haproxy_name}"
21
+ end
22
+
23
+ def self.create
24
+ unless self.exists?
25
+ unless Sh.run_command(self.create_cmd).success?
26
+ raise RuntimeError.new(
27
+ "Failed to create #{self.network_name}. Command #{self.create_cmd} failed"
28
+ )
29
+ end
30
+ end
31
+ self.exists?
32
+ end
33
+
34
+ def self.connect
35
+ unless self.haproxy_connected?
36
+ unless Sh.run_command(self.connect_haproxy_cmd).success?
37
+ raise RuntimeError.new(
38
+ "Failed to connect #{self.haproxy_name} to #{self.network_name}. Command #{self.connect_haproxy_cmd} failed"
39
+ )
40
+ end
41
+ end
42
+ self.haproxy_connected?
43
+ end
44
+
45
+ def self.haproxy_connected?(network_name = self.network_name, haproxy_name = self.haproxy_name)
46
+ !!(self.inspect_containers(network_name) =~ /#{haproxy_name}/)
47
+ end
48
+
49
+ def self.exists?(network_name = self.network_name)
50
+ !!(self.ls =~ /#{network_name}/)
51
+ end
52
+
53
+ def self.inspect_containers(network_name = self.network_name)
54
+ cmd = "docker network inspect #{self.network_name} -f '{{.Containers}}'"
55
+ ret = Sh.run_command(cmd)
56
+ if ret.success?
57
+ return ret.stdout
58
+ else
59
+ raise RuntimeError.new("Failure running command '#{cmd}'")
60
+ end
61
+ end
62
+
63
+ def self.ls
64
+ cmd = "docker network ls"
65
+ ret = Sh.run_command(cmd)
66
+ if ret.success?
67
+ return ret.stdout
68
+ else
69
+ raise RuntimeError.new("Failure running command '#{cmd}'")
70
+ end
71
+ end
72
+
73
+ end
74
+ end
@@ -0,0 +1,70 @@
1
+ require 'shellwords'
2
+
3
+ module Pygmy
4
+ module DockerService
5
+ def start
6
+ unless self.running?
7
+ success = if self.container_exists?
8
+ Sh.run_command(self.start_cmd).success?
9
+ else
10
+ Sh.run_command(self.run_cmd).success?
11
+ end
12
+ unless success
13
+ raise RuntimeError.new(
14
+ "Failed to run #{self.container_name}. Command #{self.run_cmd} failed"
15
+ )
16
+ end
17
+ end
18
+ self.running?
19
+ end
20
+
21
+ def pull
22
+ puts "Pulling Docker Image #{Shellwords.escape(self.image_name)}".yellow
23
+ success = Sh.run_command("docker pull #{Shellwords.escape(self.image_name)}").success?
24
+ unless success
25
+ raise RuntimeError.new(
26
+ "Failed to update #{self.container_name}. Command #{self.pull_cmd} failed"
27
+ )
28
+ end
29
+ end
30
+
31
+ def running?(container_name = self.container_name)
32
+ !!(self.ps =~ /#{container_name}/)
33
+ end
34
+
35
+ def container_exists?(container_name = self.container_name)
36
+ !!(self.ps(true) =~ /#{container_name}/)
37
+ end
38
+
39
+ def ps(all = false)
40
+ cmd = "docker ps#{all ? ' -a' : ''}"
41
+ ret = Sh.run_command(cmd)
42
+ if ret.success?
43
+ return ret.stdout
44
+ else
45
+ raise RuntimeError.new("Failure running command '#{cmd}'")
46
+ end
47
+ end
48
+
49
+ def has_docker_client?
50
+ Sh.run_command('which docker').success?
51
+ end
52
+
53
+ def stop(container_name = self.container_name)
54
+ Sh.run_command("docker stop -t 1 #{Shellwords.escape(container_name)}") if self.running?
55
+ !self.running?
56
+ end
57
+
58
+ def delete(container_name = self.container_name)
59
+ if self.container_exists?
60
+ self.stop if self.running?
61
+ Sh.run_command("docker rm #{Shellwords.escape(container_name)}")
62
+ end
63
+ !self.container_exists?
64
+ end
65
+
66
+ def start_cmd
67
+ "docker start #{Shellwords.escape(self.container_name)}"
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,24 @@
1
+ require_relative 'docker_service'
2
+
3
+ module Pygmy
4
+ class Haproxy
5
+ extend Pygmy::DockerService
6
+
7
+ def self.image_name
8
+ 'amazeeio/haproxy'
9
+ end
10
+
11
+ def self.container_name
12
+ 'amazeeio-haproxy'
13
+ end
14
+
15
+ def self.run_cmd
16
+ "docker run -d " \
17
+ "-p 80:80 -p 443:443 " \
18
+ "--volume=/var/run/docker.sock:/tmp/docker.sock " \
19
+ "--restart=always " \
20
+ "--name=#{Shellwords.escape(self.container_name)} " \
21
+ "#{Shellwords.escape(self.image_name)}"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,53 @@
1
+ module Pygmy
2
+ module Linux
3
+ def self.bash(command)
4
+ system("bash -c '#{command}'")
5
+ end
6
+
7
+ def self.ubuntu?
8
+ self.bash(self.ubuntu_cmd)
9
+ end
10
+
11
+ def self.fedora?
12
+ self.bash(self.fedora_cmd)
13
+ end
14
+
15
+ def self.arch?
16
+ self.bash(self.arch_cmd)
17
+ end
18
+
19
+ def self.osx?
20
+ self.bash('uname -a | grep "Darwin" > /dev/null')
21
+ end
22
+
23
+ def self.ubuntu_cmd
24
+ %q(
25
+ if $(which lsb_release >/dev/null 2>&1); then
26
+ lsb_release -d | grep --color=auto "Ubuntu" > /dev/null
27
+ else
28
+ uname -a | grep --color=auto "Ubuntu" > /dev/null
29
+ fi
30
+ )
31
+ end
32
+
33
+ def self.fedora_cmd
34
+ %q(
35
+ if $(which lsb_release >/dev/null 2>&1); then
36
+ lsb_release -d | grep --color=auto "Fedora" > /dev/null
37
+ else
38
+ uname -r | grep --color=auto "fc" > /dev/null
39
+ fi
40
+ )
41
+ end
42
+
43
+ def self.arch_cmd
44
+ %q(
45
+ if $(which lsb_release >/dev/null 2>&1); then
46
+ lsb_release -d | grep --color=auto "Arch" > /dev/null
47
+ else
48
+ uname -a | grep --color=auto "ARCH" > /dev/null
49
+ fi
50
+ )
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,32 @@
1
+ require_relative 'docker_service'
2
+
3
+ module Pygmy
4
+ class Mailhog
5
+ extend Pygmy::DockerService
6
+
7
+ def self.image_name
8
+ 'mailhog/mailhog'
9
+ end
10
+
11
+ def self.container_name
12
+ 'mailhog.docker.amazee.io'
13
+ end
14
+
15
+ def self.domain
16
+ 'docker.amazee.io'
17
+ end
18
+
19
+ def self.addr
20
+ '127.0.0.1'
21
+ end
22
+
23
+ def self.run_cmd(domain = self.domain, addr = self.addr)
24
+ "docker run --restart=always -d -p 1025:1025 --expose 80 -u 0 --name=#{Shellwords.escape(self.container_name)} " \
25
+ '-e "MH_UI_BIND_ADDR=0.0.0.0:80" ' \
26
+ '-e "MH_API_BIND_ADDR=0.0.0.0:80" ' \
27
+ '-e "AMAZEEIO=AMAZEEIO" ' \
28
+ "#{Shellwords.escape(self.image_name)}"
29
+ end
30
+ end
31
+ end
32
+
@@ -0,0 +1,99 @@
1
+ require 'colorize'
2
+ require 'tempfile'
3
+ require 'pathname'
4
+
5
+ module Pygmy
6
+ module Resolv
7
+ def self.common_resolv_file
8
+ '/etc/resolv.conf'
9
+ end
10
+
11
+ def self.ubuntu_resolv_file
12
+ #'/etc/resolvconf/resolv.conf.d/base'
13
+ # For now, use the common_resolv_file
14
+ self.common_resolv_file
15
+ end
16
+
17
+ def self.file_comment
18
+ '# added by amazee.io pygmy'
19
+ end
20
+
21
+ def self.nameserver
22
+ "127.0.0.1"
23
+ end
24
+
25
+ def self.file_nameserver_line
26
+ "nameserver #{self.nameserver}"
27
+ end
28
+
29
+ def self.nameserver_contents
30
+ "#{self.file_nameserver_line} #{self.file_comment}"
31
+ end
32
+
33
+ def self.resolv_file
34
+ if Linux.ubuntu?
35
+ return self.ubuntu_resolv_file
36
+ elsif Linux.fedora? || Linux.arch? || File.exist?(self.common_resolv_file)
37
+ return self.common_resolv_file
38
+ else
39
+ raise RuntimeError.new(
40
+ "Unable to determine location of resolv file"
41
+ )
42
+ end
43
+ end
44
+
45
+
46
+ def self.configure
47
+ if Linux.osx?
48
+ return ResolvOsx.create_resolver?
49
+ end
50
+ # we want to be the first nameserver in the list for performance reasons
51
+ # we only want to add the nameserver if it isn't already there
52
+ prev_conts = self.resolv_file_contents
53
+ unless self.contents_has_our_nameserver?(prev_conts)
54
+ if prev_conts =~ /nameserver/
55
+ prev_conts.sub!(/nameserver/, "#{self.nameserver_contents}\nnameserver")
56
+ else
57
+ prev_conts = "#{prev_conts}\n#{self.nameserver_contents}"
58
+ end
59
+ prev_conts.gsub!(/\s+$/, '')
60
+ self.write_to_file(prev_conts)
61
+ end
62
+ self.has_our_nameserver?
63
+ end
64
+
65
+ def self.clean
66
+ if Linux.osx?
67
+ return ResolvOsx.clean?
68
+ end
69
+ prev_conts = self.resolv_file_contents
70
+ if self.contents_has_our_nameserver?(prev_conts)
71
+ prev_conts.gsub!(/#{Regexp.escape(self.nameserver_contents + "\n")}/, '')
72
+ prev_conts.gsub!(/\s+$/, '')
73
+ self.write_to_file(prev_conts)
74
+ end
75
+ !self.has_our_nameserver?
76
+ end
77
+
78
+ def self.write_to_file(contents)
79
+ # have to use this hack cuz we don't run as root :-(
80
+ puts "Requesting sudo to write to #{self.resolv_file}".green
81
+ Bash.run_command("echo -e '#{contents}' | sudo tee #{Shellwords.escape(self.resolv_file)} >/dev/null")
82
+ end
83
+
84
+ def self.resolv_file_contents
85
+ File.read(self.resolv_file)
86
+ end
87
+
88
+ def self.has_our_nameserver?
89
+ if Linux.osx?
90
+ return ResolvOsx.resolver_file_exists?
91
+ end
92
+ self.contents_has_our_nameserver?(self.resolv_file_contents)
93
+ end
94
+
95
+ def self.contents_has_our_nameserver?(contents)
96
+ !!((contents =~ /#{self.file_comment}/) || (contents =~ /#{self.file_nameserver_line}/))
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,60 @@
1
+ require 'colorize'
2
+ require 'tempfile'
3
+ require 'pathname'
4
+
5
+ module Pygmy
6
+ module ResolvOsx
7
+ def self.resolver_dir
8
+ Pathname("/etc/resolver")
9
+ end
10
+
11
+ def self.resolver_file
12
+ "/etc/resolver/docker.amazee.io"
13
+ end
14
+
15
+ def self.create_resolver?
16
+ puts "setting up DNS resolution and loopback alias IP, this may require sudo".green
17
+ unless self.resolver_dir.directory?
18
+ self.system!("creating #{self.resolver_dir}", "sudo", "mkdir", "-p", self.resolver_dir)
19
+ end
20
+ Tempfile.open('amazeeio_pygmy-dnsmasq') do |f|
21
+ f.write(self.resolver_contents)
22
+ f.close
23
+ self.system!("creating #{self.resolver_file}", "sudo", "cp", f.path, self.resolver_file)
24
+ self.system!("creating #{self.resolver_file}", "sudo", "chmod", "644", self.resolver_file)
25
+ end
26
+ self.system!("creating loopback IP alias 172.16.172.16", "sudo", "ifconfig", "lo0", "alias", "172.16.172.16")
27
+ self.system!("restarting mDNSResponder", "sudo", "killall", "mDNSResponder")
28
+ end
29
+
30
+ def self.clean?
31
+ puts "Removing resolver file and loopback alias IP, this may require sudo".green
32
+ begin
33
+ self.system!("removing resolverfile", "sudo", "rm", "-f", self.resolver_file)
34
+ self.system!("removing loopback IP alias 172.16.172.16", "sudo", "ifconfig", "lo0", "-alias", "172.16.172.16")
35
+ system!("restarting mDNSResponder", "sudo", "killall", "mDNSResponder")
36
+ rescue Exception => e
37
+ puts e.message
38
+ end
39
+ end
40
+
41
+ def self.system!(step, *args)
42
+ system(*args.map(&:to_s)) || raise("Error with the #{name} daemon during #{step}")
43
+ end
44
+
45
+ def self.resolver_contents; <<-EOS.gsub(/^ /, '')
46
+ # Generated by amazeeio pygmy
47
+ nameserver 127.0.0.1
48
+ port 53
49
+ EOS
50
+ end
51
+
52
+ def self.resolver_file_contents
53
+ File.read(self.resolver_file) unless !File.file?(self.resolver_file)
54
+ end
55
+
56
+ def self.resolver_file_exists?
57
+ (self.resolver_file_contents == self.resolver_contents)
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,25 @@
1
+ require 'ostruct'
2
+
3
+ module Pygmy
4
+ module Sh
5
+ def self.run_command(command)
6
+ stdout = `#{command}`
7
+ OpenStruct.new({
8
+ success?: $?.exitstatus == 0,
9
+ exitstatus: $?.exitstatus,
10
+ stdout: stdout
11
+ })
12
+ end
13
+ end
14
+
15
+ module Bash
16
+ def self.run_command(command)
17
+ stdout = `bash -c "#{command}"`
18
+ OpenStruct.new({
19
+ success?: $?.exitstatus == 0,
20
+ exitstatus: $?.exitstatus,
21
+ stdout: stdout
22
+ })
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,22 @@
1
+ require_relative 'docker_service'
2
+
3
+ module Pygmy
4
+ class SshAgent
5
+ extend Pygmy::DockerService
6
+
7
+ def self.image_name
8
+ 'amazeeio/ssh-agent'
9
+ end
10
+
11
+ def self.container_name
12
+ 'amazeeio-ssh-agent'
13
+ end
14
+
15
+ def self.run_cmd
16
+ "docker run -d " \
17
+ "--restart=always " \
18
+ "--name=#{Shellwords.escape(self.container_name)} " \
19
+ "#{Shellwords.escape(self.image_name)}"
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,34 @@
1
+ module Pygmy
2
+ class SshAgentAddKey
3
+ def self.image_name
4
+ 'amazeeio/ssh-agent'
5
+ end
6
+
7
+ def self.container_name
8
+ 'amazeeio-ssh-agent-add-key'
9
+ end
10
+
11
+ def self.add_ssh_key(key = "#{Dir.home}/.ssh/id_rsa")
12
+ if File.file?(key)
13
+ system("docker run --rm -it " \
14
+ "--volume=#{key}:/#{key} " \
15
+ "--volumes-from=amazeeio-ssh-agent " \
16
+ "--name=#{Shellwords.escape(self.container_name)} " \
17
+ "#{Shellwords.escape(self.image_name)} " \
18
+ "ssh-add #{key}")
19
+ else
20
+ puts "ssh key: #{key}, does not exist, ignoring...".yellow
21
+ return false
22
+ end
23
+ end
24
+
25
+ def self.show_ssh_keys
26
+ system("docker run --rm -it " \
27
+ "--volumes-from=amazeeio-ssh-agent " \
28
+ "--name=#{Shellwords.escape(self.container_name)} " \
29
+ "#{Shellwords.escape(self.image_name)} " \
30
+ "ssh-add -l")
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,4 @@
1
+ module Pygmy
2
+ VERSION = '0.9.8'
3
+ DATE = '2017-08-08'
4
+ end
metadata ADDED
@@ -0,0 +1,162 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: anya
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.8
5
+ platform: ruby
6
+ authors:
7
+ - Michael Schmid
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-08-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: colorize
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: thor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.19'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.19'
41
+ - !ruby/object:Gem::Dependency
42
+ name: ptools
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.4'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.4'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.5'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.5'
83
+ - !ruby/object:Gem::Dependency
84
+ name: byebug
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '8.2'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '8.2'
97
+ - !ruby/object:Gem::Dependency
98
+ name: codeclimate-test-reporter
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.5'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.5'
111
+ description: To fully and easy run a local Drupal development system you need more
112
+ then just a docker container with the Drupal running. Default development workflows
113
+ involves running multiple sites at the same time, interacting with other services
114
+ which are authenticated via ssh and more.Pygmy makes usre that the required Docker
115
+ containers are started and that youcomfortably can access the Drupal Containers
116
+ just via the browser.
117
+ email: michael@amazee.io
118
+ executables:
119
+ - pygmy
120
+ extensions: []
121
+ extra_rdoc_files: []
122
+ files:
123
+ - bin/pygmy
124
+ - lib/pygmy.rb
125
+ - lib/pygmy/dnsmasq.rb
126
+ - lib/pygmy/docker_network.rb
127
+ - lib/pygmy/docker_service.rb
128
+ - lib/pygmy/haproxy.rb
129
+ - lib/pygmy/linux.rb
130
+ - lib/pygmy/mailhog.rb
131
+ - lib/pygmy/resolv.rb
132
+ - lib/pygmy/resolv_osx.rb
133
+ - lib/pygmy/shell.rb
134
+ - lib/pygmy/ssh_agent.rb
135
+ - lib/pygmy/ssh_agent_add_key.rb
136
+ - lib/pygmy/version.rb
137
+ homepage: https://github.com/amazeeio/pygmy
138
+ licenses:
139
+ - MIT
140
+ metadata: {}
141
+ post_install_message:
142
+ rdoc_options: []
143
+ require_paths:
144
+ - lib
145
+ required_ruby_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ required_rubygems_version: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
155
+ requirements: []
156
+ rubyforge_project:
157
+ rubygems_version: 2.7.3
158
+ signing_key:
159
+ specification_version: 4
160
+ summary: pygmy provides the required servies to run the amazee.io Drupal local development
161
+ environment on linux.
162
+ test_files: []