1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
module Facter
module Application
def self.run(argv)
require 'optparse'
require 'facter'
options = parse(argv)
# Accept fact names to return from the command line
names = argv
# Create the facts hash that is printed to standard out.
unless names.empty?
facts = {}
names.each do |name|
begin
facts[name] = Facter.value(name)
rescue => error
$stderr.puts "Could not retrieve #{name}: #{error}"
exit 10
end
end
end
# Print everything if they didn't ask for specific facts.
facts ||= Facter.to_hash
# Print the facts as YAML and exit
if options[:yaml]
require 'yaml'
puts YAML.dump(facts)
exit(0)
end
# Print the facts as JSON and exit
if options[:json]
begin
require 'json'
puts JSON.dump(facts)
exit(0)
rescue LoadError
$stderr.puts "You do not have JSON support in your version of Ruby. JSON output disabled"
exit(1)
end
end
# Print the value of a single fact, otherwise print a list sorted by fact
# name and separated by "=>"
if facts.length == 1
if value = facts.values.first
puts value
end
else
facts.sort_by{ |fact| fact.first }.each do |name,value|
puts "#{name} => #{value}"
end
end
rescue => e
if options && options[:trace]
raise e
else
$stderr.puts "Error: #{e}"
exit(12)
end
end
private
def self.parse(argv)
options = {}
OptionParser.new do |opts|
opts.on("-y", "--yaml") { |v| options[:yaml] = v }
opts.on("-j", "--json") { |v| options[:json] = v }
opts.on( "--trace") { |v| options[:trace] = v }
opts.on("-d", "--debug") { |v| Facter.debugging(1) }
opts.on("-t", "--timing") { |v| Facter.timing(1) }
opts.on("-p", "--puppet") { |v| load_puppet }
opts.on_tail("-v", "--version") do
puts Facter.version
exit(0)
end
opts.on_tail("-h", "--help") do
begin
require 'rdoc/ri/ri_paths'
require 'rdoc/usage'
RDoc.usage # print usage and exit
rescue LoadError
$stderr.puts "No help available unless your RDoc has RDoc.usage"
exit(1)
rescue => e
$stderr.puts "fatal: #{e}"
exit(1)
end
end
end.parse!
options
rescue OptionParser::InvalidOption => e
$stderr.puts e.message
exit(12)
end
def self.load_puppet
require 'puppet'
Puppet.parse_config
# If you've set 'vardir' but not 'libdir' in your
# puppet.conf, then the hook to add libdir to $:
# won't get triggered. This makes sure that it's setup
# correctly.
unless $LOAD_PATH.include?(Puppet[:libdir])
$LOAD_PATH << Puppet[:libdir]
end
rescue LoadError => detail
$stderr.puts "Could not load Puppet: #{detail}"
end
end
end
|