bin/hiera in hiera-0.3.0 vs bin/hiera in hiera-1.0.0rc4
- old
+ new
@@ -9,206 +9,210 @@
# If the node yaml had a location fact the default would match that
# else you can supply scope values on the command line
#
# $ hiera release 'rel/%{location}' location=dc2 --yaml some.node.yaml
-require 'rubygems'
+begin
+ require 'rubygems'
+rescue LoadError
+end
require 'hiera'
+require 'hiera/util'
require 'optparse'
-options = {:default => nil, :config => "/etc/hiera.yaml", :scope => {}, :key => nil, :verbose => false, :resolution_type => :priority}
+options = {
+ :default => nil,
+ :config => File.join(Hiera::Util.config_dir, 'hiera.yaml'),
+ :scope => {},
+ :key => nil,
+ :verbose => false,
+ :resolution_type => :priority
+}
-class Hiera::Noop_logger
- class << self
- def warn(msg);end
- def debug(msg);end
- end
-end
-
# Loads the scope from YAML or JSON files
def load_scope(source, type=:yaml)
- case type
- when :mcollective
- begin
- require 'mcollective'
+ case type
+ when :mcollective
+ begin
+ require 'mcollective'
- include MCollective::RPC
+ include MCollective::RPC
- util = rpcclient("rpcutil")
- util.progress = false
- nodestats = util.custom_request("inventory", {}, source, {"identity" => source}).first
+ util = rpcclient("rpcutil")
+ util.progress = false
+ nodestats = util.custom_request("inventory", {}, source, {"identity" => source}).first
- raise "Failed to retrieve facts for node #{source}: #{nodestats[:statusmsg]}" unless nodestats[:statuscode] == 0
+ raise "Failed to retrieve facts for node #{source}: #{nodestats[:statusmsg]}" unless nodestats[:statuscode] == 0
- scope = nodestats[:data][:facts]
- rescue Exception => e
- STDERR.puts "MCollective lookup failed: #{e.class}: #{e}"
- exit 1
- end
+ scope = nodestats[:data][:facts]
+ rescue Exception => e
+ STDERR.puts "MCollective lookup failed: #{e.class}: #{e}"
+ exit 1
+ end
- when :yaml
- raise "Cannot find scope #{type} file #{source}" unless File.exist?(source)
+ when :yaml
+ raise "Cannot find scope #{type} file #{source}" unless File.exist?(source)
- require 'yaml'
+ require 'yaml'
- # Attempt to load puppet in case we're going to be fed
- # Puppet yaml files
- begin
- require 'puppet'
- rescue
- end
+ # Attempt to load puppet in case we're going to be fed
+ # Puppet yaml files
+ begin
+ require 'puppet'
+ rescue
+ end
- scope = YAML.load_file(source)
+ scope = YAML.load_file(source)
- # Puppet makes dumb yaml files that do not promote data reuse.
- scope = scope.values if scope.is_a?(Puppet::Node::Facts)
+ # Puppet makes dumb yaml files that do not promote data reuse.
+ scope = scope.values if scope.is_a?(Puppet::Node::Facts)
- when :json
- raise "Cannot find scope #{type} file #{source}" unless File.exist?(source)
+ when :json
+ raise "Cannot find scope #{type} file #{source}" unless File.exist?(source)
- require 'json'
+ require 'json'
- scope = JSON.load(File.read(source))
+ scope = JSON.load(File.read(source))
- when :inventory_service
- # For this to work the machine running the hiera command needs access to
- # /facts REST endpoint on your inventory server. This access is
- # controlled in auth.conf and identification is by the certname of the
- # machine running hiera commands.
- #
- # Another caveat is that if your inventory server isn't at the short dns
- # name of 'puppet' you will need to set the inventory_sever option in
- # your puppet.conf. Set it in either the master or main sections. It
- # is fine to have the inventory_server option set even if the config
- # doesn't have the fact_terminus set to rest.
- begin
- require 'puppet/util/run_mode'
- $puppet_application_mode = Puppet::Util::RunMode[:master]
- require 'puppet'
- Puppet.settings.parse
- Puppet::Node::Facts.indirection.terminus_class = :rest
- scope = YAML.load(Puppet::Node::Facts.indirection.find(source).to_yaml)
- # Puppet makes dumb yaml files that do not promote data reuse.
- scope = scope.values if scope.is_a?(Puppet::Node::Facts)
- rescue Exception => e
- STDERR.puts "Puppet inventory service lookup failed: #{e.class}: #{e}"
- exit 1
- end
- else
- raise "Don't know how to load data type #{type}"
+ when :inventory_service
+ # For this to work the machine running the hiera command needs access to
+ # /facts REST endpoint on your inventory server. This access is
+ # controlled in auth.conf and identification is by the certname of the
+ # machine running hiera commands.
+ #
+ # Another caveat is that if your inventory server isn't at the short dns
+ # name of 'puppet' you will need to set the inventory_sever option in
+ # your puppet.conf. Set it in either the master or main sections. It
+ # is fine to have the inventory_server option set even if the config
+ # doesn't have the fact_terminus set to rest.
+ begin
+ require 'puppet/util/run_mode'
+ $puppet_application_mode = Puppet::Util::RunMode[:master]
+ require 'puppet'
+ Puppet.settings.parse
+ Puppet::Node::Facts.indirection.terminus_class = :rest
+ scope = YAML.load(Puppet::Node::Facts.indirection.find(source).to_yaml)
+ # Puppet makes dumb yaml files that do not promote data reuse.
+ scope = scope.values if scope.is_a?(Puppet::Node::Facts)
+ rescue Exception => e
+ STDERR.puts "Puppet inventory service lookup failed: #{e.class}: #{e}"
+ exit 1
end
+ else
+ raise "Don't know how to load data type #{type}"
+ end
- raise "Scope from #{type} file #{source} should be a Hash" unless scope.is_a?(Hash)
+ raise "Scope from #{type} file #{source} should be a Hash" unless scope.is_a?(Hash)
- scope
+ scope
end
OptionParser.new do |opts|
- opts.on("--version", "-V", "Version information") do
- puts Hiera.version
- exit
- end
+ opts.on("--version", "-V", "Version information") do
+ puts Hiera.version
+ exit
+ end
- opts.on("--debug", "-d", "Show debugging information") do
- options[:verbose] = true
- end
+ opts.on("--debug", "-d", "Show debugging information") do
+ options[:verbose] = true
+ end
- opts.on("--array", "-a", "Array search") do
- options[:resolution_type] = :array
- end
+ opts.on("--array", "-a", "Array search") do
+ options[:resolution_type] = :array
+ end
- opts.on("--hash", "-h", "Hash search") do
- options[:resolution_type] = :hash
- end
+ opts.on("--hash", "-h", "Hash search") do
+ options[:resolution_type] = :hash
+ end
- opts.on("--config CONFIG", "-c", "Configuration file") do |v|
- if File.exist?(v)
- options[:config] = v
- else
- STDERR.puts "Cannot find config file: #{v}"
- exit 1
- end
+ opts.on("--config CONFIG", "-c", "Configuration file") do |v|
+ if File.exist?(v)
+ options[:config] = v
+ else
+ STDERR.puts "Cannot find config file: #{v}"
+ exit 1
end
+ end
- opts.on("--json SCOPE", "-j", "JSON format file to load scope from") do |v|
- begin
- options[:scope] = load_scope(v, :json)
- rescue Exception => e
- STDERR.puts "Could not load JSON scope: #{e.class}: #{e}"
- exit 1
- end
+ opts.on("--json SCOPE", "-j", "JSON format file to load scope from") do |v|
+ begin
+ options[:scope] = load_scope(v, :json)
+ rescue Exception => e
+ STDERR.puts "Could not load JSON scope: #{e.class}: #{e}"
+ exit 1
end
+ end
- opts.on("--yaml SCOPE", "-y", "YAML format file to load scope from") do |v|
- begin
- options[:scope] = load_scope(v)
- rescue Exception => e
- STDERR.puts "Could not load YAML scope: #{e.class}: #{e}"
- exit 1
- end
+ opts.on("--yaml SCOPE", "-y", "YAML format file to load scope from") do |v|
+ begin
+ options[:scope] = load_scope(v)
+ rescue Exception => e
+ STDERR.puts "Could not load YAML scope: #{e.class}: #{e}"
+ exit 1
end
+ end
- opts.on("--mcollective IDENTITY", "-m", "Retrieve facts from a node via mcollective as scope") do |v|
- begin
- options[:scope] = load_scope(v, :mcollective)
- rescue Exception => e
- STDERR.puts "Could not load MCollective scope: #{e.class}: #{e}"
- exit 1
- end
+ opts.on("--mcollective IDENTITY", "-m", "Retrieve facts from a node via mcollective as scope") do |v|
+ begin
+ options[:scope] = load_scope(v, :mcollective)
+ rescue Exception => e
+ STDERR.puts "Could not load MCollective scope: #{e.class}: #{e}"
+ exit 1
end
+ end
- opts.on("--inventory_service IDENTITY", "-i", "Retrieve facts for a node via Puppet's inventory service as scope") do |v|
- begin
- options[:scope] = load_scope(v, :inventory_service)
- rescue Exception => e
- STDERR.puts "Could not load Puppet inventory service scope: #{e.class}: #{e}"
- exit 1
- end
+ opts.on("--inventory_service IDENTITY", "-i", "Retrieve facts for a node via Puppet's inventory service as scope") do |v|
+ begin
+ options[:scope] = load_scope(v, :inventory_service)
+ rescue Exception => e
+ STDERR.puts "Could not load Puppet inventory service scope: #{e.class}: #{e}"
+ exit 1
end
+ end
end.parse!
# arguments can be:
#
# key default var=val another=val
#
# The var=val's assign scope
unless ARGV.empty?
- options[:key] = ARGV.delete_at(0)
+ options[:key] = ARGV.delete_at(0)
- ARGV.each do |arg|
- if arg =~ /^(.+?)=(.+?)$/
- options[:scope][$1] = $2
- else
- unless options[:default]
- options[:default] = arg.dup
- else
- STDERR.puts "Don't know how to parse scope argument: #{arg}"
- end
- end
+ ARGV.each do |arg|
+ if arg =~ /^(.+?)=(.+?)$/
+ options[:scope][$1] = $2
+ else
+ unless options[:default]
+ options[:default] = arg.dup
+ else
+ STDERR.puts "Don't know how to parse scope argument: #{arg}"
+ end
end
+ end
else
- STDERR.puts "Please supply a data item to look up"
- exit 1
+ STDERR.puts "Please supply a data item to look up"
+ exit 1
end
begin
- hiera = Hiera.new(:config => options[:config])
+ hiera = Hiera.new(:config => options[:config])
rescue Exception => e
- if options[:verbose]
- raise
- else
- STDERR.puts "Failed to start Hiera: #{e.class}: #{e}"
- exit 1
- end
+ if options[:verbose]
+ raise
+ else
+ STDERR.puts "Failed to start Hiera: #{e.class}: #{e}"
+ exit 1
+ end
end
unless options[:verbose]
- Hiera.logger = "noop"
+ Hiera.logger = "noop"
end
ans = hiera.lookup(options[:key], options[:default], options[:scope], nil, options[:resolution_type])
if ans.is_a?(String)
- puts ans
+ puts ans
else
- p ans
+ p ans
end