onering-client 0.1.2 → 0.1.3
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 +6 -0
- data/lib/onering.rb +1 -1
- data/lib/onering/cli.rb +8 -3
- data/lib/onering/cli/assets.rb +106 -0
- data/lib/onering/cli/devices.rb +6 -1
- data/lib/onering/cli/reporter.rb +69 -19
- data/lib/onering/plugins/{devices.rb → assets.rb} +6 -4
- data/lib/onering/plugins/reporter.rb +88 -18
- data/lib/onering/util.rb +16 -1
- metadata +94 -49
- data/lib/onering/cli/config.rb +0 -55
data/bin/onering
CHANGED
@@ -6,6 +6,8 @@ require 'rainbow'
|
|
6
6
|
require 'pp'
|
7
7
|
|
8
8
|
plugins = Onering::CLI.submodules.collect{|i| i.name.split('::').last.downcase }
|
9
|
+
exclude_plugins = %w{devices}
|
10
|
+
|
9
11
|
global = Trollop::options do
|
10
12
|
banner <<-EOS
|
11
13
|
onering command line client utility - version #{Onering::Client::VERSION}
|
@@ -13,6 +15,9 @@ onering command line client utility - version #{Onering::Client::VERSION}
|
|
13
15
|
Usage:
|
14
16
|
onering [global] [plugin] [subcommand] [options]
|
15
17
|
|
18
|
+
Plugins (onering <plugin> --help for usage details):
|
19
|
+
#{(plugins - exclude_plugins).sort.join(', ')}
|
20
|
+
|
16
21
|
where [global] options are:
|
17
22
|
EOS
|
18
23
|
|
@@ -25,6 +30,7 @@ EOS
|
|
25
30
|
opt :nosslverify, "Disable verification of the server SSL certificate", :type => :boolean
|
26
31
|
opt :apikey, "The API token to use for authentication", :short => '-k', :type => :string
|
27
32
|
opt :quiet, "Suppress standard output", :short => '-q'
|
33
|
+
opt :separator, "A string used to separate output values of delimited tabular data", :short => '-S', :default => "\t"
|
28
34
|
opt :verbosity, "Set the log level (fatal, error, warn, info, debug)", :short => '-v', :type => :string, :default => 'warn'
|
29
35
|
|
30
36
|
stop_on plugins
|
data/lib/onering.rb
CHANGED
data/lib/onering/cli.rb
CHANGED
@@ -26,15 +26,20 @@ module Onering
|
|
26
26
|
|
27
27
|
def self.output(data, format)
|
28
28
|
return nil if @_args[:quiet]
|
29
|
+
return nil if data.nil?
|
29
30
|
|
30
31
|
Onering::Logger.debug("Outputting data as #{format}:", "Onering::CLI")
|
31
32
|
|
32
33
|
case format
|
33
|
-
when 'text'
|
34
|
+
when 'text', 'txt'
|
34
35
|
if data.is_a?(Hash)
|
35
36
|
data.coalesce.each do |k,v|
|
36
37
|
puts k.to_s+': '+v.to_s
|
37
38
|
end
|
39
|
+
|
40
|
+
elsif data.is_a?(Array) and data.first.is_a?(Array)
|
41
|
+
puts data.collect{|i| i.map(&:to_s).join(@_args.get(:separator, "\t")) }.sort.join("\n")
|
42
|
+
|
38
43
|
else
|
39
44
|
[*data].each do |d|
|
40
45
|
if d.is_a?(Hash)
|
@@ -48,7 +53,7 @@ module Onering
|
|
48
53
|
end
|
49
54
|
|
50
55
|
when 'json'
|
51
|
-
puts MultiJson.dump(data)
|
56
|
+
puts MultiJson.dump(data, :pretty => true)
|
52
57
|
|
53
58
|
when 'yaml'
|
54
59
|
puts YAML.dump(data)
|
@@ -57,7 +62,7 @@ module Onering
|
|
57
62
|
Onering::Logger.error("Unknown output format #{format.inspect}", "Onering::CLI")
|
58
63
|
end
|
59
64
|
|
60
|
-
nil
|
65
|
+
return nil
|
61
66
|
end
|
62
67
|
end
|
63
68
|
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
module Onering
|
2
|
+
module CLI
|
3
|
+
module Assets
|
4
|
+
def self.configure(global={})
|
5
|
+
@api = Onering::CLI.connect(global).assets
|
6
|
+
|
7
|
+
@opts = ::Trollop::options do
|
8
|
+
banner <<-EOS
|
9
|
+
Search for, manipulate, and list values from one or more Onering assets.
|
10
|
+
|
11
|
+
Usage:
|
12
|
+
onering [global] assets [options] [subcommands]
|
13
|
+
|
14
|
+
Subcommands:
|
15
|
+
find <urlquery>
|
16
|
+
get <property> [property2 ..]
|
17
|
+
list <property> [property2 ..]
|
18
|
+
save
|
19
|
+
set <property> <value>
|
20
|
+
show <
|
21
|
+
|
22
|
+
Options:
|
23
|
+
EOS
|
24
|
+
|
25
|
+
opt :query, "The Onering urlquery to filter devices by", :short => '-f', :type => :string
|
26
|
+
opt :id, "The node ID of the device to operate on", :short => '-i', :type => :string
|
27
|
+
|
28
|
+
# subcommands
|
29
|
+
stop_on %w{show get set list find save}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.run(args)
|
34
|
+
sc = args.shift
|
35
|
+
|
36
|
+
case (sc.downcase.to_sym rescue nil)
|
37
|
+
# -----------------------------------------------------------------------------
|
38
|
+
when :show
|
39
|
+
return @api.assets.show(args[0])
|
40
|
+
|
41
|
+
# -----------------------------------------------------------------------------
|
42
|
+
when :get
|
43
|
+
Onering::Logger.fatal!("Expected 1 parameter, got #{args.length}", "Onering::CLI::Devices") unless args.length == 1
|
44
|
+
|
45
|
+
if @opts[:query_given]
|
46
|
+
# doing this until a bulk field query endpoint is built
|
47
|
+
return @api.list('id', {
|
48
|
+
:filter => @opts[:query]
|
49
|
+
}).collect{|i| @api.get_field(i, args[0])}
|
50
|
+
|
51
|
+
elsif @opts[:id_given]
|
52
|
+
return @api.get_field(@opts[:id], args[0])
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
# -----------------------------------------------------------------------------
|
57
|
+
when :set
|
58
|
+
Onering::Logger.fatal!("Expected 2 parameters, got #{args.length}", "Onering::CLI::Devices") unless args.length == 2
|
59
|
+
|
60
|
+
if @opts[:query]
|
61
|
+
# doing this until a bulk field set endpoint is built
|
62
|
+
return @api.list('id', {
|
63
|
+
:filter => @opts[:query]
|
64
|
+
}).collect{|i| @api.set_field(i, args[0])}
|
65
|
+
|
66
|
+
elsif @opts[:id]
|
67
|
+
return @api.set_field(@opts[:id], args[0], args[1])
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
# -----------------------------------------------------------------------------
|
72
|
+
when :list
|
73
|
+
Onering::Logger.fatal!("Expected 1 parameter, got #{args.length}", "Onering::CLI::Devices") unless args.length >= 1
|
74
|
+
return @api.list(args, {
|
75
|
+
:filter => @opts[:query]
|
76
|
+
}.compact)
|
77
|
+
|
78
|
+
# -----------------------------------------------------------------------------
|
79
|
+
when :find
|
80
|
+
Onering::Logger.fatal!("Expected 1 parameter, got #{args.length}", "Onering::CLI::Devices") unless args.length == 1
|
81
|
+
return @api.find(args[0])
|
82
|
+
|
83
|
+
# -----------------------------------------------------------------------------
|
84
|
+
when :save
|
85
|
+
rv = @api.save(args[0] || @opts[:id]) do
|
86
|
+
# read from pipe
|
87
|
+
if not STDIN.tty?
|
88
|
+
STDIN.read()
|
89
|
+
|
90
|
+
# read from specified file
|
91
|
+
elsif (File.readable?(args[1]) rescue false)
|
92
|
+
File.read(args[1])
|
93
|
+
|
94
|
+
else
|
95
|
+
Onering::Logger.fatal!("Cannot save data, no input data specified", "Onering::CLI::Devices")
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
rv.parsed_response
|
100
|
+
else
|
101
|
+
Onering::Logger.fatal!("Unknown subcommand #{sc.inspect}", "Onering::CLI::Devices")
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
data/lib/onering/cli/devices.rb
CHANGED
@@ -2,10 +2,15 @@ module Onering
|
|
2
2
|
module CLI
|
3
3
|
module Devices
|
4
4
|
def self.configure(global={})
|
5
|
-
@api = Onering::CLI.connect(global).
|
5
|
+
@api = Onering::CLI.connect(global).assets
|
6
6
|
|
7
7
|
@opts = ::Trollop::options do
|
8
8
|
banner <<-EOS
|
9
|
+
[DEPRECATED in 0.1.3] Use the 'assets' plugin from now on.
|
10
|
+
|
11
|
+
Usage:
|
12
|
+
onering [global] report [options]
|
13
|
+
|
9
14
|
Options:
|
10
15
|
EOS
|
11
16
|
|
data/lib/onering/cli/reporter.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
module Onering
|
2
2
|
module CLI
|
3
3
|
module Report
|
4
|
+
DEFAULT_CACHE_MAXAGE=600
|
5
|
+
|
4
6
|
def self.configure(global={})
|
7
|
+
|
5
8
|
@api = (Onering::CLI.connect(global.merge({
|
6
9
|
:autoconnect => false
|
7
10
|
})) rescue nil)
|
@@ -20,17 +23,82 @@ EOS
|
|
20
23
|
opt :save, "Save the report output to the configured Onering server"
|
21
24
|
opt :timeout, "The maximum amount of time to wait for a report to be generated", :type => :integer, :default => 60
|
22
25
|
opt :plugin_timeout, "The maximum amount of time to wait for a report plugin to return data", :type => :integer, :default => 10
|
26
|
+
opt :local, "Do not attempt to contact a remote server for retrieving values not found locally", :type => :boolean, :default => false
|
27
|
+
opt :cachefile, "Use the specified file as a local report cache", :type => :string, :short => '-F'
|
28
|
+
opt :nocache, "Do not attempt to use a cache file for report generation", :type => :boolean, :default => false
|
29
|
+
opt :maxage, "Maxmimum age (in seconds) of the cache before it is automatically regenerated", :type => :integer, :default => DEFAULT_CACHE_MAXAGE
|
30
|
+
|
31
|
+
stop_on %w{get save}
|
23
32
|
end
|
24
33
|
|
25
34
|
# initialize report generator with user options
|
26
35
|
Onering::Reporter.setup({
|
27
36
|
:id => @opts[:id],
|
28
37
|
:timeout => @opts[:timeout],
|
29
|
-
:plugin_timeout => @opts[:plugin_timeout]
|
38
|
+
:plugin_timeout => @opts[:plugin_timeout],
|
39
|
+
:nocache => @opts[:nocache],
|
40
|
+
:cachefile => @opts[:cachefile],
|
41
|
+
:maxage => @opts[:maxage]
|
30
42
|
}.compact)
|
31
43
|
end
|
32
44
|
|
33
45
|
def self.run(args)
|
46
|
+
report = _report()
|
47
|
+
|
48
|
+
# pull overrides from CLI arguments
|
49
|
+
@opts[:fields].each do |field|
|
50
|
+
key, value = field.split('=', 2)
|
51
|
+
Onering::Logger.debug("Override value #{key} from command line argument", "Onering::CLI::Report")
|
52
|
+
|
53
|
+
value = nil if ['null', '', '-'].include?(value.to_s.strip.chomp)
|
54
|
+
report = report.set(key, value)
|
55
|
+
end
|
56
|
+
|
57
|
+
# save if specified
|
58
|
+
if @opts[:save] === true
|
59
|
+
_save(report)
|
60
|
+
|
61
|
+
else
|
62
|
+
sc = args.shift
|
63
|
+
|
64
|
+
case (sc.downcase.to_sym rescue nil)
|
65
|
+
# -----------------------------------------------------------------------------
|
66
|
+
when :save
|
67
|
+
_save(report)
|
68
|
+
return nil
|
69
|
+
|
70
|
+
when :get
|
71
|
+
Onering::Logger.fatal!("Expected at least 1 parameter, got #{args.length}", "Onering::CLI::Devices") unless args.length >= 1
|
72
|
+
|
73
|
+
rv = report.get("properties.#{args[0]}", report.get(args[0], args[1]))
|
74
|
+
|
75
|
+
# attempt to get the value remotely if not found locally
|
76
|
+
if rv.nil? and not @opts[:local]
|
77
|
+
hid = Onering::Util.fact(:hardwareid)
|
78
|
+
|
79
|
+
if not hid.nil?
|
80
|
+
Onering::Logger.debug("Getting remote value #{args[0]} for asset #{hid}")
|
81
|
+
@api.connect()
|
82
|
+
return @api.assets.get_field(hid, args[0], args[1])
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
return rv
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
return report
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
def self._save(report)
|
95
|
+
@api.connect()
|
96
|
+
@api.assets.save(report['id']) do
|
97
|
+
MultiJson.dump(report)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def self._report()
|
34
102
|
begin
|
35
103
|
Onering::Logger.debug("Gathering local data for report", "Onering::CLI::Report")
|
36
104
|
report = Onering::Reporter.report().stringify_keys()
|
@@ -50,24 +118,6 @@ EOS
|
|
50
118
|
end
|
51
119
|
end
|
52
120
|
|
53
|
-
# pull overrides from CLI arguments
|
54
|
-
@opts[:fields].each do |field|
|
55
|
-
key, value = field.split('=', 2)
|
56
|
-
Onering::Logger.debug("Override value #{key} from command line argument", "Onering::CLI::Report")
|
57
|
-
|
58
|
-
value = nil if ['null', '', '-'].include?(value.to_s.strip.chomp)
|
59
|
-
report = report.set(key, value)
|
60
|
-
end
|
61
|
-
|
62
|
-
|
63
|
-
# save if specified
|
64
|
-
if @opts[:save] === true
|
65
|
-
@api.connect()
|
66
|
-
@api.devices.save(report['id']) do
|
67
|
-
MultiJson.dump(report)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
121
|
return report
|
72
122
|
rescue Timeout::Error
|
73
123
|
Onering::Logger.fatal!("Report took too long to generate, exiting...", "Onering::CLI::Report")
|
@@ -1,13 +1,15 @@
|
|
1
1
|
module Onering
|
2
2
|
class API
|
3
|
-
class
|
3
|
+
class Assets < API
|
4
4
|
def show(id)
|
5
5
|
get("/devices/#{id}").parsed_response
|
6
6
|
end
|
7
7
|
|
8
|
-
def get_field(id, field)
|
8
|
+
def get_field(id, field, fallback=nil)
|
9
9
|
rv = get("/devices/#{id}/get/#{field}")
|
10
|
-
rv.parsed_response rescue rv.response.body
|
10
|
+
rv = (rv.parsed_response rescue rv.response.body)
|
11
|
+
return fallback if rv.nil? or rv.strip.chomp.empty?
|
12
|
+
return rv
|
11
13
|
end
|
12
14
|
|
13
15
|
def set_field(id, field, value)
|
@@ -24,7 +26,7 @@ module Onering
|
|
24
26
|
:q => make_filter(options[:filter])
|
25
27
|
} if options[:filter]
|
26
28
|
|
27
|
-
rv = get("/devices/list/#{field}", {
|
29
|
+
rv = get("/devices/list/#{[*field].join('/')}", {
|
28
30
|
:query => qs
|
29
31
|
}).parsed_response
|
30
32
|
|
@@ -23,6 +23,9 @@ module Onering
|
|
23
23
|
'/etc/facter'
|
24
24
|
]
|
25
25
|
|
26
|
+
DEFAULT_CACHE_FILE='/var/tmp/.onering-report-cache.json'
|
27
|
+
DEFAULT_CACHE_MAXAGE=600
|
28
|
+
|
26
29
|
class<<self
|
27
30
|
include Onering::Util
|
28
31
|
|
@@ -143,29 +146,96 @@ module Onering
|
|
143
146
|
@id = (@options[:id] || Onering::Util.fact('hardwareid', nil))
|
144
147
|
|
145
148
|
if not @id.nil?
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
:aliases => @options[:aliases],
|
153
|
-
:tags => @options[:tags],
|
154
|
-
:status => (@options[:status] || 'online'),
|
155
|
-
:inventory => true,
|
156
|
-
:properties => {}
|
157
|
-
}
|
158
|
-
|
159
|
-
# loads plugins and populates @_report
|
160
|
-
load_plugins
|
161
|
-
|
162
|
-
return @_report.stringify_keys()
|
149
|
+
if @options[:nocache]
|
150
|
+
return _generated_report()
|
151
|
+
else
|
152
|
+
rv = _cached_report()
|
153
|
+
return _generated_report() if rv.nil? or rv.empty?
|
154
|
+
return rv
|
163
155
|
end
|
164
156
|
else
|
165
157
|
Onering::Logger.fatal!("Cannot generate report without a hardware ID", "Onering::Reporter")
|
166
158
|
end
|
167
159
|
|
168
|
-
{}
|
160
|
+
return {}
|
161
|
+
end
|
162
|
+
|
163
|
+
|
164
|
+
def _generated_report()
|
165
|
+
Timeout.timeout((@options[:timeout] || 60).to_i) do
|
166
|
+
hostname = (Facter.value('fqdn') rescue %x{hostname -f}.strip.chomp)
|
167
|
+
|
168
|
+
@_report = {
|
169
|
+
:id => @id,
|
170
|
+
:name => hostname,
|
171
|
+
:aliases => @options[:aliases],
|
172
|
+
:tags => @options[:tags],
|
173
|
+
:status => (@options[:status] || 'online'),
|
174
|
+
:inventory => true,
|
175
|
+
:properties => {}
|
176
|
+
}
|
177
|
+
|
178
|
+
# loads plugins and populates @_report
|
179
|
+
load_plugins
|
180
|
+
|
181
|
+
return @_report.stringify_keys()
|
182
|
+
end
|
183
|
+
|
184
|
+
return {}
|
185
|
+
end
|
186
|
+
|
187
|
+
def _cached_report()
|
188
|
+
cachefile = (@options[:cachefile] || DEFAULT_CACHE_FILE)
|
189
|
+
|
190
|
+
catch(:retry) do
|
191
|
+
if File.readable?(cachefile)
|
192
|
+
Onering::Logger.debug("Loading cache file at #{cachefile}", "Onering::Reporter")
|
193
|
+
cache = File.read(cachefile)
|
194
|
+
cache = (MultiJson.load(cache) rescue {})
|
195
|
+
|
196
|
+
if _cache_expired?(cache, @options[:maxage])
|
197
|
+
Onering::Logger.debug("Cache expired, regenerating...", "Onering::Reporter")
|
198
|
+
throw :retry if _update_cache_file(cachefile)
|
199
|
+
end
|
200
|
+
|
201
|
+
# remove cached_at key
|
202
|
+
Onering::Logger.debug("Using cached data (#{Time.now.to_i - Time.parse(cache.get('cached_at')).to_i} seconds old)", "Onering::Reporter")
|
203
|
+
cache.delete('cached_at')
|
204
|
+
return cache
|
205
|
+
else
|
206
|
+
Onering::Logger.debug("Report cache file could not be read at #{cachefile}", "Onering::Reporter")
|
207
|
+
throw :retry if _update_cache_file(cachefile)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
return {}
|
212
|
+
end
|
213
|
+
|
214
|
+
|
215
|
+
def _update_cache_file(cachefile=DEFAULT_CACHE_FILE)
|
216
|
+
begin
|
217
|
+
File.open(cachefile, 'w+') do |file|
|
218
|
+
Onering::Logger.debug("Regenerating cache file at #{cachefile}", "Onering::Reporter")
|
219
|
+
report = _generated_report()
|
220
|
+
report['cached_at'] = Time.now.strftime('%Y-%m-%dT%H:%M:%S%z')
|
221
|
+
json = MultiJson.dump(report, :pretty => true)
|
222
|
+
file.puts(json)
|
223
|
+
end
|
224
|
+
|
225
|
+
return true
|
226
|
+
rescue Exception => e
|
227
|
+
Onering::Logger.warn("Error while writing cache file #{cachefile}: #{e.class.name} - #{e.message}", "Onering::Reporter")
|
228
|
+
return false
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
|
233
|
+
def _cache_expired?(cache, age=DEFAULT_CACHE_MAXAGE)
|
234
|
+
if cache.is_a?(Hash)
|
235
|
+
return (Time.parse(cache.get('cached_at')) < (Time.now - age) rescue true)
|
236
|
+
else
|
237
|
+
return true
|
238
|
+
end
|
169
239
|
end
|
170
240
|
end
|
171
241
|
end
|
data/lib/onering/util.rb
CHANGED
@@ -94,7 +94,16 @@ module Onering
|
|
94
94
|
if name.downcase == 'all'
|
95
95
|
return Facter.to_hash
|
96
96
|
else
|
97
|
-
|
97
|
+
case name.to_sym
|
98
|
+
when :hardwareid
|
99
|
+
if File.exists?('/etc/hardware.id')
|
100
|
+
fact = File.read('/etc/hardware.id').lines.first.strip.chomp
|
101
|
+
else
|
102
|
+
fact = Facter.value(name)
|
103
|
+
end
|
104
|
+
else
|
105
|
+
fact = Facter.value(name)
|
106
|
+
end
|
98
107
|
|
99
108
|
# short circuit nil responses
|
100
109
|
return default if fact.nil?
|
@@ -140,4 +149,10 @@ class Module
|
|
140
149
|
def submodules
|
141
150
|
constants.collect {|const_name| const_get(const_name)}.select {|const| const.class == Module}
|
142
151
|
end
|
152
|
+
end
|
153
|
+
|
154
|
+
class NilClass
|
155
|
+
def <=>(*args)
|
156
|
+
return 1
|
157
|
+
end
|
143
158
|
end
|
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.1.2
|
5
4
|
prerelease:
|
5
|
+
version: 0.1.3
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Gary Hetzel
|
@@ -12,104 +12,149 @@ cert_chain: []
|
|
12
12
|
date: 2013-01-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
|
16
|
-
|
15
|
+
type: :runtime
|
16
|
+
version_requirements: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ! '>='
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 1.7.2
|
17
21
|
none: false
|
22
|
+
prerelease: false
|
23
|
+
name: facter
|
24
|
+
requirement: !ruby/object:Gem::Requirement
|
18
25
|
requirements:
|
19
26
|
- - ! '>='
|
20
27
|
- !ruby/object:Gem::Version
|
21
28
|
version: 1.7.2
|
29
|
+
none: false
|
30
|
+
- !ruby/object:Gem::Dependency
|
22
31
|
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
|
23
38
|
prerelease: false
|
24
|
-
version_requirements: *11003660
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
39
|
name: deep_merge
|
27
|
-
requirement:
|
28
|
-
none: false
|
40
|
+
requirement: !ruby/object:Gem::Requirement
|
29
41
|
requirements:
|
30
|
-
- - =
|
42
|
+
- - '='
|
31
43
|
- !ruby/object:Gem::Version
|
32
44
|
version: 1.0.0
|
45
|
+
none: false
|
46
|
+
- !ruby/object:Gem::Dependency
|
33
47
|
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
|
34
54
|
prerelease: false
|
35
|
-
version_requirements: *11019380
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
55
|
name: addressable
|
38
|
-
requirement:
|
39
|
-
none: false
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
40
57
|
requirements:
|
41
|
-
- - =
|
58
|
+
- - '='
|
42
59
|
- !ruby/object:Gem::Version
|
43
60
|
version: 2.3.5
|
61
|
+
none: false
|
62
|
+
- !ruby/object:Gem::Dependency
|
44
63
|
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
|
45
70
|
prerelease: false
|
46
|
-
version_requirements: *11018780
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
71
|
name: httparty
|
49
|
-
requirement:
|
50
|
-
none: false
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
51
73
|
requirements:
|
52
|
-
- - =
|
74
|
+
- - '='
|
53
75
|
- !ruby/object:Gem::Version
|
54
76
|
version: 0.11.0
|
77
|
+
none: false
|
78
|
+
- !ruby/object:Gem::Dependency
|
55
79
|
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
|
56
86
|
prerelease: false
|
57
|
-
version_requirements: *11018280
|
58
|
-
- !ruby/object:Gem::Dependency
|
59
87
|
name: hashlib
|
60
|
-
requirement:
|
61
|
-
none: false
|
88
|
+
requirement: !ruby/object:Gem::Requirement
|
62
89
|
requirements:
|
63
90
|
- - ! '>='
|
64
91
|
- !ruby/object:Gem::Version
|
65
92
|
version: 0.0.35
|
93
|
+
none: false
|
94
|
+
- !ruby/object:Gem::Dependency
|
66
95
|
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
|
67
102
|
prerelease: false
|
68
|
-
version_requirements: *11017620
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
103
|
name: multi_json
|
71
|
-
requirement:
|
72
|
-
none: false
|
104
|
+
requirement: !ruby/object:Gem::Requirement
|
73
105
|
requirements:
|
74
|
-
- - =
|
106
|
+
- - '='
|
75
107
|
- !ruby/object:Gem::Version
|
76
108
|
version: 1.7.9
|
109
|
+
none: false
|
110
|
+
- !ruby/object:Gem::Dependency
|
77
111
|
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
|
78
118
|
prerelease: false
|
79
|
-
version_requirements: *11016940
|
80
|
-
- !ruby/object:Gem::Dependency
|
81
119
|
name: rainbow
|
82
|
-
requirement:
|
83
|
-
none: false
|
120
|
+
requirement: !ruby/object:Gem::Requirement
|
84
121
|
requirements:
|
85
122
|
- - <=
|
86
123
|
- !ruby/object:Gem::Version
|
87
124
|
version: 1.1.4
|
125
|
+
none: false
|
126
|
+
- !ruby/object:Gem::Dependency
|
88
127
|
type: :runtime
|
128
|
+
version_requirements: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - '='
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '2.0'
|
133
|
+
none: false
|
89
134
|
prerelease: false
|
90
|
-
version_requirements: *11016220
|
91
|
-
- !ruby/object:Gem::Dependency
|
92
135
|
name: trollop
|
93
|
-
requirement:
|
94
|
-
none: false
|
136
|
+
requirement: !ruby/object:Gem::Requirement
|
95
137
|
requirements:
|
96
|
-
- - =
|
138
|
+
- - '='
|
97
139
|
- !ruby/object:Gem::Version
|
98
140
|
version: '2.0'
|
141
|
+
none: false
|
142
|
+
- !ruby/object:Gem::Dependency
|
99
143
|
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
|
100
150
|
prerelease: false
|
101
|
-
version_requirements: *11015380
|
102
|
-
- !ruby/object:Gem::Dependency
|
103
151
|
name: xml-simple
|
104
|
-
requirement:
|
105
|
-
none: false
|
152
|
+
requirement: !ruby/object:Gem::Requirement
|
106
153
|
requirements:
|
107
|
-
- - =
|
154
|
+
- - '='
|
108
155
|
- !ruby/object:Gem::Version
|
109
156
|
version: 1.1.2
|
110
|
-
|
111
|
-
prerelease: false
|
112
|
-
version_requirements: *11013900
|
157
|
+
none: false
|
113
158
|
description: A Ruby wrapper for Onering
|
114
159
|
email: ghetzel@outbrain.com
|
115
160
|
executables:
|
@@ -125,14 +170,14 @@ files:
|
|
125
170
|
- lib/onering/util.rb
|
126
171
|
- lib/onering/plugins/authentication.rb
|
127
172
|
- lib/onering/plugins/reporter.rb
|
128
|
-
- lib/onering/plugins/devices.rb
|
129
173
|
- lib/onering/plugins/config.rb
|
130
174
|
- lib/onering/plugins/automation.rb
|
175
|
+
- lib/onering/plugins/assets.rb
|
131
176
|
- lib/onering/cli/reporter.rb
|
132
177
|
- lib/onering/cli/devices.rb
|
133
|
-
- lib/onering/cli/config.rb
|
134
178
|
- lib/onering/cli/automation.rb
|
135
179
|
- lib/onering/cli/fact.rb
|
180
|
+
- lib/onering/cli/assets.rb
|
136
181
|
- lib/onering/cli/call.rb
|
137
182
|
- bin/onering
|
138
183
|
homepage: https://github.com/outbrain/onering-ruby
|
@@ -142,20 +187,20 @@ rdoc_options: []
|
|
142
187
|
require_paths:
|
143
188
|
- lib
|
144
189
|
required_ruby_version: !ruby/object:Gem::Requirement
|
145
|
-
none: false
|
146
190
|
requirements:
|
147
191
|
- - ! '>='
|
148
192
|
- !ruby/object:Gem::Version
|
149
193
|
version: '0'
|
150
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
151
194
|
none: false
|
195
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
152
196
|
requirements:
|
153
197
|
- - ! '>='
|
154
198
|
- !ruby/object:Gem::Version
|
155
199
|
version: '0'
|
200
|
+
none: false
|
156
201
|
requirements: []
|
157
202
|
rubyforge_project:
|
158
|
-
rubygems_version: 1.8.
|
203
|
+
rubygems_version: 1.8.28
|
159
204
|
signing_key:
|
160
205
|
specification_version: 3
|
161
206
|
summary: Onering client API and utilities
|
data/lib/onering/cli/config.rb
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
module Onering
|
2
|
-
module CLI
|
3
|
-
module Config
|
4
|
-
def self.configure(global={})
|
5
|
-
Onering::Reporter.setup()
|
6
|
-
@api = Onering::CLI.connect(global)
|
7
|
-
|
8
|
-
@opts = ::Trollop::options do
|
9
|
-
banner <<-EOS
|
10
|
-
Options:
|
11
|
-
EOS
|
12
|
-
|
13
|
-
opt :id, "The node ID of the device to operate on", :short => '-i', :type => :string, :default => Onering::Util.fact('hardwareid')
|
14
|
-
|
15
|
-
# subcommands
|
16
|
-
stop_on %w{get set test}
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.run(args)
|
21
|
-
sc = args.shift
|
22
|
-
|
23
|
-
case (sc.downcase.to_sym rescue nil)
|
24
|
-
# -----------------------------------------------------------------------------
|
25
|
-
when :get
|
26
|
-
raise "Expected 1 parameter, got #{args.length}" unless args.length >= 1
|
27
|
-
|
28
|
-
begin
|
29
|
-
rv = @api.request(@opts[:method], "devices/#{@opts[:id]}/config/#{args[0].gsub('.','/')}")
|
30
|
-
return (rv.parsed_response rescue rv.response.body)
|
31
|
-
rescue Onering::API::Errors::NotFound
|
32
|
-
if args[1].nil? and not STDIN.tty?
|
33
|
-
args[1] = STDIN.read()
|
34
|
-
end
|
35
|
-
|
36
|
-
return (MultiJson.load(args[1]) rescue args[1])
|
37
|
-
end
|
38
|
-
|
39
|
-
# -----------------------------------------------------------------------------
|
40
|
-
when :set
|
41
|
-
raise "Expected 2 parameters, got #{args.length}" unless args.length == 2
|
42
|
-
|
43
|
-
return @api.set_field(@opts[:id], "config.#{args[0]}", args[1])
|
44
|
-
|
45
|
-
# -----------------------------------------------------------------------------
|
46
|
-
when :test
|
47
|
-
raise "Expected 1 parameter, got #{args.length}" unless args.length >= 1
|
48
|
-
|
49
|
-
else
|
50
|
-
raise "Unknown subcommand #{sc.inspect}"
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|