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 +0 -3
- data/lib/onering.rb +12 -1
- data/lib/onering/api.rb +0 -1
- data/lib/onering/cli/assets.rb +0 -1
- data/lib/onering/cli/fact.rb +1 -2
- data/lib/onering/cli/reporter.rb +49 -8
- data/lib/onering/plugins/reporter.rb +200 -176
- data/lib/onering/util.rb +7 -4
- metadata +54 -100
- data/lib/onering/plugins/config.rb +0 -27
data/bin/onering
CHANGED
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.
|
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
data/lib/onering/cli/assets.rb
CHANGED
data/lib/onering/cli/fact.rb
CHANGED
@@ -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
|
data/lib/onering/cli/reporter.rb
CHANGED
@@ -5,16 +5,26 @@ module Onering
|
|
5
5
|
|
6
6
|
def self.configure(global={})
|
7
7
|
|
8
|
-
@api =
|
8
|
+
@api = Onering::CLI.connect(global.merge({
|
9
9
|
:autoconnect => false
|
10
|
-
}))
|
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.
|
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::
|
79
|
-
|
80
|
-
|
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
|
-
|
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
|
-
|
30
|
-
include Onering::Util
|
25
|
+
include Onering::Util
|
31
26
|
|
32
|
-
|
27
|
+
attr_reader :facter_path
|
33
28
|
|
34
|
-
|
35
|
-
|
36
|
-
@
|
37
|
-
@
|
29
|
+
class PluginDelegate
|
30
|
+
def initialize(reporter, options={})
|
31
|
+
@_name = options.get(:plugin)
|
32
|
+
@_path = options.get(:path)
|
38
33
|
|
39
|
-
|
40
|
-
@
|
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
|
-
|
44
|
-
|
45
|
-
|
42
|
+
# DSL methods
|
43
|
+
# -------------------------------------------------------------------------
|
44
|
+
def report(&block)
|
45
|
+
if block_given?
|
46
|
+
start = Time.now.to_f
|
47
|
+
yield
|
46
48
|
|
47
|
-
|
48
|
-
|
49
|
-
|
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
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
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
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
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
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
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
|
-
|
76
|
-
|
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
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
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
|
-
|
111
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
125
|
-
if block_given?
|
126
|
-
instance_eval(&block)
|
158
|
+
next
|
127
159
|
end
|
128
160
|
end
|
161
|
+
end
|
129
162
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
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
|
-
|
138
|
-
|
139
|
-
|
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
|
-
|
146
|
-
|
147
|
-
|
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
|
-
|
178
|
+
rv = _cached_report(options)
|
179
|
+
return _generated_report() if rv.nil? or rv.empty?
|
180
|
+
return rv
|
159
181
|
end
|
160
|
-
|
161
|
-
|
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
|
-
|
170
|
-
|
171
|
-
|
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
|
-
|
180
|
-
|
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
|
-
|
183
|
-
|
204
|
+
# loads plugins and populates @_report
|
205
|
+
load_plugins()
|
184
206
|
|
185
|
-
return
|
207
|
+
return @_report.stringify_keys()
|
186
208
|
end
|
187
209
|
|
188
|
-
|
189
|
-
|
190
|
-
cachefile = (options[:cachefile] || DEFAULT_CACHE_FILE)
|
191
|
-
tries = 0
|
210
|
+
return {}
|
211
|
+
end
|
192
212
|
|
193
|
-
|
194
|
-
|
213
|
+
def _cached_report(options={})
|
214
|
+
options = @options.merge(options)
|
215
|
+
cachefile = (options[:cachefile] || DEFAULT_CACHE_FILE)
|
216
|
+
tries = 0
|
195
217
|
|
196
|
-
|
197
|
-
|
198
|
-
return _generated_report()
|
199
|
-
end
|
218
|
+
catch(:retry) do
|
219
|
+
tries += 1
|
200
220
|
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
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
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
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
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
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
|
-
|
217
|
-
|
218
|
-
|
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
|
-
|
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
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
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
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
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
|
-
|
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
|
-
|
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/
|
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/
|
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.
|
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
|