chef 12.0.0.alpha.1 → 12.0.0.alpha.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/chef/application.rb +8 -1
- data/lib/chef/application/apply.rb +4 -0
- data/lib/chef/application/client.rb +7 -7
- data/lib/chef/application/solo.rb +21 -13
- data/lib/chef/chef_fs/chef_fs_data_store.rb +60 -6
- data/lib/chef/chef_fs/config.rb +78 -4
- data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +2 -2
- data/lib/chef/chef_fs/data_handler/client_data_handler.rb +1 -1
- data/lib/chef/chef_fs/data_handler/container_data_handler.rb +1 -1
- data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +1 -1
- data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +1 -1
- data/lib/chef/chef_fs/data_handler/data_handler_base.rb +76 -2
- data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +1 -1
- data/lib/chef/chef_fs/data_handler/group_data_handler.rb +1 -1
- data/lib/chef/chef_fs/data_handler/node_data_handler.rb +1 -1
- data/lib/chef/chef_fs/data_handler/organization_data_handler.rb +30 -0
- data/lib/chef/chef_fs/data_handler/organization_invites_data_handler.rb +17 -0
- data/lib/chef/chef_fs/data_handler/organization_members_data_handler.rb +17 -0
- data/lib/chef/chef_fs/data_handler/role_data_handler.rb +1 -1
- data/lib/chef/chef_fs/data_handler/user_data_handler.rb +2 -1
- data/lib/chef/chef_fs/file_system.rb +0 -1
- data/lib/chef/chef_fs/file_system/acl_entry.rb +1 -1
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +1 -1
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +5 -1
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +73 -13
- data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +44 -5
- data/lib/chef/chef_fs/file_system/cookbook_dir.rb +1 -1
- data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +3 -3
- data/lib/chef/chef_fs/file_system/org_entry.rb +34 -0
- data/lib/chef/chef_fs/file_system/organization_invites_entry.rb +58 -0
- data/lib/chef/chef_fs/file_system/organization_members_entry.rb +57 -0
- data/lib/chef/chef_fs/file_system/rest_list_entry.rb +13 -4
- data/lib/chef/chef_fs/knife.rb +1 -1
- data/lib/chef/client.rb +8 -2
- data/lib/chef/config.rb +75 -57
- data/lib/chef/config_fetcher.rb +6 -21
- data/lib/chef/dsl/data_query.rb +48 -3
- data/lib/chef/dsl/platform_introspection.rb +42 -0
- data/lib/chef/dsl/reboot_pending.rb +6 -3
- data/lib/chef/encrypted_data_bag_item.rb +1 -1
- data/lib/chef/encrypted_data_bag_item/encryptor.rb +12 -0
- data/lib/chef/exceptions.rb +2 -0
- data/lib/chef/http/basic_client.rb +14 -0
- data/lib/chef/http/json_output.rb +7 -2
- data/lib/chef/knife.rb +36 -121
- data/lib/chef/knife/bootstrap.rb +68 -54
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +6 -1
- data/lib/chef/knife/bootstrap/chef-aix.erb +5 -0
- data/lib/chef/knife/bootstrap/chef-full.erb +5 -1
- data/lib/chef/knife/core/bootstrap_context.rb +70 -29
- data/lib/chef/knife/search.rb +56 -12
- data/lib/chef/knife/serve.rb +1 -1
- data/lib/chef/local_mode.rb +10 -4
- data/lib/chef/mixin/deep_merge.rb +6 -3
- data/lib/chef/mixin/shell_out.rb +33 -17
- data/lib/chef/null_logger.rb +72 -0
- data/lib/chef/platform.rb +2 -1
- data/lib/chef/platform/provider_mapping.rb +1 -1
- data/lib/chef/platform/rebooter.rb +54 -0
- data/lib/chef/provider/ifconfig.rb +15 -16
- data/lib/chef/provider/link.rb +1 -1
- data/lib/chef/provider/mount/mount.rb +1 -1
- data/lib/chef/provider/mount/solaris.rb +102 -64
- data/lib/chef/provider/package/aix.rb +4 -12
- data/lib/chef/provider/package/ips.rb +8 -12
- data/lib/chef/provider/package/macports.rb +4 -12
- data/lib/chef/provider/package/pacman.rb +2 -6
- data/lib/chef/provider/package/portage.rb +2 -6
- data/lib/chef/provider/package/rpm.rb +4 -12
- data/lib/chef/provider/package/solaris.rb +4 -12
- data/lib/chef/provider/reboot.rb +69 -0
- data/lib/chef/provider/service/debian.rb +10 -10
- data/lib/chef/provider/service/freebsd.rb +89 -73
- data/lib/chef/provider/service/gentoo.rb +2 -2
- data/lib/chef/provider/service/init.rb +6 -4
- data/lib/chef/provider/service/insserv.rb +3 -3
- data/lib/chef/provider/service/macosx.rb +2 -2
- data/lib/chef/provider/service/simple.rb +6 -4
- data/lib/chef/provider/service/solaris.rb +1 -1
- data/lib/chef/provider/service/systemd.rb +9 -9
- data/lib/chef/provider/service/upstart.rb +6 -6
- data/lib/chef/provider/subversion.rb +6 -6
- data/lib/chef/provider/user/dscl.rb +32 -28
- data/lib/chef/provider/user/windows.rb +6 -6
- data/lib/chef/provider/whyrun_safe_ruby_block.rb +1 -1
- data/lib/chef/providers.rb +1 -0
- data/lib/chef/recipe.rb +0 -1
- data/lib/chef/resource.rb +3 -5
- data/lib/chef/resource/mount.rb +9 -0
- data/lib/chef/resource/reboot.rb +48 -0
- data/lib/chef/resources.rb +1 -0
- data/lib/chef/run_context.rb +25 -0
- data/lib/chef/search/query.rb +122 -14
- data/lib/chef/util/path_helper.rb +54 -6
- data/lib/chef/util/windows/net_user.rb +4 -1
- data/lib/chef/version.rb +1 -1
- data/lib/chef/win32/api/file.rb +1 -5
- data/lib/chef/win32/api/net.rb +1 -0
- data/lib/chef/workstation_config_loader.rb +177 -0
- data/spec/functional/http/simple_spec.rb +57 -1
- data/spec/functional/mixin/shell_out_spec.rb +2 -2
- data/spec/functional/provider/whyrun_safe_ruby_block_spec.rb +51 -0
- data/spec/functional/rebooter_spec.rb +105 -0
- data/spec/functional/resource/deploy_revision_spec.rb +0 -4
- data/spec/functional/resource/file_spec.rb +26 -3
- data/spec/functional/resource/group_spec.rb +5 -3
- data/spec/functional/resource/link_spec.rb +16 -16
- data/spec/functional/resource/reboot_spec.rb +103 -0
- data/spec/integration/client/client_spec.rb +4 -8
- data/spec/integration/client/ipv6_spec.rb +1 -1
- data/spec/integration/knife/cookbook_api_ipv6_spec.rb +3 -2
- data/spec/integration/knife/delete_spec.rb +39 -0
- data/spec/integration/knife/deps_spec.rb +30 -20
- data/spec/integration/knife/download_spec.rb +77 -1
- data/spec/integration/knife/list_spec.rb +221 -0
- data/spec/integration/knife/raw_spec.rb +1 -1
- data/spec/integration/knife/show_spec.rb +2 -2
- data/spec/integration/knife/upload_spec.rb +154 -1
- data/spec/support/pedant/run_pedant.rb +0 -1
- data/spec/support/shared/functional/http.rb +8 -1
- data/spec/support/shared/integration/integration_helper.rb +11 -19
- data/spec/support/shared/unit/platform_introspector.rb +22 -0
- data/spec/unit/application/apply.rb +11 -1
- data/spec/unit/application/solo_spec.rb +19 -3
- data/spec/unit/chef_fs/config_spec.rb +58 -0
- data/spec/unit/config_fetcher_spec.rb +1 -3
- data/spec/unit/config_spec.rb +247 -220
- data/spec/unit/dsl/data_query_spec.rb +165 -23
- data/spec/unit/dsl/reboot_pending_spec.rb +1 -7
- data/spec/unit/encrypted_data_bag_item_spec.rb +1 -1
- data/spec/unit/knife/bootstrap_spec.rb +354 -182
- data/spec/unit/knife/core/bootstrap_context_spec.rb +67 -30
- data/spec/unit/knife_spec.rb +3 -30
- data/spec/unit/mixin/deep_merge_spec.rb +14 -0
- data/spec/unit/mixin/shell_out_spec.rb +134 -64
- data/spec/unit/provider/ifconfig/debian_spec.rb +19 -9
- data/spec/unit/provider/ifconfig/redhat_spec.rb +16 -14
- data/spec/unit/provider/ifconfig_spec.rb +3 -3
- data/spec/unit/provider/link_spec.rb +5 -5
- data/spec/unit/provider/mount/mount_spec.rb +10 -1
- data/spec/unit/provider/mount/solaris_spec.rb +185 -11
- data/spec/unit/provider/package/aix_spec.rb +5 -17
- data/spec/unit/provider/package/ips_spec.rb +8 -21
- data/spec/unit/provider/package/macports_spec.rb +12 -12
- data/spec/unit/provider/package/pacman_spec.rb +4 -12
- data/spec/unit/provider/package/portage_spec.rb +5 -15
- data/spec/unit/provider/package/rpm_spec.rb +7 -22
- data/spec/unit/provider/package/solaris_spec.rb +5 -16
- data/spec/unit/provider/service/arch_service_spec.rb +8 -14
- data/spec/unit/provider/service/debian_service_spec.rb +1 -1
- data/spec/unit/provider/service/freebsd_service_spec.rb +457 -225
- data/spec/unit/provider/service/gentoo_service_spec.rb +2 -2
- data/spec/unit/provider/service/init_service_spec.rb +10 -10
- data/spec/unit/provider/service/insserv_service_spec.rb +3 -4
- data/spec/unit/provider/service/invokercd_service_spec.rb +8 -9
- data/spec/unit/provider/service/macosx_spec.rb +5 -5
- data/spec/unit/provider/service/simple_service_spec.rb +4 -6
- data/spec/unit/provider/service/solaris_smf_service_spec.rb +1 -3
- data/spec/unit/provider/service/systemd_service_spec.rb +20 -20
- data/spec/unit/provider/service/upstart_service_spec.rb +15 -17
- data/spec/unit/provider/subversion_spec.rb +5 -6
- data/spec/unit/provider/user/dscl_spec.rb +2 -1
- data/spec/unit/provider/user/windows_spec.rb +7 -0
- data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +2 -2
- data/spec/unit/resource/mount_spec.rb +9 -0
- data/spec/unit/resource_spec.rb +0 -4
- data/spec/unit/rest_spec.rb +1 -1
- data/spec/unit/run_context_spec.rb +15 -0
- data/spec/unit/search/query_spec.rb +196 -40
- data/spec/unit/util/path_helper_spec.rb +111 -28
- data/spec/unit/workstation_config_loader_spec.rb +283 -0
- metadata +36 -20
- data/lib/chef/knife/bootstrap/centos5-gems.erb +0 -62
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +0 -44
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +0 -53
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +0 -48
- data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +0 -46
- data/spec/support/shared/integration/chef_zero_support.rb +0 -130
- data/spec/unit/knife/config_file_selection_spec.rb +0 -135
data/lib/chef/knife/serve.rb
CHANGED
@@ -33,7 +33,7 @@ class Chef
|
|
33
33
|
def run
|
34
34
|
server = Chef::LocalMode.chef_zero_server
|
35
35
|
begin
|
36
|
-
output "Serving files from:\n#{
|
36
|
+
output "Serving files from:\n#{Chef::LocalMode.chef_fs.fs_description}"
|
37
37
|
server.stop
|
38
38
|
server.start(stdout) # to print header
|
39
39
|
ensure
|
data/lib/chef/local_mode.rb
CHANGED
@@ -52,9 +52,10 @@ class Chef
|
|
52
52
|
require 'chef/chef_fs/chef_fs_data_store'
|
53
53
|
require 'chef/chef_fs/config'
|
54
54
|
|
55
|
-
chef_fs = Chef::ChefFS::Config.new.local_fs
|
56
|
-
chef_fs.write_pretty_json = true
|
57
|
-
data_store = Chef::ChefFS::ChefFSDataStore.new(chef_fs)
|
55
|
+
@chef_fs = Chef::ChefFS::Config.new.local_fs
|
56
|
+
@chef_fs.write_pretty_json = true
|
57
|
+
data_store = Chef::ChefFS::ChefFSDataStore.new(@chef_fs)
|
58
|
+
data_store = ChefZero::DataStore::V1ToV2Adapter.new(data_store, 'chef')
|
58
59
|
server_options = {}
|
59
60
|
server_options[:data_store] = data_store
|
60
61
|
server_options[:log_level] = Chef::Log.level
|
@@ -62,7 +63,7 @@ class Chef
|
|
62
63
|
server_options[:port] = parse_port(Chef::Config.chef_zero.port)
|
63
64
|
@chef_zero_server = ChefZero::Server.new(server_options)
|
64
65
|
@chef_zero_server.start_background
|
65
|
-
Chef::Log.info("Started chef-zero at #{@chef_zero_server.url} with #{chef_fs.fs_description}")
|
66
|
+
Chef::Log.info("Started chef-zero at #{@chef_zero_server.url} with #{@chef_fs.fs_description}")
|
66
67
|
Chef::Config.chef_server_url = @chef_zero_server.url
|
67
68
|
end
|
68
69
|
end
|
@@ -72,6 +73,11 @@ class Chef
|
|
72
73
|
@chef_zero_server
|
73
74
|
end
|
74
75
|
|
76
|
+
# Return the chef_fs object for the current chef-zero server.
|
77
|
+
def self.chef_fs
|
78
|
+
@chef_fs
|
79
|
+
end
|
80
|
+
|
75
81
|
# If chef_zero_server is non-nil, stop it and remove references to it.
|
76
82
|
def self.destroy_server_connectivity
|
77
83
|
if @chef_zero_server
|
@@ -29,7 +29,6 @@ class Chef
|
|
29
29
|
|
30
30
|
class InvalidSubtractiveMerge < ArgumentError; end
|
31
31
|
|
32
|
-
|
33
32
|
OLD_KNOCKOUT_PREFIX = "!merge:".freeze
|
34
33
|
|
35
34
|
# Regex to match the "knockout prefix" that was used to indicate
|
@@ -86,8 +85,12 @@ class Chef
|
|
86
85
|
when Hash
|
87
86
|
if dest.kind_of?(Hash)
|
88
87
|
source.each do |src_key, src_value|
|
89
|
-
if dest
|
90
|
-
|
88
|
+
if dest.has_key? src_key
|
89
|
+
if dest[src_key].nil?
|
90
|
+
dest[src_key] = nil
|
91
|
+
else
|
92
|
+
dest[src_key] = deep_merge!(src_value, dest[src_key])
|
93
|
+
end
|
91
94
|
else # dest[src_key] doesn't exist so we take whatever source has
|
92
95
|
raise_if_knockout_used!(src_value)
|
93
96
|
dest[src_key] = src_value
|
data/lib/chef/mixin/shell_out.rb
CHANGED
@@ -20,7 +20,6 @@
|
|
20
20
|
require 'chef/shell_out'
|
21
21
|
|
22
22
|
require 'mixlib/shellout'
|
23
|
-
require 'chef/config'
|
24
23
|
|
25
24
|
class Chef
|
26
25
|
module Mixin
|
@@ -31,32 +30,39 @@ class Chef
|
|
31
30
|
# Generally speaking, 'extend Chef::Mixin::ShellOut' in your recipes and include 'Chef::Mixin::ShellOut' in your LWRPs
|
32
31
|
# You can also call Mixlib::Shellout.new directly, but you lose all of the above functionality
|
33
32
|
|
33
|
+
# we use 'en_US.UTF-8' by default because we parse localized strings in English as an API and
|
34
|
+
# generally must support UTF-8 unicode.
|
34
35
|
def shell_out(*command_args)
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
36
|
+
args = command_args.dup
|
37
|
+
if args.last.is_a?(Hash)
|
38
|
+
options = args.pop.dup
|
39
|
+
env_key = options.has_key?(:env) ? :env : :environment
|
40
|
+
options[env_key] ||= {}
|
41
|
+
options[env_key] = options[env_key].dup
|
42
|
+
options[env_key]['LC_ALL'] ||= Chef::Config[:internal_locale] unless options[env_key].has_key?('LC_ALL')
|
43
|
+
args << options
|
44
|
+
else
|
45
|
+
args << { :environment => { 'LC_ALL' => Chef::Config[:internal_locale] } }
|
46
|
+
end
|
47
|
+
|
48
|
+
shell_out_command(*args)
|
39
49
|
end
|
40
50
|
|
51
|
+
# call shell_out (using en_US.UTF-8) and raise errors
|
41
52
|
def shell_out!(*command_args)
|
42
|
-
cmd= shell_out(*command_args)
|
53
|
+
cmd = shell_out(*command_args)
|
43
54
|
cmd.error!
|
44
55
|
cmd
|
45
56
|
end
|
46
57
|
|
47
|
-
# environment['LC_ALL'] should be nil or what the user specified
|
48
58
|
def shell_out_with_systems_locale(*command_args)
|
49
|
-
|
50
|
-
|
51
|
-
options = args.last
|
52
|
-
env_key = options.has_key?(:env) ? :env : :environment
|
53
|
-
options[env_key] ||= {}
|
54
|
-
options[env_key]['LC_ALL'] ||= nil
|
55
|
-
else
|
56
|
-
args << { :environment => { 'LC_ALL' => nil } }
|
57
|
-
end
|
59
|
+
shell_out_command(*command_args)
|
60
|
+
end
|
58
61
|
|
59
|
-
|
62
|
+
def shell_out_with_systems_locale!(*command_args)
|
63
|
+
cmd = shell_out_with_systems_locale(*command_args)
|
64
|
+
cmd.error!
|
65
|
+
cmd
|
60
66
|
end
|
61
67
|
|
62
68
|
DEPRECATED_OPTIONS =
|
@@ -83,6 +89,13 @@ class Chef
|
|
83
89
|
|
84
90
|
private
|
85
91
|
|
92
|
+
def shell_out_command(*command_args)
|
93
|
+
cmd = Mixlib::ShellOut.new(*run_command_compatible_options(command_args))
|
94
|
+
cmd.live_stream ||= io_for_live_stream
|
95
|
+
cmd.run_command
|
96
|
+
cmd
|
97
|
+
end
|
98
|
+
|
86
99
|
def deprecate_option(old_option, new_option)
|
87
100
|
Chef::Log.logger.warn "DEPRECATION: Chef::Mixin::ShellOut option :#{old_option} is deprecated. Use :#{new_option}"
|
88
101
|
end
|
@@ -97,3 +110,6 @@ class Chef
|
|
97
110
|
end
|
98
111
|
end
|
99
112
|
end
|
113
|
+
|
114
|
+
# Break circular dep
|
115
|
+
require 'chef/config'
|
@@ -0,0 +1,72 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Daniel DeLeo (<dan@getchef.com>)
|
3
|
+
# Copyright:: Copyright (c) 2014 Chef Software, Inc
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
class Chef
|
19
|
+
|
20
|
+
# Null logger implementation that just ignores everything. This is used by
|
21
|
+
# classes that are intended to be reused outside of Chef, but need to offer
|
22
|
+
# logging functionality when used by other Chef code.
|
23
|
+
#
|
24
|
+
# It does not define the full interface provided by Logger, just enough to be
|
25
|
+
# a reasonable duck type. In particular, methods setting the log level, log
|
26
|
+
# device, etc., are not implemented because any code calling those methods
|
27
|
+
# probably expected a real logger and not this "fake" one.
|
28
|
+
class NullLogger
|
29
|
+
|
30
|
+
def fatal(message, &block)
|
31
|
+
end
|
32
|
+
|
33
|
+
def error(message, &block)
|
34
|
+
end
|
35
|
+
|
36
|
+
def warn(message, &block)
|
37
|
+
end
|
38
|
+
|
39
|
+
def info(message, &block)
|
40
|
+
end
|
41
|
+
|
42
|
+
def debug(message, &block)
|
43
|
+
end
|
44
|
+
|
45
|
+
def add(severity, message=nil, progname=nil)
|
46
|
+
end
|
47
|
+
|
48
|
+
def <<(message)
|
49
|
+
end
|
50
|
+
|
51
|
+
def fatal?
|
52
|
+
false
|
53
|
+
end
|
54
|
+
|
55
|
+
def error?
|
56
|
+
false
|
57
|
+
end
|
58
|
+
|
59
|
+
def warn?
|
60
|
+
false
|
61
|
+
end
|
62
|
+
|
63
|
+
def info?
|
64
|
+
false
|
65
|
+
end
|
66
|
+
|
67
|
+
def debug?
|
68
|
+
false
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
data/lib/chef/platform.rb
CHANGED
@@ -16,8 +16,9 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
18
|
|
19
|
-
|
19
|
+
# Order of these headers is important: query helpers is needed by many things
|
20
20
|
require 'chef/platform/query_helpers'
|
21
|
+
require 'chef/platform/provider_mapping'
|
21
22
|
|
22
23
|
class Chef
|
23
24
|
class Platform
|
@@ -0,0 +1,54 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Chris Doherty <cdoherty@getchef.com>)
|
3
|
+
# Copyright:: Copyright (c) 2014 Chef, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'chef/dsl/reboot_pending'
|
20
|
+
require 'chef/log'
|
21
|
+
require 'chef/platform'
|
22
|
+
|
23
|
+
class Chef
|
24
|
+
class Platform
|
25
|
+
module Rebooter
|
26
|
+
extend Chef::Mixin::ShellOut
|
27
|
+
|
28
|
+
class << self
|
29
|
+
|
30
|
+
def reboot!(node)
|
31
|
+
reboot_info = node.run_context.reboot_info
|
32
|
+
|
33
|
+
cmd = if Chef::Platform.windows?
|
34
|
+
# should this do /f as well? do we then need a minimum delay to let apps quit?
|
35
|
+
"shutdown /r /t #{reboot_info[:delay_mins]} /c \"#{reboot_info[:reason]}\""
|
36
|
+
else
|
37
|
+
# probably Linux-only.
|
38
|
+
"shutdown -r +#{reboot_info[:delay_mins]} \"#{reboot_info[:reason]}\""
|
39
|
+
end
|
40
|
+
|
41
|
+
Chef::Log.warn "Rebooting server at a recipe's request. Details: #{reboot_info.inspect}"
|
42
|
+
shell_out!(cmd)
|
43
|
+
end
|
44
|
+
|
45
|
+
# this is a wrapper function so Chef::Client only needs a single line of code.
|
46
|
+
def reboot_if_needed!(node)
|
47
|
+
if node.run_context.reboot_requested?
|
48
|
+
reboot!(node)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -19,6 +19,7 @@
|
|
19
19
|
require 'chef/log'
|
20
20
|
require 'chef/mixin/command'
|
21
21
|
require 'chef/provider'
|
22
|
+
require 'chef/resource/file'
|
22
23
|
require 'chef/exceptions'
|
23
24
|
require 'erb'
|
24
25
|
|
@@ -109,11 +110,11 @@ class Chef
|
|
109
110
|
:command => command
|
110
111
|
)
|
111
112
|
Chef::Log.info("#{@new_resource} added")
|
112
|
-
# Write out the config files
|
113
|
-
generate_config
|
114
113
|
end
|
115
114
|
end
|
116
115
|
end
|
116
|
+
# Write out the config files
|
117
|
+
generate_config
|
117
118
|
end
|
118
119
|
|
119
120
|
def action_enable
|
@@ -140,12 +141,12 @@ class Chef
|
|
140
141
|
run_command(
|
141
142
|
:command => command
|
142
143
|
)
|
143
|
-
delete_config
|
144
144
|
Chef::Log.info("#{@new_resource} deleted")
|
145
145
|
end
|
146
146
|
else
|
147
147
|
Chef::Log.debug("#{@new_resource} does not exist - nothing to do")
|
148
148
|
end
|
149
|
+
delete_config
|
149
150
|
end
|
150
151
|
|
151
152
|
def action_disable
|
@@ -168,27 +169,25 @@ class Chef
|
|
168
169
|
! @config_template.nil? and ! @config_path.nil?
|
169
170
|
end
|
170
171
|
|
172
|
+
def resource_for_config(path)
|
173
|
+
Chef::Resource::File.new(path, run_context)
|
174
|
+
end
|
175
|
+
|
171
176
|
def generate_config
|
172
177
|
return unless can_generate_config?
|
173
178
|
b = binding
|
174
179
|
template = ::ERB.new(@config_template)
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
end
|
180
|
-
Chef::Log.info("#{@new_resource} created configuration file")
|
180
|
+
config = resource_for_config(@config_path)
|
181
|
+
config.content(template.result(b))
|
182
|
+
config.run_action(:create)
|
183
|
+
@new_resource.updated_by_last_action(true) if config.updated?
|
181
184
|
end
|
182
185
|
|
183
186
|
def delete_config
|
184
187
|
return unless can_generate_config?
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
FileUtils.rm_f(@config_path, :verbose => false)
|
189
|
-
end
|
190
|
-
end
|
191
|
-
Chef::Log.info("#{@new_resource} deleted configuration file")
|
188
|
+
config = resource_for_config(@config_path)
|
189
|
+
config.run_action(:delete)
|
190
|
+
@new_resource.updated_by_last_action(true) if config.updated?
|
192
191
|
end
|
193
192
|
|
194
193
|
private
|
data/lib/chef/provider/link.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# Encoding: utf-8
|
2
2
|
# Author:: Hugo Fichter
|
3
3
|
# Author:: Lamont Granquist (<lamont@getchef.com>)
|
4
4
|
# Author:: Joshua Timberman (<joshua@getchef.com>)
|
@@ -25,14 +25,16 @@ require 'forwardable'
|
|
25
25
|
class Chef
|
26
26
|
class Provider
|
27
27
|
class Mount
|
28
|
+
# Mount Solaris File systems
|
28
29
|
class Solaris < Chef::Provider::Mount
|
29
30
|
extend Forwardable
|
30
31
|
|
31
|
-
VFSTAB =
|
32
|
+
VFSTAB = '/etc/vfstab'.freeze
|
32
33
|
|
33
34
|
def_delegator :@new_resource, :device, :device
|
34
35
|
def_delegator :@new_resource, :device_type, :device_type
|
35
36
|
def_delegator :@new_resource, :dump, :dump
|
37
|
+
def_delegator :@new_resource, :fsck_device, :fsck_device
|
36
38
|
def_delegator :@new_resource, :fstype, :fstype
|
37
39
|
def_delegator :@new_resource, :mount_point, :mount_point
|
38
40
|
def_delegator :@new_resource, :options, :options
|
@@ -42,6 +44,7 @@ class Chef
|
|
42
44
|
@current_resource = Chef::Resource::Mount.new(new_resource.name)
|
43
45
|
current_resource.mount_point(mount_point)
|
44
46
|
current_resource.device(device)
|
47
|
+
current_resource.fsck_device(fsck_device)
|
45
48
|
current_resource.device_type(device_type)
|
46
49
|
update_current_resource_state
|
47
50
|
end
|
@@ -53,6 +56,14 @@ class Chef
|
|
53
56
|
a.whyrun("Assuming device #{device} would have been created")
|
54
57
|
end
|
55
58
|
|
59
|
+
unless fsck_device == '-'
|
60
|
+
requirements.assert(:mount, :remount) do |a|
|
61
|
+
a.assertion { ::File.exist?(fsck_device) }
|
62
|
+
a.failure_message(Chef::Exceptions::Mount, "Device #{fsck_device} does not exist")
|
63
|
+
a.whyrun("Assuming device #{fsck_device} would have been created")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
56
67
|
requirements.assert(:mount, :remount) do |a|
|
57
68
|
a.assertion { ::File.exist?(mount_point) }
|
58
69
|
a.failure_message(Chef::Exceptions::Mount, "Mount point #{mount_point} does not exist")
|
@@ -62,7 +73,7 @@ class Chef
|
|
62
73
|
|
63
74
|
def mount_fs
|
64
75
|
actual_options = options || []
|
65
|
-
actual_options.delete(
|
76
|
+
actual_options.delete('noauto')
|
66
77
|
command = "mount -F #{fstype}"
|
67
78
|
command << " -o #{actual_options.join(',')}" unless actual_options.empty?
|
68
79
|
command << " #{device} #{mount_point}"
|
@@ -74,59 +85,28 @@ class Chef
|
|
74
85
|
end
|
75
86
|
|
76
87
|
def remount_fs
|
77
|
-
# FIXME:
|
78
|
-
|
88
|
+
# FIXME: Should remount always do the remount or only if the options change?
|
89
|
+
actual_options = options || []
|
90
|
+
actual_options.delete('noauto')
|
91
|
+
mount_options = actual_options.empty? ? '' : ",#{actual_options.join(',')}"
|
92
|
+
shell_out!("mount -o remount#{mount_options} #{mount_point}")
|
79
93
|
end
|
80
94
|
|
81
95
|
def enable_fs
|
82
|
-
|
96
|
+
unless mount_options_unchanged?
|
83
97
|
# we are enabling because our options have changed, so disable first then re-enable.
|
84
98
|
# XXX: this should be refactored to be the responsibility of the caller
|
85
99
|
disable_fs if current_resource.enabled
|
86
100
|
end
|
87
101
|
|
88
|
-
|
89
|
-
actual_options = unless options.nil?
|
90
|
-
options.delete("noauto")
|
91
|
-
options
|
92
|
-
end
|
93
|
-
|
94
|
-
autostr = auto ? 'yes' : 'no'
|
95
|
-
passstr = pass == 0 ? "-" : pass
|
96
|
-
optstr = (actual_options.nil? || actual_options.empty?) ? "-" : actual_options.join(',')
|
97
|
-
|
98
|
-
etc_tempfile do |f|
|
99
|
-
f.write(IO.read(VFSTAB).chomp)
|
100
|
-
f.puts("\n#{device}\t-\t#{mount_point}\t#{fstype}\t#{passstr}\t#{autostr}\t#{optstr}")
|
101
|
-
f.close
|
102
|
-
# move, preserving modes of destination file
|
103
|
-
mover = Chef::FileContentManagement::Deploy.strategy(true)
|
104
|
-
mover.deploy(f.path, VFSTAB)
|
105
|
-
end
|
106
|
-
|
102
|
+
vfstab_write(merge_vfstab_entry)
|
107
103
|
end
|
108
104
|
|
109
105
|
def disable_fs
|
110
|
-
contents =
|
111
|
-
|
112
|
-
found = false
|
113
|
-
::File.readlines(VFSTAB).reverse_each do |line|
|
114
|
-
if !found && line =~ /^#{device_regex}\s+\S+\s+#{Regexp.escape(mount_point)}/
|
115
|
-
found = true
|
116
|
-
Chef::Log.debug("#{new_resource} is removed from vfstab")
|
117
|
-
next
|
118
|
-
end
|
119
|
-
contents << line
|
120
|
-
end
|
106
|
+
contents, found = delete_vfstab_entry
|
121
107
|
|
122
108
|
if found
|
123
|
-
|
124
|
-
f.write(contents.reverse.join(''))
|
125
|
-
f.close
|
126
|
-
# move, preserving modes of destination file
|
127
|
-
mover = Chef::FileContentManagement::Deploy.strategy(true)
|
128
|
-
mover.deploy(f.path, VFSTAB)
|
129
|
-
end
|
109
|
+
vfstab_write(contents.reverse)
|
130
110
|
else
|
131
111
|
# this is likely some kind of internal error, since we should only call disable_fs when there
|
132
112
|
# the filesystem we want to disable is enabled.
|
@@ -135,19 +115,24 @@ class Chef
|
|
135
115
|
end
|
136
116
|
|
137
117
|
def etc_tempfile
|
138
|
-
yield Tempfile.open(
|
118
|
+
yield Tempfile.open('vfstab', '/etc')
|
139
119
|
end
|
140
120
|
|
141
121
|
def mount_options_unchanged?
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
122
|
+
new_options = options_remove_noauto(options)
|
123
|
+
current_options = options_remove_noauto(current_resource.nil? ? nil : current_resource.options)
|
124
|
+
|
125
|
+
current_resource.fsck_device == fsck_device &&
|
126
|
+
current_resource.fstype == fstype &&
|
127
|
+
current_options == new_options &&
|
128
|
+
current_resource.dump == dump &&
|
129
|
+
current_resource.pass == pass &&
|
130
|
+
current_resource.options.include?('noauto') == !mount_at_boot?
|
146
131
|
end
|
147
132
|
|
148
133
|
def update_current_resource_state
|
149
134
|
current_resource.mounted(mounted?)
|
150
|
-
(
|
135
|
+
(enabled, fstype, options, pass) = read_vfstab_status
|
151
136
|
current_resource.enabled(enabled)
|
152
137
|
current_resource.fstype(fstype)
|
153
138
|
current_resource.options(options)
|
@@ -158,17 +143,18 @@ class Chef
|
|
158
143
|
read_vfstab_status[0]
|
159
144
|
end
|
160
145
|
|
146
|
+
# Check for the device in mounttab.
|
147
|
+
# <device> on <mountpoint> type <fstype> <options> on <date>
|
148
|
+
# /dev/dsk/c1t0d0s0 on / type ufs read/write/setuid/devices/intr/largefiles/logging/xattr/onerror=panic/dev=700040 on Tue May 1 11:33:55 2012
|
161
149
|
def mounted?
|
162
150
|
mounted = false
|
163
|
-
shell_out!(
|
164
|
-
# <device> on <mountpoint> type <fstype> <options> on <date>
|
165
|
-
# /dev/dsk/c1t0d0s0 on / type ufs read/write/setuid/devices/intr/largefiles/logging/xattr/onerror=panic/dev=700040 on Tue May 1 11:33:55 2012
|
151
|
+
shell_out!('mount -v').stdout.each_line do |line|
|
166
152
|
case line
|
167
153
|
when /^#{device_regex}\s+on\s+#{Regexp.escape(mount_point)}\s+/
|
168
154
|
Chef::Log.debug("Special device #{device} is mounted as #{mount_point}")
|
169
155
|
mounted = true
|
170
156
|
when /^([\/\w]+)\son\s#{Regexp.escape(mount_point)}\s+/
|
171
|
-
Chef::Log.debug("Special device #{
|
157
|
+
Chef::Log.debug("Special device #{Regexp.last_match[1]} is mounted as #{mount_point}")
|
172
158
|
mounted = false
|
173
159
|
end
|
174
160
|
end
|
@@ -178,7 +164,7 @@ class Chef
|
|
178
164
|
private
|
179
165
|
|
180
166
|
def read_vfstab_status
|
181
|
-
# Check to see if there is
|
167
|
+
# Check to see if there is an entry in /etc/vfstab. Last entry for a volume wins.
|
182
168
|
enabled = false
|
183
169
|
fstype = options = pass = nil
|
184
170
|
::File.foreach(VFSTAB) do |line|
|
@@ -190,18 +176,18 @@ class Chef
|
|
190
176
|
# to mount to fsck point type pass at boot options
|
191
177
|
when /^#{device_regex}\s+[-\/\w]+\s+#{Regexp.escape(mount_point)}\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/
|
192
178
|
enabled = true
|
193
|
-
fstype =
|
194
|
-
options =
|
179
|
+
fstype = Regexp.last_match[1]
|
180
|
+
options = Regexp.last_match[4]
|
195
181
|
# Store the 'mount at boot' column from vfstab as the 'noauto' option
|
196
182
|
# in current_resource.options (linux style)
|
197
|
-
if
|
183
|
+
if Regexp.last_match[3] == 'no'
|
198
184
|
if options.nil? || options.empty?
|
199
|
-
options =
|
185
|
+
options = 'noauto'
|
200
186
|
else
|
201
|
-
options +=
|
187
|
+
options += ',noauto'
|
202
188
|
end
|
203
189
|
end
|
204
|
-
pass = (
|
190
|
+
pass = (Regexp.last_match[2] == '-') ? 0 : Regexp.last_match[2].to_i
|
205
191
|
Chef::Log.debug("Found mount #{device} to #{mount_point} in #{VFSTAB}")
|
206
192
|
next
|
207
193
|
when /^[-\/\w]+\s+[-\/\w]+\s+#{Regexp.escape(mount_point)}\s+/
|
@@ -210,21 +196,73 @@ class Chef
|
|
210
196
|
Chef::Log.debug("Found conflicting mount point #{mount_point} in #{VFSTAB}")
|
211
197
|
end
|
212
198
|
end
|
213
|
-
[
|
199
|
+
[enabled, fstype, options, pass]
|
214
200
|
end
|
215
201
|
|
216
202
|
def device_should_exist?
|
217
|
-
!%w
|
203
|
+
!%w(tmpfs nfs ctfs proc mntfs objfs sharefs fd smbfs vxfs).include?(fstype)
|
204
|
+
end
|
205
|
+
|
206
|
+
def mount_at_boot?
|
207
|
+
options.nil? || !options.include?('noauto')
|
208
|
+
end
|
209
|
+
|
210
|
+
def vfstab_write(contents)
|
211
|
+
etc_tempfile do |f|
|
212
|
+
f.write(contents.join(''))
|
213
|
+
f.close
|
214
|
+
# move, preserving modes of destination file
|
215
|
+
mover = Chef::FileContentManagement::Deploy.strategy(true)
|
216
|
+
mover.deploy(f.path, VFSTAB)
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
def vfstab_entry
|
221
|
+
actual_options = unless options.nil?
|
222
|
+
tempops = options.dup
|
223
|
+
tempops.delete('noauto')
|
224
|
+
tempops
|
225
|
+
end
|
226
|
+
autostr = mount_at_boot? ? 'yes' : 'no'
|
227
|
+
passstr = pass == 0 ? '-' : pass
|
228
|
+
optstr = (actual_options.nil? || actual_options.empty?) ? '-' : actual_options.join(',')
|
229
|
+
"\n#{device}\t#{fsck_device}\t#{mount_point}\t#{fstype}\t#{passstr}\t#{autostr}\t#{optstr}\n"
|
230
|
+
end
|
231
|
+
|
232
|
+
def delete_vfstab_entry
|
233
|
+
contents = []
|
234
|
+
found = false
|
235
|
+
::File.readlines(VFSTAB).reverse_each do |line|
|
236
|
+
if !found && line =~ /^#{device_regex}\s+\S+\s+#{Regexp.escape(mount_point)}/
|
237
|
+
found = true
|
238
|
+
Chef::Log.debug("#{new_resource} is removed from vfstab")
|
239
|
+
next
|
240
|
+
end
|
241
|
+
contents << line
|
242
|
+
end
|
243
|
+
[contents, found]
|
244
|
+
end
|
245
|
+
|
246
|
+
def merge_vfstab_entry
|
247
|
+
contents = ::File.readlines(VFSTAB)
|
248
|
+
contents[-1].chomp!
|
249
|
+
contents << vfstab_entry
|
250
|
+
end
|
251
|
+
|
252
|
+
def options_remove_noauto(temp_options)
|
253
|
+
new_options = []
|
254
|
+
new_options += temp_options.nil? ? [] : temp_options
|
255
|
+
new_options.delete('noauto')
|
256
|
+
new_options
|
218
257
|
end
|
219
258
|
|
220
259
|
def device_regex
|
221
260
|
if ::File.symlink?(device)
|
222
|
-
"(?:#{Regexp.escape(device)}|#{Regexp.escape(::File.expand_path(::File.readlink(device)
|
261
|
+
"(?:#{Regexp.escape(device)}|#{Regexp.escape(::File.expand_path(::File.readlink(device), ::File.dirname(device)))})"
|
223
262
|
else
|
224
263
|
Regexp.escape(device)
|
225
264
|
end
|
226
265
|
end
|
227
|
-
|
228
266
|
end
|
229
267
|
end
|
230
268
|
end
|