Updated mcollective.init according to OSCI-658
[packages/precise/mcollective.git] / plugins / mcollective / pluginpackager / debpackage_packager.rb
diff --git a/plugins/mcollective/pluginpackager/debpackage_packager.rb b/plugins/mcollective/pluginpackager/debpackage_packager.rb
new file mode 100644 (file)
index 0000000..d743ca6
--- /dev/null
@@ -0,0 +1,147 @@
+module MCollective
+  module PluginPackager
+    class DebpackagePackager
+
+      require 'erb'
+      attr_accessor :plugin, :current_package, :tmpdir, :verbose, :libdir
+      attr_accessor :workingdir, :preinstall, :postinstall, :current_package_type
+      attr_accessor :current_package_data, :current_package_shortname
+      attr_accessor :current_package_fullname, :build_dir, :signature
+
+      def initialize(plugin, pluginpath = nil, signature = nil, verbose = false)
+        raise RuntimeError, "package 'debuild' is not installed" unless PluginPackager.build_tool?("debuild")
+        @plugin = plugin
+        @verbose = verbose
+        @libdir = pluginpath || "/usr/share/mcollective/plugins/mcollective/"
+        @signature = signature
+        @tmpdir = ""
+        @build_dir = ""
+        @targetdir = ""
+      end
+
+      def create_packages
+        @plugin.packagedata.each do |type, data|
+          begin
+            @tmpdir = Dir.mktmpdir("mcollective_packager")
+            @current_package_type = type
+            @current_package_data = data
+            @current_package_shortname = "#{@plugin.mcname}-#{@plugin.metadata[:name]}-#{@current_package_type}"
+            @current_package_fullname = "#{@plugin.mcname}-#{@plugin.metadata[:name]}-#{@current_package_type}" +
+                                        "_#{@plugin.metadata[:version]}-#{@plugin.iteration}"
+
+            @build_dir = File.join(@tmpdir, "#{@current_package_shortname}_#{@plugin.metadata[:version]}")
+            Dir.mkdir @build_dir
+
+            prepare_tmpdirs data
+            create_package
+            move_packages
+          rescue Exception => e
+            raise e
+          ensure
+            cleanup_tmpdirs
+          end
+        end
+      end
+
+      def create_package
+        begin
+          ["control", "Makefile", "compat", "rules", "copyright", "changelog"].each do |filename|
+            create_file(filename)
+          end
+          create_tar
+          create_install
+          create_preandpost_install
+
+          FileUtils.cd @build_dir do |f|
+            PluginPackager.do_quietly?(@verbose) do
+              if @signature
+                if @signature.is_a? String
+                  PluginPackager.safe_system "debuild -i -k#{@signature}"
+                else
+                  PluginPackager.safe_system "debuild -i"
+                end
+              else
+                PluginPackager.safe_system "debuild -i -us -uc"
+              end
+            end
+          end
+
+          puts "Created package #{@current_package_fullname}"
+        rescue Exception => e
+          raise RuntimeError, "Could not build package - #{e}"
+        end
+      end
+
+      def move_packages
+        begin
+          FileUtils.cp(Dir.glob(File.join(@tmpdir, "*.{deb,dsc,diff.gz,orig.tar.gz,changes}")), ".")
+        rescue Exception => e
+          raise RuntimeError, "Could not copy packages to working directory: '#{e}'"
+        end
+      end
+
+      def create_preandpost_install
+        if @plugin.preinstall
+          raise RuntimeError, "pre-install script '#{@plugin.preinstall}' not found"  unless File.exists?(@plugin.preinstall)
+          FileUtils.cp(@plugin.preinstall, File.join(@build_dir, 'debian', "#{@current_package_shortname}.preinst"))
+        end
+
+        if @plugin.postinstall
+          raise RuntimeError, "post-install script '#{@plugin.postinstall}' not found" unless File.exists?(@plugin.postinstall)
+          FileUtils.cp(@plugin.postinstall, File.join(@build_dir, 'debian', "#{@current_package_shortname}.postinst"))
+        end
+
+      end
+
+      def create_install
+        begin
+          File.open(File.join(@build_dir, "debian", "#{@current_package_shortname}.install"), "w") do |f|
+            @current_package_data[:files].each do |filename|
+              extended_filename = File.join(@libdir, File.expand_path(filename).gsub(/#{File.expand_path(plugin.path)}|\.\//, ''))
+              f.puts "#{extended_filename} #{File.dirname(extended_filename)}"
+            end
+          end
+        rescue Exception => e
+          raise RuntimeError, "Could not create install file - #{e}"
+        end
+      end
+
+      def create_tar
+        begin
+          PluginPackager.do_quietly?(@verbose) do
+            Dir.chdir(@tmpdir) do
+              PluginPackager.safe_system "tar -Pcvzf #{File.join(@tmpdir,"#{@current_package_shortname}_#{@plugin.metadata[:version]}.orig.tar.gz")} #{@current_package_shortname}_#{@plugin.metadata[:version]}"
+            end
+          end
+        rescue Exception => e
+          raise "Could not create tarball - #{e}"
+        end
+      end
+
+      def create_file(filename)
+        begin
+          file = ERB.new(File.read(File.join(File.dirname(__FILE__), "templates", "debian", "#{filename}.erb")), nil, "-")
+          File.open(File.join(@build_dir, "debian", filename), "w") do |f|
+            f.puts file.result(binding)
+          end
+        rescue Exception => e
+          raise RuntimeError, "could not create #{filename} file - #{e}"
+        end
+      end
+
+      def prepare_tmpdirs(data)
+        data[:files].each do |file|
+          @targetdir = File.join(@build_dir, @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
+
+        FileUtils.mkdir_p(File.join(@build_dir, "debian"))
+      end
+
+      def cleanup_tmpdirs
+        FileUtils.rm_r @tmpdir if File.directory? @tmpdir
+      end
+    end
+  end
+end