chef 14.1.12-universal-mingw32 → 14.2.0-universal-mingw32

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 (178) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -6
  3. data/VERSION +1 -1
  4. data/chef.gemspec +2 -3
  5. data/lib/chef/chef_fs/data_handler/data_handler_base.rb +8 -4
  6. data/lib/chef/cookbook/manifest_v0.rb +2 -2
  7. data/lib/chef/cookbook_manifest.rb +3 -2
  8. data/lib/chef/cookbook_version.rb +3 -2
  9. data/lib/chef/guard_interpreter/default_guard_interpreter.rb +2 -2
  10. data/lib/chef/http/auth_credentials.rb +5 -3
  11. data/lib/chef/http/authenticator.rb +6 -3
  12. data/lib/chef/knife.rb +3 -6
  13. data/lib/chef/knife/configure.rb +12 -8
  14. data/lib/chef/knife/raw.rb +6 -1
  15. data/lib/chef/mixin/shell_out.rb +16 -14
  16. data/lib/chef/provider/execute.rb +4 -3
  17. data/lib/chef/provider/git.rb +1 -1
  18. data/lib/chef/provider/package/dnf.rb +5 -5
  19. data/lib/chef/provider/package/windows.rb +7 -0
  20. data/lib/chef/provider/package/yum.rb +7 -7
  21. data/lib/chef/provider/service/freebsd.rb +3 -3
  22. data/lib/chef/provider/service/init.rb +5 -5
  23. data/lib/chef/provider/service/macosx.rb +5 -4
  24. data/lib/chef/provider/service/simple.rb +4 -4
  25. data/lib/chef/provider/service/systemd.rb +13 -13
  26. data/lib/chef/provider/service/upstart.rb +3 -3
  27. data/lib/chef/provider/service/windows.rb +2 -0
  28. data/lib/chef/provider/systemd_unit.rb +4 -4
  29. data/lib/chef/provider/user.rb +18 -1
  30. data/lib/chef/provider/user/aix.rb +40 -8
  31. data/lib/chef/provider/user/dscl.rb +7 -14
  32. data/lib/chef/provider/user/linux.rb +1 -11
  33. data/lib/chef/provider/user/solaris.rb +57 -26
  34. data/lib/chef/provider/user/useradd.rb +4 -1
  35. data/lib/chef/provider/windows_task.rb +1 -0
  36. data/lib/chef/providers.rb +1 -2
  37. data/lib/chef/resource/execute.rb +4 -1
  38. data/lib/chef/resource/gem_package.rb +1 -1
  39. data/lib/chef/resource/hostname.rb +1 -1
  40. data/lib/chef/resource/sysctl.rb +3 -1
  41. data/lib/chef/resource/windows_ad_join.rb +16 -3
  42. data/lib/chef/resource_inspector.rb +13 -0
  43. data/lib/chef/run_context/cookbook_compiler.rb +1 -1
  44. data/lib/chef/server_api.rb +2 -0
  45. data/lib/chef/version.rb +1 -1
  46. data/spec/functional/mixin/shell_out_spec.rb +27 -1
  47. data/spec/functional/resource/execute_spec.rb +2 -2
  48. data/spec/functional/resource/windows_task_spec.rb +1 -1
  49. data/spec/support/shared/functional/securable_resource.rb +1 -1
  50. data/spec/support/shared/unit/execute_resource.rb +1 -1
  51. data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +3 -3
  52. data/spec/unit/chef_fs/data_handler/data_handler_base_spec.rb +65 -0
  53. data/spec/unit/cookbook/manifest_v0_spec.rb +1 -1
  54. data/spec/unit/cookbook_manifest_spec.rb +2 -0
  55. data/spec/unit/dsl/recipe_spec.rb +1 -5
  56. data/spec/unit/http/authenticator_spec.rb +33 -8
  57. data/spec/unit/mixin/shell_out_spec.rb +61 -1
  58. data/spec/unit/provider/apt_update_spec.rb +7 -7
  59. data/spec/unit/provider/execute_spec.rb +16 -15
  60. data/spec/unit/provider/git_spec.rb +3 -3
  61. data/spec/unit/provider/package/windows_spec.rb +12 -0
  62. data/spec/unit/provider/script_spec.rb +2 -2
  63. data/spec/unit/provider/service/arch_service_spec.rb +9 -9
  64. data/spec/unit/provider/service/freebsd_service_spec.rb +6 -6
  65. data/spec/unit/provider/service/init_service_spec.rb +11 -11
  66. data/spec/unit/provider/service/invokercd_service_spec.rb +9 -9
  67. data/spec/unit/provider/service/macosx_spec.rb +11 -11
  68. data/spec/unit/provider/service/openbsd_service_spec.rb +6 -6
  69. data/spec/unit/provider/service/simple_service_spec.rb +4 -4
  70. data/spec/unit/provider/service/systemd_service_spec.rb +16 -16
  71. data/spec/unit/provider/service/upstart_service_spec.rb +12 -12
  72. data/spec/unit/provider/service/windows_spec.rb +5 -0
  73. data/spec/unit/provider/systemd_unit_spec.rb +163 -118
  74. data/spec/unit/provider/user/dscl_spec.rb +2 -9
  75. data/spec/unit/provider/user/solaris_spec.rb +2 -2
  76. data/spec/unit/provider/zypper_repository_spec.rb +3 -3
  77. data/spec/unit/provider_spec.rb +1 -5
  78. data/spec/unit/resource/apt_package_spec.rb +14 -0
  79. data/spec/unit/resource/apt_preference_spec.rb +14 -1
  80. data/spec/unit/resource/apt_repository_spec.rb +12 -3
  81. data/spec/unit/resource/apt_update_spec.rb +9 -0
  82. data/spec/unit/resource/bash_spec.rb +8 -0
  83. data/spec/unit/resource/bff_package_spec.rb +51 -0
  84. data/spec/unit/resource/breakpoint_spec.rb +4 -4
  85. data/spec/unit/resource/build_essential_spec.rb +5 -1
  86. data/spec/unit/resource/cab_package_spec.rb +10 -0
  87. data/spec/unit/resource/chef_gem_spec.rb +14 -0
  88. data/spec/unit/resource/chef_handler_spec.rb +9 -4
  89. data/spec/unit/resource/chocolatey_package_spec.rb +15 -1
  90. data/spec/unit/resource/conditional_spec.rb +3 -3
  91. data/spec/unit/resource/cookbook_file_spec.rb +13 -2
  92. data/spec/unit/resource/cron_spec.rb +2 -7
  93. data/spec/unit/resource/csh_spec.rb +8 -0
  94. data/spec/unit/resource/directory_spec.rb +4 -9
  95. data/spec/unit/resource/dmg_package_spec.rb +8 -4
  96. data/spec/unit/resource/dnf_package_spec.rb +16 -1
  97. data/spec/unit/resource/dpkg_package_spec.rb +18 -0
  98. data/spec/unit/resource/dsc_resource_spec.rb +6 -6
  99. data/spec/unit/resource/dsc_script_spec.rb +39 -39
  100. data/spec/unit/resource/execute_spec.rb +20 -12
  101. data/spec/unit/resource/file_spec.rb +10 -10
  102. data/spec/unit/resource/freebsd_package_spec.rb +16 -0
  103. data/spec/unit/resource/gem_package_spec.rb +27 -0
  104. data/spec/unit/resource/git_spec.rb +17 -2
  105. data/spec/unit/resource/group_spec.rb +18 -17
  106. data/spec/unit/resource/homebrew_cask_spec.rb +9 -4
  107. data/spec/unit/resource/homebrew_package_spec.rb +14 -0
  108. data/spec/unit/resource/homebrew_tap_spec.rb +8 -3
  109. data/spec/unit/resource/hostname_spec.rb +10 -6
  110. data/spec/unit/resource/http_request_spec.rb +14 -0
  111. data/spec/unit/resource/ips_package_spec.rb +15 -3
  112. data/spec/unit/resource/ksh_spec.rb +8 -0
  113. data/spec/unit/resource/launchd_spec.rb +11 -5
  114. data/spec/unit/resource/link_spec.rb +6 -11
  115. data/spec/unit/resource/log_spec.rb +8 -8
  116. data/spec/unit/resource/macos_user_defaults_spec.rb +5 -1
  117. data/spec/unit/resource/macports_package_spec.rb +19 -0
  118. data/spec/unit/resource/mdadm_spec.rb +7 -3
  119. data/spec/unit/resource/mount_spec.rb +15 -18
  120. data/spec/unit/resource/msu_package_spec.rb +10 -0
  121. data/spec/unit/resource/ohai_hint_spec.rb +9 -8
  122. data/spec/unit/resource/ohai_spec.rb +11 -3
  123. data/spec/unit/resource/openbsd_package_spec.rb +14 -0
  124. data/spec/unit/resource/openssl_dhparam.rb +10 -5
  125. data/spec/unit/resource/openssl_rsa_private_key_spec.rb +10 -5
  126. data/spec/unit/resource/openssl_rsa_public_key_spec.rb +9 -5
  127. data/spec/unit/resource/osx_profile_spec.rb +7 -4
  128. data/spec/unit/resource/package_spec.rb +14 -0
  129. data/spec/unit/resource/pacman_package_spec.rb +17 -3
  130. data/spec/unit/resource/paludis_package_spec.rb +36 -0
  131. data/spec/unit/resource/perl_spec.rb +8 -0
  132. data/spec/unit/resource/portage_package_spec.rb +14 -0
  133. data/spec/unit/resource/powershell_package_spec.rb +14 -0
  134. data/spec/unit/resource/python_spec.rb +8 -0
  135. data/spec/unit/resource/reboot_spec.rb +5 -3
  136. data/spec/unit/resource/registry_key_spec.rb +12 -1
  137. data/spec/unit/resource/remote_directory_spec.rb +11 -1
  138. data/spec/unit/resource/remote_file_spec.rb +19 -0
  139. data/spec/unit/resource/rhsm_errata_level_spec.rb +7 -3
  140. data/spec/unit/resource/rhsm_errata_spec.rb +8 -4
  141. data/spec/unit/resource/rhsm_register_spec.rb +6 -1
  142. data/spec/unit/resource/rhsm_repo_spec.rb +9 -4
  143. data/spec/unit/resource/rhsm_subscription_spec.rb +9 -4
  144. data/spec/unit/resource/route_spec.rb +4 -9
  145. data/spec/unit/resource/rpm_package_spec.rb +14 -0
  146. data/spec/unit/resource/ruby_block_spec.rb +12 -8
  147. data/spec/unit/resource/ruby_spec.rb +8 -0
  148. data/spec/unit/resource/scm_spec.rb +16 -8
  149. data/spec/unit/resource/script_spec.rb +8 -0
  150. data/spec/unit/resource/service_spec.rb +15 -0
  151. data/spec/unit/resource/smartos_package_spec.rb +18 -4
  152. data/spec/unit/resource/solaris_package_spec.rb +14 -0
  153. data/spec/unit/resource/subversion_spec.rb +14 -8
  154. data/spec/unit/resource/sudo_spec.rb +11 -4
  155. data/spec/unit/resource/swap_file_spec.rb +4 -5
  156. data/spec/unit/resource/sysctl_spec.rb +8 -10
  157. data/spec/unit/resource/systemd_unit_spec.rb +14 -12
  158. data/spec/unit/resource/template_spec.rb +19 -0
  159. data/spec/unit/resource/{windows_ad_join.rb → windows_ad_join_spec.rb} +12 -6
  160. data/spec/unit/resource/windows_auto_run_spec.rb +9 -9
  161. data/spec/unit/resource/windows_env_spec.rb +8 -16
  162. data/spec/unit/resource/windows_feature.rb +27 -8
  163. data/spec/unit/resource/windows_feature_dism.rb +30 -9
  164. data/spec/unit/resource/windows_feature_powershell.rb +7 -7
  165. data/spec/unit/resource/windows_font_spec.rb +3 -4
  166. data/spec/unit/resource/windows_package_spec.rb +12 -2
  167. data/spec/unit/resource/windows_pagefile_spec.rb +12 -8
  168. data/spec/unit/resource/windows_path_spec.rb +4 -5
  169. data/spec/unit/resource/windows_printer_port_spec.rb +20 -3
  170. data/spec/unit/resource/windows_printer_spec.rb +12 -5
  171. data/spec/unit/resource/windows_service_spec.rb +24 -1
  172. data/spec/unit/resource/windows_shortcut_spec.rb +4 -5
  173. data/spec/unit/resource/yum_repository_spec.rb +48 -2
  174. data/spec/unit/resource/zypper_package_spec.rb +51 -0
  175. data/spec/unit/resource/zypper_repository_spec.rb +56 -11
  176. data/spec/unit/resource_spec.rb +1 -5
  177. metadata +21 -12
  178. data/spec/functional/resource/user/useradd_spec.rb +0 -709
@@ -3,7 +3,7 @@
3
3
  # Author:: Christopher Walters (<cw@chef.io>)
4
4
  # Author:: Tim Hinderliter (<tim@chef.io>)
5
5
  # Author:: Seth Chisamore (<schisamo@chef.io>)
6
- # Copyright:: Copyright 2008-2017, Chef Software Inc.
6
+ # Copyright:: Copyright 2008-2018, Chef Software Inc.
7
7
  # License:: Apache License, Version 2.0
8
8
  #
9
9
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -38,10 +38,6 @@ describe Chef::Resource do
38
38
  expect(resource.respond_to?(:shell_out!)).to be true
39
39
  end
40
40
 
41
- it "should mixin shell_out_with_systems_locale" do
42
- expect(resource.respond_to?(:shell_out_with_systems_locale)).to be true
43
- end
44
-
45
41
  describe "when inherited" do
46
42
 
47
43
  it "adds an entry to a list of subclasses" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef
3
3
  version: !ruby/object:Gem::Version
4
- version: 14.1.12
4
+ version: 14.2.0
5
5
  platform: universal-mingw32
6
6
  authors:
7
7
  - Adam Jacob
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-16 00:00:00.000000000 Z
11
+ date: 2018-06-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef-config
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 14.1.12
19
+ version: 14.2.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 14.1.12
26
+ version: 14.2.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: mixlib-cli
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -64,14 +64,14 @@ dependencies:
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '2.0'
67
+ version: '2.1'
68
68
  type: :runtime
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: '2.0'
74
+ version: '2.1'
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: mixlib-shellout
77
77
  requirement: !ruby/object:Gem::Requirement
@@ -118,16 +118,22 @@ dependencies:
118
118
  name: ffi
119
119
  requirement: !ruby/object:Gem::Requirement
120
120
  requirements:
121
- - - "<"
121
+ - - "~>"
122
122
  - !ruby/object:Gem::Version
123
- version: 1.9.22
123
+ version: '1.9'
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: 1.9.25
124
127
  type: :runtime
125
128
  prerelease: false
126
129
  version_requirements: !ruby/object:Gem::Requirement
127
130
  requirements:
128
- - - "<"
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: '1.9'
134
+ - - ">="
129
135
  - !ruby/object:Gem::Version
130
- version: 1.9.22
136
+ version: 1.9.25
131
137
  - !ruby/object:Gem::Dependency
132
138
  name: ffi-yajl
133
139
  requirement: !ruby/object:Gem::Requirement
@@ -2003,7 +2009,6 @@ files:
2003
2009
  - spec/functional/resource/rpm_spec.rb
2004
2010
  - spec/functional/resource/template_spec.rb
2005
2011
  - spec/functional/resource/user/dscl_spec.rb
2006
- - spec/functional/resource/user/useradd_spec.rb
2007
2012
  - spec/functional/resource/user/windows_spec.rb
2008
2013
  - spec/functional/resource/windows_env_spec.rb
2009
2014
  - spec/functional/resource/windows_package_spec.rb
@@ -2179,6 +2184,7 @@ files:
2179
2184
  - spec/unit/chef_class_spec.rb
2180
2185
  - spec/unit/chef_fs/config_spec.rb
2181
2186
  - spec/unit/chef_fs/data_handler/data_bag_item_data_handler.rb
2187
+ - spec/unit/chef_fs/data_handler/data_handler_base_spec.rb
2182
2188
  - spec/unit/chef_fs/data_handler/group_handler_spec.rb
2183
2189
  - spec/unit/chef_fs/diff_spec.rb
2184
2190
  - spec/unit/chef_fs/file_pattern_spec.rb
@@ -2547,6 +2553,7 @@ files:
2547
2553
  - spec/unit/resource/apt_update_spec.rb
2548
2554
  - spec/unit/resource/bash_spec.rb
2549
2555
  - spec/unit/resource/batch_spec.rb
2556
+ - spec/unit/resource/bff_package_spec.rb
2550
2557
  - spec/unit/resource/breakpoint_spec.rb
2551
2558
  - spec/unit/resource/build_essential_spec.rb
2552
2559
  - spec/unit/resource/cab_package_spec.rb
@@ -2597,6 +2604,7 @@ files:
2597
2604
  - spec/unit/resource/osx_profile_spec.rb
2598
2605
  - spec/unit/resource/package_spec.rb
2599
2606
  - spec/unit/resource/pacman_package_spec.rb
2607
+ - spec/unit/resource/paludis_package_spec.rb
2600
2608
  - spec/unit/resource/perl_spec.rb
2601
2609
  - spec/unit/resource/portage_package_spec.rb
2602
2610
  - spec/unit/resource/powershell_package_spec.rb
@@ -2628,7 +2636,7 @@ files:
2628
2636
  - spec/unit/resource/systemd_unit_spec.rb
2629
2637
  - spec/unit/resource/template_spec.rb
2630
2638
  - spec/unit/resource/user_spec.rb
2631
- - spec/unit/resource/windows_ad_join.rb
2639
+ - spec/unit/resource/windows_ad_join_spec.rb
2632
2640
  - spec/unit/resource/windows_auto_run_spec.rb
2633
2641
  - spec/unit/resource/windows_env_spec.rb
2634
2642
  - spec/unit/resource/windows_feature.rb
@@ -2645,6 +2653,7 @@ files:
2645
2653
  - spec/unit/resource/windows_task_spec.rb
2646
2654
  - spec/unit/resource/yum_package_spec.rb
2647
2655
  - spec/unit/resource/yum_repository_spec.rb
2656
+ - spec/unit/resource/zypper_package_spec.rb
2648
2657
  - spec/unit/resource/zypper_repository_spec.rb
2649
2658
  - spec/unit/resource_builder_spec.rb
2650
2659
  - spec/unit/resource_collection/resource_list_spec.rb
@@ -1,709 +0,0 @@
1
- # encoding: UTF-8
2
- #
3
- # Author:: Daniel DeLeo (<dan@chef.io>)
4
- # Copyright:: Copyright 2013-2016, Chef Software Inc.
5
- # License:: Apache License, Version 2.0
6
- #
7
- # Licensed under the Apache License, Version 2.0 (the "License");
8
- # you may not use this file except in compliance with the License.
9
- # You may obtain a copy of the License at
10
- #
11
- # http://www.apache.org/licenses/LICENSE-2.0
12
- #
13
- # Unless required by applicable law or agreed to in writing, software
14
- # distributed under the License is distributed on an "AS IS" BASIS,
15
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- # See the License for the specific language governing permissions and
17
- # limitations under the License.
18
- #
19
-
20
- require "spec_helper"
21
- require "functional/resource/base"
22
- require "chef/mixin/shell_out"
23
-
24
- def resource_for_platform(username, run_context)
25
- Chef::Resource.resource_for_node(:user, node).new(username, run_context)
26
- end
27
-
28
- # ideally we could somehow pass an array of [ ...::Aix, ...::Linux ] to the
29
- # filter, but we have to pick the right one for the O/S.
30
- def user_provider_filter
31
- case ohai[:os]
32
- when "aix"
33
- Chef::Provider::User::Aix
34
- when "linux"
35
- Chef::Provider::User::Linux
36
- end
37
- end
38
-
39
- metadata = {
40
- :unix_only => true,
41
- :requires_root => true,
42
- :not_supported_on_mac_osx => true,
43
- :provider => { :user => user_provider_filter },
44
- }
45
-
46
- describe Chef::Provider::User::Useradd, metadata do
47
-
48
- include Chef::Mixin::ShellOut
49
-
50
- # Utility code for /etc/passwd interaction, avoid any caching of user records:
51
- PwEntry = Struct.new(:name, :passwd, :uid, :gid, :gecos, :home, :shell)
52
-
53
- class UserNotFound < StandardError; end
54
-
55
- def pw_entry
56
- passwd_file = File.open("/etc/passwd", "rb") { |f| f.read }
57
- matcher = /^#{Regexp.escape(username)}.+$/
58
- if passwd_entry = passwd_file.scan(matcher).first
59
- PwEntry.new(*passwd_entry.split(":"))
60
- else
61
- raise UserNotFound, "no entry matching #{matcher.inspect} found in /etc/passwd"
62
- end
63
- end
64
-
65
- def etc_shadow
66
- case ohai[:platform]
67
- when "aix"
68
- File.open("/etc/security/passwd") { |f| f.read }
69
- else
70
- File.open("/etc/shadow") { |f| f.read }
71
- end
72
- end
73
-
74
- def self.quote_in_username_unsupported?
75
- if OHAI_SYSTEM["platform_family"] == "debian"
76
- false
77
- else
78
- "Only debian family systems support quotes in username"
79
- end
80
- end
81
-
82
- def password_should_be_set
83
- if ohai[:platform] == "aix"
84
- expect(pw_entry.passwd).to eq("!")
85
- else
86
- expect(pw_entry.passwd).to eq("x")
87
- end
88
- end
89
-
90
- def try_cleanup
91
- ["/home/cheftestfoo", "/home/cheftestbar", "/home/cf-test"].each do |f|
92
- FileUtils.rm_rf(f) if File.exists? f
93
- end
94
-
95
- ["cf-test"].each do |u|
96
- r = resource_for_platform("DELETE USER", run_context)
97
- r.manage_home true
98
- r.username("cf-test")
99
- r.run_action(:remove)
100
- end
101
- end
102
-
103
- before do
104
- # Silence shell_out live stream
105
- Chef::Log.level = :warn
106
- try_cleanup
107
- end
108
-
109
- after do
110
- max_retries = 3
111
- while max_retries > 0
112
- begin
113
- pw_entry # will raise if the user doesn't exist
114
- status = shell_out!("userdel", "-r", username, :returns => [0, 8, 12])
115
-
116
- # Error code 8 during userdel indicates that the user is logged in.
117
- # This occurs randomly because the accounts daemon holds a lock due to which userdel fails.
118
- # The work around is to retry userdel for 3 times.
119
- break if status.exitstatus != 8
120
-
121
- sleep 1
122
- max_retries -= 1
123
- rescue UserNotFound
124
- break
125
- end
126
- end
127
-
128
- status.error! if max_retries == 0
129
- end
130
-
131
- let(:node) do
132
- n = Chef::Node.new
133
- n.consume_external_attrs(OHAI_SYSTEM.data.dup, {})
134
- n
135
- end
136
-
137
- let(:events) do
138
- Chef::EventDispatch::Dispatcher.new
139
- end
140
-
141
- let(:run_context) do
142
- Chef::RunContext.new(node, {}, events)
143
- end
144
-
145
- let(:username) { "cf-test" }
146
- let(:uid) { nil }
147
- let(:home) { nil }
148
- let(:manage_home) { false }
149
- let(:password) { nil }
150
- let(:system) { false }
151
- let(:comment) { nil }
152
-
153
- let(:user_resource) do
154
- r = resource_for_platform("TEST USER RESOURCE", run_context)
155
- r.username(username)
156
- r.uid(uid)
157
- r.home(home)
158
- r.comment(comment)
159
- r.manage_home(manage_home)
160
- r.password(password)
161
- r.system(system)
162
- r
163
- end
164
-
165
- let(:expected_shadow) do
166
- if ohai[:platform] == "aix"
167
- expected_shadow = "cf-test" # For aix just check user entry in shadow file
168
- else
169
- expected_shadow = "cf-test:$1$RRa/wMM/$XltKfoX5ffnexVF4dHZZf/"
170
- end
171
- end
172
-
173
- describe "action :create" do
174
-
175
- context "when the user does not exist beforehand" do
176
- before do
177
- user_resource.run_action(:create)
178
- expect(user_resource).to be_updated_by_last_action
179
- end
180
-
181
- it "ensures the user exists" do
182
- expect(pw_entry.name).to eq(username)
183
- end
184
-
185
- # On Debian, the only constraints are that usernames must neither start
186
- # with a dash ('-') nor plus ('+') nor tilde ('~') nor contain a colon
187
- # (':'), a comma (','), or a whitespace (space: ' ', end of line: '\n',
188
- # tabulation: '\t', etc.). Note that using a slash ('/') may break the
189
- # default algorithm for the definition of the user's home directory.
190
-
191
- context "and the username contains a single quote", skip: quote_in_username_unsupported? do
192
-
193
- let(:username) { "t'bilisi" }
194
-
195
- it "ensures the user exists" do
196
- expect(pw_entry.name).to eq(username)
197
- end
198
- end
199
-
200
- context "when uid is set" do
201
- # Should verify uid not in use...
202
- let(:uid) { 1999 }
203
-
204
- it "ensures the user has the given uid" do
205
- expect(pw_entry.uid).to eq("1999")
206
- end
207
- end
208
-
209
- context "when comment is set" do
210
- let(:comment) { "hello this is dog" }
211
-
212
- it "ensures the comment is set" do
213
- expect(pw_entry.gecos).to eq("hello this is dog")
214
- end
215
-
216
- context "in standard gecos format" do
217
- let(:comment) { "Bobo T. Clown,some building,555-555-5555,@boboclown" }
218
-
219
- it "ensures the comment is set" do
220
- expect(pw_entry.gecos).to eq(comment)
221
- end
222
- end
223
-
224
- context "to a string containing multibyte characters" do
225
- let(:comment) { "(╯°□°)╯︵ ┻━┻" }
226
-
227
- it "ensures the comment is set" do
228
- actual = pw_entry.gecos
229
- actual.force_encoding(Encoding::UTF_8) if "".respond_to?(:force_encoding)
230
- expect(actual).to eq(comment)
231
- end
232
- end
233
-
234
- context "to a string containing an apostrophe `'`" do
235
- let(:comment) { "don't go" }
236
-
237
- it "ensures the comment is set" do
238
- expect(pw_entry.gecos).to eq(comment)
239
- end
240
- end
241
- end
242
-
243
- context "when home is set" do
244
- let(:home) { "/home/#{username}" }
245
-
246
- it "ensures the user's home is set to the given path" do
247
- expect(pw_entry.home).to eq(home)
248
- end
249
-
250
- it "does not create the home dir without `manage_home'" do
251
- expect(File).not_to exist(home)
252
- end
253
-
254
- context "and manage_home is enabled" do
255
- let(:manage_home) { true }
256
-
257
- it "ensures the user's home directory exists" do
258
- expect(File).to exist(home)
259
- end
260
- end
261
-
262
- context "and manage_home is the default" do
263
- let(:manage_home) { nil }
264
-
265
- it "does not create the home dir without `manage_home'" do
266
- expect(File).not_to exist(home)
267
- end
268
- end
269
- end
270
-
271
- context "when a password is specified" do
272
- # openssl passwd -1 "secretpassword"
273
- let(:password) do
274
- case ohai[:platform]
275
- when "aix"
276
- "eL5qfEVznSNss"
277
- else
278
- "$1$RRa/wMM/$XltKfoX5ffnexVF4dHZZf/"
279
- end
280
- end
281
-
282
- it "sets the user's shadow password" do
283
- password_should_be_set
284
- expect(etc_shadow).to include(expected_shadow)
285
- end
286
- end
287
-
288
- context "when a system user is specified", skip: aix? do
289
- let(:system) { true }
290
- let(:uid_min) do
291
- # from `man useradd`, login user means uid will be between
292
- # UID_SYS_MIN and UID_SYS_MAX defined in /etc/login.defs. On my
293
- # Ubuntu 13.04 system, these are commented out, so we'll look at
294
- # UID_MIN to find the lower limit of the non-system-user range, and
295
- # use that value in our assertions.
296
- login_defs = File.open("/etc/login.defs", "rb") { |f| f.read }
297
- uid_min_scan = /^UID_MIN\s+(\d+)/
298
- login_defs.match(uid_min_scan)[1]
299
- end
300
-
301
- it "ensures the user has the properties of a system user" do
302
- expect(pw_entry.uid.to_i).to be < uid_min.to_i
303
- end
304
- end
305
- end # when the user does not exist beforehand
306
-
307
- context "when the user already exists" do
308
-
309
- let(:expect_updated?) { true }
310
-
311
- let(:existing_uid) { nil }
312
- let(:existing_home) { nil }
313
- let(:existing_manage_home) { false }
314
- let(:existing_password) { nil }
315
- let(:existing_system) { false }
316
- let(:existing_comment) { nil }
317
-
318
- let(:existing_user) do
319
- r = resource_for_platform("TEST USER RESOURCE", run_context)
320
- # username is identity attr, must match.
321
- r.username(username)
322
- r.uid(existing_uid)
323
- r.home(existing_home)
324
- r.comment(existing_comment)
325
- r.manage_home(existing_manage_home)
326
- r.password(existing_password)
327
- r.system(existing_system)
328
- r
329
- end
330
-
331
- before do
332
- if reason = skip
333
- skip(reason)
334
- end
335
- existing_user.run_action(:create)
336
- expect(existing_user).to be_updated_by_last_action
337
- user_resource.run_action(:create)
338
- expect(user_resource.updated_by_last_action?).to eq(expect_updated?)
339
- end
340
-
341
- context "and all properties are in the desired state" do
342
- let(:uid) { 1999 }
343
- let(:home) { "/home/bobo" }
344
- let(:manage_home) { true }
345
- # openssl passwd -1 "secretpassword"
346
- let(:password) do
347
- case ohai[:platform]
348
- when "aix"
349
- "eL5qfEVznSNss"
350
- else
351
- "$1$RRa/wMM/$XltKfoX5ffnexVF4dHZZf/"
352
- end
353
- end
354
-
355
- let(:system) { false }
356
- let(:comment) { "hello this is dog" }
357
-
358
- let(:existing_uid) { uid }
359
- let(:existing_home) { home }
360
- let(:existing_manage_home) { manage_home }
361
- let(:existing_password) { password }
362
- let(:existing_system) { false }
363
- let(:existing_comment) { comment }
364
-
365
- let(:expect_updated?) { false }
366
-
367
- it "does not update the user" do
368
- expect(user_resource).not_to be_updated
369
- end
370
- end
371
-
372
- context "and the uid is updated" do
373
- let(:uid) { 1999 }
374
- let(:existing_uid) { 1998 }
375
-
376
- it "ensures the uid is set to the desired value" do
377
- expect(pw_entry.uid).to eq("1999")
378
- end
379
- end
380
-
381
- context "and the comment is updated" do
382
- let(:comment) { "hello this is dog" }
383
- let(:existing_comment) { "woof" }
384
-
385
- it "ensures the comment field is set to the desired value" do
386
- expect(pw_entry.gecos).to eq("hello this is dog")
387
- end
388
- end
389
-
390
- context "and home directory is updated" do
391
- let(:existing_home) { "/home/cheftestfoo" }
392
- let(:home) { "/home/cheftestbar" }
393
- it "ensures the home directory is set to the desired value" do
394
- expect(pw_entry.home).to eq("/home/cheftestbar")
395
- end
396
-
397
- context "and manage_home is enabled" do
398
- let(:existing_manage_home) { true }
399
- let(:manage_home) { true }
400
- it "moves the home directory to the new location" do
401
- expect(File).not_to exist("/home/cheftestfoo")
402
- expect(File).to exist("/home/cheftestbar")
403
- end
404
- end
405
-
406
- context "and manage_home wasn't enabled but is now" do
407
- let(:existing_manage_home) { false }
408
- let(:manage_home) { true }
409
-
410
- if %w{rhel fedora}.include?(OHAI_SYSTEM["platform_family"])
411
- # Inconsistent behavior. See: CHEF-2205
412
- it "created the home dir b/c of CHEF-2205 so it still exists" do
413
- # This behavior seems contrary to expectation and non-convergent.
414
- expect(File).not_to exist("/home/cheftestfoo")
415
- expect(File).to exist("/home/cheftestbar")
416
- end
417
- elsif ohai[:platform] == "aix"
418
- it "creates the home dir in the desired location" do
419
- expect(File).not_to exist("/home/cheftestfoo")
420
- expect(File).to exist("/home/cheftestbar")
421
- end
422
- else
423
- it "does not create the home dir in the desired location (XXX)" do
424
- # This behavior seems contrary to expectation and non-convergent.
425
- expect(File).not_to exist("/home/cheftestfoo")
426
- expect(File).not_to exist("/home/cheftestbar")
427
- end
428
- end
429
- end
430
-
431
- context "and manage_home was enabled but is not now" do
432
- let(:existing_manage_home) { true }
433
- let(:manage_home) { false }
434
-
435
- it "leaves the old home directory around (XXX)" do
436
- # Would it be better to remove the old home?
437
- expect(File).to exist("/home/cheftestfoo")
438
- expect(File).not_to exist("/home/cheftestbar")
439
- end
440
- end
441
- end
442
-
443
- context "and a password is added" do
444
- # openssl passwd -1 "secretpassword"
445
- let(:password) do
446
- case ohai[:platform]
447
- when "aix"
448
- "eL5qfEVznSNss"
449
- else
450
- "$1$RRa/wMM/$XltKfoX5ffnexVF4dHZZf/"
451
- end
452
- end
453
-
454
- it "ensures the password is set" do
455
- password_should_be_set
456
- expect(etc_shadow).to include(expected_shadow)
457
- end
458
-
459
- end
460
-
461
- context "and the password is updated" do
462
- # openssl passwd -1 "OLDpassword"
463
- let(:existing_password) do
464
- case ohai[:platform]
465
- when "aix"
466
- "jkzG6MvUxjk2g"
467
- else
468
- "$1$1dVmwm4z$CftsFn8eBDjDRUytYKkXB."
469
- end
470
- end
471
-
472
- # openssl passwd -1 "secretpassword"
473
- let(:password) do
474
- case ohai[:platform]
475
- when "aix"
476
- "eL5qfEVznSNss"
477
- else
478
- "$1$RRa/wMM/$XltKfoX5ffnexVF4dHZZf/"
479
- end
480
- end
481
-
482
- it "ensures the password is set to the desired value" do
483
- password_should_be_set
484
- expect(etc_shadow).to include(expected_shadow)
485
- end
486
- end
487
-
488
- context "and the user is changed from not-system to system" do
489
- let(:existing_system) { false }
490
- let(:system) { true }
491
-
492
- let(:expect_updated?) { false }
493
-
494
- it "does not modify the user at all" do
495
- end
496
- end
497
-
498
- context "and the user is changed from system to not-system" do
499
- let(:existing_system) { true }
500
- let(:system) { false }
501
-
502
- let(:expect_updated?) { false }
503
-
504
- it "does not modify the user at all" do
505
- end
506
- end
507
-
508
- end # when the user already exists
509
- end # action :create
510
-
511
- shared_context "user exists for lock/unlock" do
512
- let(:user_locked_context?) { false }
513
-
514
- def shadow_entry
515
- etc_shadow.lines.find { |l| l.include?(username) }
516
- end
517
-
518
- def shadow_password
519
- shadow_entry.split(":")[1]
520
- end
521
-
522
- def aix_user_lock_status
523
- lock_info = shell_out!("lsuser -a account_locked #{username}")
524
- /\S+\s+account_locked=(\S+)/.match(lock_info.stdout)[1]
525
- end
526
-
527
- def user_account_should_be_locked
528
- case ohai[:platform]
529
- when "aix"
530
- expect(aix_user_lock_status).to eq("true")
531
- else
532
- expect(shadow_password).to include("!")
533
- end
534
- end
535
-
536
- def user_account_should_be_unlocked
537
- case ohai[:platform]
538
- when "aix"
539
- expect(aix_user_lock_status).to eq("false")
540
- else
541
- expect(shadow_password).not_to include("!")
542
- end
543
- end
544
-
545
- def lock_user_account
546
- case ohai[:platform]
547
- when "aix"
548
- shell_out!("chuser account_locked=true #{username}")
549
- else
550
- shell_out!("usermod -L #{username}")
551
- end
552
- end
553
-
554
- before do
555
- # create user and setup locked/unlocked state
556
- user_resource.dup.run_action(:create)
557
-
558
- if user_locked_context?
559
- lock_user_account
560
- user_account_should_be_locked
561
- elsif password
562
- user_account_should_be_unlocked
563
- end
564
- end
565
- end
566
-
567
- describe "action :lock" do
568
- context "when the user does not exist" do
569
- it "raises a sensible error" do
570
- expect { user_resource.run_action(:lock) }.to raise_error(Chef::Exceptions::User)
571
- end
572
- end
573
-
574
- context "when the user exists" do
575
-
576
- include_context "user exists for lock/unlock"
577
-
578
- before do
579
- user_resource.run_action(:lock)
580
- end
581
-
582
- context "and the user is not locked" do
583
- # user will be locked if it has no password
584
- let(:password) do
585
- case ohai[:platform]
586
- when "aix"
587
- "eL5qfEVznSNss"
588
- else
589
- "$1$RRa/wMM/$XltKfoX5ffnexVF4dHZZf/"
590
- end
591
- end
592
-
593
- it "locks the user's password" do
594
- user_account_should_be_locked
595
- end
596
- end
597
-
598
- context "and the user is locked" do
599
- # user will be locked if it has no password
600
- let(:password) do
601
- case ohai[:platform]
602
- when "aix"
603
- "eL5qfEVznSNss"
604
- else
605
- "$1$RRa/wMM/$XltKfoX5ffnexVF4dHZZf/"
606
- end
607
- end
608
-
609
- let(:user_locked_context?) { true }
610
- it "does not update the user" do
611
- expect(user_resource).not_to be_updated_by_last_action
612
- end
613
- end
614
- end
615
- end # action :lock
616
-
617
- describe "action :unlock" do
618
- context "when the user does not exist" do
619
- it "raises a sensible error" do
620
- expect { user_resource.run_action(:unlock) }.to raise_error(Chef::Exceptions::User)
621
- end
622
- end
623
-
624
- context "when the user exists" do
625
-
626
- include_context "user exists for lock/unlock"
627
-
628
- before do
629
- begin
630
- user_resource.run_action(:unlock)
631
- @error = nil
632
- rescue Exception => e
633
- @error = e
634
- end
635
- end
636
-
637
- context "and has no password" do
638
-
639
- # TODO: platform_family should be setup in spec_helper w/ tags
640
- if %w{opensuse}.include?(OHAI_SYSTEM["platform_family"]) ||
641
- (%w{suse}.include?(OHAI_SYSTEM["platform_family"]) &&
642
- OHAI_SYSTEM["platform_version"].to_f < 12.0)
643
- # suse 11.x gets this right:
644
- it "errors out trying to unlock the user" do
645
- expect(@error).to be_a(Mixlib::ShellOut::ShellCommandFailed)
646
- expect(@error.message).to include("Cannot unlock the password")
647
- end
648
- elsif %w{rhel}.include?(OHAI_SYSTEM["platform_family"]) &&
649
- (Chef::VersionConstraint.new("~> 6.8").include?(OHAI_SYSTEM["platform_version"].to_f) || Chef::VersionConstraint.new("~> 7.3").include?(OHAI_SYSTEM["platform_version"].to_f))
650
- # RHEL 6.8 and 7.3 ship with a fixed `usermod` command
651
- # Reference: https://access.redhat.com/errata/RHBA-2016:0864
652
- # Reference: https://access.redhat.com/errata/RHBA-2016:2322
653
- it "errors out trying to unlock the user" do
654
- expect(@error).to be_a(Mixlib::ShellOut::ShellCommandFailed)
655
- expect(@error.message).to include("You should set a password")
656
- end
657
- else
658
-
659
- # borked on all other platforms:
660
- it "is marked as updated but doesn't modify the user (XXX)" do
661
- # This should be an error instead; note that usermod still exits 0
662
- # (which is probably why this case silently fails):
663
- #
664
- # DEBUG: ---- Begin output of usermod -U chef-functional-test ----
665
- # DEBUG: STDOUT:
666
- # DEBUG: STDERR: usermod: unlocking the user's password would result in a passwordless account.
667
- # You should set a password with usermod -p to unlock this user's password.
668
- # DEBUG: ---- End output of usermod -U chef-functional-test ----
669
- # DEBUG: Ran usermod -U chef-functional-test returned 0
670
- expect(@error).to be_nil
671
- if ohai[:platform] == "aix"
672
- expect(pw_entry.passwd).to eq("*")
673
- user_account_should_be_unlocked
674
- else
675
- expect(pw_entry.passwd).to eq("x")
676
- expect(shadow_password).to include("!")
677
- end
678
- end
679
- end
680
- end
681
-
682
- context "and has a password" do
683
- let(:password) do
684
- case ohai[:platform]
685
- when "aix"
686
- "eL5qfEVznSNss"
687
- else
688
- "$1$RRa/wMM/$XltKfoX5ffnexVF4dHZZf/"
689
- end
690
- end
691
-
692
- context "and the user is not locked" do
693
- it "does not update the user" do
694
- expect(user_resource).not_to be_updated_by_last_action
695
- end
696
- end
697
-
698
- context "and the user is locked" do
699
- let(:user_locked_context?) { true }
700
-
701
- it "unlocks the user's password" do
702
- user_account_should_be_unlocked
703
- end
704
- end
705
- end
706
- end
707
- end # action :unlock
708
-
709
- end