module Onering module CLI module Report def self.configure(global={}) @api = (Onering::CLI.connect(global.merge({ :autoconnect => false })) rescue nil) @opts = ::Trollop::options do banner <<-EOS Generate a system report that can be saved or submitted to a Onering server Usage: onering [global] report [options] Options: EOS 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 end # initialize report generator with user options Onering::Reporter.setup({ :id => @opts[:id], :timeout => @opts[:timeout], :plugin_timeout => @opts[:plugin_timeout] }.compact) end def self.run(args) 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 Onering::Config.get('reporter.fields',{}).each do |key, value| Onering::Logger.debug("Override value #{key} from config file", "Onering::CLI::Report") if value.is_a?(Hash) value.coalesce(key, nil, '.').each do |k,v| v = nil if ['null', '', '-'].include?(v.to_s.strip.chomp) 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 Onering::Logger.fatal!("Report took too long to generate, exiting...", "Onering::CLI::Report") end end end end end