summaryrefslogtreecommitdiff
path: root/lib/chef/knife/cookbook_create.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/chef/knife/cookbook_create.rb')
-rw-r--r--lib/chef/knife/cookbook_create.rb297
1 files changed, 297 insertions, 0 deletions
diff --git a/lib/chef/knife/cookbook_create.rb b/lib/chef/knife/cookbook_create.rb
new file mode 100644
index 0000000000..c2e92e6b42
--- /dev/null
+++ b/lib/chef/knife/cookbook_create.rb
@@ -0,0 +1,297 @@
+#
+# Author:: Nuo Yan (<nuo@opscode.com>)
+# Copyright:: Copyright (c) 2009 Opscode, Inc.
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+require 'chef/knife'
+
+class Chef
+ class Knife
+ class CookbookCreate < Knife
+
+ deps do
+ require 'chef/json_compat'
+ require 'uri'
+ require 'fileutils'
+ end
+
+ banner "knife cookbook create COOKBOOK (options)"
+
+ option :cookbook_path,
+ :short => "-o PATH",
+ :long => "--cookbook-path PATH",
+ :description => "The directory where the cookbook will be created"
+
+ option :readme_format,
+ :short => "-r FORMAT",
+ :long => "--readme-format FORMAT",
+ :description => "Format of the README file, supported formats are 'md' (markdown) and 'rdoc' (rdoc)"
+
+ option :cookbook_license,
+ :short => "-I LICENSE",
+ :long => "--license LICENSE",
+ :description => "License for cookbook, apachev2, gplv2, gplv3, mit or none"
+
+ option :cookbook_copyright,
+ :short => "-C COPYRIGHT",
+ :long => "--copyright COPYRIGHT",
+ :description => "Name of Copyright holder"
+
+ option :cookbook_email,
+ :short => "-m EMAIL",
+ :long => "--email EMAIL",
+ :description => "Email address of cookbook maintainer"
+
+ def run
+ self.config = Chef::Config.merge!(config)
+ if @name_args.length < 1
+ show_usage
+ ui.fatal("You must specify a cookbook name")
+ exit 1
+ end
+
+ if default_cookbook_path_empty? && parameter_empty?(config[:cookbook_path])
+ raise ArgumentError, "Default cookbook_path is not specified in the knife.rb config file, and a value to -o is not provided. Nowhere to write the new cookbook to."
+ end
+
+ cookbook_path = File.expand_path(Array(config[:cookbook_path]).first)
+ cookbook_name = @name_args.first
+ copyright = config[:cookbook_copyright] || "YOUR_COMPANY_NAME"
+ email = config[:cookbook_email] || "YOUR_EMAIL"
+ license = ((config[:cookbook_license] != "false") && config[:cookbook_license]) || "none"
+ readme_format = ((config[:readme_format] != "false") && config[:readme_format]) || "md"
+ create_cookbook(cookbook_path,cookbook_name, copyright, license)
+ create_readme(cookbook_path,cookbook_name,readme_format)
+ create_changelog(cookbook_path,cookbook_name)
+ create_metadata(cookbook_path,cookbook_name, copyright, email, license,readme_format)
+ end
+
+ def create_cookbook(dir, cookbook_name, copyright, license)
+ msg("** Creating cookbook #{cookbook_name}")
+ FileUtils.mkdir_p "#{File.join(dir, cookbook_name, "attributes")}"
+ FileUtils.mkdir_p "#{File.join(dir, cookbook_name, "recipes")}"
+ FileUtils.mkdir_p "#{File.join(dir, cookbook_name, "definitions")}"
+ FileUtils.mkdir_p "#{File.join(dir, cookbook_name, "libraries")}"
+ FileUtils.mkdir_p "#{File.join(dir, cookbook_name, "resources")}"
+ FileUtils.mkdir_p "#{File.join(dir, cookbook_name, "providers")}"
+ FileUtils.mkdir_p "#{File.join(dir, cookbook_name, "files", "default")}"
+ FileUtils.mkdir_p "#{File.join(dir, cookbook_name, "templates", "default")}"
+ unless File.exists?(File.join(dir, cookbook_name, "recipes", "default.rb"))
+ open(File.join(dir, cookbook_name, "recipes", "default.rb"), "w") do |file|
+ file.puts <<-EOH
+#
+# Cookbook Name:: #{cookbook_name}
+# Recipe:: default
+#
+# Copyright #{Time.now.year}, #{copyright}
+#
+EOH
+ case license
+ when "apachev2"
+ file.puts <<-EOH
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+EOH
+ when "gplv2"
+ file.puts <<-EOH
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+EOH
+ when "gplv3"
+ file.puts <<-EOH
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+EOH
+ when "mit"
+ file.puts <<-EOH
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+EOH
+ when "none"
+ file.puts <<-EOH
+# All rights reserved - Do Not Redistribute
+#
+EOH
+ end
+ end
+ end
+ end
+
+ def create_changelog(dir, cookbook_name)
+ msg("** Creating CHANGELOG for cookbook: #{cookbook_name}")
+ unless File.exists?(File.join(dir,cookbook_name,'CHANGELOG.md'))
+ open(File.join(dir, cookbook_name, 'CHANGELOG.md'),'w') do |file|
+ file.puts <<-EOH
+# CHANGELOG for #{cookbook_name}
+
+This file is used to list changes made in each version of #{cookbook_name}.
+
+## 0.1.0:
+
+* Initial release of #{cookbook_name}
+
+- - -
+Check the [Markdown Syntax Guide](http://daringfireball.net/projects/markdown/syntax) for help with Markdown.
+
+The [Github Flavored Markdown page](http://github.github.com/github-flavored-markdown/) describes the differences between markdown on github and standard markdown.
+EOH
+ end
+ end
+ end
+
+ def create_readme(dir, cookbook_name,readme_format)
+ msg("** Creating README for cookbook: #{cookbook_name}")
+ unless File.exists?(File.join(dir, cookbook_name, "README.#{readme_format}"))
+ open(File.join(dir, cookbook_name, "README.#{readme_format}"), "w") do |file|
+ case readme_format
+ when "rdoc"
+ file.puts <<-EOH
+= DESCRIPTION:
+
+= REQUIREMENTS:
+
+= ATTRIBUTES:
+
+= USAGE:
+
+EOH
+ when "md","mkd","txt"
+ file.puts <<-EOH
+Description
+===========
+
+Requirements
+============
+
+Attributes
+==========
+
+Usage
+=====
+
+EOH
+ else
+ file.puts <<-EOH
+Description
+
+Requirements
+
+Attributes
+
+Usage
+
+EOH
+ end
+ end
+ end
+ end
+
+ def create_metadata(dir, cookbook_name, copyright, email, license,readme_format)
+ msg("** Creating metadata for cookbook: #{cookbook_name}")
+
+ license_name = case license
+ when "apachev2"
+ "Apache 2.0"
+ when "gplv2"
+ "GNU Public License 2.0"
+ when "gplv3"
+ "GNU Public License 3.0"
+ when "mit"
+ "MIT"
+ when "none"
+ "All rights reserved"
+ end
+
+ unless File.exists?(File.join(dir, cookbook_name, "metadata.rb"))
+ open(File.join(dir, cookbook_name, "metadata.rb"), "w") do |file|
+ if File.exists?(File.join(dir, cookbook_name, "README.#{readme_format}"))
+ long_description = "long_description IO.read(File.join(File.dirname(__FILE__), 'README.#{readme_format}'))"
+ end
+ file.puts <<-EOH
+maintainer "#{copyright}"
+maintainer_email "#{email}"
+license "#{license_name}"
+description "Installs/Configures #{cookbook_name}"
+#{long_description}
+version "0.1.0"
+EOH
+ end
+ end
+ end
+
+ private
+
+ def default_cookbook_path_empty?
+ Chef::Config[:cookbook_path].nil? || Chef::Config[:cookbook_path].empty?
+ end
+
+ def parameter_empty?(parameter)
+ parameter.nil? || parameter.empty?
+ end
+
+ end
+ end
+end