#!/usr/bin/ruby # # = Synopsis # # Run a +puppet+ script as a cfengine module. # # = Usage # # puppet_module [-h|--help] [-V|--version] [-d|--debug] [-v|--verbose] # [-l|--logdest ] # # = Description # # This is the standalone puppet execution script; use it to execute # individual scripts that you write. If you need to execute site-wide # scripts, use +puppetd+ and +puppetmasterd+. # # = Options # # Note that any configuration parameter that's valid in the configuration file # is also a valid long argument. For example, 'ssldir' is a valid configuration # parameter, so you can specify '--ssldir ' as an argument. # # See the configuration file for the full list of acceptable parameters. # # debug:: # Enable full debugging. # # help:: # Print this help message # # logdest:: # Where to send messages. Choose between syslog, the console, and a log file. # Defaults to sending messages to the console. # # verbose:: # Print extra information. # # = Author # # Luke Kanies # # = Copyright # # Copyright (c) 2005 Reductive Labs, LLC # Licensed under the GNU Public License require 'puppet' require 'puppet/server' require 'puppet/client' require 'getoptlong' $haveusage = true begin require 'rdoc/usage' rescue LoadError $haveusage = false end options = [ [ "--debug", "-d", GetoptLong::NO_ARGUMENT ], [ "--help", "-h", GetoptLong::NO_ARGUMENT ], [ "--logdest", "-l", GetoptLong::REQUIRED_ARGUMENT ], [ "--verbose", "-v", GetoptLong::NO_ARGUMENT ], [ "--use-nodes", GetoptLong::NO_ARGUMENT ], [ "--version", "-V", GetoptLong::NO_ARGUMENT ] ] # Add all of the config parameters as valid options. Puppet.config.addargs(options) result = GetoptLong.new(*options) debug = false verbose = false noop = false logfile = false parseonly = false master = { :Local => true } setdest = false begin result.each { |opt,arg| case opt when "--version" puts "%s" % Puppet.version exit when "--help" if $haveusage RDoc::usage && exit else puts "No help available unless you have RDoc::usage installed" exit end when "--use-nodes" master[:UseNodes] = true when "--verbose" Puppet::Log.level = :info Puppet::Log.newdestination(:console) verbose = true when "--debug" Puppet::Log.level = :debug Puppet::Log.newdestination(:console) debug = true when "--logdest" begin Puppet::Log.newdestination arg setdest=true rescue => detail $stderr.puts detail.to_s end else Puppet.config.handlearg(opt, arg) end } rescue GetoptLong::InvalidOption => detail $stderr.puts "Try '#{$0} --help'" #if $haveusage # RDoc::usage(1,'usage') #end exit(1) end # Now parse the config if Puppet[:config] and File.exists? Puppet[:config] Puppet.config.parse(Puppet[:config]) end client = nil server = nil [:INT, :TERM].each do |signal| trap(signal) do Puppet.notice "Caught #{signal}; shutting down" [client, server].each { |obj| if obj obj.shutdown end } end end Puppet.genconfig Puppet.genmanifest unless ARGV.length > 0 $stderr.puts "You must pass a script to parse" exit(14) end unless setdest Puppet::Log.newdestination(:syslog) end master[:Manifest] = ARGV.shift unless ENV.include?("CFALLCLASSES") $stderr.puts "Cfengine classes must be passed to the module" exit(15) end master[:UseNodes] = false classes = ENV["CFALLCLASSES"].split(":") if classes.empty? $stderr.puts "Could not find any cfengine classes" exit(16) end master[:Classes] = classes begin server = Puppet::Server::Master.new(master) rescue => detail $stderr.puts detail exit(1) end begin client = Puppet::Client::MasterClient.new( :Master => server, :Cache => false ) rescue => detail $stderr.puts detail exit(1) end if parseonly exit(0) end begin client.getconfig client.apply rescue => detail Puppet.err detail exit(1) end