Updated mcollective.init according to OSCI-658
[packages/precise/mcollective.git] / plugins / mcollective / pluginpackager / rpmpackage_packager.rb
diff --git a/plugins/mcollective/pluginpackager/rpmpackage_packager.rb b/plugins/mcollective/pluginpackager/rpmpackage_packager.rb
new file mode 100644 (file)
index 0000000..bb6c625
--- /dev/null
@@ -0,0 +1,97 @@
+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