onering-client 0.1.7 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/bin/onering CHANGED
@@ -45,9 +45,6 @@ Onering::Logger.setup({
45
45
  :threshold => global[:verbosity]
46
46
  })
47
47
 
48
- Onering::Config.load()
49
-
50
-
51
48
  if plugins.include?(plugin)
52
49
  begin
53
50
  plugin = Onering::CLI.const_get(plugin.capitalize)
data/lib/onering.rb CHANGED
@@ -2,7 +2,7 @@ $: << File.expand_path(File.dirname(__FILE__))
2
2
 
3
3
  module Onering
4
4
  module Client
5
- VERSION = "0.1.7"
5
+ VERSION = "0.2.0"
6
6
 
7
7
  class Error < Exception; end
8
8
  class FatalError < Error; end
@@ -10,6 +10,14 @@ module Onering
10
10
  end
11
11
 
12
12
  require 'onering/logger'
13
+
14
+ if not ENV['ONERING_LOGLEVEL'].nil?
15
+ Onering::Logger.setup({
16
+ :destination => 'stderr',
17
+ :threshold => ENV['ONERING_LOGLEVEL']
18
+ })
19
+ end
20
+
13
21
  require 'onering/util'
14
22
  require 'onering/api'
15
23
  require 'onering/cli'
@@ -23,3 +31,6 @@ end
23
31
  Dir[File.join(File.expand_path(File.dirname(__FILE__)),"onering","cli","*.rb")].each do |i|
24
32
  require i
25
33
  end
34
+
35
+ # you've loaded the library, now load the config
36
+ Onering::Config.load()
data/lib/onering/api.rb CHANGED
@@ -109,7 +109,6 @@ module Onering
109
109
  _default_param(k,v)
110
110
  end
111
111
 
112
- Onering::Reporter.setup()
113
112
  connect(options) if options.get(:autoconnect, true)
114
113
  end
115
114
 
@@ -17,7 +17,6 @@ Subcommands:
17
17
  list <property> [property2 ..]
18
18
  save
19
19
  set <property> <value>
20
- show <
21
20
 
22
21
  Options:
23
22
  EOS
@@ -2,8 +2,6 @@ module Onering
2
2
  module CLI
3
3
  module Fact
4
4
  def self.configure(global={})
5
- Onering::Reporter.setup()
6
-
7
5
  @opts = ::Trollop::options do
8
6
  banner <<-EOS
9
7
  Return the value of an internal fact.
@@ -16,6 +14,7 @@ EOS
16
14
  end
17
15
 
18
16
  def self.run(args)
17
+ args[0] = :hardwareid if args[0] and args[0] == 'id'
19
18
  return Onering::Util.fact(args[0])
20
19
  end
21
20
  end
@@ -5,16 +5,26 @@ module Onering
5
5
 
6
6
  def self.configure(global={})
7
7
 
8
- @api = (Onering::CLI.connect(global.merge({
8
+ @api = Onering::CLI.connect(global.merge({
9
9
  :autoconnect => false
10
- })) rescue nil)
10
+ }))
11
11
 
12
12
  @opts = ::Trollop::options do
13
13
  banner <<-EOS
14
14
  Generate a system report that can be saved or submitted to a Onering server
15
15
 
16
+ Subcommands:
17
+ <none>
18
+ Generate and output the system inventory report.
19
+
20
+ get <property> [fallback]
21
+ Get a specific <property> from the report, return [fallback] if not found.
22
+
23
+ save
24
+ Generate and save the system inventory report to Onering.
25
+
16
26
  Usage:
17
- onering [global] report [options]
27
+ onering [global] report [options] [subcommands]
18
28
 
19
29
  Options:
20
30
  EOS
@@ -32,7 +42,7 @@ EOS
32
42
  end
33
43
 
34
44
  # initialize report generator with user options
35
- Onering::Reporter.setup({
45
+ @_reporter = Onering::Reporter.new({
36
46
  :id => @opts[:id],
37
47
  :timeout => @opts[:timeout],
38
48
  :plugin_timeout => @opts[:plugin_timeout],
@@ -75,9 +85,39 @@ EOS
75
85
  return nil
76
86
 
77
87
  when :get
78
- Onering::Logger.fatal!("Expected at least 1 parameter, got #{args.length}", "Onering::CLI::Devices") unless args.length >= 1
79
-
80
- rv = report.get("properties.#{args[0]}", report.get(args[0], args[1]))
88
+ Onering::Logger.fatal!("Expected at least 1 parameter, got #{args.length}", "Onering::CLI::Report") unless args.length >= 1
89
+
90
+ # this is kinda ugly
91
+ # because we don't know which property might have an @-prefix, progressively
92
+ # search through all of them. first non-null match wins
93
+ parts = args[0].split('.')
94
+
95
+ # create an array with every component of the path prefixed with the @-symbol, then with
96
+ # the path as is.
97
+ #
98
+ # e.g.: onering report get metrics.disk.block
99
+ # -> value exists in the inventory as properties.metrics.disk.@block,
100
+ # but the user shouldn't need to know where that @-prefix is, so...
101
+ #
102
+ # Search for all of these, first non-nil value wins:
103
+ # * properties.metrics.disk.block
104
+ # * properties.@metrics.disk.block
105
+ # * properties.metrics.@disk.block
106
+ # * properties.metrics.disk.@block
107
+ # * metrics.disk.block
108
+ #
109
+ candidates = [(['properties']+parts).join('.')] + parts.collect.with_index{|i,ix|
110
+ (['properties']+(ix == 0 ? [] : parts[0..(ix-1)]) + ["@#{i}"] + parts[ix+1..-1]).join('.')
111
+ }.flatten()
112
+
113
+ # search for the key using science or something
114
+ candidates.each do |c|
115
+ rv = report.get(c)
116
+ break unless rv.nil?
117
+ end
118
+
119
+ # if we're still nil by this point, use the fallback value
120
+ rv = report.get(args[0], args[1]) if rv.nil?
81
121
 
82
122
  # attempt to get the value remotely if not found locally
83
123
  if rv.nil? and not @opts[:local]
@@ -108,7 +148,8 @@ EOS
108
148
  def self._report(options={})
109
149
  begin
110
150
  Onering::Logger.debug("Gathering local data for report", "Onering::CLI::Report")
111
- report = Onering::Reporter.report(options).stringify_keys()
151
+ Onering::Logger.fatal("Reporter not configured. This is a bug", "Onering::CLI::Report") if @_reporter.nil?
152
+ report = @_reporter.report(options).stringify_keys()
112
153
 
113
154
  # pull report overrides from the config file
114
155
  Onering::Config.get('reporter.fields',{}).each do |key, value|
@@ -5,10 +5,6 @@ require 'optparse'
5
5
  require 'hashlib'
6
6
  require 'set'
7
7
 
8
- def report(&block)
9
- Onering::Reporter.add(&block)
10
- end
11
-
12
8
  module Onering
13
9
  class Reporter
14
10
  DEFAULT_PLUGIN_GEMNAMES=[
@@ -26,235 +22,263 @@ module Onering
26
22
  DEFAULT_CACHE_FILE='/var/tmp/.onering-report-cache.json'
27
23
  DEFAULT_CACHE_MAXAGE=600
28
24
 
29
- class<<self
30
- include Onering::Util
25
+ include Onering::Util
31
26
 
32
- attr_reader :facter_path
27
+ attr_reader :facter_path
33
28
 
34
- def setup(config={})
35
- @options = config
36
- @facter_path = DEFAULT_FACTER_PATH
37
- @detected_gems = []
29
+ class PluginDelegate
30
+ def initialize(reporter, options={})
31
+ @_name = options.get(:plugin)
32
+ @_path = options.get(:path)
38
33
 
39
- @path = [*Onering::Config.get('reporter.plugin_path',[])]
40
- @path += DEFAULT_PLUGIN_PATH
34
+ Onering::Logger.debug3("Creating plugin delegate for plugin #{@_name}", "Onering::Reporter::PluginDelegate")
35
+ @_reporter = reporter
36
+ end
41
37
 
38
+ def get_binding()
39
+ return binding()
40
+ end
42
41
 
43
- begin
44
- specs = Set.new()
45
- @detected_gems = []
42
+ # DSL methods
43
+ # -------------------------------------------------------------------------
44
+ def report(&block)
45
+ if block_given?
46
+ start = Time.now.to_f
47
+ yield
46
48
 
47
- Gem::Specification.each do |spec|
48
- specs << spec.name
49
- end
49
+ finish = (Time.now.to_f - start.to_f)
50
+ finish = (finish.round(4) rescue finish)
51
+ Onering::Logger.debug3("Finished evaluating report for plugin #{@_name}, took #{finish} seconds", "Onering::Reporter::PluginDelegate")
52
+ end
53
+ end
50
54
 
51
- @detected_gems = (specs.to_a.select{|i|
52
- i =~ /^onering-report-/
53
- } - DEFAULT_PLUGIN_GEMNAMES)
54
- rescue Exception => e
55
- Onering::Logger.warn("Unable to detect plugin gems: #{e.class.name} - #{e.message}", "Onering::Reporter")
55
+ def property(name, value=nil)
56
+ @_reporter.property(name, value)
57
+ end
58
+
59
+ def stat(name, value=nil)
60
+ unless value.nil?
61
+ @_reporter.property((['metrics']+name.to_s.split('.')).join('.'), value)
56
62
  end
63
+ end
64
+ end
57
65
 
58
- # add gem paths to the @path
59
- ([*Onering::Config.get('reporter.plugin_gems',[])]+@detected_gems+DEFAULT_PLUGIN_GEMNAMES).compact.each do |g|
60
- begin
61
- p = File.join(Util.gem_path(g), 'lib')
62
- @path << File.join(p, 'reporter')
63
- @facter_path << File.join(p, 'facter')
64
- rescue Gem::LoadError => e
65
- Onering::Logger.warn("Error loading gem: #{e.message}", "Onering::Reporter")
66
- next
67
- end
66
+ def initialize(config={})
67
+ @options = config
68
+ @facter_path = DEFAULT_FACTER_PATH
69
+ @detected_gems = []
70
+
71
+ @path = [*Onering::Config.get('reporter.plugin_path',[])]
72
+ @path += DEFAULT_PLUGIN_PATH
73
+
74
+
75
+ begin
76
+ specs = Set.new()
77
+ @detected_gems = []
78
+
79
+ Gem::Specification.each do |spec|
80
+ specs << spec.name
68
81
  end
69
82
 
70
- begin
71
- ENV['FACTERLIB'] = @facter_path.join(':')
72
- require 'facter'
73
- Onering::Logger.debug("Facter loaded successfully, FACTERLIB is #{ENV['FACTERLIB']}", "Onering::Reporter")
83
+ @detected_gems = (specs.to_a.select{|i|
84
+ i =~ /^onering-report-/
85
+ } - DEFAULT_PLUGIN_GEMNAMES)
86
+ rescue Exception => e
87
+ Onering::Logger.warn("Unable to detect plugin gems: #{e.class.name} - #{e.message}", "Onering::Reporter")
88
+ end
74
89
 
75
- rescue LoadError
76
- Onering::Logger.error("Unable to load Facter library", "Onering::Reporter")
90
+ # add gem paths to the @path
91
+ ([*Onering::Config.get('reporter.plugin_gems',[])]+@detected_gems+DEFAULT_PLUGIN_GEMNAMES).compact.each do |g|
92
+ begin
93
+ p = File.join(Util.gem_path(g), 'lib')
94
+ @path << File.join(p, 'reporter')
95
+ @facter_path << File.join(p, 'facter')
96
+ rescue Gem::LoadError => e
97
+ Onering::Logger.warn("Error loading gem: #{e.message}", "Onering::Reporter")
98
+ next
77
99
  end
78
100
  end
79
101
 
80
- def load_plugins()
81
- # load plugins from @path
82
- @path.compact.each do |root|
83
- begin
84
- Dir["#{root}/*"].each do |directory|
85
-
86
- # only process top-level directories
87
- if File.directory?(directory)
88
- d = File.basename(directory)
89
-
90
- # allow plugins to be conditionally loaded based on fact values:
91
- # default - always load
92
- # <fact>-<fact_value> - load if <fact> == <fact_value>
93
- #
94
- if d == 'default' or Facter.value(d.split('-',2).first).to_s.downcase.nil_empty == d.split('-',2).last.to_s.downcase.nil_empty
95
- Dir[File.join(directory, '*.rb')].each do |plugin|
96
- plugin = File.basename(plugin, '.rb')
97
-
98
- begin
99
- Timeout.timeout((@options[:plugin_timeout] || 10).to_i) do
100
- Onering::Logger.debug("Loading plugin #{plugin}", "Onering::Reporter")
101
- require "#{directory}/#{plugin}"
102
- end
103
- rescue Timeout::Error
104
- Onering::Logger.warn("Plugin #{plugin} took too long to return, skipping", "Onering::Reporter")
102
+ begin
103
+ ENV['FACTERLIB'] = @facter_path.join(':')
104
+ require 'facter'
105
+ Onering::Logger.debug("Facter loaded successfully, FACTERLIB is #{ENV['FACTERLIB']}", "Onering::Reporter")
106
+
107
+ rescue LoadError
108
+ Onering::Logger.error("Unable to load Facter library", "Onering::Reporter")
109
+ end
110
+ end
111
+
112
+ def load_plugins()
113
+
114
+ # load plugins from @path
115
+ @path.compact.each do |root|
116
+ begin
117
+ Dir["#{root}/*"].each do |directory|
118
+
119
+ # only process top-level directories
120
+ if File.directory?(directory)
121
+ d = File.basename(directory)
122
+
123
+ Onering::Logger.debug("Loading plugins from path #{directory}", "Onering::Reporter")
124
+
125
+ # allow plugins to be conditionally loaded based on fact values:
126
+ # default - always load
127
+ # <fact>-<fact_value> - load if <fact> == <fact_value>
128
+ #
129
+ if d == 'default' or Facter.value(d.split('-',2).first).to_s.downcase.nil_empty == d.split('-',2).last.to_s.downcase.nil_empty
130
+
131
+ Dir[File.join(directory, '*.rb')].each do |plugin|
132
+ plugin = File.basename(plugin, '.rb')
133
+
134
+ begin
135
+ Timeout.timeout((@options[:plugin_timeout] || 10).to_i) do
136
+ Onering::Logger.debug("Loading plugin #{directory}/#{plugin}.rb", "Onering::Reporter")
137
+ eval(File.read("#{directory}/#{plugin}.rb"), PluginDelegate.new(self, {
138
+ :plugin => plugin,
139
+ :path => "#{directory}/#{plugin}.rb"
140
+ }).get_binding())
105
141
  end
142
+ rescue Timeout::Error
143
+ Onering::Logger.warn("Plugin #{plugin} took too long to return, skipping", "Onering::Reporter")
106
144
  end
107
145
  end
108
146
  end
109
147
  end
110
- rescue Exception => e
111
- raise e if e.class === Timeout::Error
112
-
113
- Onering::Logger.warn(e.message, "Onering::Reporter/#{e.class.name}")
148
+ end
149
+ rescue Exception => e
150
+ raise e if e.class === Timeout::Error
114
151
 
115
- e.backtrace.each do |eb|
116
- Onering::Logger.debug(eb, "Onering::Reporter/#{e.class.name}")
117
- end
152
+ Onering::Logger.warn(e.message, "Onering::Reporter/#{e.class.name}")
118
153
 
119
- next
154
+ e.backtrace.each do |eb|
155
+ Onering::Logger.debug(eb, "Onering::Reporter/#{e.class.name}")
120
156
  end
121
- end
122
- end
123
157
 
124
- def add(&block)
125
- if block_given?
126
- instance_eval(&block)
158
+ next
127
159
  end
128
160
  end
161
+ end
129
162
 
130
- def property(name, value=nil)
131
- unless value.nil?
132
- Onering::Logger.debug3("-> Set property #{name.to_s} (was: #{@_report[:properties].get(name.to_s,'null')})", "Onering::Reporter")
133
- @_report[:properties].set(name.to_s, value)
134
- end
163
+ def property(name, value=nil)
164
+ unless value.nil?
165
+ Onering::Logger.debug3("-> Set property #{name.to_s} (was: #{@_report[:properties].get(name.to_s,'null')})", "Onering::Reporter")
166
+ @_report[:properties].set(name.to_s, value)
135
167
  end
168
+ end
136
169
 
137
- def stat(name, value=nil)
138
- unless value.nil?
139
- @_report[:properties][:metrics] ||= {}
140
- Onering::Logger.debug3("-> Set metric #{name.to_s}", "Onering::Reporter")
141
- @_report[:properties][:metrics].set(name.to_s, value)
142
- end
143
- end
170
+ def report(options={})
171
+ options = @options.merge(options)
172
+ @id = (@options[:id] || Onering::Util.fact('hardwareid', nil))
144
173
 
145
- def report(options={})
146
- options = @options.merge(options)
147
- @id = (@options[:id] || Onering::Util.fact('hardwareid', nil))
148
-
149
- if not @id.nil?
150
- if options[:nocache]
151
- return _generated_report()
152
- else
153
- rv = _cached_report(options)
154
- return _generated_report() if rv.nil? or rv.empty?
155
- return rv
156
- end
174
+ if not @id.nil?
175
+ if options[:nocache]
176
+ return _generated_report()
157
177
  else
158
- Onering::Logger.fatal!("Cannot generate report without a hardware ID", "Onering::Reporter")
178
+ rv = _cached_report(options)
179
+ return _generated_report() if rv.nil? or rv.empty?
180
+ return rv
159
181
  end
160
-
161
- return {}
182
+ else
183
+ Onering::Logger.fatal!("Cannot generate report without a hardware ID", "Onering::Reporter")
162
184
  end
163
185
 
186
+ return {}
187
+ end
164
188
 
165
- def _generated_report()
166
- Timeout.timeout((@options[:timeout] || 60).to_i) do
167
- hostname = (Facter.value('fqdn') rescue %x{hostname -f}.strip.chomp)
168
189
 
169
- @_report = {
170
- :id => @id,
171
- :name => hostname,
172
- :aliases => @options[:aliases],
173
- :tags => @options[:tags],
174
- :status => (@options[:status] || 'online'),
175
- :inventory => true,
176
- :properties => {}
177
- }
190
+ def _generated_report()
191
+ Timeout.timeout((@options[:timeout] || 60).to_i) do
192
+ hostname = (Facter.value('fqdn') rescue %x{hostname -f}.strip.chomp)
178
193
 
179
- # loads plugins and populates @_report
180
- load_plugins()
194
+ @_report = {
195
+ :id => @id,
196
+ :name => hostname,
197
+ :aliases => @options[:aliases],
198
+ :tags => @options[:tags],
199
+ :status => (@options[:status] || 'online'),
200
+ :inventory => true,
201
+ :properties => {}
202
+ }
181
203
 
182
- return @_report.stringify_keys()
183
- end
204
+ # loads plugins and populates @_report
205
+ load_plugins()
184
206
 
185
- return {}
207
+ return @_report.stringify_keys()
186
208
  end
187
209
 
188
- def _cached_report(options={})
189
- options = @options.merge(options)
190
- cachefile = (options[:cachefile] || DEFAULT_CACHE_FILE)
191
- tries = 0
210
+ return {}
211
+ end
192
212
 
193
- catch(:retry) do
194
- tries += 1
213
+ def _cached_report(options={})
214
+ options = @options.merge(options)
215
+ cachefile = (options[:cachefile] || DEFAULT_CACHE_FILE)
216
+ tries = 0
195
217
 
196
- if tries > 10
197
- Onering::Logger.error("Too many retries reading cache #{cachefile}, generating report", "Onering::Reporter")
198
- return _generated_report()
199
- end
218
+ catch(:retry) do
219
+ tries += 1
200
220
 
201
- if File.readable?(cachefile)
202
- Onering::Logger.debug("Loading cache file at #{cachefile}", "Onering::Reporter")
203
- cache = File.read(cachefile)
204
- cache = (MultiJson.load(cache) rescue {})
221
+ if tries > 10
222
+ Onering::Logger.error("Too many retries reading cache #{cachefile}, generating report", "Onering::Reporter")
223
+ return _generated_report()
224
+ end
205
225
 
206
- if _cache_expired?(cache, options[:maxage])
207
- Onering::Logger.debug("Cache expired, regenerating", "Onering::Reporter")
208
- throw :retry if _update_cache_file(cachefile)
209
- end
226
+ if File.readable?(cachefile)
227
+ Onering::Logger.debug("Loading cache file at #{cachefile}", "Onering::Reporter")
228
+ cache = File.read(cachefile)
229
+ cache = (MultiJson.load(cache) rescue {})
210
230
 
211
- if options[:cacheregen] == true
212
- Onering::Logger.debug("Forcing cache regeneration", "Onering::Reporter")
213
- cache = _update_cache_file(cachefile)
214
- end
231
+ if _cache_expired?(cache, options[:maxage])
232
+ Onering::Logger.debug("Cache expired, regenerating", "Onering::Reporter")
233
+ throw :retry if _update_cache_file(cachefile)
234
+ end
215
235
 
216
- if cache
217
- # remove cached_at key
218
- Onering::Logger.debug("Using cached data (#{Time.now.to_i - Time.parse(cache.get('cached_at')).to_i} seconds old)", "Onering::Reporter")
219
- cache.delete('cached_at')
220
- return cache
221
- end
222
- else
223
- Onering::Logger.debug("Report cache file could not be read at #{cachefile}", "Onering::Reporter")
224
- throw :retry if _update_cache_file(cachefile)
236
+ if options[:cacheregen] == true
237
+ Onering::Logger.debug("Forcing cache regeneration", "Onering::Reporter")
238
+ cache = _update_cache_file(cachefile)
225
239
  end
226
- end
227
240
 
228
- return {}
241
+ if cache
242
+ # remove cached_at key
243
+ Onering::Logger.debug("Using cached data (#{Time.now.to_i - Time.parse(cache.get('cached_at')).to_i} seconds old)", "Onering::Reporter")
244
+ cache.delete('cached_at')
245
+ return cache
246
+ end
247
+ else
248
+ Onering::Logger.debug("Report cache file could not be read at #{cachefile}", "Onering::Reporter")
249
+ throw :retry if _update_cache_file(cachefile)
250
+ end
229
251
  end
230
252
 
253
+ return {}
254
+ end
231
255
 
232
- def _update_cache_file(cachefile=DEFAULT_CACHE_FILE)
233
- begin
234
- report = nil
235
-
236
- File.open(cachefile, 'w+') do |file|
237
- Onering::Logger.debug("Regenerating cache file at #{cachefile}", "Onering::Reporter")
238
- report = _generated_report()
239
- report['cached_at'] = Time.now.strftime('%Y-%m-%dT%H:%M:%S%z')
240
- json = MultiJson.dump(report, :pretty => true)
241
- file.puts(json)
242
- end
243
256
 
244
- return report
245
- rescue Exception => e
246
- Onering::Logger.info("Unable to write cache file #{cachefile}: #{e.class.name} - #{e.message}", "Onering::Reporter")
247
- return false
257
+ def _update_cache_file(cachefile=DEFAULT_CACHE_FILE)
258
+ begin
259
+ report = nil
260
+
261
+ File.open(cachefile, 'w+') do |file|
262
+ Onering::Logger.debug("Regenerating cache file at #{cachefile}", "Onering::Reporter")
263
+ report = _generated_report()
264
+ report['cached_at'] = Time.now.strftime('%Y-%m-%dT%H:%M:%S%z')
265
+ json = MultiJson.dump(report, :pretty => true)
266
+ file.puts(json)
248
267
  end
268
+
269
+ return report
270
+ rescue Exception => e
271
+ Onering::Logger.info("Unable to write cache file #{cachefile}: #{e.class.name} - #{e.message}", "Onering::Reporter")
272
+ return false
249
273
  end
274
+ end
250
275
 
251
276
 
252
- def _cache_expired?(cache, age=DEFAULT_CACHE_MAXAGE)
253
- if cache.is_a?(Hash)
254
- return (Time.parse(cache.get('cached_at')) < (Time.now - age) rescue true)
255
- else
256
- return true
257
- end
277
+ def _cache_expired?(cache, age=DEFAULT_CACHE_MAXAGE)
278
+ if cache.is_a?(Hash)
279
+ return (Time.parse(cache.get('cached_at')) < (Time.now - age) rescue true)
280
+ else
281
+ return true
258
282
  end
259
283
  end
260
284
  end
data/lib/onering/util.rb CHANGED
@@ -88,11 +88,12 @@ module Onering
88
88
  end
89
89
 
90
90
  def fact(name, default=nil)
91
+ reporter = Onering::Reporter.new()
91
92
  name = name.to_s
92
93
 
93
94
  if defined?(Facter)
94
95
  if name.downcase == 'all'
95
- return Facter.to_hash
96
+ return Facter.to_hash()
96
97
  else
97
98
  case name.to_sym
98
99
  when :hardwareid
@@ -106,7 +107,9 @@ module Onering
106
107
  end
107
108
 
108
109
  # short circuit nil responses
109
- return default if fact.nil?
110
+ if fact.nil?
111
+ return reporter.report().get(name, default)
112
+ end
110
113
 
111
114
  # if we are asking for a nested object...
112
115
  if name.include?('.')
@@ -117,7 +120,7 @@ module Onering
117
120
  return fact.get(name, default)
118
121
  else
119
122
  # not an object, return default
120
- return default
123
+ return reporter.report().get(name, default)
121
124
  end
122
125
  else
123
126
  # this is a simple request, return the fact
@@ -126,7 +129,7 @@ module Onering
126
129
  end
127
130
  end
128
131
 
129
- return default
132
+ return reporter.report().get(name, default)
130
133
  end
131
134
 
132
135
  def make_filter(filter)
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: onering-client
3
3
  version: !ruby/object:Gem::Version
4
+ version: 0.2.0
4
5
  prerelease:
5
- version: 0.1.7
6
6
  platform: ruby
7
7
  authors:
8
8
  - Gary Hetzel
@@ -12,149 +12,104 @@ cert_chain: []
12
12
  date: 2013-01-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- type: :runtime
16
- version_requirements: !ruby/object:Gem::Requirement
17
- requirements:
18
- - - ! '>='
19
- - !ruby/object:Gem::Version
20
- version: 1.7.2
21
- none: false
22
- prerelease: false
23
15
  name: facter
24
- requirement: !ruby/object:Gem::Requirement
16
+ requirement: &23267720 !ruby/object:Gem::Requirement
17
+ none: false
25
18
  requirements:
26
19
  - - ! '>='
27
20
  - !ruby/object:Gem::Version
28
21
  version: 1.7.2
29
- none: false
30
- - !ruby/object:Gem::Dependency
31
22
  type: :runtime
32
- version_requirements: !ruby/object:Gem::Requirement
33
- requirements:
34
- - - '='
35
- - !ruby/object:Gem::Version
36
- version: 1.0.0
37
- none: false
38
23
  prerelease: false
24
+ version_requirements: *23267720
25
+ - !ruby/object:Gem::Dependency
39
26
  name: deep_merge
40
- requirement: !ruby/object:Gem::Requirement
27
+ requirement: &23267140 !ruby/object:Gem::Requirement
28
+ none: false
41
29
  requirements:
42
- - - '='
30
+ - - =
43
31
  - !ruby/object:Gem::Version
44
32
  version: 1.0.0
45
- none: false
46
- - !ruby/object:Gem::Dependency
47
33
  type: :runtime
48
- version_requirements: !ruby/object:Gem::Requirement
49
- requirements:
50
- - - '='
51
- - !ruby/object:Gem::Version
52
- version: 2.3.5
53
- none: false
54
34
  prerelease: false
35
+ version_requirements: *23267140
36
+ - !ruby/object:Gem::Dependency
55
37
  name: addressable
56
- requirement: !ruby/object:Gem::Requirement
38
+ requirement: &23266580 !ruby/object:Gem::Requirement
39
+ none: false
57
40
  requirements:
58
- - - '='
41
+ - - =
59
42
  - !ruby/object:Gem::Version
60
43
  version: 2.3.5
61
- none: false
62
- - !ruby/object:Gem::Dependency
63
44
  type: :runtime
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - '='
67
- - !ruby/object:Gem::Version
68
- version: 0.11.0
69
- none: false
70
45
  prerelease: false
46
+ version_requirements: *23266580
47
+ - !ruby/object:Gem::Dependency
71
48
  name: httparty
72
- requirement: !ruby/object:Gem::Requirement
49
+ requirement: &23266000 !ruby/object:Gem::Requirement
50
+ none: false
73
51
  requirements:
74
- - - '='
52
+ - - =
75
53
  - !ruby/object:Gem::Version
76
54
  version: 0.11.0
77
- none: false
78
- - !ruby/object:Gem::Dependency
79
55
  type: :runtime
80
- version_requirements: !ruby/object:Gem::Requirement
81
- requirements:
82
- - - ! '>='
83
- - !ruby/object:Gem::Version
84
- version: 0.0.35
85
- none: false
86
56
  prerelease: false
57
+ version_requirements: *23266000
58
+ - !ruby/object:Gem::Dependency
87
59
  name: hashlib
88
- requirement: !ruby/object:Gem::Requirement
60
+ requirement: &23265400 !ruby/object:Gem::Requirement
61
+ none: false
89
62
  requirements:
90
63
  - - ! '>='
91
64
  - !ruby/object:Gem::Version
92
65
  version: 0.0.35
93
- none: false
94
- - !ruby/object:Gem::Dependency
95
66
  type: :runtime
96
- version_requirements: !ruby/object:Gem::Requirement
97
- requirements:
98
- - - '='
99
- - !ruby/object:Gem::Version
100
- version: 1.7.9
101
- none: false
102
67
  prerelease: false
68
+ version_requirements: *23265400
69
+ - !ruby/object:Gem::Dependency
103
70
  name: multi_json
104
- requirement: !ruby/object:Gem::Requirement
71
+ requirement: &23264860 !ruby/object:Gem::Requirement
72
+ none: false
105
73
  requirements:
106
- - - '='
74
+ - - =
107
75
  - !ruby/object:Gem::Version
108
76
  version: 1.7.9
109
- none: false
110
- - !ruby/object:Gem::Dependency
111
77
  type: :runtime
112
- version_requirements: !ruby/object:Gem::Requirement
113
- requirements:
114
- - - <=
115
- - !ruby/object:Gem::Version
116
- version: 1.1.4
117
- none: false
118
78
  prerelease: false
79
+ version_requirements: *23264860
80
+ - !ruby/object:Gem::Dependency
119
81
  name: rainbow
120
- requirement: !ruby/object:Gem::Requirement
82
+ requirement: &23264280 !ruby/object:Gem::Requirement
83
+ none: false
121
84
  requirements:
122
85
  - - <=
123
86
  - !ruby/object:Gem::Version
124
87
  version: 1.1.4
125
- none: false
126
- - !ruby/object:Gem::Dependency
127
88
  type: :runtime
128
- version_requirements: !ruby/object:Gem::Requirement
129
- requirements:
130
- - - '='
131
- - !ruby/object:Gem::Version
132
- version: '2.0'
133
- none: false
134
89
  prerelease: false
90
+ version_requirements: *23264280
91
+ - !ruby/object:Gem::Dependency
135
92
  name: trollop
136
- requirement: !ruby/object:Gem::Requirement
93
+ requirement: &23263760 !ruby/object:Gem::Requirement
94
+ none: false
137
95
  requirements:
138
- - - '='
96
+ - - =
139
97
  - !ruby/object:Gem::Version
140
98
  version: '2.0'
141
- none: false
142
- - !ruby/object:Gem::Dependency
143
99
  type: :runtime
144
- version_requirements: !ruby/object:Gem::Requirement
145
- requirements:
146
- - - '='
147
- - !ruby/object:Gem::Version
148
- version: 1.1.2
149
- none: false
150
100
  prerelease: false
101
+ version_requirements: *23263760
102
+ - !ruby/object:Gem::Dependency
151
103
  name: xml-simple
152
- requirement: !ruby/object:Gem::Requirement
104
+ requirement: &23263240 !ruby/object:Gem::Requirement
105
+ none: false
153
106
  requirements:
154
- - - '='
107
+ - - =
155
108
  - !ruby/object:Gem::Version
156
109
  version: 1.1.2
157
- none: false
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: *23263240
158
113
  description: A Ruby wrapper for Onering
159
114
  email: ghetzel@outbrain.com
160
115
  executables:
@@ -162,23 +117,22 @@ executables:
162
117
  extensions: []
163
118
  extra_rdoc_files: []
164
119
  files:
165
- - lib/onering.rb
120
+ - lib/onering/config.rb
166
121
  - lib/onering/logger.rb
167
122
  - lib/onering/cli.rb
168
- - lib/onering/config.rb
169
- - lib/onering/api.rb
170
- - lib/onering/util.rb
171
- - lib/onering/plugins/authentication.rb
172
123
  - lib/onering/plugins/reporter.rb
173
- - lib/onering/plugins/config.rb
124
+ - lib/onering/plugins/authentication.rb
174
125
  - lib/onering/plugins/automation.rb
175
126
  - lib/onering/plugins/assets.rb
176
- - lib/onering/cli/reporter.rb
177
127
  - lib/onering/cli/devices.rb
178
- - lib/onering/cli/automation.rb
128
+ - lib/onering/cli/reporter.rb
179
129
  - lib/onering/cli/fact.rb
130
+ - lib/onering/cli/automation.rb
180
131
  - lib/onering/cli/assets.rb
181
132
  - lib/onering/cli/call.rb
133
+ - lib/onering/api.rb
134
+ - lib/onering/util.rb
135
+ - lib/onering.rb
182
136
  - bin/onering
183
137
  homepage: https://github.com/outbrain/onering-ruby
184
138
  licenses: []
@@ -187,20 +141,20 @@ rdoc_options: []
187
141
  require_paths:
188
142
  - lib
189
143
  required_ruby_version: !ruby/object:Gem::Requirement
144
+ none: false
190
145
  requirements:
191
146
  - - ! '>='
192
147
  - !ruby/object:Gem::Version
193
148
  version: '0'
194
- none: false
195
149
  required_rubygems_version: !ruby/object:Gem::Requirement
150
+ none: false
196
151
  requirements:
197
152
  - - ! '>='
198
153
  - !ruby/object:Gem::Version
199
154
  version: '0'
200
- none: false
201
155
  requirements: []
202
156
  rubyforge_project:
203
- rubygems_version: 1.8.28
157
+ rubygems_version: 1.8.11
204
158
  signing_key:
205
159
  specification_version: 3
206
160
  summary: Onering client API and utilities
@@ -1,27 +0,0 @@
1
- module Onering
2
- class API
3
- class Configuration < API
4
- def get(key, options={})
5
- get("/config/#{key}").parsed_response
6
- end
7
-
8
- def set(key, value)
9
- if not value.is_a?(Hash) and not value.is_a?(Array)
10
- return save(key, value)
11
- end
12
-
13
- return nil
14
- end
15
-
16
- def save(key, data=nil, &block)
17
- if block_given?
18
- post("/config/#{key}", {}, &block)
19
- else
20
- post("/config/#{key}", {
21
- :body => data
22
- })
23
- end
24
- end
25
- end
26
- end
27
- end