beaker 3.37.0 → 4.0.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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +32 -1
  3. data/acceptance/lib/helpers/test_helper.rb +0 -28
  4. data/acceptance/pre_suite/subcommands/08_install_beaker.rb +1 -1
  5. data/acceptance/tests/base/dsl/helpers/host_helpers/backup_the_file_test.rb +9 -9
  6. data/acceptance/tests/base/dsl/helpers/host_helpers/create_remote_file_test.rb +106 -103
  7. data/acceptance/tests/base/dsl/helpers/host_helpers/curl_on_test.rb +2 -2
  8. data/acceptance/tests/base/dsl/helpers/host_helpers/install_package_test.rb +1 -50
  9. data/acceptance/tests/base/dsl/helpers/host_helpers/retry_on_test.rb +3 -3
  10. data/acceptance/tests/base/dsl/helpers/host_helpers/rsync_to_test.rb +71 -27
  11. data/acceptance/tests/base/dsl/helpers/host_helpers/scp_from_test.rb +3 -3
  12. data/acceptance/tests/base/dsl/helpers/host_helpers/scp_to_test.rb +3 -3
  13. data/acceptance/tests/base/host/file_test.rb +81 -0
  14. data/beaker.gemspec +6 -14
  15. data/docs/how_to/install_puppet.md +2 -0
  16. data/docs/how_to/the_beaker_dsl.md +150 -150
  17. data/docs/how_to/upgrade_from_3_to_4.md +52 -0
  18. data/lib/beaker.rb +0 -10
  19. data/lib/beaker/dsl.rb +7 -0
  20. data/lib/beaker/dsl/helpers.rb +4 -6
  21. data/lib/beaker/dsl/helpers/host_helpers.rb +10 -34
  22. data/lib/beaker/dsl/install_utils.rb +0 -5
  23. data/lib/beaker/dsl/roles.rb +1 -1
  24. data/lib/beaker/host.rb +12 -11
  25. data/lib/beaker/host/aix/file.rb +2 -2
  26. data/lib/beaker/host/aix/group.rb +1 -0
  27. data/lib/beaker/host/aix/user.rb +1 -0
  28. data/lib/beaker/host/freebsd/pkg.rb +9 -0
  29. data/lib/beaker/host/mac/group.rb +1 -0
  30. data/lib/beaker/host/mac/user.rb +8 -13
  31. data/lib/beaker/host/pswindows/file.rb +2 -2
  32. data/lib/beaker/host/pswindows/group.rb +1 -0
  33. data/lib/beaker/host/pswindows/user.rb +1 -0
  34. data/lib/beaker/host/unix/exec.rb +5 -5
  35. data/lib/beaker/host/unix/file.rb +43 -2
  36. data/lib/beaker/host/unix/group.rb +1 -0
  37. data/lib/beaker/host/unix/user.rb +1 -0
  38. data/lib/beaker/host/windows/file.rb +32 -2
  39. data/lib/beaker/host/windows/group.rb +1 -0
  40. data/lib/beaker/host/windows/user.rb +1 -0
  41. data/lib/beaker/host_prebuilt_steps.rb +0 -4
  42. data/lib/beaker/hypervisor.rb +1 -5
  43. data/lib/beaker/result.rb +4 -0
  44. data/lib/beaker/version.rb +1 -1
  45. data/spec/beaker/dsl/helpers/host_helpers_spec.rb +14 -51
  46. data/spec/beaker/dsl/wrappers_spec.rb +0 -46
  47. data/spec/beaker/host/mac/user_spec.rb +5 -8
  48. data/spec/beaker/host/unix/exec_spec.rb +1 -1
  49. data/spec/beaker/host/unix/file_spec.rb +39 -0
  50. data/spec/beaker/host/windows/file_spec.rb +55 -0
  51. data/spec/beaker/host_prebuilt_steps_spec.rb +16 -67
  52. data/spec/beaker/host_spec.rb +10 -14
  53. data/spec/beaker/hypervisor/hypervisor_spec.rb +1 -1
  54. metadata +47 -165
  55. data/acceptance/lib/beaker/acceptance/install_utils.rb +0 -58
  56. data/acceptance/tests/base/dsl/helpers/host_helpers/create_tmpdir_on_test.rb +0 -68
  57. data/acceptance/tests/base/dsl/install_utils/clone_git_repo_on_test.rb +0 -49
  58. data/lib/beaker/dsl/helpers/facter_helpers.rb +0 -57
  59. data/lib/beaker/dsl/install_utils/pe_defaults.rb +0 -143
  60. data/lib/beaker/dsl/install_utils/windows_utils.rb +0 -223
  61. data/spec/beaker/dsl/ezbake_utils_spec.rb +0 -279
  62. data/spec/beaker/dsl/install_utils/pe_defaults_spec.rb +0 -61
  63. data/spec/beaker/dsl/install_utils/windows_utils_spec.rb +0 -263
@@ -1,49 +0,0 @@
1
- begin
2
- $LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'lib'))
3
-
4
- require 'helpers/test_helper'
5
-
6
- require 'beaker/acceptance/install_utils'
7
- extend Beaker::Acceptance::InstallUtils
8
- end
9
-
10
- confine :except, :platform => /^solaris-10/
11
-
12
- test_name 'Clone from git' do
13
-
14
- PACKAGES = {
15
- :redhat => [
16
- 'git',
17
- ],
18
- :debian => [
19
- ['git', 'git-core'],
20
- ],
21
- :solaris_11 => [
22
- ['git', 'developer/versioning/git'],
23
- ],
24
- :solaris_10 => [
25
- 'coreutils',
26
- 'curl', # update curl to fix "CURLOPT_SSL_VERIFYHOST no longer supports 1 as value!" issue
27
- 'git',
28
- ],
29
- :windows => [
30
- 'git',
31
- ],
32
- :sles => [
33
- 'git-core',
34
- ]
35
- }
36
-
37
- install_packages_on(hosts, PACKAGES, :check_if_exists => true)
38
-
39
- # implicitly tests build_giturl() and lookup_in_env()
40
- hosts.each do |host|
41
- on host, "echo #{GitHubSig} >> $HOME/.ssh/known_hosts"
42
- testdir = tmpdir_on(host, File.basename(__FILE__))
43
-
44
- step 'should be able to successfully clone a git repo' do
45
- results = clone_git_repo_on(host, "#{testdir}", extract_repo_info_from(build_git_url('hiera')))
46
- assert_match( %r{From.*github\.com[:/]puppetlabs/hiera}, result.output, 'Did not find clone')
47
- end
48
- end
49
- end
@@ -1,57 +0,0 @@
1
- module Beaker
2
- module DSL
3
- module Helpers
4
- # Methods that help you interact with your facter installation, facter must be installed
5
- # for these methods to execute correctly
6
- #
7
- module FacterHelpers
8
-
9
- # @!macro [new] common_opts
10
- # @param [Hash{Symbol=>String}] opts Options to alter execution.
11
- # @option opts [Boolean] :silent (false) Do not produce log output
12
- # @option opts [Array<Fixnum>] :acceptable_exit_codes ([0]) An array
13
- # (or range) of integer exit codes that should be considered
14
- # acceptable. An error will be thrown if the exit code does not
15
- # match one of the values in this list.
16
- # @option opts [Boolean] :accept_all_exit_codes (false) Consider all
17
- # exit codes as passing.
18
- # @option opts [Boolean] :dry_run (false) Do not actually execute any
19
- # commands on the SUT
20
- # @option opts [String] :stdin (nil) Input to be provided during command
21
- # execution on the SUT.
22
- # @option opts [Boolean] :pty (false) Execute this command in a pseudoterminal.
23
- # @option opts [Boolean] :expect_connection_failure (false) Expect this command
24
- # to result in a connection failure, reconnect and continue execution.
25
- # @option opts [Hash{String=>String}] :environment ({}) These will be
26
- # treated as extra environment variables that should be set before
27
- # running the command.
28
- #
29
-
30
- # Get a facter fact from a provided host
31
- #
32
- # @param [Host, Array<Host>, String, Symbol] host One or more hosts to act upon,
33
- # or a role (String or Symbol) that identifies one or more hosts.
34
- # @param [String] name The name of the fact to query for
35
- # @!macro common_opts
36
- #
37
- # @return String The value of the fact 'name' on the provided host
38
- # @raise [FailTest] Raises an exception if call to facter fails
39
- def fact_on(host, name, opts = {})
40
- result = on host, facter(name, opts)
41
- if result.kind_of?(Array)
42
- result.map { |res| res.stdout.chomp }
43
- else
44
- result.stdout.chomp
45
- end
46
- end
47
-
48
- # Get a facter fact from the default host
49
- # @see #fact_on
50
- def fact(name, opts = {})
51
- fact_on(default, name, opts)
52
- end
53
-
54
- end
55
- end
56
- end
57
- end
@@ -1,143 +0,0 @@
1
- module Beaker
2
- module DSL
3
- module InstallUtils
4
- #
5
- # This module contains default values for pe paths and directorys per-platform
6
- #
7
- module PEDefaults
8
-
9
- #Here be the pathing and default values for PE installs
10
- #
11
- PE_DEFAULTS = {
12
- 'mac' => {
13
- 'puppetserver-confdir' => '/etc/puppetlabs/puppetserver/conf.d',
14
- 'puppetservice' => 'pe-puppetserver',
15
- 'puppetpath' => '/etc/puppetlabs/puppet',
16
- 'puppetconfdir' => '/etc/puppetlabs/puppet',
17
- 'puppetcodedir' => '/etc/puppetlabs/puppet',
18
- 'puppetbin' => '/opt/puppet/bin/puppet',
19
- 'puppetbindir' => '/opt/puppet/bin',
20
- 'puppetsbindir' => '/opt/puppet/sbin',
21
- 'puppetvardir' => '/var/opt/lib/pe-puppet',
22
- 'hieradatadir' => '/var/lib/hiera',
23
- 'hieraconf' => '/etc/puppetlabs/puppet/hiera.yaml',
24
- 'distmoduledir' => '/etc/puppetlabs/puppet/modules',
25
- 'sitemoduledir' => '/opt/puppet/share/puppet/modules',
26
- },
27
- 'unix' => {
28
- 'puppetserver-confdir' => '/etc/puppetlabs/puppetserver/conf.d',
29
- 'puppetservice' => 'pe-puppetserver',
30
- 'puppetpath' => '/etc/puppetlabs/puppet',
31
- 'puppetconfdir' => '/etc/puppetlabs/puppet',
32
- 'puppetbin' => '/opt/puppet/bin/puppet',
33
- 'puppetbindir' => '/opt/puppet/bin',
34
- 'puppetsbindir' => '/opt/puppet/sbin',
35
- 'privatebindir' => '/opt/puppet/bin',
36
- 'puppetvardir' => '/var/opt/lib/pe-puppet',
37
- 'hieradatadir' => '/var/lib/hiera',
38
- 'hieraconf' => '/etc/puppetlabs/puppet/hiera.yaml',
39
- 'distmoduledir' => '/etc/puppetlabs/puppet/modules',
40
- 'sitemoduledir' => '/opt/puppet/share/puppet/modules',
41
- },
42
- 'windows' => { #cygwin windows
43
- 'puppetservice' => 'pe-puppetserver',
44
- 'puppetpath' => '`cygpath -smF 35`/PuppetLabs/puppet/etc',
45
- 'puppetconfdir' => '`cygpath -smF 35`/PuppetLabs/puppet/etc',
46
- 'puppetcodedir' => '`cygpath -smF 35`/PuppetLabs/puppet/etc',
47
- 'hieraconf' => '`cygpath -smF 35`/Puppetlabs/puppet/etc/hiera.yaml',
48
- 'puppetvardir' => '`cygpath -smF 35`/PuppetLabs/puppet/var',
49
- 'distmoduledir' => '`cygpath -smF 35`/PuppetLabs/puppet/etc/modules',
50
- 'sitemoduledir' => 'C:/usr/share/puppet/modules',
51
- #let's just add both potential bin dirs to the path
52
- 'puppetbindir' => '/cygdrive/c/Program Files (x86)/Puppet Labs/Puppet Enterprise/bin:/cygdrive/c/Program Files/Puppet Labs/Puppet Enterprise/bin',
53
- 'privatebindir' => '/cygdrive/c/Program Files (x86)/Puppet Labs/Puppet Enterprise/sys/ruby/bin:/cygdrive/c/Program Files/Puppet Labs/Puppet Enterprise/sys/ruby/bin',
54
- },
55
- 'pswindows' => { #windows windows
56
- 'puppetservice' => 'pe-puppetserver',
57
- 'puppetpath' => 'C:\\ProgramData\\PuppetLabs\\puppet\\etc',
58
- 'puppetconfdir' => 'C:\\ProgramData\\PuppetLabs\\puppet\\etc',
59
- 'puppetcodedir' => 'C:\\ProgramData\\PuppetLabs\\puppet\\etc',
60
- 'hieraconf' => 'C:\\ProgramData\\PuppetLabs\\puppet\\etc\\hiera.yaml',
61
- 'distmoduledir' => 'C:\\ProgramData\\PuppetLabs\\puppet\\etc\\modules',
62
- 'sitemoduledir' => 'C:\\usr\\share\\puppet\\modules',
63
- 'puppetvardir' => 'C:\\ProgramData\\PuppetLabs\\puppet\\var',
64
- 'puppetbindir' => '"C:\\Program Files (x86)\\PuppetLabs\\Puppet Enterprise\\bin";"C:\\Program Files\\PuppetLabs\\Puppet Enterprise\\bin"'
65
- },
66
- }
67
-
68
- # Add the appropriate pe defaults to the host object so that they can be accessed using host[option], set host[:type] = pe
69
- # @param [Host] host A single host to act upon
70
- # @param [String] platform The platform type of this host, one of windows, pswindows, mac & unix
71
- def add_platform_pe_defaults(host, platform)
72
- PE_DEFAULTS[platform].each_pair do |key, val|
73
- host[key] = val
74
- end
75
- # add the type and group here for backwards compatability
76
- if host['platform'] =~ /windows/
77
- host['group'] = 'Administrators'
78
- else
79
- host['group'] = 'pe-puppet'
80
- end
81
- host['type'] = 'pe'
82
- # older pe requires a different puppetservice name, set it here on the master
83
- if host['roles'].include?('master')
84
- if host['pe_ver'] and (version_is_less(host['pe_ver'], '3.4'))
85
- host['puppetservice'] = 'pe-httpd'
86
- end
87
- end
88
- end
89
-
90
- # Add the appropriate pe defaults to an array of hosts
91
- # @param [Host, Array<Host>, String, Symbol] hosts One or more hosts to act upon,
92
- # or a role (String or Symbol) that identifies one or more hosts.
93
- def add_pe_defaults_on(hosts)
94
- block_on hosts do | host |
95
- case host.class.to_s.downcase
96
- when /aix|(free|open)bsd|unix/
97
- platform = 'unix'
98
- when /mac/
99
- platform = 'mac'
100
- when /pswindows/
101
- platform = 'pswindows'
102
- else
103
- platform = 'windows'
104
- end
105
- add_platform_pe_defaults(host, platform)
106
- end
107
- end
108
-
109
- # Remove the appropriate pe defaults from the host object so that they can no longer be accessed using host[option], set host[:type] = nil
110
- # @param [Host] host A single host to act upon
111
- # @param [String] platform The platform type of this host, one of windows, freebsd, mac & unix
112
- def remove_platform_pe_defaults(host, platform)
113
- PE_DEFAULTS[platform].each_pair do |key, val|
114
- host.delete(key)
115
- end
116
- host['group'] = nil
117
- host['type'] = nil
118
- end
119
-
120
- # Remove the appropriate pe defaults from an array of hosts
121
- # @param [Host, Array<Host>, String, Symbol] hosts One or more hosts to act upon,
122
- # or a role (String or Symbol) that identifies one or more hosts.
123
- def remove_pe_defaults_on(hosts)
124
- block_on hosts do | host |
125
- case host.class.to_s.downcase
126
- when /aix|(free|open)bsd|unix/
127
- platform = 'unix'
128
- when /mac/
129
- platform = 'mac'
130
- when /pswindows/
131
- platform = 'pswindows'
132
- else
133
- platform = 'windows'
134
- end
135
- remove_platform_pe_defaults(host, platform)
136
- end
137
- end
138
-
139
- end
140
- end
141
- end
142
- end
143
-
@@ -1,223 +0,0 @@
1
- module Beaker
2
- module DSL
3
- module InstallUtils
4
- #
5
- # This module contains methods useful for Windows installs
6
- #
7
- module WindowsUtils
8
- # Given a host, returns it's system TEMP path
9
- #
10
- # @param [Host] host An object implementing {Beaker::Hosts}'s interface.
11
- #
12
- # @return [String] system temp path
13
- def get_system_temp_path(host)
14
- host.system_temp_path
15
- end
16
- alias_method :get_temp_path, :get_system_temp_path
17
-
18
- # Generates commands to be inserted into a Windows batch file to launch an MSI install
19
- # @param [String] msi_path The path of the MSI - can be a local Windows style file path like
20
- # c:\temp\puppet.msi OR a url like https://download.com/puppet.msi or file://c:\temp\puppet.msi
21
- # @param [Hash{String=>String}] msi_opts MSI installer options
22
- # See https://docs.puppetlabs.com/guides/install_puppet/install_windows.html#msi-properties
23
- # @param [String] log_path The path to write the MSI log - must be a local Windows style file path
24
- #
25
- # @api private
26
- def msi_install_script(msi_path, msi_opts, log_path)
27
- # msiexec requires backslashes in file paths launched under cmd.exe start /w
28
- url_pattern = /^(https?|file):\/\//
29
- msi_path = msi_path.gsub(/\//, "\\") if msi_path !~ url_pattern
30
-
31
- msi_params = msi_opts.map{|k, v| "#{k}=#{v}"}.join(' ')
32
-
33
- # msiexec requires quotes around paths with backslashes - c:\ or file://c:\
34
- # not strictly needed for http:// but it simplifies this code
35
- batch_contents = <<-BATCH
36
- start /w msiexec.exe /i \"#{msi_path}\" /qn /L*V #{log_path} #{msi_params}
37
- exit /B %errorlevel%
38
- BATCH
39
- end
40
-
41
- # Given a host, path to MSI and MSI options, will create a batch file
42
- # on the host, returning the path to the randomized batch file and
43
- # the randomized log file
44
- #
45
- # @param [Host] host An object implementing {Beaker::Hosts}'s interface.
46
- # @param [String] msi_path The path of the MSI - can be a local Windows
47
- # style file path like c:\temp\puppet.msi OR a url like
48
- # https://download.com/puppet.msi or file://c:\temp\puppet.msi
49
- # @param [Hash{String=>String}] msi_opts MSI installer options
50
- # See https://docs.puppetlabs.com/guides/install_puppet/install_windows.html#msi-properties
51
- #
52
- # @api private
53
- # @return [String, String] path to the batch file, patch to the log file
54
- def create_install_msi_batch_on(host, msi_path, msi_opts)
55
- timestamp = Time.new.strftime('%Y-%m-%d_%H.%M.%S')
56
- tmp_path = host.system_temp_path
57
- tmp_path.gsub!('/', '\\')
58
-
59
- batch_name = "install-puppet-msi-#{timestamp}.bat"
60
- batch_path = "#{tmp_path}#{host.scp_separator}#{batch_name}"
61
- log_path = "#{tmp_path}\\install-puppet-#{timestamp}.log"
62
-
63
- Tempfile.open(batch_name) do |tmp_file|
64
- batch_contents = msi_install_script(msi_path, msi_opts, log_path)
65
-
66
- File.open(tmp_file.path, 'w') { |file| file.puts(batch_contents) }
67
- host.do_scp_to(tmp_file.path, batch_path, {})
68
- end
69
-
70
- return batch_path, log_path
71
- end
72
-
73
- # Given hosts construct a PATH that includes puppetbindir, facterbindir and hierabindir
74
- # @param [Host, Array<Host>, String, Symbol] hosts One or more hosts to act upon,
75
- # or a role (String or Symbol) that identifies one or more hosts.
76
- # @param [String] msi_path The path of the MSI - can be a local Windows style file path like
77
- # c:\temp\puppet.msi OR a url like https://download.com/puppet.msi or file://c:\temp\puppet.msi
78
- # @param [Hash{String=>String}] msi_opts MSI installer options
79
- # See https://docs.puppetlabs.com/guides/install_puppet/install_windows.html#msi-properties
80
- # @option msi_opts [String] INSTALLIDIR Where Puppet and its dependencies should be installed.
81
- # (Defaults vary based on operating system and intaller architecture)
82
- # Requires Puppet 2.7.12 / PE 2.5.0
83
- # @option msi_opts [String] PUPPET_MASTER_SERVER The hostname where the puppet master server can be reached.
84
- # (Defaults to puppet)
85
- # Requires Puppet 2.7.12 / PE 2.5.0
86
- # @option msi_opts [String] PUPPET_CA_SERVER The hostname where the CA puppet master server can be reached, if you are using multiple masters and only one of them is acting as the CA.
87
- # (Defaults the value of PUPPET_MASTER_SERVER)
88
- # Requires Puppet 2.7.12 / PE 2.5.0
89
- # @option msi_opts [String] PUPPET_AGENT_CERTNAME The node’s certificate name, and the name it uses when requesting catalogs. This will set a value for
90
- # (Defaults to the node's fqdn as discovered by facter fqdn)
91
- # Requires Puppet 2.7.12 / PE 2.5.0
92
- # @option msi_opts [String] PUPPET_AGENT_ENVIRONMENT The node’s environment.
93
- # (Defaults to production)
94
- # Requires Puppet 3.3.1 / PE 3.1.0
95
- # @option msi_opts [String] PUPPET_AGENT_STARTUP_MODE Whether the puppet agent service should run (or be allowed to run)
96
- # (Defaults to Manual - valid values are Automatic, Manual or Disabled)
97
- # Requires Puppet 3.4.0 / PE 3.2.0
98
- # @option msi_opts [String] PUPPET_AGENT_ACCOUNT_USER Whether the puppet agent service should run (or be allowed to run)
99
- # (Defaults to LocalSystem)
100
- # Requires Puppet 3.4.0 / PE 3.2.0
101
- # @option msi_opts [String] PUPPET_AGENT_ACCOUNT_PASSWORD The password to use for puppet agent’s user account
102
- # (No default)
103
- # Requires Puppet 3.4.0 / PE 3.2.0
104
- # @option msi_opts [String] PUPPET_AGENT_ACCOUNT_DOMAIN The domain of puppet agent’s user account.
105
- # (Defaults to .)
106
- # Requires Puppet 3.4.0 / PE 3.2.0
107
- # @option opts [Boolean] :debug output the MSI installation log when set to true
108
- # otherwise do not output log (false; default behavior)
109
- #
110
- # @example
111
- # install_msi_on(hosts, 'c:\puppet.msi', {:debug => true})
112
- #
113
- # @api private
114
- def install_msi_on(hosts, msi_path, msi_opts = {}, opts = {})
115
- block_on hosts do | host |
116
- msi_opts['PUPPET_AGENT_STARTUP_MODE'] ||= 'Manual'
117
- batch_path, log_file = create_install_msi_batch_on(host, msi_path, msi_opts)
118
-
119
- # begin / rescue here so that we can reuse existing error msg propagation
120
- begin
121
- # 1641 = ERROR_SUCCESS_REBOOT_INITIATED
122
- # 3010 = ERROR_SUCCESS_REBOOT_REQUIRED
123
- on host, Command.new("\"#{batch_path}\"", [], { :cmdexe => true }), :acceptable_exit_codes => [0, 1641, 3010]
124
- rescue
125
- on host, Command.new("type \"#{log_file}\"", [], { :cmdexe => true })
126
- raise
127
- end
128
-
129
- if opts[:debug]
130
- on host, Command.new("type \"#{log_file}\"", [], { :cmdexe => true })
131
- end
132
-
133
- if !host.is_cygwin?
134
- # HACK: for some reason, post install we need to refresh the connection to make puppet available for execution
135
- host.close
136
- end
137
-
138
- # verify service status post install
139
- # if puppet service exists, then pe-puppet is not queried
140
- # if puppet service does not exist, pe-puppet is queried and that exit code is used
141
- # therefore, this command will always exit 0 if either service is installed
142
- #
143
- # We also take advantage of this output to verify the startup
144
- # settings are honored as supplied to the MSI
145
- on host, Command.new("sc qc puppet || sc qc pe-puppet", [], { :cmdexe => true }) do |result|
146
- output = result.stdout
147
- startup_mode = msi_opts['PUPPET_AGENT_STARTUP_MODE'].upcase
148
-
149
- search = case startup_mode
150
- when 'AUTOMATIC'
151
- { :code => 2, :name => 'AUTO_START' }
152
- when 'MANUAL'
153
- { :code => 3, :name => 'DEMAND_START' }
154
- when 'DISABLED'
155
- { :code => 4, :name => 'DISABLED' }
156
- end
157
-
158
- if output !~ /^\s+START_TYPE\s+:\s+#{search[:code]}\s+#{search[:name]}/
159
- raise "puppet service startup mode did not match supplied MSI option '#{startup_mode}'"
160
- end
161
- end
162
-
163
- # (PA-514) value for PUPPET_AGENT_STARTUP_MODE should be present in
164
- # registry and honored after install/upgrade.
165
- reg_key = host.is_x86_64? ? "HKLM\\SOFTWARE\\Wow6432Node\\Puppet Labs\\PuppetInstaller" :
166
- "HKLM\\SOFTWARE\\Puppet Labs\\PuppetInstaller"
167
- reg_query_command = %Q(reg query "#{reg_key}" /v "RememberedPuppetAgentStartupMode" | findstr #{msi_opts['PUPPET_AGENT_STARTUP_MODE']})
168
- on host, Command.new(reg_query_command, [], { :cmdexe => true })
169
-
170
- # emit the misc/versions.txt file which contains component versions for
171
- # puppet, facter, hiera, pxp-agent, packaging and vendored Ruby
172
- [
173
- "\\\"%ProgramFiles%\\Puppet Labs\\puppet\\misc\\versions.txt\\\"",
174
- "\\\"%ProgramFiles(x86)%\\Puppet Labs\\puppet\\misc\\versions.txt\\\""
175
- ].each do |path|
176
- on host, Command.new("\"if exist #{path} type #{path}\"", [], { :cmdexe => true })
177
- end
178
- end
179
- end
180
-
181
- # Installs a specified msi path on given hosts
182
- # @param [Host, Array<Host>, String, Symbol] hosts One or more hosts to act upon,
183
- # or a role (String or Symbol) that identifies one or more hosts.
184
- # @param [String] msi_path The path of the MSI - can be a local Windows style file path like
185
- # c:\temp\foo.msi OR a url like https://download.com/foo.msi or file://c:\temp\foo.msi
186
- # @param [Hash{String=>String}] msi_opts MSI installer options
187
- # @option opts [Boolean] :debug output the MSI installation log when set to true
188
- # otherwise do not output log (false; default behavior)
189
- #
190
- # @example
191
- # generic_install_msi_on(hosts, 'https://releases.hashicorp.com/vagrant/1.8.4/vagrant_1.8.4.msi', {}, {:debug => true})
192
- #
193
- # @api private
194
- def generic_install_msi_on(hosts, msi_path, msi_opts = {}, opts = {})
195
- block_on hosts do | host |
196
- batch_path, log_file = create_install_msi_batch_on(host, msi_path, msi_opts)
197
-
198
- # begin / rescue here so that we can reuse existing error msg propagation
199
- begin
200
- # 1641 = ERROR_SUCCESS_REBOOT_INITIATED
201
- # 3010 = ERROR_SUCCESS_REBOOT_REQUIRED
202
- on host, Command.new("\"#{batch_path}\"", [], { :cmdexe => true }), :acceptable_exit_codes => [0, 1641, 3010]
203
- rescue
204
- on host, Command.new("type \"#{log_file}\"", [], { :cmdexe => true })
205
- raise
206
- end
207
-
208
- if opts[:debug]
209
- on host, Command.new("type \"#{log_file}\"", [], { :cmdexe => true })
210
- end
211
-
212
- if !host.is_cygwin?
213
- # HACK: for some reason, post install we need to refresh the connection to make puppet available for execution
214
- host.close
215
- end
216
-
217
- end
218
- end
219
-
220
- end
221
- end
222
- end
223
- end