diff options
author | Brice Figureau <brice-puppet@daysofwonder.com> | 2009-02-14 17:15:08 +0100 |
---|---|---|
committer | Brice Figureau <brice-puppet@daysofwonder.com> | 2009-02-16 20:12:10 +0100 |
commit | af219bf45fe58287f1b46bcfd98dfbe548958b33 (patch) | |
tree | ee7d809d7b09bd260dc8f9dcb49479240b0ed35c /lib/puppet/application | |
parent | d51398c3eb3c09a9912fff8b4b7656a9ddb6b873 (diff) | |
download | puppet-af219bf45fe58287f1b46bcfd98dfbe548958b33.tar.gz puppet-af219bf45fe58287f1b46bcfd98dfbe548958b33.tar.xz puppet-af219bf45fe58287f1b46bcfd98dfbe548958b33.zip |
Move puppet to the Application Controller paradigm
Signed-off-by: Brice Figureau <brice-puppet@daysofwonder.com>
Diffstat (limited to 'lib/puppet/application')
-rw-r--r-- | lib/puppet/application/puppet.rb | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/lib/puppet/application/puppet.rb b/lib/puppet/application/puppet.rb new file mode 100644 index 000000000..c8ca81975 --- /dev/null +++ b/lib/puppet/application/puppet.rb @@ -0,0 +1,145 @@ +require 'puppet' +require 'puppet/application' +require 'puppet/network/handler' +require 'puppet/network/client' + +Puppet::Application.new(:puppet) do + + should_parse_config + + option("--debug","-d") + option("--execute EXECUTE","-e") + option("--loadclasses","-L") + option("--verbose","-v") + option("--use-nodes") + option("--detailed-exitcodes") + + option("--logdest LOGDEST", "-l") do |arg| + begin + Puppet::Util::Log.newdestination(arg) + options[:logset] = true + rescue => detail + $stderr.puts detail.to_s + end + end + + option("--version", "-V") do |arg| + puts "%s" % Puppet.version + exit + end + + dispatch do + return Puppet[:parseonly] ? :parseonly : :main + end + + command(:parseonly) do + begin + Puppet::Parser::Interpreter.new.parser(Puppet[:environment]) + rescue => detail + Puppet.err detail + exit 1 + end + exit 0 + end + + command(:main) do + # Collect our facts. + facts = Puppet::Node::Facts.find(Puppet[:certname]) + + # Find our Node + unless node = Puppet::Node.find(Puppet[:certname]) + raise "Could not find node %s" % Puppet[:certname] + end + + # Merge in the facts. + node.merge(facts.values) + + # Allow users to load the classes that puppetd creates. + if options[:loadclasses] + file = Puppet[:classfile] + if FileTest.exists?(file) + unless FileTest.readable?(file) + $stderr.puts "%s is not readable" % file + exit(63) + end + node.classes = File.read(file).split(/[\s\n]+/) + end + end + + begin + # Compile our catalog + starttime = Time.now + catalog = Puppet::Resource::Catalog.find(node.name, :use_node => node) + + # Translate it to a RAL catalog + catalog = catalog.to_ral + + catalog.host_config = true if Puppet[:graph] or Puppet[:report] + + catalog.finalize + + catalog.retrieval_duration = Time.now - starttime + + # And apply it + transaction = catalog.apply + + status = 0 + if not Puppet[:noop] and options[:detailed_exits] then + transaction.generate_report + status |= 2 if transaction.report.metrics["changes"][:total] > 0 + status |= 4 if transaction.report.metrics["resources"][:failed] > 0 + end + exit(status) + rescue => detail + if Puppet[:trace] + puts detail.backtrace + end + if detail.is_a?(XMLRPC::FaultException) + $stderr.puts detail.message + else + $stderr.puts detail + end + exit(1) + end + end + + setup do + # Now parse the config + if Puppet[:config] and File.exists? Puppet[:config] + Puppet.settings.parse(Puppet[:config]) + end + + if Puppet.settings.print_configs? + exit(Puppet.settings.print_configs ? 0 : 1) + end + + # If noop is set, then also enable diffs + if Puppet[:noop] + Puppet[:show_diff] = true + end + + unless options[:logset] + Puppet::Util::Log.newdestination(:console) + end + client = nil + server = nil + + trap(:INT) do + $stderr.puts "Exiting" + exit(1) + end + + if options[:debug] + Puppet::Util::Log.level = :debug + elsif options[:verbose] + Puppet::Util::Log.level = :info + end + + # Set our code or file to use. + if options[:code] or ARGV.length == 0 + Puppet[:code] = options[:code] || STDIN.read + else + Puppet[:manifest] = ARGV.shift + end + end +end |