TrueCar-chef 0.10.0.beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +201 -0
- data/README.rdoc +171 -0
- data/bin/chef-client +26 -0
- data/bin/chef-solo +25 -0
- data/bin/knife +26 -0
- data/bin/shef +34 -0
- data/distro/README +2 -0
- data/distro/arch/etc/conf.d/chef-client.conf +5 -0
- data/distro/arch/etc/conf.d/chef-server-webui.conf +10 -0
- data/distro/arch/etc/conf.d/chef-server.conf +10 -0
- data/distro/arch/etc/conf.d/chef-solr-indexer.conf +8 -0
- data/distro/arch/etc/conf.d/chef-solr.conf +8 -0
- data/distro/arch/etc/rc.d/chef-client +76 -0
- data/distro/arch/etc/rc.d/chef-server +78 -0
- data/distro/arch/etc/rc.d/chef-server-webui +78 -0
- data/distro/arch/etc/rc.d/chef-solr +78 -0
- data/distro/arch/etc/rc.d/chef-solr-indexer +78 -0
- data/distro/common/man/man1/chef-indexer.1 +42 -0
- data/distro/common/man/man1/chef-server-webui.1 +106 -0
- data/distro/common/man/man1/chef-server.1 +107 -0
- data/distro/common/man/man1/chef-solr-indexer.1 +55 -0
- data/distro/common/man/man1/chef-solr.1 +55 -0
- data/distro/common/man/man8/chef-client.8 +63 -0
- data/distro/common/man/man8/chef-solo.8 +57 -0
- data/distro/common/man/man8/chef-solr-rebuild.8 +37 -0
- data/distro/common/man/man8/knife.8 +1349 -0
- data/distro/common/man/man8/shef.8 +45 -0
- data/distro/common/markdown/README +3 -0
- data/distro/common/markdown/knife.mkd +865 -0
- data/distro/debian/etc/default/chef-client +4 -0
- data/distro/debian/etc/default/chef-server +9 -0
- data/distro/debian/etc/default/chef-server-webui +9 -0
- data/distro/debian/etc/default/chef-solr +8 -0
- data/distro/debian/etc/default/chef-solr-indexer +7 -0
- data/distro/debian/etc/init.d/chef-client +175 -0
- data/distro/debian/etc/init.d/chef-server +122 -0
- data/distro/debian/etc/init.d/chef-server-webui +123 -0
- data/distro/debian/etc/init.d/chef-solr +176 -0
- data/distro/debian/etc/init.d/chef-solr-indexer +176 -0
- data/distro/debian/etc/init/chef-client.conf +17 -0
- data/distro/debian/etc/init/chef-server-webui.conf +17 -0
- data/distro/debian/etc/init/chef-server.conf +17 -0
- data/distro/debian/etc/init/chef-solr-indexer.conf +17 -0
- data/distro/debian/etc/init/chef-solr.conf +17 -0
- data/distro/redhat/etc/init.d/chef-client +106 -0
- data/distro/redhat/etc/init.d/chef-server +112 -0
- data/distro/redhat/etc/init.d/chef-server-webui +112 -0
- data/distro/redhat/etc/init.d/chef-solr +104 -0
- data/distro/redhat/etc/init.d/chef-solr-indexer +104 -0
- data/distro/redhat/etc/logrotate.d/chef-client +8 -0
- data/distro/redhat/etc/logrotate.d/chef-server +8 -0
- data/distro/redhat/etc/logrotate.d/chef-server-webui +8 -0
- data/distro/redhat/etc/logrotate.d/chef-solr +8 -0
- data/distro/redhat/etc/logrotate.d/chef-solr-indexer +8 -0
- data/distro/redhat/etc/sysconfig/chef-client +15 -0
- data/distro/redhat/etc/sysconfig/chef-server +14 -0
- data/distro/redhat/etc/sysconfig/chef-server-webui +14 -0
- data/distro/redhat/etc/sysconfig/chef-solr +8 -0
- data/distro/redhat/etc/sysconfig/chef-solr-indexer +7 -0
- data/lib/chef.rb +40 -0
- data/lib/chef/api_client.rb +264 -0
- data/lib/chef/application.rb +137 -0
- data/lib/chef/application/agent.rb +18 -0
- data/lib/chef/application/client.rb +242 -0
- data/lib/chef/application/knife.rb +169 -0
- data/lib/chef/application/solo.rb +217 -0
- data/lib/chef/applications.rb +4 -0
- data/lib/chef/certificate.rb +194 -0
- data/lib/chef/checksum.rb +182 -0
- data/lib/chef/checksum_cache.rb +189 -0
- data/lib/chef/client.rb +362 -0
- data/lib/chef/config.rb +244 -0
- data/lib/chef/cookbook/chefignore.rb +66 -0
- data/lib/chef/cookbook/cookbook_collection.rb +45 -0
- data/lib/chef/cookbook/cookbook_version_loader.rb +151 -0
- data/lib/chef/cookbook/file_system_file_vendor.rb +56 -0
- data/lib/chef/cookbook/file_vendor.rb +48 -0
- data/lib/chef/cookbook/metadata.rb +592 -0
- data/lib/chef/cookbook/remote_file_vendor.rb +87 -0
- data/lib/chef/cookbook/syntax_check.rb +136 -0
- data/lib/chef/cookbook_loader.rb +103 -0
- data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
- data/lib/chef/cookbook_uploader.rb +125 -0
- data/lib/chef/cookbook_version.rb +979 -0
- data/lib/chef/cookbook_version_selector.rb +163 -0
- data/lib/chef/couchdb.rb +247 -0
- data/lib/chef/daemon.rb +172 -0
- data/lib/chef/data_bag.rb +223 -0
- data/lib/chef/data_bag_item.rb +267 -0
- data/lib/chef/encrypted_data_bag_item.rb +126 -0
- data/lib/chef/environment.rb +386 -0
- data/lib/chef/exceptions.rb +153 -0
- data/lib/chef/file_access_control.rb +140 -0
- data/lib/chef/file_cache.rb +218 -0
- data/lib/chef/handler.rb +206 -0
- data/lib/chef/handler/json_file.rb +58 -0
- data/lib/chef/index_queue.rb +29 -0
- data/lib/chef/index_queue/amqp_client.rb +116 -0
- data/lib/chef/index_queue/consumer.rb +76 -0
- data/lib/chef/index_queue/indexable.rb +109 -0
- data/lib/chef/json_compat.rb +52 -0
- data/lib/chef/knife.rb +424 -0
- data/lib/chef/knife/bootstrap.rb +185 -0
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +47 -0
- data/lib/chef/knife/bootstrap/centos5-gems.erb +41 -0
- data/lib/chef/knife/bootstrap/client-install.vbs +80 -0
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +38 -0
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +32 -0
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +46 -0
- data/lib/chef/knife/bootstrap/windows-gems.erb +34 -0
- data/lib/chef/knife/client_bulk_delete.rb +43 -0
- data/lib/chef/knife/client_create.rb +73 -0
- data/lib/chef/knife/client_delete.rb +48 -0
- data/lib/chef/knife/client_edit.rb +48 -0
- data/lib/chef/knife/client_list.rb +43 -0
- data/lib/chef/knife/client_reregister.rb +59 -0
- data/lib/chef/knife/client_show.rb +53 -0
- data/lib/chef/knife/configure.rb +136 -0
- data/lib/chef/knife/configure_client.rb +52 -0
- data/lib/chef/knife/cookbook_bulk_delete.rb +61 -0
- data/lib/chef/knife/cookbook_create.rb +274 -0
- data/lib/chef/knife/cookbook_delete.rb +149 -0
- data/lib/chef/knife/cookbook_download.rb +134 -0
- data/lib/chef/knife/cookbook_list.rb +50 -0
- data/lib/chef/knife/cookbook_metadata.rb +102 -0
- data/lib/chef/knife/cookbook_metadata_from_file.rb +44 -0
- data/lib/chef/knife/cookbook_show.rb +101 -0
- data/lib/chef/knife/cookbook_site_download.rb +58 -0
- data/lib/chef/knife/cookbook_site_list.rb +56 -0
- data/lib/chef/knife/cookbook_site_search.rb +51 -0
- data/lib/chef/knife/cookbook_site_share.rb +114 -0
- data/lib/chef/knife/cookbook_site_show.rb +57 -0
- data/lib/chef/knife/cookbook_site_unshare.rb +56 -0
- data/lib/chef/knife/cookbook_site_vendor.rb +145 -0
- data/lib/chef/knife/cookbook_test.rb +82 -0
- data/lib/chef/knife/cookbook_upload.rb +146 -0
- data/lib/chef/knife/data_bag_create.rb +94 -0
- data/lib/chef/knife/data_bag_delete.rb +51 -0
- data/lib/chef/knife/data_bag_edit.rb +94 -0
- data/lib/chef/knife/data_bag_from_file.rb +85 -0
- data/lib/chef/knife/data_bag_list.rb +46 -0
- data/lib/chef/knife/data_bag_show.rb +81 -0
- data/lib/chef/knife/environment_create.rb +53 -0
- data/lib/chef/knife/environment_delete.rb +45 -0
- data/lib/chef/knife/environment_edit.rb +45 -0
- data/lib/chef/knife/environment_from_file.rb +39 -0
- data/lib/chef/knife/environment_list.rb +42 -0
- data/lib/chef/knife/environment_show.rb +46 -0
- data/lib/chef/knife/exec.rb +51 -0
- data/lib/chef/knife/index_rebuild.rb +50 -0
- data/lib/chef/knife/node_bulk_delete.rb +46 -0
- data/lib/chef/knife/node_create.rb +50 -0
- data/lib/chef/knife/node_delete.rb +47 -0
- data/lib/chef/knife/node_edit.rb +163 -0
- data/lib/chef/knife/node_from_file.rb +45 -0
- data/lib/chef/knife/node_list.rb +46 -0
- data/lib/chef/knife/node_run_list_add.rb +67 -0
- data/lib/chef/knife/node_run_list_remove.rb +48 -0
- data/lib/chef/knife/node_show.rb +62 -0
- data/lib/chef/knife/recipe_list.rb +33 -0
- data/lib/chef/knife/role_bulk_delete.rb +47 -0
- data/lib/chef/knife/role_create.rb +55 -0
- data/lib/chef/knife/role_delete.rb +47 -0
- data/lib/chef/knife/role_edit.rb +48 -0
- data/lib/chef/knife/role_from_file.rb +49 -0
- data/lib/chef/knife/role_list.rb +43 -0
- data/lib/chef/knife/role_show.rb +54 -0
- data/lib/chef/knife/search.rb +123 -0
- data/lib/chef/knife/ssh.rb +318 -0
- data/lib/chef/knife/status.rb +90 -0
- data/lib/chef/knife/subcommand_loader.rb +101 -0
- data/lib/chef/knife/tag_create.rb +31 -0
- data/lib/chef/knife/tag_delete.rb +31 -0
- data/lib/chef/knife/tag_list.rb +29 -0
- data/lib/chef/knife/ui.rb +227 -0
- data/lib/chef/knife/windows_bootstrap.rb +157 -0
- data/lib/chef/log.rb +39 -0
- data/lib/chef/mash.rb +211 -0
- data/lib/chef/mixin/check_helper.rb +31 -0
- data/lib/chef/mixin/checksum.rb +32 -0
- data/lib/chef/mixin/command.rb +221 -0
- data/lib/chef/mixin/command/unix.rb +215 -0
- data/lib/chef/mixin/command/windows.rb +76 -0
- data/lib/chef/mixin/convert_to_class_name.rb +63 -0
- data/lib/chef/mixin/create_path.rb +56 -0
- data/lib/chef/mixin/deep_merge.rb +225 -0
- data/lib/chef/mixin/deprecation.rb +65 -0
- data/lib/chef/mixin/from_file.rb +50 -0
- data/lib/chef/mixin/language.rb +165 -0
- data/lib/chef/mixin/language_include_attribute.rb +61 -0
- data/lib/chef/mixin/language_include_recipe.rb +52 -0
- data/lib/chef/mixin/params_validate.rb +225 -0
- data/lib/chef/mixin/recipe_definition_dsl_core.rb +81 -0
- data/lib/chef/mixin/shell_out.rb +40 -0
- data/lib/chef/mixin/template.rb +95 -0
- data/lib/chef/mixin/xml_escape.rb +140 -0
- data/lib/chef/mixins.rb +15 -0
- data/lib/chef/monkey_patches/dir.rb +36 -0
- data/lib/chef/monkey_patches/numeric.rb +7 -0
- data/lib/chef/monkey_patches/regexp.rb +34 -0
- data/lib/chef/monkey_patches/string.rb +28 -0
- data/lib/chef/monkey_patches/tempfile.rb +64 -0
- data/lib/chef/nil_argument.rb +3 -0
- data/lib/chef/node.rb +661 -0
- data/lib/chef/node/attribute.rb +487 -0
- data/lib/chef/openid_registration.rb +187 -0
- data/lib/chef/platform.rb +409 -0
- data/lib/chef/provider.rb +124 -0
- data/lib/chef/provider/breakpoint.rb +36 -0
- data/lib/chef/provider/cookbook_file.rb +101 -0
- data/lib/chef/provider/cron.rb +186 -0
- data/lib/chef/provider/cron/solaris.rb +195 -0
- data/lib/chef/provider/deploy.rb +320 -0
- data/lib/chef/provider/deploy/revision.rb +80 -0
- data/lib/chef/provider/deploy/timestamped.rb +33 -0
- data/lib/chef/provider/directory.rb +72 -0
- data/lib/chef/provider/env.rb +152 -0
- data/lib/chef/provider/env/windows.rb +75 -0
- data/lib/chef/provider/erl_call.rb +100 -0
- data/lib/chef/provider/execute.rb +60 -0
- data/lib/chef/provider/file.rb +222 -0
- data/lib/chef/provider/git.rb +221 -0
- data/lib/chef/provider/group.rb +133 -0
- data/lib/chef/provider/group/aix.rb +70 -0
- data/lib/chef/provider/group/dscl.rb +121 -0
- data/lib/chef/provider/group/gpasswd.rb +53 -0
- data/lib/chef/provider/group/groupadd.rb +81 -0
- data/lib/chef/provider/group/pw.rb +84 -0
- data/lib/chef/provider/group/usermod.rb +57 -0
- data/lib/chef/provider/group/windows.rb +79 -0
- data/lib/chef/provider/http_request.rb +122 -0
- data/lib/chef/provider/ifconfig.rb +132 -0
- data/lib/chef/provider/link.rb +161 -0
- data/lib/chef/provider/log.rb +54 -0
- data/lib/chef/provider/mdadm.rb +91 -0
- data/lib/chef/provider/mount.rb +117 -0
- data/lib/chef/provider/mount/mount.rb +232 -0
- data/lib/chef/provider/mount/windows.rb +80 -0
- data/lib/chef/provider/ohai.rb +41 -0
- data/lib/chef/provider/package.rb +160 -0
- data/lib/chef/provider/package/apt.rb +110 -0
- data/lib/chef/provider/package/dpkg.rb +112 -0
- data/lib/chef/provider/package/easy_install.rb +136 -0
- data/lib/chef/provider/package/freebsd.rb +123 -0
- data/lib/chef/provider/package/macports.rb +105 -0
- data/lib/chef/provider/package/pacman.rb +101 -0
- data/lib/chef/provider/package/portage.rb +135 -0
- data/lib/chef/provider/package/rpm.rb +101 -0
- data/lib/chef/provider/package/rubygems.rb +462 -0
- data/lib/chef/provider/package/solaris.rb +127 -0
- data/lib/chef/provider/package/yum-dump.py +128 -0
- data/lib/chef/provider/package/yum.rb +261 -0
- data/lib/chef/provider/package/zypper.rb +133 -0
- data/lib/chef/provider/remote_directory.rb +138 -0
- data/lib/chef/provider/remote_file.rb +119 -0
- data/lib/chef/provider/route.rb +195 -0
- data/lib/chef/provider/ruby_block.rb +33 -0
- data/lib/chef/provider/script.rb +55 -0
- data/lib/chef/provider/service.rb +128 -0
- data/lib/chef/provider/service/arch.rb +109 -0
- data/lib/chef/provider/service/debian.rb +130 -0
- data/lib/chef/provider/service/freebsd.rb +156 -0
- data/lib/chef/provider/service/gentoo.rb +54 -0
- data/lib/chef/provider/service/init.rb +71 -0
- data/lib/chef/provider/service/insserv.rb +52 -0
- data/lib/chef/provider/service/redhat.rb +60 -0
- data/lib/chef/provider/service/simple.rb +118 -0
- data/lib/chef/provider/service/solaris.rb +85 -0
- data/lib/chef/provider/service/upstart.rb +192 -0
- data/lib/chef/provider/service/windows.rb +146 -0
- data/lib/chef/provider/subversion.rb +194 -0
- data/lib/chef/provider/template.rb +105 -0
- data/lib/chef/provider/user.rb +187 -0
- data/lib/chef/provider/user/dscl.rb +280 -0
- data/lib/chef/provider/user/pw.rb +113 -0
- data/lib/chef/provider/user/useradd.rb +137 -0
- data/lib/chef/provider/user/windows.rb +124 -0
- data/lib/chef/providers.rb +93 -0
- data/lib/chef/recipe.rb +128 -0
- data/lib/chef/resource.rb +530 -0
- data/lib/chef/resource/apt_package.rb +34 -0
- data/lib/chef/resource/bash.rb +33 -0
- data/lib/chef/resource/breakpoint.rb +35 -0
- data/lib/chef/resource/cookbook_file.rb +45 -0
- data/lib/chef/resource/cron.rb +188 -0
- data/lib/chef/resource/csh.rb +33 -0
- data/lib/chef/resource/deploy.rb +371 -0
- data/lib/chef/resource/deploy_revision.rb +35 -0
- data/lib/chef/resource/directory.rb +76 -0
- data/lib/chef/resource/dpkg_package.rb +34 -0
- data/lib/chef/resource/easy_install_package.rb +57 -0
- data/lib/chef/resource/env.rb +58 -0
- data/lib/chef/resource/erl_call.rb +83 -0
- data/lib/chef/resource/execute.rb +127 -0
- data/lib/chef/resource/file.rb +99 -0
- data/lib/chef/resource/freebsd_package.rb +35 -0
- data/lib/chef/resource/gem_package.rb +53 -0
- data/lib/chef/resource/git.rb +37 -0
- data/lib/chef/resource/group.rb +70 -0
- data/lib/chef/resource/http_request.rb +61 -0
- data/lib/chef/resource/ifconfig.rb +134 -0
- data/lib/chef/resource/link.rb +78 -0
- data/lib/chef/resource/log.rb +62 -0
- data/lib/chef/resource/macports_package.rb +29 -0
- data/lib/chef/resource/mdadm.rb +82 -0
- data/lib/chef/resource/mount.rb +135 -0
- data/lib/chef/resource/ohai.rb +40 -0
- data/lib/chef/resource/package.rb +80 -0
- data/lib/chef/resource/pacman_package.rb +33 -0
- data/lib/chef/resource/perl.rb +33 -0
- data/lib/chef/resource/portage_package.rb +33 -0
- data/lib/chef/resource/python.rb +33 -0
- data/lib/chef/resource/remote_directory.rb +109 -0
- data/lib/chef/resource/remote_file.rb +83 -0
- data/lib/chef/resource/route.rb +135 -0
- data/lib/chef/resource/rpm_package.rb +34 -0
- data/lib/chef/resource/ruby.rb +33 -0
- data/lib/chef/resource/ruby_block.rb +40 -0
- data/lib/chef/resource/scm.rb +147 -0
- data/lib/chef/resource/script.rb +60 -0
- data/lib/chef/resource/service.rb +160 -0
- data/lib/chef/resource/solaris_package.rb +36 -0
- data/lib/chef/resource/subversion.rb +36 -0
- data/lib/chef/resource/template.rb +69 -0
- data/lib/chef/resource/timestamped_deploy.rb +31 -0
- data/lib/chef/resource/user.rb +130 -0
- data/lib/chef/resource/yum_package.rb +43 -0
- data/lib/chef/resource_collection.rb +217 -0
- data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
- data/lib/chef/resource_definition.rb +67 -0
- data/lib/chef/resource_definition_list.rb +38 -0
- data/lib/chef/resources.rb +64 -0
- data/lib/chef/rest.rb +386 -0
- data/lib/chef/rest/auth_credentials.rb +71 -0
- data/lib/chef/rest/cookie_jar.rb +31 -0
- data/lib/chef/rest/rest_request.rb +188 -0
- data/lib/chef/role.rb +341 -0
- data/lib/chef/run_context.rb +126 -0
- data/lib/chef/run_list.rb +165 -0
- data/lib/chef/run_list/run_list_expansion.rb +193 -0
- data/lib/chef/run_list/run_list_item.rb +92 -0
- data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
- data/lib/chef/run_status.rb +121 -0
- data/lib/chef/runner.rb +99 -0
- data/lib/chef/sandbox.rb +153 -0
- data/lib/chef/search/query.rb +65 -0
- data/lib/chef/shef.rb +326 -0
- data/lib/chef/shef/ext.rb +569 -0
- data/lib/chef/shef/model_wrapper.rb +120 -0
- data/lib/chef/shef/shef_rest.rb +28 -0
- data/lib/chef/shef/shef_session.rb +284 -0
- data/lib/chef/shell_out.rb +238 -0
- data/lib/chef/shell_out/unix.rb +223 -0
- data/lib/chef/shell_out/windows.rb +98 -0
- data/lib/chef/solr_query.rb +187 -0
- data/lib/chef/solr_query/lucene.treetop +150 -0
- data/lib/chef/solr_query/lucene_nodes.rb +285 -0
- data/lib/chef/solr_query/query_transform.rb +65 -0
- data/lib/chef/solr_query/solr_http_request.rb +118 -0
- data/lib/chef/streaming_cookbook_uploader.rb +201 -0
- data/lib/chef/tasks/chef_repo.rake +256 -0
- data/lib/chef/util/file_edit.rb +122 -0
- data/lib/chef/util/windows.rb +56 -0
- data/lib/chef/util/windows/net_group.rb +101 -0
- data/lib/chef/util/windows/net_use.rb +121 -0
- data/lib/chef/util/windows/net_user.rb +198 -0
- data/lib/chef/util/windows/volume.rb +59 -0
- data/lib/chef/version.rb +23 -0
- data/lib/chef/version_class.rb +70 -0
- data/lib/chef/version_constraint.rb +116 -0
- data/lib/chef/webui_user.rb +231 -0
- metadata +600 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Author:: Christopher Walters (<cw@opscode.com>)
|
|
4
|
+
# Copyright:: Copyright (c) 2009, 2010 Opscode, Inc.
|
|
5
|
+
# License:: Apache License, Version 2.0
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
#
|
|
19
|
+
|
|
20
|
+
require 'chef/knife'
|
|
21
|
+
|
|
22
|
+
class Chef
|
|
23
|
+
class Knife
|
|
24
|
+
class CookbookDownload < Knife
|
|
25
|
+
|
|
26
|
+
deps do
|
|
27
|
+
require 'chef/cookbook_version'
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
banner "knife cookbook download COOKBOOK [VERSION] (options)"
|
|
31
|
+
|
|
32
|
+
option :latest,
|
|
33
|
+
:short => "-N",
|
|
34
|
+
:long => "--latest",
|
|
35
|
+
:description => "The version of the cookbook to download",
|
|
36
|
+
:boolean => true
|
|
37
|
+
|
|
38
|
+
option :download_directory,
|
|
39
|
+
:short => "-d DOWNLOAD_DIRECTORY",
|
|
40
|
+
:long => "--dir DOWNLOAD_DIRECTORY",
|
|
41
|
+
:description => "The directory to download the cookbook into",
|
|
42
|
+
:default => Dir.pwd
|
|
43
|
+
|
|
44
|
+
option :force,
|
|
45
|
+
:short => "-f",
|
|
46
|
+
:long => "--force",
|
|
47
|
+
:description => "Force download over the download directory if it exists"
|
|
48
|
+
|
|
49
|
+
# TODO: tim/cw: 5-23-2010: need to implement knife-side
|
|
50
|
+
# specificity for downloads - need to implement --platform and
|
|
51
|
+
# --fqdn here
|
|
52
|
+
def run
|
|
53
|
+
@cookbook_name, @version = @name_args
|
|
54
|
+
|
|
55
|
+
if @cookbook_name.nil?
|
|
56
|
+
show_usage
|
|
57
|
+
ui.fatal("You must specify a cookbook name")
|
|
58
|
+
exit 1
|
|
59
|
+
elsif @version.nil?
|
|
60
|
+
determine_version
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
ui.info("Downloading #{@cookbook_name} cookbook version #{@version}")
|
|
64
|
+
|
|
65
|
+
cookbook = rest.get_rest("cookbooks/#{@cookbook_name}/#{@version}")
|
|
66
|
+
manifest = cookbook.manifest
|
|
67
|
+
|
|
68
|
+
basedir = File.join(config[:download_directory], "#{@cookbook_name}-#{cookbook.version}")
|
|
69
|
+
if File.exists?(basedir)
|
|
70
|
+
if config[:force]
|
|
71
|
+
Chef::Log.debug("Deleting #{basedir}")
|
|
72
|
+
FileUtils.rm_rf(basedir)
|
|
73
|
+
else
|
|
74
|
+
ui.fatal("Directory #{basedir} exists, use --force to overwrite")
|
|
75
|
+
exit
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
Chef::CookbookVersion::COOKBOOK_SEGMENTS.each do |segment|
|
|
80
|
+
next unless manifest.has_key?(segment)
|
|
81
|
+
ui.info("Downloading #{segment}")
|
|
82
|
+
manifest[segment].each do |segment_file|
|
|
83
|
+
dest = File.join(basedir, segment_file['path'].gsub('/', File::SEPARATOR))
|
|
84
|
+
Chef::Log.debug("Downloading #{segment_file['path']} to #{dest}")
|
|
85
|
+
FileUtils.mkdir_p(File.dirname(dest))
|
|
86
|
+
rest.sign_on_redirect = false
|
|
87
|
+
tempfile = rest.get_rest(segment_file['url'], true)
|
|
88
|
+
FileUtils.mv(tempfile.path, dest)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
ui.info("Cookbook downloaded to #{basedir}")
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def determine_version
|
|
95
|
+
if available_versions.size == 1
|
|
96
|
+
@version = available_versions.first
|
|
97
|
+
elsif config[:latest]
|
|
98
|
+
@version = available_versions.map { |v| Chef::Version.new(v) }.sort.last
|
|
99
|
+
else
|
|
100
|
+
ask_which_version
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def available_versions
|
|
105
|
+
@available_versions ||= begin
|
|
106
|
+
versions = Chef::CookbookVersion.available_versions(@cookbook_name).map do |version|
|
|
107
|
+
Chef::Version.new(version)
|
|
108
|
+
end
|
|
109
|
+
versions.sort!
|
|
110
|
+
versions
|
|
111
|
+
end
|
|
112
|
+
#pp :available_versions => @available_versions
|
|
113
|
+
@available_versions
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def ask_which_version
|
|
117
|
+
question = "Which version do you want to download?\n"
|
|
118
|
+
valid_responses = {}
|
|
119
|
+
available_versions.each_with_index do |version, index|
|
|
120
|
+
valid_responses[(index + 1).to_s] = version
|
|
121
|
+
question << "#{index + 1}. #{@cookbook_name} #{version}\n"
|
|
122
|
+
end
|
|
123
|
+
question += "\n"
|
|
124
|
+
response = ask_question(question).strip
|
|
125
|
+
|
|
126
|
+
unless @version = valid_responses[response]
|
|
127
|
+
ui.error("'#{response}' is not a valid value.")
|
|
128
|
+
exit(1)
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Author:: Nuo Yan (<nuo@opscode.com>)
|
|
4
|
+
# Copyright:: Copyright (c) 2009, 2010, 2011 Opscode, Inc.
|
|
5
|
+
# License:: Apache License, Version 2.0
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
#
|
|
19
|
+
|
|
20
|
+
require 'chef/knife'
|
|
21
|
+
|
|
22
|
+
class Chef
|
|
23
|
+
class Knife
|
|
24
|
+
class CookbookList < Knife
|
|
25
|
+
|
|
26
|
+
banner "knife cookbook list (options)"
|
|
27
|
+
|
|
28
|
+
option :with_uri,
|
|
29
|
+
:short => "-w",
|
|
30
|
+
:long => "--with-uri",
|
|
31
|
+
:description => "Show corresponding URIs"
|
|
32
|
+
|
|
33
|
+
option :all_versions,
|
|
34
|
+
:short => "-a",
|
|
35
|
+
:long => "--show-all-versions",
|
|
36
|
+
:description => "Show all available versions."
|
|
37
|
+
|
|
38
|
+
def run
|
|
39
|
+
env = config[:environment]
|
|
40
|
+
num_versions = config[:all_versions] ? "num_versions=all" : "num_versions=1"
|
|
41
|
+
api_endpoint = env ? "/environments/#{env}/cookbooks?#{num_versions}" : "/cookbooks?#{num_versions}"
|
|
42
|
+
ui.info("Showing latest versions. Use --show-all to list all available versions.") unless config[:all_versions]
|
|
43
|
+
output(format_cookbook_list_for_display(rest.get_rest(api_endpoint)))
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#
|
|
2
|
+
#
|
|
3
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
4
|
+
# Copyright:: Copyright (c) 2009 Opscode, Inc.
|
|
5
|
+
# License:: Apache License, Version 2.0
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
#
|
|
19
|
+
|
|
20
|
+
require 'chef/knife'
|
|
21
|
+
|
|
22
|
+
class Chef
|
|
23
|
+
class Knife
|
|
24
|
+
class CookbookMetadata < Knife
|
|
25
|
+
|
|
26
|
+
deps do
|
|
27
|
+
require 'chef/cookbook/metadata'
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
banner "knife cookbook metadata COOKBOOK (options)"
|
|
31
|
+
|
|
32
|
+
option :cookbook_path,
|
|
33
|
+
:short => "-o PATH:PATH",
|
|
34
|
+
:long => "--cookbook-path PATH:PATH",
|
|
35
|
+
:description => "A colon-separated path to look for cookbooks in",
|
|
36
|
+
:proc => lambda { |o| o.split(":") }
|
|
37
|
+
|
|
38
|
+
option :all,
|
|
39
|
+
:short => "-a",
|
|
40
|
+
:long => "--all",
|
|
41
|
+
:description => "Generate metadata for all cookbooks, rather than just a single cookbook"
|
|
42
|
+
|
|
43
|
+
def run
|
|
44
|
+
config[:cookbook_path] ||= Chef::Config[:cookbook_path]
|
|
45
|
+
|
|
46
|
+
if config[:all]
|
|
47
|
+
cl = Chef::CookbookLoader.new(config[:cookbook_path])
|
|
48
|
+
cl.each do |cname, cookbook|
|
|
49
|
+
generate_metadata(cname.to_s)
|
|
50
|
+
end
|
|
51
|
+
else
|
|
52
|
+
generate_metadata(@name_args[0])
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def generate_metadata(cookbook)
|
|
57
|
+
ui.info("Generating Metadata")
|
|
58
|
+
Array(config[:cookbook_path]).reverse.each do |path|
|
|
59
|
+
file = File.expand_path(File.join(path, cookbook, 'metadata.rb'))
|
|
60
|
+
if File.exists?(file)
|
|
61
|
+
generate_metadata_from_file(cookbook, file)
|
|
62
|
+
else
|
|
63
|
+
validate_metadata_json(path, cookbook)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def generate_metadata_from_file(cookbook, file)
|
|
69
|
+
Chef::Log.debug("Generating metadata for #{cookbook} from #{file}")
|
|
70
|
+
md = Chef::Cookbook::Metadata.new
|
|
71
|
+
md.name(cookbook)
|
|
72
|
+
md.from_file(file)
|
|
73
|
+
json_file = File.join(File.dirname(file), 'metadata.json')
|
|
74
|
+
File.open(json_file, "w") do |f|
|
|
75
|
+
f.write(Chef::JSONCompat.to_json_pretty(md))
|
|
76
|
+
end
|
|
77
|
+
generated = true
|
|
78
|
+
Chef::Log.debug("Generated #{json_file}")
|
|
79
|
+
rescue Exceptions::ObsoleteDependencySyntax, Exceptions::InvalidVersionConstraint => e
|
|
80
|
+
STDERR.puts "ERROR: The cookbook '#{cookbook}' contains invalid or obsolete metadata syntax."
|
|
81
|
+
STDERR.puts "in #{file}:"
|
|
82
|
+
STDERR.puts
|
|
83
|
+
STDERR.puts e.message
|
|
84
|
+
exit 1
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def validate_metadata_json(path, cookbook)
|
|
88
|
+
json_file = File.join(path, cookbook, 'metadata.json')
|
|
89
|
+
if File.exist?(json_file)
|
|
90
|
+
Chef::Cookbook::Metadata.validate_json(IO.read(json_file))
|
|
91
|
+
end
|
|
92
|
+
rescue Exceptions::ObsoleteDependencySyntax, Exceptions::InvalidVersionConstraint => e
|
|
93
|
+
STDERR.puts "ERROR: The cookbook '#{cookbook}' contains invalid or obsolete metadata syntax."
|
|
94
|
+
STDERR.puts "in #{json_file}:"
|
|
95
|
+
STDERR.puts
|
|
96
|
+
STDERR.puts e.message
|
|
97
|
+
exit 1
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#
|
|
2
|
+
#
|
|
3
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
4
|
+
# Author:: Matthew Kent (<mkent@magoazul.com>)
|
|
5
|
+
# Copyright:: Copyright (c) 2009 Opscode, Inc.
|
|
6
|
+
# Copyright:: Copyright (c) 2010 Matthew Kent
|
|
7
|
+
# License:: Apache License, Version 2.0
|
|
8
|
+
#
|
|
9
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
10
|
+
# you may not use this file except in compliance with the License.
|
|
11
|
+
# You may obtain a copy of the License at
|
|
12
|
+
#
|
|
13
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
14
|
+
#
|
|
15
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
16
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
17
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
18
|
+
# See the License for the specific language governing permissions and
|
|
19
|
+
# limitations under the License.
|
|
20
|
+
#
|
|
21
|
+
|
|
22
|
+
require 'chef/knife'
|
|
23
|
+
|
|
24
|
+
class Chef
|
|
25
|
+
class Knife
|
|
26
|
+
class CookbookMetadataFromFile < Knife
|
|
27
|
+
|
|
28
|
+
deps do
|
|
29
|
+
require 'chef/cookbook/metadata'
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
banner "knife cookbook metadata from FILE (options)"
|
|
33
|
+
|
|
34
|
+
def run
|
|
35
|
+
file = @name_args[0]
|
|
36
|
+
cookbook = File.basename(File.dirname(file))
|
|
37
|
+
|
|
38
|
+
@metadata = Chef::Knife::CookbookMetadata.new
|
|
39
|
+
@metadata.generate_metadata_from_file(cookbook, file)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2009 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'chef/knife'
|
|
20
|
+
|
|
21
|
+
class Chef
|
|
22
|
+
class Knife
|
|
23
|
+
class CookbookShow < Knife
|
|
24
|
+
|
|
25
|
+
deps do
|
|
26
|
+
require 'chef/json_compat'
|
|
27
|
+
require 'uri'
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
banner "knife cookbook show COOKBOOK [VERSION] [PART] [FILENAME] (options)"
|
|
31
|
+
|
|
32
|
+
option :fqdn,
|
|
33
|
+
:short => "-f FQDN",
|
|
34
|
+
:long => "--fqdn FQDN",
|
|
35
|
+
:description => "The FQDN of the host to see the file for"
|
|
36
|
+
|
|
37
|
+
option :platform,
|
|
38
|
+
:short => "-p PLATFORM",
|
|
39
|
+
:long => "--platform PLATFORM",
|
|
40
|
+
:description => "The platform to see the file for"
|
|
41
|
+
|
|
42
|
+
option :platform_version,
|
|
43
|
+
:short => "-V VERSION",
|
|
44
|
+
:long => "--platform-version VERSION",
|
|
45
|
+
:description => "The platform version to see the file for"
|
|
46
|
+
|
|
47
|
+
option :with_uri,
|
|
48
|
+
:short => "-w",
|
|
49
|
+
:long => "--with-uri",
|
|
50
|
+
:description => "Show corresponding URIs"
|
|
51
|
+
|
|
52
|
+
def run
|
|
53
|
+
case @name_args.length
|
|
54
|
+
when 4 # We are showing a specific file
|
|
55
|
+
node = Hash.new
|
|
56
|
+
node[:fqdn] = config[:fqdn] if config.has_key?(:fqdn)
|
|
57
|
+
node[:platform] = config[:platform] if config.has_key?(:platform)
|
|
58
|
+
node[:platform_version] = config[:platform_version] if config.has_key?(:platform_version)
|
|
59
|
+
|
|
60
|
+
class << node
|
|
61
|
+
def attribute?(name)
|
|
62
|
+
has_key?(name)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
cookbook_name, segment, filename = @name_args[0], @name_args[2], @name_args[3]
|
|
67
|
+
cookbook_version = @name_args[1] == 'latest' ? '_latest' : @name_args[1]
|
|
68
|
+
|
|
69
|
+
cookbook = rest.get_rest("cookbooks/#{cookbook_name}/#{cookbook_version}")
|
|
70
|
+
manifest_entry = cookbook.preferred_manifest_record(node, segment, filename)
|
|
71
|
+
temp_file = rest.get_rest(manifest_entry[:url], true)
|
|
72
|
+
|
|
73
|
+
# the temp file is cleaned up elsewhere
|
|
74
|
+
temp_file.open if temp_file.closed?
|
|
75
|
+
pretty_print(temp_file.read)
|
|
76
|
+
|
|
77
|
+
when 3 # We are showing a specific part of the cookbook
|
|
78
|
+
cookbook_version = @name_args[1] == 'latest' ? '_latest' : @name_args[1]
|
|
79
|
+
result = rest.get_rest("cookbooks/#{@name_args[0]}/#{cookbook_version}")
|
|
80
|
+
output(result.manifest[@name_args[2]])
|
|
81
|
+
when 2 # We are showing the whole cookbook data
|
|
82
|
+
cookbook_version = @name_args[1] == 'latest' ? '_latest' : @name_args[1]
|
|
83
|
+
output(rest.get_rest("cookbooks/#{@name_args[0]}/#{cookbook_version}"))
|
|
84
|
+
when 1 # We are showing the cookbook versions (all of them)
|
|
85
|
+
cookbook_name = @name_args[0]
|
|
86
|
+
env = config[:environment]
|
|
87
|
+
api_endpoint = env ? "environments/#{env}/cookbooks/#{cookbook_name}" : "cookbooks/#{cookbook_name}"
|
|
88
|
+
output(format_cookbook_list_for_display(rest.get_rest(api_endpoint)))
|
|
89
|
+
when 0
|
|
90
|
+
show_usage
|
|
91
|
+
ui.fatal("You must specify a cookbook name")
|
|
92
|
+
exit 1
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
2
|
+
# Copyright:: Copyright (c) 2009 Opscode, Inc.
|
|
3
|
+
# License:: Apache License, Version 2.0
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
require 'chef/knife'
|
|
19
|
+
|
|
20
|
+
class Chef
|
|
21
|
+
class Knife
|
|
22
|
+
class CookbookSiteDownload < Knife
|
|
23
|
+
|
|
24
|
+
attr_reader :version
|
|
25
|
+
|
|
26
|
+
banner "knife cookbook site download COOKBOOK [VERSION] (options)"
|
|
27
|
+
category "cookbook site"
|
|
28
|
+
|
|
29
|
+
option :file,
|
|
30
|
+
:short => "-f FILE",
|
|
31
|
+
:long => "--file FILE",
|
|
32
|
+
:description => "The filename to write to"
|
|
33
|
+
|
|
34
|
+
def run
|
|
35
|
+
if @name_args.length == 1
|
|
36
|
+
current = rest.get_rest("http://cookbooks.opscode.com/api/v1/cookbooks/#{name_args[0]}")
|
|
37
|
+
cookbook_data = rest.get_rest(current["latest_version"])
|
|
38
|
+
else
|
|
39
|
+
cookbook_data = rest.get_rest("http://cookbooks.opscode.com/api/v1/cookbooks/#{name_args[0]}/versions/#{name_args[1].gsub('.', '_')}")
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
@version = cookbook_data['version']
|
|
43
|
+
|
|
44
|
+
ui.info("Downloading #{@name_args[0]} from the cookbooks site at version #{cookbook_data['version']}")
|
|
45
|
+
rest.sign_on_redirect = false
|
|
46
|
+
tf = rest.get_rest(cookbook_data["file"], true)
|
|
47
|
+
unless config[:file]
|
|
48
|
+
config[:file] = File.join(Dir.pwd, "#{@name_args[0]}-#{cookbook_data['version']}.tar.gz")
|
|
49
|
+
end
|
|
50
|
+
FileUtils.cp(tf.path, config[:file])
|
|
51
|
+
ui.info("Cookbook saved: #{config[:file]}")
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
|