pero 0.1.6 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f970d0b7869fb40c3e86c2946655bd523971901322cf0e290647c2dbe0115a1b
4
- data.tar.gz: f2a7c166a9feff206398f8e7dad567c24860cd7613f06a1f2a81f3ff6c9f55ac
3
+ metadata.gz: 17794a1ffa026b662d06b36840a883a434823c791db1839ef1efba8306238a63
4
+ data.tar.gz: af2d15aa1377be5af99b1769c6690adeddba106b51e62eaf20e778566df6a96b
5
5
  SHA512:
6
- metadata.gz: 28ca76f64521f7529d63cb1c7bfd0ab2747ade30d3f0cbe247f6793a45e6c147e677086e896d925bd1fc2401d74bb1265bdd63c88dcd5c801d2c03496834fba0
7
- data.tar.gz: fc59ba398210e11a801cafa509eb81c8db0dcb6e3837b78562a021f0face8741935ecff2b2d5cac021bd5940612524a3ff5a6d18197022bfb2e181a27aba098f
6
+ metadata.gz: 372e94f0f02059e076ebbbf7976ecc188b9f22a983c6fe0cd788e899f3536c0c99a1728d33df080458b7e21bd7207f5df9d547a373837d19da25da6544d43388
7
+ data.tar.gz: 7a4baefe02de81bc4551777fcc785ad1332bf2ee7ede50fd5c1d682dfcb1f5479a32221ccec31c9bae6085964da96d93dafac11c5fce716cd509b4115f4641e1
data/.gitignore CHANGED
@@ -6,3 +6,4 @@ run
6
6
  yaml
7
7
  log
8
8
  pkg
9
+ Gemfile.lock
data/Rakefile CHANGED
@@ -4,3 +4,8 @@ require "rspec/core/rake_task"
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
6
  task :default => :spec
7
+
8
+ task :build_docker do
9
+ puts `docker build -f ./misc/Dockerfile -t pyama/puppet:3.0.1 .`
10
+ puts `docker push pyama/puppet:3.0.1`
11
+ end
@@ -20,6 +20,7 @@ module Pero
20
20
  option :user, type: :string, aliases: ['-x'], desc: "ssh user"
21
21
  option :key, type: :string, aliases: ['-i'], desc: "ssh private key"
22
22
  option :port, type: :numeric, aliases: ['-p'], desc: "ssh port"
23
+ option "timeout", default: 10, type: :numeric, desc: "ssh connect timeout"
23
24
  option :ssh_config, type: :string, desc: "ssh config path"
24
25
  option :environment, type: :string, desc: "puppet environment"
25
26
  option :ask_password, type: :boolean, default: false, desc: "ask ssh or sudo password"
@@ -30,23 +31,47 @@ module Pero
30
31
 
31
32
  desc "versions", "show support version"
32
33
  def versions
33
- Pero::Puppet::Redhat.show_versions
34
+ begin
35
+ Pero::Puppet::Redhat.show_versions
36
+ rescue => e
37
+ Pero.log.error e.inspect
38
+ end
34
39
  end
35
40
 
36
41
  desc "apply", "puppet apply"
37
42
  shared_options
38
- option "server-version", type: :string, default: "6.12.0"
43
+ option "server-version", type: :string
44
+ option "image-name", type: :string
39
45
  option :noop, aliases: '-n', default: false, type: :boolean
46
+ option :test, aliases: '-t', default: false, type: :boolean
40
47
  option :verbose, aliases: '-v', default: true, type: :boolean
41
48
  option :tags, default: nil, type: :array
49
+ option :volumes, default: nil, type: :array
42
50
  option "one-shot", default: false, type: :boolean, desc: "stop puppet server after run"
43
51
  def apply(name_regexp)
44
- nodes = Pero::History.search(name_regexp)
45
- return unless nodes
46
- Parallel.each(nodes, in_process: options["concurrent"]) do |n|
47
- opt = n["last_options"].merge(options)
48
- puppet = Pero::Puppet.new(opt["host"], opt)
49
- puppet.apply
52
+
53
+ if !options["image-name"] && !options["server-version"]
54
+ Pero.log.error "image-name or server-version are required"
55
+ return
56
+ end
57
+
58
+ begin
59
+ prepare
60
+ nodes = Pero::History.search(name_regexp)
61
+ return unless nodes
62
+ Parallel.each(nodes, in_process: options["concurrent"]) do |n|
63
+ opt = n["last_options"].merge(options)
64
+ opt["environment"] = "production" if opt["environment"].empty?
65
+ if options["image-name"]
66
+ opt.delete("server-version")
67
+ else
68
+ opt.delete("image-name")
69
+ end
70
+ puppet = Pero::Puppet.new(opt["host"], opt)
71
+ puppet.apply
72
+ end
73
+ rescue => e
74
+ Pero.log.error e.inspect
50
75
  end
51
76
  end
52
77
 
@@ -55,10 +80,24 @@ module Pero
55
80
  option "agent-version", type: :string
56
81
  option "node-name", aliases: '-N', default: "", type: :string, desc: "json node name(default hostname)"
57
82
  def bootstrap(*hosts)
58
- Parallel.each(hosts, in_process: options["concurrent"]) do |host|
59
- next if host =~ /^-/
60
- puppet = Pero::Puppet.new(host, options)
61
- puppet.install
83
+ begin
84
+ options["environment"] = "production" if options["environment"].empty?
85
+ Parallel.each(hosts, in_process: options["concurrent"]) do |host|
86
+ raise "unknown option #{host}" if host =~ /^-/
87
+ puppet = Pero::Puppet.new(host, options)
88
+
89
+ Pero.log.info "bootstrap pero #{host}"
90
+ puppet.install
91
+ end
92
+ rescue => e
93
+ Pero.log.error e.inspect
94
+ end
95
+ end
96
+
97
+ no_commands do
98
+ def prepare
99
+ `bundle install` if File.exists?("Gemfile")
100
+ `bundle exec librarian-puppet install` if File.exists?("Puppetfile")
62
101
  end
63
102
  end
64
103
  end
@@ -4,16 +4,22 @@ require "retryable"
4
4
  require 'net/https'
5
5
  module Pero
6
6
  class Docker
7
- attr_reader :server_version
8
- def initialize(version, environment)
7
+ attr_reader :server_version, :image_name, :volumes
8
+ def initialize(version, image_name, environment, volumes)
9
9
  @server_version = version
10
+ @image_name = image_name
10
11
  @environment = environment
12
+ @volumes = volumes
11
13
  end
12
14
 
13
15
  def build
14
16
  Pero.log.info "start build container"
15
17
  begin
16
- image = ::Docker::Image.build(docker_file)
18
+ image = if image_name
19
+ ::Docker::Image.create('fromImage' => image_name)
20
+ else
21
+ ::Docker::Image.build(docker_file)
22
+ end
17
23
  rescue => e
18
24
  Pero.log.debug docker_file
19
25
  Pero.log.error "failed build container #{e.inspect}"
@@ -24,64 +30,70 @@ module Pero
24
30
  end
25
31
 
26
32
  def container_name
27
- "pero-#{server_version}-#{Digest::MD5.hexdigest(Dir.pwd)[0..5]}-#{@environment}"
33
+ "pero-#{Digest::MD5.hexdigest(Dir.pwd)[0..5]}-#{@environment}"
28
34
  end
29
35
 
30
- def alerady_run?
36
+ def find
31
37
  ::Docker::Container.all(:all => true).find do |c|
32
- c.info["Names"].first == "/#{container_name}" && c.info["State"] != "exited"
38
+ c.info["Names"].first == "/#{container_name}"
33
39
  end
34
40
  end
35
41
 
42
+ def alerady_run?
43
+ c = find
44
+ c && c.info["State"] == "running" && c
45
+ end
46
+
36
47
  def run
37
48
  ::Docker::Container.all(:all => true).each do |c|
38
49
  c.delete(:force => true) if c.info["Names"].first == "/#{container_name}"
39
50
  end
40
51
 
52
+ vols = volumes || []
53
+ vols << "#{Dir.pwd}:/etc/puppetlabs/code/environments/#{@environment}"
54
+ vols << "#{Dir.pwd}/keys:/etc/puppetlabs/puppet/eyaml/"
55
+
41
56
  container = ::Docker::Container.create({
42
57
  'name' => container_name,
43
58
  'Hostname' => 'puppet',
44
59
  'Image' => build.id,
45
60
  'ExposedPorts' => { '8140/tcp' => {} },
61
+ 'HostConfig' => {
62
+ 'Binds' => vols,
63
+ 'PortBindings' => {
64
+ '8140/tcp' => [{ 'HostPort' => "0" }],
65
+ },
66
+ },
67
+ 'Cmd' => ["bash", "-c", "rm -rf #{conf_dir}/ssl/* && #{create_ca} && #{run_cmd}"]
46
68
  })
47
69
 
48
70
  Pero.log.info "start puppet master container"
49
- container.start(
50
- 'Binds' => [
51
- "#{Dir.pwd}:/etc/puppetlabs/code/environments/#{@environment}",
52
- "#{Dir.pwd}/keys:/etc/puppetlabs/puppet/eyaml/",
53
- ],
54
- 'PortBindings' => {
55
- '8140/tcp' => [{ 'HostPort' => "0" }],
56
- },
57
- "AutoRemove" => true,
58
- )
59
-
60
- container = ::Docker::Container.all(:all => true).find do |c|
61
- c.info["Names"].first == "/#{container_name}"
62
- end
71
+ container.start
63
72
 
73
+ container = find
64
74
  raise "can't start container" unless container
65
-
66
75
  begin
67
76
  Retryable.retryable(tries: 20, sleep: 5) do
68
- https = Net::HTTP.new('localhost', container.info["Ports"].first["PublicPort"])
69
- https.use_ssl = true
70
- https.verify_mode = OpenSSL::SSL::VERIFY_NONE
71
- Pero.log.debug "start server health check"
72
- https.start {
73
- response = https.get('/')
74
- Pero.log.debug "puppet http response #{response}"
75
- }
76
- rescue => e
77
- Pero.log.debug e.inspect
78
- raise e
77
+ begin
78
+ https = Net::HTTP.new('localhost', container.info["Ports"].first["PublicPort"])
79
+ https.use_ssl = true
80
+ https.verify_mode = OpenSSL::SSL::VERIFY_NONE
81
+ Pero.log.debug "start server health check"
82
+ https.start {
83
+ response = https.get('/')
84
+ Pero.log.debug "puppet http response #{response}"
85
+ }
86
+ rescue => e
87
+ Pero.log.debug e.inspect
88
+ raise e
89
+ end
79
90
  end
80
91
  rescue
81
- container.kill
92
+ Pero.log.error "can't start container.please check [ docker logs #{container.info["id"]} ]"
93
+ container = find
94
+ container.kill if container && container.info["State"] != "exited"
82
95
  raise "can't start puppet server"
83
96
  end
84
-
85
97
  container
86
98
  end
87
99
 
@@ -102,15 +114,28 @@ EOS
102
114
 
103
115
 
104
116
  end
117
+
118
+ def conf_dir
119
+ if Gem::Version.new("4.0.0") > Gem::Version.new(server_version)
120
+ "/etc/puppet"
121
+ elsif Gem::Version.new("5.0.0") > Gem::Version.new(server_version) && Gem::Version.new("4.0.0") <= Gem::Version.new(server_version)
122
+ "/etc/puppetlabs/puppet/"
123
+ elsif Gem::Version.new("6.0.0") > Gem::Version.new(server_version)&& Gem::Version.new("5.0.0") <= Gem::Version.new(server_version)
124
+ "/etc/puppetlabs/puppet/"
125
+ else
126
+ "/etc/puppetlabs/puppet/"
127
+ end
128
+ end
129
+
105
130
  def docker_file
106
- release_package,package_name, conf_dir = if Gem::Version.new("4.0.0") > Gem::Version.new(server_version)
107
- ["puppetlabs-release-el-#{el}.noarch.rpm", "puppet-server", "/etc/puppet"]
131
+ release_package,package_name = if Gem::Version.new("4.0.0") > Gem::Version.new(server_version)
132
+ ["puppetlabs-release-el-#{el}.noarch.rpm", "puppet-server"]
108
133
  elsif Gem::Version.new("5.0.0") > Gem::Version.new(server_version) && Gem::Version.new("4.0.0") <= Gem::Version.new(server_version)
109
- ["puppetlabs-release-pc1-el-#{el}.noarch.rpm", "puppetserver", "/etc/puppetlabs/puppet/"]
134
+ ["puppetlabs-release-pc1-el-#{el}.noarch.rpm", "puppetserver"]
110
135
  elsif Gem::Version.new("6.0.0") > Gem::Version.new(server_version)&& Gem::Version.new("5.0.0") <= Gem::Version.new(server_version)
111
- ["puppet5-release-el-#{el}.noarch.rpm", "puppetserver", "/etc/puppetlabs/puppet/"]
136
+ ["puppet5-release-el-#{el}.noarch.rpm", "puppetserver"]
112
137
  else
113
- ["puppet6-release-el-#{el}.noarch.rpm", "puppetserver", "/etc/puppetlabs/puppet/"]
138
+ ["puppet6-release-el-#{el}.noarch.rpm", "puppetserver"]
114
139
  end
115
140
 
116
141
  <<-EOS
@@ -120,13 +145,11 @@ rpm -ivh #{release_package}
120
145
  RUN yum install -y #{package_name}-#{server_version}
121
146
  ENV PATH $PATH:/opt/puppetlabs/bin
122
147
  RUN echo -e "#{puppet_config.split(/\n/).join("\\n")}" > #{conf_dir}/puppet.conf
123
- CMD bash -c "rm -rf #{conf_dir}/ssl/* && #{create_ca} && #{run_cmd}"
124
148
  EOS
125
149
  end
126
150
 
127
151
  def create_ca
128
152
  release_package,package_name, conf_dir = if Gem::Version.new("5.0.0") > Gem::Version.new(server_version)
129
- #'(puppet cert generate `hostname` --dns_alt_names localhost,127.0.0.1 || puppet cert --allow-dns-alt-names sign `hostname`)'
130
153
  'puppet cert generate `hostname` --dns_alt_names localhost,127.0.0.1'
131
154
  elsif Gem::Version.new("6.0.0") > Gem::Version.new(server_version)
132
155
  'puppet cert generate `hostname` --dns_alt_names localhost,127.0.0.1'
@@ -27,6 +27,7 @@ module Pero
27
27
  options["node-name"]
28
28
  end
29
29
  options.delete("noop")
30
+ options.delete("tags")
30
31
  @h = {
31
32
  name: name,
32
33
  last_options: options
@@ -53,6 +53,7 @@ module Pero
53
53
  opts[:password] = @options["password"] if @options["password"]
54
54
  opts[:keys] = [@options["key"]] if @options["key"]
55
55
  opts[:port] = @options["port"] if @options["port"]
56
+ opts[:timeout] = @options["timeout"] if @options["timeout"]
56
57
 
57
58
  if @options["vagrant"]
58
59
  config = Tempfile.new('', Dir.tmpdir)
@@ -78,7 +79,6 @@ module Pero
78
79
  end
79
80
 
80
81
  def install
81
- Pero.log.info "bootstrap pero"
82
82
  osi = specinfra.os_info
83
83
  os = case osi[:family]
84
84
  when "redhat"
@@ -101,12 +101,14 @@ module Pero
101
101
  if @options["one-shot"]
102
102
  Pero.log.info "stop puppet master container"
103
103
  container.kill
104
+ else
105
+ Pero.log.info "puppet master container keep running"
104
106
  end
105
107
  end
106
108
  end
107
109
 
108
110
  def run_container
109
- docker = Pero::Docker.new(@options["server-version"], @options["environment"])
111
+ docker = Pero::Docker.new(@options["server-version"], @options["image-name"], @options["environment"], @options["volumes"])
110
112
  docker.alerady_run? || docker.run
111
113
  end
112
114
 
@@ -121,11 +123,13 @@ module Pero
121
123
  mkdir -p `puppet config print ssldir` && mount --bind /tmp/puppet/#{tmpdir} `puppet config print ssldir` && \
122
124
  #{puppet_cmd}'"
123
125
  Pero.log.debug "run cmd:#{cmd}"
124
- ssh.exec!(specinfra.build_command(cmd)) do |channel, stream, data|
125
- Pero.log.info "#{host}:#{data.chomp}" if stream == :stdout && data.chomp != ""
126
- Pero.log.warn "#{host}:#{data.chomp}" if stream == :stderr && data.chomp != ""
127
- end
128
- ssh.exec!(specinfra.build_command("rm -rf /tmp/puppet/#{tmpdir}")) if @options["one-shot"]
126
+ ssh_exec(ssh, host, cmd)
127
+
128
+ if @options["one-shot"]
129
+ cmd = "/bin/rm -rf /tmp/puppet/#{tmpdir}"
130
+ ssh_exec(ssh, host, cmd)
131
+ end
132
+
129
133
  ssh.loop {true} if ENV['PERO_DEBUG']
130
134
  end
131
135
  rescue => e
@@ -136,17 +140,35 @@ module Pero
136
140
  Pero::History::Attribute.new(specinfra, @options).save
137
141
  end
138
142
 
143
+ def ssh_exec(ssh, host, cmd)
144
+ ssh.open_channel do |ch|
145
+ ch.request_pty
146
+ ch.on_data do |ch,data|
147
+ Pero.log.info "#{host}:#{data.chomp}"
148
+ end
149
+
150
+ ch.on_extended_data do |c,type,data|
151
+ Pero.log.error "#{host}:#{data.chomp}"
152
+ end
153
+
154
+ ch.exec specinfra.build_command(cmd) do |ch, success|
155
+ raise "could not execute #{cmd}" unless success
156
+ end
157
+ end
158
+ ssh.loop
159
+ end
160
+
139
161
  def puppet_cmd
140
162
  if Gem::Version.new("5.0.0") > Gem::Version.new(@options["agent-version"])
141
- "puppet agent --no-daemonize --onetime #{parse_puppet_option(@options)} --server localhost"
163
+ "puppet agent --no-daemonize --onetime #{parse_puppet_option(@options)} --ca_port 8140 --ca_server localhost --masterport 8140 --server localhost"
142
164
  else
143
- "/opt/puppetlabs/bin/puppet agent --no-daemonize --onetime #{parse_puppet_option(@options)} --server localhost"
165
+ "/opt/puppetlabs/bin/puppet agent --no-daemonize --onetime #{parse_puppet_option(@options)} --ca_server localhost --masterport 8140 --server localhost"
144
166
  end
145
167
  end
146
168
 
147
169
  def parse_puppet_option(options)
148
170
  ret = ""
149
- %w(noop verbose).each do |n|
171
+ %w(noop verbose test).each do |n|
150
172
  ret << " --#{n}" if options[n]
151
173
  end
152
174
  ret << " --tags #{options["tags"].join(",")}" if options["tags"]
@@ -1,3 +1,3 @@
1
1
  module Pero
2
- VERSION = "0.1.6"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -0,0 +1,11 @@
1
+ FROM centos:6
2
+ RUN yum -y install curl epel-release
3
+ RUN rpm -ivh https://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-12.noarch.rpm
4
+ RUN curl -O http://software.exogeni.net/repo/puppet/6/products/x86_64/puppet-server-3.0.1-1.el6.noarch.rpm && \
5
+ curl -O http://software.exogeni.net/repo/puppet/6/products/x86_64/puppet-3.0.1-1.el6.noarch.rpm && \
6
+ yum -y install puppet-3.0.1-1.el6.noarch.rpm puppet-server-3.0.1-1.el6.noarch.rpm
7
+ RUN mkdir -p /etc/puppetlabs/code/environments/production
8
+
9
+ RUN echo -e "[master]\nvardir= /var/puppet\nmanifestdir = /var/puppet/data/manifests\n templatedir = /var/puppet/data/templates\n modulepath = /var/puppet/data/modules:/var/puppet/data/roles:/var/puppet/data/vendor/modules\nlogdir = /var/log/puppet\n rundir = /var/run/puppet\n ssldir = /var/puppet/ssl\n" > /etc/puppet/puppet.conf
10
+
11
+ CMD bash -c "rm -rf /etc/puppet/ssl/* && puppet cert generate `hostname` --dns_alt_names localhost,127.0.0.1 && echo '*' > /etc/puppet/autosign.conf && puppet master --no-daemonize --verbose"
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
30
30
  spec.add_dependency 'retryable'
31
31
  spec.add_dependency 'specinfra'
32
32
  spec.add_dependency 'parallel'
33
- spec.add_development_dependency "bundler", "~> 1.17"
34
- spec.add_development_dependency "rake", "~> 10.0"
33
+ spec.add_development_dependency "bundler"
34
+ spec.add_development_dependency "rake"
35
35
  spec.add_development_dependency "rspec", "~> 3.0"
36
36
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pero
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - pyama86
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-08-25 00:00:00.000000000 Z
11
+ date: 2020-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -112,30 +112,30 @@ dependencies:
112
112
  name: bundler
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - "~>"
115
+ - - ">="
116
116
  - !ruby/object:Gem::Version
117
- version: '1.17'
117
+ version: '0'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - "~>"
122
+ - - ">="
123
123
  - !ruby/object:Gem::Version
124
- version: '1.17'
124
+ version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: rake
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - "~>"
129
+ - - ">="
130
130
  - !ruby/object:Gem::Version
131
- version: '10.0'
131
+ version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - "~>"
136
+ - - ">="
137
137
  - !ruby/object:Gem::Version
138
- version: '10.0'
138
+ version: '0'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: rspec
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -160,7 +160,6 @@ extra_rdoc_files: []
160
160
  files:
161
161
  - ".gitignore"
162
162
  - Gemfile
163
- - Gemfile.lock
164
163
  - LICENSE.txt
165
164
  - README.md
166
165
  - Rakefile
@@ -179,6 +178,7 @@ files:
179
178
  - lib/pero/puppet/redhat.rb
180
179
  - lib/pero/ssh_executable.rb
181
180
  - lib/pero/version.rb
181
+ - misc/Dockerfile
182
182
  - pero.gemspec
183
183
  homepage: https://github.com/pyama86/pero
184
184
  licenses:
@@ -199,7 +199,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
199
199
  - !ruby/object:Gem::Version
200
200
  version: '0'
201
201
  requirements: []
202
- rubygems_version: 3.0.6
202
+ rubygems_version: 3.1.2
203
203
  signing_key:
204
204
  specification_version: 4
205
205
  summary: tool for puppet apply from our desktop.
@@ -1,61 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- pero (0.1.5)
5
- docker-api
6
- logger
7
- net-ssh
8
- parallel
9
- retryable
10
- specinfra
11
- thor
12
-
13
- GEM
14
- remote: https://rubygems.org/
15
- specs:
16
- diff-lcs (1.4.4)
17
- docker-api (1.34.2)
18
- excon (>= 0.47.0)
19
- multi_json
20
- excon (0.76.0)
21
- logger (1.4.2)
22
- multi_json (1.15.0)
23
- net-scp (3.0.0)
24
- net-ssh (>= 2.6.5, < 7.0.0)
25
- net-ssh (6.1.0)
26
- net-telnet (0.1.1)
27
- parallel (1.19.2)
28
- rake (10.5.0)
29
- retryable (3.0.5)
30
- rspec (3.9.0)
31
- rspec-core (~> 3.9.0)
32
- rspec-expectations (~> 3.9.0)
33
- rspec-mocks (~> 3.9.0)
34
- rspec-core (3.9.2)
35
- rspec-support (~> 3.9.3)
36
- rspec-expectations (3.9.2)
37
- diff-lcs (>= 1.2.0, < 2.0)
38
- rspec-support (~> 3.9.0)
39
- rspec-mocks (3.9.1)
40
- diff-lcs (>= 1.2.0, < 2.0)
41
- rspec-support (~> 3.9.0)
42
- rspec-support (3.9.3)
43
- sfl (2.3)
44
- specinfra (2.82.19)
45
- net-scp
46
- net-ssh (>= 2.7)
47
- net-telnet (= 0.1.1)
48
- sfl
49
- thor (1.0.1)
50
-
51
- PLATFORMS
52
- ruby
53
-
54
- DEPENDENCIES
55
- bundler (~> 1.17)
56
- pero!
57
- rake (~> 10.0)
58
- rspec (~> 3.0)
59
-
60
- BUNDLED WITH
61
- 1.17.3