+module MCollective
+ module PluginPackager
+ # MCollective Agent Plugin package
+ class AgentDefinition
+ attr_accessor :path, :packagedata, :metadata, :target_path, :vendor, :iteration, :preinstall
+ attr_accessor :plugintype, :dependencies, :postinstall, :mcname, :mcversion
+
+ def initialize(path, name, vendor, preinstall, postinstall, iteration, dependencies, mcdependency, plugintype)
+ @plugintype = plugintype
+ @path = path
+ @packagedata = {}
+ @iteration = iteration || 1
+ @preinstall = preinstall
+ @postinstall = postinstall
+ @vendor = vendor || "Puppet Labs"
+ @dependencies = dependencies || []
+ @target_path = File.expand_path(@path)
+ @metadata, mcversion = PluginPackager.get_metadata(@path, "agent")
+ @mcname = mcdependency[:mcname] || "mcollective"
+ @mcversion = mcdependency[:mcversion] || mcversion
+ @dependencies << {:name => "#{@mcname}-common", :version => @mcversion}
+
+ @metadata[:name] = (name || @metadata[:name]).downcase.gsub(/\s+|_/, "-")
+ identify_packages
+ end
+
+ # Identify present packages and populate packagedata hash.
+ def identify_packages
+ common_package = common
+ @packagedata[:common] = common_package if common_package
+ agent_package = agent
+ @packagedata[:agent] = agent_package if agent_package
+ client_package = client
+ @packagedata[:client] = client_package if client_package
+ end
+
+ # Obtain Agent package files and dependencies.
+ def agent
+ agent = {:files => [],
+ :dependencies => @dependencies.clone,
+ :description => "Agent plugin for #{@metadata[:name]}"}
+
+ agentdir = File.join(@path, "agent")
+
+ if PluginPackager.check_dir_present agentdir
+ ddls = Dir.glob(File.join(agentdir, "*.ddl"))
+ agent[:files] = (Dir.glob(File.join(agentdir, "*")) - ddls)
+ else
+ return nil
+ end
+ agent[:plugindependency] = {:name => "#{@mcname}-#{@metadata[:name]}-common", :version => @metadata[:version], :iteration => @iteration}
+ agent
+ end
+
+ # Obtain client package files and dependencies.
+ def client
+ client = {:files => [],
+ :dependencies => @dependencies.clone,
+ :description => "Client plugin for #{@metadata[:name]}"}
+
+ clientdir = File.join(@path, "application")
+ aggregatedir = File.join(@path, "aggregate")
+
+ client[:files] += Dir.glob(File.join(clientdir, "*")) if PluginPackager.check_dir_present clientdir
+ client[:files] += Dir.glob(File.join(aggregatedir, "*")) if PluginPackager.check_dir_present aggregatedir
+ client[:plugindependency] = {:name => "#{@mcname}-#{@metadata[:name]}-common", :version => @metadata[:version], :iteration => @iteration}
+ client[:files].empty? ? nil : client
+ end
+
+ # Obtain common package files and dependencies.
+ def common
+ common = {:files =>[],
+ :dependencies => @dependencies.clone,
+ :description => "Common libraries for #{@metadata[:name]}"}
+
+ datadir = File.join(@path, "data", "**")
+ utildir = File.join(@path, "util", "**", "**")
+ ddldir = File.join(@path, "agent", "*.ddl")
+ validatordir = File.join(@path, "validator", "**")
+
+ [datadir, utildir, validatordir, ddldir].each do |directory|
+ common[:files] += Dir.glob(directory)
+ end
+
+ # We fail if there is no ddl file present
+ if common[:files].grep(/^.*\.ddl$/).empty?
+ raise "cannot create package - No ddl file found in #{File.join(@path, "agent")}"
+ end
+
+ common[:files].empty? ? nil : common
+ end
+ end
+ end
+end