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