chef 11.18.12 → 12.0.0.alpha.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +10 -0
- data/README.md +1 -1
- data/distro/common/html/_sources/index.txt +5 -2
- data/distro/common/html/_sources/knife_serve.txt +19 -0
- data/distro/common/html/_sources/knife_ssl_check.txt +2 -2
- data/distro/common/html/_sources/knife_ssl_fetch.txt +2 -2
- data/distro/common/html/_static/basic.css +1 -1
- data/distro/common/html/_static/doctools.js +1 -1
- data/distro/common/html/_static/searchtools.js +1 -1
- data/distro/common/html/_static/websupport.js +1 -1
- data/distro/common/html/ctl_chef_client.html +19 -9
- data/distro/common/html/ctl_chef_server.html +7 -1
- data/distro/common/html/ctl_chef_shell.html +3 -4
- data/distro/common/html/ctl_chef_solo.html +12 -7
- data/distro/common/html/index.html +19 -12
- data/distro/common/html/knife.html +1 -2
- data/distro/common/html/knife_bootstrap.html +16 -5
- data/distro/common/html/knife_client.html +8 -5
- data/distro/common/html/knife_common_options.html +11 -12
- data/distro/common/html/knife_configure.html +2 -3
- data/distro/common/html/knife_cookbook.html +16 -17
- data/distro/common/html/knife_cookbook_site.html +19 -18
- data/distro/common/html/knife_data_bag.html +6 -7
- data/distro/common/html/knife_delete.html +2 -3
- data/distro/common/html/knife_deps.html +2 -3
- data/distro/common/html/knife_diff.html +3 -4
- data/distro/common/html/knife_download.html +6 -7
- data/distro/common/html/knife_edit.html +0 -1
- data/distro/common/html/knife_environment.html +3 -4
- data/distro/common/html/knife_exec.html +0 -1
- data/distro/common/html/knife_index_rebuild.html +0 -1
- data/distro/common/html/knife_list.html +5 -6
- data/distro/common/html/knife_node.html +13 -6
- data/distro/common/html/knife_raw.html +0 -1
- data/distro/common/html/knife_recipe_list.html +0 -1
- data/distro/common/html/knife_role.html +1 -2
- data/distro/common/html/knife_search.html +2 -3
- data/distro/common/html/knife_serve.html +79 -0
- data/distro/common/html/knife_show.html +1 -2
- data/distro/common/html/knife_ssh.html +2 -3
- data/distro/common/html/knife_ssl_check.html +12 -9
- data/distro/common/html/knife_ssl_fetch.html +9 -10
- data/distro/common/html/knife_status.html +2 -3
- data/distro/common/html/knife_tag.html +0 -1
- data/distro/common/html/knife_upload.html +3 -4
- data/distro/common/html/knife_user.html +2 -3
- data/distro/common/html/knife_using.html +0 -1
- data/distro/common/html/knife_xargs.html +3 -4
- data/distro/common/html/search.html +0 -1
- data/distro/common/html/searchindex.js +1 -1
- data/lib/chef/api_client.rb +1 -1
- data/lib/chef/application.rb +24 -67
- data/lib/chef/application/client.rb +1 -1
- data/lib/chef/application/knife.rb +1 -1
- data/lib/chef/chef_fs/chef_fs_data_store.rb +2 -3
- data/lib/chef/chef_fs/command_line.rb +2 -3
- data/lib/chef/chef_fs/data_handler/group_data_handler.rb +1 -5
- data/lib/chef/chef_fs/file_system/acl_entry.rb +1 -2
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +1 -2
- data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +2 -2
- data/lib/chef/chef_fs/file_system/rest_list_dir.rb +2 -3
- data/lib/chef/chef_fs/file_system/rest_list_entry.rb +4 -5
- data/lib/chef/config.rb +26 -2
- data/lib/chef/config_fetcher.rb +1 -1
- data/lib/chef/cookbook/cookbook_version_loader.rb +4 -4
- data/lib/chef/cookbook/metadata.rb +1 -1
- data/lib/chef/cookbook/synchronizer.rb +50 -8
- data/lib/chef/cookbook_uploader.rb +9 -23
- data/lib/chef/cookbook_version.rb +3 -2
- data/lib/chef/data_bag.rb +1 -1
- data/lib/chef/data_bag_item.rb +1 -1
- data/lib/chef/dsl/recipe.rb +1 -14
- data/lib/chef/encrypted_data_bag_item/decryptor.rb +3 -3
- data/lib/chef/environment.rb +1 -1
- data/lib/chef/exceptions.rb +2 -24
- data/lib/chef/file_content_management/tempfile.rb +8 -1
- data/lib/chef/formatters/base.rb +0 -7
- data/lib/chef/http.rb +12 -19
- data/lib/chef/http/json_input.rb +12 -1
- data/lib/chef/json_compat.rb +45 -64
- data/lib/chef/knife.rb +2 -5
- data/lib/chef/knife/bootstrap.rb +2 -2
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +2 -2
- data/lib/chef/knife/bootstrap/centos5-gems.erb +2 -2
- data/lib/chef/knife/bootstrap/chef-aix.erb +2 -2
- data/lib/chef/knife/bootstrap/chef-full.erb +2 -2
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +2 -2
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +2 -2
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +2 -2
- data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +2 -2
- data/lib/chef/knife/cookbook_site_download.rb +1 -1
- data/lib/chef/knife/cookbook_site_install.rb +10 -34
- data/lib/chef/knife/cookbook_site_list.rb +1 -1
- data/lib/chef/knife/cookbook_site_search.rb +1 -1
- data/lib/chef/knife/cookbook_site_share.rb +3 -3
- data/lib/chef/knife/cookbook_site_show.rb +3 -3
- data/lib/chef/knife/cookbook_site_unshare.rb +1 -1
- data/lib/chef/knife/cookbook_upload.rb +1 -1
- data/lib/chef/knife/core/subcommand_loader.rb +0 -24
- data/lib/chef/knife/core/ui.rb +8 -7
- data/lib/chef/knife/deps.rb +2 -3
- data/lib/chef/knife/serve.rb +2 -1
- data/lib/chef/local_mode.rb +105 -0
- data/lib/chef/mixin/file_class.rb +1 -4
- data/lib/chef/mixin/shell_out.rb +15 -0
- data/lib/chef/mixin/windows_architecture_helper.rb +0 -16
- data/lib/chef/node.rb +1 -1
- data/lib/chef/platform/query_helpers.rb +1 -5
- data/lib/chef/policy_builder/expand_node_object.rb +3 -0
- data/lib/chef/provider.rb +2 -0
- data/lib/chef/provider/cookbook_file.rb +0 -1
- data/lib/chef/provider/deploy.rb +0 -1
- data/lib/chef/provider/deploy/revision.rb +1 -1
- data/lib/chef/provider/env.rb +10 -25
- data/lib/chef/provider/env/windows.rb +23 -10
- data/lib/chef/provider/execute.rb +0 -3
- data/lib/chef/provider/file.rb +0 -3
- data/lib/chef/provider/git.rb +0 -6
- data/lib/chef/provider/group/dscl.rb +9 -27
- data/lib/chef/provider/group/gpasswd.rb +0 -3
- data/lib/chef/provider/group/groupmod.rb +0 -4
- data/lib/chef/provider/group/suse.rb +0 -3
- data/lib/chef/provider/group/usermod.rb +0 -3
- data/lib/chef/provider/link.rb +22 -5
- data/lib/chef/provider/log.rb +15 -4
- data/lib/chef/provider/mdadm.rb +0 -3
- data/lib/chef/provider/mount/mount.rb +0 -2
- data/lib/chef/provider/mount/solaris.rb +0 -2
- data/lib/chef/provider/package.rb +0 -1
- data/lib/chef/provider/package/apt.rb +0 -3
- data/lib/chef/provider/package/dpkg.rb +0 -1
- data/lib/chef/provider/package/easy_install.rb +0 -4
- data/lib/chef/provider/package/freebsd/base.rb +0 -3
- data/lib/chef/provider/package/freebsd/pkgng.rb +0 -2
- data/lib/chef/provider/package/freebsd/port.rb +0 -2
- data/lib/chef/provider/package/ips.rb +0 -3
- data/lib/chef/provider/package/paludis.rb +0 -5
- data/lib/chef/provider/package/portage.rb +0 -2
- data/lib/chef/provider/package/rpm.rb +2 -4
- data/lib/chef/provider/package/rubygems.rb +0 -4
- data/lib/chef/provider/package/smartos.rb +0 -3
- data/lib/chef/provider/package/windows/msi.rb +0 -2
- data/lib/chef/provider/package/yum.rb +0 -4
- data/lib/chef/provider/package/zypper.rb +0 -3
- data/lib/chef/provider/registry_key.rb +0 -2
- data/lib/chef/provider/remote_directory.rb +0 -1
- data/lib/chef/provider/remote_file.rb +0 -1
- data/lib/chef/provider/remote_file/cache_control_data.rb +1 -3
- data/lib/chef/provider/remote_file/content.rb +0 -1
- data/lib/chef/provider/remote_file/fetcher.rb +0 -2
- data/lib/chef/provider/remote_file/ftp.rb +0 -1
- data/lib/chef/provider/resource_update.rb +0 -3
- data/lib/chef/provider/service/freebsd.rb +0 -3
- data/lib/chef/provider/service/init.rb +0 -3
- data/lib/chef/provider/service/macosx.rb +0 -1
- data/lib/chef/provider/service/redhat.rb +0 -2
- data/lib/chef/provider/service/simple.rb +0 -3
- data/lib/chef/provider/service/solaris.rb +0 -3
- data/lib/chef/provider/service/systemd.rb +15 -14
- data/lib/chef/provider/service/windows.rb +0 -3
- data/lib/chef/provider/subversion.rb +0 -2
- data/lib/chef/provider/template.rb +0 -2
- data/lib/chef/provider/template/content.rb +0 -1
- data/lib/chef/provider/user/dscl.rb +156 -549
- data/lib/chef/provider/user/solaris.rb +0 -1
- data/lib/chef/provider/user/useradd.rb +0 -3
- data/lib/chef/provider/whyrun_safe_ruby_block.rb +1 -1
- data/lib/chef/providers.rb +0 -1
- data/lib/chef/resource.rb +1 -4
- data/lib/chef/resource/freebsd_package.rb +2 -10
- data/lib/chef/resource/lwrp_base.rb +1 -12
- data/lib/chef/resource/user.rb +0 -18
- data/lib/chef/resource_collection.rb +1 -1
- data/lib/chef/resource_reporter.rb +10 -10
- data/lib/chef/resources.rb +0 -1
- data/lib/chef/role.rb +3 -3
- data/lib/chef/run_list.rb +1 -1
- data/lib/chef/tasks/chef_repo.rake +131 -264
- data/lib/chef/user.rb +1 -1
- data/lib/chef/util/path_helper.rb +2 -2
- data/lib/chef/version.rb +9 -1
- data/lib/chef/win32/api/system.rb +0 -9
- data/spec/data/bootstrap/test-hints.erb +1 -1
- data/spec/data/bootstrap/test.erb +1 -1
- data/spec/functional/dsl/reboot_pending_spec.rb +53 -58
- data/spec/functional/knife/cookbook_delete_spec.rb +3 -3
- data/spec/functional/knife/exec_spec.rb +1 -1
- data/spec/functional/mixin/shell_out_spec.rb +48 -0
- data/spec/functional/resource/base.rb +0 -10
- data/spec/functional/resource/group_spec.rb +1 -5
- data/spec/functional/resource/link_spec.rb +8 -0
- data/spec/functional/resource/{user/useradd_spec.rb → user_spec.rb} +1 -1
- data/spec/integration/knife/chef_fs_data_store_spec.rb +3 -3
- data/spec/integration/knife/chef_repo_path_spec.rb +1 -6
- data/spec/integration/knife/chef_repository_file_system_spec.rb +1 -1
- data/spec/integration/knife/chefignore_spec.rb +1 -1
- data/spec/integration/knife/common_options_spec.rb +50 -3
- data/spec/integration/knife/cookbook_api_ipv6_spec.rb +1 -1
- data/spec/integration/knife/delete_spec.rb +1 -1
- data/spec/integration/knife/deps_spec.rb +1 -1
- data/spec/integration/knife/diff_spec.rb +3 -3
- data/spec/integration/knife/download_spec.rb +3 -3
- data/spec/integration/knife/list_spec.rb +1 -1
- data/spec/integration/knife/raw_spec.rb +1 -11
- data/spec/integration/knife/redirection_spec.rb +1 -1
- data/spec/integration/knife/serve_spec.rb +2 -2
- data/spec/integration/knife/show_spec.rb +1 -1
- data/spec/integration/knife/upload_spec.rb +9 -9
- data/spec/spec_helper.rb +0 -9
- data/spec/support/pedant/pedant_config.rb +2 -1
- data/spec/support/pedant/run_pedant.rb +2 -1
- data/spec/support/platform_helpers.rb +5 -24
- data/spec/support/shared/integration/integration_helper.rb +2 -1
- data/spec/support/shared/matchers.rb +17 -0
- data/spec/tiny_server.rb +1 -2
- data/spec/unit/api_client_spec.rb +3 -3
- data/spec/unit/application_spec.rb +9 -32
- data/spec/unit/config_fetcher_spec.rb +1 -1
- data/spec/unit/cookbook/metadata_spec.rb +3 -7
- data/spec/unit/cookbook/synchronizer_spec.rb +441 -226
- data/spec/unit/cookbook_loader_spec.rb +1 -1
- data/spec/unit/cookbook_uploader_spec.rb +160 -0
- data/spec/unit/cookbook_version_spec.rb +0 -4
- data/spec/unit/data_bag_item_spec.rb +1 -5
- data/spec/unit/data_bag_spec.rb +1 -5
- data/spec/unit/deprecation_spec.rb +1 -1
- data/spec/unit/dsl/recipe_spec.rb +12 -0
- data/spec/unit/encrypted_data_bag_item_spec.rb +7 -14
- data/spec/unit/environment_spec.rb +3 -7
- data/spec/unit/exceptions_spec.rb +0 -6
- data/spec/unit/http/json_input_spec.rb +128 -0
- data/spec/unit/json_compat_spec.rb +17 -58
- data/spec/unit/knife/client_create_spec.rb +3 -3
- data/spec/unit/knife/configure_client_spec.rb +6 -5
- data/spec/unit/knife/cookbook_delete_spec.rb +1 -1
- data/spec/unit/knife/cookbook_download_spec.rb +5 -5
- data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +1 -0
- data/spec/unit/knife/cookbook_metadata_spec.rb +1 -1
- data/spec/unit/knife/cookbook_site_download_spec.rb +10 -11
- data/spec/unit/knife/cookbook_site_install_spec.rb +116 -161
- data/spec/unit/knife/cookbook_site_share_spec.rb +8 -8
- data/spec/unit/knife/cookbook_upload_spec.rb +3 -2
- data/spec/unit/knife/core/bootstrap_context_spec.rb +3 -3
- data/spec/unit/knife/core/subcommand_loader_spec.rb +1 -66
- data/spec/unit/knife/data_bag_from_file_spec.rb +2 -1
- data/spec/unit/knife/tag_create_spec.rb +3 -3
- data/spec/unit/knife/tag_delete_spec.rb +3 -3
- data/spec/unit/knife/user_create_spec.rb +1 -1
- data/spec/unit/knife_spec.rb +14 -14
- data/spec/unit/lwrp_spec.rb +1 -21
- data/spec/unit/mixin/shell_out_spec.rb +92 -0
- data/spec/unit/node_spec.rb +0 -4
- data/spec/unit/platform/query_helpers_spec.rb +0 -23
- data/spec/unit/provider/env/windows_spec.rb +34 -70
- data/spec/unit/provider/env_spec.rb +11 -76
- data/spec/unit/provider/group/dscl_spec.rb +1 -38
- data/spec/unit/provider/log_spec.rb +18 -0
- data/spec/unit/provider/package/rpm_spec.rb +0 -12
- data/spec/unit/provider/remote_file/cache_control_data_spec.rb +1 -1
- data/spec/unit/provider/service/systemd_service_spec.rb +44 -27
- data/spec/unit/provider/user/dscl_spec.rb +264 -660
- data/spec/unit/provider/user/useradd_spec.rb +0 -1
- data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +2 -2
- data/spec/unit/provider_spec.rb +12 -0
- data/spec/unit/recipe_spec.rb +0 -41
- data/spec/unit/resource_collection_spec.rb +1 -5
- data/spec/unit/resource_reporter_spec.rb +3 -51
- data/spec/unit/resource_spec.rb +3 -14
- data/spec/unit/rest_spec.rb +1 -4
- data/spec/unit/role_spec.rb +0 -10
- data/spec/unit/run_list_spec.rb +1 -5
- data/spec/unit/user_spec.rb +1 -5
- metadata +20 -100
- data/lib/chef/mixin/windows_env_helper.rb +0 -56
- data/lib/chef/provider/dsc_script.rb +0 -175
- data/lib/chef/resource/dsc_script.rb +0 -126
- data/lib/chef/streaming_cookbook_uploader.rb +0 -205
- data/lib/chef/util/dsc/configuration_generator.rb +0 -115
- data/lib/chef/util/dsc/lcm_output_parser.rb +0 -133
- data/lib/chef/util/dsc/local_configuration_manager.rb +0 -141
- data/lib/chef/util/dsc/resource_info.rb +0 -26
- data/lib/chef/util/powershell/cmdlet.rb +0 -136
- data/lib/chef/util/powershell/cmdlet_result.rb +0 -46
- data/spec/data/mac_users/10.7-8.plist.xml +0 -559
- data/spec/data/mac_users/10.7-8.shadow.xml +0 -11
- data/spec/data/mac_users/10.7.plist.xml +0 -559
- data/spec/data/mac_users/10.7.shadow.xml +0 -11
- data/spec/data/mac_users/10.8.plist.xml +0 -559
- data/spec/data/mac_users/10.8.shadow.xml +0 -21
- data/spec/data/mac_users/10.9.plist.xml +0 -560
- data/spec/data/mac_users/10.9.shadow.xml +0 -21
- data/spec/functional/provider/whyrun_safe_ruby_block_spec.rb +0 -51
- data/spec/functional/resource/dsc_script_spec.rb +0 -382
- data/spec/functional/resource/env_spec.rb +0 -182
- data/spec/functional/resource/user/dscl_spec.rb +0 -199
- data/spec/functional/util/powershell/cmdlet_spec.rb +0 -113
- data/spec/support/lib/chef/resource/zen_follower.rb +0 -46
- data/spec/support/shared/shared_examples.rb +0 -10
- data/spec/unit/chef_fs/data_handler/group_handler_spec.rb +0 -63
- data/spec/unit/formatters/base_spec.rb +0 -48
- data/spec/unit/provider/dsc_script_spec.rb +0 -174
- data/spec/unit/resource/dsc_script_spec.rb +0 -98
- data/spec/unit/util/dsc/configuration_generator_spec.rb +0 -171
- data/spec/unit/util/dsc/lcm_output_parser_spec.rb +0 -169
- data/spec/unit/util/dsc/local_configuration_manager_spec.rb +0 -139
- data/spec/unit/util/powershell/cmdlet_spec.rb +0 -106
@@ -1,115 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Adam Edwards (<adamed@getchef.com>)
|
3
|
-
#
|
4
|
-
# Copyright:: 2014, Chef Software, Inc.
|
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/util/powershell/cmdlet'
|
20
|
-
|
21
|
-
class Chef::Util::DSC
|
22
|
-
class ConfigurationGenerator
|
23
|
-
def initialize(node, config_directory)
|
24
|
-
@node = node
|
25
|
-
@config_directory = config_directory
|
26
|
-
end
|
27
|
-
|
28
|
-
def configuration_document_from_script_code(code, configuration_flags, shellout_flags)
|
29
|
-
Chef::Log.debug("DSC: DSC code:\n '#{code}'")
|
30
|
-
generated_script_path = write_document_generation_script(code, 'chef_dsc')
|
31
|
-
begin
|
32
|
-
configuration_document_from_script_path(generated_script_path, 'chef_dsc', configuration_flags, shellout_flags)
|
33
|
-
ensure
|
34
|
-
::FileUtils.rm(generated_script_path)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def configuration_document_from_script_path(script_path, configuration_name, configuration_flags, shellout_flags)
|
39
|
-
validate_configuration_name!(configuration_name)
|
40
|
-
|
41
|
-
document_generation_cmdlet = Chef::Util::Powershell::Cmdlet.new(
|
42
|
-
@node,
|
43
|
-
configuration_document_generation_code(script_path, configuration_name))
|
44
|
-
|
45
|
-
merged_configuration_flags = get_merged_configuration_flags!(configuration_flags, configuration_name)
|
46
|
-
|
47
|
-
document_generation_cmdlet.run!(merged_configuration_flags, shellout_flags)
|
48
|
-
configuration_document_location = find_configuration_document(configuration_name)
|
49
|
-
|
50
|
-
if ! configuration_document_location
|
51
|
-
raise RuntimeError, "No DSC configuration for '#{configuration_name}' was generated from supplied DSC script"
|
52
|
-
end
|
53
|
-
|
54
|
-
configuration_document = get_configuration_document(configuration_document_location)
|
55
|
-
::FileUtils.rm_rf(configuration_document_location)
|
56
|
-
configuration_document
|
57
|
-
end
|
58
|
-
|
59
|
-
protected
|
60
|
-
|
61
|
-
# From PowerShell error help for the Configuration language element:
|
62
|
-
# Standard names may only contain letters (a-z, A-Z), numbers (0-9), and underscore (_).
|
63
|
-
# The name may not be null or empty, and should start with a letter.
|
64
|
-
def validate_configuration_name!(configuration_name)
|
65
|
-
if !!(configuration_name =~ /\A[A-Za-z]+[_a-zA-Z0-9]*\Z/) == false
|
66
|
-
raise ArgumentError, 'Configuration `#{configuration_name}` is not a valid PowerShell cmdlet name'
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def get_merged_configuration_flags!(configuration_flags, configuration_name)
|
71
|
-
merged_configuration_flags = { :outputpath => configuration_document_directory(configuration_name) }
|
72
|
-
if configuration_flags
|
73
|
-
configuration_flags.map do | switch, value |
|
74
|
-
if merged_configuration_flags.key?(switch.to_s.downcase.to_sym)
|
75
|
-
raise ArgumentError, "The `flags` attribute for the dsc_script resource contained a command line switch :#{switch.to_s} that is disallowed."
|
76
|
-
end
|
77
|
-
merged_configuration_flags[switch.to_s.downcase.to_sym] = value
|
78
|
-
end
|
79
|
-
end
|
80
|
-
merged_configuration_flags
|
81
|
-
end
|
82
|
-
|
83
|
-
def configuration_code(code, configuration_name)
|
84
|
-
"$ProgressPreference = 'SilentlyContinue';Configuration '#{configuration_name}'\n{\n\tnode 'localhost'\n{\n\t#{code}\n}}\n"
|
85
|
-
end
|
86
|
-
|
87
|
-
def configuration_document_generation_code(configuration_script, configuration_name)
|
88
|
-
". '#{configuration_script}';#{configuration_name}"
|
89
|
-
end
|
90
|
-
|
91
|
-
def write_document_generation_script(code, configuration_name)
|
92
|
-
script_path = "#{@config_directory}/chef_dsc_config.ps1"
|
93
|
-
::File.open(script_path, 'wt') do | script |
|
94
|
-
script.write(configuration_code(code, configuration_name))
|
95
|
-
end
|
96
|
-
script_path
|
97
|
-
end
|
98
|
-
|
99
|
-
def find_configuration_document(configuration_name)
|
100
|
-
document_directory = configuration_document_directory(configuration_name)
|
101
|
-
document_file_name = ::Dir.entries(document_directory).find { | path | path =~ /.*.mof/ }
|
102
|
-
::File.join(document_directory, document_file_name) if document_file_name
|
103
|
-
end
|
104
|
-
|
105
|
-
def configuration_document_directory(configuration_name)
|
106
|
-
::File.join(@config_directory, configuration_name)
|
107
|
-
end
|
108
|
-
|
109
|
-
def get_configuration_document(document_path)
|
110
|
-
::File.open(document_path, 'rb') do | file |
|
111
|
-
file.read
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
@@ -1,133 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Jay Mundrawala (<jdm@getchef.com>)
|
3
|
-
#
|
4
|
-
# Copyright:: 2014, Chef Software, Inc.
|
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/log'
|
20
|
-
require 'chef/util/dsc/resource_info'
|
21
|
-
|
22
|
-
class Chef
|
23
|
-
class Util
|
24
|
-
class DSC
|
25
|
-
class LocalConfigurationManager
|
26
|
-
module Parser
|
27
|
-
# Parses the output from LCM and returns a list of Chef::Util::DSC::ResourceInfo objects
|
28
|
-
# that describe how the resources affected the system
|
29
|
-
#
|
30
|
-
# Example:
|
31
|
-
# parse <<-EOF
|
32
|
-
# What if: [Machine]: LCM: [Start Set ]
|
33
|
-
# What if: [Machine]: LCM: [Start Resource ] [[File]FileToNotBeThere]
|
34
|
-
# What if: [Machine]: LCM: [Start Set ] [[File]FileToNotBeThere]
|
35
|
-
# What if: [C:\ShouldNotExist.txt] removed
|
36
|
-
# What if: [Machine]: LCM: [End Set ] [[File]FileToNotBeThere] in 0.1 seconds
|
37
|
-
# What if: [Machine]: LCM: [End Resource ] [[File]FileToNotBeThere]
|
38
|
-
# What if: [Machine]: LCM: [End Set ]
|
39
|
-
# EOF
|
40
|
-
#
|
41
|
-
# would return
|
42
|
-
#
|
43
|
-
# [
|
44
|
-
# Chef::Util::DSC::ResourceInfo.new(
|
45
|
-
# '[[File]FileToNotBeThere]',
|
46
|
-
# true,
|
47
|
-
# [
|
48
|
-
# '[[File]FileToNotBeThere]',
|
49
|
-
# '[C:\Shouldnotexist.txt]',
|
50
|
-
# '[[File]FileToNotBeThere] in 0.1 seconds'
|
51
|
-
# ]
|
52
|
-
# )
|
53
|
-
# ]
|
54
|
-
#
|
55
|
-
def self.parse(lcm_output)
|
56
|
-
return [] unless lcm_output
|
57
|
-
|
58
|
-
current_resource = Hash.new
|
59
|
-
|
60
|
-
resources = []
|
61
|
-
lcm_output.lines.each do |line|
|
62
|
-
op_action, op_type, info = parse_line(line)
|
63
|
-
|
64
|
-
case op_action
|
65
|
-
when :start
|
66
|
-
case op_type
|
67
|
-
when :set
|
68
|
-
if current_resource[:name]
|
69
|
-
current_resource[:context] = :logging
|
70
|
-
current_resource[:logs] = [info]
|
71
|
-
end
|
72
|
-
when :resource
|
73
|
-
if current_resource[:name]
|
74
|
-
resources.push(current_resource)
|
75
|
-
end
|
76
|
-
current_resource = {:name => info}
|
77
|
-
else
|
78
|
-
Chef::Log.debug("Ignoring op_action #{op_action}: Read line #{line}")
|
79
|
-
end
|
80
|
-
when :end
|
81
|
-
# Make sure we log the last line
|
82
|
-
if current_resource[:context] == :logging and info.include? current_resource[:name]
|
83
|
-
current_resource[:logs].push(info)
|
84
|
-
end
|
85
|
-
current_resource[:context] = nil
|
86
|
-
when :skip
|
87
|
-
current_resource[:skipped] = true
|
88
|
-
when :info
|
89
|
-
if current_resource[:context] == :logging
|
90
|
-
current_resource[:logs].push(info)
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
if current_resource[:name]
|
96
|
-
resources.push(current_resource)
|
97
|
-
end
|
98
|
-
|
99
|
-
build_resource_info(resources)
|
100
|
-
end
|
101
|
-
|
102
|
-
def self.parse_line(line)
|
103
|
-
if match = line.match(/^.*?:.*?:\s*LCM:\s*\[(.*?)\](.*)/)
|
104
|
-
# If the line looks like
|
105
|
-
# What If: [machinename]: LCM: [op_action op_type] message
|
106
|
-
# extract op_action, op_type, and message
|
107
|
-
operation, info = match.captures
|
108
|
-
op_action, op_type = operation.strip.split(' ').map {|m| m.downcase.to_sym}
|
109
|
-
else
|
110
|
-
op_action = op_type = :info
|
111
|
-
if match = line.match(/^.*?:.*?: \s+(.*)/)
|
112
|
-
info = match.captures[0]
|
113
|
-
else
|
114
|
-
info = line
|
115
|
-
end
|
116
|
-
end
|
117
|
-
info.strip! # Because this was formatted for humans
|
118
|
-
return [op_action, op_type, info]
|
119
|
-
end
|
120
|
-
private_class_method :parse_line
|
121
|
-
|
122
|
-
def self.build_resource_info(resources)
|
123
|
-
resources.map do |r|
|
124
|
-
Chef::Util::DSC::ResourceInfo.new(r[:name], !r[:skipped], r[:logs])
|
125
|
-
end
|
126
|
-
end
|
127
|
-
private_class_method :build_resource_info
|
128
|
-
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|
133
|
-
end
|
@@ -1,141 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Adam Edwards (<adamed@getchef.com>)
|
3
|
-
#
|
4
|
-
# Copyright:: 2014, Chef Software, Inc.
|
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/util/powershell/cmdlet'
|
20
|
-
require 'chef/util/dsc/lcm_output_parser'
|
21
|
-
|
22
|
-
class Chef::Util::DSC
|
23
|
-
class LocalConfigurationManager
|
24
|
-
def initialize(node, configuration_path)
|
25
|
-
@node = node
|
26
|
-
@configuration_path = configuration_path
|
27
|
-
clear_execution_time
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_configuration(configuration_document)
|
31
|
-
status = run_configuration_cmdlet(configuration_document)
|
32
|
-
log_what_if_exception(status.stderr) unless status.succeeded?
|
33
|
-
configuration_update_required?(status.return_value)
|
34
|
-
end
|
35
|
-
|
36
|
-
def set_configuration(configuration_document)
|
37
|
-
run_configuration_cmdlet(configuration_document, true)
|
38
|
-
end
|
39
|
-
|
40
|
-
def last_operation_execution_time_seconds
|
41
|
-
if @operation_start_time && @operation_end_time
|
42
|
-
@operation_end_time - @operation_start_time
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
private
|
47
|
-
|
48
|
-
def run_configuration_cmdlet(configuration_document, apply_configuration = false)
|
49
|
-
Chef::Log.debug("DSC: Calling DSC Local Config Manager to #{apply_configuration ? "set" : "test"} configuration document.")
|
50
|
-
test_only_parameters = ! apply_configuration ? '-whatif; if (! $?) { exit 1 }' : ''
|
51
|
-
|
52
|
-
start_operation_timing
|
53
|
-
command_code = lcm_command_code(@configuration_path, test_only_parameters)
|
54
|
-
status = nil
|
55
|
-
|
56
|
-
begin
|
57
|
-
save_configuration_document(configuration_document)
|
58
|
-
cmdlet = ::Chef::Util::Powershell::Cmdlet.new(@node, "#{command_code}")
|
59
|
-
if apply_configuration
|
60
|
-
status = cmdlet.run!
|
61
|
-
else
|
62
|
-
status = cmdlet.run
|
63
|
-
end
|
64
|
-
ensure
|
65
|
-
end_operation_timing
|
66
|
-
remove_configuration_document
|
67
|
-
if last_operation_execution_time_seconds
|
68
|
-
Chef::Log.debug("DSC: DSC operation completed in #{last_operation_execution_time_seconds} seconds.")
|
69
|
-
end
|
70
|
-
end
|
71
|
-
Chef::Log.debug("DSC: Completed call to DSC Local Config Manager")
|
72
|
-
status
|
73
|
-
end
|
74
|
-
|
75
|
-
def lcm_command_code(configuration_path, test_only_parameters)
|
76
|
-
<<-EOH
|
77
|
-
$ProgressPreference = 'SilentlyContinue';start-dscconfiguration -path #{@configuration_path} -wait -erroraction 'continue' -force #{test_only_parameters}
|
78
|
-
EOH
|
79
|
-
end
|
80
|
-
|
81
|
-
def log_what_if_exception(what_if_exception_output)
|
82
|
-
if whatif_not_supported?(what_if_exception_output)
|
83
|
-
# LCM returns an error if any of the resources do not support the opptional What-If
|
84
|
-
Chef::Log::warn("Received error while testing configuration due to resource not supporting 'WhatIf'")
|
85
|
-
elsif dsc_module_import_failure?(what_if_exception_output)
|
86
|
-
Chef::Log::warn("Received error while testing configuration due to a module for an imported resource possibly not being fully installed:\n#{what_if_exception_output.gsub(/\s+/, ' ')}")
|
87
|
-
else
|
88
|
-
Chef::Log::warn("Received error while testing configuration:\n#{what_if_exception_output.gsub(/\s+/, ' ')}")
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
def whatif_not_supported?(what_if_exception_output)
|
93
|
-
!! (what_if_exception_output.gsub(/[\r\n]+/, '').gsub(/\s+/, ' ') =~ /A parameter cannot be found that matches parameter name 'Whatif'/i)
|
94
|
-
end
|
95
|
-
|
96
|
-
def dsc_module_import_failure?(what_if_output)
|
97
|
-
!! (what_if_output =~ /\sCimException/ &&
|
98
|
-
what_if_output =~ /ProviderOperationExecutionFailure/ &&
|
99
|
-
what_if_output =~ /\smodule\s+is\s+installed/)
|
100
|
-
end
|
101
|
-
|
102
|
-
def configuration_update_required?(what_if_output)
|
103
|
-
Chef::Log.debug("DSC: DSC returned the following '-whatif' output from test operation:\n#{what_if_output}")
|
104
|
-
begin
|
105
|
-
Parser::parse(what_if_output)
|
106
|
-
rescue Chef::Util::DSC::LocalConfigurationManager::Parser => e
|
107
|
-
Chef::Log::warn("Could not parse LCM output: #{e}")
|
108
|
-
[Chef::Util::DSC::ResourceInfo.new('Unknown DSC Resources', true, ['Unknown changes because LCM output was not parsable.'])]
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
def save_configuration_document(configuration_document)
|
113
|
-
::FileUtils.mkdir_p(@configuration_path)
|
114
|
-
::File.open(configuration_document_path, 'wb') do | file |
|
115
|
-
file.write(configuration_document)
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
def remove_configuration_document
|
120
|
-
::FileUtils.rm(configuration_document_path)
|
121
|
-
end
|
122
|
-
|
123
|
-
def configuration_document_path
|
124
|
-
File.join(@configuration_path,'..mof')
|
125
|
-
end
|
126
|
-
|
127
|
-
def clear_execution_time
|
128
|
-
@operation_start_time = nil
|
129
|
-
@operation_end_time = nil
|
130
|
-
end
|
131
|
-
|
132
|
-
def start_operation_timing
|
133
|
-
clear_execution_time
|
134
|
-
@operation_start_time = Time.now
|
135
|
-
end
|
136
|
-
|
137
|
-
def end_operation_timing
|
138
|
-
@operation_end_time = Time.now
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
|
2
|
-
class Chef
|
3
|
-
class Util
|
4
|
-
class DSC
|
5
|
-
class ResourceInfo
|
6
|
-
# The name is the text following [Start Set]
|
7
|
-
attr_reader :name
|
8
|
-
|
9
|
-
# A list of all log messages between [Start Set] and [End Set].
|
10
|
-
# Each line is an element in the list.
|
11
|
-
attr_reader :change_log
|
12
|
-
|
13
|
-
def initialize(name, sets, change_log)
|
14
|
-
@name = name
|
15
|
-
@sets = sets
|
16
|
-
@change_log = change_log || []
|
17
|
-
end
|
18
|
-
|
19
|
-
# Does this resource change the state of the system?
|
20
|
-
def changes_state?
|
21
|
-
@sets
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,136 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Adam Edwards (<adamed@getchef.com>)
|
3
|
-
#
|
4
|
-
# Copyright:: 2014, Chef Software, Inc.
|
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 'mixlib/shellout'
|
20
|
-
require 'chef/mixin/windows_architecture_helper'
|
21
|
-
require 'chef/util/powershell/cmdlet_result'
|
22
|
-
|
23
|
-
class Chef::Util::Powershell
|
24
|
-
class Cmdlet
|
25
|
-
def initialize(node, cmdlet, output_format=nil, output_format_options={})
|
26
|
-
@output_format = output_format
|
27
|
-
@node = node
|
28
|
-
|
29
|
-
case output_format
|
30
|
-
when nil
|
31
|
-
@json_format = false
|
32
|
-
when :json
|
33
|
-
@json_format = true
|
34
|
-
when :text
|
35
|
-
@json_format = false
|
36
|
-
when :object
|
37
|
-
@json_format = true
|
38
|
-
else
|
39
|
-
raise ArgumentError, "Invalid output format #{output_format.to_s} specified"
|
40
|
-
end
|
41
|
-
|
42
|
-
@cmdlet = cmdlet
|
43
|
-
@output_format_options = output_format_options
|
44
|
-
end
|
45
|
-
|
46
|
-
attr_reader :output_format
|
47
|
-
|
48
|
-
def run(switches={}, execution_options={}, *arguments)
|
49
|
-
arguments_string = arguments.join(' ')
|
50
|
-
|
51
|
-
switches_string = command_switches_string(switches)
|
52
|
-
|
53
|
-
json_depth = 5
|
54
|
-
|
55
|
-
if @json_format && @output_format_options.has_key?(:depth)
|
56
|
-
json_depth = @output_format_options[:depth]
|
57
|
-
end
|
58
|
-
|
59
|
-
json_command = @json_format ? " | convertto-json -compress -depth #{json_depth}" : ""
|
60
|
-
command_string = "powershell.exe -executionpolicy bypass -noprofile -noninteractive -command \"trap [Exception] {write-error -exception ($_.Exception.Message);exit 1};#{@cmdlet} #{switches_string} #{arguments_string}#{json_command}\";if ( ! $? ) { exit 1 }"
|
61
|
-
|
62
|
-
augmented_options = {:returns => [0], :live_stream => false}.merge(execution_options)
|
63
|
-
command = Mixlib::ShellOut.new(command_string, augmented_options)
|
64
|
-
|
65
|
-
os_architecture = "#{ENV['PROCESSOR_ARCHITEW6432']}" == 'AMD64' ? :x86_64 : :i386
|
66
|
-
|
67
|
-
status = nil
|
68
|
-
|
69
|
-
with_os_architecture(@node) do
|
70
|
-
status = command.run_command
|
71
|
-
end
|
72
|
-
|
73
|
-
CmdletResult.new(status, @output_format)
|
74
|
-
end
|
75
|
-
|
76
|
-
def run!(switches={}, execution_options={}, *arguments)
|
77
|
-
result = run(switches, execution_options, arguments)
|
78
|
-
|
79
|
-
if ! result.succeeded?
|
80
|
-
raise Chef::Exceptions::PowershellCmdletException, "Powershell Cmdlet failed: #{result.stderr}"
|
81
|
-
end
|
82
|
-
|
83
|
-
result
|
84
|
-
end
|
85
|
-
|
86
|
-
protected
|
87
|
-
|
88
|
-
include Chef::Mixin::WindowsArchitectureHelper
|
89
|
-
|
90
|
-
def validate_switch_name!(switch_parameter_name)
|
91
|
-
if !!(switch_parameter_name.to_s =~ /\A[A-Za-z]+[_a-zA-Z0-9]*\Z/) == false
|
92
|
-
raise ArgumentError, "`#{switch_parameter_name}` is not a valid PowerShell cmdlet switch parameter name"
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
def escape_parameter_value(parameter_value)
|
97
|
-
parameter_value.gsub(/(`|'|"|#)/,'`\1')
|
98
|
-
end
|
99
|
-
|
100
|
-
def escape_string_parameter_value(parameter_value)
|
101
|
-
"'#{escape_parameter_value(parameter_value)}'"
|
102
|
-
end
|
103
|
-
|
104
|
-
def command_switches_string(switches)
|
105
|
-
command_switches = switches.map do | switch_name, switch_value |
|
106
|
-
if switch_name.class != Symbol
|
107
|
-
raise ArgumentError, "Invalid type `#{switch_name} `for PowerShell switch '#{switch_name.to_s}'. The switch must be specified as a Symbol'"
|
108
|
-
end
|
109
|
-
|
110
|
-
validate_switch_name!(switch_name)
|
111
|
-
|
112
|
-
switch_argument = ''
|
113
|
-
switch_present = true
|
114
|
-
|
115
|
-
case switch_value
|
116
|
-
when Numeric
|
117
|
-
switch_argument = switch_value.to_s
|
118
|
-
when Float
|
119
|
-
switch_argument = switch_value.to_s
|
120
|
-
when FalseClass
|
121
|
-
switch_present = false
|
122
|
-
when TrueClass
|
123
|
-
when String
|
124
|
-
switch_argument = escape_string_parameter_value(switch_value)
|
125
|
-
else
|
126
|
-
raise ArgumentError, "Invalid argument type `#{switch_value.class}` specified for PowerShell switch `:#{switch_name.to_s}`. Arguments to PowerShell must be of type `String`, `Numeric`, `Float`, `FalseClass`, or `TrueClass`"
|
127
|
-
end
|
128
|
-
|
129
|
-
switch_present ? ["-#{switch_name.to_s.downcase}", switch_argument].join(' ').strip : ''
|
130
|
-
end
|
131
|
-
|
132
|
-
command_switches.join(' ')
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|