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 +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
|