chef 12.7.2-universal-mingw32 → 12.8.1-universal-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +208 -208
- data/Gemfile +49 -58
- data/LICENSE +201 -201
- data/README.md +139 -139
- data/Rakefile +86 -73
- data/VERSION +1 -1
- data/acceptance/.gitignore +2 -1
- data/acceptance/.shared/kitchen_acceptance/.kitchen.digitalocean.yml +33 -27
- data/acceptance/.shared/kitchen_acceptance/.kitchen.ec2.yml +290 -281
- data/acceptance/.shared/kitchen_acceptance/.kitchen.vagrant.yml +59 -49
- data/acceptance/.shared/kitchen_acceptance/libraries/kitchen.rb +51 -46
- data/acceptance/.shared/kitchen_acceptance/metadata.rb +1 -1
- data/acceptance/Gemfile +14 -11
- data/acceptance/README.md +132 -86
- data/acceptance/basics/.acceptance/acceptance-cookbook/.gitignore +2 -2
- data/acceptance/basics/.acceptance/acceptance-cookbook/metadata.rb +3 -3
- data/acceptance/basics/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -1
- data/acceptance/basics/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -1
- data/acceptance/basics/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -1
- data/acceptance/basics/.kitchen.yml +4 -4
- data/acceptance/basics/test/integration/chef-current-install/serverspec/chef_client_spec.rb +19 -19
- data/acceptance/basics/test/integration/chef-current-install/serverspec/spec_helper.rb +6 -6
- data/acceptance/fips/.acceptance/acceptance-cookbook/.gitignore +2 -0
- data/acceptance/fips/.acceptance/acceptance-cookbook/metadata.rb +2 -0
- data/acceptance/fips/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -0
- data/acceptance/fips/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -0
- data/acceptance/fips/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -0
- data/acceptance/fips/.kitchen.yml +4 -0
- data/acceptance/fips/test/integration/fips/serverspec/Gemfile +3 -0
- data/acceptance/fips/test/integration/fips/serverspec/fips_spec.rb +39 -0
- data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/.gitignore +2 -2
- data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/libraries/cookbook_kitchen.rb +43 -43
- data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/libraries/top_cookbooks.rb +23 -21
- data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/metadata.rb +3 -3
- data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -1
- data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -1
- data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -1
- data/acceptance/top-cookbooks/.gitignore +1 -1
- data/acceptance/top-cookbooks/.kitchen.docker.yml +12 -0
- data/acceptance/top-cookbooks/.kitchen.git.yml +11 -10
- data/acceptance/top-cookbooks/.kitchen.learn-the-basics-rhel.yml +7 -4
- data/acceptance/top-cookbooks/.kitchen.learn-the-basics-ubuntu.yml +7 -4
- data/acceptance/top-cookbooks/.kitchen.learn-the-basics-windows.yml +7 -4
- data/acceptance/trivial/.acceptance/acceptance-cookbook/.gitignore +2 -2
- data/acceptance/trivial/.acceptance/acceptance-cookbook/metadata.rb +2 -2
- data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -1
- data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -1
- data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -1
- data/acceptance/trivial/.kitchen.yml +7 -7
- data/acceptance/trivial/test/integration/chef-current-install/inspec/chef_client_spec.rb +5 -5
- data/acceptance/windows-service/.acceptance/acceptance-cookbook/.gitignore +2 -2
- data/acceptance/windows-service/.acceptance/acceptance-cookbook/metadata.rb +2 -2
- data/acceptance/windows-service/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -1
- data/acceptance/windows-service/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -1
- data/acceptance/windows-service/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -1
- data/acceptance/windows-service/.kitchen.yml +7 -7
- data/acceptance/windows-service/test/integration/chef-windows-service/inspec/chef_windows_service_spec.rb +58 -58
- data/bin/chef-apply +25 -25
- data/bin/chef-client +26 -26
- data/bin/chef-service-manager +38 -38
- data/bin/chef-shell +34 -37
- data/bin/chef-solo +25 -25
- data/bin/chef-windows-service +35 -35
- data/bin/knife +25 -25
- data/chef-windows.gemspec +24 -24
- data/chef.gemspec +63 -58
- data/distro/common/html/_sources/ctl_chef_client.txt +35 -35
- data/distro/common/html/_sources/ctl_chef_server.txt +341 -341
- data/distro/common/html/_sources/ctl_chef_shell.txt +15 -15
- data/distro/common/html/_sources/ctl_chef_solo.txt +25 -25
- data/distro/common/html/_sources/index.txt +135 -135
- data/distro/common/html/_sources/knife.txt +74 -74
- data/distro/common/html/_sources/knife_bootstrap.txt +56 -56
- data/distro/common/html/_sources/knife_client.txt +150 -150
- data/distro/common/html/_sources/knife_common_options.txt +6 -6
- data/distro/common/html/_sources/knife_configure.txt +29 -29
- data/distro/common/html/_sources/knife_cookbook.txt +236 -236
- data/distro/common/html/_sources/knife_cookbook_site.txt +157 -157
- data/distro/common/html/_sources/knife_data_bag.txt +159 -159
- data/distro/common/html/_sources/knife_delete.txt +26 -26
- data/distro/common/html/_sources/knife_deps.txt +61 -61
- data/distro/common/html/_sources/knife_diff.txt +34 -34
- data/distro/common/html/_sources/knife_download.txt +44 -44
- data/distro/common/html/_sources/knife_edit.txt +26 -26
- data/distro/common/html/_sources/knife_environment.txt +158 -158
- data/distro/common/html/_sources/knife_exec.txt +47 -47
- data/distro/common/html/_sources/knife_index_rebuild.txt +20 -20
- data/distro/common/html/_sources/knife_list.txt +33 -33
- data/distro/common/html/_sources/knife_node.txt +250 -250
- data/distro/common/html/_sources/knife_raw.txt +35 -35
- data/distro/common/html/_sources/knife_recipe_list.txt +23 -23
- data/distro/common/html/_sources/knife_role.txt +157 -157
- data/distro/common/html/_sources/knife_search.txt +53 -53
- data/distro/common/html/_sources/knife_serve.txt +18 -18
- data/distro/common/html/_sources/knife_show.txt +26 -26
- data/distro/common/html/_sources/knife_ssh.txt +43 -43
- data/distro/common/html/_sources/knife_ssl_check.txt +41 -41
- data/distro/common/html/_sources/knife_ssl_fetch.txt +41 -41
- data/distro/common/html/_sources/knife_status.txt +37 -37
- data/distro/common/html/_sources/knife_tag.txt +69 -69
- data/distro/common/html/_sources/knife_upload.txt +49 -49
- data/distro/common/html/_sources/knife_user.txt +127 -127
- data/distro/common/html/_sources/knife_using.txt +43 -43
- data/distro/common/html/_sources/knife_xargs.txt +30 -30
- data/distro/common/html/_static/basic.css +536 -536
- data/distro/common/html/_static/doctools.js +238 -238
- data/distro/common/html/_static/guide.css +504 -504
- data/distro/common/html/_static/pygments.css +61 -61
- data/distro/common/html/_static/searchtools.js +621 -621
- data/distro/common/html/_static/underscore.js +31 -31
- data/distro/common/html/_static/websupport.js +808 -808
- data/distro/common/html/ctl_chef_client.html +269 -269
- data/distro/common/html/ctl_chef_server.html +727 -727
- data/distro/common/html/ctl_chef_shell.html +162 -162
- data/distro/common/html/ctl_chef_solo.html +193 -193
- data/distro/common/html/index.html +201 -201
- data/distro/common/html/knife.html +169 -169
- data/distro/common/html/knife_bootstrap.html +284 -284
- data/distro/common/html/knife_client.html +284 -284
- data/distro/common/html/knife_common_options.html +95 -95
- data/distro/common/html/knife_configure.html +104 -104
- data/distro/common/html/knife_cookbook.html +486 -486
- data/distro/common/html/knife_cookbook_site.html +375 -375
- data/distro/common/html/knife_data_bag.html +373 -373
- data/distro/common/html/knife_delete.html +92 -92
- data/distro/common/html/knife_deps.html +142 -142
- data/distro/common/html/knife_diff.html +122 -122
- data/distro/common/html/knife_download.html +144 -144
- data/distro/common/html/knife_edit.html +88 -88
- data/distro/common/html/knife_environment.html +325 -325
- data/distro/common/html/knife_exec.html +219 -219
- data/distro/common/html/knife_index_rebuild.html +82 -82
- data/distro/common/html/knife_list.html +113 -113
- data/distro/common/html/knife_node.html +457 -457
- data/distro/common/html/knife_raw.html +109 -109
- data/distro/common/html/knife_recipe_list.html +90 -90
- data/distro/common/html/knife_role.html +294 -294
- data/distro/common/html/knife_search.html +202 -202
- data/distro/common/html/knife_serve.html +78 -78
- data/distro/common/html/knife_show.html +103 -103
- data/distro/common/html/knife_ssh.html +176 -176
- data/distro/common/html/knife_ssl_check.html +150 -150
- data/distro/common/html/knife_ssl_fetch.html +150 -150
- data/distro/common/html/knife_status.html +143 -143
- data/distro/common/html/knife_tag.html +137 -137
- data/distro/common/html/knife_upload.html +152 -152
- data/distro/common/html/knife_user.html +241 -241
- data/distro/common/html/knife_using.html +209 -209
- data/distro/common/html/knife_xargs.html +121 -121
- data/distro/common/html/search.html +81 -81
- data/distro/common/man/man1/README.md +58 -58
- data/distro/common/man/man1/chef-shell.1 +194 -194
- data/distro/common/man/man1/knife-bootstrap.1 +215 -215
- data/distro/common/man/man1/knife-client.1 +443 -443
- data/distro/common/man/man1/knife-configure.1 +161 -161
- data/distro/common/man/man1/knife-cookbook-site.1 +552 -552
- data/distro/common/man/man1/knife-cookbook.1 +770 -770
- data/distro/common/man/man1/knife-data-bag.1 +617 -617
- data/distro/common/man/man1/knife-delete.1 +127 -127
- data/distro/common/man/man1/knife-deps.1 +246 -246
- data/distro/common/man/man1/knife-diff.1 +226 -226
- data/distro/common/man/man1/knife-download.1 +258 -258
- data/distro/common/man/man1/knife-edit.1 +121 -121
- data/distro/common/man/man1/knife-environment.1 +508 -508
- data/distro/common/man/man1/knife-exec.1 +362 -362
- data/distro/common/man/man1/knife-index-rebuild.1 +63 -63
- data/distro/common/man/man1/knife-list.1 +174 -174
- data/distro/common/man/man1/knife-node.1 +716 -716
- data/distro/common/man/man1/knife-raw.1 +172 -172
- data/distro/common/man/man1/knife-recipe-list.1 +85 -85
- data/distro/common/man/man1/knife-role.1 +426 -426
- data/distro/common/man/man1/knife-search.1 +359 -359
- data/distro/common/man/man1/knife-serve.1 +109 -109
- data/distro/common/man/man1/knife-show.1 +160 -160
- data/distro/common/man/man1/knife-ssh.1 +284 -284
- data/distro/common/man/man1/knife-ssl-check.1 +207 -207
- data/distro/common/man/man1/knife-ssl-fetch.1 +207 -207
- data/distro/common/man/man1/knife-status.1 +234 -234
- data/distro/common/man/man1/knife-tag.1 +189 -189
- data/distro/common/man/man1/knife-upload.1 +280 -280
- data/distro/common/man/man1/knife-user.1 +356 -356
- data/distro/common/man/man1/knife-xargs.1 +189 -189
- data/distro/common/man/man1/knife.1 +332 -332
- data/distro/common/man/man8/chef-apply.8 +86 -86
- data/distro/common/man/man8/chef-client.8 +398 -398
- data/distro/common/man/man8/chef-solo.8 +260 -260
- data/distro/common/markdown/README +3 -3
- data/distro/common/markdown/man1/chef-shell.mkd +195 -195
- data/distro/common/markdown/man1/knife-bootstrap.mkd +141 -141
- data/distro/common/markdown/man1/knife-client.mkd +103 -103
- data/distro/common/markdown/man1/knife-configure.mkd +70 -70
- data/distro/common/markdown/man1/knife-cookbook-site.mkd +123 -123
- data/distro/common/markdown/man1/knife-cookbook.mkd +263 -263
- data/distro/common/markdown/man1/knife-data-bag.mkd +121 -121
- data/distro/common/markdown/man1/knife-environment.mkd +151 -151
- data/distro/common/markdown/man1/knife-exec.mkd +42 -42
- data/distro/common/markdown/man1/knife-index.mkd +30 -30
- data/distro/common/markdown/man1/knife-node.mkd +130 -130
- data/distro/common/markdown/man1/knife-role.mkd +85 -85
- data/distro/common/markdown/man1/knife-search.mkd +180 -180
- data/distro/common/markdown/man1/knife-ssh.mkd +69 -69
- data/distro/common/markdown/man1/knife-status.mkd +36 -36
- data/distro/common/markdown/man1/knife-tag.mkd +39 -39
- data/distro/common/markdown/man1/knife.mkd +213 -213
- data/distro/common/markdown/man8/chef-client.mkd +75 -73
- data/distro/common/markdown/man8/chef-expander.mkd +81 -81
- data/distro/common/markdown/man8/chef-expanderctl.mkd +57 -57
- data/distro/common/markdown/man8/chef-server-webui.mkd +121 -121
- data/distro/common/markdown/man8/chef-server.mkd +120 -120
- data/distro/common/markdown/man8/chef-solo.mkd +107 -107
- data/distro/common/markdown/man8/chef-solr.mkd +89 -89
- data/distro/powershell/chef/chef.psm1 +327 -327
- data/ext/win32-eventlog/Rakefile +53 -53
- data/ext/win32-eventlog/chef-log.man +56 -56
- data/lib-backcompat/chef/chef_fs/file_system/acl_entry.rb +5 -5
- data/lib-backcompat/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +5 -5
- data/lib-backcompat/chef/chef_fs/file_system/chef_server_root_dir.rb +5 -5
- data/lib/chef.rb +35 -35
- data/lib/chef/api_client.rb +233 -233
- data/lib/chef/api_client/registration.rb +192 -192
- data/lib/chef/api_client_v1.rb +325 -325
- data/lib/chef/application.rb +342 -342
- data/lib/chef/application/apply.rb +221 -221
- data/lib/chef/application/client.rb +513 -501
- data/lib/chef/application/knife.rb +208 -208
- data/lib/chef/application/solo.rb +334 -330
- data/lib/chef/application/windows_service.rb +338 -338
- data/lib/chef/application/windows_service_manager.rb +202 -202
- data/lib/chef/applications.rb +4 -4
- data/lib/chef/audit/audit_event_proxy.rb +93 -93
- data/lib/chef/audit/audit_reporter.rb +172 -172
- data/lib/chef/audit/control_group_data.rb +139 -139
- data/lib/chef/audit/logger.rb +36 -36
- data/lib/chef/audit/rspec_formatter.rb +37 -37
- data/lib/chef/audit/runner.rb +196 -196
- data/lib/chef/chef_class.rb +228 -228
- data/lib/chef/chef_fs.rb +59 -59
- data/lib/chef/chef_fs/chef_fs_data_store.rb +871 -856
- data/lib/chef/chef_fs/command_line.rb +285 -285
- data/lib/chef/chef_fs/config.rb +283 -282
- data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +26 -26
- data/lib/chef/chef_fs/data_handler/client_data_handler.rb +39 -39
- data/lib/chef/chef_fs/data_handler/client_key_data_handler.rb +11 -0
- data/lib/chef/chef_fs/data_handler/container_data_handler.rb +35 -29
- data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +38 -38
- data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +62 -56
- data/lib/chef/chef_fs/data_handler/data_handler_base.rb +204 -202
- data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +40 -40
- data/lib/chef/chef_fs/data_handler/group_data_handler.rb +55 -55
- data/lib/chef/chef_fs/data_handler/node_data_handler.rb +36 -36
- data/lib/chef/chef_fs/data_handler/organization_data_handler.rb +36 -30
- data/lib/chef/chef_fs/data_handler/organization_invites_data_handler.rb +17 -17
- data/lib/chef/chef_fs/data_handler/organization_members_data_handler.rb +17 -17
- data/lib/chef/chef_fs/data_handler/policy_data_handler.rb +48 -42
- data/lib/chef/chef_fs/data_handler/policy_group_data_handler.rb +33 -27
- data/lib/chef/chef_fs/data_handler/role_data_handler.rb +40 -40
- data/lib/chef/chef_fs/data_handler/user_data_handler.rb +29 -29
- data/lib/chef/chef_fs/file_pattern.rb +301 -301
- data/lib/chef/chef_fs/file_system.rb +429 -429
- data/lib/chef/chef_fs/file_system/already_exists_error.rb +28 -28
- data/lib/chef/chef_fs/file_system/base_fs_dir.rb +47 -47
- data/lib/chef/chef_fs/file_system/base_fs_object.rb +183 -183
- data/lib/chef/chef_fs/file_system/chef_server/acl_dir.rb +65 -65
- data/lib/chef/chef_fs/file_system/chef_server/acl_entry.rb +60 -60
- data/lib/chef/chef_fs/file_system/chef_server/acls_dir.rb +75 -75
- data/lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb +196 -196
- data/lib/chef/chef_fs/file_system/chef_server/cookbook_artifact_dir.rb +38 -38
- data/lib/chef/chef_fs/file_system/chef_server/cookbook_artifacts_dir.rb +102 -102
- data/lib/chef/chef_fs/file_system/chef_server/cookbook_dir.rb +222 -222
- data/lib/chef/chef_fs/file_system/chef_server/cookbook_file.rb +84 -84
- data/lib/chef/chef_fs/file_system/chef_server/cookbook_subdir.rb +61 -61
- data/lib/chef/chef_fs/file_system/chef_server/cookbooks_acl_dir.rb +42 -42
- data/lib/chef/chef_fs/file_system/chef_server/cookbooks_dir.rb +102 -102
- data/lib/chef/chef_fs/file_system/chef_server/data_bag_dir.rb +71 -71
- data/lib/chef/chef_fs/file_system/chef_server/data_bags_dir.rb +69 -69
- data/lib/chef/chef_fs/file_system/chef_server/environments_dir.rb +57 -57
- data/lib/chef/chef_fs/file_system/chef_server/nodes_dir.rb +53 -53
- data/lib/chef/chef_fs/file_system/chef_server/org_entry.rb +31 -31
- data/lib/chef/chef_fs/file_system/chef_server/organization_invites_entry.rb +61 -61
- data/lib/chef/chef_fs/file_system/chef_server/organization_members_entry.rb +60 -60
- data/lib/chef/chef_fs/file_system/chef_server/policies_acl_dir.rb +41 -41
- data/lib/chef/chef_fs/file_system/chef_server/policies_dir.rb +160 -160
- data/lib/chef/chef_fs/file_system/chef_server/policy_group_entry.rb +137 -137
- data/lib/chef/chef_fs/file_system/chef_server/policy_groups_dir.rb +43 -43
- data/lib/chef/chef_fs/file_system/chef_server/policy_revision_entry.rb +34 -34
- data/lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb +178 -178
- data/lib/chef/chef_fs/file_system/chef_server/rest_list_entry.rb +187 -187
- data/lib/chef/chef_fs/file_system/chef_server/versioned_cookbook_dir.rb +45 -45
- data/lib/chef/chef_fs/file_system/chef_server/versioned_cookbooks_dir.rb +107 -107
- data/lib/chef/chef_fs/file_system/cookbook_frozen_error.rb +28 -28
- data/lib/chef/chef_fs/file_system/default_environment_cannot_be_modified_error.rb +32 -32
- data/lib/chef/chef_fs/file_system/file_system_error.rb +44 -44
- data/lib/chef/chef_fs/file_system/memory/memory_dir.rb +53 -53
- data/lib/chef/chef_fs/file_system/memory/memory_file.rb +20 -20
- data/lib/chef/chef_fs/file_system/memory/memory_root.rb +23 -23
- data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +64 -64
- data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +28 -28
- data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +36 -36
- data/lib/chef/chef_fs/file_system/not_found_error.rb +28 -28
- data/lib/chef/chef_fs/file_system/operation_failed_error.rb +42 -42
- data/lib/chef/chef_fs/file_system/operation_not_allowed_error.rb +46 -46
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_acls_dir.rb +39 -39
- data/lib/chef/chef_fs/file_system/repository/{chef_repository_file_system_data_bags_dir.rb → chef_repository_file_system_client_keys_dir.rb} +38 -38
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_artifact_dir.rb +41 -41
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_dir.rb +146 -95
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_entry.rb +176 -82
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_entry.rb +83 -83
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_policies_dir.rb +38 -38
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_root_dir.rb +214 -210
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_versioned_cookbook_dir.rb +42 -42
- data/lib/chef/chef_fs/file_system/repository/{chef_repository_file_system_cookbook_artifacts_dir.rb → cookbook_artifacts_dir.rb} +36 -34
- data/lib/chef/chef_fs/file_system/repository/cookbooks_dir.rb +52 -0
- data/lib/chef/chef_fs/file_system/repository/data_bag.rb +39 -0
- data/lib/chef/chef_fs/file_system/repository/data_bag_item.rb +114 -0
- data/lib/chef/chef_fs/file_system/repository/data_bags_dir.rb +39 -0
- data/lib/chef/chef_fs/file_system/repository/directory.rb +139 -0
- data/lib/chef/chef_fs/file_system/repository/file_system_entry.rb +117 -117
- data/lib/chef/chef_fs/file_system/repository/file_system_root_dir.rb +33 -33
- data/lib/chef/chef_fs/file_system/repository/{chef_repository_file_system_versioned_cookbooks_dir.rb → versioned_cookbooks_dir.rb} +34 -34
- data/lib/chef/chef_fs/knife.rb +161 -161
- data/lib/chef/chef_fs/parallelizer.rb +105 -105
- data/lib/chef/chef_fs/parallelizer/flatten_enumerable.rb +35 -35
- data/lib/chef/chef_fs/parallelizer/parallel_enumerable.rb +281 -281
- data/lib/chef/chef_fs/path_utils.rb +127 -127
- data/lib/chef/client.rb +967 -967
- data/lib/chef/config.rb +85 -85
- data/lib/chef/config_fetcher.rb +72 -72
- data/lib/chef/constants.rb +28 -28
- data/lib/chef/cookbook/chefignore.rb +74 -74
- data/lib/chef/cookbook/cookbook_collection.rb +63 -58
- data/lib/chef/cookbook/cookbook_version_loader.rb +352 -301
- data/lib/chef/cookbook/file_system_file_vendor.rb +59 -59
- data/lib/chef/cookbook/file_vendor.rb +71 -71
- data/lib/chef/cookbook/gem_installer.rb +118 -0
- data/lib/chef/cookbook/metadata.rb +904 -886
- data/lib/chef/cookbook/remote_file_vendor.rb +87 -87
- data/lib/chef/cookbook/synchronizer.rb +298 -294
- data/lib/chef/cookbook/syntax_check.rb +260 -260
- data/lib/chef/cookbook_loader.rb +200 -182
- data/lib/chef/cookbook_manifest.rb +290 -290
- data/lib/chef/cookbook_site_streaming_uploader.rb +244 -244
- data/lib/chef/cookbook_uploader.rb +157 -157
- data/lib/chef/cookbook_version.rb +631 -627
- data/lib/chef/daemon.rb +131 -131
- data/lib/chef/data_bag.rb +176 -175
- data/lib/chef/data_bag_item.rb +218 -218
- data/lib/chef/delayed_evaluator.rb +21 -21
- data/lib/chef/deprecation/mixin/template.rb +48 -48
- data/lib/chef/deprecation/provider/cookbook_file.rb +54 -54
- data/lib/chef/deprecation/provider/file.rb +198 -198
- data/lib/chef/deprecation/provider/remote_directory.rb +52 -52
- data/lib/chef/deprecation/provider/remote_file.rb +85 -85
- data/lib/chef/deprecation/provider/template.rb +63 -63
- data/lib/chef/deprecation/warnings.rb +38 -38
- data/lib/chef/digester.rb +74 -74
- data/lib/chef/dsl.rb +6 -6
- data/lib/chef/dsl/audit.rb +51 -51
- data/lib/chef/dsl/chef_provisioning.rb +57 -57
- data/lib/chef/dsl/cheffish.rb +64 -64
- data/lib/chef/dsl/data_query.rb +89 -89
- data/lib/chef/dsl/declare_resource.rb +108 -108
- data/lib/chef/dsl/definitions.rb +43 -43
- data/lib/chef/dsl/include_attribute.rb +61 -61
- data/lib/chef/dsl/include_recipe.rb +44 -44
- data/lib/chef/dsl/platform_introspection.rb +254 -254
- data/lib/chef/dsl/powershell.rb +29 -29
- data/lib/chef/dsl/reboot_pending.rb +64 -64
- data/lib/chef/dsl/recipe.rb +134 -134
- data/lib/chef/dsl/registry_helper.rb +63 -63
- data/lib/chef/dsl/resources.rb +58 -58
- data/lib/chef/encrypted_data_bag_item.rb +155 -155
- data/lib/chef/encrypted_data_bag_item/assertions.rb +54 -54
- data/lib/chef/encrypted_data_bag_item/check_encrypted.rb +56 -56
- data/lib/chef/encrypted_data_bag_item/decryption_failure.rb +22 -22
- data/lib/chef/encrypted_data_bag_item/decryptor.rb +227 -227
- data/lib/chef/encrypted_data_bag_item/encrypted_data_bag_item_assertions.rb +37 -37
- data/lib/chef/encrypted_data_bag_item/encryption_failure.rb +22 -22
- data/lib/chef/encrypted_data_bag_item/encryptor.rb +225 -225
- data/lib/chef/encrypted_data_bag_item/unacceptable_encrypted_data_bag_item_format.rb +22 -22
- data/lib/chef/encrypted_data_bag_item/unsupported_cipher.rb +22 -22
- data/lib/chef/encrypted_data_bag_item/unsupported_encrypted_data_bag_item_format.rb +22 -22
- data/lib/chef/environment.rb +326 -326
- data/lib/chef/event_dispatch/base.rb +420 -400
- data/lib/chef/event_dispatch/dispatcher.rb +62 -62
- data/lib/chef/event_dispatch/dsl.rb +65 -65
- data/lib/chef/event_dispatch/events_output_stream.rb +37 -37
- data/lib/chef/event_loggers/base.rb +62 -62
- data/lib/chef/event_loggers/windows_eventlog.rb +101 -101
- data/lib/chef/exceptions.rb +504 -504
- data/lib/chef/file_access_control.rb +75 -75
- data/lib/chef/file_access_control/unix.rb +290 -290
- data/lib/chef/file_access_control/windows.rb +335 -335
- data/lib/chef/file_cache.rb +221 -221
- data/lib/chef/file_content_management/content_base.rb +56 -56
- data/lib/chef/file_content_management/deploy.rb +37 -37
- data/lib/chef/file_content_management/deploy/cp.rb +48 -48
- data/lib/chef/file_content_management/deploy/mv_unix.rb +76 -76
- data/lib/chef/file_content_management/deploy/mv_windows.rb +103 -103
- data/lib/chef/file_content_management/tempfile.rb +97 -96
- data/lib/chef/formatters/base.rb +237 -237
- data/lib/chef/formatters/doc.rb +422 -396
- data/lib/chef/formatters/error_descriptor.rb +67 -67
- data/lib/chef/formatters/error_inspectors.rb +19 -19
- data/lib/chef/formatters/error_inspectors/api_error_formatting.rb +184 -184
- data/lib/chef/formatters/error_inspectors/compile_error_inspector.rb +154 -154
- data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +168 -168
- data/lib/chef/formatters/error_inspectors/cookbook_sync_error_inspector.rb +82 -82
- data/lib/chef/formatters/error_inspectors/node_load_error_inspector.rb +128 -128
- data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +147 -147
- data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +124 -124
- data/lib/chef/formatters/error_inspectors/run_list_expansion_error_inspector.rb +121 -121
- data/lib/chef/formatters/error_mapper.rb +85 -85
- data/lib/chef/formatters/indentable_output_stream.rb +170 -170
- data/lib/chef/formatters/minimal.rb +233 -233
- data/lib/chef/guard_interpreter.rb +32 -32
- data/lib/chef/guard_interpreter/default_guard_interpreter.rb +43 -43
- data/lib/chef/guard_interpreter/resource_guard_interpreter.rb +138 -138
- data/lib/chef/handler.rb +235 -235
- data/lib/chef/handler/error_report.rb +33 -33
- data/lib/chef/handler/json_file.rb +63 -63
- data/lib/chef/http.rb +430 -427
- data/lib/chef/http/auth_credentials.rb +57 -57
- data/lib/chef/http/authenticator.rb +106 -106
- data/lib/chef/http/basic_client.rb +169 -169
- data/lib/chef/http/cookie_jar.rb +31 -31
- data/lib/chef/http/cookie_manager.rb +59 -59
- data/lib/chef/http/decompressor.rb +142 -142
- data/lib/chef/http/http_request.rb +186 -186
- data/lib/chef/http/json_input.rb +73 -73
- data/lib/chef/http/json_output.rb +78 -78
- data/lib/chef/http/json_to_model_output.rb +34 -34
- data/lib/chef/http/remote_request_id.rb +46 -46
- data/lib/chef/http/simple.rb +40 -40
- data/lib/chef/http/simple_json.rb +43 -43
- data/lib/chef/http/socketless_chef_zero_client.rb +207 -206
- data/lib/chef/http/ssl_policies.rb +130 -130
- data/lib/chef/http/validate_content_length.rb +115 -110
- data/lib/chef/json_compat.rb +164 -164
- data/lib/chef/key.rb +273 -273
- data/lib/chef/knife.rb +587 -580
- data/lib/chef/knife/bootstrap.rb +480 -480
- data/lib/chef/knife/bootstrap/chef_vault_handler.rb +159 -159
- data/lib/chef/knife/bootstrap/client_builder.rb +208 -208
- data/lib/chef/knife/bootstrap/templates/README.md +11 -11
- data/lib/chef/knife/bootstrap/templates/chef-full.erb +236 -231
- data/lib/chef/knife/client_bulk_delete.rb +104 -104
- data/lib/chef/knife/client_create.rb +111 -111
- data/lib/chef/knife/client_delete.rb +60 -60
- data/lib/chef/knife/client_edit.rb +53 -53
- data/lib/chef/knife/client_key_create.rb +67 -67
- data/lib/chef/knife/client_key_delete.rb +76 -76
- data/lib/chef/knife/client_key_edit.rb +79 -79
- data/lib/chef/knife/client_key_list.rb +69 -69
- data/lib/chef/knife/client_key_show.rb +76 -76
- data/lib/chef/knife/client_list.rb +42 -42
- data/lib/chef/knife/client_reregister.rb +59 -59
- data/lib/chef/knife/client_show.rb +49 -49
- data/lib/chef/knife/configure.rb +171 -171
- data/lib/chef/knife/configure_client.rb +50 -50
- data/lib/chef/knife/cookbook_bulk_delete.rb +71 -71
- data/lib/chef/knife/cookbook_create.rb +448 -448
- data/lib/chef/knife/cookbook_delete.rb +151 -151
- data/lib/chef/knife/cookbook_download.rb +143 -143
- data/lib/chef/knife/cookbook_list.rb +47 -47
- data/lib/chef/knife/cookbook_metadata.rb +108 -108
- data/lib/chef/knife/cookbook_metadata_from_file.rb +44 -44
- data/lib/chef/knife/cookbook_show.rb +98 -98
- data/lib/chef/knife/cookbook_site_download.rb +109 -109
- data/lib/chef/knife/cookbook_site_install.rb +192 -192
- data/lib/chef/knife/cookbook_site_list.rb +58 -58
- data/lib/chef/knife/cookbook_site_search.rb +46 -46
- data/lib/chef/knife/cookbook_site_share.rb +169 -169
- data/lib/chef/knife/cookbook_site_show.rb +55 -55
- data/lib/chef/knife/cookbook_site_unshare.rb +56 -56
- data/lib/chef/knife/cookbook_site_vendor.rb +46 -46
- data/lib/chef/knife/cookbook_test.rb +95 -95
- data/lib/chef/knife/cookbook_upload.rb +308 -310
- data/lib/chef/knife/core/bootstrap_context.rb +233 -200
- data/lib/chef/knife/core/cookbook_scm_repo.rb +159 -159
- data/lib/chef/knife/core/custom_manifest_loader.rb +69 -69
- data/lib/chef/knife/core/gem_glob_loader.rb +138 -138
- data/lib/chef/knife/core/generic_presenter.rb +222 -222
- data/lib/chef/knife/core/hashed_command_loader.rb +99 -80
- data/lib/chef/knife/core/node_editor.rb +130 -130
- data/lib/chef/knife/core/node_presenter.rb +159 -159
- data/lib/chef/knife/core/object_loader.rb +115 -115
- data/lib/chef/knife/core/status_presenter.rb +157 -157
- data/lib/chef/knife/core/subcommand_loader.rb +212 -206
- data/lib/chef/knife/core/text_formatter.rb +85 -85
- data/lib/chef/knife/core/ui.rb +284 -275
- data/lib/chef/knife/data_bag_create.rb +78 -78
- data/lib/chef/knife/data_bag_delete.rb +49 -49
- data/lib/chef/knife/data_bag_edit.rb +74 -74
- data/lib/chef/knife/data_bag_from_file.rb +114 -114
- data/lib/chef/knife/data_bag_list.rb +42 -42
- data/lib/chef/knife/data_bag_secret_options.rb +142 -142
- data/lib/chef/knife/data_bag_show.rb +69 -69
- data/lib/chef/knife/delete.rb +107 -107
- data/lib/chef/knife/deps.rb +140 -140
- data/lib/chef/knife/diff.rb +68 -68
- data/lib/chef/knife/download.rb +68 -68
- data/lib/chef/knife/edit.rb +72 -72
- data/lib/chef/knife/environment_compare.rb +127 -127
- data/lib/chef/knife/environment_create.rb +53 -53
- data/lib/chef/knife/environment_delete.rb +45 -45
- data/lib/chef/knife/environment_edit.rb +45 -45
- data/lib/chef/knife/environment_from_file.rb +82 -82
- data/lib/chef/knife/environment_list.rb +42 -42
- data/lib/chef/knife/environment_show.rb +48 -48
- data/lib/chef/knife/exec.rb +87 -87
- data/lib/chef/knife/help.rb +101 -101
- data/lib/chef/knife/help_topics.rb +4 -4
- data/lib/chef/knife/index_rebuild.rb +133 -133
- data/lib/chef/knife/key_create.rb +112 -108
- data/lib/chef/knife/key_create_base.rb +50 -50
- data/lib/chef/knife/key_delete.rb +55 -55
- data/lib/chef/knife/key_edit.rb +118 -114
- data/lib/chef/knife/key_edit_base.rb +55 -55
- data/lib/chef/knife/key_list.rb +88 -88
- data/lib/chef/knife/key_list_base.rb +45 -45
- data/lib/chef/knife/key_show.rb +53 -53
- data/lib/chef/knife/list.rb +157 -157
- data/lib/chef/knife/node_bulk_delete.rb +74 -74
- data/lib/chef/knife/node_create.rb +47 -47
- data/lib/chef/knife/node_delete.rb +46 -46
- data/lib/chef/knife/node_edit.rb +70 -70
- data/lib/chef/knife/node_environment_set.rb +54 -54
- data/lib/chef/knife/node_from_file.rb +51 -51
- data/lib/chef/knife/node_list.rb +44 -44
- data/lib/chef/knife/node_run_list_add.rb +104 -104
- data/lib/chef/knife/node_run_list_remove.rb +67 -67
- data/lib/chef/knife/node_run_list_set.rb +66 -66
- data/lib/chef/knife/node_show.rb +66 -66
- data/lib/chef/knife/null.rb +10 -10
- data/lib/chef/knife/osc_user_create.rb +97 -97
- data/lib/chef/knife/osc_user_delete.rb +51 -51
- data/lib/chef/knife/osc_user_edit.rb +58 -58
- data/lib/chef/knife/osc_user_list.rb +47 -47
- data/lib/chef/knife/osc_user_reregister.rb +64 -64
- data/lib/chef/knife/osc_user_show.rb +54 -54
- data/lib/chef/knife/raw.rb +103 -103
- data/lib/chef/knife/recipe_list.rb +32 -32
- data/lib/chef/knife/rehash.rb +65 -62
- data/lib/chef/knife/role_bulk_delete.rb +65 -65
- data/lib/chef/knife/role_create.rb +53 -53
- data/lib/chef/knife/role_delete.rb +46 -46
- data/lib/chef/knife/role_edit.rb +45 -45
- data/lib/chef/knife/role_env_run_list_add.rb +86 -86
- data/lib/chef/knife/role_env_run_list_clear.rb +55 -55
- data/lib/chef/knife/role_env_run_list_remove.rb +57 -57
- data/lib/chef/knife/role_env_run_list_replace.rb +59 -59
- data/lib/chef/knife/role_env_run_list_set.rb +70 -70
- data/lib/chef/knife/role_from_file.rb +51 -51
- data/lib/chef/knife/role_list.rb +42 -42
- data/lib/chef/knife/role_run_list_add.rb +86 -86
- data/lib/chef/knife/role_run_list_clear.rb +55 -55
- data/lib/chef/knife/role_run_list_remove.rb +57 -57
- data/lib/chef/knife/role_run_list_replace.rb +59 -59
- data/lib/chef/knife/role_run_list_set.rb +70 -70
- data/lib/chef/knife/role_show.rb +49 -49
- data/lib/chef/knife/search.rb +201 -201
- data/lib/chef/knife/serve.rb +48 -48
- data/lib/chef/knife/show.rb +56 -56
- data/lib/chef/knife/ssh.rb +572 -575
- data/lib/chef/knife/ssl_check.rb +281 -281
- data/lib/chef/knife/ssl_fetch.rb +157 -157
- data/lib/chef/knife/status.rb +110 -110
- data/lib/chef/knife/tag_create.rb +52 -52
- data/lib/chef/knife/tag_delete.rb +60 -60
- data/lib/chef/knife/tag_list.rb +47 -47
- data/lib/chef/knife/upload.rb +70 -70
- data/lib/chef/knife/user_create.rb +150 -150
- data/lib/chef/knife/user_delete.rb +95 -95
- data/lib/chef/knife/user_edit.rb +81 -81
- data/lib/chef/knife/user_key_create.rb +69 -69
- data/lib/chef/knife/user_key_delete.rb +76 -76
- data/lib/chef/knife/user_key_edit.rb +79 -79
- data/lib/chef/knife/user_key_list.rb +69 -69
- data/lib/chef/knife/user_key_show.rb +76 -76
- data/lib/chef/knife/user_list.rb +45 -45
- data/lib/chef/knife/user_reregister.rb +89 -89
- data/lib/chef/knife/user_show.rb +78 -78
- data/lib/chef/knife/xargs.rb +266 -266
- data/lib/chef/local_mode.rb +128 -128
- data/lib/chef/log.rb +68 -68
- data/lib/chef/log/syslog.rb +45 -45
- data/lib/chef/log/winevt.rb +99 -99
- data/lib/chef/mash.rb +226 -226
- data/lib/chef/mixin/api_version_request_handling.rb +66 -66
- data/lib/chef/mixin/checksum.rb +32 -32
- data/lib/chef/mixin/command.rb +193 -192
- data/lib/chef/mixin/command/unix.rb +220 -220
- data/lib/chef/mixin/command/windows.rb +71 -71
- data/lib/chef/mixin/convert_to_class_name.rb +126 -126
- data/lib/chef/mixin/create_path.rb +73 -73
- data/lib/chef/mixin/deep_merge.rb +140 -140
- data/lib/chef/mixin/deprecation.rb +123 -123
- data/lib/chef/mixin/descendants_tracker.rb +81 -81
- data/lib/chef/mixin/enforce_ownership_and_permissions.rb +39 -39
- data/lib/chef/mixin/file_class.rb +35 -35
- data/lib/chef/mixin/from_file.rb +50 -50
- data/lib/chef/mixin/get_source_from_package.rb +47 -47
- data/lib/chef/mixin/homebrew_user.rb +68 -68
- data/lib/chef/mixin/language.rb +48 -48
- data/lib/chef/mixin/language_include_attribute.rb +34 -34
- data/lib/chef/mixin/language_include_recipe.rb +31 -31
- data/lib/chef/mixin/params_validate.rb +489 -489
- data/lib/chef/mixin/path_sanity.rb +68 -68
- data/lib/chef/mixin/powershell_out.rb +98 -98
- data/lib/chef/mixin/powershell_type_coercions.rb +84 -84
- data/lib/chef/mixin/properties.rb +303 -302
- data/lib/chef/mixin/provides.rb +28 -27
- data/lib/chef/mixin/proxified_socket.rb +38 -38
- data/lib/chef/mixin/recipe_definition_dsl_core.rb +35 -35
- data/lib/chef/mixin/securable.rb +196 -196
- data/lib/chef/mixin/shell_out.rb +117 -117
- data/lib/chef/mixin/subclass_directive.rb +37 -37
- data/lib/chef/mixin/template.rb +262 -262
- data/lib/chef/mixin/unformatter.rb +32 -32
- data/lib/chef/mixin/uris.rb +43 -43
- data/lib/chef/mixin/which.rb +37 -37
- data/lib/chef/mixin/why_run.rb +331 -331
- data/lib/chef/mixin/wide_string.rb +72 -72
- data/lib/chef/mixin/windows_architecture_helper.rb +114 -114
- data/lib/chef/mixin/windows_env_helper.rb +67 -67
- data/lib/chef/mixin/xml_escape.rb +140 -140
- data/lib/chef/mixins.rb +13 -13
- data/lib/chef/monkey_patches/net-ssh-multi.rb +140 -140
- data/lib/chef/monkey_patches/net_http.rb +60 -60
- data/lib/chef/monkey_patches/webrick-utils.rb +51 -51
- data/lib/chef/monkey_patches/win32/registry.rb +72 -72
- data/lib/chef/monologger.rb +88 -88
- data/lib/chef/nil_argument.rb +3 -3
- data/lib/chef/node.rb +700 -700
- data/lib/chef/node/attribute.rb +586 -586
- data/lib/chef/node/attribute_collections.rb +323 -323
- data/lib/chef/node/immutable_collections.rb +219 -219
- data/lib/chef/node_map.rb +222 -222
- data/lib/chef/null_logger.rb +72 -72
- data/lib/chef/org.rb +149 -149
- data/lib/chef/platform.rb +30 -30
- data/lib/chef/platform/handler_map.rb +40 -40
- data/lib/chef/platform/priority_map.rb +41 -41
- data/lib/chef/platform/provider_handler_map.rb +29 -29
- data/lib/chef/platform/provider_mapping.rb +214 -214
- data/lib/chef/platform/provider_priority_map.rb +11 -11
- data/lib/chef/platform/query_helpers.rb +112 -112
- data/lib/chef/platform/rebooter.rb +54 -54
- data/lib/chef/platform/resource_handler_map.rb +29 -29
- data/lib/chef/platform/resource_priority_map.rb +11 -11
- data/lib/chef/platform/service_helpers.rb +122 -122
- data/lib/chef/policy_builder.rb +42 -42
- data/lib/chef/policy_builder/dynamic.rb +185 -185
- data/lib/chef/policy_builder/expand_node_object.rb +278 -274
- data/lib/chef/policy_builder/policyfile.rb +527 -525
- data/lib/chef/property.rb +673 -673
- data/lib/chef/provider.rb +461 -461
- data/lib/chef/provider/apt_update.rb +79 -79
- data/lib/chef/provider/batch.rb +45 -45
- data/lib/chef/provider/breakpoint.rb +38 -38
- data/lib/chef/provider/cookbook_file.rb +53 -53
- data/lib/chef/provider/cookbook_file/content.rb +49 -49
- data/lib/chef/provider/cron.rb +263 -263
- data/lib/chef/provider/cron/aix.rb +50 -50
- data/lib/chef/provider/cron/solaris.rb +22 -22
- data/lib/chef/provider/cron/unix.rb +83 -83
- data/lib/chef/provider/deploy.rb +476 -476
- data/lib/chef/provider/deploy/revision.rb +109 -109
- data/lib/chef/provider/deploy/timestamped.rb +34 -34
- data/lib/chef/provider/directory.rb +152 -152
- data/lib/chef/provider/dsc_resource.rb +197 -200
- data/lib/chef/provider/dsc_script.rb +185 -185
- data/lib/chef/provider/env.rb +169 -169
- data/lib/chef/provider/env/windows.rb +72 -72
- data/lib/chef/provider/erl_call.rb +108 -108
- data/lib/chef/provider/execute.rb +125 -125
- data/lib/chef/provider/file.rb +495 -495
- data/lib/chef/provider/file/content.rb +39 -39
- data/lib/chef/provider/git.rb +332 -332
- data/lib/chef/provider/group.rb +183 -183
- data/lib/chef/provider/group/aix.rb +86 -86
- data/lib/chef/provider/group/dscl.rb +170 -170
- data/lib/chef/provider/group/gpasswd.rb +58 -58
- data/lib/chef/provider/group/groupadd.rb +137 -137
- data/lib/chef/provider/group/groupmod.rb +128 -128
- data/lib/chef/provider/group/pw.rb +140 -140
- data/lib/chef/provider/group/suse.rb +62 -62
- data/lib/chef/provider/group/usermod.rb +91 -91
- data/lib/chef/provider/group/windows.rb +98 -98
- data/lib/chef/provider/http_request.rb +122 -122
- data/lib/chef/provider/ifconfig.rb +226 -226
- data/lib/chef/provider/ifconfig/aix.rb +99 -99
- data/lib/chef/provider/ifconfig/debian.rb +84 -84
- data/lib/chef/provider/ifconfig/redhat.rb +48 -48
- data/lib/chef/provider/launchd.rb +208 -0
- data/lib/chef/provider/link.rb +159 -159
- data/lib/chef/provider/log.rb +57 -57
- data/lib/chef/provider/lwrp_base.rb +99 -99
- data/lib/chef/provider/mdadm.rb +92 -92
- data/lib/chef/provider/mount.rb +173 -173
- data/lib/chef/provider/mount/aix.rb +180 -180
- data/lib/chef/provider/mount/mount.rb +270 -270
- data/lib/chef/provider/mount/solaris.rb +271 -271
- data/lib/chef/provider/mount/windows.rb +86 -86
- data/lib/chef/provider/ohai.rb +49 -49
- data/lib/chef/provider/osx_profile.rb +256 -256
- data/lib/chef/provider/package.rb +565 -565
- data/lib/chef/provider/package/aix.rb +136 -136
- data/lib/chef/provider/package/apt.rb +185 -185
- data/lib/chef/provider/package/chocolatey.rb +275 -277
- data/lib/chef/provider/package/dpkg.rb +226 -226
- data/lib/chef/provider/package/easy_install.rb +133 -133
- data/lib/chef/provider/package/freebsd/base.rb +89 -89
- data/lib/chef/provider/package/freebsd/pkg.rb +114 -114
- data/lib/chef/provider/package/freebsd/pkgng.rb +78 -78
- data/lib/chef/provider/package/freebsd/port.rb +60 -60
- data/lib/chef/provider/package/homebrew.rb +137 -137
- data/lib/chef/provider/package/ips.rb +91 -91
- data/lib/chef/provider/package/macports.rb +101 -101
- data/lib/chef/provider/package/openbsd.rb +136 -136
- data/lib/chef/provider/package/pacman.rb +104 -104
- data/lib/chef/provider/package/paludis.rb +86 -86
- data/lib/chef/provider/package/portage.rb +140 -140
- data/lib/chef/provider/package/rpm.rb +123 -123
- data/lib/chef/provider/package/rubygems.rb +586 -586
- data/lib/chef/provider/package/smartos.rb +92 -92
- data/lib/chef/provider/package/solaris.rb +138 -138
- data/lib/chef/provider/package/windows.rb +269 -260
- data/lib/chef/provider/package/windows/exe.rb +117 -117
- data/lib/chef/provider/package/windows/msi.rb +93 -93
- data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +89 -89
- data/lib/chef/provider/package/yum-dump.py +307 -307
- data/lib/chef/provider/package/yum.rb +1421 -1421
- data/lib/chef/provider/package/zypper.rb +143 -143
- data/lib/chef/provider/powershell_script.rb +215 -215
- data/lib/chef/provider/reboot.rb +70 -70
- data/lib/chef/provider/registry_key.rb +155 -155
- data/lib/chef/provider/remote_directory.rb +281 -281
- data/lib/chef/provider/remote_file.rb +53 -53
- data/lib/chef/provider/remote_file/cache_control_data.rb +195 -195
- data/lib/chef/provider/remote_file/content.rb +81 -81
- data/lib/chef/provider/remote_file/fetcher.rb +55 -55
- data/lib/chef/provider/remote_file/ftp.rb +183 -183
- data/lib/chef/provider/remote_file/http.rb +117 -117
- data/lib/chef/provider/remote_file/local_file.rb +60 -60
- data/lib/chef/provider/remote_file/network_file.rb +48 -48
- data/lib/chef/provider/resource_update.rb +52 -52
- data/lib/chef/provider/route.rb +229 -229
- data/lib/chef/provider/ruby_block.rb +44 -44
- data/lib/chef/provider/script.rb +85 -85
- data/lib/chef/provider/service.rb +250 -212
- data/lib/chef/provider/service/aix.rb +129 -129
- data/lib/chef/provider/service/aixinit.rb +117 -117
- data/lib/chef/provider/service/arch.rb +118 -118
- data/lib/chef/provider/service/debian.rb +182 -182
- data/lib/chef/provider/service/freebsd.rb +195 -195
- data/lib/chef/provider/service/gentoo.rb +71 -71
- data/lib/chef/provider/service/init.rb +94 -94
- data/lib/chef/provider/service/insserv.rb +59 -59
- data/lib/chef/provider/service/invokercd.rb +41 -41
- data/lib/chef/provider/service/macosx.rb +250 -250
- data/lib/chef/provider/service/openbsd.rb +217 -217
- data/lib/chef/provider/service/redhat.rb +120 -120
- data/lib/chef/provider/service/simple.rb +175 -175
- data/lib/chef/provider/service/solaris.rb +117 -117
- data/lib/chef/provider/service/systemd.rb +155 -139
- data/lib/chef/provider/service/upstart.rb +242 -242
- data/lib/chef/provider/service/windows.rb +313 -313
- data/lib/chef/provider/subversion.rb +221 -221
- data/lib/chef/provider/template.rb +65 -65
- data/lib/chef/provider/template/content.rb +70 -70
- data/lib/chef/provider/template_finder.rb +62 -62
- data/lib/chef/provider/user.rb +211 -211
- data/lib/chef/provider/user/aix.rb +97 -97
- data/lib/chef/provider/user/dscl.rb +710 -710
- data/lib/chef/provider/user/pw.rb +114 -114
- data/lib/chef/provider/user/solaris.rb +121 -121
- data/lib/chef/provider/user/useradd.rb +163 -163
- data/lib/chef/provider/user/windows.rb +128 -128
- data/lib/chef/provider/whyrun_safe_ruby_block.rb +32 -32
- data/lib/chef/provider/windows_script.rb +72 -72
- data/lib/chef/provider_resolver.rb +170 -170
- data/lib/chef/providers.rb +142 -141
- data/lib/chef/recipe.rb +119 -119
- data/lib/chef/request_id.rb +37 -37
- data/lib/chef/reserved_names.rb +9 -9
- data/lib/chef/resource.rb +1581 -1581
- data/lib/chef/resource/action_class.rb +87 -87
- data/lib/chef/resource/apt_package.rb +32 -32
- data/lib/chef/resource/apt_update.rb +33 -33
- data/lib/chef/resource/bash.rb +33 -33
- data/lib/chef/resource/batch.rb +33 -33
- data/lib/chef/resource/bff_package.rb +27 -27
- data/lib/chef/resource/breakpoint.rb +32 -32
- data/lib/chef/resource/chef_gem.rb +51 -51
- data/lib/chef/resource/chocolatey_package.rb +39 -39
- data/lib/chef/resource/conditional.rb +127 -127
- data/lib/chef/resource/conditional_action_not_nothing.rb +48 -48
- data/lib/chef/resource/cookbook_file.rb +49 -49
- data/lib/chef/resource/cron.rb +216 -216
- data/lib/chef/resource/csh.rb +33 -33
- data/lib/chef/resource/deploy.rb +443 -443
- data/lib/chef/resource/deploy_revision.rb +31 -31
- data/lib/chef/resource/directory.rb +62 -62
- data/lib/chef/resource/dpkg_package.rb +30 -30
- data/lib/chef/resource/dsc_resource.rb +121 -121
- data/lib/chef/resource/dsc_script.rb +140 -140
- data/lib/chef/resource/easy_install_package.rb +32 -32
- data/lib/chef/resource/env.rb +65 -65
- data/lib/chef/resource/erl_call.rb +85 -85
- data/lib/chef/resource/execute.rb +172 -172
- data/lib/chef/resource/file.rb +83 -83
- data/lib/chef/resource/file/verification.rb +128 -128
- data/lib/chef/resource/freebsd_package.rb +62 -62
- data/lib/chef/resource/gem_package.rb +41 -41
- data/lib/chef/resource/git.rb +44 -44
- data/lib/chef/resource/group.rb +102 -102
- data/lib/chef/resource/homebrew_package.rb +34 -34
- data/lib/chef/resource/http_request.rb +66 -66
- data/lib/chef/resource/ifconfig.rb +147 -147
- data/lib/chef/resource/ips_package.rb +34 -34
- data/lib/chef/resource/ksh.rb +32 -32
- data/lib/chef/resource/launchd.rb +104 -0
- data/lib/chef/resource/link.rb +107 -107
- data/lib/chef/resource/log.rb +76 -76
- data/lib/chef/resource/lwrp_base.rb +124 -124
- data/lib/chef/resource/macosx_service.rb +58 -58
- data/lib/chef/resource/macports_package.rb +27 -27
- data/lib/chef/resource/mdadm.rb +103 -103
- data/lib/chef/resource/mount.rb +187 -187
- data/lib/chef/resource/ohai.rb +53 -53
- data/lib/chef/resource/openbsd_package.rb +35 -35
- data/lib/chef/resource/osx_profile.rb +74 -74
- data/lib/chef/resource/package.rb +47 -47
- data/lib/chef/resource/pacman_package.rb +28 -28
- data/lib/chef/resource/paludis_package.rb +33 -33
- data/lib/chef/resource/perl.rb +32 -32
- data/lib/chef/resource/portage_package.rb +32 -32
- data/lib/chef/resource/powershell_script.rb +50 -50
- data/lib/chef/resource/python.rb +31 -31
- data/lib/chef/resource/reboot.rb +48 -48
- data/lib/chef/resource/registry_key.rb +144 -144
- data/lib/chef/resource/remote_directory.rb +122 -122
- data/lib/chef/resource/remote_file.rb +149 -149
- data/lib/chef/resource/resource_notification.rb +122 -122
- data/lib/chef/resource/route.rb +137 -137
- data/lib/chef/resource/rpm_package.rb +32 -32
- data/lib/chef/resource/ruby.rb +31 -31
- data/lib/chef/resource/ruby_block.rb +53 -53
- data/lib/chef/resource/scm.rb +185 -185
- data/lib/chef/resource/script.rb +74 -74
- data/lib/chef/resource/service.rb +208 -197
- data/lib/chef/resource/smartos_package.rb +29 -29
- data/lib/chef/resource/solaris_package.rb +31 -31
- data/lib/chef/resource/subversion.rb +44 -44
- data/lib/chef/resource/template.rb +215 -215
- data/lib/chef/resource/timestamped_deploy.rb +26 -26
- data/lib/chef/resource/user.rb +160 -160
- data/lib/chef/resource/whyrun_safe_ruby_block.rb +24 -24
- data/lib/chef/resource/windows_package.rb +55 -55
- data/lib/chef/resource/windows_script.rb +65 -65
- data/lib/chef/resource/windows_service.rb +71 -71
- data/lib/chef/resource/yum_package.rb +47 -47
- data/lib/chef/resource/zypper_package.rb +28 -28
- data/lib/chef/resource_builder.rb +151 -151
- data/lib/chef/resource_collection.rb +89 -89
- data/lib/chef/resource_collection/resource_collection_serialization.rb +59 -59
- data/lib/chef/resource_collection/resource_list.rb +90 -89
- data/lib/chef/resource_collection/resource_set.rb +170 -170
- data/lib/chef/resource_collection/stepable_iterator.rb +124 -124
- data/lib/chef/resource_definition.rb +68 -68
- data/lib/chef/resource_definition_list.rb +38 -38
- data/lib/chef/resource_reporter.rb +327 -327
- data/lib/chef/resource_resolver.rb +185 -185
- data/lib/chef/resources.rb +88 -87
- data/lib/chef/rest.rb +209 -209
- data/lib/chef/role.rb +280 -280
- data/lib/chef/run_context.rb +670 -670
- data/lib/chef/run_context/cookbook_compiler.rb +289 -289
- data/lib/chef/run_list.rb +168 -166
- data/lib/chef/run_list/run_list_expansion.rb +234 -234
- data/lib/chef/run_list/run_list_item.rb +98 -98
- data/lib/chef/run_list/versioned_recipe_list.rb +102 -102
- data/lib/chef/run_lock.rb +197 -197
- data/lib/chef/run_status.rb +125 -125
- data/lib/chef/runner.rb +141 -141
- data/lib/chef/sandbox.rb +20 -20
- data/lib/chef/scan_access_control.rb +138 -138
- data/lib/chef/search/query.rb +180 -180
- data/lib/chef/server_api.rb +78 -78
- data/lib/chef/shell.rb +327 -322
- data/lib/chef/shell/ext.rb +593 -593
- data/lib/chef/shell/model_wrapper.rb +120 -119
- data/lib/chef/shell/shell_session.rb +299 -299
- data/lib/chef/shell_out.rb +13 -13
- data/lib/chef/tasks/chef_repo.rake +200 -200
- data/lib/chef/user.rb +199 -199
- data/lib/chef/user_v1.rb +330 -330
- data/lib/chef/util/backup.rb +94 -94
- data/lib/chef/util/diff.rb +184 -184
- data/lib/chef/util/dsc/configuration_generator.rb +139 -139
- data/lib/chef/util/dsc/lcm_output_parser.rb +137 -137
- data/lib/chef/util/dsc/local_configuration_manager.rb +141 -141
- data/lib/chef/util/dsc/resource_info.rb +26 -26
- data/lib/chef/util/dsc/resource_store.rb +109 -109
- data/lib/chef/util/editor.rb +91 -91
- data/lib/chef/util/file_edit.rb +100 -100
- data/lib/chef/util/path_helper.rb +25 -25
- data/lib/chef/util/powershell/cmdlet.rb +170 -170
- data/lib/chef/util/powershell/cmdlet_result.rb +61 -61
- data/lib/chef/util/powershell/ps_credential.rb +41 -41
- data/lib/chef/util/selinux.rb +92 -92
- data/lib/chef/util/threaded_job_queue.rb +61 -61
- data/lib/chef/util/windows.rb +24 -24
- data/lib/chef/util/windows/net_group.rb +84 -84
- data/lib/chef/util/windows/net_use.rb +85 -85
- data/lib/chef/util/windows/net_user.rb +170 -169
- data/lib/chef/util/windows/volume.rb +59 -59
- data/lib/chef/version.rb +34 -34
- data/lib/chef/version/platform.rb +44 -44
- data/lib/chef/version_class.rb +70 -70
- data/lib/chef/version_constraint.rb +118 -118
- data/lib/chef/version_constraint/platform.rb +26 -26
- data/lib/chef/whitelist.rb +86 -86
- data/lib/chef/win32/api.rb +374 -374
- data/lib/chef/win32/api/crypto.rb +63 -63
- data/lib/chef/win32/api/error.rb +953 -922
- data/lib/chef/win32/api/file.rb +625 -622
- data/lib/chef/win32/api/installer.rb +165 -165
- data/lib/chef/win32/api/memory.rb +105 -105
- data/lib/chef/win32/api/net.rb +312 -312
- data/lib/chef/win32/api/process.rb +42 -42
- data/lib/chef/win32/api/psapi.rb +51 -51
- data/lib/chef/win32/api/registry.rb +51 -51
- data/lib/chef/win32/api/security.rb +460 -460
- data/lib/chef/win32/api/synchronization.rb +89 -89
- data/lib/chef/win32/api/system.rb +238 -238
- data/lib/chef/win32/api/unicode.rb +135 -135
- data/lib/chef/win32/crypto.rb +50 -50
- data/lib/chef/win32/error.rb +86 -76
- data/lib/chef/win32/eventlog.rb +31 -31
- data/lib/chef/win32/file.rb +218 -218
- data/lib/chef/win32/file/info.rb +99 -99
- data/lib/chef/win32/file/version_info.rb +93 -93
- data/lib/chef/win32/handle.rb +55 -55
- data/lib/chef/win32/memory.rb +101 -101
- data/lib/chef/win32/mutex.rb +116 -116
- data/lib/chef/win32/net.rb +311 -311
- data/lib/chef/win32/process.rb +97 -97
- data/lib/chef/win32/registry.rb +372 -372
- data/lib/chef/win32/security.rb +665 -665
- data/lib/chef/win32/security/ace.rb +123 -123
- data/lib/chef/win32/security/acl.rb +103 -103
- data/lib/chef/win32/security/securable_object.rb +109 -109
- data/lib/chef/win32/security/security_descriptor.rb +93 -93
- data/lib/chef/win32/security/sid.rb +304 -304
- data/lib/chef/win32/security/token.rb +72 -72
- data/lib/chef/win32/system.rb +62 -62
- data/lib/chef/win32/unicode.rb +60 -60
- data/lib/chef/win32/version.rb +158 -158
- data/lib/chef/workstation_config_loader.rb +23 -23
- data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -5
- data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -1
- data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -13
- data/spec/data/apt/chef-integration-test-1.0/debian/copyright +34 -34
- data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -1
- data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -13
- data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -1
- data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -11
- data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -1
- data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -13
- data/spec/data/apt/chef-integration-test-1.1/debian/copyright +34 -34
- data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -1
- data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -13
- data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -1
- data/spec/data/apt/chef-integration-test2-1.0/debian/changelog +5 -5
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2.debhelper.log +45 -45
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2.substvars +1 -1
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/conffiles +1 -1
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/control +10 -10
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/md5sums +1 -1
- data/spec/data/apt/chef-integration-test2-1.0/debian/compat +1 -1
- data/spec/data/apt/chef-integration-test2-1.0/debian/conffiles +1 -1
- data/spec/data/apt/chef-integration-test2-1.0/debian/control +13 -13
- data/spec/data/apt/chef-integration-test2-1.0/debian/copyright +34 -34
- data/spec/data/apt/chef-integration-test2-1.0/debian/files +1 -1
- data/spec/data/apt/chef-integration-test2-1.0/debian/rules +13 -13
- data/spec/data/apt/chef-integration-test2-1.0/debian/source/format +1 -1
- data/spec/data/apt/chef-integration-test2_1.0-1.dsc +18 -18
- data/spec/data/apt/chef-integration-test2_1.0-1_amd64.build +91 -91
- data/spec/data/apt/chef-integration-test2_1.0-1_amd64.changes +31 -31
- data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -22
- data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -22
- data/spec/data/apt/var/www/apt/conf/distributions +7 -7
- data/spec/data/apt/var/www/apt/conf/incoming +4 -4
- data/spec/data/apt/var/www/apt/conf/pulls +3 -3
- data/spec/data/apt/var/www/apt/db/version +4 -4
- data/spec/data/apt/var/www/apt/dists/sid/Release +19 -19
- data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -16
- data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -5
- data/spec/data/bootstrap/encrypted_data_bag_secret +1 -1
- data/spec/data/bootstrap/no_proxy.erb +2 -2
- data/spec/data/bootstrap/secret.erb +9 -9
- data/spec/data/bootstrap/test-hints.erb +12 -12
- data/spec/data/bootstrap/test.erb +1 -1
- data/spec/data/cb_version_cookbooks/tatft/README.rdoc +2 -2
- data/spec/data/cb_version_cookbooks/tatft/attributes/default.rb +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-600hhz-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ahd2gq-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-api8ux-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-b0r1m1-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-bfygsi-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-el14l6-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ivrl3y-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-kkbs85-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ory1ux-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-pgsq76-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ra8uim-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t7k1g-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t8g0sv-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ufy6g3-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-x2d6j9-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-xi0l6h-0 +1 -1
- data/spec/data/client.d_00/00-foo.rb +2 -0
- data/spec/data/client.d_00/01-bar.rb +1 -0
- data/spec/data/client.d_00/bar +1 -0
- data/spec/data/client.d_01/foo/bar.rb +1 -0
- data/spec/data/client.d_02/foo.rb/foo.txt +1 -0
- data/spec/data/config.rb +6 -6
- data/spec/data/cookbooks/angrybash/metadata.rb +2 -2
- data/spec/data/cookbooks/angrybash/recipes/default.rb +8 -8
- data/spec/data/cookbooks/apache2/files/default/apache2_module_conf_generate.pl +2 -2
- data/spec/data/cookbooks/apache2/metadata.rb +2 -2
- data/spec/data/cookbooks/apache2/recipes/default.rb +2 -2
- data/spec/data/cookbooks/borken/metadata.rb +2 -2
- data/spec/data/cookbooks/borken/recipes/default.rb +1 -1
- data/spec/data/cookbooks/borken/templates/default/borken.erb +1 -1
- data/spec/data/cookbooks/chefignore +8 -8
- data/spec/data/cookbooks/ignorken/files/default/not_me.rb +2 -2
- data/spec/data/cookbooks/ignorken/metadata.rb +2 -2
- data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +1 -1
- data/spec/data/cookbooks/ignorken/templates/ubuntu-12.10/not_me.rb +2 -2
- data/spec/data/cookbooks/java/files/default/java.response +1 -1
- data/spec/data/cookbooks/java/metadata.rb +2 -2
- data/spec/data/cookbooks/name-mismatch-versionnumber/README.md +4 -4
- data/spec/data/cookbooks/name-mismatch-versionnumber/metadata.rb +8 -8
- data/spec/data/cookbooks/name-mismatch-versionnumber/recipes/default.rb +8 -8
- data/spec/data/cookbooks/openldap/.root_dotfile +0 -0
- data/spec/data/cookbooks/openldap/attributes/default.rb +16 -16
- data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
- data/spec/data/cookbooks/openldap/definitions/client.rb +5 -5
- data/spec/data/cookbooks/openldap/definitions/server.rb +5 -5
- data/spec/data/cookbooks/openldap/files/default/.dotfile +1 -1
- data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +1 -1
- data/spec/data/cookbooks/openldap/files/default/remotedir/not_a_template.erb +2 -2
- data/spec/data/cookbooks/openldap/files/default/remotedir/remote_dir_file1.txt +2 -2
- data/spec/data/cookbooks/openldap/files/default/remotedir/remote_dir_file2.txt +2 -2
- data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +1 -1
- data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/remote_subdir_file1.txt +2 -2
- data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/remote_subdir_file2.txt +2 -2
- data/spec/data/cookbooks/openldap/files/default/remotedir/subdir_with_no_file_just_a_subsubdir/the_subsubdir/some_file.txt +3 -3
- data/spec/data/cookbooks/openldap/libraries/openldap.rb +4 -4
- data/spec/data/cookbooks/openldap/libraries/openldap/version.rb +3 -3
- data/spec/data/cookbooks/openldap/metadata.rb +8 -8
- data/spec/data/cookbooks/openldap/recipes/default.rb +4 -4
- data/spec/data/cookbooks/openldap/recipes/gigantor.rb +3 -3
- data/spec/data/cookbooks/openldap/recipes/one.rb +15 -15
- data/spec/data/cookbooks/openldap/recipes/return.rb +2 -2
- data/spec/data/cookbooks/openldap/spec/spec_helper.rb +0 -0
- data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -1
- data/spec/data/cookbooks/openldap/templates/default/helpers.erb +14 -14
- data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -1
- data/spec/data/cookbooks/openldap/templates/default/nested_openldap_partials.erb +1 -1
- data/spec/data/cookbooks/openldap/templates/default/nested_partial.erb +1 -1
- data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -4
- data/spec/data/cookbooks/openldap/templates/default/openldap_variable_stuff.conf.erb +1 -1
- data/spec/data/cookbooks/openldap/templates/default/test.erb +1 -1
- data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -1
- data/spec/data/cookbooks/preseed/files/default/preseed-template.seed +4 -4
- data/spec/data/cookbooks/preseed/metadata.rb +2 -2
- data/spec/data/cookbooks/preseed/templates/default/preseed-template-variables.seed +1 -1
- data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -1
- data/spec/data/cookbooks/supports-platform-constraints/metadata.rb +5 -5
- data/spec/data/definitions/test.rb +4 -4
- data/spec/data/environment-config.rb +4 -4
- data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -127
- data/spec/data/fileedit/hosts +4 -4
- data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/README.md +4 -4
- data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/metadata.rb +13 -13
- data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/recipes/default.rb +8 -8
- data/spec/data/invalid-metadata-chef-repo/invalid-metadata/README.md +4 -4
- data/spec/data/invalid-metadata-chef-repo/invalid-metadata/metadata.rb +9 -9
- data/spec/data/invalid-metadata-chef-repo/invalid-metadata/recipes/default.rb +8 -8
- data/spec/data/kitchen/chefignore +6 -6
- data/spec/data/kitchen/openldap/attributes/default.rb +3 -3
- data/spec/data/kitchen/openldap/attributes/robinson.rb +2 -2
- data/spec/data/kitchen/openldap/definitions/client.rb +3 -3
- data/spec/data/kitchen/openldap/definitions/drewbarrymore.rb +2 -2
- data/spec/data/kitchen/openldap/recipes/gigantor.rb +2 -2
- data/spec/data/kitchen/openldap/recipes/ignoreme.rb +2 -2
- data/spec/data/kitchen/openldap/recipes/woot.rb +3 -3
- data/spec/data/knife_subcommand/test_explicit_category.rb +6 -6
- data/spec/data/knife_subcommand/test_name_mapping.rb +4 -4
- data/spec/data/knife_subcommand/test_yourself.rb +21 -21
- data/spec/data/lwrp/providers/buck_passer.rb +28 -28
- data/spec/data/lwrp/providers/buck_passer_2.rb +26 -26
- data/spec/data/lwrp/providers/embedded_resource_accesses_providers_scope.rb +28 -28
- data/spec/data/lwrp/providers/inline_compiler.rb +26 -26
- data/spec/data/lwrp/providers/monkey_name_printer.rb +5 -5
- data/spec/data/lwrp/providers/paint_drying_watcher.rb +7 -7
- data/spec/data/lwrp/providers/thumb_twiddler.rb +7 -7
- data/spec/data/lwrp/resources/bar.rb +2 -2
- data/spec/data/lwrp/resources/foo.rb +4 -4
- data/spec/data/lwrp/resources_with_default_attributes/nodeattr.rb +1 -1
- data/spec/data/lwrp_override/providers/buck_passer.rb +5 -5
- data/spec/data/lwrp_override/resources/foo.rb +10 -10
- data/spec/data/mac_users/10.7-8.plist.xml +559 -559
- data/spec/data/mac_users/10.7-8.shadow.xml +11 -11
- data/spec/data/mac_users/10.7.plist.xml +559 -559
- data/spec/data/mac_users/10.7.shadow.xml +11 -11
- data/spec/data/mac_users/10.8.plist.xml +559 -559
- data/spec/data/mac_users/10.8.shadow.xml +21 -21
- data/spec/data/mac_users/10.9.plist.xml +560 -560
- data/spec/data/mac_users/10.9.shadow.xml +21 -21
- data/spec/data/metadata/quick_start/metadata.rb +19 -19
- data/spec/data/nested.json +2 -2
- data/spec/data/nodes/default.rb +15 -15
- data/spec/data/nodes/test.example.com.rb +17 -17
- data/spec/data/nodes/test.rb +15 -15
- data/spec/data/null_config.rb +1 -1
- data/spec/data/object_loader/environments/test.json +7 -7
- data/spec/data/object_loader/environments/test.rb +2 -2
- data/spec/data/object_loader/environments/test_json_class.json +8 -8
- data/spec/data/object_loader/nodes/test.json +7 -7
- data/spec/data/object_loader/nodes/test.rb +2 -2
- data/spec/data/object_loader/nodes/test_json_class.json +8 -8
- data/spec/data/object_loader/roles/test.json +7 -7
- data/spec/data/object_loader/roles/test.rb +2 -2
- data/spec/data/object_loader/roles/test_json_class.json +8 -8
- data/spec/data/partial_one.erb +1 -1
- data/spec/data/recipes/test.rb +7 -7
- data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -4
- data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -1
- data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -2
- data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -2
- data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -1
- data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -1
- data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -3
- data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -1
- data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -2
- data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -2
- data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -1
- data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -1
- data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -2
- data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -2
- data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -3
- data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -1
- data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -2
- data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -1
- data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -1
- data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -3
- data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -1
- data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -2
- data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -1
- data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -1
- data/spec/data/run_context/cookbooks/include/recipes/default.rb +24 -24
- data/spec/data/run_context/cookbooks/include/recipes/includee.rb +3 -3
- data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -3
- data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -1
- data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -1
- data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -1
- data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -3
- data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -1
- data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -2
- data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -2
- data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -1
- data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -1
- data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -3
- data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -1
- data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -1
- data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -3
- data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -1
- data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -1
- data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
- data/spec/data/run_context/cookbooks/test/definitions/new_animals.rb +9 -9
- data/spec/data/run_context/cookbooks/test/definitions/new_cat.rb +5 -5
- data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -1
- data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -1
- data/spec/data/run_context/cookbooks/test/recipes/default.rb +5 -5
- data/spec/data/run_context/cookbooks/test/recipes/one.rb +7 -7
- data/spec/data/run_context/cookbooks/test/recipes/two.rb +7 -7
- data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -1
- data/spec/data/run_context/nodes/run_context.rb +5 -5
- data/spec/data/search_queries_to_transform.txt +98 -98
- data/spec/data/shef-config.rb +10 -10
- data/spec/data/ssl/5e707473.0 +18 -18
- data/spec/data/ssl/chef-rspec.cert +27 -27
- data/spec/data/ssl/chef-rspec.key +27 -27
- data/spec/data/ssl/key.pem +15 -15
- data/spec/data/ssl/private_key.pem +27 -27
- data/spec/data/ssl/private_key_with_whitespace.pem +32 -32
- data/spec/data/standalone_cookbook/chefignore +9 -9
- data/spec/data/standalone_cookbook/recipes/default.rb +2 -2
- data/spec/data/trusted_certs/example.crt +22 -22
- data/spec/data/trusted_certs/intermediate.pem +27 -27
- data/spec/data/trusted_certs/opscode.pem +57 -57
- data/spec/data/trusted_certs/root.pem +22 -22
- data/spec/functional/application_spec.rb +58 -58
- data/spec/functional/assets/chefinittest +34 -34
- data/spec/functional/assets/testchefsubsys +10 -10
- data/spec/functional/audit/rspec_formatter_spec.rb +54 -54
- data/spec/functional/audit/runner_spec.rb +121 -121
- data/spec/functional/dsl/reboot_pending_spec.rb +106 -106
- data/spec/functional/dsl/registry_helper_spec.rb +61 -61
- data/spec/functional/event_loggers/windows_eventlog_spec.rb +101 -101
- data/spec/functional/file_content_management/deploy_strategies_spec.rb +229 -229
- data/spec/functional/http/simple_spec.rb +140 -140
- data/spec/functional/knife/configure_spec.rb +33 -33
- data/spec/functional/knife/cookbook_delete_spec.rb +167 -167
- data/spec/functional/knife/exec_spec.rb +55 -55
- data/spec/functional/knife/rehash_spec.rb +39 -0
- data/spec/functional/knife/smoke_test.rb +42 -42
- data/spec/functional/knife/ssh_spec.rb +284 -284
- data/spec/functional/mixin/powershell_out_spec.rb +43 -43
- data/spec/functional/mixin/shell_out_spec.rb +48 -48
- data/spec/functional/notifications_spec.rb +238 -238
- data/spec/functional/provider/remote_file/cache_control_data_spec.rb +100 -100
- data/spec/functional/provider/whyrun_safe_ruby_block_spec.rb +51 -51
- data/spec/functional/rebooter_spec.rb +105 -105
- data/spec/functional/resource/aix_service_spec.rb +138 -138
- data/spec/functional/resource/aixinit_service_spec.rb +211 -211
- data/spec/functional/resource/base.rb +28 -28
- data/spec/functional/resource/bash_spec.rb +88 -88
- data/spec/functional/resource/batch_spec.rb +30 -30
- data/spec/functional/resource/bff_spec.rb +120 -120
- data/spec/functional/resource/chocolatey_package_spec.rb +130 -124
- data/spec/functional/resource/cookbook_file_spec.rb +81 -81
- data/spec/functional/resource/cron_spec.rb +172 -172
- data/spec/functional/resource/deploy_revision_spec.rb +881 -881
- data/spec/functional/resource/directory_spec.rb +43 -43
- data/spec/functional/resource/dpkg_package_spec.rb +339 -339
- data/spec/functional/resource/dsc_resource_spec.rb +90 -90
- data/spec/functional/resource/dsc_script_spec.rb +479 -469
- data/spec/functional/resource/env_spec.rb +192 -192
- data/spec/functional/resource/execute_spec.rb +154 -154
- data/spec/functional/resource/file_spec.rb +167 -167
- data/spec/functional/resource/git_spec.rb +259 -259
- data/spec/functional/resource/group_spec.rb +461 -461
- data/spec/functional/resource/ifconfig_spec.rb +165 -165
- data/spec/functional/resource/link_spec.rb +613 -613
- data/spec/functional/resource/mount_spec.rb +203 -203
- data/spec/functional/resource/ohai_spec.rb +62 -62
- data/spec/functional/resource/package_spec.rb +386 -386
- data/spec/functional/resource/powershell_script_spec.rb +601 -601
- data/spec/functional/resource/reboot_spec.rb +103 -103
- data/spec/functional/resource/registry_spec.rb +560 -560
- data/spec/functional/resource/remote_directory_spec.rb +220 -220
- data/spec/functional/resource/remote_file_spec.rb +240 -240
- data/spec/functional/resource/rpm_spec.rb +123 -123
- data/spec/functional/resource/template_spec.rb +212 -212
- data/spec/functional/resource/user/dscl_spec.rb +198 -198
- data/spec/functional/resource/user/useradd_spec.rb +692 -699
- data/spec/functional/resource/user/windows_spec.rb +133 -133
- data/spec/functional/resource/windows_package_spec.rb +168 -168
- data/spec/functional/resource/windows_service_spec.rb +102 -102
- data/spec/functional/rest_spec.rb +95 -95
- data/spec/functional/run_lock_spec.rb +466 -466
- data/spec/functional/shell_spec.rb +148 -148
- data/spec/functional/tiny_server_spec.rb +78 -78
- data/spec/functional/util/path_helper_spec.rb +37 -37
- data/spec/functional/util/powershell/cmdlet_spec.rb +111 -111
- data/spec/functional/version_spec.rb +35 -35
- data/spec/functional/win32/crypto_spec.rb +54 -54
- data/spec/functional/win32/registry_spec.rb +623 -623
- data/spec/functional/win32/security_spec.rb +100 -100
- data/spec/functional/win32/service_manager_spec.rb +220 -220
- data/spec/functional/win32/sid_spec.rb +55 -55
- data/spec/functional/win32/version_info_spec.rb +50 -50
- data/spec/functional/win32/versions_spec.rb +117 -117
- data/spec/integration/client/client_spec.rb +500 -500
- data/spec/integration/client/ipv6_spec.rb +134 -134
- data/spec/integration/knife/chef_fs_data_store_spec.rb +556 -556
- data/spec/integration/knife/chef_repo_path_spec.rb +890 -890
- data/spec/integration/knife/chef_repository_file_system_spec.rb +292 -292
- data/spec/integration/knife/chefignore_spec.rb +300 -300
- data/spec/integration/knife/common_options_spec.rb +155 -155
- data/spec/integration/knife/cookbook_api_ipv6_spec.rb +112 -112
- data/spec/integration/knife/delete_spec.rb +1017 -1017
- data/spec/integration/knife/deps_spec.rb +706 -706
- data/spec/integration/knife/diff_spec.rb +602 -602
- data/spec/integration/knife/download_spec.rb +1314 -1314
- data/spec/integration/knife/list_spec.rb +1067 -1067
- data/spec/integration/knife/raw_spec.rb +242 -242
- data/spec/integration/knife/redirection_spec.rb +52 -52
- data/spec/integration/knife/serve_spec.rb +57 -57
- data/spec/integration/knife/show_spec.rb +167 -167
- data/spec/integration/knife/upload_spec.rb +1529 -1529
- data/spec/integration/recipes/lwrp_inline_resources_spec.rb +148 -148
- data/spec/integration/recipes/lwrp_spec.rb +53 -53
- data/spec/integration/recipes/provider_choice.rb +37 -37
- data/spec/integration/recipes/recipe_dsl_spec.rb +1519 -1519
- data/spec/integration/recipes/remote_directory.rb +74 -74
- data/spec/integration/recipes/resource_action_spec.rb +569 -569
- data/spec/integration/recipes/resource_converge_if_changed_spec.rb +496 -496
- data/spec/integration/recipes/resource_load_spec.rb +208 -208
- data/spec/integration/solo/solo_spec.rb +176 -176
- data/spec/rcov.opts +2 -2
- data/spec/scripts/ssl-serve.rb +47 -47
- data/spec/spec_helper.rb +248 -249
- data/spec/stress/win32/file_spec.rb +37 -37
- data/spec/stress/win32/memory_spec.rb +22 -22
- data/spec/stress/win32/security_spec.rb +69 -69
- data/spec/support/chef_helpers.rb +95 -95
- data/spec/support/key_helpers.rb +104 -104
- data/spec/support/lib/chef/provider/easy.rb +35 -35
- data/spec/support/lib/chef/provider/openldap_includer.rb +29 -29
- data/spec/support/lib/chef/provider/snakeoil.rb +41 -41
- data/spec/support/lib/chef/resource/cat.rb +38 -38
- data/spec/support/lib/chef/resource/one_two_three_four.rb +37 -37
- data/spec/support/lib/chef/resource/openldap_includer.rb +26 -26
- data/spec/support/lib/chef/resource/with_state.rb +28 -28
- data/spec/support/lib/chef/resource/zen_follower.rb +35 -35
- data/spec/support/lib/chef/resource/zen_master.rb +41 -41
- data/spec/support/lib/library_load_order.rb +20 -20
- data/spec/support/matchers/leak.rb +98 -98
- data/spec/support/mock/constant.rb +52 -52
- data/spec/support/mock/platform.rb +25 -25
- data/spec/support/platform_helpers.rb +214 -218
- data/spec/support/platforms/prof/gc.rb +53 -53
- data/spec/support/platforms/prof/win32.rb +45 -45
- data/spec/support/platforms/win32/spec_service.rb +59 -59
- data/spec/support/shared/context/client.rb +285 -285
- data/spec/support/shared/context/config.rb +21 -21
- data/spec/support/shared/context/win32.rb +34 -34
- data/spec/support/shared/examples/client.rb +53 -53
- data/spec/support/shared/functional/diff_disabled.rb +10 -10
- data/spec/support/shared/functional/directory_resource.rb +176 -176
- data/spec/support/shared/functional/file_resource.rb +1049 -1049
- data/spec/support/shared/functional/http.rb +248 -248
- data/spec/support/shared/functional/knife.rb +37 -37
- data/spec/support/shared/functional/securable_resource.rb +547 -547
- data/spec/support/shared/functional/securable_resource_with_reporting.rb +394 -394
- data/spec/support/shared/functional/win32_service.rb +59 -59
- data/spec/support/shared/functional/windows_script.rb +202 -202
- data/spec/support/shared/integration/app_server_support.rb +42 -42
- data/spec/support/shared/integration/integration_helper.rb +154 -154
- data/spec/support/shared/integration/knife_support.rb +173 -173
- data/spec/support/shared/matchers/exit_with_code.rb +32 -32
- data/spec/support/shared/matchers/match_environment_variable.rb +17 -17
- data/spec/support/shared/shared_examples.rb +14 -14
- data/spec/support/shared/unit/api_error_inspector.rb +190 -190
- data/spec/support/shared/unit/api_versioning.rb +77 -77
- data/spec/support/shared/unit/application_dot_d.rb +70 -0
- data/spec/support/shared/unit/execute_resource.rb +133 -133
- data/spec/support/shared/unit/file_system_support.rb +69 -69
- data/spec/support/shared/unit/knife_shared.rb +39 -39
- data/spec/support/shared/unit/mock_shellout.rb +49 -49
- data/spec/support/shared/unit/platform_introspector.rb +189 -189
- data/spec/support/shared/unit/provider/file.rb +835 -835
- data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +433 -433
- data/spec/support/shared/unit/resource/static_provider_resolution.rb +63 -63
- data/spec/support/shared/unit/script_resource.rb +98 -98
- data/spec/support/shared/unit/user_and_client_shared.rb +114 -114
- data/spec/support/shared/unit/windows_script_resource.rb +80 -80
- data/spec/tiny_server.rb +207 -207
- data/spec/unit/api_client/registration_spec.rb +278 -278
- data/spec/unit/api_client_spec.rb +341 -341
- data/spec/unit/api_client_v1_spec.rb +455 -455
- data/spec/unit/application/apply_spec.rb +110 -110
- data/spec/unit/application/client_spec.rb +435 -431
- data/spec/unit/application/knife_spec.rb +229 -229
- data/spec/unit/application/solo_spec.rb +170 -167
- data/spec/unit/application_spec.rb +384 -384
- data/spec/unit/audit/audit_event_proxy_spec.rb +311 -311
- data/spec/unit/audit/audit_reporter_spec.rb +430 -430
- data/spec/unit/audit/control_group_data_spec.rb +477 -477
- data/spec/unit/audit/logger_spec.rb +42 -42
- data/spec/unit/audit/rspec_formatter_spec.rb +29 -29
- data/spec/unit/audit/runner_spec.rb +144 -144
- data/spec/unit/chef_class_spec.rb +110 -110
- data/spec/unit/chef_fs/config_spec.rb +106 -106
- data/spec/unit/chef_fs/data_handler/group_handler_spec.rb +63 -63
- data/spec/unit/chef_fs/diff_spec.rb +328 -328
- data/spec/unit/chef_fs/file_pattern_spec.rb +512 -512
- data/spec/unit/chef_fs/file_system/cookbook_subdir_spec.rb +34 -34
- data/spec/unit/chef_fs/file_system/operation_failed_error_spec.rb +47 -47
- data/spec/unit/chef_fs/file_system_spec.rb +148 -148
- data/spec/unit/chef_fs/parallelizer.rb +479 -479
- data/spec/unit/chef_fs/path_util_spec.rb +108 -108
- data/spec/unit/chef_spec.rb +25 -25
- data/spec/unit/client_spec.rb +544 -544
- data/spec/unit/config_fetcher_spec.rb +125 -125
- data/spec/unit/config_spec.rb +31 -31
- data/spec/unit/cookbook/chefignore_spec.rb +49 -49
- data/spec/unit/cookbook/cookbook_version_loader_spec.rb +198 -186
- data/spec/unit/cookbook/file_vendor_spec.rb +97 -97
- data/spec/unit/cookbook/metadata_spec.rb +952 -924
- data/spec/unit/cookbook/synchronizer_spec.rb +520 -520
- data/spec/unit/cookbook/syntax_check_spec.rb +219 -217
- data/spec/unit/cookbook_loader_spec.rb +299 -290
- data/spec/unit/cookbook_manifest_spec.rb +243 -243
- data/spec/unit/cookbook_site_streaming_uploader_spec.rb +203 -199
- data/spec/unit/cookbook_spec.rb +66 -66
- data/spec/unit/cookbook_uploader_spec.rb +199 -199
- data/spec/unit/cookbook_version_file_specificity_spec.rb +553 -553
- data/spec/unit/cookbook_version_spec.rb +359 -341
- data/spec/unit/daemon_spec.rb +174 -174
- data/spec/unit/data_bag_item_spec.rb +388 -323
- data/spec/unit/data_bag_spec.rb +260 -260
- data/spec/unit/deprecation_spec.rb +150 -150
- data/spec/unit/digester_spec.rb +49 -49
- data/spec/unit/dsl/audit_spec.rb +43 -43
- data/spec/unit/dsl/data_query_spec.rb +106 -106
- data/spec/unit/dsl/platform_introspection_spec.rb +129 -129
- data/spec/unit/dsl/reboot_pending_spec.rb +100 -100
- data/spec/unit/dsl/recipe_spec.rb +80 -80
- data/spec/unit/dsl/regsitry_helper_spec.rb +52 -52
- data/spec/unit/dsl/resources_spec.rb +85 -85
- data/spec/unit/encrypted_data_bag_item/check_encrypted_spec.rb +95 -95
- data/spec/unit/encrypted_data_bag_item_spec.rb +437 -437
- data/spec/unit/environment_spec.rb +470 -470
- data/spec/unit/event_dispatch/dispatcher_spec.rb +122 -122
- data/spec/unit/event_dispatch/dsl_spec.rb +83 -83
- data/spec/unit/exceptions_spec.rb +130 -130
- data/spec/unit/file_access_control_spec.rb +308 -308
- data/spec/unit/file_cache_spec.rb +114 -114
- data/spec/unit/file_content_management/deploy/cp_spec.rb +44 -44
- data/spec/unit/file_content_management/deploy/mv_unix_spec.rb +101 -101
- data/spec/unit/file_content_management/deploy/mv_windows_spec.rb +232 -232
- data/spec/unit/file_content_management/tempfile_spec.rb +85 -0
- data/spec/unit/formatters/base_spec.rb +71 -71
- data/spec/unit/formatters/doc_spec.rb +78 -78
- data/spec/unit/formatters/error_inspectors/api_error_formatting_spec.rb +76 -76
- data/spec/unit/formatters/error_inspectors/compile_error_inspector_spec.rb +265 -265
- data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +126 -126
- data/spec/unit/formatters/error_inspectors/cookbook_sync_error_inspector_spec.rb +43 -43
- data/spec/unit/formatters/error_inspectors/node_load_error_inspector_spec.rb +26 -26
- data/spec/unit/formatters/error_inspectors/registration_error_inspector_spec.rb +26 -26
- data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +191 -191
- data/spec/unit/formatters/error_inspectors/run_list_expansion_error_inspector_spec.rb +91 -91
- data/spec/unit/guard_interpreter/resource_guard_interpreter_spec.rb +155 -155
- data/spec/unit/guard_interpreter_spec.rb +41 -41
- data/spec/unit/handler/json_file_spec.rb +63 -63
- data/spec/unit/handler_spec.rb +215 -215
- data/spec/unit/http/authenticator_spec.rb +80 -80
- data/spec/unit/http/basic_client_spec.rb +129 -129
- data/spec/unit/http/http_request_spec.rb +91 -91
- data/spec/unit/http/json_input_spec.rb +128 -128
- data/spec/unit/http/simple_spec.rb +32 -32
- data/spec/unit/http/socketless_chef_zero_client_spec.rb +173 -173
- data/spec/unit/http/ssl_policies_spec.rb +169 -169
- data/spec/unit/http/validate_content_length_spec.rb +207 -192
- data/spec/unit/http_spec.rb +206 -194
- data/spec/unit/json_compat_spec.rb +105 -105
- data/spec/unit/key_spec.rb +631 -631
- data/spec/unit/knife/bootstrap/chef_vault_handler_spec.rb +152 -152
- data/spec/unit/knife/bootstrap/client_builder_spec.rb +207 -207
- data/spec/unit/knife/bootstrap_spec.rb +822 -773
- data/spec/unit/knife/client_bulk_delete_spec.rb +166 -166
- data/spec/unit/knife/client_create_spec.rb +186 -186
- data/spec/unit/knife/client_delete_spec.rb +83 -83
- data/spec/unit/knife/client_edit_spec.rb +53 -53
- data/spec/unit/knife/client_list_spec.rb +34 -34
- data/spec/unit/knife/client_reregister_spec.rb +62 -62
- data/spec/unit/knife/client_show_spec.rb +52 -52
- data/spec/unit/knife/configure_client_spec.rb +83 -83
- data/spec/unit/knife/configure_spec.rb +241 -241
- data/spec/unit/knife/cookbook_bulk_delete_spec.rb +87 -87
- data/spec/unit/knife/cookbook_create_spec.rb +260 -260
- data/spec/unit/knife/cookbook_delete_spec.rb +239 -239
- data/spec/unit/knife/cookbook_download_spec.rb +237 -237
- data/spec/unit/knife/cookbook_list_spec.rb +88 -88
- data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +65 -65
- data/spec/unit/knife/cookbook_metadata_spec.rb +179 -179
- data/spec/unit/knife/cookbook_show_spec.rb +222 -222
- data/spec/unit/knife/cookbook_site_download_spec.rb +149 -149
- data/spec/unit/knife/cookbook_site_install_spec.rb +197 -197
- data/spec/unit/knife/cookbook_site_share_spec.rb +209 -209
- data/spec/unit/knife/cookbook_site_unshare_spec.rb +77 -77
- data/spec/unit/knife/cookbook_test_spec.rb +84 -84
- data/spec/unit/knife/cookbook_upload_spec.rb +331 -329
- data/spec/unit/knife/core/bootstrap_context_spec.rb +257 -257
- data/spec/unit/knife/core/cookbook_scm_repo_spec.rb +187 -187
- data/spec/unit/knife/core/custom_manifest_loader_spec.rb +41 -41
- data/spec/unit/knife/core/gem_glob_loader_spec.rb +209 -209
- data/spec/unit/knife/core/hashed_command_loader_spec.rb +109 -93
- data/spec/unit/knife/core/node_editor_spec.rb +211 -211
- data/spec/unit/knife/core/object_loader_spec.rb +81 -81
- data/spec/unit/knife/core/subcommand_loader_spec.rb +70 -64
- data/spec/unit/knife/core/ui_spec.rb +598 -591
- data/spec/unit/knife/data_bag_create_spec.rb +109 -109
- data/spec/unit/knife/data_bag_edit_spec.rb +127 -127
- data/spec/unit/knife/data_bag_from_file_spec.rb +172 -172
- data/spec/unit/knife/data_bag_secret_options_spec.rb +165 -165
- data/spec/unit/knife/data_bag_show_spec.rb +123 -123
- data/spec/unit/knife/environment_compare_spec.rb +112 -112
- data/spec/unit/knife/environment_create_spec.rb +91 -91
- data/spec/unit/knife/environment_delete_spec.rb +71 -71
- data/spec/unit/knife/environment_edit_spec.rb +79 -79
- data/spec/unit/knife/environment_from_file_spec.rb +90 -90
- data/spec/unit/knife/environment_list_spec.rb +54 -54
- data/spec/unit/knife/environment_show_spec.rb +52 -52
- data/spec/unit/knife/index_rebuild_spec.rb +125 -125
- data/spec/unit/knife/key_create_spec.rb +223 -223
- data/spec/unit/knife/key_delete_spec.rb +133 -133
- data/spec/unit/knife/key_edit_spec.rb +264 -264
- data/spec/unit/knife/key_helper.rb +74 -74
- data/spec/unit/knife/key_list_spec.rb +216 -216
- data/spec/unit/knife/key_show_spec.rb +126 -126
- data/spec/unit/knife/knife_help.rb +92 -92
- data/spec/unit/knife/node_bulk_delete_spec.rb +94 -94
- data/spec/unit/knife/node_delete_spec.rb +68 -68
- data/spec/unit/knife/node_edit_spec.rb +114 -114
- data/spec/unit/knife/node_environment_set_spec.rb +80 -80
- data/spec/unit/knife/node_from_file_spec.rb +59 -59
- data/spec/unit/knife/node_list_spec.rb +62 -62
- data/spec/unit/knife/node_run_list_add_spec.rb +145 -145
- data/spec/unit/knife/node_run_list_remove_spec.rb +106 -106
- data/spec/unit/knife/node_run_list_set_spec.rb +140 -140
- data/spec/unit/knife/node_show_spec.rb +65 -65
- data/spec/unit/knife/osc_user_create_spec.rb +93 -93
- data/spec/unit/knife/osc_user_delete_spec.rb +44 -44
- data/spec/unit/knife/osc_user_edit_spec.rb +52 -52
- data/spec/unit/knife/osc_user_list_spec.rb +37 -37
- data/spec/unit/knife/osc_user_reregister_spec.rb +58 -58
- data/spec/unit/knife/osc_user_show_spec.rb +46 -46
- data/spec/unit/knife/raw_spec.rb +43 -43
- data/spec/unit/knife/role_bulk_delete_spec.rb +80 -80
- data/spec/unit/knife/role_create_spec.rb +80 -80
- data/spec/unit/knife/role_delete_spec.rb +67 -67
- data/spec/unit/knife/role_edit_spec.rb +77 -77
- data/spec/unit/knife/role_env_run_list_add_spec.rb +217 -217
- data/spec/unit/knife/role_env_run_list_clear_spec.rb +94 -94
- data/spec/unit/knife/role_env_run_list_remove_spec.rb +102 -102
- data/spec/unit/knife/role_env_run_list_replace_spec.rb +105 -105
- data/spec/unit/knife/role_env_run_list_set_spec.rb +99 -99
- data/spec/unit/knife/role_from_file_spec.rb +69 -69
- data/spec/unit/knife/role_list_spec.rb +54 -54
- data/spec/unit/knife/role_run_list_add_spec.rb +179 -179
- data/spec/unit/knife/role_run_list_clear_spec.rb +84 -84
- data/spec/unit/knife/role_run_list_remove_spec.rb +92 -92
- data/spec/unit/knife/role_run_list_replace_spec.rb +98 -98
- data/spec/unit/knife/role_run_list_set_spec.rb +89 -89
- data/spec/unit/knife/role_show_spec.rb +59 -59
- data/spec/unit/knife/ssh_spec.rb +410 -410
- data/spec/unit/knife/ssl_check_spec.rb +240 -240
- data/spec/unit/knife/ssl_fetch_spec.rb +184 -184
- data/spec/unit/knife/status_spec.rb +108 -108
- data/spec/unit/knife/tag_create_spec.rb +23 -23
- data/spec/unit/knife/tag_delete_spec.rb +25 -25
- data/spec/unit/knife/tag_list_spec.rb +23 -23
- data/spec/unit/knife/user_create_spec.rb +214 -214
- data/spec/unit/knife/user_delete_spec.rb +65 -65
- data/spec/unit/knife/user_edit_spec.rb +66 -66
- data/spec/unit/knife/user_list_spec.rb +36 -36
- data/spec/unit/knife/user_reregister_spec.rb +74 -74
- data/spec/unit/knife/user_show_spec.rb +65 -65
- data/spec/unit/knife_spec.rb +529 -522
- data/spec/unit/lib_backcompat_spec.rb +34 -34
- data/spec/unit/log/syslog_spec.rb +53 -53
- data/spec/unit/log/winevt_spec.rb +55 -55
- data/spec/unit/log_spec.rb +24 -24
- data/spec/unit/lwrp_spec.rb +720 -720
- data/spec/unit/mash_spec.rb +51 -51
- data/spec/unit/mixin/api_version_request_handling_spec.rb +126 -126
- data/spec/unit/mixin/checksum_spec.rb +40 -40
- data/spec/unit/mixin/command_spec.rb +104 -104
- data/spec/unit/mixin/convert_to_class_name_spec.rb +54 -54
- data/spec/unit/mixin/deep_merge_spec.rb +342 -342
- data/spec/unit/mixin/deprecation_spec.rb +57 -57
- data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +96 -96
- data/spec/unit/mixin/homebrew_user_spec.rb +100 -100
- data/spec/unit/mixin/params_validate_spec.rb +409 -409
- data/spec/unit/mixin/path_sanity_spec.rb +92 -86
- data/spec/unit/mixin/powershell_out_spec.rb +70 -70
- data/spec/unit/mixin/powershell_type_coercions_spec.rb +83 -83
- data/spec/unit/mixin/properties_spec.rb +97 -97
- data/spec/unit/mixin/proxified_socket_spec.rb +94 -94
- data/spec/unit/mixin/securable_spec.rb +314 -314
- data/spec/unit/mixin/shell_out_spec.rb +299 -299
- data/spec/unit/mixin/subclass_directive_spec.rb +45 -45
- data/spec/unit/mixin/template_spec.rb +276 -276
- data/spec/unit/mixin/unformatter_spec.rb +61 -61
- data/spec/unit/mixin/uris_spec.rb +57 -57
- data/spec/unit/mixin/windows_architecture_helper_spec.rb +85 -85
- data/spec/unit/mixin/xml_escape_spec.rb +54 -54
- data/spec/unit/monkey_patches/uri_spec.rb +34 -34
- data/spec/unit/monologger_spec.rb +45 -45
- data/spec/unit/node/attribute_spec.rb +1179 -1179
- data/spec/unit/node/immutable_collections_spec.rb +197 -197
- data/spec/unit/node_map_spec.rb +170 -170
- data/spec/unit/node_spec.rb +1565 -1565
- data/spec/unit/org_spec.rb +196 -196
- data/spec/unit/platform/query_helpers_spec.rb +220 -220
- data/spec/unit/platform_spec.rb +241 -241
- data/spec/unit/policy_builder/dynamic_spec.rb +273 -273
- data/spec/unit/policy_builder/expand_node_object_spec.rb +336 -336
- data/spec/unit/policy_builder/policyfile_spec.rb +745 -739
- data/spec/unit/policy_builder_spec.rb +26 -26
- data/spec/unit/property/state_spec.rb +508 -508
- data/spec/unit/property/validation_spec.rb +704 -704
- data/spec/unit/property_spec.rb +1227 -1227
- data/spec/unit/provider/apt_update_spec.rb +113 -113
- data/spec/unit/provider/breakpoint_spec.rb +53 -53
- data/spec/unit/provider/cookbook_file/content_spec.rb +39 -39
- data/spec/unit/provider/cookbook_file_spec.rb +58 -58
- data/spec/unit/provider/cron/unix_spec.rb +139 -139
- data/spec/unit/provider/cron_spec.rb +1010 -1010
- data/spec/unit/provider/deploy/revision_spec.rb +110 -110
- data/spec/unit/provider/deploy/timestamped_spec.rb +40 -40
- data/spec/unit/provider/deploy_spec.rb +641 -641
- data/spec/unit/provider/directory_spec.rb +287 -287
- data/spec/unit/provider/dsc_resource_spec.rb +167 -118
- data/spec/unit/provider/dsc_script_spec.rb +173 -173
- data/spec/unit/provider/env/windows_spec.rb +103 -103
- data/spec/unit/provider/env_spec.rb +310 -310
- data/spec/unit/provider/erl_call_spec.rb +85 -85
- data/spec/unit/provider/execute_spec.rb +243 -243
- data/spec/unit/provider/file/content_spec.rb +114 -114
- data/spec/unit/provider/file_spec.rb +56 -56
- data/spec/unit/provider/git_spec.rb +668 -668
- data/spec/unit/provider/group/dscl_spec.rb +331 -331
- data/spec/unit/provider/group/gpasswd_spec.rb +116 -116
- data/spec/unit/provider/group/groupadd_spec.rb +174 -174
- data/spec/unit/provider/group/groupmod_spec.rb +133 -133
- data/spec/unit/provider/group/pw_spec.rb +138 -138
- data/spec/unit/provider/group/usermod_spec.rb +115 -115
- data/spec/unit/provider/group/windows_spec.rb +101 -101
- data/spec/unit/provider/group_spec.rb +286 -286
- data/spec/unit/provider/http_request_spec.rb +159 -159
- data/spec/unit/provider/ifconfig/aix_spec.rb +180 -180
- data/spec/unit/provider/ifconfig/debian_spec.rb +344 -344
- data/spec/unit/provider/ifconfig/redhat_spec.rb +73 -73
- data/spec/unit/provider/ifconfig_spec.rb +200 -200
- data/spec/unit/provider/launchd_spec.rb +189 -0
- data/spec/unit/provider/link_spec.rb +252 -252
- data/spec/unit/provider/log_spec.rb +75 -75
- data/spec/unit/provider/mdadm_spec.rb +131 -131
- data/spec/unit/provider/mount/aix_spec.rb +238 -238
- data/spec/unit/provider/mount/mount_spec.rb +480 -480
- data/spec/unit/provider/mount/solaris_spec.rb +822 -822
- data/spec/unit/provider/mount/windows_spec.rb +151 -151
- data/spec/unit/provider/mount_spec.rb +203 -203
- data/spec/unit/provider/ohai_spec.rb +84 -84
- data/spec/unit/provider/osx_profile_spec.rb +249 -249
- data/spec/unit/provider/package/aix_spec.rb +172 -172
- data/spec/unit/provider/package/apt_spec.rb +386 -386
- data/spec/unit/provider/package/chocolatey_spec.rb +501 -504
- data/spec/unit/provider/package/dpkg_spec.rb +287 -287
- data/spec/unit/provider/package/easy_install_spec.rb +108 -108
- data/spec/unit/provider/package/freebsd/pkg_spec.rb +274 -274
- data/spec/unit/provider/package/freebsd/pkgng_spec.rb +148 -148
- data/spec/unit/provider/package/freebsd/port_spec.rb +163 -163
- data/spec/unit/provider/package/homebrew_spec.rb +292 -292
- data/spec/unit/provider/package/ips_spec.rb +227 -227
- data/spec/unit/provider/package/macports_spec.rb +203 -203
- data/spec/unit/provider/package/openbsd_spec.rb +132 -132
- data/spec/unit/provider/package/pacman_spec.rb +194 -194
- data/spec/unit/provider/package/paludis_spec.rb +134 -134
- data/spec/unit/provider/package/portage_spec.rb +310 -310
- data/spec/unit/provider/package/rpm_spec.rb +429 -429
- data/spec/unit/provider/package/rubygems_spec.rb +782 -782
- data/spec/unit/provider/package/smartos_spec.rb +110 -110
- data/spec/unit/provider/package/solaris_spec.rb +167 -167
- data/spec/unit/provider/package/windows/exe_spec.rb +187 -187
- data/spec/unit/provider/package/windows/msi_spec.rb +159 -159
- data/spec/unit/provider/package/windows_spec.rb +397 -376
- data/spec/unit/provider/package/yum_spec.rb +2267 -2267
- data/spec/unit/provider/package/zypper_spec.rb +268 -268
- data/spec/unit/provider/package_spec.rb +870 -870
- data/spec/unit/provider/powershell_script_spec.rb +106 -106
- data/spec/unit/provider/registry_key_spec.rb +295 -295
- data/spec/unit/provider/remote_directory_spec.rb +221 -221
- data/spec/unit/provider/remote_file/cache_control_data_spec.rb +245 -245
- data/spec/unit/provider/remote_file/content_spec.rb +252 -252
- data/spec/unit/provider/remote_file/fetcher_spec.rb +94 -94
- data/spec/unit/provider/remote_file/ftp_spec.rb +219 -219
- data/spec/unit/provider/remote_file/http_spec.rb +301 -301
- data/spec/unit/provider/remote_file/local_file_spec.rb +103 -103
- data/spec/unit/provider/remote_file/network_file_spec.rb +45 -45
- data/spec/unit/provider/remote_file_spec.rb +61 -61
- data/spec/unit/provider/route_spec.rb +242 -242
- data/spec/unit/provider/ruby_block_spec.rb +45 -45
- data/spec/unit/provider/script_spec.rb +114 -114
- data/spec/unit/provider/service/aix_service_spec.rb +195 -195
- data/spec/unit/provider/service/aixinit_service_spec.rb +272 -272
- data/spec/unit/provider/service/arch_service_spec.rb +324 -324
- data/spec/unit/provider/service/debian_service_spec.rb +375 -375
- data/spec/unit/provider/service/freebsd_service_spec.rb +613 -613
- data/spec/unit/provider/service/gentoo_service_spec.rb +144 -144
- data/spec/unit/provider/service/init_service_spec.rb +235 -235
- data/spec/unit/provider/service/insserv_service_spec.rb +75 -75
- data/spec/unit/provider/service/invokercd_service_spec.rb +211 -211
- data/spec/unit/provider/service/macosx_spec.rb +335 -335
- data/spec/unit/provider/service/openbsd_service_spec.rb +545 -545
- data/spec/unit/provider/service/redhat_spec.rb +236 -236
- data/spec/unit/provider/service/simple_service_spec.rb +169 -169
- data/spec/unit/provider/service/solaris_smf_service_spec.rb +255 -255
- data/spec/unit/provider/service/systemd_service_spec.rb +344 -279
- data/spec/unit/provider/service/upstart_service_spec.rb +342 -342
- data/spec/unit/provider/service/windows_spec.rb +463 -463
- data/spec/unit/provider/service_spec.rb +168 -168
- data/spec/unit/provider/subversion_spec.rb +298 -298
- data/spec/unit/provider/template/content_spec.rb +169 -169
- data/spec/unit/provider/template_spec.rb +89 -89
- data/spec/unit/provider/user/dscl_spec.rb +901 -900
- data/spec/unit/provider/user/pw_spec.rb +252 -252
- data/spec/unit/provider/user/solaris_spec.rb +139 -137
- data/spec/unit/provider/user/useradd_spec.rb +51 -51
- data/spec/unit/provider/user/windows_spec.rb +185 -185
- data/spec/unit/provider/user_spec.rb +474 -474
- data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +46 -46
- data/spec/unit/provider_resolver_spec.rb +893 -893
- data/spec/unit/provider_spec.rb +198 -198
- data/spec/unit/pure_application_spec.rb +32 -32
- data/spec/unit/recipe_spec.rb +699 -699
- data/spec/unit/resource/apt_package_spec.rb +38 -38
- data/spec/unit/resource/apt_update_spec.rb +38 -38
- data/spec/unit/resource/bash_spec.rb +40 -40
- data/spec/unit/resource/batch_spec.rb +49 -49
- data/spec/unit/resource/breakpoint_spec.rb +47 -47
- data/spec/unit/resource/chef_gem_spec.rb +157 -157
- data/spec/unit/resource/chocolatey_package_spec.rb +67 -67
- data/spec/unit/resource/conditional_action_not_nothing_spec.rb +45 -45
- data/spec/unit/resource/conditional_spec.rb +208 -208
- data/spec/unit/resource/cookbook_file_spec.rb +88 -88
- data/spec/unit/resource/cron_spec.rb +186 -186
- data/spec/unit/resource/csh_spec.rb +40 -40
- data/spec/unit/resource/deploy_revision_spec.rb +42 -42
- data/spec/unit/resource/deploy_spec.rb +283 -283
- data/spec/unit/resource/directory_spec.rb +82 -82
- data/spec/unit/resource/dpkg_package_spec.rb +32 -32
- data/spec/unit/resource/dsc_resource_spec.rb +96 -96
- data/spec/unit/resource/dsc_script_spec.rb +134 -134
- data/spec/unit/resource/easy_install_package_spec.rb +39 -39
- data/spec/unit/resource/env_spec.rb +85 -85
- data/spec/unit/resource/erl_call_spec.rb +81 -81
- data/spec/unit/resource/execute_spec.rb +35 -35
- data/spec/unit/resource/file/verification_spec.rb +139 -139
- data/spec/unit/resource/file_spec.rb +130 -130
- data/spec/unit/resource/freebsd_package_spec.rb +87 -87
- data/spec/unit/resource/gem_package_spec.rb +42 -42
- data/spec/unit/resource/git_spec.rb +50 -50
- data/spec/unit/resource/group_spec.rb +162 -157
- data/spec/unit/resource/homebrew_package_spec.rb +50 -50
- data/spec/unit/resource/http_request_spec.rb +59 -59
- data/spec/unit/resource/ifconfig_spec.rb +109 -109
- data/spec/unit/resource/ips_package_spec.rb +40 -40
- data/spec/unit/resource/ksh_spec.rb +40 -40
- data/spec/unit/resource/launchd_spec.rb +31 -0
- data/spec/unit/resource/link_spec.rb +134 -134
- data/spec/unit/resource/log_spec.rb +73 -73
- data/spec/unit/resource/macports_package_spec.rb +32 -32
- data/spec/unit/resource/mdadm_spec.rb +102 -102
- data/spec/unit/resource/mount_spec.rb +214 -214
- data/spec/unit/resource/ohai_spec.rb +61 -61
- data/spec/unit/resource/openbsd_package_spec.rb +48 -48
- data/spec/unit/resource/osx_profile_spec.rb +61 -61
- data/spec/unit/resource/package_spec.rb +93 -93
- data/spec/unit/resource/pacman_package_spec.rb +32 -32
- data/spec/unit/resource/perl_spec.rb +40 -40
- data/spec/unit/resource/portage_package_spec.rb +38 -38
- data/spec/unit/resource/powershell_script_spec.rb +136 -136
- data/spec/unit/resource/python_spec.rb +40 -40
- data/spec/unit/resource/registry_key_spec.rb +199 -199
- data/spec/unit/resource/remote_directory_spec.rb +97 -97
- data/spec/unit/resource/remote_file_spec.rb +207 -207
- data/spec/unit/resource/resource_notification_spec.rb +169 -169
- data/spec/unit/resource/route_spec.rb +107 -107
- data/spec/unit/resource/rpm_package_spec.rb +46 -46
- data/spec/unit/resource/ruby_block_spec.rb +61 -61
- data/spec/unit/resource/ruby_spec.rb +40 -40
- data/spec/unit/resource/scm_spec.rb +193 -193
- data/spec/unit/resource/script_spec.rb +44 -44
- data/spec/unit/resource/service_spec.rb +179 -179
- data/spec/unit/resource/smartos_package_spec.rb +33 -33
- data/spec/unit/resource/solaris_package_spec.rb +42 -42
- data/spec/unit/resource/subversion_spec.rb +71 -71
- data/spec/unit/resource/template_spec.rb +210 -210
- data/spec/unit/resource/timestamped_deploy_spec.rb +32 -32
- data/spec/unit/resource/user_spec.rb +133 -133
- data/spec/unit/resource/windows_package_spec.rb +95 -95
- data/spec/unit/resource/windows_service_spec.rb +49 -49
- data/spec/unit/resource/yum_package_spec.rb +89 -89
- data/spec/unit/resource_builder_spec.rb +1 -1
- data/spec/unit/resource_collection/resource_list_spec.rb +137 -137
- data/spec/unit/resource_collection/resource_set_spec.rb +199 -199
- data/spec/unit/resource_collection/stepable_iterator_spec.rb +144 -144
- data/spec/unit/resource_collection_spec.rb +299 -299
- data/spec/unit/resource_definition_spec.rb +117 -117
- data/spec/unit/resource_reporter_spec.rb +758 -758
- data/spec/unit/resource_resolver_spec.rb +52 -52
- data/spec/unit/resource_spec.rb +1101 -1101
- data/spec/unit/rest/auth_credentials_spec.rb +296 -296
- data/spec/unit/rest_spec.rb +753 -753
- data/spec/unit/role_spec.rb +358 -358
- data/spec/unit/run_context/child_run_context_spec.rb +133 -133
- data/spec/unit/run_context/cookbook_compiler_spec.rb +184 -184
- data/spec/unit/run_context_spec.rb +241 -241
- data/spec/unit/run_list/run_list_expansion_spec.rb +144 -144
- data/spec/unit/run_list/run_list_item_spec.rb +117 -117
- data/spec/unit/run_list/versioned_recipe_list_spec.rb +194 -194
- data/spec/unit/run_list_spec.rb +312 -312
- data/spec/unit/run_lock_spec.rb +140 -140
- data/spec/unit/run_status_spec.rb +144 -144
- data/spec/unit/runner_spec.rb +411 -411
- data/spec/unit/scan_access_control_spec.rb +183 -183
- data/spec/unit/search/query_spec.rb +289 -289
- data/spec/unit/shell/model_wrapper_spec.rb +96 -96
- data/spec/unit/shell/shell_ext_spec.rb +153 -153
- data/spec/unit/shell/shell_session_spec.rb +195 -195
- data/spec/unit/shell_out_spec.rb +18 -18
- data/spec/unit/shell_spec.rb +162 -162
- data/spec/unit/user_spec.rb +275 -275
- data/spec/unit/user_v1_spec.rb +583 -583
- data/spec/unit/util/backup_spec.rb +141 -141
- data/spec/unit/util/diff_spec.rb +576 -576
- data/spec/unit/util/dsc/configuration_generator_spec.rb +193 -193
- data/spec/unit/util/dsc/lcm_output_parser_spec.rb +164 -164
- data/spec/unit/util/dsc/local_configuration_manager_spec.rb +138 -138
- data/spec/unit/util/dsc/resource_store.rb +76 -76
- data/spec/unit/util/editor_spec.rb +152 -152
- data/spec/unit/util/file_edit_spec.rb +224 -224
- data/spec/unit/util/powershell/cmdlet_spec.rb +106 -106
- data/spec/unit/util/powershell/ps_credential_spec.rb +44 -44
- data/spec/unit/util/selinux_spec.rb +171 -171
- data/spec/unit/util/threaded_job_queue_spec.rb +51 -51
- data/spec/unit/version/platform_spec.rb +60 -60
- data/spec/unit/version_class_spec.rb +171 -171
- data/spec/unit/version_constraint/platform_spec.rb +45 -45
- data/spec/unit/version_constraint_spec.rb +179 -179
- data/spec/unit/win32/registry_spec.rb +394 -394
- data/spec/unit/windows_service_spec.rb +116 -116
- data/tasks/cbgb.rb +84 -84
- data/tasks/external_tests.rb +64 -64
- data/tasks/maintainers.rb +210 -210
- data/tasks/rspec.rb +89 -89
- metadata +428 -12
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbooks_dir.rb +0 -84
@@ -1,1421 +1,1421 @@
|
|
1
|
-
|
2
|
-
# Author:: Adam Jacob (<adam@chef.io>)
|
3
|
-
# Copyright:: Copyright 2008-2016, 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
|
-
|
19
|
-
require "chef/config"
|
20
|
-
require "chef/provider/package"
|
21
|
-
require "chef/mixin/which"
|
22
|
-
require "chef/resource/package"
|
23
|
-
require "singleton"
|
24
|
-
require "chef/mixin/get_source_from_package"
|
25
|
-
|
26
|
-
class Chef
|
27
|
-
class Provider
|
28
|
-
class Package
|
29
|
-
class Yum < Chef::Provider::Package
|
30
|
-
|
31
|
-
provides :package, platform_family: %w{rhel fedora}
|
32
|
-
provides :yum_package, os: "linux"
|
33
|
-
|
34
|
-
class RPMUtils
|
35
|
-
class << self
|
36
|
-
|
37
|
-
# RPM::Version version_parse equivalent
|
38
|
-
def version_parse(evr)
|
39
|
-
return if evr.nil?
|
40
|
-
|
41
|
-
epoch = nil
|
42
|
-
# assume this is a version
|
43
|
-
version = evr
|
44
|
-
release = nil
|
45
|
-
|
46
|
-
lead = 0
|
47
|
-
tail = evr.size
|
48
|
-
|
49
|
-
if evr =~ %r{^([\d]+):}
|
50
|
-
epoch = $1.to_i
|
51
|
-
lead = $1.length + 1
|
52
|
-
elsif evr[0].ord == ":".ord
|
53
|
-
epoch = 0
|
54
|
-
lead = 1
|
55
|
-
end
|
56
|
-
|
57
|
-
if evr =~ %r{:?.*-(.*)$}
|
58
|
-
release = $1
|
59
|
-
tail = evr.length - release.length - lead - 1
|
60
|
-
|
61
|
-
if release.empty?
|
62
|
-
release = nil
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
version = evr[lead, tail]
|
67
|
-
if version.empty?
|
68
|
-
version = nil
|
69
|
-
end
|
70
|
-
|
71
|
-
[ epoch, version, release ]
|
72
|
-
end
|
73
|
-
|
74
|
-
# verify
|
75
|
-
def isalnum(x)
|
76
|
-
isalpha(x) or isdigit(x)
|
77
|
-
end
|
78
|
-
|
79
|
-
def isalpha(x)
|
80
|
-
v = x.ord
|
81
|
-
(v >= 65 and v <= 90) or (v >= 97 and v <= 122)
|
82
|
-
end
|
83
|
-
|
84
|
-
def isdigit(x)
|
85
|
-
v = x.ord
|
86
|
-
v >= 48 and v <= 57
|
87
|
-
end
|
88
|
-
|
89
|
-
# based on the reference spec in lib/rpmvercmp.c in rpm 4.9.0
|
90
|
-
def rpmvercmp(x, y)
|
91
|
-
# easy! :)
|
92
|
-
return 0 if x == y
|
93
|
-
|
94
|
-
if x.nil?
|
95
|
-
x = ""
|
96
|
-
end
|
97
|
-
|
98
|
-
if y.nil?
|
99
|
-
y = ""
|
100
|
-
end
|
101
|
-
|
102
|
-
# not so easy :(
|
103
|
-
#
|
104
|
-
# takes 2 strings like
|
105
|
-
#
|
106
|
-
# x = "1.20.b18.el5"
|
107
|
-
# y = "1.20.b17.el5"
|
108
|
-
#
|
109
|
-
# breaks into purely alpha and numeric segments and compares them using
|
110
|
-
# some rules
|
111
|
-
#
|
112
|
-
# * 10 > 1
|
113
|
-
# * 1 > a
|
114
|
-
# * z > a
|
115
|
-
# * Z > A
|
116
|
-
# * z > Z
|
117
|
-
# * leading zeros are ignored
|
118
|
-
# * separators (periods, commas) are ignored
|
119
|
-
# * "1.20.b18.el5.extrastuff" > "1.20.b18.el5"
|
120
|
-
|
121
|
-
x_pos = 0 # overall string element reference position
|
122
|
-
x_pos_max = x.length - 1 # number of elements in string, starting from 0
|
123
|
-
x_seg_pos = 0 # segment string element reference position
|
124
|
-
x_comp = nil # segment to compare
|
125
|
-
|
126
|
-
y_pos = 0
|
127
|
-
y_seg_pos = 0
|
128
|
-
y_pos_max = y.length - 1
|
129
|
-
y_comp = nil
|
130
|
-
|
131
|
-
while
|
132
|
-
# first we skip over anything non alphanumeric
|
133
|
-
while (x_pos <= x_pos_max) and (isalnum(x[x_pos]) == false)
|
134
|
-
x_pos += 1 # +1 over pos_max if end of string
|
135
|
-
end
|
136
|
-
while (y_pos <= y_pos_max) and (isalnum(y[y_pos]) == false)
|
137
|
-
y_pos += 1
|
138
|
-
end
|
139
|
-
|
140
|
-
# if we hit the end of either we are done matching segments
|
141
|
-
if (x_pos == x_pos_max + 1) or (y_pos == y_pos_max + 1)
|
142
|
-
break
|
143
|
-
end
|
144
|
-
|
145
|
-
# we are now at the start of a alpha or numeric segment
|
146
|
-
x_seg_pos = x_pos
|
147
|
-
y_seg_pos = y_pos
|
148
|
-
|
149
|
-
# grab segment so we can compare them
|
150
|
-
if isdigit(x[x_seg_pos].ord)
|
151
|
-
x_seg_is_num = true
|
152
|
-
|
153
|
-
# already know it's a digit
|
154
|
-
x_seg_pos += 1
|
155
|
-
|
156
|
-
# gather up our digits
|
157
|
-
while (x_seg_pos <= x_pos_max) and isdigit(x[x_seg_pos])
|
158
|
-
x_seg_pos += 1
|
159
|
-
end
|
160
|
-
# copy the segment but not the unmatched character that x_seg_pos will
|
161
|
-
# refer to
|
162
|
-
x_comp = x[x_pos, x_seg_pos - x_pos]
|
163
|
-
|
164
|
-
while (y_seg_pos <= y_pos_max) and isdigit(y[y_seg_pos])
|
165
|
-
y_seg_pos += 1
|
166
|
-
end
|
167
|
-
y_comp = y[y_pos, y_seg_pos - y_pos]
|
168
|
-
else
|
169
|
-
# we are comparing strings
|
170
|
-
x_seg_is_num = false
|
171
|
-
|
172
|
-
while (x_seg_pos <= x_pos_max) and isalpha(x[x_seg_pos])
|
173
|
-
x_seg_pos += 1
|
174
|
-
end
|
175
|
-
x_comp = x[x_pos, x_seg_pos - x_pos]
|
176
|
-
|
177
|
-
while (y_seg_pos <= y_pos_max) and isalpha(y[y_seg_pos])
|
178
|
-
y_seg_pos += 1
|
179
|
-
end
|
180
|
-
y_comp = y[y_pos, y_seg_pos - y_pos]
|
181
|
-
end
|
182
|
-
|
183
|
-
# if y_seg_pos didn't advance in the above loop it means the segments are
|
184
|
-
# different types
|
185
|
-
if y_pos == y_seg_pos
|
186
|
-
# numbers always win over letters
|
187
|
-
return x_seg_is_num ? 1 : -1
|
188
|
-
end
|
189
|
-
|
190
|
-
# move the ball forward before we mess with the segments
|
191
|
-
x_pos += x_comp.length # +1 over pos_max if end of string
|
192
|
-
y_pos += y_comp.length
|
193
|
-
|
194
|
-
# we are comparing numbers - simply convert them
|
195
|
-
if x_seg_is_num
|
196
|
-
x_comp = x_comp.to_i
|
197
|
-
y_comp = y_comp.to_i
|
198
|
-
end
|
199
|
-
|
200
|
-
# compares ints or strings
|
201
|
-
# don't return if equal - try the next segment
|
202
|
-
if x_comp > y_comp
|
203
|
-
return 1
|
204
|
-
elsif x_comp < y_comp
|
205
|
-
return -1
|
206
|
-
end
|
207
|
-
|
208
|
-
# if we've reached here than the segments are the same - try again
|
209
|
-
end
|
210
|
-
|
211
|
-
# we must have reached the end of one or both of the strings and they
|
212
|
-
# matched up until this point
|
213
|
-
|
214
|
-
# segments matched completely but the segment separators were different -
|
215
|
-
# rpm reference code treats these as equal.
|
216
|
-
if (x_pos == x_pos_max + 1) and (y_pos == y_pos_max + 1)
|
217
|
-
return 0
|
218
|
-
end
|
219
|
-
|
220
|
-
# the most unprocessed characters left wins
|
221
|
-
if (x_pos_max - x_pos) > (y_pos_max - y_pos)
|
222
|
-
return 1
|
223
|
-
else
|
224
|
-
return -1
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
end # self
|
229
|
-
end # RPMUtils
|
230
|
-
|
231
|
-
class RPMVersion
|
232
|
-
include Comparable
|
233
|
-
|
234
|
-
def initialize(*args)
|
235
|
-
if args.size == 1
|
236
|
-
@e, @v, @r = RPMUtils.version_parse(args[0])
|
237
|
-
elsif args.size == 3
|
238
|
-
@e = args[0].to_i
|
239
|
-
@v = args[1]
|
240
|
-
@r = args[2]
|
241
|
-
else
|
242
|
-
raise ArgumentError, "Expecting either 'epoch-version-release' or 'epoch, " +
|
243
|
-
"version, release'"
|
244
|
-
end
|
245
|
-
end
|
246
|
-
attr_reader :e, :v, :r
|
247
|
-
alias :epoch :e
|
248
|
-
alias :version :v
|
249
|
-
alias :release :r
|
250
|
-
|
251
|
-
def self.parse(*args)
|
252
|
-
self.new(*args)
|
253
|
-
end
|
254
|
-
|
255
|
-
def <=>(y)
|
256
|
-
compare_versions(y)
|
257
|
-
end
|
258
|
-
|
259
|
-
def compare(y)
|
260
|
-
compare_versions(y, false)
|
261
|
-
end
|
262
|
-
|
263
|
-
def partial_compare(y)
|
264
|
-
compare_versions(y, true)
|
265
|
-
end
|
266
|
-
|
267
|
-
# RPM::Version rpm_version_to_s equivalent
|
268
|
-
def to_s
|
269
|
-
if @r.nil?
|
270
|
-
@v
|
271
|
-
else
|
272
|
-
"#{@v}-#{@r}"
|
273
|
-
end
|
274
|
-
end
|
275
|
-
|
276
|
-
def evr
|
277
|
-
"#{@e}:#{@v}-#{@r}"
|
278
|
-
end
|
279
|
-
|
280
|
-
private
|
281
|
-
|
282
|
-
# Rough RPM::Version rpm_version_cmp equivalent - except much slower :)
|
283
|
-
#
|
284
|
-
# partial lets epoch and version segment equality be good enough to return equal, eg:
|
285
|
-
#
|
286
|
-
# 2:1.2-1 == 2:1.2
|
287
|
-
# 2:1.2-1 == 2:
|
288
|
-
#
|
289
|
-
def compare_versions(y, partial = false)
|
290
|
-
x = self
|
291
|
-
|
292
|
-
# compare epoch
|
293
|
-
if (x.e.nil? == false and x.e > 0) and y.e.nil?
|
294
|
-
return 1
|
295
|
-
elsif x.e.nil? and (y.e.nil? == false and y.e > 0)
|
296
|
-
return -1
|
297
|
-
elsif x.e.nil? == false and y.e.nil? == false
|
298
|
-
if x.e < y.e
|
299
|
-
return -1
|
300
|
-
elsif x.e > y.e
|
301
|
-
return 1
|
302
|
-
end
|
303
|
-
end
|
304
|
-
|
305
|
-
# compare version
|
306
|
-
if partial and (x.v.nil? or y.v.nil?)
|
307
|
-
return 0
|
308
|
-
elsif x.v.nil? == false and y.v.nil?
|
309
|
-
return 1
|
310
|
-
elsif x.v.nil? and y.v.nil? == false
|
311
|
-
return -1
|
312
|
-
elsif x.v.nil? == false and y.v.nil? == false
|
313
|
-
cmp = RPMUtils.rpmvercmp(x.v, y.v)
|
314
|
-
return cmp if cmp != 0
|
315
|
-
end
|
316
|
-
|
317
|
-
# compare release
|
318
|
-
if partial and (x.r.nil? or y.r.nil?)
|
319
|
-
return 0
|
320
|
-
elsif x.r.nil? == false and y.r.nil?
|
321
|
-
return 1
|
322
|
-
elsif x.r.nil? and y.r.nil? == false
|
323
|
-
return -1
|
324
|
-
elsif x.r.nil? == false and y.r.nil? == false
|
325
|
-
cmp = RPMUtils.rpmvercmp(x.r, y.r)
|
326
|
-
return cmp
|
327
|
-
end
|
328
|
-
|
329
|
-
return 0
|
330
|
-
end
|
331
|
-
end
|
332
|
-
|
333
|
-
class RPMPackage
|
334
|
-
include Comparable
|
335
|
-
|
336
|
-
def initialize(*args)
|
337
|
-
if args.size == 4
|
338
|
-
@n = args[0]
|
339
|
-
@version = RPMVersion.new(args[1])
|
340
|
-
@a = args[2]
|
341
|
-
@provides = args[3]
|
342
|
-
elsif args.size == 6
|
343
|
-
@n = args[0]
|
344
|
-
e = args[1].to_i
|
345
|
-
v = args[2]
|
346
|
-
r = args[3]
|
347
|
-
@version = RPMVersion.new(e, v, r)
|
348
|
-
@a = args[4]
|
349
|
-
@provides = args[5]
|
350
|
-
else
|
351
|
-
raise ArgumentError, "Expecting either 'name, epoch-version-release, arch, provides' " +
|
352
|
-
"or 'name, epoch, version, release, arch, provides'"
|
353
|
-
end
|
354
|
-
|
355
|
-
# We always have one, ourselves!
|
356
|
-
if @provides.empty?
|
357
|
-
@provides = [ RPMProvide.new(@n, @version.evr, :==) ]
|
358
|
-
end
|
359
|
-
end
|
360
|
-
attr_reader :n, :a, :version, :provides
|
361
|
-
alias :name :n
|
362
|
-
alias :arch :a
|
363
|
-
|
364
|
-
def <=>(y)
|
365
|
-
compare(y)
|
366
|
-
end
|
367
|
-
|
368
|
-
def compare(y)
|
369
|
-
x = self
|
370
|
-
|
371
|
-
# easy! :)
|
372
|
-
return 0 if x.nevra == y.nevra
|
373
|
-
|
374
|
-
# compare name
|
375
|
-
if x.n.nil? == false and y.n.nil?
|
376
|
-
return 1
|
377
|
-
elsif x.n.nil? and y.n.nil? == false
|
378
|
-
return -1
|
379
|
-
elsif x.n.nil? == false and y.n.nil? == false
|
380
|
-
if x.n < y.n
|
381
|
-
return -1
|
382
|
-
elsif x.n > y.n
|
383
|
-
return 1
|
384
|
-
end
|
385
|
-
end
|
386
|
-
|
387
|
-
# compare version
|
388
|
-
if x.version > y.version
|
389
|
-
return 1
|
390
|
-
elsif x.version < y.version
|
391
|
-
return -1
|
392
|
-
end
|
393
|
-
|
394
|
-
# compare arch
|
395
|
-
if x.a.nil? == false and y.a.nil?
|
396
|
-
return 1
|
397
|
-
elsif x.a.nil? and y.a.nil? == false
|
398
|
-
return -1
|
399
|
-
elsif x.a.nil? == false and y.a.nil? == false
|
400
|
-
if x.a < y.a
|
401
|
-
return -1
|
402
|
-
elsif x.a > y.a
|
403
|
-
return 1
|
404
|
-
end
|
405
|
-
end
|
406
|
-
|
407
|
-
return 0
|
408
|
-
end
|
409
|
-
|
410
|
-
def to_s
|
411
|
-
nevra
|
412
|
-
end
|
413
|
-
|
414
|
-
def nevra
|
415
|
-
"#{@n}-#{@version.evr}.#{@a}"
|
416
|
-
end
|
417
|
-
end
|
418
|
-
|
419
|
-
# Simple implementation from rpm and ruby-rpm reference code
|
420
|
-
class RPMDependency
|
421
|
-
def initialize(*args)
|
422
|
-
if args.size == 3
|
423
|
-
@name = args[0]
|
424
|
-
@version = RPMVersion.new(args[1])
|
425
|
-
# Our requirement to other dependencies
|
426
|
-
@flag = args[2] || :==
|
427
|
-
elsif args.size == 5
|
428
|
-
@name = args[0]
|
429
|
-
e = args[1].to_i
|
430
|
-
v = args[2]
|
431
|
-
r = args[3]
|
432
|
-
@version = RPMVersion.new(e, v, r)
|
433
|
-
@flag = args[4] || :==
|
434
|
-
else
|
435
|
-
raise ArgumentError, "Expecting either 'name, epoch-version-release, flag' or " +
|
436
|
-
"'name, epoch, version, release, flag'"
|
437
|
-
end
|
438
|
-
end
|
439
|
-
attr_reader :name, :version, :flag
|
440
|
-
|
441
|
-
# Parses 2 forms:
|
442
|
-
#
|
443
|
-
# "mtr >= 2:0.71-3.0"
|
444
|
-
# "mta"
|
445
|
-
def self.parse(string)
|
446
|
-
if string =~ %r{^(\S+)\s+(>|>=|=|==|<=|<)\s+(\S+)$}
|
447
|
-
name = $1
|
448
|
-
if $2 == "="
|
449
|
-
flag = :==
|
450
|
-
else
|
451
|
-
flag = :"#{$2}"
|
452
|
-
end
|
453
|
-
version = $3
|
454
|
-
|
455
|
-
return self.new(name, version, flag)
|
456
|
-
else
|
457
|
-
name = string
|
458
|
-
return self.new(name, nil, nil)
|
459
|
-
end
|
460
|
-
end
|
461
|
-
|
462
|
-
# Test if another RPMDependency satisfies our requirements
|
463
|
-
def satisfy?(y)
|
464
|
-
unless y.kind_of?(RPMDependency)
|
465
|
-
raise ArgumentError, "Expecting an RPMDependency object"
|
466
|
-
end
|
467
|
-
|
468
|
-
x = self
|
469
|
-
|
470
|
-
# Easy!
|
471
|
-
if x.name != y.name
|
472
|
-
return false
|
473
|
-
end
|
474
|
-
|
475
|
-
# Partial compare
|
476
|
-
#
|
477
|
-
# eg: x.version 2.3 == y.version 2.3-1
|
478
|
-
sense = x.version.partial_compare(y.version)
|
479
|
-
|
480
|
-
# Thanks to rpmdsCompare() rpmds.c
|
481
|
-
if sense < 0 and (x.flag == :> || x.flag == :>=) || (y.flag == :<= || y.flag == :<)
|
482
|
-
return true
|
483
|
-
elsif sense > 0 and (x.flag == :< || x.flag == :<=) || (y.flag == :>= || y.flag == :>)
|
484
|
-
return true
|
485
|
-
elsif sense == 0 and (
|
486
|
-
((x.flag == :== or x.flag == :<= or x.flag == :>=) and (y.flag == :== or y.flag == :<= or y.flag == :>=)) or
|
487
|
-
(x.flag == :< and y.flag == :<) or
|
488
|
-
(x.flag == :> and y.flag == :>)
|
489
|
-
)
|
490
|
-
return true
|
491
|
-
end
|
492
|
-
|
493
|
-
return false
|
494
|
-
end
|
495
|
-
end
|
496
|
-
|
497
|
-
class RPMProvide < RPMDependency; end
|
498
|
-
class RPMRequire < RPMDependency; end
|
499
|
-
|
500
|
-
class RPMDbPackage < RPMPackage
|
501
|
-
# <rpm parts>, installed, available
|
502
|
-
def initialize(*args)
|
503
|
-
@repoid = args.pop
|
504
|
-
# state
|
505
|
-
@available = args.pop
|
506
|
-
@installed = args.pop
|
507
|
-
super(*args)
|
508
|
-
end
|
509
|
-
attr_reader :repoid, :available, :installed
|
510
|
-
end
|
511
|
-
|
512
|
-
# Simple storage for RPMPackage objects - keeps them unique and sorted
|
513
|
-
class RPMDb
|
514
|
-
def initialize
|
515
|
-
# package name => [ RPMPackage, RPMPackage ] of different versions
|
516
|
-
@rpms = Hash.new
|
517
|
-
# package nevra => RPMPackage for lookups
|
518
|
-
@index = Hash.new
|
519
|
-
# provide name (aka feature) => [RPMPackage, RPMPackage] each providing this feature
|
520
|
-
@provides = Hash.new
|
521
|
-
# RPMPackages listed as available
|
522
|
-
@available = Set.new
|
523
|
-
# RPMPackages listed as installed
|
524
|
-
@installed = Set.new
|
525
|
-
end
|
526
|
-
|
527
|
-
def [](package_name)
|
528
|
-
self.lookup(package_name)
|
529
|
-
end
|
530
|
-
|
531
|
-
# Lookup package_name and return a descending array of package objects
|
532
|
-
def lookup(package_name)
|
533
|
-
pkgs = @rpms[package_name]
|
534
|
-
if pkgs
|
535
|
-
return pkgs.sort.reverse
|
536
|
-
else
|
537
|
-
return nil
|
538
|
-
end
|
539
|
-
end
|
540
|
-
|
541
|
-
def lookup_provides(provide_name)
|
542
|
-
@provides[provide_name]
|
543
|
-
end
|
544
|
-
|
545
|
-
# Using the package name as a key, and nevra for an index, keep a unique list of packages.
|
546
|
-
# The available/installed state can be overwritten for existing packages.
|
547
|
-
def push(*args)
|
548
|
-
args.flatten.each do |new_rpm|
|
549
|
-
unless new_rpm.kind_of?(RPMDbPackage)
|
550
|
-
raise ArgumentError, "Expecting an RPMDbPackage object"
|
551
|
-
end
|
552
|
-
|
553
|
-
@rpms[new_rpm.n] ||= Array.new
|
554
|
-
|
555
|
-
# we may already have this one, like when the installed list is refreshed
|
556
|
-
idx = @index[new_rpm.nevra]
|
557
|
-
if idx
|
558
|
-
# grab the existing package if it's not
|
559
|
-
curr_rpm = idx
|
560
|
-
else
|
561
|
-
@rpms[new_rpm.n] << new_rpm
|
562
|
-
|
563
|
-
new_rpm.provides.each do |provide|
|
564
|
-
@provides[provide.name] ||= Array.new
|
565
|
-
@provides[provide.name] << new_rpm
|
566
|
-
end
|
567
|
-
|
568
|
-
curr_rpm = new_rpm
|
569
|
-
end
|
570
|
-
|
571
|
-
# Track the nevra -> RPMPackage association to avoid having to compare versions
|
572
|
-
# with @rpms[new_rpm.n] on the next round
|
573
|
-
@index[new_rpm.nevra] = curr_rpm
|
574
|
-
|
575
|
-
# these are overwritten for existing packages
|
576
|
-
if new_rpm.available
|
577
|
-
@available << curr_rpm
|
578
|
-
end
|
579
|
-
if new_rpm.installed
|
580
|
-
@installed << curr_rpm
|
581
|
-
end
|
582
|
-
end
|
583
|
-
end
|
584
|
-
|
585
|
-
def <<(*args)
|
586
|
-
self.push(args)
|
587
|
-
end
|
588
|
-
|
589
|
-
def clear
|
590
|
-
@rpms.clear
|
591
|
-
@index.clear
|
592
|
-
@provides.clear
|
593
|
-
clear_available
|
594
|
-
clear_installed
|
595
|
-
end
|
596
|
-
|
597
|
-
def clear_available
|
598
|
-
@available.clear
|
599
|
-
end
|
600
|
-
|
601
|
-
def clear_installed
|
602
|
-
@installed.clear
|
603
|
-
end
|
604
|
-
|
605
|
-
def size
|
606
|
-
@rpms.size
|
607
|
-
end
|
608
|
-
alias :length :size
|
609
|
-
|
610
|
-
def available_size
|
611
|
-
@available.size
|
612
|
-
end
|
613
|
-
|
614
|
-
def installed_size
|
615
|
-
@installed.size
|
616
|
-
end
|
617
|
-
|
618
|
-
def available?(package)
|
619
|
-
@available.include?(package)
|
620
|
-
end
|
621
|
-
|
622
|
-
def installed?(package)
|
623
|
-
@installed.include?(package)
|
624
|
-
end
|
625
|
-
|
626
|
-
def whatprovides(rpmdep)
|
627
|
-
unless rpmdep.kind_of?(RPMDependency)
|
628
|
-
raise ArgumentError, "Expecting an RPMDependency object"
|
629
|
-
end
|
630
|
-
|
631
|
-
what = []
|
632
|
-
|
633
|
-
packages = lookup_provides(rpmdep.name)
|
634
|
-
if packages
|
635
|
-
packages.each do |pkg|
|
636
|
-
pkg.provides.each do |provide|
|
637
|
-
if provide.satisfy?(rpmdep)
|
638
|
-
what << pkg
|
639
|
-
end
|
640
|
-
end
|
641
|
-
end
|
642
|
-
end
|
643
|
-
|
644
|
-
return what
|
645
|
-
end
|
646
|
-
end
|
647
|
-
|
648
|
-
# Cache for our installed and available packages, pulled in from yum-dump.py
|
649
|
-
class YumCache
|
650
|
-
include Chef::Mixin::Which
|
651
|
-
include Chef::Mixin::ShellOut
|
652
|
-
include Singleton
|
653
|
-
|
654
|
-
attr_accessor :yum_binary
|
655
|
-
|
656
|
-
def initialize
|
657
|
-
@rpmdb = RPMDb.new
|
658
|
-
|
659
|
-
# Next time @rpmdb is accessed:
|
660
|
-
# :all - Trigger a run of "yum-dump.py --options --installed-provides", updates
|
661
|
-
# yum's cache and parses options from /etc/yum.conf. Pulls in Provides
|
662
|
-
# dependency data for installed packages only - this data is slow to
|
663
|
-
# gather.
|
664
|
-
# :provides - Same as :all but pulls in Provides data for available packages as well.
|
665
|
-
# Used as a last resort when we can't find a Provides match.
|
666
|
-
# :installed - Trigger a run of "yum-dump.py --installed", only reads the local rpm
|
667
|
-
# db. Used between client runs for a quick refresh.
|
668
|
-
# :none - Do nothing, a call to one of the reload methods is required.
|
669
|
-
@next_refresh = :all
|
670
|
-
|
671
|
-
@allow_multi_install = []
|
672
|
-
|
673
|
-
@extra_repo_control = nil
|
674
|
-
|
675
|
-
# these are for subsequent runs if we are on an interval
|
676
|
-
Chef::Client.when_run_starts do
|
677
|
-
YumCache.instance.reload
|
678
|
-
end
|
679
|
-
end
|
680
|
-
|
681
|
-
attr_reader :extra_repo_control
|
682
|
-
|
683
|
-
# Cache management
|
684
|
-
#
|
685
|
-
|
686
|
-
def refresh
|
687
|
-
case @next_refresh
|
688
|
-
when :none
|
689
|
-
return nil
|
690
|
-
when :installed
|
691
|
-
reset_installed
|
692
|
-
# fast
|
693
|
-
opts = " --installed"
|
694
|
-
when :all
|
695
|
-
reset
|
696
|
-
# medium
|
697
|
-
opts = " --options --installed-provides"
|
698
|
-
when :provides
|
699
|
-
reset
|
700
|
-
# slow!
|
701
|
-
opts = " --options --all-provides"
|
702
|
-
else
|
703
|
-
raise ArgumentError, "Unexpected value in next_refresh: #{@next_refresh}"
|
704
|
-
end
|
705
|
-
|
706
|
-
if @extra_repo_control
|
707
|
-
opts << " #{@extra_repo_control}"
|
708
|
-
end
|
709
|
-
|
710
|
-
opts << " --yum-lock-timeout #{Chef::Config[:yum_lock_timeout]}"
|
711
|
-
|
712
|
-
one_line = false
|
713
|
-
error = nil
|
714
|
-
|
715
|
-
helper = ::File.join(::File.dirname(__FILE__), "yum-dump.py")
|
716
|
-
status = nil
|
717
|
-
|
718
|
-
begin
|
719
|
-
status = shell_out!("#{python_bin} #{helper}#{opts}", :timeout => Chef::Config[:yum_timeout])
|
720
|
-
status.stdout.each_line do |line|
|
721
|
-
one_line = true
|
722
|
-
|
723
|
-
line.chomp!
|
724
|
-
if line =~ %r{\[option (.*)\] (.*)}
|
725
|
-
if $1 == "installonlypkgs"
|
726
|
-
@allow_multi_install = $2.split
|
727
|
-
else
|
728
|
-
raise Chef::Exceptions::Package, "Strange, unknown option line '#{line}' from yum-dump.py"
|
729
|
-
end
|
730
|
-
next
|
731
|
-
end
|
732
|
-
|
733
|
-
if line =~ %r{^(\S+) ([0-9]+) (\S+) (\S+) (\S+) \[(.*)\] ([i,a,r]) (\S+)$}
|
734
|
-
name = $1
|
735
|
-
epoch = $2
|
736
|
-
version = $3
|
737
|
-
release = $4
|
738
|
-
arch = $5
|
739
|
-
provides = parse_provides($6)
|
740
|
-
type = $7
|
741
|
-
repoid = $8
|
742
|
-
else
|
743
|
-
Chef::Log.warn("Problem parsing line '#{line}' from yum-dump.py! " +
|
744
|
-
"Please check your yum configuration.")
|
745
|
-
next
|
746
|
-
end
|
747
|
-
|
748
|
-
case type
|
749
|
-
when "i"
|
750
|
-
# if yum-dump was called with --installed this may not be true, but it's okay
|
751
|
-
# since we don't touch the @available Set in reload_installed
|
752
|
-
available = false
|
753
|
-
installed = true
|
754
|
-
when "a"
|
755
|
-
available = true
|
756
|
-
installed = false
|
757
|
-
when "r"
|
758
|
-
available = true
|
759
|
-
installed = true
|
760
|
-
end
|
761
|
-
|
762
|
-
pkg = RPMDbPackage.new(name, epoch, version, release, arch, provides, installed, available, repoid)
|
763
|
-
@rpmdb << pkg
|
764
|
-
end
|
765
|
-
|
766
|
-
error = status.stderr
|
767
|
-
rescue Mixlib::ShellOut::CommandTimeout => e
|
768
|
-
Chef::Log.error("#{helper} exceeded timeout #{Chef::Config[:yum_timeout]}")
|
769
|
-
raise(e)
|
770
|
-
end
|
771
|
-
|
772
|
-
if status.exitstatus != 0
|
773
|
-
raise Chef::Exceptions::Package, "Yum failed - #{status.inspect} - returns: #{error}"
|
774
|
-
else
|
775
|
-
unless one_line
|
776
|
-
Chef::Log.warn("Odd, no output from yum-dump.py. Please check " +
|
777
|
-
"your yum configuration.")
|
778
|
-
end
|
779
|
-
end
|
780
|
-
|
781
|
-
# A reload method must be called before the cache is altered
|
782
|
-
@next_refresh = :none
|
783
|
-
end
|
784
|
-
|
785
|
-
def python_bin
|
786
|
-
yum_executable = which(yum_binary)
|
787
|
-
if yum_executable && shabang?(yum_executable)
|
788
|
-
shabang_or_fallback(extract_interpreter(yum_executable))
|
789
|
-
else
|
790
|
-
Chef::Log.warn("Yum executable not found or doesn't start with #!. Using default python.")
|
791
|
-
"/usr/bin/python"
|
792
|
-
end
|
793
|
-
rescue StandardError => e
|
794
|
-
Chef::Log.warn("An error occurred attempting to determine correct python executable. Using default.")
|
795
|
-
Chef::Log.debug(e)
|
796
|
-
"/usr/bin/python"
|
797
|
-
end
|
798
|
-
|
799
|
-
def extract_interpreter(file)
|
800
|
-
::File.open(file, "r", &:readline)[2..-1].strip
|
801
|
-
end
|
802
|
-
|
803
|
-
# dnf based systems have a yum shim that has /bin/bash as the interpreter. Don't use this.
|
804
|
-
def shabang_or_fallback(interpreter)
|
805
|
-
if interpreter == "/bin/bash"
|
806
|
-
Chef::Log.warn("Yum executable interpreter is /bin/bash. Falling back to default python.")
|
807
|
-
"/usr/bin/python"
|
808
|
-
else
|
809
|
-
interpreter
|
810
|
-
end
|
811
|
-
end
|
812
|
-
|
813
|
-
def shabang?(file)
|
814
|
-
::File.open(file, "r") do |f|
|
815
|
-
f.read(2) == '#!'
|
816
|
-
end
|
817
|
-
rescue Errno::ENOENT
|
818
|
-
false
|
819
|
-
end
|
820
|
-
|
821
|
-
def reload
|
822
|
-
@next_refresh = :all
|
823
|
-
end
|
824
|
-
|
825
|
-
def reload_installed
|
826
|
-
@next_refresh = :installed
|
827
|
-
end
|
828
|
-
|
829
|
-
def reload_provides
|
830
|
-
@next_refresh = :provides
|
831
|
-
end
|
832
|
-
|
833
|
-
def reset
|
834
|
-
@rpmdb.clear
|
835
|
-
end
|
836
|
-
|
837
|
-
def reset_installed
|
838
|
-
@rpmdb.clear_installed
|
839
|
-
end
|
840
|
-
|
841
|
-
# Querying the cache
|
842
|
-
#
|
843
|
-
|
844
|
-
# Check for package by name or name+arch
|
845
|
-
def package_available?(package_name)
|
846
|
-
refresh
|
847
|
-
|
848
|
-
if @rpmdb.lookup(package_name)
|
849
|
-
return true
|
850
|
-
else
|
851
|
-
if package_name =~ %r{^(.*)\.(.*)$}
|
852
|
-
pkg_name = $1
|
853
|
-
pkg_arch = $2
|
854
|
-
|
855
|
-
if matches = @rpmdb.lookup(pkg_name)
|
856
|
-
matches.each do |m|
|
857
|
-
return true if m.arch == pkg_arch
|
858
|
-
end
|
859
|
-
end
|
860
|
-
end
|
861
|
-
end
|
862
|
-
|
863
|
-
return false
|
864
|
-
end
|
865
|
-
|
866
|
-
# Returns a array of packages satisfying an RPMDependency
|
867
|
-
def packages_from_require(rpmdep)
|
868
|
-
refresh
|
869
|
-
@rpmdb.whatprovides(rpmdep)
|
870
|
-
end
|
871
|
-
|
872
|
-
# Check if a package-version.arch is available to install
|
873
|
-
def version_available?(package_name, desired_version, arch = nil)
|
874
|
-
version(package_name, arch, true, false) do |v|
|
875
|
-
return true if desired_version == v
|
876
|
-
end
|
877
|
-
|
878
|
-
return false
|
879
|
-
end
|
880
|
-
|
881
|
-
# Return the source repository for a package-version.arch
|
882
|
-
def package_repository(package_name, desired_version, arch = nil)
|
883
|
-
package(package_name, arch, true, false) do |pkg|
|
884
|
-
return pkg.repoid if desired_version == pkg.version.to_s
|
885
|
-
end
|
886
|
-
|
887
|
-
return nil
|
888
|
-
end
|
889
|
-
|
890
|
-
# Return the latest available version for a package.arch
|
891
|
-
def available_version(package_name, arch = nil)
|
892
|
-
version(package_name, arch, true, false)
|
893
|
-
end
|
894
|
-
alias :candidate_version :available_version
|
895
|
-
|
896
|
-
# Return the currently installed version for a package.arch
|
897
|
-
def installed_version(package_name, arch = nil)
|
898
|
-
version(package_name, arch, false, true)
|
899
|
-
end
|
900
|
-
|
901
|
-
# Return an array of packages allowed to be installed multiple times, such as the kernel
|
902
|
-
def allow_multi_install
|
903
|
-
refresh
|
904
|
-
@allow_multi_install
|
905
|
-
end
|
906
|
-
|
907
|
-
def enable_extra_repo_control(arg)
|
908
|
-
# Don't touch cache if it's the same repos as the last load
|
909
|
-
unless @extra_repo_control == arg
|
910
|
-
@extra_repo_control = arg
|
911
|
-
reload
|
912
|
-
end
|
913
|
-
end
|
914
|
-
|
915
|
-
def disable_extra_repo_control
|
916
|
-
# Only force reload when set
|
917
|
-
if @extra_repo_control
|
918
|
-
@extra_repo_control = nil
|
919
|
-
reload
|
920
|
-
end
|
921
|
-
end
|
922
|
-
|
923
|
-
private
|
924
|
-
|
925
|
-
def version(package_name, arch = nil, is_available = false, is_installed = false)
|
926
|
-
package(package_name, arch, is_available, is_installed) do |pkg|
|
927
|
-
if block_given?
|
928
|
-
yield pkg.version.to_s
|
929
|
-
else
|
930
|
-
# first match is latest version
|
931
|
-
return pkg.version.to_s
|
932
|
-
end
|
933
|
-
end
|
934
|
-
|
935
|
-
if block_given?
|
936
|
-
return self
|
937
|
-
else
|
938
|
-
return nil
|
939
|
-
end
|
940
|
-
end
|
941
|
-
|
942
|
-
def package(package_name, arch = nil, is_available = false, is_installed = false)
|
943
|
-
refresh
|
944
|
-
packages = @rpmdb[package_name]
|
945
|
-
if packages
|
946
|
-
packages.each do |pkg|
|
947
|
-
if is_available
|
948
|
-
next unless @rpmdb.available?(pkg)
|
949
|
-
end
|
950
|
-
if is_installed
|
951
|
-
next unless @rpmdb.installed?(pkg)
|
952
|
-
end
|
953
|
-
if arch
|
954
|
-
next unless pkg.arch == arch
|
955
|
-
end
|
956
|
-
|
957
|
-
if block_given?
|
958
|
-
yield pkg
|
959
|
-
else
|
960
|
-
# first match is latest version
|
961
|
-
return pkg
|
962
|
-
end
|
963
|
-
end
|
964
|
-
end
|
965
|
-
|
966
|
-
if block_given?
|
967
|
-
return self
|
968
|
-
else
|
969
|
-
return nil
|
970
|
-
end
|
971
|
-
end
|
972
|
-
|
973
|
-
# Parse provides from yum-dump.py output
|
974
|
-
def parse_provides(string)
|
975
|
-
ret = []
|
976
|
-
# ['atk = 1.12.2-1.fc6', 'libatk-1.0.so.0']
|
977
|
-
string.split(", ").each do |seg|
|
978
|
-
# 'atk = 1.12.2-1.fc6'
|
979
|
-
if seg =~ %r{^'(.*)'$}
|
980
|
-
ret << RPMProvide.parse($1)
|
981
|
-
end
|
982
|
-
end
|
983
|
-
|
984
|
-
return ret
|
985
|
-
end
|
986
|
-
|
987
|
-
end # YumCache
|
988
|
-
|
989
|
-
include Chef::Mixin::GetSourceFromPackage
|
990
|
-
|
991
|
-
def initialize(new_resource, run_context)
|
992
|
-
super
|
993
|
-
|
994
|
-
@yum = YumCache.instance
|
995
|
-
@yum.yum_binary = yum_binary
|
996
|
-
end
|
997
|
-
|
998
|
-
def yum_binary
|
999
|
-
@yum_binary ||=
|
1000
|
-
begin
|
1001
|
-
yum_binary = new_resource.yum_binary if new_resource.is_a?(Chef::Resource::YumPackage)
|
1002
|
-
yum_binary ||= ::File.exist?("/usr/bin/yum-deprecated") ? "yum-deprecated" : "yum"
|
1003
|
-
end
|
1004
|
-
end
|
1005
|
-
|
1006
|
-
# Extra attributes
|
1007
|
-
#
|
1008
|
-
|
1009
|
-
def arch_for_name(n)
|
1010
|
-
if @new_resource.respond_to?("arch")
|
1011
|
-
@new_resource.arch
|
1012
|
-
elsif @arch
|
1013
|
-
idx = package_name_array.index(n)
|
1014
|
-
as_array(@arch)[idx]
|
1015
|
-
else
|
1016
|
-
nil
|
1017
|
-
end
|
1018
|
-
end
|
1019
|
-
|
1020
|
-
def arch
|
1021
|
-
if @new_resource.respond_to?("arch")
|
1022
|
-
@new_resource.arch
|
1023
|
-
else
|
1024
|
-
nil
|
1025
|
-
end
|
1026
|
-
end
|
1027
|
-
|
1028
|
-
def set_arch(arch)
|
1029
|
-
if @new_resource.respond_to?("arch")
|
1030
|
-
@new_resource.arch(arch)
|
1031
|
-
end
|
1032
|
-
end
|
1033
|
-
|
1034
|
-
def flush_cache
|
1035
|
-
if @new_resource.respond_to?("flush_cache")
|
1036
|
-
@new_resource.flush_cache
|
1037
|
-
else
|
1038
|
-
{ :before => false, :after => false }
|
1039
|
-
end
|
1040
|
-
end
|
1041
|
-
|
1042
|
-
# Helpers
|
1043
|
-
#
|
1044
|
-
|
1045
|
-
def yum_arch(arch)
|
1046
|
-
arch ? ".#{arch}" : nil
|
1047
|
-
end
|
1048
|
-
|
1049
|
-
def yum_command(command)
|
1050
|
-
command = "#{yum_binary} #{command}"
|
1051
|
-
Chef::Log.debug("#{@new_resource}: yum command: \"#{command}\"")
|
1052
|
-
status = shell_out_with_timeout(command, { :timeout => Chef::Config[:yum_timeout] })
|
1053
|
-
|
1054
|
-
# This is fun: rpm can encounter errors in the %post/%postun scripts which aren't
|
1055
|
-
# considered fatal - meaning the rpm is still successfully installed. These issue
|
1056
|
-
# cause yum to emit a non fatal warning but still exit(1). As there's currently no
|
1057
|
-
# way to suppress this behavior and an exit(1) will break a Chef run we make an
|
1058
|
-
# effort to trap these and re-run the same install command - it will either fail a
|
1059
|
-
# second time or succeed.
|
1060
|
-
#
|
1061
|
-
# A cleaner solution would have to be done in python and better hook into
|
1062
|
-
# yum/rpm to handle exceptions as we see fit.
|
1063
|
-
if status.exitstatus == 1
|
1064
|
-
status.stdout.each_line do |l|
|
1065
|
-
# rpm-4.4.2.3 lib/psm.c line 2182
|
1066
|
-
if l =~ %r{^error: %(post|postun)\(.*\) scriptlet failed, exit status \d+$}
|
1067
|
-
Chef::Log.warn("#{@new_resource} caught non-fatal scriptlet issue: \"#{l}\". Can't trust yum exit status " +
|
1068
|
-
"so running install again to verify.")
|
1069
|
-
status = shell_out_with_timeout(command, { :timeout => Chef::Config[:yum_timeout] })
|
1070
|
-
break
|
1071
|
-
end
|
1072
|
-
end
|
1073
|
-
end
|
1074
|
-
|
1075
|
-
if status.exitstatus > 0
|
1076
|
-
command_output = "STDOUT: #{status.stdout}\nSTDERR: #{status.stderr}"
|
1077
|
-
raise Chef::Exceptions::Exec, "#{command} returned #{status.exitstatus}:\n#{command_output}"
|
1078
|
-
end
|
1079
|
-
end
|
1080
|
-
|
1081
|
-
# Standard Provider methods for Parent
|
1082
|
-
#
|
1083
|
-
|
1084
|
-
def load_current_resource
|
1085
|
-
if flush_cache[:before]
|
1086
|
-
@yum.reload
|
1087
|
-
end
|
1088
|
-
|
1089
|
-
if @new_resource.options
|
1090
|
-
repo_control = []
|
1091
|
-
@new_resource.options.split.each do |opt|
|
1092
|
-
if opt =~ %r{--(enable|disable)repo=.+}
|
1093
|
-
repo_control << opt
|
1094
|
-
end
|
1095
|
-
end
|
1096
|
-
|
1097
|
-
if repo_control.size > 0
|
1098
|
-
@yum.enable_extra_repo_control(repo_control.join(" "))
|
1099
|
-
else
|
1100
|
-
@yum.disable_extra_repo_control
|
1101
|
-
end
|
1102
|
-
else
|
1103
|
-
@yum.disable_extra_repo_control
|
1104
|
-
end
|
1105
|
-
|
1106
|
-
# At this point package_name could be:
|
1107
|
-
#
|
1108
|
-
# 1) a package name, eg: "foo"
|
1109
|
-
# 2) a package name.arch, eg: "foo.i386"
|
1110
|
-
# 3) or a dependency, eg: "foo >= 1.1"
|
1111
|
-
|
1112
|
-
# Check if we have name or name+arch which has a priority over a dependency
|
1113
|
-
package_name_array.each_with_index do |n, index|
|
1114
|
-
unless @yum.package_available?(n)
|
1115
|
-
# If they aren't in the installed packages they could be a dependency
|
1116
|
-
dep = parse_dependency(n, new_version_array[index])
|
1117
|
-
if dep
|
1118
|
-
if @new_resource.package_name.is_a?(Array)
|
1119
|
-
@new_resource.package_name(package_name_array - [n] + [dep.first])
|
1120
|
-
@new_resource.version(new_version_array - [new_version_array[index]] + [dep.last]) if dep.last
|
1121
|
-
else
|
1122
|
-
@new_resource.package_name(dep.first)
|
1123
|
-
@new_resource.version(dep.last) if dep.last
|
1124
|
-
end
|
1125
|
-
end
|
1126
|
-
end
|
1127
|
-
end
|
1128
|
-
|
1129
|
-
@current_resource = Chef::Resource::Package.new(@new_resource.name)
|
1130
|
-
@current_resource.package_name(@new_resource.package_name)
|
1131
|
-
|
1132
|
-
installed_version = []
|
1133
|
-
@candidate_version = []
|
1134
|
-
@arch = []
|
1135
|
-
if @new_resource.source
|
1136
|
-
unless ::File.exists?(@new_resource.source)
|
1137
|
-
raise Chef::Exceptions::Package, "Package #{@new_resource.name} not found: #{@new_resource.source}"
|
1138
|
-
end
|
1139
|
-
|
1140
|
-
Chef::Log.debug("#{@new_resource} checking rpm status")
|
1141
|
-
shell_out_with_timeout!("rpm -qp --queryformat '%{NAME} %{VERSION}-%{RELEASE}\n' #{@new_resource.source}", :timeout => Chef::Config[:yum_timeout]).stdout.each_line do |line|
|
1142
|
-
case line
|
1143
|
-
when /([\w\d_.-]+)\s([\w\d_.-]+)/
|
1144
|
-
@current_resource.package_name($1)
|
1145
|
-
@new_resource.version($2)
|
1146
|
-
end
|
1147
|
-
end
|
1148
|
-
@candidate_version << @new_resource.version
|
1149
|
-
installed_version << @yum.installed_version(@current_resource.package_name, arch)
|
1150
|
-
else
|
1151
|
-
|
1152
|
-
package_name_array.each_with_index do |pkg, idx|
|
1153
|
-
# Don't overwrite an existing arch
|
1154
|
-
if arch
|
1155
|
-
name, parch = pkg, arch
|
1156
|
-
else
|
1157
|
-
name, parch = parse_arch(pkg)
|
1158
|
-
# if we parsed an arch from the name, update the name
|
1159
|
-
# to be just the package name.
|
1160
|
-
if parch
|
1161
|
-
if @new_resource.package_name.is_a?(Array)
|
1162
|
-
@new_resource.package_name[idx] = name
|
1163
|
-
else
|
1164
|
-
@new_resource.package_name(name)
|
1165
|
-
# only set the arch if it's a single package
|
1166
|
-
set_arch(parch)
|
1167
|
-
end
|
1168
|
-
end
|
1169
|
-
end
|
1170
|
-
|
1171
|
-
if @new_resource.version
|
1172
|
-
new_resource =
|
1173
|
-
"#{@new_resource.package_name}-#{@new_resource.version}#{yum_arch(parch)}"
|
1174
|
-
else
|
1175
|
-
new_resource = "#{@new_resource.package_name}#{yum_arch(parch)}"
|
1176
|
-
end
|
1177
|
-
Chef::Log.debug("#{@new_resource} checking yum info for #{new_resource}")
|
1178
|
-
installed_version << @yum.installed_version(name, parch)
|
1179
|
-
@candidate_version << @yum.candidate_version(name, parch)
|
1180
|
-
@arch << parch
|
1181
|
-
end
|
1182
|
-
end
|
1183
|
-
|
1184
|
-
if installed_version.size == 1
|
1185
|
-
@current_resource.version(installed_version[0])
|
1186
|
-
@candidate_version = @candidate_version[0]
|
1187
|
-
@arch = @arch[0]
|
1188
|
-
else
|
1189
|
-
@current_resource.version(installed_version)
|
1190
|
-
end
|
1191
|
-
|
1192
|
-
Chef::Log.debug("#{@new_resource} installed version: #{installed_version || "(none)"} candidate version: " +
|
1193
|
-
"#{@candidate_version || "(none)"}")
|
1194
|
-
|
1195
|
-
@current_resource
|
1196
|
-
end
|
1197
|
-
|
1198
|
-
def install_remote_package(name, version)
|
1199
|
-
# Work around yum not exiting with an error if a package doesn't exist
|
1200
|
-
# for CHEF-2062
|
1201
|
-
all_avail = as_array(name).zip(as_array(version)).any? do |n, v|
|
1202
|
-
@yum.version_available?(n, v, arch_for_name(n))
|
1203
|
-
end
|
1204
|
-
method = log_method = nil
|
1205
|
-
methods = []
|
1206
|
-
if all_avail
|
1207
|
-
# More Yum fun:
|
1208
|
-
#
|
1209
|
-
# yum install of an old name+version will exit(1)
|
1210
|
-
# yum install of an old name+version+arch will exit(0) for some reason
|
1211
|
-
#
|
1212
|
-
# Some packages can be installed multiple times like the kernel
|
1213
|
-
as_array(name).zip(as_array(version)).each do |n, v|
|
1214
|
-
method = "install"
|
1215
|
-
log_method = "installing"
|
1216
|
-
idx = package_name_array.index(n)
|
1217
|
-
unless @yum.allow_multi_install.include?(n)
|
1218
|
-
if RPMVersion.parse(current_version_array[idx]) > RPMVersion.parse(v)
|
1219
|
-
# We allow downgrading only in the evenit of single-package
|
1220
|
-
# rules where the user explicitly allowed it
|
1221
|
-
if allow_downgrade
|
1222
|
-
method = "downgrade"
|
1223
|
-
log_method = "downgrading"
|
1224
|
-
else
|
1225
|
-
# we bail like yum when the package is older
|
1226
|
-
raise Chef::Exceptions::Package, "Installed package #{n}-#{current_version_array[idx]} is newer " +
|
1227
|
-
"than candidate package #{n}-#{v}"
|
1228
|
-
end
|
1229
|
-
end
|
1230
|
-
end
|
1231
|
-
# methods don't count for packages we won't be touching
|
1232
|
-
next if RPMVersion.parse(current_version_array[idx]) == RPMVersion.parse(v)
|
1233
|
-
methods << method
|
1234
|
-
end
|
1235
|
-
|
1236
|
-
# We could split this up into two commands if we wanted to, but
|
1237
|
-
# for now, just don't support this.
|
1238
|
-
if methods.uniq.length > 1
|
1239
|
-
raise Chef::Exceptions::Package, "Multipackage rule #{name} has a mix of upgrade and downgrade packages. Cannot proceed."
|
1240
|
-
end
|
1241
|
-
|
1242
|
-
repos = []
|
1243
|
-
pkg_string_bits = []
|
1244
|
-
as_array(name).zip(as_array(version)).each do |n, v|
|
1245
|
-
idx = package_name_array.index(n)
|
1246
|
-
a = arch_for_name(n)
|
1247
|
-
s = ""
|
1248
|
-
unless v == current_version_array[idx]
|
1249
|
-
s = "#{n}-#{v}#{yum_arch(a)}"
|
1250
|
-
repo = @yum.package_repository(n, v, a)
|
1251
|
-
repos << "#{s} from #{repo} repository"
|
1252
|
-
pkg_string_bits << s
|
1253
|
-
end
|
1254
|
-
end
|
1255
|
-
pkg_string = pkg_string_bits.join(" ")
|
1256
|
-
Chef::Log.info("#{@new_resource} #{log_method} #{repos.join(' ')}")
|
1257
|
-
yum_command("-d0 -e0 -y#{expand_options(@new_resource.options)} #{method} #{pkg_string}")
|
1258
|
-
else
|
1259
|
-
raise Chef::Exceptions::Package, "Version #{version} of #{name} not found. Did you specify both version " +
|
1260
|
-
"and release? (version-release, e.g. 1.84-10.fc6)"
|
1261
|
-
end
|
1262
|
-
end
|
1263
|
-
|
1264
|
-
def install_package(name, version)
|
1265
|
-
if @new_resource.source
|
1266
|
-
yum_command("-d0 -e0 -y#{expand_options(@new_resource.options)} localinstall #{@new_resource.source}")
|
1267
|
-
else
|
1268
|
-
install_remote_package(name, version)
|
1269
|
-
end
|
1270
|
-
|
1271
|
-
if flush_cache[:after]
|
1272
|
-
@yum.reload
|
1273
|
-
else
|
1274
|
-
@yum.reload_installed
|
1275
|
-
end
|
1276
|
-
end
|
1277
|
-
|
1278
|
-
# Keep upgrades from trying to install an older candidate version. Can happen when a new
|
1279
|
-
# version is installed then removed from a repository, now the older available version
|
1280
|
-
# shows up as a viable install candidate.
|
1281
|
-
#
|
1282
|
-
# Can be done in upgrade_package but an upgraded from->to log message slips out
|
1283
|
-
#
|
1284
|
-
# Hacky - better overall solution? Custom compare in Package provider?
|
1285
|
-
def action_upgrade
|
1286
|
-
# Could be uninstalled or have no candidate
|
1287
|
-
if @current_resource.version.nil? || !candidate_version_array.any?
|
1288
|
-
super
|
1289
|
-
elsif candidate_version_array.zip(current_version_array).any? do |c, i|
|
1290
|
-
RPMVersion.parse(c) > RPMVersion.parse(i)
|
1291
|
-
end
|
1292
|
-
super
|
1293
|
-
else
|
1294
|
-
Chef::Log.debug("#{@new_resource} is at the latest version - nothing to do")
|
1295
|
-
end
|
1296
|
-
end
|
1297
|
-
|
1298
|
-
def upgrade_package(name, version)
|
1299
|
-
install_package(name, version)
|
1300
|
-
end
|
1301
|
-
|
1302
|
-
def remove_package(name, version)
|
1303
|
-
if version
|
1304
|
-
remove_str = as_array(name).zip(as_array(version)).map do |n, v|
|
1305
|
-
a = arch_for_name(n)
|
1306
|
-
"#{[n, v].join('-')}#{yum_arch(a)}"
|
1307
|
-
end.join(" ")
|
1308
|
-
else
|
1309
|
-
remove_str = as_array(name).map do |n|
|
1310
|
-
a = arch_for_name(n)
|
1311
|
-
"#{n}#{yum_arch(a)}"
|
1312
|
-
end.join(" ")
|
1313
|
-
end
|
1314
|
-
yum_command("-d0 -e0 -y#{expand_options(@new_resource.options)} remove #{remove_str}")
|
1315
|
-
|
1316
|
-
if flush_cache[:after]
|
1317
|
-
@yum.reload
|
1318
|
-
else
|
1319
|
-
@yum.reload_installed
|
1320
|
-
end
|
1321
|
-
end
|
1322
|
-
|
1323
|
-
def purge_package(name, version)
|
1324
|
-
remove_package(name, version)
|
1325
|
-
end
|
1326
|
-
|
1327
|
-
private
|
1328
|
-
|
1329
|
-
def parse_arch(package_name)
|
1330
|
-
# Allow for foo.x86_64 style package_name like yum uses in it's output
|
1331
|
-
#
|
1332
|
-
if package_name =~ %r{^(.*)\.(.*)$}
|
1333
|
-
new_package_name = $1
|
1334
|
-
new_arch = $2
|
1335
|
-
# foo.i386 and foo.beta1 are both valid package names or expressions of an arch.
|
1336
|
-
# Ensure we don't have an existing package matching package_name, then ensure we at
|
1337
|
-
# least have a match for the new_package+new_arch before we overwrite. If neither
|
1338
|
-
# then fall through to standard package handling.
|
1339
|
-
old_installed = @yum.installed_version(package_name)
|
1340
|
-
old_candidate = @yum.candidate_version(package_name)
|
1341
|
-
new_installed = @yum.installed_version(new_package_name, new_arch)
|
1342
|
-
new_candidate = @yum.candidate_version(new_package_name, new_arch)
|
1343
|
-
if (old_installed.nil? and old_candidate.nil?) and (new_installed or new_candidate)
|
1344
|
-
Chef::Log.debug("Parsed out arch #{new_arch}, new package name is #{new_package_name}")
|
1345
|
-
return new_package_name, new_arch
|
1346
|
-
end
|
1347
|
-
end
|
1348
|
-
return package_name, nil
|
1349
|
-
end
|
1350
|
-
|
1351
|
-
# If we don't have the package we could have been passed a 'whatprovides' feature
|
1352
|
-
#
|
1353
|
-
# eg: yum install "perl(Config)"
|
1354
|
-
# yum install "mtr = 2:0.71-3.1"
|
1355
|
-
# yum install "mtr > 2:0.71"
|
1356
|
-
#
|
1357
|
-
# We support resolving these out of the Provides data imported from yum-dump.py and
|
1358
|
-
# matching them up with an actual package so the standard resource handling can apply.
|
1359
|
-
#
|
1360
|
-
# There is currently no support for filename matching.
|
1361
|
-
def parse_dependency(name, version)
|
1362
|
-
# Transform the package_name into a requirement
|
1363
|
-
|
1364
|
-
# If we are passed a version or a version constraint we have to assume it's a requirement first. If it can't be
|
1365
|
-
# parsed only yum_require.name will be set and @new_resource.version will be left intact
|
1366
|
-
if version
|
1367
|
-
require_string = "#{name} #{version}"
|
1368
|
-
else
|
1369
|
-
# Transform the package_name into a requirement, might contain a version, could just be
|
1370
|
-
# a match for virtual provides
|
1371
|
-
require_string = name
|
1372
|
-
end
|
1373
|
-
yum_require = RPMRequire.parse(require_string)
|
1374
|
-
# and gather all the packages that have a Provides feature satisfying the requirement.
|
1375
|
-
# It could be multiple be we can only manage one
|
1376
|
-
packages = @yum.packages_from_require(yum_require)
|
1377
|
-
|
1378
|
-
if packages.empty?
|
1379
|
-
# Don't bother if we are just ensuring a package is removed - we don't need Provides data
|
1380
|
-
actions = Array(@new_resource.action)
|
1381
|
-
unless actions.size == 1 and (actions[0] == :remove || actions[0] == :purge)
|
1382
|
-
Chef::Log.debug("#{@new_resource} couldn't match #{@new_resource.package_name} in " +
|
1383
|
-
"installed Provides, loading available Provides - this may take a moment")
|
1384
|
-
@yum.reload_provides
|
1385
|
-
packages = @yum.packages_from_require(yum_require)
|
1386
|
-
end
|
1387
|
-
end
|
1388
|
-
|
1389
|
-
unless packages.empty?
|
1390
|
-
new_package_name = packages.first.name
|
1391
|
-
new_package_version = packages.first.version.to_s
|
1392
|
-
debug_msg = "#{name}: Unable to match package '#{name}' but matched #{packages.size} "
|
1393
|
-
debug_msg << (packages.size == 1 ? "package" : "packages")
|
1394
|
-
debug_msg << ", selected '#{new_package_name}' version '#{new_package_version}'"
|
1395
|
-
Chef::Log.debug(debug_msg)
|
1396
|
-
|
1397
|
-
# Ensure it's not the same package under a different architecture
|
1398
|
-
unique_names = []
|
1399
|
-
packages.each do |pkg|
|
1400
|
-
unique_names << "#{pkg.name}-#{pkg.version.evr}"
|
1401
|
-
end
|
1402
|
-
unique_names.uniq!
|
1403
|
-
|
1404
|
-
if unique_names.size > 1
|
1405
|
-
Chef::Log.warn("#{@new_resource} matched multiple Provides for #{@new_resource.package_name} " +
|
1406
|
-
"but we can only use the first match: #{new_package_name}. Please use a more " +
|
1407
|
-
"specific version.")
|
1408
|
-
end
|
1409
|
-
|
1410
|
-
if yum_require.version.to_s.nil?
|
1411
|
-
new_package_version = nil
|
1412
|
-
end
|
1413
|
-
|
1414
|
-
[new_package_name, new_package_version]
|
1415
|
-
end
|
1416
|
-
end
|
1417
|
-
|
1418
|
-
end
|
1419
|
-
end
|
1420
|
-
end
|
1421
|
-
end
|
1
|
+
|
2
|
+
# Author:: Adam Jacob (<adam@chef.io>)
|
3
|
+
# Copyright:: Copyright 2008-2016, 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
|
+
|
19
|
+
require "chef/config"
|
20
|
+
require "chef/provider/package"
|
21
|
+
require "chef/mixin/which"
|
22
|
+
require "chef/resource/package"
|
23
|
+
require "singleton"
|
24
|
+
require "chef/mixin/get_source_from_package"
|
25
|
+
|
26
|
+
class Chef
|
27
|
+
class Provider
|
28
|
+
class Package
|
29
|
+
class Yum < Chef::Provider::Package
|
30
|
+
|
31
|
+
provides :package, platform_family: %w{rhel fedora}
|
32
|
+
provides :yum_package, os: "linux"
|
33
|
+
|
34
|
+
class RPMUtils
|
35
|
+
class << self
|
36
|
+
|
37
|
+
# RPM::Version version_parse equivalent
|
38
|
+
def version_parse(evr)
|
39
|
+
return if evr.nil?
|
40
|
+
|
41
|
+
epoch = nil
|
42
|
+
# assume this is a version
|
43
|
+
version = evr
|
44
|
+
release = nil
|
45
|
+
|
46
|
+
lead = 0
|
47
|
+
tail = evr.size
|
48
|
+
|
49
|
+
if evr =~ %r{^([\d]+):}
|
50
|
+
epoch = $1.to_i
|
51
|
+
lead = $1.length + 1
|
52
|
+
elsif evr[0].ord == ":".ord
|
53
|
+
epoch = 0
|
54
|
+
lead = 1
|
55
|
+
end
|
56
|
+
|
57
|
+
if evr =~ %r{:?.*-(.*)$}
|
58
|
+
release = $1
|
59
|
+
tail = evr.length - release.length - lead - 1
|
60
|
+
|
61
|
+
if release.empty?
|
62
|
+
release = nil
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
version = evr[lead, tail]
|
67
|
+
if version.empty?
|
68
|
+
version = nil
|
69
|
+
end
|
70
|
+
|
71
|
+
[ epoch, version, release ]
|
72
|
+
end
|
73
|
+
|
74
|
+
# verify
|
75
|
+
def isalnum(x)
|
76
|
+
isalpha(x) or isdigit(x)
|
77
|
+
end
|
78
|
+
|
79
|
+
def isalpha(x)
|
80
|
+
v = x.ord
|
81
|
+
(v >= 65 and v <= 90) or (v >= 97 and v <= 122)
|
82
|
+
end
|
83
|
+
|
84
|
+
def isdigit(x)
|
85
|
+
v = x.ord
|
86
|
+
v >= 48 and v <= 57
|
87
|
+
end
|
88
|
+
|
89
|
+
# based on the reference spec in lib/rpmvercmp.c in rpm 4.9.0
|
90
|
+
def rpmvercmp(x, y)
|
91
|
+
# easy! :)
|
92
|
+
return 0 if x == y
|
93
|
+
|
94
|
+
if x.nil?
|
95
|
+
x = ""
|
96
|
+
end
|
97
|
+
|
98
|
+
if y.nil?
|
99
|
+
y = ""
|
100
|
+
end
|
101
|
+
|
102
|
+
# not so easy :(
|
103
|
+
#
|
104
|
+
# takes 2 strings like
|
105
|
+
#
|
106
|
+
# x = "1.20.b18.el5"
|
107
|
+
# y = "1.20.b17.el5"
|
108
|
+
#
|
109
|
+
# breaks into purely alpha and numeric segments and compares them using
|
110
|
+
# some rules
|
111
|
+
#
|
112
|
+
# * 10 > 1
|
113
|
+
# * 1 > a
|
114
|
+
# * z > a
|
115
|
+
# * Z > A
|
116
|
+
# * z > Z
|
117
|
+
# * leading zeros are ignored
|
118
|
+
# * separators (periods, commas) are ignored
|
119
|
+
# * "1.20.b18.el5.extrastuff" > "1.20.b18.el5"
|
120
|
+
|
121
|
+
x_pos = 0 # overall string element reference position
|
122
|
+
x_pos_max = x.length - 1 # number of elements in string, starting from 0
|
123
|
+
x_seg_pos = 0 # segment string element reference position
|
124
|
+
x_comp = nil # segment to compare
|
125
|
+
|
126
|
+
y_pos = 0
|
127
|
+
y_seg_pos = 0
|
128
|
+
y_pos_max = y.length - 1
|
129
|
+
y_comp = nil
|
130
|
+
|
131
|
+
while x_pos <= x_pos_max and y_pos <= y_pos_max
|
132
|
+
# first we skip over anything non alphanumeric
|
133
|
+
while (x_pos <= x_pos_max) and (isalnum(x[x_pos]) == false)
|
134
|
+
x_pos += 1 # +1 over pos_max if end of string
|
135
|
+
end
|
136
|
+
while (y_pos <= y_pos_max) and (isalnum(y[y_pos]) == false)
|
137
|
+
y_pos += 1
|
138
|
+
end
|
139
|
+
|
140
|
+
# if we hit the end of either we are done matching segments
|
141
|
+
if (x_pos == x_pos_max + 1) or (y_pos == y_pos_max + 1)
|
142
|
+
break
|
143
|
+
end
|
144
|
+
|
145
|
+
# we are now at the start of a alpha or numeric segment
|
146
|
+
x_seg_pos = x_pos
|
147
|
+
y_seg_pos = y_pos
|
148
|
+
|
149
|
+
# grab segment so we can compare them
|
150
|
+
if isdigit(x[x_seg_pos].ord)
|
151
|
+
x_seg_is_num = true
|
152
|
+
|
153
|
+
# already know it's a digit
|
154
|
+
x_seg_pos += 1
|
155
|
+
|
156
|
+
# gather up our digits
|
157
|
+
while (x_seg_pos <= x_pos_max) and isdigit(x[x_seg_pos])
|
158
|
+
x_seg_pos += 1
|
159
|
+
end
|
160
|
+
# copy the segment but not the unmatched character that x_seg_pos will
|
161
|
+
# refer to
|
162
|
+
x_comp = x[x_pos, x_seg_pos - x_pos]
|
163
|
+
|
164
|
+
while (y_seg_pos <= y_pos_max) and isdigit(y[y_seg_pos])
|
165
|
+
y_seg_pos += 1
|
166
|
+
end
|
167
|
+
y_comp = y[y_pos, y_seg_pos - y_pos]
|
168
|
+
else
|
169
|
+
# we are comparing strings
|
170
|
+
x_seg_is_num = false
|
171
|
+
|
172
|
+
while (x_seg_pos <= x_pos_max) and isalpha(x[x_seg_pos])
|
173
|
+
x_seg_pos += 1
|
174
|
+
end
|
175
|
+
x_comp = x[x_pos, x_seg_pos - x_pos]
|
176
|
+
|
177
|
+
while (y_seg_pos <= y_pos_max) and isalpha(y[y_seg_pos])
|
178
|
+
y_seg_pos += 1
|
179
|
+
end
|
180
|
+
y_comp = y[y_pos, y_seg_pos - y_pos]
|
181
|
+
end
|
182
|
+
|
183
|
+
# if y_seg_pos didn't advance in the above loop it means the segments are
|
184
|
+
# different types
|
185
|
+
if y_pos == y_seg_pos
|
186
|
+
# numbers always win over letters
|
187
|
+
return x_seg_is_num ? 1 : -1
|
188
|
+
end
|
189
|
+
|
190
|
+
# move the ball forward before we mess with the segments
|
191
|
+
x_pos += x_comp.length # +1 over pos_max if end of string
|
192
|
+
y_pos += y_comp.length
|
193
|
+
|
194
|
+
# we are comparing numbers - simply convert them
|
195
|
+
if x_seg_is_num
|
196
|
+
x_comp = x_comp.to_i
|
197
|
+
y_comp = y_comp.to_i
|
198
|
+
end
|
199
|
+
|
200
|
+
# compares ints or strings
|
201
|
+
# don't return if equal - try the next segment
|
202
|
+
if x_comp > y_comp
|
203
|
+
return 1
|
204
|
+
elsif x_comp < y_comp
|
205
|
+
return -1
|
206
|
+
end
|
207
|
+
|
208
|
+
# if we've reached here than the segments are the same - try again
|
209
|
+
end
|
210
|
+
|
211
|
+
# we must have reached the end of one or both of the strings and they
|
212
|
+
# matched up until this point
|
213
|
+
|
214
|
+
# segments matched completely but the segment separators were different -
|
215
|
+
# rpm reference code treats these as equal.
|
216
|
+
if (x_pos == x_pos_max + 1) and (y_pos == y_pos_max + 1)
|
217
|
+
return 0
|
218
|
+
end
|
219
|
+
|
220
|
+
# the most unprocessed characters left wins
|
221
|
+
if (x_pos_max - x_pos) > (y_pos_max - y_pos)
|
222
|
+
return 1
|
223
|
+
else
|
224
|
+
return -1
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
end # self
|
229
|
+
end # RPMUtils
|
230
|
+
|
231
|
+
class RPMVersion
|
232
|
+
include Comparable
|
233
|
+
|
234
|
+
def initialize(*args)
|
235
|
+
if args.size == 1
|
236
|
+
@e, @v, @r = RPMUtils.version_parse(args[0])
|
237
|
+
elsif args.size == 3
|
238
|
+
@e = args[0].to_i
|
239
|
+
@v = args[1]
|
240
|
+
@r = args[2]
|
241
|
+
else
|
242
|
+
raise ArgumentError, "Expecting either 'epoch-version-release' or 'epoch, " +
|
243
|
+
"version, release'"
|
244
|
+
end
|
245
|
+
end
|
246
|
+
attr_reader :e, :v, :r
|
247
|
+
alias :epoch :e
|
248
|
+
alias :version :v
|
249
|
+
alias :release :r
|
250
|
+
|
251
|
+
def self.parse(*args)
|
252
|
+
self.new(*args)
|
253
|
+
end
|
254
|
+
|
255
|
+
def <=>(y)
|
256
|
+
compare_versions(y)
|
257
|
+
end
|
258
|
+
|
259
|
+
def compare(y)
|
260
|
+
compare_versions(y, false)
|
261
|
+
end
|
262
|
+
|
263
|
+
def partial_compare(y)
|
264
|
+
compare_versions(y, true)
|
265
|
+
end
|
266
|
+
|
267
|
+
# RPM::Version rpm_version_to_s equivalent
|
268
|
+
def to_s
|
269
|
+
if @r.nil?
|
270
|
+
@v
|
271
|
+
else
|
272
|
+
"#{@v}-#{@r}"
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
def evr
|
277
|
+
"#{@e}:#{@v}-#{@r}"
|
278
|
+
end
|
279
|
+
|
280
|
+
private
|
281
|
+
|
282
|
+
# Rough RPM::Version rpm_version_cmp equivalent - except much slower :)
|
283
|
+
#
|
284
|
+
# partial lets epoch and version segment equality be good enough to return equal, eg:
|
285
|
+
#
|
286
|
+
# 2:1.2-1 == 2:1.2
|
287
|
+
# 2:1.2-1 == 2:
|
288
|
+
#
|
289
|
+
def compare_versions(y, partial = false)
|
290
|
+
x = self
|
291
|
+
|
292
|
+
# compare epoch
|
293
|
+
if (x.e.nil? == false and x.e > 0) and y.e.nil?
|
294
|
+
return 1
|
295
|
+
elsif x.e.nil? and (y.e.nil? == false and y.e > 0)
|
296
|
+
return -1
|
297
|
+
elsif x.e.nil? == false and y.e.nil? == false
|
298
|
+
if x.e < y.e
|
299
|
+
return -1
|
300
|
+
elsif x.e > y.e
|
301
|
+
return 1
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
# compare version
|
306
|
+
if partial and (x.v.nil? or y.v.nil?)
|
307
|
+
return 0
|
308
|
+
elsif x.v.nil? == false and y.v.nil?
|
309
|
+
return 1
|
310
|
+
elsif x.v.nil? and y.v.nil? == false
|
311
|
+
return -1
|
312
|
+
elsif x.v.nil? == false and y.v.nil? == false
|
313
|
+
cmp = RPMUtils.rpmvercmp(x.v, y.v)
|
314
|
+
return cmp if cmp != 0
|
315
|
+
end
|
316
|
+
|
317
|
+
# compare release
|
318
|
+
if partial and (x.r.nil? or y.r.nil?)
|
319
|
+
return 0
|
320
|
+
elsif x.r.nil? == false and y.r.nil?
|
321
|
+
return 1
|
322
|
+
elsif x.r.nil? and y.r.nil? == false
|
323
|
+
return -1
|
324
|
+
elsif x.r.nil? == false and y.r.nil? == false
|
325
|
+
cmp = RPMUtils.rpmvercmp(x.r, y.r)
|
326
|
+
return cmp
|
327
|
+
end
|
328
|
+
|
329
|
+
return 0
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
333
|
+
class RPMPackage
|
334
|
+
include Comparable
|
335
|
+
|
336
|
+
def initialize(*args)
|
337
|
+
if args.size == 4
|
338
|
+
@n = args[0]
|
339
|
+
@version = RPMVersion.new(args[1])
|
340
|
+
@a = args[2]
|
341
|
+
@provides = args[3]
|
342
|
+
elsif args.size == 6
|
343
|
+
@n = args[0]
|
344
|
+
e = args[1].to_i
|
345
|
+
v = args[2]
|
346
|
+
r = args[3]
|
347
|
+
@version = RPMVersion.new(e, v, r)
|
348
|
+
@a = args[4]
|
349
|
+
@provides = args[5]
|
350
|
+
else
|
351
|
+
raise ArgumentError, "Expecting either 'name, epoch-version-release, arch, provides' " +
|
352
|
+
"or 'name, epoch, version, release, arch, provides'"
|
353
|
+
end
|
354
|
+
|
355
|
+
# We always have one, ourselves!
|
356
|
+
if @provides.empty?
|
357
|
+
@provides = [ RPMProvide.new(@n, @version.evr, :==) ]
|
358
|
+
end
|
359
|
+
end
|
360
|
+
attr_reader :n, :a, :version, :provides
|
361
|
+
alias :name :n
|
362
|
+
alias :arch :a
|
363
|
+
|
364
|
+
def <=>(y)
|
365
|
+
compare(y)
|
366
|
+
end
|
367
|
+
|
368
|
+
def compare(y)
|
369
|
+
x = self
|
370
|
+
|
371
|
+
# easy! :)
|
372
|
+
return 0 if x.nevra == y.nevra
|
373
|
+
|
374
|
+
# compare name
|
375
|
+
if x.n.nil? == false and y.n.nil?
|
376
|
+
return 1
|
377
|
+
elsif x.n.nil? and y.n.nil? == false
|
378
|
+
return -1
|
379
|
+
elsif x.n.nil? == false and y.n.nil? == false
|
380
|
+
if x.n < y.n
|
381
|
+
return -1
|
382
|
+
elsif x.n > y.n
|
383
|
+
return 1
|
384
|
+
end
|
385
|
+
end
|
386
|
+
|
387
|
+
# compare version
|
388
|
+
if x.version > y.version
|
389
|
+
return 1
|
390
|
+
elsif x.version < y.version
|
391
|
+
return -1
|
392
|
+
end
|
393
|
+
|
394
|
+
# compare arch
|
395
|
+
if x.a.nil? == false and y.a.nil?
|
396
|
+
return 1
|
397
|
+
elsif x.a.nil? and y.a.nil? == false
|
398
|
+
return -1
|
399
|
+
elsif x.a.nil? == false and y.a.nil? == false
|
400
|
+
if x.a < y.a
|
401
|
+
return -1
|
402
|
+
elsif x.a > y.a
|
403
|
+
return 1
|
404
|
+
end
|
405
|
+
end
|
406
|
+
|
407
|
+
return 0
|
408
|
+
end
|
409
|
+
|
410
|
+
def to_s
|
411
|
+
nevra
|
412
|
+
end
|
413
|
+
|
414
|
+
def nevra
|
415
|
+
"#{@n}-#{@version.evr}.#{@a}"
|
416
|
+
end
|
417
|
+
end
|
418
|
+
|
419
|
+
# Simple implementation from rpm and ruby-rpm reference code
|
420
|
+
class RPMDependency
|
421
|
+
def initialize(*args)
|
422
|
+
if args.size == 3
|
423
|
+
@name = args[0]
|
424
|
+
@version = RPMVersion.new(args[1])
|
425
|
+
# Our requirement to other dependencies
|
426
|
+
@flag = args[2] || :==
|
427
|
+
elsif args.size == 5
|
428
|
+
@name = args[0]
|
429
|
+
e = args[1].to_i
|
430
|
+
v = args[2]
|
431
|
+
r = args[3]
|
432
|
+
@version = RPMVersion.new(e, v, r)
|
433
|
+
@flag = args[4] || :==
|
434
|
+
else
|
435
|
+
raise ArgumentError, "Expecting either 'name, epoch-version-release, flag' or " +
|
436
|
+
"'name, epoch, version, release, flag'"
|
437
|
+
end
|
438
|
+
end
|
439
|
+
attr_reader :name, :version, :flag
|
440
|
+
|
441
|
+
# Parses 2 forms:
|
442
|
+
#
|
443
|
+
# "mtr >= 2:0.71-3.0"
|
444
|
+
# "mta"
|
445
|
+
def self.parse(string)
|
446
|
+
if string =~ %r{^(\S+)\s+(>|>=|=|==|<=|<)\s+(\S+)$}
|
447
|
+
name = $1
|
448
|
+
if $2 == "="
|
449
|
+
flag = :==
|
450
|
+
else
|
451
|
+
flag = :"#{$2}"
|
452
|
+
end
|
453
|
+
version = $3
|
454
|
+
|
455
|
+
return self.new(name, version, flag)
|
456
|
+
else
|
457
|
+
name = string
|
458
|
+
return self.new(name, nil, nil)
|
459
|
+
end
|
460
|
+
end
|
461
|
+
|
462
|
+
# Test if another RPMDependency satisfies our requirements
|
463
|
+
def satisfy?(y)
|
464
|
+
unless y.kind_of?(RPMDependency)
|
465
|
+
raise ArgumentError, "Expecting an RPMDependency object"
|
466
|
+
end
|
467
|
+
|
468
|
+
x = self
|
469
|
+
|
470
|
+
# Easy!
|
471
|
+
if x.name != y.name
|
472
|
+
return false
|
473
|
+
end
|
474
|
+
|
475
|
+
# Partial compare
|
476
|
+
#
|
477
|
+
# eg: x.version 2.3 == y.version 2.3-1
|
478
|
+
sense = x.version.partial_compare(y.version)
|
479
|
+
|
480
|
+
# Thanks to rpmdsCompare() rpmds.c
|
481
|
+
if sense < 0 and (x.flag == :> || x.flag == :>=) || (y.flag == :<= || y.flag == :<)
|
482
|
+
return true
|
483
|
+
elsif sense > 0 and (x.flag == :< || x.flag == :<=) || (y.flag == :>= || y.flag == :>)
|
484
|
+
return true
|
485
|
+
elsif sense == 0 and (
|
486
|
+
((x.flag == :== or x.flag == :<= or x.flag == :>=) and (y.flag == :== or y.flag == :<= or y.flag == :>=)) or
|
487
|
+
(x.flag == :< and y.flag == :<) or
|
488
|
+
(x.flag == :> and y.flag == :>)
|
489
|
+
)
|
490
|
+
return true
|
491
|
+
end
|
492
|
+
|
493
|
+
return false
|
494
|
+
end
|
495
|
+
end
|
496
|
+
|
497
|
+
class RPMProvide < RPMDependency; end
|
498
|
+
class RPMRequire < RPMDependency; end
|
499
|
+
|
500
|
+
class RPMDbPackage < RPMPackage
|
501
|
+
# <rpm parts>, installed, available
|
502
|
+
def initialize(*args)
|
503
|
+
@repoid = args.pop
|
504
|
+
# state
|
505
|
+
@available = args.pop
|
506
|
+
@installed = args.pop
|
507
|
+
super(*args)
|
508
|
+
end
|
509
|
+
attr_reader :repoid, :available, :installed
|
510
|
+
end
|
511
|
+
|
512
|
+
# Simple storage for RPMPackage objects - keeps them unique and sorted
|
513
|
+
class RPMDb
|
514
|
+
def initialize
|
515
|
+
# package name => [ RPMPackage, RPMPackage ] of different versions
|
516
|
+
@rpms = Hash.new
|
517
|
+
# package nevra => RPMPackage for lookups
|
518
|
+
@index = Hash.new
|
519
|
+
# provide name (aka feature) => [RPMPackage, RPMPackage] each providing this feature
|
520
|
+
@provides = Hash.new
|
521
|
+
# RPMPackages listed as available
|
522
|
+
@available = Set.new
|
523
|
+
# RPMPackages listed as installed
|
524
|
+
@installed = Set.new
|
525
|
+
end
|
526
|
+
|
527
|
+
def [](package_name)
|
528
|
+
self.lookup(package_name)
|
529
|
+
end
|
530
|
+
|
531
|
+
# Lookup package_name and return a descending array of package objects
|
532
|
+
def lookup(package_name)
|
533
|
+
pkgs = @rpms[package_name]
|
534
|
+
if pkgs
|
535
|
+
return pkgs.sort.reverse
|
536
|
+
else
|
537
|
+
return nil
|
538
|
+
end
|
539
|
+
end
|
540
|
+
|
541
|
+
def lookup_provides(provide_name)
|
542
|
+
@provides[provide_name]
|
543
|
+
end
|
544
|
+
|
545
|
+
# Using the package name as a key, and nevra for an index, keep a unique list of packages.
|
546
|
+
# The available/installed state can be overwritten for existing packages.
|
547
|
+
def push(*args)
|
548
|
+
args.flatten.each do |new_rpm|
|
549
|
+
unless new_rpm.kind_of?(RPMDbPackage)
|
550
|
+
raise ArgumentError, "Expecting an RPMDbPackage object"
|
551
|
+
end
|
552
|
+
|
553
|
+
@rpms[new_rpm.n] ||= Array.new
|
554
|
+
|
555
|
+
# we may already have this one, like when the installed list is refreshed
|
556
|
+
idx = @index[new_rpm.nevra]
|
557
|
+
if idx
|
558
|
+
# grab the existing package if it's not
|
559
|
+
curr_rpm = idx
|
560
|
+
else
|
561
|
+
@rpms[new_rpm.n] << new_rpm
|
562
|
+
|
563
|
+
new_rpm.provides.each do |provide|
|
564
|
+
@provides[provide.name] ||= Array.new
|
565
|
+
@provides[provide.name] << new_rpm
|
566
|
+
end
|
567
|
+
|
568
|
+
curr_rpm = new_rpm
|
569
|
+
end
|
570
|
+
|
571
|
+
# Track the nevra -> RPMPackage association to avoid having to compare versions
|
572
|
+
# with @rpms[new_rpm.n] on the next round
|
573
|
+
@index[new_rpm.nevra] = curr_rpm
|
574
|
+
|
575
|
+
# these are overwritten for existing packages
|
576
|
+
if new_rpm.available
|
577
|
+
@available << curr_rpm
|
578
|
+
end
|
579
|
+
if new_rpm.installed
|
580
|
+
@installed << curr_rpm
|
581
|
+
end
|
582
|
+
end
|
583
|
+
end
|
584
|
+
|
585
|
+
def <<(*args)
|
586
|
+
self.push(args)
|
587
|
+
end
|
588
|
+
|
589
|
+
def clear
|
590
|
+
@rpms.clear
|
591
|
+
@index.clear
|
592
|
+
@provides.clear
|
593
|
+
clear_available
|
594
|
+
clear_installed
|
595
|
+
end
|
596
|
+
|
597
|
+
def clear_available
|
598
|
+
@available.clear
|
599
|
+
end
|
600
|
+
|
601
|
+
def clear_installed
|
602
|
+
@installed.clear
|
603
|
+
end
|
604
|
+
|
605
|
+
def size
|
606
|
+
@rpms.size
|
607
|
+
end
|
608
|
+
alias :length :size
|
609
|
+
|
610
|
+
def available_size
|
611
|
+
@available.size
|
612
|
+
end
|
613
|
+
|
614
|
+
def installed_size
|
615
|
+
@installed.size
|
616
|
+
end
|
617
|
+
|
618
|
+
def available?(package)
|
619
|
+
@available.include?(package)
|
620
|
+
end
|
621
|
+
|
622
|
+
def installed?(package)
|
623
|
+
@installed.include?(package)
|
624
|
+
end
|
625
|
+
|
626
|
+
def whatprovides(rpmdep)
|
627
|
+
unless rpmdep.kind_of?(RPMDependency)
|
628
|
+
raise ArgumentError, "Expecting an RPMDependency object"
|
629
|
+
end
|
630
|
+
|
631
|
+
what = []
|
632
|
+
|
633
|
+
packages = lookup_provides(rpmdep.name)
|
634
|
+
if packages
|
635
|
+
packages.each do |pkg|
|
636
|
+
pkg.provides.each do |provide|
|
637
|
+
if provide.satisfy?(rpmdep)
|
638
|
+
what << pkg
|
639
|
+
end
|
640
|
+
end
|
641
|
+
end
|
642
|
+
end
|
643
|
+
|
644
|
+
return what
|
645
|
+
end
|
646
|
+
end
|
647
|
+
|
648
|
+
# Cache for our installed and available packages, pulled in from yum-dump.py
|
649
|
+
class YumCache
|
650
|
+
include Chef::Mixin::Which
|
651
|
+
include Chef::Mixin::ShellOut
|
652
|
+
include Singleton
|
653
|
+
|
654
|
+
attr_accessor :yum_binary
|
655
|
+
|
656
|
+
def initialize
|
657
|
+
@rpmdb = RPMDb.new
|
658
|
+
|
659
|
+
# Next time @rpmdb is accessed:
|
660
|
+
# :all - Trigger a run of "yum-dump.py --options --installed-provides", updates
|
661
|
+
# yum's cache and parses options from /etc/yum.conf. Pulls in Provides
|
662
|
+
# dependency data for installed packages only - this data is slow to
|
663
|
+
# gather.
|
664
|
+
# :provides - Same as :all but pulls in Provides data for available packages as well.
|
665
|
+
# Used as a last resort when we can't find a Provides match.
|
666
|
+
# :installed - Trigger a run of "yum-dump.py --installed", only reads the local rpm
|
667
|
+
# db. Used between client runs for a quick refresh.
|
668
|
+
# :none - Do nothing, a call to one of the reload methods is required.
|
669
|
+
@next_refresh = :all
|
670
|
+
|
671
|
+
@allow_multi_install = []
|
672
|
+
|
673
|
+
@extra_repo_control = nil
|
674
|
+
|
675
|
+
# these are for subsequent runs if we are on an interval
|
676
|
+
Chef::Client.when_run_starts do
|
677
|
+
YumCache.instance.reload
|
678
|
+
end
|
679
|
+
end
|
680
|
+
|
681
|
+
attr_reader :extra_repo_control
|
682
|
+
|
683
|
+
# Cache management
|
684
|
+
#
|
685
|
+
|
686
|
+
def refresh
|
687
|
+
case @next_refresh
|
688
|
+
when :none
|
689
|
+
return nil
|
690
|
+
when :installed
|
691
|
+
reset_installed
|
692
|
+
# fast
|
693
|
+
opts = " --installed"
|
694
|
+
when :all
|
695
|
+
reset
|
696
|
+
# medium
|
697
|
+
opts = " --options --installed-provides"
|
698
|
+
when :provides
|
699
|
+
reset
|
700
|
+
# slow!
|
701
|
+
opts = " --options --all-provides"
|
702
|
+
else
|
703
|
+
raise ArgumentError, "Unexpected value in next_refresh: #{@next_refresh}"
|
704
|
+
end
|
705
|
+
|
706
|
+
if @extra_repo_control
|
707
|
+
opts << " #{@extra_repo_control}"
|
708
|
+
end
|
709
|
+
|
710
|
+
opts << " --yum-lock-timeout #{Chef::Config[:yum_lock_timeout]}"
|
711
|
+
|
712
|
+
one_line = false
|
713
|
+
error = nil
|
714
|
+
|
715
|
+
helper = ::File.join(::File.dirname(__FILE__), "yum-dump.py")
|
716
|
+
status = nil
|
717
|
+
|
718
|
+
begin
|
719
|
+
status = shell_out!("#{python_bin} #{helper}#{opts}", :timeout => Chef::Config[:yum_timeout])
|
720
|
+
status.stdout.each_line do |line|
|
721
|
+
one_line = true
|
722
|
+
|
723
|
+
line.chomp!
|
724
|
+
if line =~ %r{\[option (.*)\] (.*)}
|
725
|
+
if $1 == "installonlypkgs"
|
726
|
+
@allow_multi_install = $2.split
|
727
|
+
else
|
728
|
+
raise Chef::Exceptions::Package, "Strange, unknown option line '#{line}' from yum-dump.py"
|
729
|
+
end
|
730
|
+
next
|
731
|
+
end
|
732
|
+
|
733
|
+
if line =~ %r{^(\S+) ([0-9]+) (\S+) (\S+) (\S+) \[(.*)\] ([i,a,r]) (\S+)$}
|
734
|
+
name = $1
|
735
|
+
epoch = $2
|
736
|
+
version = $3
|
737
|
+
release = $4
|
738
|
+
arch = $5
|
739
|
+
provides = parse_provides($6)
|
740
|
+
type = $7
|
741
|
+
repoid = $8
|
742
|
+
else
|
743
|
+
Chef::Log.warn("Problem parsing line '#{line}' from yum-dump.py! " +
|
744
|
+
"Please check your yum configuration.")
|
745
|
+
next
|
746
|
+
end
|
747
|
+
|
748
|
+
case type
|
749
|
+
when "i"
|
750
|
+
# if yum-dump was called with --installed this may not be true, but it's okay
|
751
|
+
# since we don't touch the @available Set in reload_installed
|
752
|
+
available = false
|
753
|
+
installed = true
|
754
|
+
when "a"
|
755
|
+
available = true
|
756
|
+
installed = false
|
757
|
+
when "r"
|
758
|
+
available = true
|
759
|
+
installed = true
|
760
|
+
end
|
761
|
+
|
762
|
+
pkg = RPMDbPackage.new(name, epoch, version, release, arch, provides, installed, available, repoid)
|
763
|
+
@rpmdb << pkg
|
764
|
+
end
|
765
|
+
|
766
|
+
error = status.stderr
|
767
|
+
rescue Mixlib::ShellOut::CommandTimeout => e
|
768
|
+
Chef::Log.error("#{helper} exceeded timeout #{Chef::Config[:yum_timeout]}")
|
769
|
+
raise(e)
|
770
|
+
end
|
771
|
+
|
772
|
+
if status.exitstatus != 0
|
773
|
+
raise Chef::Exceptions::Package, "Yum failed - #{status.inspect} - returns: #{error}"
|
774
|
+
else
|
775
|
+
unless one_line
|
776
|
+
Chef::Log.warn("Odd, no output from yum-dump.py. Please check " +
|
777
|
+
"your yum configuration.")
|
778
|
+
end
|
779
|
+
end
|
780
|
+
|
781
|
+
# A reload method must be called before the cache is altered
|
782
|
+
@next_refresh = :none
|
783
|
+
end
|
784
|
+
|
785
|
+
def python_bin
|
786
|
+
yum_executable = which(yum_binary)
|
787
|
+
if yum_executable && shabang?(yum_executable)
|
788
|
+
shabang_or_fallback(extract_interpreter(yum_executable))
|
789
|
+
else
|
790
|
+
Chef::Log.warn("Yum executable not found or doesn't start with #!. Using default python.")
|
791
|
+
"/usr/bin/python"
|
792
|
+
end
|
793
|
+
rescue StandardError => e
|
794
|
+
Chef::Log.warn("An error occurred attempting to determine correct python executable. Using default.")
|
795
|
+
Chef::Log.debug(e)
|
796
|
+
"/usr/bin/python"
|
797
|
+
end
|
798
|
+
|
799
|
+
def extract_interpreter(file)
|
800
|
+
::File.open(file, "r", &:readline)[2..-1].strip
|
801
|
+
end
|
802
|
+
|
803
|
+
# dnf based systems have a yum shim that has /bin/bash as the interpreter. Don't use this.
|
804
|
+
def shabang_or_fallback(interpreter)
|
805
|
+
if interpreter == "/bin/bash"
|
806
|
+
Chef::Log.warn("Yum executable interpreter is /bin/bash. Falling back to default python.")
|
807
|
+
"/usr/bin/python"
|
808
|
+
else
|
809
|
+
interpreter
|
810
|
+
end
|
811
|
+
end
|
812
|
+
|
813
|
+
def shabang?(file)
|
814
|
+
::File.open(file, "r") do |f|
|
815
|
+
f.read(2) == '#!'
|
816
|
+
end
|
817
|
+
rescue Errno::ENOENT
|
818
|
+
false
|
819
|
+
end
|
820
|
+
|
821
|
+
def reload
|
822
|
+
@next_refresh = :all
|
823
|
+
end
|
824
|
+
|
825
|
+
def reload_installed
|
826
|
+
@next_refresh = :installed
|
827
|
+
end
|
828
|
+
|
829
|
+
def reload_provides
|
830
|
+
@next_refresh = :provides
|
831
|
+
end
|
832
|
+
|
833
|
+
def reset
|
834
|
+
@rpmdb.clear
|
835
|
+
end
|
836
|
+
|
837
|
+
def reset_installed
|
838
|
+
@rpmdb.clear_installed
|
839
|
+
end
|
840
|
+
|
841
|
+
# Querying the cache
|
842
|
+
#
|
843
|
+
|
844
|
+
# Check for package by name or name+arch
|
845
|
+
def package_available?(package_name)
|
846
|
+
refresh
|
847
|
+
|
848
|
+
if @rpmdb.lookup(package_name)
|
849
|
+
return true
|
850
|
+
else
|
851
|
+
if package_name =~ %r{^(.*)\.(.*)$}
|
852
|
+
pkg_name = $1
|
853
|
+
pkg_arch = $2
|
854
|
+
|
855
|
+
if matches = @rpmdb.lookup(pkg_name)
|
856
|
+
matches.each do |m|
|
857
|
+
return true if m.arch == pkg_arch
|
858
|
+
end
|
859
|
+
end
|
860
|
+
end
|
861
|
+
end
|
862
|
+
|
863
|
+
return false
|
864
|
+
end
|
865
|
+
|
866
|
+
# Returns a array of packages satisfying an RPMDependency
|
867
|
+
def packages_from_require(rpmdep)
|
868
|
+
refresh
|
869
|
+
@rpmdb.whatprovides(rpmdep)
|
870
|
+
end
|
871
|
+
|
872
|
+
# Check if a package-version.arch is available to install
|
873
|
+
def version_available?(package_name, desired_version, arch = nil)
|
874
|
+
version(package_name, arch, true, false) do |v|
|
875
|
+
return true if desired_version == v
|
876
|
+
end
|
877
|
+
|
878
|
+
return false
|
879
|
+
end
|
880
|
+
|
881
|
+
# Return the source repository for a package-version.arch
|
882
|
+
def package_repository(package_name, desired_version, arch = nil)
|
883
|
+
package(package_name, arch, true, false) do |pkg|
|
884
|
+
return pkg.repoid if desired_version == pkg.version.to_s
|
885
|
+
end
|
886
|
+
|
887
|
+
return nil
|
888
|
+
end
|
889
|
+
|
890
|
+
# Return the latest available version for a package.arch
|
891
|
+
def available_version(package_name, arch = nil)
|
892
|
+
version(package_name, arch, true, false)
|
893
|
+
end
|
894
|
+
alias :candidate_version :available_version
|
895
|
+
|
896
|
+
# Return the currently installed version for a package.arch
|
897
|
+
def installed_version(package_name, arch = nil)
|
898
|
+
version(package_name, arch, false, true)
|
899
|
+
end
|
900
|
+
|
901
|
+
# Return an array of packages allowed to be installed multiple times, such as the kernel
|
902
|
+
def allow_multi_install
|
903
|
+
refresh
|
904
|
+
@allow_multi_install
|
905
|
+
end
|
906
|
+
|
907
|
+
def enable_extra_repo_control(arg)
|
908
|
+
# Don't touch cache if it's the same repos as the last load
|
909
|
+
unless @extra_repo_control == arg
|
910
|
+
@extra_repo_control = arg
|
911
|
+
reload
|
912
|
+
end
|
913
|
+
end
|
914
|
+
|
915
|
+
def disable_extra_repo_control
|
916
|
+
# Only force reload when set
|
917
|
+
if @extra_repo_control
|
918
|
+
@extra_repo_control = nil
|
919
|
+
reload
|
920
|
+
end
|
921
|
+
end
|
922
|
+
|
923
|
+
private
|
924
|
+
|
925
|
+
def version(package_name, arch = nil, is_available = false, is_installed = false)
|
926
|
+
package(package_name, arch, is_available, is_installed) do |pkg|
|
927
|
+
if block_given?
|
928
|
+
yield pkg.version.to_s
|
929
|
+
else
|
930
|
+
# first match is latest version
|
931
|
+
return pkg.version.to_s
|
932
|
+
end
|
933
|
+
end
|
934
|
+
|
935
|
+
if block_given?
|
936
|
+
return self
|
937
|
+
else
|
938
|
+
return nil
|
939
|
+
end
|
940
|
+
end
|
941
|
+
|
942
|
+
def package(package_name, arch = nil, is_available = false, is_installed = false)
|
943
|
+
refresh
|
944
|
+
packages = @rpmdb[package_name]
|
945
|
+
if packages
|
946
|
+
packages.each do |pkg|
|
947
|
+
if is_available
|
948
|
+
next unless @rpmdb.available?(pkg)
|
949
|
+
end
|
950
|
+
if is_installed
|
951
|
+
next unless @rpmdb.installed?(pkg)
|
952
|
+
end
|
953
|
+
if arch
|
954
|
+
next unless pkg.arch == arch
|
955
|
+
end
|
956
|
+
|
957
|
+
if block_given?
|
958
|
+
yield pkg
|
959
|
+
else
|
960
|
+
# first match is latest version
|
961
|
+
return pkg
|
962
|
+
end
|
963
|
+
end
|
964
|
+
end
|
965
|
+
|
966
|
+
if block_given?
|
967
|
+
return self
|
968
|
+
else
|
969
|
+
return nil
|
970
|
+
end
|
971
|
+
end
|
972
|
+
|
973
|
+
# Parse provides from yum-dump.py output
|
974
|
+
def parse_provides(string)
|
975
|
+
ret = []
|
976
|
+
# ['atk = 1.12.2-1.fc6', 'libatk-1.0.so.0']
|
977
|
+
string.split(", ").each do |seg|
|
978
|
+
# 'atk = 1.12.2-1.fc6'
|
979
|
+
if seg =~ %r{^'(.*)'$}
|
980
|
+
ret << RPMProvide.parse($1)
|
981
|
+
end
|
982
|
+
end
|
983
|
+
|
984
|
+
return ret
|
985
|
+
end
|
986
|
+
|
987
|
+
end # YumCache
|
988
|
+
|
989
|
+
include Chef::Mixin::GetSourceFromPackage
|
990
|
+
|
991
|
+
def initialize(new_resource, run_context)
|
992
|
+
super
|
993
|
+
|
994
|
+
@yum = YumCache.instance
|
995
|
+
@yum.yum_binary = yum_binary
|
996
|
+
end
|
997
|
+
|
998
|
+
def yum_binary
|
999
|
+
@yum_binary ||=
|
1000
|
+
begin
|
1001
|
+
yum_binary = new_resource.yum_binary if new_resource.is_a?(Chef::Resource::YumPackage)
|
1002
|
+
yum_binary ||= ::File.exist?("/usr/bin/yum-deprecated") ? "yum-deprecated" : "yum"
|
1003
|
+
end
|
1004
|
+
end
|
1005
|
+
|
1006
|
+
# Extra attributes
|
1007
|
+
#
|
1008
|
+
|
1009
|
+
def arch_for_name(n)
|
1010
|
+
if @new_resource.respond_to?("arch")
|
1011
|
+
@new_resource.arch
|
1012
|
+
elsif @arch
|
1013
|
+
idx = package_name_array.index(n)
|
1014
|
+
as_array(@arch)[idx]
|
1015
|
+
else
|
1016
|
+
nil
|
1017
|
+
end
|
1018
|
+
end
|
1019
|
+
|
1020
|
+
def arch
|
1021
|
+
if @new_resource.respond_to?("arch")
|
1022
|
+
@new_resource.arch
|
1023
|
+
else
|
1024
|
+
nil
|
1025
|
+
end
|
1026
|
+
end
|
1027
|
+
|
1028
|
+
def set_arch(arch)
|
1029
|
+
if @new_resource.respond_to?("arch")
|
1030
|
+
@new_resource.arch(arch)
|
1031
|
+
end
|
1032
|
+
end
|
1033
|
+
|
1034
|
+
def flush_cache
|
1035
|
+
if @new_resource.respond_to?("flush_cache")
|
1036
|
+
@new_resource.flush_cache
|
1037
|
+
else
|
1038
|
+
{ :before => false, :after => false }
|
1039
|
+
end
|
1040
|
+
end
|
1041
|
+
|
1042
|
+
# Helpers
|
1043
|
+
#
|
1044
|
+
|
1045
|
+
def yum_arch(arch)
|
1046
|
+
arch ? ".#{arch}" : nil
|
1047
|
+
end
|
1048
|
+
|
1049
|
+
def yum_command(command)
|
1050
|
+
command = "#{yum_binary} #{command}"
|
1051
|
+
Chef::Log.debug("#{@new_resource}: yum command: \"#{command}\"")
|
1052
|
+
status = shell_out_with_timeout(command, { :timeout => Chef::Config[:yum_timeout] })
|
1053
|
+
|
1054
|
+
# This is fun: rpm can encounter errors in the %post/%postun scripts which aren't
|
1055
|
+
# considered fatal - meaning the rpm is still successfully installed. These issue
|
1056
|
+
# cause yum to emit a non fatal warning but still exit(1). As there's currently no
|
1057
|
+
# way to suppress this behavior and an exit(1) will break a Chef run we make an
|
1058
|
+
# effort to trap these and re-run the same install command - it will either fail a
|
1059
|
+
# second time or succeed.
|
1060
|
+
#
|
1061
|
+
# A cleaner solution would have to be done in python and better hook into
|
1062
|
+
# yum/rpm to handle exceptions as we see fit.
|
1063
|
+
if status.exitstatus == 1
|
1064
|
+
status.stdout.each_line do |l|
|
1065
|
+
# rpm-4.4.2.3 lib/psm.c line 2182
|
1066
|
+
if l =~ %r{^error: %(post|postun)\(.*\) scriptlet failed, exit status \d+$}
|
1067
|
+
Chef::Log.warn("#{@new_resource} caught non-fatal scriptlet issue: \"#{l}\". Can't trust yum exit status " +
|
1068
|
+
"so running install again to verify.")
|
1069
|
+
status = shell_out_with_timeout(command, { :timeout => Chef::Config[:yum_timeout] })
|
1070
|
+
break
|
1071
|
+
end
|
1072
|
+
end
|
1073
|
+
end
|
1074
|
+
|
1075
|
+
if status.exitstatus > 0
|
1076
|
+
command_output = "STDOUT: #{status.stdout}\nSTDERR: #{status.stderr}"
|
1077
|
+
raise Chef::Exceptions::Exec, "#{command} returned #{status.exitstatus}:\n#{command_output}"
|
1078
|
+
end
|
1079
|
+
end
|
1080
|
+
|
1081
|
+
# Standard Provider methods for Parent
|
1082
|
+
#
|
1083
|
+
|
1084
|
+
def load_current_resource
|
1085
|
+
if flush_cache[:before]
|
1086
|
+
@yum.reload
|
1087
|
+
end
|
1088
|
+
|
1089
|
+
if @new_resource.options
|
1090
|
+
repo_control = []
|
1091
|
+
@new_resource.options.split.each do |opt|
|
1092
|
+
if opt =~ %r{--(enable|disable)repo=.+}
|
1093
|
+
repo_control << opt
|
1094
|
+
end
|
1095
|
+
end
|
1096
|
+
|
1097
|
+
if repo_control.size > 0
|
1098
|
+
@yum.enable_extra_repo_control(repo_control.join(" "))
|
1099
|
+
else
|
1100
|
+
@yum.disable_extra_repo_control
|
1101
|
+
end
|
1102
|
+
else
|
1103
|
+
@yum.disable_extra_repo_control
|
1104
|
+
end
|
1105
|
+
|
1106
|
+
# At this point package_name could be:
|
1107
|
+
#
|
1108
|
+
# 1) a package name, eg: "foo"
|
1109
|
+
# 2) a package name.arch, eg: "foo.i386"
|
1110
|
+
# 3) or a dependency, eg: "foo >= 1.1"
|
1111
|
+
|
1112
|
+
# Check if we have name or name+arch which has a priority over a dependency
|
1113
|
+
package_name_array.each_with_index do |n, index|
|
1114
|
+
unless @yum.package_available?(n)
|
1115
|
+
# If they aren't in the installed packages they could be a dependency
|
1116
|
+
dep = parse_dependency(n, new_version_array[index])
|
1117
|
+
if dep
|
1118
|
+
if @new_resource.package_name.is_a?(Array)
|
1119
|
+
@new_resource.package_name(package_name_array - [n] + [dep.first])
|
1120
|
+
@new_resource.version(new_version_array - [new_version_array[index]] + [dep.last]) if dep.last
|
1121
|
+
else
|
1122
|
+
@new_resource.package_name(dep.first)
|
1123
|
+
@new_resource.version(dep.last) if dep.last
|
1124
|
+
end
|
1125
|
+
end
|
1126
|
+
end
|
1127
|
+
end
|
1128
|
+
|
1129
|
+
@current_resource = Chef::Resource::Package.new(@new_resource.name)
|
1130
|
+
@current_resource.package_name(@new_resource.package_name)
|
1131
|
+
|
1132
|
+
installed_version = []
|
1133
|
+
@candidate_version = []
|
1134
|
+
@arch = []
|
1135
|
+
if @new_resource.source
|
1136
|
+
unless ::File.exists?(@new_resource.source)
|
1137
|
+
raise Chef::Exceptions::Package, "Package #{@new_resource.name} not found: #{@new_resource.source}"
|
1138
|
+
end
|
1139
|
+
|
1140
|
+
Chef::Log.debug("#{@new_resource} checking rpm status")
|
1141
|
+
shell_out_with_timeout!("rpm -qp --queryformat '%{NAME} %{VERSION}-%{RELEASE}\n' #{@new_resource.source}", :timeout => Chef::Config[:yum_timeout]).stdout.each_line do |line|
|
1142
|
+
case line
|
1143
|
+
when /([\w\d_.-]+)\s([\w\d_.-]+)/
|
1144
|
+
@current_resource.package_name($1)
|
1145
|
+
@new_resource.version($2)
|
1146
|
+
end
|
1147
|
+
end
|
1148
|
+
@candidate_version << @new_resource.version
|
1149
|
+
installed_version << @yum.installed_version(@current_resource.package_name, arch)
|
1150
|
+
else
|
1151
|
+
|
1152
|
+
package_name_array.each_with_index do |pkg, idx|
|
1153
|
+
# Don't overwrite an existing arch
|
1154
|
+
if arch
|
1155
|
+
name, parch = pkg, arch
|
1156
|
+
else
|
1157
|
+
name, parch = parse_arch(pkg)
|
1158
|
+
# if we parsed an arch from the name, update the name
|
1159
|
+
# to be just the package name.
|
1160
|
+
if parch
|
1161
|
+
if @new_resource.package_name.is_a?(Array)
|
1162
|
+
@new_resource.package_name[idx] = name
|
1163
|
+
else
|
1164
|
+
@new_resource.package_name(name)
|
1165
|
+
# only set the arch if it's a single package
|
1166
|
+
set_arch(parch)
|
1167
|
+
end
|
1168
|
+
end
|
1169
|
+
end
|
1170
|
+
|
1171
|
+
if @new_resource.version
|
1172
|
+
new_resource =
|
1173
|
+
"#{@new_resource.package_name}-#{@new_resource.version}#{yum_arch(parch)}"
|
1174
|
+
else
|
1175
|
+
new_resource = "#{@new_resource.package_name}#{yum_arch(parch)}"
|
1176
|
+
end
|
1177
|
+
Chef::Log.debug("#{@new_resource} checking yum info for #{new_resource}")
|
1178
|
+
installed_version << @yum.installed_version(name, parch)
|
1179
|
+
@candidate_version << @yum.candidate_version(name, parch)
|
1180
|
+
@arch << parch
|
1181
|
+
end
|
1182
|
+
end
|
1183
|
+
|
1184
|
+
if installed_version.size == 1
|
1185
|
+
@current_resource.version(installed_version[0])
|
1186
|
+
@candidate_version = @candidate_version[0]
|
1187
|
+
@arch = @arch[0]
|
1188
|
+
else
|
1189
|
+
@current_resource.version(installed_version)
|
1190
|
+
end
|
1191
|
+
|
1192
|
+
Chef::Log.debug("#{@new_resource} installed version: #{installed_version || "(none)"} candidate version: " +
|
1193
|
+
"#{@candidate_version || "(none)"}")
|
1194
|
+
|
1195
|
+
@current_resource
|
1196
|
+
end
|
1197
|
+
|
1198
|
+
def install_remote_package(name, version)
|
1199
|
+
# Work around yum not exiting with an error if a package doesn't exist
|
1200
|
+
# for CHEF-2062
|
1201
|
+
all_avail = as_array(name).zip(as_array(version)).any? do |n, v|
|
1202
|
+
@yum.version_available?(n, v, arch_for_name(n))
|
1203
|
+
end
|
1204
|
+
method = log_method = nil
|
1205
|
+
methods = []
|
1206
|
+
if all_avail
|
1207
|
+
# More Yum fun:
|
1208
|
+
#
|
1209
|
+
# yum install of an old name+version will exit(1)
|
1210
|
+
# yum install of an old name+version+arch will exit(0) for some reason
|
1211
|
+
#
|
1212
|
+
# Some packages can be installed multiple times like the kernel
|
1213
|
+
as_array(name).zip(as_array(version)).each do |n, v|
|
1214
|
+
method = "install"
|
1215
|
+
log_method = "installing"
|
1216
|
+
idx = package_name_array.index(n)
|
1217
|
+
unless @yum.allow_multi_install.include?(n)
|
1218
|
+
if RPMVersion.parse(current_version_array[idx]) > RPMVersion.parse(v)
|
1219
|
+
# We allow downgrading only in the evenit of single-package
|
1220
|
+
# rules where the user explicitly allowed it
|
1221
|
+
if allow_downgrade
|
1222
|
+
method = "downgrade"
|
1223
|
+
log_method = "downgrading"
|
1224
|
+
else
|
1225
|
+
# we bail like yum when the package is older
|
1226
|
+
raise Chef::Exceptions::Package, "Installed package #{n}-#{current_version_array[idx]} is newer " +
|
1227
|
+
"than candidate package #{n}-#{v}"
|
1228
|
+
end
|
1229
|
+
end
|
1230
|
+
end
|
1231
|
+
# methods don't count for packages we won't be touching
|
1232
|
+
next if RPMVersion.parse(current_version_array[idx]) == RPMVersion.parse(v)
|
1233
|
+
methods << method
|
1234
|
+
end
|
1235
|
+
|
1236
|
+
# We could split this up into two commands if we wanted to, but
|
1237
|
+
# for now, just don't support this.
|
1238
|
+
if methods.uniq.length > 1
|
1239
|
+
raise Chef::Exceptions::Package, "Multipackage rule #{name} has a mix of upgrade and downgrade packages. Cannot proceed."
|
1240
|
+
end
|
1241
|
+
|
1242
|
+
repos = []
|
1243
|
+
pkg_string_bits = []
|
1244
|
+
as_array(name).zip(as_array(version)).each do |n, v|
|
1245
|
+
idx = package_name_array.index(n)
|
1246
|
+
a = arch_for_name(n)
|
1247
|
+
s = ""
|
1248
|
+
unless v == current_version_array[idx]
|
1249
|
+
s = "#{n}-#{v}#{yum_arch(a)}"
|
1250
|
+
repo = @yum.package_repository(n, v, a)
|
1251
|
+
repos << "#{s} from #{repo} repository"
|
1252
|
+
pkg_string_bits << s
|
1253
|
+
end
|
1254
|
+
end
|
1255
|
+
pkg_string = pkg_string_bits.join(" ")
|
1256
|
+
Chef::Log.info("#{@new_resource} #{log_method} #{repos.join(' ')}")
|
1257
|
+
yum_command("-d0 -e0 -y#{expand_options(@new_resource.options)} #{method} #{pkg_string}")
|
1258
|
+
else
|
1259
|
+
raise Chef::Exceptions::Package, "Version #{version} of #{name} not found. Did you specify both version " +
|
1260
|
+
"and release? (version-release, e.g. 1.84-10.fc6)"
|
1261
|
+
end
|
1262
|
+
end
|
1263
|
+
|
1264
|
+
def install_package(name, version)
|
1265
|
+
if @new_resource.source
|
1266
|
+
yum_command("-d0 -e0 -y#{expand_options(@new_resource.options)} localinstall #{@new_resource.source}")
|
1267
|
+
else
|
1268
|
+
install_remote_package(name, version)
|
1269
|
+
end
|
1270
|
+
|
1271
|
+
if flush_cache[:after]
|
1272
|
+
@yum.reload
|
1273
|
+
else
|
1274
|
+
@yum.reload_installed
|
1275
|
+
end
|
1276
|
+
end
|
1277
|
+
|
1278
|
+
# Keep upgrades from trying to install an older candidate version. Can happen when a new
|
1279
|
+
# version is installed then removed from a repository, now the older available version
|
1280
|
+
# shows up as a viable install candidate.
|
1281
|
+
#
|
1282
|
+
# Can be done in upgrade_package but an upgraded from->to log message slips out
|
1283
|
+
#
|
1284
|
+
# Hacky - better overall solution? Custom compare in Package provider?
|
1285
|
+
def action_upgrade
|
1286
|
+
# Could be uninstalled or have no candidate
|
1287
|
+
if @current_resource.version.nil? || !candidate_version_array.any?
|
1288
|
+
super
|
1289
|
+
elsif candidate_version_array.zip(current_version_array).any? do |c, i|
|
1290
|
+
RPMVersion.parse(c) > RPMVersion.parse(i)
|
1291
|
+
end
|
1292
|
+
super
|
1293
|
+
else
|
1294
|
+
Chef::Log.debug("#{@new_resource} is at the latest version - nothing to do")
|
1295
|
+
end
|
1296
|
+
end
|
1297
|
+
|
1298
|
+
def upgrade_package(name, version)
|
1299
|
+
install_package(name, version)
|
1300
|
+
end
|
1301
|
+
|
1302
|
+
def remove_package(name, version)
|
1303
|
+
if version
|
1304
|
+
remove_str = as_array(name).zip(as_array(version)).map do |n, v|
|
1305
|
+
a = arch_for_name(n)
|
1306
|
+
"#{[n, v].join('-')}#{yum_arch(a)}"
|
1307
|
+
end.join(" ")
|
1308
|
+
else
|
1309
|
+
remove_str = as_array(name).map do |n|
|
1310
|
+
a = arch_for_name(n)
|
1311
|
+
"#{n}#{yum_arch(a)}"
|
1312
|
+
end.join(" ")
|
1313
|
+
end
|
1314
|
+
yum_command("-d0 -e0 -y#{expand_options(@new_resource.options)} remove #{remove_str}")
|
1315
|
+
|
1316
|
+
if flush_cache[:after]
|
1317
|
+
@yum.reload
|
1318
|
+
else
|
1319
|
+
@yum.reload_installed
|
1320
|
+
end
|
1321
|
+
end
|
1322
|
+
|
1323
|
+
def purge_package(name, version)
|
1324
|
+
remove_package(name, version)
|
1325
|
+
end
|
1326
|
+
|
1327
|
+
private
|
1328
|
+
|
1329
|
+
def parse_arch(package_name)
|
1330
|
+
# Allow for foo.x86_64 style package_name like yum uses in it's output
|
1331
|
+
#
|
1332
|
+
if package_name =~ %r{^(.*)\.(.*)$}
|
1333
|
+
new_package_name = $1
|
1334
|
+
new_arch = $2
|
1335
|
+
# foo.i386 and foo.beta1 are both valid package names or expressions of an arch.
|
1336
|
+
# Ensure we don't have an existing package matching package_name, then ensure we at
|
1337
|
+
# least have a match for the new_package+new_arch before we overwrite. If neither
|
1338
|
+
# then fall through to standard package handling.
|
1339
|
+
old_installed = @yum.installed_version(package_name)
|
1340
|
+
old_candidate = @yum.candidate_version(package_name)
|
1341
|
+
new_installed = @yum.installed_version(new_package_name, new_arch)
|
1342
|
+
new_candidate = @yum.candidate_version(new_package_name, new_arch)
|
1343
|
+
if (old_installed.nil? and old_candidate.nil?) and (new_installed or new_candidate)
|
1344
|
+
Chef::Log.debug("Parsed out arch #{new_arch}, new package name is #{new_package_name}")
|
1345
|
+
return new_package_name, new_arch
|
1346
|
+
end
|
1347
|
+
end
|
1348
|
+
return package_name, nil
|
1349
|
+
end
|
1350
|
+
|
1351
|
+
# If we don't have the package we could have been passed a 'whatprovides' feature
|
1352
|
+
#
|
1353
|
+
# eg: yum install "perl(Config)"
|
1354
|
+
# yum install "mtr = 2:0.71-3.1"
|
1355
|
+
# yum install "mtr > 2:0.71"
|
1356
|
+
#
|
1357
|
+
# We support resolving these out of the Provides data imported from yum-dump.py and
|
1358
|
+
# matching them up with an actual package so the standard resource handling can apply.
|
1359
|
+
#
|
1360
|
+
# There is currently no support for filename matching.
|
1361
|
+
def parse_dependency(name, version)
|
1362
|
+
# Transform the package_name into a requirement
|
1363
|
+
|
1364
|
+
# If we are passed a version or a version constraint we have to assume it's a requirement first. If it can't be
|
1365
|
+
# parsed only yum_require.name will be set and @new_resource.version will be left intact
|
1366
|
+
if version
|
1367
|
+
require_string = "#{name} #{version}"
|
1368
|
+
else
|
1369
|
+
# Transform the package_name into a requirement, might contain a version, could just be
|
1370
|
+
# a match for virtual provides
|
1371
|
+
require_string = name
|
1372
|
+
end
|
1373
|
+
yum_require = RPMRequire.parse(require_string)
|
1374
|
+
# and gather all the packages that have a Provides feature satisfying the requirement.
|
1375
|
+
# It could be multiple be we can only manage one
|
1376
|
+
packages = @yum.packages_from_require(yum_require)
|
1377
|
+
|
1378
|
+
if packages.empty?
|
1379
|
+
# Don't bother if we are just ensuring a package is removed - we don't need Provides data
|
1380
|
+
actions = Array(@new_resource.action)
|
1381
|
+
unless actions.size == 1 and (actions[0] == :remove || actions[0] == :purge)
|
1382
|
+
Chef::Log.debug("#{@new_resource} couldn't match #{@new_resource.package_name} in " +
|
1383
|
+
"installed Provides, loading available Provides - this may take a moment")
|
1384
|
+
@yum.reload_provides
|
1385
|
+
packages = @yum.packages_from_require(yum_require)
|
1386
|
+
end
|
1387
|
+
end
|
1388
|
+
|
1389
|
+
unless packages.empty?
|
1390
|
+
new_package_name = packages.first.name
|
1391
|
+
new_package_version = packages.first.version.to_s
|
1392
|
+
debug_msg = "#{name}: Unable to match package '#{name}' but matched #{packages.size} "
|
1393
|
+
debug_msg << (packages.size == 1 ? "package" : "packages")
|
1394
|
+
debug_msg << ", selected '#{new_package_name}' version '#{new_package_version}'"
|
1395
|
+
Chef::Log.debug(debug_msg)
|
1396
|
+
|
1397
|
+
# Ensure it's not the same package under a different architecture
|
1398
|
+
unique_names = []
|
1399
|
+
packages.each do |pkg|
|
1400
|
+
unique_names << "#{pkg.name}-#{pkg.version.evr}"
|
1401
|
+
end
|
1402
|
+
unique_names.uniq!
|
1403
|
+
|
1404
|
+
if unique_names.size > 1
|
1405
|
+
Chef::Log.warn("#{@new_resource} matched multiple Provides for #{@new_resource.package_name} " +
|
1406
|
+
"but we can only use the first match: #{new_package_name}. Please use a more " +
|
1407
|
+
"specific version.")
|
1408
|
+
end
|
1409
|
+
|
1410
|
+
if yum_require.version.to_s.nil?
|
1411
|
+
new_package_version = nil
|
1412
|
+
end
|
1413
|
+
|
1414
|
+
[new_package_name, new_package_version]
|
1415
|
+
end
|
1416
|
+
end
|
1417
|
+
|
1418
|
+
end
|
1419
|
+
end
|
1420
|
+
end
|
1421
|
+
end
|