--- /dev/null
+module MCollective
+ module PluginPackager
+ class RpmpackagePackager
+
+ require 'erb'
+ attr_accessor :plugin, :tmpdir, :verbose, :libdir, :workingdir
+ attr_accessor :current_package_type, :current_package_data
+ attr_accessor :current_package_name, :signature
+
+ def initialize(plugin, pluginpath = nil, signature = nil, verbose = false)
+ if(PluginPackager.build_tool?("rpmbuild-md5"))
+ @buildtool = "rpmbuild-md5"
+ elsif(PluginPackager.build_tool?("rpmbuild"))
+ @buildtool = "rpmbuild"
+ else
+ raise RuntimeError, "creating rpms require 'rpmbuild' or 'rpmbuild-md5' to be installed"
+ end
+
+ @plugin = plugin
+ @verbose = verbose
+ @libdir = pluginpath || "/usr/libexec/mcollective/mcollective/"
+ @signature = signature
+ @rpmdir = rpmdir
+ @srpmdir = srpmdir
+ end
+
+ def rpmdir
+ `rpm --eval '%_rpmdir'`.chomp
+ end
+
+ def srpmdir
+ `rpm --eval '%_srcrpmdir'`.chomp
+ end
+
+ def create_packages
+ @plugin.packagedata.each do |type, data|
+ begin
+ @current_package_type = type
+ @current_package_data = data
+ @current_package_name = "#{@plugin.mcname}-#{@plugin.metadata[:name]}-#{@current_package_type}"
+ @tmpdir = Dir.mktmpdir("mcollective_packager")
+ prepare_tmpdirs data
+ create_package type, data
+ rescue Exception => e
+ raise e
+ ensure
+ cleanup_tmpdirs
+ end
+ end
+ end
+
+ def create_package(type, data)
+ begin
+ tarfile = "#{@current_package_name}-#{@plugin.metadata[:version]}.tgz"
+ make_spec_file
+ PluginPackager.do_quietly?(verbose) do
+ Dir.chdir(@tmpdir) do
+ PluginPackager.safe_system("tar -cvzf #{File.join(@tmpdir, tarfile)} #{@current_package_name}-#{@plugin.metadata[:version]}")
+ end
+
+ PluginPackager.safe_system("#{@buildtool} -ta #{"--quiet" unless verbose} #{"--sign" if @signature} #{File.join(@tmpdir, tarfile)}")
+ end
+
+ FileUtils.cp(File.join(@rpmdir, "noarch", "#{@current_package_name}-#{@plugin.metadata[:version]}-#{@plugin.iteration}.noarch.rpm"), ".")
+ FileUtils.cp(File.join(@srpmdir, "#{@current_package_name}-#{@plugin.metadata[:version]}-#{@plugin.iteration}.src.rpm"), ".")
+
+ puts "Created RPM and SRPM packages for #{@current_package_name}"
+ rescue Exception => e
+ raise RuntimeError, "Could not build package. Reason - #{e}"
+ end
+ end
+
+ def make_spec_file
+ begin
+ spec_template = ERB.new(File.read(File.join(File.dirname(__FILE__), "templates", "redhat", "rpm_spec.erb")), nil, "-")
+ File.open(File.join(@tmpdir, "#{@current_package_name}-#{@plugin.metadata[:version]}" ,"#{@current_package_name}-#{@plugin.metadata[:version]}.spec"), "w") do |f|
+ f.puts spec_template.result(binding)
+ end
+ rescue Exception => e
+ raise RuntimeError, "Could not create specfile - #{e}"
+ end
+ end
+
+ def prepare_tmpdirs(data)
+ data[:files].each do |file|
+ targetdir = File.join(@tmpdir, "#{@current_package_name}-#{@plugin.metadata[:version]}", @libdir, File.dirname(File.expand_path(file)).gsub(@plugin.target_path, ""))
+ FileUtils.mkdir_p(targetdir) unless File.directory? targetdir
+ FileUtils.cp_r(file, targetdir)
+ end
+ end
+
+ def cleanup_tmpdirs
+ FileUtils.rm_r @tmpdir if File.directory? @tmpdir
+ end
+ end
+ end
+end