beaker-docker 0.7.1 → 0.8.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: 1656bc0ada39719991d068356033f018e0e8a2d3ad36b9fb8abc7285f2bf4e0f
4
- data.tar.gz: b2207cae132edc1bf03e4b6dd0f5bf34139e30868f20e6e6f585291a72cf310e
3
+ metadata.gz: f21e88681130028d956057cc5d7e10242d3ab4b0dd3afdddc1e4a77b6a30376e
4
+ data.tar.gz: 27f935f63ebaf20d0eb18afcab7360dccdb6cc7e037cee4d6e9e3a45aed9ef33
5
5
  SHA512:
6
- metadata.gz: 9054afd2e705cd0cdf2910bb243aa4e103aa58e9575c11b23b3192fa0215d7fe90465544b679e805f89f311c337cbd5af2acf92c3d0123e93e00e23a99d8647b
7
- data.tar.gz: d5f352ca1ccc5a37ac60c76344fdcc2265fde3120f2c9c68ec963149c081b9477a490a84eaf926139274c30d27d59f3f37cefd593f17465edcc2038045ada7a2
6
+ metadata.gz: 419eee4542d7283b98c1c9e56fae980816123bd5b4f8f69920180815c0ac61d047f0a8523ac68dc091e6bff6c101d8782905ec18d8a8d571274e62588872f58d
7
+ data.tar.gz: 7aa8635232484d7b4ef171d1714ab59805cd82e1b8c0d44d70174b903805376cf08e8ce48030f33f0efeb8d4ce845b8f2ad6b0f3deeb30bef602ffa86b092387
@@ -0,0 +1,32 @@
1
+ name: Test
2
+
3
+ on:
4
+ - pull_request
5
+
6
+ jobs:
7
+ test:
8
+ runs-on: ubuntu-latest
9
+ strategy:
10
+ fail-fast: false
11
+ matrix:
12
+ ruby:
13
+ - "2.4"
14
+ - "2.5"
15
+ - "2.6"
16
+ - "2.7"
17
+ env:
18
+ BUNDLE_WITHOUT: release
19
+ name: Ruby ${{ matrix.ruby }}
20
+ steps:
21
+ - uses: actions/checkout@v2
22
+ - name: Install Ruby ${{ matrix.ruby }}
23
+ uses: ruby/setup-ruby@v1
24
+ with:
25
+ ruby-version: ${{ matrix.ruby }}
26
+ bundler-cache: true
27
+ - name: Run spec tests
28
+ run: bundle exec rake test:spec
29
+ # It seems some additonal setup of Docker may be needed for
30
+ # the acceptance tests to work.
31
+ # - name: Run acceptance tests
32
+ # run: bundle exec rake test:acceptance
data/README.md CHANGED
@@ -6,25 +6,94 @@ Beaker library to use docker hypervisor
6
6
 
7
7
  This gem that allows you to use hosts with [docker](docker.md) hypervisor with [beaker](https://github.com/puppetlabs/beaker).
8
8
 
9
- Beaker will automatically load the appropriate hypervisors for any given hosts file, so as long as your project dependencies are satisfied there's nothing else to do. No need to `require` this library in your tests.
9
+ Beaker will automatically load the appropriate hypervisors for any given hosts
10
+ file, so as long as your project dependencies are satisfied there's nothing else
11
+ to do. No need to `require` this library in your tests.
10
12
 
11
- ## With Beaker 3.x
12
-
13
- This library is included as a dependency of Beaker 3.x versions, so there's nothing to do.
14
-
15
- ## With Beaker 4.x
16
-
17
- As of Beaker 4.0, all hypervisor and DSL extension libraries have been removed and are no longer dependencies. In order to use a specific hypervisor or DSL extension library in your project, you will need to include them alongside Beaker in your Gemfile or project.gemspec. E.g.
13
+ In order to use a specific hypervisor or DSL extension library in your project,
14
+ you will need to include them alongside Beaker in your Gemfile or
15
+ project.gemspec. E.g.
18
16
 
19
17
  ~~~ruby
20
18
  # Gemfile
21
- gem 'beaker', '~>4.0'
22
- gem 'beaker-aws'
19
+ gem 'beaker', '~> 4.0'
20
+ gem 'beaker-docker'
23
21
  # project.gemspec
24
- s.add_runtime_dependency 'beaker', '~>4.0'
25
- s.add_runtime_dependency 'beaker-aws'
22
+ s.add_runtime_dependency 'beaker', '~> 4.0'
23
+ s.add_runtime_dependency 'beaker-docker'
26
24
  ~~~
27
25
 
26
+ ## Nodeset Options
27
+
28
+ The following is a sample nodeset:
29
+
30
+ ~~~yaml
31
+ HOSTS:
32
+ el8:
33
+ platform: el-8-x86_64
34
+ hypervisor: docker
35
+ image: centos:8
36
+ docker_cmd: '["/sbin/init"]'
37
+ # Run arbitrary things
38
+ docker_image_commands:
39
+ - 'touch /tmp/myfile'
40
+ dockeropts:
41
+ Labels:
42
+ thing: 'stuff'
43
+ HostConfig:
44
+ Privileged: true
45
+ el7:
46
+ platform: el-7-x86_64
47
+ hypervisor: docker
48
+ image: centos:7
49
+ # EL7 images do not support nested systemd
50
+ docker_cmd: '/usr/sbin/sshd -D -E /var/log/sshd.log'
51
+ CONFIG:
52
+ docker_cap_add:
53
+ - AUDIT_WRITE
54
+ ~~~
55
+
56
+ ## Privileged containers
57
+
58
+ Containers are **not** run in privileged mode by default for safety.
59
+
60
+ If you wish to enable privileged mode, simply set the following in your node:
61
+
62
+ ~~~yaml
63
+ dockeropts:
64
+ HostConfig:
65
+ Privileged: true
66
+ ~~~
67
+
68
+ ## Cleaning up after tests
69
+
70
+ Containers created by this plugin may not be destroyed unless the tests complete
71
+ successfully. Each container created is prefixed by `beaker-` to make filtering
72
+ for clean up easier.
73
+
74
+ A quick way to clean up all nodes is as follows:
75
+
76
+ ~~~sh
77
+ podman rm -f $( podman ps -q -f name="beaker-*" )
78
+ ~~~
79
+
80
+ # Working with `podman`
81
+
82
+ If you're using a version of `podman` that has API socket support then you
83
+ should be able to simply set `DOCKER_HOST` to your socket and connect as usual.
84
+
85
+ You also need to ensure that you're using a version of the `docker-api` gem that
86
+ supports `podman`.
87
+
88
+ You may find that not all of your tests work as expected. This will be due to
89
+ the tighter system restrictions placed on containers by `podman`. You may need
90
+ to edit the `dockeropts` hash in your nodeset to include different flags in the
91
+ `HostConfig` section.
92
+
93
+ See the
94
+ [HostConfig](https://any-api.com/docker_com/engine/docs/Definitions/HostConfig)
95
+ portion of the docker API for more information.
96
+
28
97
  # Spec tests
29
98
 
30
99
  Spec test live under the `spec` folder. There are the default rake task and therefore can run with a simple command:
@@ -34,7 +103,8 @@ bundle exec rake test:spec
34
103
 
35
104
  # Acceptance tests
36
105
 
37
- There is a simple rake task to invoke acceptance test for the library:
106
+ There is a simple rake task to invoke acceptance test for the library:
107
+
38
108
  ```bash
39
109
  bundle exec rake test:acceptance
40
110
  ```
data/Rakefile CHANGED
@@ -6,14 +6,14 @@ namespace :test do
6
6
 
7
7
  desc "Run spec tests"
8
8
  RSpec::Core::RakeTask.new(:run) do |t|
9
- t.rspec_opts = ['--color']
9
+ t.rspec_opts = ['--color', '--format documentation']
10
10
  t.pattern = 'spec/'
11
11
  end
12
12
 
13
13
  desc "Run spec tests with coverage"
14
14
  RSpec::Core::RakeTask.new(:coverage) do |t|
15
15
  ENV['BEAKER_DOCKER_COVERAGE'] = 'y'
16
- t.rspec_opts = ['--color']
16
+ t.rspec_opts = ['--color', '--format documentation']
17
17
  t.pattern = 'spec/'
18
18
  end
19
19
 
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  HOSTS:
3
- ubuntu1604-64-1:
4
- platform: ubuntu-1604-x86_64
3
+ centos8:
4
+ platform: el-8-x86_64
5
5
  hypervisor: docker
6
- image: ubuntu:16.04
6
+ image: centos:8
7
7
  roles:
8
8
  - master
9
9
  - agent
@@ -12,22 +12,24 @@ HOSTS:
12
12
  - classifier
13
13
  - default
14
14
  docker_cmd: '["/sbin/init"]'
15
+ docker_cap_add:
16
+ - AUDIT_WRITE
15
17
  dockeropts:
16
18
  Labels:
17
19
  one: '1'
18
20
  two: '2'
19
- ubuntu1604-64-2:
20
- platform: ubuntu-1604-x86_64
21
+ centos7:
22
+ platform: el-7-x86_64
21
23
  hypervisor: docker
22
- image: ubuntu:16.04
24
+ image: centos:7
23
25
  roles:
24
26
  - agent
25
- docker_cmd: '["/sbin/init"]'
27
+ docker_cmd: '/usr/sbin/sshd -D -E /var/log/sshd.log'
28
+ use_image_entrypoint: true
29
+ dockeropts:
30
+ HostConfig:
31
+ Privileged: true
26
32
  CONFIG:
27
33
  nfs_server: none
28
34
  consoleport: 443
29
35
  log_level: verbose
30
- dockeropts:
31
- Labels:
32
- one: '3'
33
- two: '4'
@@ -20,19 +20,14 @@ Gem::Specification.new do |s|
20
20
  # Testing dependencies
21
21
  s.add_development_dependency 'rspec', '~> 3.0'
22
22
  s.add_development_dependency 'rspec-its'
23
- # pin fakefs for Ruby < 2.3
24
- if RUBY_VERSION < "2.3"
25
- s.add_development_dependency 'fakefs', '~> 0.6', '< 0.14'
26
- else
27
- s.add_development_dependency 'fakefs', '~> 0.6'
28
- end
29
- s.add_development_dependency 'rake', '~> 10.1'
23
+ s.add_development_dependency 'fakefs', '~> 1.3'
24
+ s.add_development_dependency 'rake', '~> 13.0'
30
25
  s.add_development_dependency 'simplecov'
31
26
  s.add_development_dependency 'pry', '~> 0.10'
32
27
 
33
28
  # Run time dependencies
34
29
  s.add_runtime_dependency 'stringify-hash', '~> 0.0.0'
35
- s.add_runtime_dependency 'docker-api', '< 2.0.0'
30
+ s.add_runtime_dependency 'docker-api', '< 3.0.0'
36
31
 
37
32
  end
38
33
 
@@ -1,3 +1,3 @@
1
1
  module BeakerDocker
2
- VERSION = '0.7.1'
2
+ VERSION = '0.8.0'
3
3
  end
@@ -19,19 +19,25 @@ module Beaker
19
19
  default_docker_options = { :write_timeout => 300, :read_timeout => 300 }.merge(::Docker.options || {})
20
20
  # Merge docker options from the entry in hosts file
21
21
  ::Docker.options = default_docker_options.merge(@options[:docker_options] || {})
22
- # assert that the docker-api gem can talk to your docker
23
- # enpoint. Will raise if there is a version mismatch
22
+
23
+ # Ensure that we can correctly communicate with the docker API
24
24
  begin
25
- ::Docker.validate_version!
25
+ @docker_version = ::Docker.version
26
26
  rescue Excon::Errors::SocketError => e
27
- raise "Docker instance not connectable.\nError was: #{e}\nCheck your DOCKER_HOST variable has been set\nIf you are on OSX or Windows, you might not have Docker Machine setup correctly: https://docs.docker.com/machine/\n"
27
+ raise <<~ERRMSG
28
+ Docker instance not connectable
29
+ Error was: #{e}
30
+ * Check your DOCKER_HOST variable has been set
31
+ * If you are on OSX or Windows, you might not have Docker Machine setup correctly: https://docs.docker.com/machine/
32
+ * If you are using rootless podman, you might need to set up your local socket and service
33
+ ERRMSG
28
34
  end
29
35
 
30
36
  # Pass on all the logging from docker-api to the beaker logger instance
31
37
  ::Docker.logger = @logger
32
38
 
33
39
  # Find out what kind of remote instance we are talking against
34
- if ::Docker.version['Version'] =~ /swarm/
40
+ if @docker_version['Version'] =~ /swarm/
35
41
  @docker_type = 'swarm'
36
42
  unless ENV['DOCKER_REGISTRY']
37
43
  raise "Using Swarm with beaker requires a private registry. Please setup the private registry and set the 'DOCKER_REGISTRY' env var"
@@ -41,10 +47,21 @@ module Beaker
41
47
  else
42
48
  @docker_type = 'docker'
43
49
  end
44
-
45
50
  end
46
51
 
47
52
  def install_and_run_ssh(host)
53
+ def host.enable_root_login(host,opts)
54
+ logger.debug("Root login already enabled for #{host}")
55
+ end
56
+
57
+ # If the container is running ssh as its init process then this method
58
+ # will cause issues.
59
+ if host[:docker_cmd] =~ /sshd/
60
+ def host.ssh_service_restart
61
+ self[:docker_container].exec(%w(kill -1 1))
62
+ end
63
+ end
64
+
48
65
  host['dockerfile'] || host['use_image_entry_point']
49
66
  end
50
67
 
@@ -62,7 +79,6 @@ module Beaker
62
79
  '22/tcp' => [{ 'HostPort' => rand.to_s[2..5], 'HostIp' => '0.0.0.0'}]
63
80
  },
64
81
  'PublishAllPorts' => true,
65
- 'Privileged' => true,
66
82
  'RestartPolicy' => {
67
83
  'Name' => 'always'
68
84
  }
@@ -109,6 +125,45 @@ module Beaker
109
125
  { rm: true, buildargs: buildargs_for(host) })
110
126
  end
111
127
 
128
+ # Find out where the ssh port is from the container
129
+ # When running on swarm DOCKER_HOST points to the swarm manager so we have to get the
130
+ # IP of the swarm slave via the container data
131
+ # When we are talking to a normal docker instance DOCKER_HOST can point to a remote docker instance.
132
+ def get_ssh_connection_info(container)
133
+ ssh_connection_info = {
134
+ ip: nil,
135
+ port: nil
136
+ }
137
+
138
+ # Talking against a remote docker host which is a normal docker host
139
+ if @docker_type == 'docker' && ENV['DOCKER_HOST'] && !ENV.fetch('DOCKER_HOST','').include?(':///')
140
+ ip = URI.parse(ENV['DOCKER_HOST']).host
141
+ else
142
+ # Swarm or local docker host
143
+ if in_container?
144
+ ip = container.json["NetworkSettings"]["Gateway"]
145
+ else
146
+ ip = container.json["NetworkSettings"]["Ports"]["22/tcp"][0]["HostIp"]
147
+ end
148
+ end
149
+
150
+ network_settings = container.json['NetworkSettings']
151
+ host_config = container.json['HostConfig']
152
+
153
+ port = '22'
154
+ if host_config['NetworkMode'] == 'bridge' && network_settings['IPAddress'] && !network_settings['IPAddress'].empty?
155
+ ssh_connection_info[:ip] = network_settings['IPAddress']
156
+ else
157
+ port = network_settings['Ports']['22/tcp'][0]['HostPort']
158
+
159
+ # Update host metadata
160
+ ssh_connection_info[:ip] = (ip == '0.0.0.0') ? '127.0.0.1' : ip
161
+ end
162
+
163
+ ssh_connection_info[:port] = port
164
+ ssh_connection_info
165
+ end
166
+
112
167
  def provision
113
168
  @logger.notify "Provisioning docker"
114
169
 
@@ -156,7 +211,12 @@ module Beaker
156
211
  host_path = "/" + host_path.gsub(/^.\:/, host_path[/^(.)/].downcase)
157
212
  end
158
213
  a = [ host_path, mount['container_path'] ]
159
- a << mount['opts'] if mount.has_key?('opts')
214
+ if mount.has_key?('opts')
215
+ a << mount['opts'] if mount.has_key?('opts')
216
+ else
217
+ a << mount['opts'] = 'z'
218
+ end
219
+
160
220
  a.join(':')
161
221
  end
162
222
  end
@@ -171,10 +231,28 @@ module Beaker
171
231
 
172
232
  if host['docker_container_name']
173
233
  container_opts['name'] = host['docker_container_name']
234
+ else
235
+ container_opts['name'] = ['beaker', host.name, SecureRandom.uuid.split('-').last].join('-')
174
236
  end
175
237
 
176
238
  @logger.debug("Creating container from image #{image_name}")
177
- container = ::Docker::Container.create(container_opts)
239
+
240
+ ok=false
241
+ retries=0
242
+ while(!ok && (retries < 5))
243
+ container = ::Docker::Container.create(container_opts)
244
+
245
+ if (get_ssh_connection_info(container)[:port].to_i < 1024) && (Process.uid != 0)
246
+ @logger.debug("#{host} was given a port less than 1024 but you are not running as root, retrying")
247
+
248
+ container.delete
249
+
250
+ retries+=1
251
+ next
252
+ end
253
+
254
+ ok=true
255
+ end
178
256
  else
179
257
  host['use_existing_container'] = true
180
258
  end
@@ -189,36 +267,29 @@ module Beaker
189
267
  @logger.debug("Starting container #{container.id}")
190
268
  container.start
191
269
 
270
+ # Preserve the ability to talk directly to the underlying API
271
+ #
272
+ # You can use any method defined by the docker-api gem on this object
273
+ # https://github.com/swipely/docker-api
274
+ host[:docker_container] = container
275
+
276
+ ssh_connection_info = get_ssh_connection_info(container)
277
+
278
+ ip = ssh_connection_info[:ip]
279
+ port = ssh_connection_info[:port]
280
+
281
+ @logger.info("Using container connection at #{ip}:#{port}")
282
+
192
283
  if install_and_run_ssh(host)
193
284
  @logger.notify("Installing ssh components and starting ssh daemon in #{host} container")
194
285
  install_ssh_components(container, host)
195
286
  # run fixssh to configure and start the ssh service
196
287
  fix_ssh(container, host)
197
288
  end
198
- # Find out where the ssh port is from the container
199
- # When running on swarm DOCKER_HOST points to the swarm manager so we have to get the
200
- # IP of the swarm slave via the container data
201
- # When we are talking to a normal docker instance DOCKER_HOST can point to a remote docker instance.
202
-
203
- # Talking against a remote docker host which is a normal docker host
204
- if @docker_type == 'docker' && ENV['DOCKER_HOST']
205
- ip = URI.parse(ENV['DOCKER_HOST']).host
206
- else
207
- # Swarm or local docker host
208
- if in_container?
209
- ip = container.json["NetworkSettings"]["Gateway"]
210
- else
211
- ip = container.json["NetworkSettings"]["Ports"]["22/tcp"][0]["HostIp"]
212
- end
213
- end
214
-
215
- @logger.info("Using docker server at #{ip}")
216
- port = container.json["NetworkSettings"]["Ports"]["22/tcp"][0]["HostPort"]
217
289
 
218
290
  forward_ssh_agent = @options[:forward_ssh_agent] || false
219
291
 
220
- # Update host metadata
221
- host['ip'] = ip
292
+ host['ip'] = ip
222
293
  host['port'] = port
223
294
  host['ssh'] = {
224
295
  :password => root_password,
@@ -232,10 +303,12 @@ module Beaker
232
303
  host['docker_image_id'] = image.id
233
304
  host['vm_ip'] = container.json["NetworkSettings"]["IPAddress"].to_s
234
305
 
306
+ def host.reboot
307
+ @logger.warn("Rebooting containers is ineffective...ignoring")
308
+ end
235
309
  end
236
310
 
237
311
  hack_etc_hosts @hosts, @options
238
-
239
312
  end
240
313
 
241
314
  # This sideloads sshd after a container starts
@@ -244,19 +317,23 @@ module Beaker
244
317
  when /ubuntu/, /debian/
245
318
  container.exec(%w(apt-get update))
246
319
  container.exec(%w(apt-get install -y openssh-server openssh-client))
320
+ container.exec(%w(sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*))
247
321
  when /cumulus/
248
322
  container.exec(%w(apt-get update))
249
323
  container.exec(%w(apt-get install -y openssh-server openssh-client))
324
+ container.exec(%w(sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*))
250
325
  when /fedora-(2[2-9])/
251
326
  container.exec(%w(dnf clean all))
252
327
  container.exec(%w(dnf install -y sudo openssh-server openssh-clients))
253
328
  container.exec(%w(ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key))
254
329
  container.exec(%w(ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key))
330
+ container.exec(%w(sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*))
255
331
  when /^el-/, /centos/, /fedora/, /redhat/, /eos/
256
332
  container.exec(%w(yum clean all))
257
333
  container.exec(%w(yum install -y sudo openssh-server openssh-clients))
258
334
  container.exec(%w(ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key))
259
335
  container.exec(%w(ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key))
336
+ container.exec(%w(sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*))
260
337
  when /opensuse/, /sles/
261
338
  container.exec(%w(zypper -n in openssh))
262
339
  container.exec(%w(ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key))
@@ -372,71 +449,76 @@ module Beaker
372
449
  case host['platform']
373
450
  when /ubuntu/, /debian/
374
451
  service_name = "ssh"
375
- dockerfile += <<-EOF
452
+ dockerfile += <<~EOF
376
453
  RUN apt-get update
377
454
  RUN apt-get install -y openssh-server openssh-client #{Beaker::HostPrebuiltSteps::DEBIAN_PACKAGES.join(' ')}
378
- EOF
455
+ RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*
456
+ EOF
379
457
  when /cumulus/
380
- dockerfile += <<-EOF
458
+ dockerfile += <<~EOF
381
459
  RUN apt-get update
382
460
  RUN apt-get install -y openssh-server openssh-client #{Beaker::HostPrebuiltSteps::CUMULUS_PACKAGES.join(' ')}
383
- EOF
461
+ EOF
384
462
  when /fedora-(2[2-9])/
385
- dockerfile += <<-EOF
463
+ dockerfile += <<~EOF
386
464
  RUN dnf clean all
387
465
  RUN dnf install -y sudo openssh-server openssh-clients #{Beaker::HostPrebuiltSteps::UNIX_PACKAGES.join(' ')}
388
466
  RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
389
467
  RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
390
- EOF
468
+ RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*
469
+ EOF
391
470
  when /el-8/
392
- dockerfile += <<-EOF
393
- RUN yum clean all
394
- RUN yum install -y sudo openssh-server openssh-clients #{Beaker::HostPrebuiltSteps::RHEL8_PACKAGES.join(' ')}
471
+ dockerfile += <<~EOF
472
+ RUN dnf clean all
473
+ RUN dnf install -y sudo openssh-server openssh-clients #{Beaker::HostPrebuiltSteps::RHEL8_PACKAGES.join(' ')}
395
474
  RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
396
475
  RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
397
- EOF
476
+ RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*
477
+ EOF
398
478
  when /^el-/, /centos/, /fedora/, /redhat/, /eos/
399
- dockerfile += <<-EOF
479
+ dockerfile += <<~EOF
400
480
  RUN yum clean all
401
481
  RUN yum install -y sudo openssh-server openssh-clients #{Beaker::HostPrebuiltSteps::UNIX_PACKAGES.join(' ')}
402
482
  RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
403
483
  RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
404
- EOF
484
+ RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*
485
+ EOF
405
486
  when /opensuse/, /sles/
406
- dockerfile += <<-EOF
487
+ dockerfile += <<~EOF
407
488
  RUN zypper -n in openssh #{Beaker::HostPrebuiltSteps::SLES_PACKAGES.join(' ')}
408
489
  RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
409
490
  RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
410
491
  RUN sed -ri 's/^#?UsePAM .*/UsePAM no/' /etc/ssh/sshd_config
411
- EOF
492
+ RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*
493
+ EOF
412
494
  when /archlinux/
413
- dockerfile += <<-EOF
495
+ dockerfile += <<~EOF
414
496
  RUN pacman --noconfirm -Sy archlinux-keyring
415
497
  RUN pacman --noconfirm -Syu
416
498
  RUN pacman -S --noconfirm openssh #{Beaker::HostPrebuiltSteps::ARCHLINUX_PACKAGES.join(' ')}
417
499
  RUN ssh-keygen -A
418
500
  RUN sed -ri 's/^#?UsePAM .*/UsePAM no/' /etc/ssh/sshd_config
419
501
  RUN systemctl enable sshd
420
- EOF
502
+ EOF
421
503
  else
422
504
  # TODO add more platform steps here
423
505
  raise "platform #{host['platform']} not yet supported on docker"
424
506
  end
425
507
 
426
508
  # Make sshd directory, set root password
427
- dockerfile += <<-EOF
509
+ dockerfile += <<~EOF
428
510
  RUN mkdir -p /var/run/sshd
429
511
  RUN echo root:#{root_password} | chpasswd
430
- EOF
512
+ EOF
431
513
 
432
514
  # Configure sshd service to allowroot login using password
433
515
  # Also, disable reverse DNS lookups to prevent every. single. ssh
434
516
  # operation taking 30 seconds while the lookup times out.
435
- dockerfile += <<-EOF
517
+ dockerfile += <<~EOF
436
518
  RUN sed -ri 's/^#?PermitRootLogin .*/PermitRootLogin yes/' /etc/ssh/sshd_config
437
519
  RUN sed -ri 's/^#?PasswordAuthentication .*/PasswordAuthentication yes/' /etc/ssh/sshd_config
438
520
  RUN sed -ri 's/^#?UseDNS .*/UseDNS no/' /etc/ssh/sshd_config
439
- EOF
521
+ EOF
440
522
 
441
523
 
442
524
  # Any extra commands specified for the host