onering-client 0.1.7 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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