X-Git-Url: https://review.fuel-infra.org/gitweb?a=blobdiff_plain;f=plugins%2Fmcollective%2Fpluginpackager%2Fdebpackage_packager.rb;fp=plugins%2Fmcollective%2Fpluginpackager%2Fdebpackage_packager.rb;h=d743ca6df23c808be62d7708a6c6e3e8cea71a40;hb=b87d2f4e68281062df1913440ca5753ae63314a9;hp=0000000000000000000000000000000000000000;hpb=ab0ea530b8ac956091f17b104ab2311336cfc250;p=packages%2Fprecise%2Fmcollective.git diff --git a/plugins/mcollective/pluginpackager/debpackage_packager.rb b/plugins/mcollective/pluginpackager/debpackage_packager.rb new file mode 100644 index 0000000..d743ca6 --- /dev/null +++ b/plugins/mcollective/pluginpackager/debpackage_packager.rb @@ -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