lib/onering/cli/reporter.rb in onering-client-0.1.2 vs lib/onering/cli/reporter.rb in onering-client-0.1.3

- old
+ new

@@ -1,9 +1,12 @@ module Onering module CLI module Report + DEFAULT_CACHE_MAXAGE=600 + def self.configure(global={}) + @api = (Onering::CLI.connect(global.merge({ :autoconnect => false })) rescue nil) @opts = ::Trollop::options do @@ -18,21 +21,86 @@ opt :id, "Override the autodetected Hardware ID for this node", :short => '-I', :type => :string opt :fields, "Set the named FIELD to equal VALUE in the format FIELD=VALUE. Can be specified multiple times", :short => '-o', :type => :string, :multi => true opt :save, "Save the report output to the configured Onering server" opt :timeout, "The maximum amount of time to wait for a report to be generated", :type => :integer, :default => 60 opt :plugin_timeout, "The maximum amount of time to wait for a report plugin to return data", :type => :integer, :default => 10 + opt :local, "Do not attempt to contact a remote server for retrieving values not found locally", :type => :boolean, :default => false + opt :cachefile, "Use the specified file as a local report cache", :type => :string, :short => '-F' + opt :nocache, "Do not attempt to use a cache file for report generation", :type => :boolean, :default => false + opt :maxage, "Maxmimum age (in seconds) of the cache before it is automatically regenerated", :type => :integer, :default => DEFAULT_CACHE_MAXAGE + + stop_on %w{get save} end # initialize report generator with user options Onering::Reporter.setup({ :id => @opts[:id], :timeout => @opts[:timeout], - :plugin_timeout => @opts[:plugin_timeout] + :plugin_timeout => @opts[:plugin_timeout], + :nocache => @opts[:nocache], + :cachefile => @opts[:cachefile], + :maxage => @opts[:maxage] }.compact) end def self.run(args) + report = _report() + + # pull overrides from CLI arguments + @opts[:fields].each do |field| + key, value = field.split('=', 2) + Onering::Logger.debug("Override value #{key} from command line argument", "Onering::CLI::Report") + + value = nil if ['null', '', '-'].include?(value.to_s.strip.chomp) + report = report.set(key, value) + end + + # save if specified + if @opts[:save] === true + _save(report) + + else + sc = args.shift + + case (sc.downcase.to_sym rescue nil) + # ----------------------------------------------------------------------------- + when :save + _save(report) + return nil + + when :get + Onering::Logger.fatal!("Expected at least 1 parameter, got #{args.length}", "Onering::CLI::Devices") unless args.length >= 1 + + rv = report.get("properties.#{args[0]}", report.get(args[0], args[1])) + + # attempt to get the value remotely if not found locally + if rv.nil? and not @opts[:local] + hid = Onering::Util.fact(:hardwareid) + + if not hid.nil? + Onering::Logger.debug("Getting remote value #{args[0]} for asset #{hid}") + @api.connect() + return @api.assets.get_field(hid, args[0], args[1]) + end + end + + return rv + end + end + + return report + end + + private + def self._save(report) + @api.connect() + @api.assets.save(report['id']) do + MultiJson.dump(report) + end + end + + def self._report() begin Onering::Logger.debug("Gathering local data for report", "Onering::CLI::Report") report = Onering::Reporter.report().stringify_keys() # pull report overrides from the config file @@ -45,27 +113,9 @@ report = report.set(k, v) end else value = nil if ['null', '', '-'].include?(value.to_s.strip.chomp) report = report.set(key, value) - end - end - - # pull overrides from CLI arguments - @opts[:fields].each do |field| - key, value = field.split('=', 2) - Onering::Logger.debug("Override value #{key} from command line argument", "Onering::CLI::Report") - - value = nil if ['null', '', '-'].include?(value.to_s.strip.chomp) - report = report.set(key, value) - end - - - # save if specified - if @opts[:save] === true - @api.connect() - @api.devices.save(report['id']) do - MultiJson.dump(report) end end return report rescue Timeout::Error \ No newline at end of file