--- /dev/null
+module MCollective
+ module PluginPackager
+ class ModulepackagePackager
+ require 'erb'
+
+ def initialize(plugin, pluginpath = nil, signature = nil, verbose = false, keep_artifacts = nil, module_template = nil)
+ assert_new_enough_puppet
+ @plugin = plugin
+ @package_name = "#{@plugin.mcname}_#{@plugin.metadata[:name]}".gsub(/-/, '_')
+ @verbose = verbose
+ @keep_artifacts = keep_artifacts
+ @module_template = module_template || File.join(File.dirname(__FILE__), 'templates', 'module')
+ end
+
+ # Build Process :
+ # - create module directory
+ # - run 'puppet module build'
+ # - move generated package back to cwd
+ def create_packages
+ begin
+ puts "Building module for #{@package_name} plugin."
+
+ @tmpdir = Dir.mktmpdir('mcollective_packager')
+ make_module
+ run_build
+ move_package
+
+ puts "Completed building module for #{@package_name} plugin."
+ ensure
+ if @keep_artifacts
+ puts 'Keeping build artifacts'
+ puts "Build artifacts saved - #{@tmpdir}"
+ else
+ cleanup_tmpdirs
+ end
+ end
+ end
+
+ private
+
+ def assert_new_enough_puppet
+ unless PluginPackager.command_available?('puppet')
+ raise("Cannot build package. 'puppet' is not present on the system.")
+ end
+
+ s = Shell.new('puppet --version')
+ s.runcommand
+ actual_version = s.stdout.chomp
+
+ required_version = '3.3.0'
+ if Util.versioncmp(actual_version, required_version) < 0
+ raise("Cannot build package. puppet #{required_version} or greater required. We have #{actual_version}.")
+ end
+ end
+
+ def make_module
+ targetdir = File.join(@tmpdir, 'manifests')
+ FileUtils.mkdir_p(targetdir) unless File.directory?(targetdir)
+
+ # for each subpackage make a subclass
+ @plugin.packagedata.each do |klass,data|
+ data[:files].each do |file|
+ relative_path = file.sub(/^\.\//, '')
+ targetdir = File.join(@tmpdir, 'files', klass.to_s, 'mcollective', File.dirname(relative_path))
+ FileUtils.mkdir_p(targetdir) unless File.directory?(targetdir)
+ FileUtils.cp_r(file, targetdir)
+ end
+
+ @klass = klass.to_s
+ render_template('_manifest.pp.erb', File.join(@tmpdir, 'manifests', "#{klass}.pp"))
+ end
+
+ # render all the templates we have
+ Dir.glob(File.join(@module_template, '*.erb')).each do |template|
+ filename = File.basename(template, '.erb')
+ next if filename =~ /^_/ # starting with underscore makes it private
+ render_template("#{filename}.erb", File.join(@tmpdir, filename))
+ end
+ end
+
+ def render_template(template, path)
+ begin
+ erb = ERB.new(File.read(File.join(@module_template, template)), nil, '-')
+ File.open(path, 'w') do |f|
+ f.puts erb.result(binding)
+ end
+ rescue => e
+ puts "Could not render template to path - '#{path}'"
+ raise e
+ end
+ end
+
+ def run_build
+ begin
+ PluginPackager.execute_verbosely(@verbose) do
+ Dir.chdir(@tmpdir) do
+ PluginPackager.safe_system('puppet module build')
+ end
+ end
+ rescue => e
+ puts 'Build process has failed'
+ raise e
+ end
+ end
+
+ # Move built package to cwd
+ def move_package
+ begin
+ package_file = File.join(@tmpdir, 'pkg', "#{@plugin.vendor}-#{@package_name}-#{@plugin.metadata[:version]}.tar.gz")
+ FileUtils.cp(package_file, '.')
+ rescue => e
+ puts 'Could not copy package to working directory'
+ raise e
+ end
+ end
+
+ def cleanup_tmpdirs
+ begin
+ FileUtils.rm_r(@tmpdir) if File.directory?(@tmpdir)
+ rescue => e
+ puts "Could not remove temporary build directory - '#{@tmpdir}'"
+ raise e
+ end
+ end
+ end
+ end
+end