icinga2 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +504 -0
- data/README.md +118 -0
- data/doc/downtimes.md +7 -0
- data/doc/examples +122 -0
- data/doc/hostgroups.md +19 -0
- data/doc/hosts.md +22 -0
- data/doc/notifications.md +15 -0
- data/doc/servicegroups.md +19 -0
- data/doc/services.md +26 -0
- data/doc/usergroups.md +12 -0
- data/doc/users.md +41 -0
- data/examples/test.rb +150 -0
- data/lib/icinga2.rb +140 -0
- data/lib/icinga2/converts.rb +77 -0
- data/lib/icinga2/downtimes.rb +173 -0
- data/lib/icinga2/hostgroups.rb +98 -0
- data/lib/icinga2/hosts.rb +307 -0
- data/lib/icinga2/network.rb +397 -0
- data/lib/icinga2/notifications.rb +158 -0
- data/lib/icinga2/servicegroups.rb +101 -0
- data/lib/icinga2/services.rb +301 -0
- data/lib/icinga2/status.rb +52 -0
- data/lib/icinga2/tools.rb +13 -0
- data/lib/icinga2/usergroups.rb +101 -0
- data/lib/icinga2/users.rb +143 -0
- data/lib/icinga2/version.rb +15 -0
- data/lib/logging.rb +36 -0
- metadata +210 -0
@@ -0,0 +1,307 @@
|
|
1
|
+
|
2
|
+
module Icinga2
|
3
|
+
|
4
|
+
module Hosts
|
5
|
+
|
6
|
+
def addHost( params = {} )
|
7
|
+
|
8
|
+
name = params.dig(:name)
|
9
|
+
fqdn = params.dig(:fqdn)
|
10
|
+
displayName = params.dig(:display_name) || name
|
11
|
+
notifications = params.dig(:enable_notifications) || false
|
12
|
+
maxCheckAttempts = params.dig(:max_check_attempts) || 3
|
13
|
+
checkInterval = params.dig(:check_interval) || 60
|
14
|
+
retryInterval = params.dig(:retry_interval) || 45
|
15
|
+
notes = params.dig(:notes)
|
16
|
+
notesUrl = params.dig(:notes_url)
|
17
|
+
actionUrl = params.dig(:action_url)
|
18
|
+
vars = params.dig(:vars) || {}
|
19
|
+
|
20
|
+
if( name == nil )
|
21
|
+
|
22
|
+
return {
|
23
|
+
:status => 404,
|
24
|
+
:message => 'missing host name'
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
if( fqdn == nil )
|
29
|
+
# build FQDN
|
30
|
+
fqdn = Socket.gethostbyname( name ).first
|
31
|
+
end
|
32
|
+
|
33
|
+
payload = {
|
34
|
+
"templates" => [ "generic-host" ],
|
35
|
+
"attrs" => {
|
36
|
+
"address" => fqdn,
|
37
|
+
"display_name" => displayName,
|
38
|
+
"max_check_attempts" => maxCheckAttempts.to_i,
|
39
|
+
"check_interval" => checkInterval.to_i,
|
40
|
+
"retry_interval" => retryInterval.to_i,
|
41
|
+
"enable_notifications" => notifications,
|
42
|
+
"action_url" => actionUrl,
|
43
|
+
"notes" => notes,
|
44
|
+
"notes_url" => notesUrl
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
if( ! vars.empty? )
|
49
|
+
payload['attrs']['vars'] = vars
|
50
|
+
end
|
51
|
+
|
52
|
+
if( @icingaCluster == true && @icingaSatellite != nil )
|
53
|
+
payload['attrs']['zone'] = @icingaSatellite
|
54
|
+
end
|
55
|
+
|
56
|
+
logger.debug( JSON.pretty_generate( payload ) )
|
57
|
+
|
58
|
+
result = Network.put( {
|
59
|
+
:host => name,
|
60
|
+
:url => sprintf( '%s/v1/objects/hosts/%s', @icingaApiUrlBase, name ),
|
61
|
+
:headers => @headers,
|
62
|
+
:options => @options,
|
63
|
+
:payload => payload
|
64
|
+
} )
|
65
|
+
|
66
|
+
return JSON.pretty_generate( result )
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
def deleteHost( params = {} )
|
72
|
+
|
73
|
+
name = params.dig(:name)
|
74
|
+
|
75
|
+
if( name == nil )
|
76
|
+
|
77
|
+
return {
|
78
|
+
:status => 404,
|
79
|
+
:message => 'missing host name'
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
result = Network.delete( {
|
84
|
+
:host => name,
|
85
|
+
:url => sprintf( '%s/v1/objects/hosts/%s?cascade=1', @icingaApiUrlBase, name ),
|
86
|
+
:headers => @headers,
|
87
|
+
:options => @options
|
88
|
+
} )
|
89
|
+
|
90
|
+
return JSON.pretty_generate( result )
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
def listHosts( params = {} )
|
96
|
+
|
97
|
+
name = params.dig(:name)
|
98
|
+
attrs = params.dig(:attrs)
|
99
|
+
filter = params.dig(:filter)
|
100
|
+
joins = params.dig(:joins)
|
101
|
+
|
102
|
+
if( attrs != nil )
|
103
|
+
payload['attrs'] = attrs
|
104
|
+
end
|
105
|
+
|
106
|
+
if( filter != nil )
|
107
|
+
payload['filter'] = filter
|
108
|
+
end
|
109
|
+
|
110
|
+
if( joins != nil )
|
111
|
+
payload['joins'] = joins
|
112
|
+
end
|
113
|
+
|
114
|
+
result = Network.get( {
|
115
|
+
:host => name,
|
116
|
+
:url => sprintf( '%s/v1/objects/hosts/%s', @icingaApiUrlBase, name ),
|
117
|
+
:headers => @headers,
|
118
|
+
:options => @options
|
119
|
+
} )
|
120
|
+
|
121
|
+
return JSON.pretty_generate( result )
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
def existsHost?( name )
|
127
|
+
|
128
|
+
result = self.listHosts( { :name => name } )
|
129
|
+
|
130
|
+
if( result.is_a?( String ) )
|
131
|
+
result = JSON.parse( result )
|
132
|
+
end
|
133
|
+
|
134
|
+
status = result.dig('status')
|
135
|
+
|
136
|
+
if( status != nil && status == 200 )
|
137
|
+
return true
|
138
|
+
end
|
139
|
+
|
140
|
+
return false
|
141
|
+
|
142
|
+
end
|
143
|
+
|
144
|
+
|
145
|
+
def hostObjects( params = {} )
|
146
|
+
|
147
|
+
attrs = params.dig(:attrs)
|
148
|
+
filter = params.dig(:filter)
|
149
|
+
joins = params.dig(:joins)
|
150
|
+
payload = {}
|
151
|
+
|
152
|
+
if( attrs == nil )
|
153
|
+
attrs = ['name','state','acknowledgement','downtime_depth','last_check']
|
154
|
+
end
|
155
|
+
|
156
|
+
if( attrs != nil )
|
157
|
+
payload['attrs'] = attrs
|
158
|
+
end
|
159
|
+
|
160
|
+
if( filter != nil )
|
161
|
+
payload['filter'] = filter
|
162
|
+
end
|
163
|
+
|
164
|
+
if( joins != nil )
|
165
|
+
payload['joins'] = joins
|
166
|
+
end
|
167
|
+
|
168
|
+
result = Network.get( {
|
169
|
+
:host => nil,
|
170
|
+
:url => sprintf( '%s/v1/objects/hosts', @icingaApiUrlBase ),
|
171
|
+
:headers => @headers,
|
172
|
+
:options => @options,
|
173
|
+
:payload => payload
|
174
|
+
} )
|
175
|
+
|
176
|
+
return JSON.pretty_generate( result )
|
177
|
+
|
178
|
+
end
|
179
|
+
|
180
|
+
|
181
|
+
def hostProblems()
|
182
|
+
|
183
|
+
data = self.hostObjects()
|
184
|
+
problems = 0
|
185
|
+
|
186
|
+
if( data.is_a?(String) )
|
187
|
+
data = JSON.parse(data)
|
188
|
+
end
|
189
|
+
|
190
|
+
nodes = data.dig('nodes')
|
191
|
+
|
192
|
+
nodes.each do |n|
|
193
|
+
|
194
|
+
attrs = n.last.dig('attrs')
|
195
|
+
|
196
|
+
state = attrs.dig('state') || 0
|
197
|
+
downtimeDepth = attrs.dig('downtime_depth') || 0
|
198
|
+
acknowledgement = attrs.dig('acknowledgement') || 0
|
199
|
+
|
200
|
+
if( state != 0 && downtimeDepth == 0 && acknowledgement == 0 )
|
201
|
+
problems += 1
|
202
|
+
end
|
203
|
+
|
204
|
+
end
|
205
|
+
|
206
|
+
return problems
|
207
|
+
|
208
|
+
end
|
209
|
+
|
210
|
+
|
211
|
+
def problemHosts( max_items = 5 )
|
212
|
+
|
213
|
+
count = 0
|
214
|
+
@hostProblems = {}
|
215
|
+
@hostProblemsSeverity = {}
|
216
|
+
|
217
|
+
hostData = self.hostObjects()
|
218
|
+
|
219
|
+
if( hostData.is_a?(String) )
|
220
|
+
|
221
|
+
hostData = JSON.parse( hostData )
|
222
|
+
end
|
223
|
+
|
224
|
+
# logger.debug( hostData )
|
225
|
+
|
226
|
+
hostData = hostData.dig('nodes')
|
227
|
+
|
228
|
+
hostData.each do |host,v|
|
229
|
+
|
230
|
+
name = v.dig('name')
|
231
|
+
state = v.dig('attrs','state')
|
232
|
+
|
233
|
+
if( state == 0 )
|
234
|
+
next
|
235
|
+
end
|
236
|
+
|
237
|
+
@hostProblems[name] = self.hostSeverity(v)
|
238
|
+
end
|
239
|
+
|
240
|
+
# get the count of problems
|
241
|
+
#
|
242
|
+
@hostProblems.keys[1..max_items].each { |k,v| @hostProblemsSeverity[k] = @hostProblems[k] }
|
243
|
+
|
244
|
+
# @hostProblems.each do |k,v|
|
245
|
+
#
|
246
|
+
# if( count >= max_items )
|
247
|
+
# break
|
248
|
+
# end
|
249
|
+
#
|
250
|
+
# @hostProblemsSeverity[k] = v
|
251
|
+
#
|
252
|
+
# count += 1
|
253
|
+
# end
|
254
|
+
|
255
|
+
return @hostProblemsSeverity
|
256
|
+
|
257
|
+
end
|
258
|
+
|
259
|
+
# stolen from Icinga Web 2
|
260
|
+
# ./modules/monitoring/library/Monitoring/Backend/Ido/Query/ServicestatusQuery.php
|
261
|
+
#
|
262
|
+
def hostSeverity( host )
|
263
|
+
|
264
|
+
attrs = host["attrs"]
|
265
|
+
|
266
|
+
severity = 0
|
267
|
+
|
268
|
+
if (attrs["state"] == 0)
|
269
|
+
if (getObjectHasBeenChecked(host))
|
270
|
+
severity += 16
|
271
|
+
end
|
272
|
+
|
273
|
+
if (attrs["acknowledgement"] != 0)
|
274
|
+
severity += 2
|
275
|
+
elsif (attrs["downtime_depth"] > 0)
|
276
|
+
severity += 1
|
277
|
+
else
|
278
|
+
severity += 4
|
279
|
+
end
|
280
|
+
else
|
281
|
+
if (getObjectHasBeenChecked(host))
|
282
|
+
severity += 16
|
283
|
+
elsif (attrs["state"] == 1)
|
284
|
+
severity += 32
|
285
|
+
elsif (attrs["state"] == 2)
|
286
|
+
severity += 64
|
287
|
+
else
|
288
|
+
severity += 256
|
289
|
+
end
|
290
|
+
|
291
|
+
if (attrs["acknowledgement"] != 0)
|
292
|
+
severity += 2
|
293
|
+
elsif (attrs["downtime_depth"] > 0)
|
294
|
+
severity += 1
|
295
|
+
else
|
296
|
+
severity += 4
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
return severity
|
301
|
+
|
302
|
+
end
|
303
|
+
|
304
|
+
|
305
|
+
end
|
306
|
+
|
307
|
+
end
|
@@ -0,0 +1,397 @@
|
|
1
|
+
module Icinga2
|
2
|
+
|
3
|
+
module Network
|
4
|
+
|
5
|
+
def self.get( params = {} )
|
6
|
+
|
7
|
+
host = params.dig(:host)
|
8
|
+
url = params.dig(:url)
|
9
|
+
headers = params.dig(:headers)
|
10
|
+
options = params.dig(:options)
|
11
|
+
payload = params.dig(:payload) || {}
|
12
|
+
result = {}
|
13
|
+
|
14
|
+
if( payload.count >= 1 )
|
15
|
+
|
16
|
+
return self.get2( params )
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
headers.delete( 'X-HTTP-Method-Override' )
|
21
|
+
|
22
|
+
result = {}
|
23
|
+
|
24
|
+
restClient = RestClient::Resource.new(
|
25
|
+
URI.encode( url ),
|
26
|
+
options
|
27
|
+
)
|
28
|
+
|
29
|
+
begin
|
30
|
+
|
31
|
+
data = restClient.get( headers )
|
32
|
+
results = JSON.parse( data.body )
|
33
|
+
results = results.dig('results')
|
34
|
+
|
35
|
+
result[:status] = 200
|
36
|
+
result[:data] ||={}
|
37
|
+
|
38
|
+
results.each do |r|
|
39
|
+
|
40
|
+
# puts JSON.pretty_generate r
|
41
|
+
# name = r.dig('name')
|
42
|
+
attrs = r.dig('attrs')
|
43
|
+
|
44
|
+
if( attrs != nil )
|
45
|
+
|
46
|
+
result[:data][attrs['name']] = {
|
47
|
+
:name => attrs['name'],
|
48
|
+
:display_name => attrs['display_name'],
|
49
|
+
:type => attrs['type']
|
50
|
+
}
|
51
|
+
else
|
52
|
+
result = r
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
rescue RestClient::ExceptionWithResponse => e
|
58
|
+
|
59
|
+
error = e.response ? e.response : nil
|
60
|
+
|
61
|
+
error = JSON.parse( error )
|
62
|
+
|
63
|
+
result = {
|
64
|
+
:status => error['error'].to_i,
|
65
|
+
:name => host,
|
66
|
+
:message => error['status']
|
67
|
+
}
|
68
|
+
rescue Errno::ECONNREFUSED => e
|
69
|
+
|
70
|
+
$stderr.puts "Server refusing connection; retrying in 5s..."
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
return result
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
def self.get2( params = {} )
|
80
|
+
|
81
|
+
host = params.dig(:host)
|
82
|
+
url = params.dig(:url)
|
83
|
+
headers = params.dig(:headers)
|
84
|
+
options = params.dig(:options)
|
85
|
+
payload = params.dig(:payload) || {}
|
86
|
+
result = {}
|
87
|
+
|
88
|
+
headers['X-HTTP-Method-Override'] = 'GET'
|
89
|
+
|
90
|
+
restClient = RestClient::Resource.new(
|
91
|
+
URI.encode( url ),
|
92
|
+
options
|
93
|
+
)
|
94
|
+
|
95
|
+
begin
|
96
|
+
|
97
|
+
response = restClient.post(
|
98
|
+
JSON.generate( payload ),
|
99
|
+
headers
|
100
|
+
)
|
101
|
+
|
102
|
+
responseCode = response.code
|
103
|
+
responseBody = response.body
|
104
|
+
|
105
|
+
node = Hash.new()
|
106
|
+
|
107
|
+
data = JSON.parse( responseBody )
|
108
|
+
|
109
|
+
results = data.dig('results')
|
110
|
+
|
111
|
+
if( results != nil )
|
112
|
+
|
113
|
+
results.each do |r|
|
114
|
+
|
115
|
+
node[r.dig('name')] = r
|
116
|
+
end
|
117
|
+
|
118
|
+
result = {
|
119
|
+
:status => responseCode,
|
120
|
+
:nodes => node
|
121
|
+
}
|
122
|
+
end
|
123
|
+
|
124
|
+
rescue RestClient::ExceptionWithResponse => e
|
125
|
+
|
126
|
+
error = e.response ? e.response : nil
|
127
|
+
error = JSON.parse( error )
|
128
|
+
|
129
|
+
result = {
|
130
|
+
:status => error['error'].to_i,
|
131
|
+
:name => host,
|
132
|
+
:message => error['status']
|
133
|
+
}
|
134
|
+
rescue Errno::ECONNREFUSED => e
|
135
|
+
|
136
|
+
$stderr.puts "Server refusing connection; retrying in 5s..."
|
137
|
+
|
138
|
+
end
|
139
|
+
|
140
|
+
return result
|
141
|
+
|
142
|
+
end
|
143
|
+
|
144
|
+
|
145
|
+
|
146
|
+
def self.post( params = {} )
|
147
|
+
|
148
|
+
host = params.dig(:host)
|
149
|
+
url = params.dig(:url)
|
150
|
+
headers = params.dig(:headers)
|
151
|
+
options = params.dig(:options)
|
152
|
+
payload = params.dig(:payload)
|
153
|
+
|
154
|
+
headers['X-HTTP-Method-Override'] = 'POST'
|
155
|
+
|
156
|
+
result = {}
|
157
|
+
|
158
|
+
restClient = RestClient::Resource.new(
|
159
|
+
URI.encode( url ),
|
160
|
+
options
|
161
|
+
)
|
162
|
+
|
163
|
+
begin
|
164
|
+
|
165
|
+
data = restClient.post(
|
166
|
+
JSON.generate( payload ),
|
167
|
+
headers
|
168
|
+
)
|
169
|
+
|
170
|
+
data = JSON.parse( data )
|
171
|
+
results = data.dig('results').first
|
172
|
+
|
173
|
+
if( results != nil )
|
174
|
+
|
175
|
+
result = {
|
176
|
+
:status => results.dig('code').to_i,
|
177
|
+
:name => results.dig('name'),
|
178
|
+
:message => results.dig('status')
|
179
|
+
}
|
180
|
+
|
181
|
+
end
|
182
|
+
|
183
|
+
rescue RestClient::ExceptionWithResponse => e
|
184
|
+
|
185
|
+
error = e.response ? e.response : nil
|
186
|
+
|
187
|
+
if( error.is_a?( String ) )
|
188
|
+
error = JSON.parse( error )
|
189
|
+
end
|
190
|
+
|
191
|
+
$stderr.puts( JSON.pretty_generate( error ) )
|
192
|
+
|
193
|
+
results = error.dig( 'results' )
|
194
|
+
|
195
|
+
if( results != nil )
|
196
|
+
|
197
|
+
result = result.first
|
198
|
+
|
199
|
+
result = {
|
200
|
+
:status => results.dig('code').to_i,
|
201
|
+
:name => results.dig('name'),
|
202
|
+
:message => results.dig('status'),
|
203
|
+
:error => results.dig('errors')
|
204
|
+
}
|
205
|
+
|
206
|
+
else
|
207
|
+
|
208
|
+
result = {
|
209
|
+
:status => error.dig( 'error' ).to_i,
|
210
|
+
:message => error.dig( 'status' )
|
211
|
+
}
|
212
|
+
|
213
|
+
end
|
214
|
+
|
215
|
+
rescue Errno::ECONNREFUSED => e
|
216
|
+
|
217
|
+
$stderr.puts "Server refusing connection; retrying in 5s..."
|
218
|
+
|
219
|
+
rescue => e
|
220
|
+
|
221
|
+
$stderr.puts e
|
222
|
+
|
223
|
+
end
|
224
|
+
|
225
|
+
return result
|
226
|
+
|
227
|
+
|
228
|
+
|
229
|
+
end
|
230
|
+
|
231
|
+
|
232
|
+
def self.put( params = {} )
|
233
|
+
|
234
|
+
host = params.dig(:host)
|
235
|
+
url = params.dig(:url)
|
236
|
+
headers = params.dig(:headers)
|
237
|
+
options = params.dig(:options)
|
238
|
+
payload = params.dig(:payload)
|
239
|
+
|
240
|
+
headers['X-HTTP-Method-Override'] = 'PUT'
|
241
|
+
|
242
|
+
result = {}
|
243
|
+
|
244
|
+
restClient = RestClient::Resource.new(
|
245
|
+
URI.encode( url ),
|
246
|
+
options
|
247
|
+
)
|
248
|
+
|
249
|
+
begin
|
250
|
+
|
251
|
+
data = restClient.put(
|
252
|
+
JSON.generate( payload ),
|
253
|
+
headers
|
254
|
+
)
|
255
|
+
|
256
|
+
data = JSON.parse( data )
|
257
|
+
results = data.dig('results').first
|
258
|
+
|
259
|
+
if( results != nil )
|
260
|
+
|
261
|
+
result = {
|
262
|
+
:status => results.dig('code').to_i,
|
263
|
+
:name => results.dig('name'),
|
264
|
+
:message => results.dig('status')
|
265
|
+
}
|
266
|
+
|
267
|
+
end
|
268
|
+
|
269
|
+
rescue RestClient::ExceptionWithResponse => e
|
270
|
+
|
271
|
+
error = e.response ? e.response : nil
|
272
|
+
|
273
|
+
if( error.is_a?( String ) )
|
274
|
+
error = JSON.parse( error )
|
275
|
+
end
|
276
|
+
|
277
|
+
results = error.dig( 'results' )
|
278
|
+
|
279
|
+
if( results != nil )
|
280
|
+
|
281
|
+
if( result.is_a?( Hash ) && result.count() != 0 )
|
282
|
+
|
283
|
+
result = result.first
|
284
|
+
|
285
|
+
result = {
|
286
|
+
:status => results.dig('code').to_i,
|
287
|
+
:name => results.dig('name'),
|
288
|
+
:message => results.dig('status'),
|
289
|
+
:error => results.dig('errors')
|
290
|
+
}
|
291
|
+
|
292
|
+
else
|
293
|
+
|
294
|
+
result = {
|
295
|
+
:status => 204,
|
296
|
+
:name => host,
|
297
|
+
:message => 'unknown result'
|
298
|
+
}
|
299
|
+
end
|
300
|
+
|
301
|
+
else
|
302
|
+
|
303
|
+
result = {
|
304
|
+
:status => error.dig( 'error' ).to_i,
|
305
|
+
:message => error.dig( 'status' )
|
306
|
+
}
|
307
|
+
|
308
|
+
end
|
309
|
+
|
310
|
+
rescue Errno::ECONNREFUSED => e
|
311
|
+
|
312
|
+
$stderr.puts "Server refusing connection; retrying in 5s..."
|
313
|
+
|
314
|
+
end
|
315
|
+
|
316
|
+
return result
|
317
|
+
|
318
|
+
end
|
319
|
+
|
320
|
+
|
321
|
+
def self.delete( params = {} )
|
322
|
+
|
323
|
+
host = params.dig(:host) || nil
|
324
|
+
url = params.dig(:url) || nil
|
325
|
+
headers = params.dig(:headers) || nil
|
326
|
+
options = params.dig(:options) || nil
|
327
|
+
payload = params.dig(:payload) || nil
|
328
|
+
|
329
|
+
headers['X-HTTP-Method-Override'] = 'DELETE'
|
330
|
+
|
331
|
+
result = {}
|
332
|
+
|
333
|
+
restClient = RestClient::Resource.new(
|
334
|
+
URI.encode( url ),
|
335
|
+
options
|
336
|
+
)
|
337
|
+
|
338
|
+
begin
|
339
|
+
data = restClient.get( headers )
|
340
|
+
|
341
|
+
if( data )
|
342
|
+
|
343
|
+
data = JSON.parse( data ) #.body )
|
344
|
+
results = data.dig('results').first
|
345
|
+
|
346
|
+
if( results != nil )
|
347
|
+
|
348
|
+
result = {
|
349
|
+
:status => results.dig('code').to_i,
|
350
|
+
:name => results.dig('name'),
|
351
|
+
:message => results.dig('status')
|
352
|
+
}
|
353
|
+
|
354
|
+
end
|
355
|
+
end
|
356
|
+
|
357
|
+
rescue RestClient::ExceptionWithResponse => e
|
358
|
+
|
359
|
+
error = e.response ? e.response : nil
|
360
|
+
|
361
|
+
if( error.is_a?( String ) )
|
362
|
+
error = JSON.parse( error )
|
363
|
+
end
|
364
|
+
|
365
|
+
results = error.dig('results')
|
366
|
+
|
367
|
+
if( results != nil )
|
368
|
+
|
369
|
+
result = {
|
370
|
+
:status => results.dig('code').to_i,
|
371
|
+
:name => results.dig('name'),
|
372
|
+
:message => results.dig('status')
|
373
|
+
}
|
374
|
+
|
375
|
+
else
|
376
|
+
|
377
|
+
result = {
|
378
|
+
:status => error.dig( 'error' ).to_i,
|
379
|
+
# :name => results.dig('name'),
|
380
|
+
:message => error.dig( 'status' )
|
381
|
+
}
|
382
|
+
|
383
|
+
end
|
384
|
+
rescue Errno::ECONNREFUSED => e
|
385
|
+
|
386
|
+
$stderr.puts "Server refusing connection; retrying in 5s..."
|
387
|
+
|
388
|
+
end
|
389
|
+
|
390
|
+
return result
|
391
|
+
|
392
|
+
end
|
393
|
+
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
|