chef 11.4.4 → 11.6.0.hotfix.1
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.
- data/README.md +1 -1
- data/Rakefile +18 -1
- data/bin/chef-service-manager +37 -0
- data/distro/common/html/chef-client.8.html +4 -4
- data/distro/common/html/chef-expander.8.html +4 -4
- data/distro/common/html/chef-expanderctl.8.html +4 -4
- data/distro/common/html/chef-server-webui.8.html +4 -4
- data/distro/common/html/chef-server.8.html +4 -4
- data/distro/common/html/chef-shell.1.html +4 -4
- data/distro/common/html/chef-solo.8.html +12 -18
- data/distro/common/html/chef-solr.8.html +4 -4
- data/distro/common/html/knife-bootstrap.1.html +4 -4
- data/distro/common/html/knife-client.1.html +4 -4
- data/distro/common/html/knife-configure.1.html +4 -4
- data/distro/common/html/knife-cookbook-site.1.html +4 -4
- data/distro/common/html/knife-cookbook.1.html +7 -10
- data/distro/common/html/knife-data-bag.1.html +7 -10
- data/distro/common/html/knife-environment.1.html +6 -8
- data/distro/common/html/knife-exec.1.html +4 -4
- data/distro/common/html/knife-index.1.html +4 -4
- data/distro/common/html/knife-node.1.html +4 -4
- data/distro/common/html/knife-role.1.html +4 -4
- data/distro/common/html/knife-search.1.html +4 -4
- data/distro/common/html/knife-ssh.1.html +4 -4
- data/distro/common/html/knife-status.1.html +4 -4
- data/distro/common/html/knife-tag.1.html +4 -4
- data/distro/common/html/knife.1.html +4 -4
- data/distro/common/man/man1/chef-shell.1 +1 -1
- data/distro/common/man/man1/knife-bootstrap.1 +1 -1
- data/distro/common/man/man1/knife-client.1 +1 -1
- data/distro/common/man/man1/knife-configure.1 +1 -1
- data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
- data/distro/common/man/man1/knife-cookbook.1 +2 -15
- data/distro/common/man/man1/knife-data-bag.1 +2 -15
- data/distro/common/man/man1/knife-environment.1 +2 -12
- data/distro/common/man/man1/knife-exec.1 +1 -1
- data/distro/common/man/man1/knife-index.1 +1 -1
- data/distro/common/man/man1/knife-node.1 +1 -1
- data/distro/common/man/man1/knife-role.1 +1 -1
- data/distro/common/man/man1/knife-search.1 +1 -1
- data/distro/common/man/man1/knife-ssh.1 +1 -1
- data/distro/common/man/man1/knife-status.1 +1 -1
- data/distro/common/man/man1/knife-tag.1 +1 -1
- data/distro/common/man/man1/knife.1 +1 -1
- data/distro/common/man/man8/chef-client.8 +1 -1
- data/distro/common/man/man8/chef-expander.8 +1 -1
- data/distro/common/man/man8/chef-expanderctl.8 +1 -1
- data/distro/common/man/man8/chef-server-webui.8 +1 -1
- data/distro/common/man/man8/chef-server.8 +1 -1
- data/distro/common/man/man8/chef-solo.8 +4 -36
- data/distro/common/man/man8/chef-solr.8 +1 -1
- data/distro/debian/etc/init.d/chef-client +4 -2
- data/distro/windows/service_manager.rb +2 -146
- data/lib/chef.rb +1 -1
- data/lib/chef/application.rb +5 -12
- data/lib/chef/application/apply.rb +2 -0
- data/lib/chef/application/client.rb +12 -12
- data/lib/chef/application/knife.rb +2 -2
- data/lib/chef/application/solo.rb +4 -5
- data/lib/chef/application/windows_service.rb +113 -56
- data/lib/chef/application/windows_service_manager.rb +179 -0
- data/lib/chef/chef_fs.rb +2 -4
- data/lib/chef/chef_fs/chef_fs_data_store.rb +371 -0
- data/lib/chef/chef_fs/command_line.rb +145 -93
- data/lib/chef/chef_fs/config.rb +205 -0
- data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +26 -0
- data/lib/chef/chef_fs/data_handler/client_data_handler.rb +38 -0
- data/lib/chef/chef_fs/data_handler/container_data_handler.rb +29 -0
- data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +38 -0
- data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +56 -0
- data/lib/chef/chef_fs/data_handler/data_handler_base.rb +128 -0
- data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +40 -0
- data/lib/chef/chef_fs/data_handler/group_data_handler.rb +51 -0
- data/lib/chef/chef_fs/data_handler/node_data_handler.rb +36 -0
- data/lib/chef/chef_fs/data_handler/role_data_handler.rb +40 -0
- data/lib/chef/chef_fs/data_handler/user_data_handler.rb +27 -0
- data/lib/chef/chef_fs/file_system.rb +195 -127
- data/lib/chef/chef_fs/file_system/acl_dir.rb +64 -0
- data/lib/chef/chef_fs/file_system/acl_entry.rb +58 -0
- data/lib/chef/chef_fs/file_system/acls_dir.rb +68 -0
- data/lib/chef/chef_fs/file_system/already_exists_error.rb +31 -0
- data/lib/chef/chef_fs/file_system/base_fs_object.rb +98 -39
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +85 -0
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_entry.rb +71 -0
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +55 -0
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_data_bags_dir.rb +36 -0
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +14 -63
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +93 -3
- data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +35 -9
- data/lib/chef/chef_fs/file_system/cookbook_dir.rb +67 -32
- data/lib/chef/chef_fs/file_system/cookbook_file.rb +13 -6
- data/lib/chef/chef_fs/file_system/cookbook_frozen_error.rb +31 -0
- data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +41 -0
- data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +102 -21
- data/lib/chef/chef_fs/file_system/data_bag_dir.rb +12 -21
- data/lib/chef/chef_fs/file_system/data_bags_dir.rb +14 -8
- data/lib/chef/chef_fs/file_system/default_environment_cannot_be_modified_error.rb +36 -0
- data/lib/chef/chef_fs/file_system/environments_dir.rb +60 -0
- data/lib/chef/chef_fs/file_system/file_system_entry.rb +8 -8
- data/lib/chef/chef_fs/file_system/file_system_error.rb +3 -1
- data/lib/chef/chef_fs/file_system/memory_dir.rb +52 -0
- data/lib/chef/chef_fs/file_system/memory_file.rb +17 -0
- data/lib/chef/chef_fs/file_system/memory_root.rb +21 -0
- data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +48 -0
- data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +2 -2
- data/lib/chef/chef_fs/file_system/nodes_dir.rb +17 -9
- data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +0 -4
- data/lib/chef/chef_fs/file_system/not_found_error.rb +2 -2
- data/lib/chef/chef_fs/file_system/operation_failed_error.rb +34 -0
- data/lib/chef/chef_fs/file_system/operation_not_allowed_error.rb +48 -0
- data/lib/chef/chef_fs/file_system/rest_list_dir.rb +42 -13
- data/lib/chef/chef_fs/file_system/rest_list_entry.rb +81 -27
- data/lib/chef/chef_fs/knife.rb +68 -29
- data/lib/chef/chef_fs/parallelizer.rb +129 -0
- data/lib/chef/chef_fs/path_utils.rb +29 -3
- data/lib/chef/chef_fs/raw_request.rb +79 -0
- data/lib/chef/client.rb +46 -20
- data/lib/chef/config.rb +59 -61
- data/lib/chef/cookbook/chefignore.rb +2 -1
- data/lib/chef/cookbook/synchronizer.rb +8 -6
- data/lib/chef/cookbook/syntax_check.rb +17 -2
- data/lib/chef/cookbook_uploader.rb +10 -1
- data/lib/chef/cookbook_version.rb +0 -109
- data/lib/chef/data_bag.rb +15 -6
- data/lib/chef/deprecation/mixin/template.rb +49 -0
- data/lib/chef/deprecation/provider/cookbook_file.rb +55 -0
- data/lib/chef/deprecation/provider/file.rb +197 -0
- data/lib/chef/deprecation/provider/remote_file.rb +86 -0
- data/lib/chef/deprecation/provider/template.rb +63 -0
- data/lib/chef/deprecation/warnings.rb +38 -0
- data/lib/chef/encrypted_data_bag_item.rb +153 -61
- data/lib/chef/environment.rb +34 -3
- data/lib/chef/event_dispatch/base.rb +3 -0
- data/lib/chef/exceptions.rb +27 -2
- data/lib/chef/file_access_control/unix.rb +64 -7
- data/lib/chef/file_access_control/windows.rb +22 -11
- data/lib/chef/file_content_management/content_base.rb +56 -0
- data/lib/chef/file_content_management/deploy.rb +38 -0
- data/lib/chef/file_content_management/deploy/cp.rb +48 -0
- data/lib/chef/file_content_management/deploy/mv_unix.rb +77 -0
- data/lib/chef/file_content_management/deploy/mv_windows.rb +95 -0
- data/lib/chef/file_content_management/tempfile.rb +61 -0
- data/lib/chef/formatters/doc.rb +1 -1
- data/lib/chef/formatters/error_descriptor.rb +5 -4
- data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +23 -3
- data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +4 -0
- data/lib/chef/json_compat.rb +3 -0
- data/lib/chef/knife.rb +12 -3
- data/lib/chef/knife/bootstrap.rb +46 -2
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +3 -3
- data/lib/chef/knife/bootstrap/centos5-gems.erb +3 -3
- data/lib/chef/knife/bootstrap/chef-full.erb +4 -4
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +3 -3
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +3 -3
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +3 -3
- data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +3 -3
- data/lib/chef/knife/client_show.rb +2 -5
- data/lib/chef/knife/configure.rb +3 -3
- data/lib/chef/knife/cookbook_create.rb +6 -5
- data/lib/chef/knife/cookbook_download.rb +13 -5
- data/lib/chef/knife/cookbook_site_share.rb +1 -0
- data/lib/chef/knife/cookbook_test.rb +1 -0
- data/lib/chef/knife/cookbook_upload.rb +4 -9
- data/lib/chef/knife/core/bootstrap_context.rb +10 -4
- data/lib/chef/knife/core/generic_presenter.rb +16 -0
- data/lib/chef/knife/core/node_editor.rb +1 -1
- data/lib/chef/knife/core/subcommand_loader.rb +43 -12
- data/lib/chef/knife/core/ui.rb +19 -4
- data/lib/chef/knife/delete.rb +76 -9
- data/lib/chef/knife/deps.rb +139 -0
- data/lib/chef/knife/diff.rb +22 -5
- data/lib/chef/knife/download.rb +16 -3
- data/lib/chef/knife/edit.rb +76 -0
- data/lib/chef/knife/environment_show.rb +2 -7
- data/lib/chef/knife/list.rb +91 -47
- data/lib/chef/knife/node_run_list_set.rb +66 -0
- data/lib/chef/knife/node_show.rb +1 -7
- data/lib/chef/knife/raw.rb +20 -64
- data/lib/chef/knife/role_show.rb +2 -4
- data/lib/chef/knife/search.rb +5 -6
- data/lib/chef/knife/show.rb +34 -11
- data/lib/chef/knife/ssh.rb +8 -0
- data/lib/chef/knife/upload.rb +23 -4
- data/lib/chef/knife/user_show.rb +2 -5
- data/lib/chef/knife/xargs.rb +265 -0
- data/lib/chef/log.rb +2 -2
- data/lib/chef/mixin/file_class.rb +0 -9
- data/lib/chef/mixin/language_include_recipe.rb +1 -1
- data/lib/chef/mixin/params_validate.rb +19 -9
- data/lib/chef/mixin/template.rb +126 -36
- data/lib/chef/mixin/windows_architecture_helper.rb +91 -0
- data/lib/chef/monkey_patches/file.rb +26 -0
- data/lib/chef/monkey_patches/net-ssh-multi.rb +140 -0
- data/lib/chef/monkey_patches/securerandom.rb +44 -0
- data/lib/chef/monologger.rb +93 -0
- data/lib/chef/node.rb +4 -0
- data/lib/chef/platform.rb +4 -490
- data/lib/chef/platform/provider_mapping.rb +529 -0
- data/lib/chef/{monkey_patches/dir.rb → platform/query_helpers.rb} +25 -19
- data/lib/chef/provider.rb +12 -9
- data/lib/chef/provider/batch.rb +35 -0
- data/lib/chef/provider/cookbook_file.rb +9 -78
- data/lib/chef/provider/cookbook_file/content.rb +49 -0
- data/lib/chef/provider/deploy.rb +24 -20
- data/lib/chef/provider/deploy/revision.rb +27 -0
- data/lib/chef/provider/directory.rb +19 -22
- data/lib/chef/provider/execute.rb +22 -5
- data/lib/chef/provider/file.rb +299 -217
- data/lib/chef/provider/file/content.rb +39 -0
- data/lib/chef/provider/git.rb +76 -43
- data/lib/chef/provider/group/usermod.rb +2 -2
- data/lib/chef/provider/ifconfig.rb +25 -35
- data/lib/chef/provider/ifconfig/debian.rb +71 -0
- data/lib/chef/provider/ifconfig/redhat.rb +47 -0
- data/lib/chef/provider/link.rb +10 -3
- data/lib/chef/provider/mount.rb +1 -1
- data/lib/chef/provider/mount/mount.rb +8 -3
- data/lib/chef/provider/mount/windows.rb +4 -1
- data/lib/chef/provider/package/portage.rb +9 -4
- data/lib/chef/provider/package/rubygems.rb +45 -10
- data/lib/chef/provider/package/smartos.rb +47 -36
- data/lib/chef/provider/package/yum.rb +19 -12
- data/lib/chef/provider/package/zypper.rb +45 -55
- data/lib/chef/provider/powershell_script.rb +77 -0
- data/lib/chef/provider/remote_directory.rb +5 -6
- data/lib/chef/provider/remote_file.rb +12 -108
- data/lib/chef/provider/remote_file/cache_control_data.rb +165 -0
- data/lib/chef/provider/remote_file/content.rb +75 -0
- data/lib/chef/provider/remote_file/fetcher.rb +43 -0
- data/lib/chef/provider/remote_file/ftp.rb +183 -0
- data/lib/chef/provider/remote_file/http.rb +124 -0
- data/lib/chef/provider/remote_file/local_file.rb +47 -0
- data/lib/chef/provider/route.rb +6 -2
- data/lib/chef/provider/script.rb +14 -2
- data/lib/chef/provider/service/macosx.rb +16 -10
- data/lib/chef/provider/service/solaris.rb +6 -5
- data/lib/chef/provider/template.rb +16 -78
- data/lib/chef/provider/template/content.rb +61 -0
- data/lib/chef/provider/user/solaris.rb +90 -0
- data/lib/chef/provider/user/useradd.rb +76 -63
- data/lib/chef/provider/windows_script.rb +73 -0
- data/lib/chef/providers.rb +16 -0
- data/lib/chef/resource.rb +23 -2
- data/lib/chef/resource/batch.rb +31 -0
- data/lib/chef/resource/conditional.rb +4 -0
- data/lib/chef/resource/conditional_action_not_nothing.rb +48 -0
- data/lib/chef/resource/file.rb +31 -3
- data/lib/chef/resource/link.rb +17 -0
- data/lib/chef/resource/lwrp_base.rb +1 -1
- data/lib/chef/resource/mount.rb +29 -2
- data/lib/chef/resource/powershell_script.rb +31 -0
- data/lib/chef/resource/remote_file.rb +47 -1
- data/lib/chef/resource/route.rb +1 -1
- data/lib/chef/resource/template.rb +145 -0
- data/lib/chef/resource/windows_script.rb +62 -0
- data/lib/chef/resource_collection.rb +45 -11
- data/lib/chef/resource_reporter.rb +81 -52
- data/lib/chef/resources.rb +2 -0
- data/lib/chef/rest.rb +13 -4
- data/lib/chef/rest/rest_request.rb +5 -1
- data/lib/chef/run_context/cookbook_compiler.rb +3 -3
- data/lib/chef/run_list/run_list_expansion.rb +1 -1
- data/lib/chef/run_lock.rb +7 -1
- data/lib/chef/runner.rb +0 -1
- data/lib/chef/scan_access_control.rb +6 -1
- data/lib/chef/search/query.rb +2 -2
- data/lib/chef/shell/shell_session.rb +2 -2
- data/lib/chef/util/backup.rb +84 -0
- data/lib/chef/util/diff.rb +145 -0
- data/lib/chef/util/file_edit.rb +1 -1
- data/lib/chef/util/selinux.rb +100 -0
- data/lib/chef/util/windows/net_user.rb +14 -1
- data/lib/chef/util/windows/volume.rb +2 -2
- data/lib/chef/version.rb +1 -1
- data/lib/chef/version/platform.rb +42 -0
- data/lib/chef/version_class.rb +1 -1
- data/lib/chef/version_constraint.rb +6 -5
- data/lib/chef/version_constraint/platform.rb +26 -0
- data/lib/chef/win32/api/file.rb +8 -2
- data/lib/chef/win32/version.rb +25 -8
- data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/copyright +34 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/copyright +34 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -0
- data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -0
- data/spec/data/apt/chef-integration-test_1.0-1_amd64.deb +0 -0
- data/spec/data/apt/chef-integration-test_1.0.orig.tar.gz +0 -0
- data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -0
- data/spec/data/apt/chef-integration-test_1.1-1_amd64.deb +0 -0
- data/spec/data/apt/chef-integration-test_1.1.orig.tar.gz +0 -0
- data/spec/data/apt/var/www/apt/conf/distributions +7 -0
- data/spec/data/apt/var/www/apt/conf/incoming +4 -0
- data/spec/data/apt/var/www/apt/conf/pulls +3 -0
- data/spec/data/apt/var/www/apt/db/checksums.db +0 -0
- data/spec/data/apt/var/www/apt/db/contents.cache.db +0 -0
- data/spec/data/apt/var/www/apt/db/packages.db +0 -0
- data/spec/data/apt/var/www/apt/db/references.db +0 -0
- data/spec/data/apt/var/www/apt/db/release.caches.db +0 -0
- data/spec/data/apt/var/www/apt/db/version +4 -0
- data/spec/data/apt/var/www/apt/dists/sid/Release +19 -0
- data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -0
- data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages.gz +0 -0
- data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -0
- data/spec/data/apt/var/www/apt/dists/sid/main/binary-i386/Packages +0 -0
- data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.0-1_amd64.deb +0 -0
- data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.1-1_amd64.deb +0 -0
- data/spec/data/bootstrap/encrypted_data_bag_secret +1 -0
- data/spec/data/bootstrap/secret.erb +9 -0
- data/spec/data/cookbooks/ignorken/recipes/default.rb +1 -0
- data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +2 -0
- data/spec/data/cookbooks/openldap/files/default/.dotfile +1 -0
- data/spec/data/cookbooks/openldap/files/default/.ssh/id_rsa +1 -0
- data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +1 -0
- data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +1 -0
- data/spec/data/cookbooks/openldap/templates/default/all_windows_line_endings.erb +4 -0
- data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -0
- data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -0
- data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -0
- data/spec/data/cookbooks/openldap/templates/default/some_windows_line_endings.erb +4 -0
- data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -0
- data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -0
- data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -0
- data/spec/data/git_bundles/example-repo.gitbundle +0 -0
- data/spec/data/knife-home/.chef/plugins/knife/example_home_subcommand.rb +0 -0
- data/spec/data/knife_subcommand/test_yourself.rb +8 -0
- data/spec/data/null_config.rb +1 -0
- data/spec/data/partial_one.erb +1 -1
- data/spec/data/remote_file/nyan_cat.png.gz +0 -0
- data/spec/functional/file_content_management/deploy_strategies_spec.rb +238 -0
- data/spec/functional/knife/exec_spec.rb +2 -2
- data/spec/functional/provider/remote_file/cache_control_data_spec.rb +101 -0
- data/spec/functional/resource/batch_spec.rb +64 -0
- data/spec/functional/resource/cookbook_file_spec.rb +2 -3
- data/spec/functional/resource/deploy_revision_spec.rb +180 -0
- data/spec/functional/resource/directory_spec.rb +2 -2
- data/spec/functional/resource/file_spec.rb +17 -1
- data/spec/functional/resource/git_spec.rb +259 -0
- data/spec/functional/resource/link_spec.rb +422 -388
- data/spec/functional/resource/package_spec.rb +297 -0
- data/spec/functional/resource/powershell_spec.rb +188 -0
- data/spec/functional/resource/registry_spec.rb +8 -4
- data/spec/functional/resource/remote_directory_spec.rb +2 -2
- data/spec/functional/resource/remote_file_spec.rb +97 -29
- data/spec/functional/resource/template_spec.rb +173 -17
- data/spec/functional/resource/user_spec.rb +547 -0
- data/spec/functional/run_lock_spec.rb +5 -0
- data/spec/functional/shell_spec.rb +2 -1
- data/spec/functional/win32/service_manager_spec.rb +269 -0
- data/spec/functional/win32/versions_spec.rb +78 -0
- data/spec/integration/knife/chef_repo_path_spec.rb +805 -0
- data/spec/integration/knife/chef_repository_file_system_spec.rb +276 -0
- data/spec/integration/knife/chefignore_spec.rb +271 -0
- data/spec/integration/knife/delete_spec.rb +944 -0
- data/spec/integration/knife/deps_spec.rb +648 -0
- data/spec/integration/knife/diff_spec.rb +536 -0
- data/spec/integration/knife/download_spec.rb +962 -0
- data/spec/integration/knife/list_spec.rb +633 -0
- data/spec/integration/knife/raw_spec.rb +166 -0
- data/spec/integration/knife/redirection_spec.rb +57 -0
- data/spec/integration/knife/show_spec.rb +158 -0
- data/spec/integration/knife/upload_spec.rb +1060 -0
- data/spec/integration/solo/solo_spec.rb +41 -0
- data/spec/spec_helper.rb +55 -1
- data/spec/support/chef_helpers.rb +32 -0
- data/spec/support/platform_helpers.rb +40 -0
- data/spec/support/platforms/win32/spec_service.rb +59 -0
- data/spec/support/shared/functional/directory_resource.rb +43 -16
- data/spec/support/shared/functional/file_resource.rb +661 -20
- data/spec/support/shared/functional/securable_resource.rb +109 -8
- data/spec/support/shared/functional/securable_resource_with_reporting.rb +39 -31
- data/spec/support/shared/integration/integration_helper.rb +166 -0
- data/spec/support/shared/integration/knife_support.rb +171 -0
- data/spec/support/shared/unit/execute_resource.rb +125 -0
- data/spec/support/shared/unit/file_system_support.rb +8 -48
- data/spec/support/shared/unit/provider/file.rb +609 -0
- data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +407 -0
- data/spec/support/shared/unit/script_resource.rb +52 -0
- data/spec/support/shared/unit/windows_script_resource.rb +48 -0
- data/spec/tiny_server.rb +13 -11
- data/spec/unit/application/client_spec.rb +39 -1
- data/spec/unit/application/knife_spec.rb +12 -0
- data/spec/unit/application/solo_spec.rb +1 -1
- data/spec/unit/application_spec.rb +57 -2
- data/spec/unit/chef_fs/diff_spec.rb +30 -31
- data/spec/unit/chef_fs/file_pattern_spec.rb +2 -2
- data/spec/unit/chef_fs/file_system_spec.rb +2 -3
- data/spec/unit/client_spec.rb +20 -1
- data/spec/unit/config_spec.rb +70 -52
- data/spec/unit/cookbook/synchronizer_spec.rb +49 -1
- data/spec/unit/cookbook/syntax_check_spec.rb +28 -3
- data/spec/unit/cookbook_loader_spec.rb +3 -2
- data/spec/unit/daemon_spec.rb +7 -7
- data/spec/unit/data_bag_spec.rb +7 -0
- data/spec/unit/deprecation_spec.rb +86 -0
- data/spec/unit/encrypted_data_bag_item_spec.rb +183 -88
- data/spec/unit/environment_spec.rb +98 -0
- data/spec/unit/exceptions_spec.rb +6 -1
- data/spec/unit/file_access_control_spec.rb +21 -1
- data/spec/unit/file_content_management/deploy/cp_spec.rb +46 -0
- data/spec/unit/file_content_management/deploy/mv_unix_spec.rb +103 -0
- data/spec/unit/file_content_management/deploy/mv_windows_spec.rb +179 -0
- data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +38 -2
- data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +3 -2
- data/spec/unit/knife/bootstrap_spec.rb +128 -29
- data/spec/unit/knife/configure_spec.rb +42 -26
- data/spec/unit/knife/cookbook_download_spec.rb +24 -3
- data/spec/unit/knife/cookbook_upload_spec.rb +8 -4
- data/spec/unit/knife/core/bootstrap_context_spec.rb +78 -61
- data/spec/unit/knife/core/subcommand_loader_spec.rb +20 -0
- data/spec/unit/knife/core/ui_spec.rb +41 -0
- data/spec/unit/knife/node_run_list_set_spec.rb +140 -0
- data/spec/unit/knife_spec.rb +21 -0
- data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +1 -0
- data/spec/unit/mixin/params_validate_spec.rb +35 -0
- data/spec/unit/mixin/template_spec.rb +69 -57
- data/spec/unit/mixin/windows_architecture_helper_spec.rb +83 -0
- data/spec/unit/node_spec.rb +7 -0
- data/spec/unit/platform_spec.rb +15 -1
- data/spec/unit/provider/cookbook_file/content_spec.rb +40 -0
- data/spec/unit/provider/cookbook_file_spec.rb +26 -183
- data/spec/unit/provider/cron/solaris_spec.rb +1 -1
- data/spec/unit/provider/deploy/revision_spec.rb +19 -11
- data/spec/unit/provider/deploy_spec.rb +2 -2
- data/spec/unit/provider/directory_spec.rb +23 -23
- data/spec/unit/provider/execute_spec.rb +27 -1
- data/spec/unit/provider/file/content_spec.rb +101 -0
- data/spec/unit/provider/file_spec.rb +25 -484
- data/spec/unit/provider/git_spec.rb +224 -28
- data/spec/unit/provider/group/usermod_spec.rb +3 -1
- data/spec/unit/provider/ifconfig/debian_spec.rb +89 -0
- data/spec/unit/provider/ifconfig/redhat_spec.rb +71 -0
- data/spec/unit/provider/ifconfig_spec.rb +0 -33
- data/spec/unit/provider/mount/mount_spec.rb +33 -2
- data/spec/unit/provider/mount/windows_spec.rb +4 -1
- data/spec/unit/provider/mount_spec.rb +16 -6
- data/spec/unit/provider/package/portage_spec.rb +44 -0
- data/spec/unit/provider/package/rubygems_spec.rb +44 -1
- data/spec/unit/provider/package/smartos_spec.rb +3 -2
- data/spec/unit/provider/package/yum_spec.rb +36 -39
- data/spec/unit/provider/package/zypper_spec.rb +84 -22
- data/spec/unit/provider/package_spec.rb +0 -4
- data/spec/unit/provider/powershell_spec.rb +38 -0
- data/spec/unit/provider/remote_directory_spec.rb +0 -4
- data/spec/unit/provider/remote_file/cache_control_data_spec.rb +211 -0
- data/spec/unit/provider/remote_file/content_spec.rb +230 -0
- data/spec/unit/provider/remote_file/fetcher_spec.rb +75 -0
- data/spec/unit/provider/remote_file/ftp_spec.rb +224 -0
- data/spec/unit/provider/remote_file/http_spec.rb +319 -0
- data/spec/unit/provider/remote_file/local_file_spec.rb +60 -0
- data/spec/unit/provider/remote_file_spec.rb +33 -295
- data/spec/unit/provider/route_spec.rb +25 -9
- data/spec/unit/provider/service/macosx_spec.rb +176 -152
- data/spec/unit/provider/service/solaris_smf_service_spec.rb +21 -18
- data/spec/unit/provider/service/systemd_service_spec.rb +2 -2
- data/spec/unit/provider/service/upstart_service_spec.rb +2 -2
- data/spec/unit/provider/service_spec.rb +3 -3
- data/spec/unit/provider/template/content_spec.rb +78 -0
- data/spec/unit/provider/template_spec.rb +52 -184
- data/spec/unit/provider/user/solaris_spec.rb +80 -0
- data/spec/unit/provider/user/useradd_spec.rb +12 -358
- data/spec/unit/resource/batch_spec.rb +48 -0
- data/spec/unit/resource/conditional_action_not_nothing_spec.rb +45 -0
- data/spec/unit/resource/execute_spec.rb +3 -101
- data/spec/unit/resource/file_spec.rb +0 -5
- data/spec/unit/resource/group_spec.rb +9 -0
- data/spec/unit/resource/ifconfig_spec.rb +60 -1
- data/spec/unit/resource/link_spec.rb +1 -0
- data/spec/unit/resource/mount_spec.rb +37 -0
- data/spec/unit/resource/powershell_spec.rb +48 -0
- data/spec/unit/resource/remote_file_spec.rb +44 -4
- data/spec/unit/resource/route_spec.rb +1 -1
- data/spec/unit/resource/script_spec.rb +13 -36
- data/spec/unit/resource/template_spec.rb +111 -8
- data/spec/unit/resource/user_spec.rb +7 -0
- data/spec/unit/resource_collection_spec.rb +61 -32
- data/spec/unit/resource_reporter_spec.rb +115 -102
- data/spec/unit/resource_spec.rb +170 -1
- data/spec/unit/rest/auth_credentials_spec.rb +2 -2
- data/spec/unit/rest_spec.rb +6 -2
- data/spec/unit/run_context/cookbook_compiler_spec.rb +9 -0
- data/spec/unit/runner_spec.rb +1 -1
- data/spec/unit/scan_access_control_spec.rb +4 -2
- data/spec/unit/shell/shell_session_spec.rb +15 -2
- data/spec/unit/util/backup_spec.rb +149 -0
- data/spec/unit/util/diff_spec.rb +596 -0
- data/spec/unit/util/selinux_spec.rb +172 -0
- data/spec/unit/version/platform_spec.rb +61 -0
- data/spec/unit/version_constraint/platform_spec.rb +46 -0
- data/spec/unit/version_constraint_spec.rb +5 -0
- metadata +233 -10
- data/lib/chef/chef_fs/file_system/data_bag_item.rb +0 -59
- data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +0 -237
- data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +0 -568
- data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +0 -220
|
@@ -43,8 +43,8 @@ class Chef::Application::Knife < Chef::Application
|
|
|
43
43
|
option :color,
|
|
44
44
|
:long => '--[no-]color',
|
|
45
45
|
:boolean => true,
|
|
46
|
-
:default =>
|
|
47
|
-
:description => "Use colored output, defaults to
|
|
46
|
+
:default => !Chef::Platform.windows?,
|
|
47
|
+
:description => "Use colored output, defaults to false on Windows, true otherwise"
|
|
48
48
|
|
|
49
49
|
option :environment,
|
|
50
50
|
:short => "-E ENVIRONMENT",
|
|
@@ -147,13 +147,13 @@ class Chef::Application::Solo < Chef::Application
|
|
|
147
147
|
Chef::RunList::RunListItem.new(item)
|
|
148
148
|
}
|
|
149
149
|
}
|
|
150
|
-
|
|
150
|
+
|
|
151
151
|
option :client_fork,
|
|
152
152
|
:short => "-f",
|
|
153
|
-
:long => "--fork",
|
|
153
|
+
:long => "--[no-]fork",
|
|
154
154
|
:description => "Fork client",
|
|
155
155
|
:boolean => true
|
|
156
|
-
|
|
156
|
+
|
|
157
157
|
option :why_run,
|
|
158
158
|
:short => '-W',
|
|
159
159
|
:long => '--why-run',
|
|
@@ -215,7 +215,7 @@ class Chef::Application::Solo < Chef::Application
|
|
|
215
215
|
f.write(r.read)
|
|
216
216
|
end
|
|
217
217
|
end
|
|
218
|
-
Chef::Mixin::Command.run_command(:command => "tar
|
|
218
|
+
Chef::Mixin::Command.run_command(:command => "tar zxvf #{path} -C #{recipes_path}")
|
|
219
219
|
end
|
|
220
220
|
end
|
|
221
221
|
|
|
@@ -253,7 +253,6 @@ class Chef::Application::Solo < Chef::Application
|
|
|
253
253
|
sleep Chef::Config[:interval]
|
|
254
254
|
retry
|
|
255
255
|
else
|
|
256
|
-
Chef::Application.debug_stacktrace(e)
|
|
257
256
|
Chef::Application.fatal!("#{e.class}: #{e.message}", 1)
|
|
258
257
|
end
|
|
259
258
|
end
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
#
|
|
18
18
|
|
|
19
19
|
require 'chef'
|
|
20
|
+
require 'chef/monologger'
|
|
20
21
|
require 'chef/application'
|
|
21
22
|
require 'chef/client'
|
|
22
23
|
require 'chef/config'
|
|
@@ -56,58 +57,53 @@ class Chef
|
|
|
56
57
|
:description => "Set the number of seconds to wait between chef-client runs",
|
|
57
58
|
:proc => lambda { |s| s.to_i }
|
|
58
59
|
|
|
59
|
-
option :override_runlist,
|
|
60
|
-
:short => "-o RunlistItem,RunlistItem...",
|
|
61
|
-
:long => "--override-runlist RunlistItem,RunlistItem...",
|
|
62
|
-
:description => "Replace current run list with specified items",
|
|
63
|
-
:proc => lambda{|items|
|
|
64
|
-
items = items.split(',')
|
|
65
|
-
items.compact.map{|item|
|
|
66
|
-
Chef::RunList::RunListItem.new(item)
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
60
|
def service_init
|
|
61
|
+
@service_action_mutex = Mutex.new
|
|
62
|
+
@service_signal = ConditionVariable.new
|
|
63
|
+
|
|
71
64
|
reconfigure
|
|
72
65
|
Chef::Log.info("Chef Client Service initialized")
|
|
73
66
|
end
|
|
74
67
|
|
|
75
68
|
def service_main(*startup_parameters)
|
|
69
|
+
# Chef::Config is initialized during service_init
|
|
70
|
+
# Set the initial timeout to splay sleep time
|
|
71
|
+
timeout = rand Chef::Config[:splay]
|
|
76
72
|
|
|
77
|
-
while running?
|
|
78
|
-
|
|
73
|
+
while running? do
|
|
74
|
+
# Grab the service_action_mutex to make a chef-client run
|
|
75
|
+
@service_action_mutex.synchronize do
|
|
79
76
|
begin
|
|
77
|
+
Chef::Log.info("Next chef-client run will happen in #{timeout} seconds")
|
|
78
|
+
@service_signal.wait(@service_action_mutex, timeout)
|
|
79
|
+
|
|
80
|
+
# Continue only if service is RUNNING
|
|
81
|
+
next if state != RUNNING
|
|
82
|
+
|
|
80
83
|
# Reconfigure each time through to pick up any changes in the client file
|
|
81
84
|
Chef::Log.info("Reconfiguring with startup parameters")
|
|
82
85
|
reconfigure(startup_parameters)
|
|
86
|
+
timeout = Chef::Config[:interval]
|
|
83
87
|
|
|
84
|
-
splay
|
|
85
|
-
Chef::
|
|
86
|
-
sleep splay
|
|
88
|
+
# Honor splay sleep config
|
|
89
|
+
timeout += rand Chef::Config[:splay]
|
|
87
90
|
|
|
88
|
-
#
|
|
91
|
+
# run chef-client only if service is in RUNNING state
|
|
89
92
|
next if state != RUNNING
|
|
90
93
|
|
|
94
|
+
Chef::Log.info("Chef-Client service is starting a chef-client run...")
|
|
91
95
|
run_chef_client
|
|
92
|
-
|
|
93
|
-
Chef::Log.debug("Sleeping for #{Chef::Config[:interval]} seconds")
|
|
94
|
-
client_sleep Chef::Config[:interval]
|
|
95
|
-
rescue Chef::Application::Wakeup => e
|
|
96
|
-
Chef::Log.debug("Received Wakeup signal. Starting run.")
|
|
97
|
-
next
|
|
98
96
|
rescue SystemExit => e
|
|
99
|
-
raise
|
|
97
|
+
# Do not raise any of the errors here in order to
|
|
98
|
+
# prevent service crash
|
|
99
|
+
Chef::Log.error("#{e.class}: #{e}")
|
|
100
100
|
rescue Exception => e
|
|
101
101
|
Chef::Log.error("#{e.class}: #{e}")
|
|
102
|
-
Chef::Application.debug_stacktrace(e)
|
|
103
|
-
Chef::Log.error("Sleeping for #{Chef::Config[:interval]} seconds before trying again")
|
|
104
|
-
client_sleep Chef::Config[:interval]
|
|
105
|
-
retry
|
|
106
102
|
end
|
|
107
|
-
else # PAUSED or IDLE
|
|
108
|
-
sleep 5
|
|
109
103
|
end
|
|
110
104
|
end
|
|
105
|
+
|
|
106
|
+
Chef::Log.debug("Exiting service...")
|
|
111
107
|
end
|
|
112
108
|
|
|
113
109
|
################################################################################
|
|
@@ -115,19 +111,45 @@ class Chef
|
|
|
115
111
|
################################################################################
|
|
116
112
|
|
|
117
113
|
def service_stop
|
|
118
|
-
Chef::Log.info("
|
|
114
|
+
Chef::Log.info("STOP request from operating system.")
|
|
115
|
+
if @service_action_mutex.try_lock
|
|
116
|
+
@service_signal.signal
|
|
117
|
+
@service_action_mutex.unlock
|
|
118
|
+
Chef::Log.info("Service is stopping....")
|
|
119
|
+
else
|
|
120
|
+
Chef::Log.info("Currently a chef-client run is happening.")
|
|
121
|
+
Chef::Log.info("Service will stop once it's completed.")
|
|
122
|
+
end
|
|
119
123
|
end
|
|
120
124
|
|
|
121
125
|
def service_pause
|
|
122
|
-
Chef::Log.info("
|
|
126
|
+
Chef::Log.info("PAUSE request from operating system.")
|
|
127
|
+
|
|
128
|
+
# We don't need to wake up the service_main if it's waiting
|
|
129
|
+
# since this is a PAUSE signal.
|
|
130
|
+
|
|
131
|
+
if @service_action_mutex.locked?
|
|
132
|
+
Chef::Log.info("Currently a chef-client run is happening.")
|
|
133
|
+
Chef::Log.info("Service will pause once it's completed.")
|
|
134
|
+
else
|
|
135
|
+
Chef::Log.info("Service is pausing....")
|
|
136
|
+
end
|
|
123
137
|
end
|
|
124
138
|
|
|
125
139
|
def service_resume
|
|
126
|
-
|
|
140
|
+
# We don't need to wake up the service_main if it's waiting
|
|
141
|
+
# since this is a RESUME signal.
|
|
142
|
+
|
|
143
|
+
Chef::Log.info("RESUME signal received from the OS.")
|
|
144
|
+
Chef::Log.info("Service is resuming....")
|
|
127
145
|
end
|
|
128
146
|
|
|
129
147
|
def service_shutdown
|
|
130
|
-
Chef::Log.info("
|
|
148
|
+
Chef::Log.info("SHUTDOWN signal received from the OS.")
|
|
149
|
+
|
|
150
|
+
# Treat shutdown similar to stop.
|
|
151
|
+
|
|
152
|
+
service_stop
|
|
131
153
|
end
|
|
132
154
|
|
|
133
155
|
################################################################################
|
|
@@ -136,6 +158,19 @@ class Chef
|
|
|
136
158
|
|
|
137
159
|
private
|
|
138
160
|
|
|
161
|
+
# Initializes Chef::Client instance and runs it
|
|
162
|
+
def run_chef_client
|
|
163
|
+
@chef_client = Chef::Client.new(
|
|
164
|
+
@chef_client_json,
|
|
165
|
+
:override_runlist => config[:override_runlist]
|
|
166
|
+
)
|
|
167
|
+
@chef_client_json = nil
|
|
168
|
+
|
|
169
|
+
@chef_client.run
|
|
170
|
+
@chef_client = nil
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
|
|
139
174
|
def apply_config(config_file_path)
|
|
140
175
|
Chef::Config.from_file(config_file_path)
|
|
141
176
|
Chef::Config.merge!(config)
|
|
@@ -155,16 +190,52 @@ class Chef
|
|
|
155
190
|
Chef::Config[:interval] ||= 1800
|
|
156
191
|
end
|
|
157
192
|
|
|
158
|
-
# Lifted from
|
|
159
|
-
#
|
|
193
|
+
# Lifted from application.rb
|
|
194
|
+
# See application.rb for related comments.
|
|
195
|
+
|
|
160
196
|
def configure_logging
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
197
|
+
Chef::Log.init(MonoLogger.new(Chef::Config[:log_location]))
|
|
198
|
+
if want_additional_logger?
|
|
199
|
+
configure_stdout_logger
|
|
200
|
+
end
|
|
201
|
+
Chef::Log.level = resolve_log_level
|
|
202
|
+
end
|
|
164
203
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
204
|
+
def configure_stdout_logger
|
|
205
|
+
stdout_logger = MonoLogger.new(STDOUT)
|
|
206
|
+
STDOUT.sync = true
|
|
207
|
+
stdout_logger.formatter = Chef::Log.logger.formatter
|
|
208
|
+
Chef::Log.loggers << stdout_logger
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
# Based on config and whether or not STDOUT is a tty, should we setup a
|
|
212
|
+
# secondary logger for stdout?
|
|
213
|
+
def want_additional_logger?
|
|
214
|
+
( Chef::Config[:log_location] != STDOUT ) && STDOUT.tty? && (!Chef::Config[:daemonize]) && (Chef::Config[:force_logger])
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
# Use of output formatters is assumed if `force_formatter` is set or if
|
|
218
|
+
# `force_logger` is not set and STDOUT is to a console (tty)
|
|
219
|
+
def using_output_formatter?
|
|
220
|
+
Chef::Config[:force_formatter] || (!Chef::Config[:force_logger] && STDOUT.tty?)
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def auto_log_level?
|
|
224
|
+
Chef::Config[:log_level] == :auto
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
# if log_level is `:auto`, convert it to :warn (when using output formatter)
|
|
228
|
+
# or :info (no output formatter). See also +using_output_formatter?+
|
|
229
|
+
def resolve_log_level
|
|
230
|
+
if auto_log_level?
|
|
231
|
+
if using_output_formatter?
|
|
232
|
+
:warn
|
|
233
|
+
else
|
|
234
|
+
:info
|
|
235
|
+
end
|
|
236
|
+
else
|
|
237
|
+
Chef::Config[:log_level]
|
|
238
|
+
end
|
|
168
239
|
end
|
|
169
240
|
|
|
170
241
|
def configure_chef(startup_parameters)
|
|
@@ -205,20 +276,6 @@ class Chef
|
|
|
205
276
|
end
|
|
206
277
|
end
|
|
207
278
|
|
|
208
|
-
# Since we need to be able to respond to signals between Chef runs, we need to periodically
|
|
209
|
-
# wake up to see if we're still in the running state. The method returns when it has slept
|
|
210
|
-
# for +sec+ seconds (but at least +10+ seconds), or when the service
|
|
211
|
-
# is no client_sleep in the +RUNNING+ state, whichever comes first.
|
|
212
|
-
def client_sleep(sec)
|
|
213
|
-
chunk_length = 10
|
|
214
|
-
chunks = sec / chunk_length
|
|
215
|
-
chunks = 1 if chunks < 1
|
|
216
|
-
(1..chunks).each do
|
|
217
|
-
return unless state == RUNNING
|
|
218
|
-
sleep chunk_length
|
|
219
|
-
end
|
|
220
|
-
end
|
|
221
|
-
|
|
222
279
|
end
|
|
223
280
|
end
|
|
224
281
|
end
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Seth Chisamore (<schisamo@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2011 Opscode, 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 'win32/service'
|
|
20
|
+
require 'chef/config'
|
|
21
|
+
require 'mixlib/cli'
|
|
22
|
+
|
|
23
|
+
class Chef
|
|
24
|
+
class Application
|
|
25
|
+
#
|
|
26
|
+
# This class is used to create and manage a windows service.
|
|
27
|
+
# Service should be created using Daemon class from
|
|
28
|
+
# win32/service gem.
|
|
29
|
+
# For an example see: Chef::Application::WindowsService
|
|
30
|
+
#
|
|
31
|
+
# Outside programs are expected to use this class to manage
|
|
32
|
+
# windows services.
|
|
33
|
+
#
|
|
34
|
+
class WindowsServiceManager
|
|
35
|
+
include Mixlib::CLI
|
|
36
|
+
|
|
37
|
+
option :action,
|
|
38
|
+
:short => "-a ACTION",
|
|
39
|
+
:long => "--action ACTION",
|
|
40
|
+
:default => "status",
|
|
41
|
+
:description => "Action to carry out on chef-service (install, uninstall, status, start, stop, pause, or resume)"
|
|
42
|
+
|
|
43
|
+
option :config_file,
|
|
44
|
+
:short => "-c CONFIG",
|
|
45
|
+
:long => "--config CONFIG",
|
|
46
|
+
:default => "#{ENV['SYSTEMDRIVE']}/chef/client.rb",
|
|
47
|
+
:description => "The configuration file to use for chef runs"
|
|
48
|
+
|
|
49
|
+
option :log_location,
|
|
50
|
+
:short => "-L LOGLOCATION",
|
|
51
|
+
:long => "--logfile LOGLOCATION",
|
|
52
|
+
:description => "Set the log file location for chef-service",
|
|
53
|
+
:default => "#{ENV['SYSTEMDRIVE']}/chef/client.log"
|
|
54
|
+
|
|
55
|
+
option :help,
|
|
56
|
+
:short => "-h",
|
|
57
|
+
:long => "--help",
|
|
58
|
+
:description => "Show this message",
|
|
59
|
+
:on => :tail,
|
|
60
|
+
:boolean => true,
|
|
61
|
+
:show_options => true,
|
|
62
|
+
:exit => 0
|
|
63
|
+
|
|
64
|
+
def initialize(service_options)
|
|
65
|
+
# having to call super in initialize is the most annoying
|
|
66
|
+
# anti-pattern :(
|
|
67
|
+
super()
|
|
68
|
+
|
|
69
|
+
raise ArgumentError, "Service definition is not provided" if service_options.nil?
|
|
70
|
+
|
|
71
|
+
required_options = [:service_name, :service_display_name, :service_name, :service_description, :service_file_path]
|
|
72
|
+
|
|
73
|
+
required_options.each do |req_option|
|
|
74
|
+
if !service_options.has_key?(req_option)
|
|
75
|
+
raise ArgumentError, "Service definition doesn't contain required option #{req_option}"
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
@service_name = service_options[:service_name]
|
|
80
|
+
@service_display_name = service_options[:service_display_name]
|
|
81
|
+
@service_description = service_options[:service_description]
|
|
82
|
+
@service_file_path = service_options[:service_file_path]
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def run(params = ARGV)
|
|
86
|
+
parse_options(params)
|
|
87
|
+
|
|
88
|
+
case config[:action]
|
|
89
|
+
when 'install'
|
|
90
|
+
if service_exists?
|
|
91
|
+
puts "Service #{@service_name} already exists on the system."
|
|
92
|
+
else
|
|
93
|
+
ruby = File.join(RbConfig::CONFIG['bindir'], 'ruby')
|
|
94
|
+
|
|
95
|
+
opts = ""
|
|
96
|
+
opts << " -c #{config[:config_file]}" if config[:config_file]
|
|
97
|
+
opts << " -L #{config[:log_location]}" if config[:log_location]
|
|
98
|
+
|
|
99
|
+
# Quote the full paths to deal with possible spaces in the path name.
|
|
100
|
+
# Also ensure all forward slashes are backslashes
|
|
101
|
+
cmd = "\"#{ruby}\" \"#{@service_file_path}\" #{opts}".gsub(File::SEPARATOR, File::ALT_SEPARATOR)
|
|
102
|
+
|
|
103
|
+
::Win32::Service.new(
|
|
104
|
+
:service_name => @service_name,
|
|
105
|
+
:display_name => @service_display_name,
|
|
106
|
+
:description => @service_description,
|
|
107
|
+
:start_type => ::Win32::Service::SERVICE_AUTO_START,
|
|
108
|
+
:binary_path_name => cmd
|
|
109
|
+
)
|
|
110
|
+
puts "Service '#{@service_name}' has successfully been installed."
|
|
111
|
+
end
|
|
112
|
+
when 'status'
|
|
113
|
+
if !service_exists?
|
|
114
|
+
puts "Service #{@service_name} doesn't exist on the system."
|
|
115
|
+
else
|
|
116
|
+
puts "State of #{@service_name} service is: #{current_state}"
|
|
117
|
+
end
|
|
118
|
+
when 'start'
|
|
119
|
+
# TODO: allow override of startup parameters here?
|
|
120
|
+
take_action('start', RUNNING)
|
|
121
|
+
when 'stop'
|
|
122
|
+
take_action('stop', STOPPED)
|
|
123
|
+
when 'uninstall', 'delete'
|
|
124
|
+
take_action('stop', STOPPED)
|
|
125
|
+
unless service_exists?
|
|
126
|
+
puts "Service #{@service_name} doesn't exist on the system."
|
|
127
|
+
else
|
|
128
|
+
::Win32::Service.delete(@service_name)
|
|
129
|
+
puts "Service #{@service_name} deleted"
|
|
130
|
+
end
|
|
131
|
+
when 'pause'
|
|
132
|
+
take_action('pause', PAUSED)
|
|
133
|
+
when 'resume'
|
|
134
|
+
take_action('resume', RUNNING)
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
private
|
|
139
|
+
|
|
140
|
+
# Just some state constants
|
|
141
|
+
STOPPED = "stopped"
|
|
142
|
+
RUNNING = "running"
|
|
143
|
+
PAUSED = "paused"
|
|
144
|
+
|
|
145
|
+
def service_exists?
|
|
146
|
+
return ::Win32::Service.exists?(@service_name)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def take_action(action=nil, desired_state=nil)
|
|
150
|
+
if service_exists?
|
|
151
|
+
if current_state != desired_state
|
|
152
|
+
::Win32::Service.send(action, @service_name)
|
|
153
|
+
wait_for_state(desired_state)
|
|
154
|
+
puts "Service '#{@service_name}' is now '#{current_state}'."
|
|
155
|
+
else
|
|
156
|
+
puts "Service '#{@service_name}' is already '#{desired_state}'."
|
|
157
|
+
end
|
|
158
|
+
else
|
|
159
|
+
puts "Cannot '#{action}' service '#{@service_name}'"
|
|
160
|
+
puts "Service #{@service_name} doesn't exist on the system."
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def current_state
|
|
165
|
+
::Win32::Service.status(@service_name).current_state
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
# Helper method that waits for a status to change its state since state
|
|
169
|
+
# changes aren't usually instantaneous.
|
|
170
|
+
def wait_for_state(desired_state)
|
|
171
|
+
while current_state != desired_state
|
|
172
|
+
puts "One moment... #{current_state}"
|
|
173
|
+
sleep 1
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|