Added mcollective 2.3.1 package
[packages/trusty/mcollective.git] / plugins / mcollective / pluginpackager / debpackage_packager.rb
1 module MCollective
2   module PluginPackager
3     class DebpackagePackager
4
5       require 'erb'
6       attr_accessor :plugin, :current_package, :tmpdir, :verbose, :libdir
7       attr_accessor :workingdir, :preinstall, :postinstall, :current_package_type
8       attr_accessor :current_package_data, :current_package_shortname
9       attr_accessor :current_package_fullname, :build_dir, :signature
10
11       def initialize(plugin, pluginpath = nil, signature = nil, verbose = false)
12         raise RuntimeError, "package 'debuild' is not installed" unless PluginPackager.build_tool?("debuild")
13         @plugin = plugin
14         @verbose = verbose
15         @libdir = pluginpath || "/usr/share/mcollective/plugins/mcollective/"
16         @signature = signature
17         @tmpdir = ""
18         @build_dir = ""
19         @targetdir = ""
20       end
21
22       def create_packages
23         @plugin.packagedata.each do |type, data|
24           begin
25             @tmpdir = Dir.mktmpdir("mcollective_packager")
26             @current_package_type = type
27             @current_package_data = data
28             @current_package_shortname = "#{@plugin.mcname}-#{@plugin.metadata[:name]}-#{@current_package_type}"
29             @current_package_fullname = "#{@plugin.mcname}-#{@plugin.metadata[:name]}-#{@current_package_type}" +
30                                         "_#{@plugin.metadata[:version]}-#{@plugin.iteration}"
31
32             @build_dir = File.join(@tmpdir, "#{@current_package_shortname}_#{@plugin.metadata[:version]}")
33             Dir.mkdir @build_dir
34
35             prepare_tmpdirs data
36             create_package
37             move_packages
38           rescue Exception => e
39             raise e
40           ensure
41             cleanup_tmpdirs
42           end
43         end
44       end
45
46       def create_package
47         begin
48           ["control", "Makefile", "compat", "rules", "copyright", "changelog"].each do |filename|
49             create_file(filename)
50           end
51           create_tar
52           create_install
53           create_preandpost_install
54
55           FileUtils.cd @build_dir do |f|
56             PluginPackager.do_quietly?(@verbose) do
57               if @signature
58                 if @signature.is_a? String
59                   PluginPackager.safe_system "debuild -i -k#{@signature}"
60                 else
61                   PluginPackager.safe_system "debuild -i"
62                 end
63               else
64                 PluginPackager.safe_system "debuild -i -us -uc"
65               end
66             end
67           end
68
69           puts "Created package #{@current_package_fullname}"
70         rescue Exception => e
71           raise RuntimeError, "Could not build package - #{e}"
72         end
73       end
74
75       def move_packages
76         begin
77           FileUtils.cp(Dir.glob(File.join(@tmpdir, "*.{deb,dsc,diff.gz,orig.tar.gz,changes}")), ".")
78         rescue Exception => e
79           raise RuntimeError, "Could not copy packages to working directory: '#{e}'"
80         end
81       end
82
83       def create_preandpost_install
84         if @plugin.preinstall
85           raise RuntimeError, "pre-install script '#{@plugin.preinstall}' not found"  unless File.exists?(@plugin.preinstall)
86           FileUtils.cp(@plugin.preinstall, File.join(@build_dir, 'debian', "#{@current_package_shortname}.preinst"))
87         end
88
89         if @plugin.postinstall
90           raise RuntimeError, "post-install script '#{@plugin.postinstall}' not found" unless File.exists?(@plugin.postinstall)
91           FileUtils.cp(@plugin.postinstall, File.join(@build_dir, 'debian', "#{@current_package_shortname}.postinst"))
92         end
93
94       end
95
96       def create_install
97         begin
98           File.open(File.join(@build_dir, "debian", "#{@current_package_shortname}.install"), "w") do |f|
99             @current_package_data[:files].each do |filename|
100               extended_filename = File.join(@libdir, File.expand_path(filename).gsub(/#{File.expand_path(plugin.path)}|\.\//, ''))
101               f.puts "#{extended_filename} #{File.dirname(extended_filename)}"
102             end
103           end
104         rescue Exception => e
105           raise RuntimeError, "Could not create install file - #{e}"
106         end
107       end
108
109       def create_tar
110         begin
111           PluginPackager.do_quietly?(@verbose) do
112             Dir.chdir(@tmpdir) do
113               PluginPackager.safe_system "tar -Pcvzf #{File.join(@tmpdir,"#{@current_package_shortname}_#{@plugin.metadata[:version]}.orig.tar.gz")} #{@current_package_shortname}_#{@plugin.metadata[:version]}"
114             end
115           end
116         rescue Exception => e
117           raise "Could not create tarball - #{e}"
118         end
119       end
120
121       def create_file(filename)
122         begin
123           file = ERB.new(File.read(File.join(File.dirname(__FILE__), "templates", "debian", "#{filename}.erb")), nil, "-")
124           File.open(File.join(@build_dir, "debian", filename), "w") do |f|
125             f.puts file.result(binding)
126           end
127         rescue Exception => e
128           raise RuntimeError, "could not create #{filename} file - #{e}"
129         end
130       end
131
132       def prepare_tmpdirs(data)
133         data[:files].each do |file|
134           @targetdir = File.join(@build_dir, @libdir, File.dirname(File.expand_path(file)).gsub(@plugin.target_path, ""))
135           FileUtils.mkdir_p(@targetdir) unless File.directory? @targetdir
136           FileUtils.cp_r(file, @targetdir)
137         end
138
139         FileUtils.mkdir_p(File.join(@build_dir, "debian"))
140       end
141
142       def cleanup_tmpdirs
143         FileUtils.rm_r @tmpdir if File.directory? @tmpdir
144       end
145     end
146   end
147 end