bb6c62509e7ca79325b59d3cee5cba9fb33cf0d0
[packages/precise/mcollective.git] / plugins / mcollective / pluginpackager / rpmpackage_packager.rb
1 module MCollective
2   module PluginPackager
3     class RpmpackagePackager
4
5       require 'erb'
6       attr_accessor :plugin, :tmpdir, :verbose, :libdir, :workingdir
7       attr_accessor :current_package_type, :current_package_data
8       attr_accessor :current_package_name, :signature
9
10       def initialize(plugin, pluginpath = nil, signature = nil, verbose = false)
11         if(PluginPackager.build_tool?("rpmbuild-md5"))
12           @buildtool = "rpmbuild-md5"
13         elsif(PluginPackager.build_tool?("rpmbuild"))
14           @buildtool = "rpmbuild"
15         else
16           raise RuntimeError, "creating rpms require 'rpmbuild' or 'rpmbuild-md5' to be installed"
17         end
18
19         @plugin = plugin
20         @verbose = verbose
21         @libdir = pluginpath || "/usr/libexec/mcollective/mcollective/"
22         @signature = signature
23         @rpmdir = rpmdir
24         @srpmdir = srpmdir
25       end
26
27       def rpmdir
28         `rpm --eval '%_rpmdir'`.chomp
29       end
30
31       def srpmdir
32         `rpm --eval '%_srcrpmdir'`.chomp
33       end
34
35       def create_packages
36         @plugin.packagedata.each do |type, data|
37           begin
38             @current_package_type = type
39             @current_package_data = data
40             @current_package_name = "#{@plugin.mcname}-#{@plugin.metadata[:name]}-#{@current_package_type}"
41             @tmpdir = Dir.mktmpdir("mcollective_packager")
42             prepare_tmpdirs data
43             create_package type, data
44           rescue Exception => e
45             raise e
46           ensure
47             cleanup_tmpdirs
48           end
49         end
50       end
51
52       def create_package(type, data)
53         begin
54           tarfile = "#{@current_package_name}-#{@plugin.metadata[:version]}.tgz"
55           make_spec_file
56           PluginPackager.do_quietly?(verbose) do
57             Dir.chdir(@tmpdir) do
58               PluginPackager.safe_system("tar -cvzf #{File.join(@tmpdir, tarfile)} #{@current_package_name}-#{@plugin.metadata[:version]}")
59             end
60
61             PluginPackager.safe_system("#{@buildtool} -ta #{"--quiet" unless verbose} #{"--sign" if @signature} #{File.join(@tmpdir, tarfile)}")
62           end
63
64           FileUtils.cp(File.join(@rpmdir, "noarch", "#{@current_package_name}-#{@plugin.metadata[:version]}-#{@plugin.iteration}.noarch.rpm"), ".")
65           FileUtils.cp(File.join(@srpmdir, "#{@current_package_name}-#{@plugin.metadata[:version]}-#{@plugin.iteration}.src.rpm"), ".")
66
67           puts "Created RPM and SRPM packages for #{@current_package_name}"
68         rescue Exception => e
69           raise RuntimeError, "Could not build package. Reason - #{e}"
70         end
71       end
72
73       def make_spec_file
74         begin
75           spec_template = ERB.new(File.read(File.join(File.dirname(__FILE__), "templates", "redhat", "rpm_spec.erb")), nil, "-")
76           File.open(File.join(@tmpdir, "#{@current_package_name}-#{@plugin.metadata[:version]}" ,"#{@current_package_name}-#{@plugin.metadata[:version]}.spec"), "w") do |f|
77             f.puts spec_template.result(binding)
78           end
79         rescue Exception => e
80           raise RuntimeError, "Could not create specfile - #{e}"
81         end
82       end
83
84       def prepare_tmpdirs(data)
85         data[:files].each do |file|
86           targetdir = File.join(@tmpdir, "#{@current_package_name}-#{@plugin.metadata[:version]}", @libdir, File.dirname(File.expand_path(file)).gsub(@plugin.target_path, ""))
87           FileUtils.mkdir_p(targetdir) unless File.directory? targetdir
88           FileUtils.cp_r(file, targetdir)
89         end
90       end
91
92       def cleanup_tmpdirs
93         FileUtils.rm_r @tmpdir if File.directory? @tmpdir
94       end
95     end
96   end
97 end