pygmy 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2d9ca74d85c1a5306760f436b11560b8dc92b63d
4
+ data.tar.gz: f41bd940449ec83b530da8f060d23f930a0539e1
5
+ SHA512:
6
+ metadata.gz: b9932499926356627b02ac6b15765284ff380b9443f39c4da672c7b4fb5c213a77e90d243c8e45e0bc2218a75a5990b337bc485cfb26193c11948c092a70f95b
7
+ data.tar.gz: b9028cfc479c86481864b6c7e47a0b6d451e2f5af9b948eb371212cbda25623e0fa91ec01a68a409a5620ef3cbc8ad16dc5217de90f4688d5a5fc971d0ce8031
data/bin/pygmy ADDED
@@ -0,0 +1,221 @@
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, 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
+ Additionally the local resolver (/etc/resolv.conf) will be configured to use the dnsmasq
25
+ instance as a nameserver
26
+
27
+ > $ pygmy up
28
+ LONGDESC
29
+ def up
30
+ exec_up(options)
31
+ end
32
+
33
+ desc 'down', 'Stop all pygmy services'
34
+ long_desc <<-LONGDESC
35
+ Stops all pygmy services. Can optionally pass [-d|--destroy]
36
+ to destroy the containers when they stop.
37
+
38
+ > $ pygmy down [-d|--destroy]
39
+ LONGDESC
40
+ option :destroy, type: :boolean, aliases: 'd', default: false
41
+ def down
42
+ exec_down(options)
43
+ end
44
+
45
+ desc 'addkey [~/.ssh/id_rsa]', 'Add additional ssh-key'
46
+ long_desc <<-LONGDESC
47
+ Adds an additional ssh key to the ssh-agent.
48
+ Needs the absolute path to key as an argument
49
+ or uses ~/.ssh/id_rsa if none provided
50
+
51
+ > $ pygmy addkey [~/.ssh/other_key]
52
+ LONGDESC
53
+ def addkey(key = "$HOME/.ssh/id_rsa")
54
+ add_ssh_key(key)
55
+ end
56
+
57
+ desc 'version', 'Check current installed version of pygmy'
58
+ def version
59
+ puts "Pygmy - Version: #{Pygmy::VERSION}"
60
+ end
61
+
62
+ desc 'restart', 'Stop and restart all pygmy services'
63
+ long_desc <<-LONGDESC
64
+ Stop and restart pygmy services (dnsmasq, resolv)
65
+
66
+ > $ pygmy restart [-d|--destroy]
67
+ LONGDESC
68
+ option :destroy, type: :boolean, aliases: 'd', default: false
69
+ def restart
70
+ exec_down(options)
71
+ exec_up(options)
72
+ end
73
+
74
+ desc 'status', 'Report status of the pygmy services'
75
+ long_desc <<-LONGDESC
76
+ Checks the current status of the services managed by pygmy.
77
+ This includes dnsmasq, and resolv
78
+
79
+ > $ pygmy status
80
+ LONGDESC
81
+ def status
82
+ exec_status(options)
83
+ end
84
+
85
+ private
86
+
87
+
88
+ def exec_up(options)
89
+
90
+ if Pygmy::Dnsmasq.start
91
+ puts "Successfully started dnsmasq".green
92
+ else
93
+ puts "Error starting dnsmasq".red
94
+ end
95
+
96
+ if Pygmy::Haproxy.start
97
+ puts "Successfully started haproxy".green
98
+ else
99
+ puts "Error starting haproxy".red
100
+ end
101
+
102
+ if Pygmy::SshAgent.start
103
+ puts "Successfully started ssh-agent".green
104
+ else
105
+ puts "Error starting ssh-agent".red
106
+ end
107
+
108
+ if Pygmy::SshAgentAddKey.add_ssh_key
109
+ puts "Successfully injected ssh key".green
110
+ else
111
+ puts "Error injected ssh key".red
112
+ end
113
+
114
+ if Pygmy::Resolv.configure
115
+ puts "Successfully configured local resolver".green
116
+ else
117
+ puts "Error configuring local resolver".red
118
+ end
119
+ end
120
+
121
+ def exec_status(_options)
122
+
123
+ if Pygmy::Dnsmasq.running?
124
+ puts "[*] Dnsmasq: Running as docker container #{Pygmy::Dnsmasq.container_name}".green
125
+ else
126
+ puts "[*] Dnsmasq is not running".red
127
+ end
128
+
129
+ if Pygmy::SshAgent.running?
130
+ puts "[*] ssh-agent: Running as docker container #{Pygmy::Haproxy.container_name}".green
131
+ else
132
+ puts "[*] ssh-agent is not running".red
133
+ end
134
+
135
+ if Pygmy::Dnsmasq.running?
136
+ puts "[*] Dnsmasq: Running as docker container #{Pygmy::Dnsmasq.container_name}".green
137
+ else
138
+ puts "[*] Dnsmasq is not running".red
139
+ end
140
+
141
+ if Pygmy::Resolv.has_our_nameserver?
142
+ puts "[*] Resolv: configured with #{Pygmy::Resolv.file_nameserver_line}".green
143
+ else
144
+ puts "[*] Resolv is not configured".red
145
+ end
146
+ end
147
+
148
+
149
+ def add_ssh_key(key)
150
+
151
+ if Pygmy::SshAgent.running?
152
+ if Pygmy::SshAgentAddKey.add_ssh_key(key)
153
+ puts "Successfully added ssh key".green
154
+ else
155
+ puts "Error added ssh key".red
156
+ end
157
+ else
158
+ puts "ssh-agent is not running, cannot add key".red
159
+ end
160
+
161
+ end
162
+
163
+ def exec_down(options)
164
+ if Pygmy::Resolv.clean
165
+ puts "nameserver removed from resolv file".green
166
+ else
167
+ puts "Unable to remove nameserver from resolv file".red
168
+ end
169
+
170
+ if Pygmy::Dnsmasq.stop
171
+ puts "Dnsmasq container stopped".green
172
+ if options[:destroy]
173
+ if Pygmy::Dnsmasq.delete
174
+ puts "Dnsmasq container successfully deleted".green
175
+ else
176
+ puts "Dnsmasq container failed to delete".red
177
+ end
178
+ end
179
+ else
180
+ puts "Dnsmasq container failed to stop".red
181
+ end
182
+
183
+ if Pygmy::SshAgent.stop
184
+ puts "ssh-agent container stopped".green
185
+ if options[:destroy]
186
+ if Pygmy::SshAgent.delete
187
+ puts "ssh-agent container successfully deleted".green
188
+ else
189
+ puts "ssh-agent container failed to delete".red
190
+ end
191
+ end
192
+ else
193
+ puts "ssh-agent container failed to stop".red
194
+ end
195
+
196
+ if Pygmy::Haproxy.stop
197
+ puts "Haproxy container stopped".green
198
+ if options[:destroy]
199
+ if Pygmy::Haproxy.delete
200
+ puts "Haproxy container successfully deleted".green
201
+ else
202
+ puts "Haproxy container failed to delete".red
203
+ end
204
+ end
205
+ else
206
+ puts "Haproxy container failed to stop".red
207
+ end
208
+
209
+ end
210
+ end
211
+
212
+ aliases = {
213
+ 'start' => 'up',
214
+ 'stop' => 'down',
215
+ }
216
+
217
+ if !ARGV.empty? && %w[-v --version].include?(ARGV.first)
218
+ puts "Pygmy - Version: #{Pygmy::VERSION}"
219
+ else
220
+ PygmyBin.start(ARGV.map { |a| aliases.keys.include?(a) ? aliases[a] : a })
221
+ end
@@ -0,0 +1,28 @@
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=#{Shellwords.escape(self.container_name)} " \
25
+ "--cap-add=NET_ADMIN #{Shellwords.escape(self.image_name)} -A /#{Shellwords.escape(domain)}/#{Shellwords.escape(addr)}"
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,60 @@
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 running?(container_name = self.container_name)
22
+ !!(self.ps =~ /#{container_name}/)
23
+ end
24
+
25
+ def container_exists?(container_name = self.container_name)
26
+ !!(self.ps(all: true) =~ /#{container_name}/)
27
+ end
28
+
29
+ def ps(all: false)
30
+ cmd = "docker ps#{all ? ' -a' : ''}"
31
+ ret = Sh.run_command(cmd)
32
+ if ret.success?
33
+ return ret.stdout
34
+ else
35
+ raise RuntimeError.new("Failure running command '#{cmd}'")
36
+ end
37
+ end
38
+
39
+ def has_docker_client?
40
+ Sh.run_command('which docker').success?
41
+ end
42
+
43
+ def stop(container_name = self.container_name)
44
+ Sh.run_command("docker kill #{Shellwords.escape(container_name)}") if self.running?
45
+ !self.running?
46
+ end
47
+
48
+ def delete(container_name = self.container_name)
49
+ if self.container_exists?
50
+ self.stop if self.running?
51
+ Sh.run_command("docker rm #{Shellwords.escape(container_name)}")
52
+ end
53
+ !self.container_exists?
54
+ end
55
+
56
+ def start_cmd
57
+ "docker start #{Shellwords.escape(self.container_name)}"
58
+ end
59
+ end
60
+ 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,33 @@
1
+ module InstVarsToHash
2
+ def to_s
3
+ to_h.to_s
4
+ end
5
+
6
+ def to_h
7
+ retval = {}
8
+ instance_variables.each do |iv|
9
+ retval[iv.to_s.delete('@').to_sym] = elem_to_h(instance_variable_get(iv))
10
+ end
11
+ retval
12
+ end
13
+
14
+ private
15
+
16
+ def expandable_classes
17
+ [ InstVarsToHash ]
18
+ end
19
+
20
+ def expandable_to_hash(klass)
21
+ expandable_classes.any?{ |k| klass == k || klass < k }
22
+ end
23
+
24
+ def elem_to_h(elem)
25
+ if elem.class == Array
26
+ elem.map { |el| elem_to_h(el) }
27
+ elsif expandable_to_hash(elem.class)
28
+ elem.to_h
29
+ else
30
+ elem
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,53 @@
1
+ module Dory
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,87 @@
1
+ require 'colorize'
2
+
3
+ module Pygmy
4
+ module Resolv
5
+ def self.common_resolv_file
6
+ '/etc/resolv.conf'
7
+ end
8
+
9
+ def self.ubuntu_resolv_file
10
+ #'/etc/resolvconf/resolv.conf.d/base'
11
+ # For now, use the common_resolv_file
12
+ self.common_resolv_file
13
+ end
14
+
15
+ def self.file_comment
16
+ '# added by pygmy'
17
+ end
18
+
19
+ def self.nameserver
20
+ "127.0.0.1"
21
+ end
22
+
23
+ def self.file_nameserver_line
24
+ "nameserver #{self.nameserver}"
25
+ end
26
+
27
+ def self.nameserver_contents
28
+ "#{self.file_nameserver_line} #{self.file_comment}"
29
+ end
30
+
31
+ def self.resolv_file
32
+ if Linux.ubuntu?
33
+ return self.ubuntu_resolv_file if Linux.ubuntu?
34
+ elsif Linux.fedora? || Linux.arch? || File.exist?(self.common_resolv_file)
35
+ return self.common_resolv_file
36
+ else
37
+ raise RuntimeError.new(
38
+ "Unable to determine location of resolv file"
39
+ )
40
+ end
41
+ end
42
+
43
+ def self.configure
44
+ # we want to be the first nameserver in the list for performance reasons
45
+ # we only want to add the nameserver if it isn't already there
46
+ prev_conts = self.resolv_file_contents
47
+ unless self.contents_has_our_nameserver?(prev_conts)
48
+ if prev_conts =~ /nameserver/
49
+ prev_conts.sub!(/nameserver/, "#{self.nameserver_contents}\nnameserver")
50
+ else
51
+ prev_conts = "#{prev_conts}\n#{self.nameserver_contents}"
52
+ end
53
+ prev_conts.gsub!(/\s+$/, '')
54
+ self.write_to_file(prev_conts)
55
+ end
56
+ self.has_our_nameserver?
57
+ end
58
+
59
+ def self.clean
60
+ prev_conts = self.resolv_file_contents
61
+ if self.contents_has_our_nameserver?(prev_conts)
62
+ prev_conts.gsub!(/#{Regexp.escape(self.nameserver_contents + "\n")}/, '')
63
+ prev_conts.gsub!(/\s+$/, '')
64
+ self.write_to_file(prev_conts)
65
+ end
66
+ !self.has_our_nameserver?
67
+ end
68
+
69
+ def self.write_to_file(contents)
70
+ # have to use this hack cuz we don't run as root :-(
71
+ puts "Requesting sudo to write to #{self.resolv_file}".green
72
+ Bash.run_command("echo -e '#{contents}' | sudo tee #{Shellwords.escape(self.resolv_file)} >/dev/null")
73
+ end
74
+
75
+ def self.resolv_file_contents
76
+ File.read(self.resolv_file)
77
+ end
78
+
79
+ def self.has_our_nameserver?
80
+ self.contents_has_our_nameserver?(self.resolv_file_contents)
81
+ end
82
+
83
+ def self.contents_has_our_nameserver?(contents)
84
+ !!((contents =~ /#{self.file_comment}/) || (contents =~ /#{self.file_nameserver_line}/))
85
+ end
86
+ end
87
+ 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,20 @@
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 = "$HOME/.ssh/id_rsa")
12
+ system("docker run --rm -it " \
13
+ "--volume=#{key}:/#{key} " \
14
+ "--volumes-from=amazeeio-ssh-agent " \
15
+ "--name=#{Shellwords.escape(self.container_name)} " \
16
+ "#{Shellwords.escape(self.image_name)} " \
17
+ "ssh-add #{key}")
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,4 @@
1
+ module Pygmy
2
+ VERSION = '0.9.1'
3
+ DATE = '2016-04-30'
4
+ end
data/lib/pygmy.rb ADDED
@@ -0,0 +1,3 @@
1
+ Gem.find_files('pygmy/**/*.rb').each do |path|
2
+ require path.gsub(/\.rb$/, '') unless path =~ /bot.*cli/
3
+ end
metadata ADDED
@@ -0,0 +1,160 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pygmy
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.1
5
+ platform: ruby
6
+ authors:
7
+ - Michael Schmid
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-04-30 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_service.rb
127
+ - lib/pygmy/haproxy.rb
128
+ - lib/pygmy/inst_vars_to_hash.rb
129
+ - lib/pygmy/linux.rb
130
+ - lib/pygmy/resolv.rb
131
+ - lib/pygmy/shell.rb
132
+ - lib/pygmy/ssh_agent.rb
133
+ - lib/pygmy/ssh_agent_add_key.rb
134
+ - lib/pygmy/version.rb
135
+ homepage: https://github.com/amazeeio/pygmy
136
+ licenses:
137
+ - MIT
138
+ metadata: {}
139
+ post_install_message:
140
+ rdoc_options: []
141
+ require_paths:
142
+ - lib
143
+ required_ruby_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ required_rubygems_version: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ requirements: []
154
+ rubyforge_project:
155
+ rubygems_version: 2.6.4
156
+ signing_key:
157
+ specification_version: 4
158
+ summary: pygmy provides the required servies to run the amazee.io Drupal local development
159
+ environment on linux.
160
+ test_files: []