diff --git a/lib/puppet/application/resource.rb b/lib/puppet/application/resource.rb index a0e33408d..f5741b9ee 100644 --- a/lib/puppet/application/resource.rb +++ b/lib/puppet/application/resource.rb @@ -1,222 +1,221 @@ require 'puppet/application' class Puppet::Application::Resource < Puppet::Application should_not_parse_config attr_accessor :host, :extra_params def preinit @extra_params = [] @host = nil Facter.loadfacts end option("--debug","-d") option("--verbose","-v") option("--edit","-e") option("--host HOST","-H") do |arg| @host = arg end option("--types", "-t") do |arg| types = [] Puppet::Type.loadall Puppet::Type.eachtype do |t| next if t.name == :component types << t.name.to_s end puts types.sort exit end option("--param PARAM", "-p") do |arg| @extra_params << arg.to_sym end def help <<-HELP -SYNOPSIS +puppet-resource(8) -- The resource abstraction layer shell ======== -Use the Puppet RAL to directly interact with the system. + +SYNOPSIS +-------- +Uses the Puppet RAL to directly interact with the system. USAGE -===== - puppet resource [-h|--help] [-d|--debug] [-v|--verbose] [-e|--edit] - [-H|--host ] [-p|--param ] [-t|--types] - type +----- +puppet resource [-h|--help] [-d|--debug] [-v|--verbose] [-e|--edit] + [-H|--host ] [-p|--param ] [-t|--types] [] + [= ...] DESCRIPTION -=========== +----------- This command provides simple facilities for converting current system -state into Puppet code, along with some ability to use Puppet to affect -the current state. +state into Puppet code, along with some ability to modify the current +state using Puppet's RAL. -By default, you must at least provide a type to list, which case puppet -resource will tell you everything it knows about all instances of that -type. You can optionally specify an instance name, and puppet resource -will only describe that single instance. +By default, you must at least provide a type to list, in which case +puppet resource will tell you everything it knows about all resources of +that type. You can optionally specify an instance name, and puppet +resource will only describe that single instance. -You can also add '--edit' as an argument, and puppet resource will write -its output to a file, open that file in an editor, and then apply the -file as a Puppet transaction. You can easily use this to use Puppet to -make simple changes to a system. +If given a type, a name, and a series of = pairs, +puppet resource will modify the state of the specified resource. +Alternately, if given a type, a name, and the '--edit' flag, puppet +resource will write its output to a file, open that file in an editor, +and then apply the saved file as a Puppet transaction. 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 documentation at http://docs.puppetlabs.com/references/stable/configuration.html for the full list of acceptable parameters. A commented list of all configuration options can also be generated by running puppet with '--genconfig'. -debug: Enable full debugging. - -edit: +* --debug: + Enable full debugging. +* --edit: Write the results of the query to a file, open the file in an editor, and read the file back in as an executable Puppet manifest. -host: - +* --host: When specified, connect to the resource server on the named host and retrieve the list of resouces of the type specified. -help: - +* --help: Print this help message. -param: - +* --param: Add more parameters to be outputted from queries. -types: - +* --types: List all available types. -verbose: - +* --verbose: Print extra information. EXAMPLE -======= -This example uses `puppet resource` to return Puppet configuration for +------- +This example uses `puppet resource` to return a Puppet configuration for the user `luke`: - $ puppet resource user luke - user { 'luke': - home => '/home/luke', - uid => '100', - ensure => 'present', - comment => 'Luke Kanies,,,', - gid => '1000', - shell => '/bin/bash', - groups => ['sysadmin','audio','video','puppet'] - } + $ puppet resource user luke + user { 'luke': + home => '/home/luke', + uid => '100', + ensure => 'present', + comment => 'Luke Kanies,,,', + gid => '1000', + shell => '/bin/bash', + groups => ['sysadmin','audio','video','puppet'] + } AUTHOR -====== +------ Luke Kanies COPYRIGHT -========= +--------- Copyright (c) 2005-2007 Puppet Labs, LLC Licensed under the GNU Public License HELP end def main args = command_line.args type = args.shift or raise "You must specify the type to display" typeobj = Puppet::Type.type(type) or raise "Could not find type #{type}" name = args.shift params = {} args.each do |setting| if setting =~ /^(\w+)=(.+)$/ params[$1] = $2 else raise "Invalid parameter setting #{setting}" end end raise "You cannot edit a remote host" if options[:edit] and @host properties = typeobj.properties.collect { |s| s.name } format = proc {|trans| trans.dup.collect do |param, value| if value.nil? or value.to_s.empty? trans.delete(param) elsif value.to_s == "absent" and param.to_s != "ensure" trans.delete(param) end trans.delete(param) unless properties.include?(param) or @extra_params.include?(param) end trans.to_manifest } if @host Puppet::Resource.indirection.terminus_class = :rest port = Puppet[:puppetport] key = ["https://#{host}:#{port}", "production", "resources", type, name].join('/') else key = [type, name].join('/') end text = if name if params.empty? [ Puppet::Resource.indirection.find( key ) ] else [ Puppet::Resource.indirection.save(Puppet::Resource.new( type, name, :parameters => params ), key) ] end else Puppet::Resource.indirection.search( key, {} ) end.map(&format).join("\n") if options[:edit] file = "/tmp/x2puppet-#{Process.pid}.pp" begin File.open(file, "w") do |f| f.puts text end ENV["EDITOR"] ||= "vi" system(ENV["EDITOR"], file) system("puppet -v #{file}") ensure #if FileTest.exists? file # File.unlink(file) #end end else puts text end end def setup Puppet::Util::Log.newdestination(:console) # Now parse the config Puppet.parse_config if options[:debug] Puppet::Util::Log.level = :debug elsif options[:verbose] Puppet::Util::Log.level = :info end end end