zbxapi 0.1
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/libs/api_exceptions.rb +125 -0
- data/libs/exceptions.rb +122 -0
- data/libs/zdebug.rb +163 -0
- data/zbxapi.rb +951 -0
- metadata +82 -0
data/zbxapi.rb
ADDED
@@ -0,0 +1,951 @@
|
|
1
|
+
# Title:: Zabbix API Ruby Library
|
2
|
+
# License:: LGPL 2.1 http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
|
3
|
+
# Copyright:: Copyright (C) 2009,2010 Andrew Nelson nelsonab(at)red-tux(dot)net
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License as published by the Free Software Foundation; either
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
|
19
|
+
#--
|
20
|
+
##########################################
|
21
|
+
# Subversion information
|
22
|
+
# $Id: zbxapi.rb 254 2010-12-27 19:45:42Z nelsonab $
|
23
|
+
# $Revision: 254 $
|
24
|
+
##########################################
|
25
|
+
#++
|
26
|
+
|
27
|
+
#setup our search path or libraries
|
28
|
+
path=File.expand_path(File.dirname(__FILE__) + "/./")+"/"
|
29
|
+
|
30
|
+
|
31
|
+
require path+'libs/zdebug'
|
32
|
+
require path+'libs/api_exceptions.rb'
|
33
|
+
require 'uri'
|
34
|
+
#require 'net/http'
|
35
|
+
require 'net/https'
|
36
|
+
require 'rubygems'
|
37
|
+
require 'json'
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
#------------------------------------------------------------------------------
|
42
|
+
#
|
43
|
+
# Class ZabbixAPI
|
44
|
+
#++
|
45
|
+
# Main Zabbix API class.
|
46
|
+
#
|
47
|
+
#------------------------------------------------------------------------------
|
48
|
+
|
49
|
+
class ZabbixAPI
|
50
|
+
|
51
|
+
include ZDebug
|
52
|
+
|
53
|
+
attr_accessor :method, :params, :debug_level, :auth
|
54
|
+
|
55
|
+
#subordinate class
|
56
|
+
attr_accessor :user # [User#new]
|
57
|
+
#subordinate class
|
58
|
+
attr_accessor :usergroup, :host, :item, :hostgroup, :application, :trigger, :sysmap, :history
|
59
|
+
|
60
|
+
@id=0
|
61
|
+
@auth=''
|
62
|
+
@url=nil
|
63
|
+
|
64
|
+
private
|
65
|
+
@user_name=''
|
66
|
+
@password=''
|
67
|
+
|
68
|
+
|
69
|
+
class Redirect < Exception #:nodoc: all
|
70
|
+
end
|
71
|
+
|
72
|
+
public
|
73
|
+
|
74
|
+
# The initialization routine for the Zabbix API class
|
75
|
+
# * url is a string defining the url to connect to, it should only point to the base url for Zabbix, not the api directory
|
76
|
+
# * debug_level is the default level to be used for debug messages
|
77
|
+
# Upon successful initialization the class will be set up to allow a connection to the Zabbix server
|
78
|
+
# A connection however will not have been made, to actually connect to the Zabbix server use the login method
|
79
|
+
def initialize(url,debug_level=0)
|
80
|
+
set_debug_level(debug_level)
|
81
|
+
@orig_url=url #save the original url
|
82
|
+
@url=URI.parse(url+'/api_jsonrpc.php')
|
83
|
+
@user = ZbxAPI_User.new(self)
|
84
|
+
@usergroup = ZbxAPI_UserGroup.new(self)
|
85
|
+
@host = ZbxAPI_Host.new(self)
|
86
|
+
@item = ZbxAPI_Item.new(self)
|
87
|
+
@hostgroup = ZbxAPI_HostGroup.new(self)
|
88
|
+
@application = ZbxAPI_Application.new(self)
|
89
|
+
@trigger = ZbxAPI_Trigger.new(self)
|
90
|
+
@sysmap = ZbxAPI_Sysmap.new(self)
|
91
|
+
@history = ZbxAPI_History.new(self)
|
92
|
+
@id=0
|
93
|
+
|
94
|
+
debug(6,"protocol: #{@url.scheme}, host: #{@url.host}")
|
95
|
+
debug(6,"port: #{@url.port}, path: #{@url.path}")
|
96
|
+
debug(6,"query: #{@url.query}, fragment: #{@url.fragment}")
|
97
|
+
end
|
98
|
+
|
99
|
+
#wraps the given information into the appropriate JSON object
|
100
|
+
#* method is a string
|
101
|
+
#* params is a hash of the parameters for the method to be called
|
102
|
+
#Returns a hash representing a Zabbix API JSON call
|
103
|
+
def json_obj(method,params={})
|
104
|
+
obj =
|
105
|
+
{
|
106
|
+
'jsonrpc'=>'2.0',
|
107
|
+
'method'=>method,
|
108
|
+
'params'=>params,
|
109
|
+
'auth'=>@auth,
|
110
|
+
'id'=>@id
|
111
|
+
}
|
112
|
+
debug(10, "json_obj: #{obj}")
|
113
|
+
return obj.to_json
|
114
|
+
end
|
115
|
+
|
116
|
+
|
117
|
+
#Performs a log in to the Zabbix server
|
118
|
+
#* _user_ is a string with the username
|
119
|
+
#* _password_ is a string with the user''s password
|
120
|
+
#* _save_ tells the method to save the login details in internal class variables or not
|
121
|
+
#
|
122
|
+
#Raises:
|
123
|
+
#
|
124
|
+
#* Zbx_API_ExeeptionBadAuth is raised when one of the following conditions is met
|
125
|
+
# 1. no-string variables were passed in
|
126
|
+
# 1. no username or password was passed in or saved from a previous login
|
127
|
+
# 1. login details were rejected by the server
|
128
|
+
#* ZbxAPI_ExceptionBadServerUrl
|
129
|
+
# 1. There was a socket error
|
130
|
+
# 1. The url used to create the class was bad
|
131
|
+
# 1. The connection to the server was refused
|
132
|
+
def login(user='',password='',save=true)
|
133
|
+
# p user.class
|
134
|
+
# p password.class
|
135
|
+
if user.class!=String or password.class!=String
|
136
|
+
raise ZbxAPI_ExceptionBadAuth.new,'Login called with non-string values'
|
137
|
+
end
|
138
|
+
if (user!='' and password!='') then
|
139
|
+
l_user = user
|
140
|
+
l_password = password
|
141
|
+
if save then
|
142
|
+
@user_name=user
|
143
|
+
@password=password
|
144
|
+
end
|
145
|
+
elsif (@user_name!='' and @password!='') then
|
146
|
+
l_user = @user_name
|
147
|
+
l_password = @password
|
148
|
+
else
|
149
|
+
|
150
|
+
end
|
151
|
+
|
152
|
+
begin
|
153
|
+
result = do_request(json_obj('user.authenticate',{'user'=>l_user,'password'=>l_password}))
|
154
|
+
@auth=result['result']
|
155
|
+
|
156
|
+
#setup the version variables
|
157
|
+
@major,@minor=do_request(json_obj('APIInfo.version',{}))['result'].split('.')
|
158
|
+
@major=@major.to_i
|
159
|
+
@minor=@minor.to_i
|
160
|
+
|
161
|
+
rescue SocketError
|
162
|
+
raise ZbxAPI_ExceptionBadServerUrl
|
163
|
+
rescue JSON::ParserError
|
164
|
+
raise ZbxAPI_ExceptionBadServerUrl
|
165
|
+
rescue Errno::ECONNREFUSED
|
166
|
+
raise ZbxAPI_ExceptionBadServerUrl
|
167
|
+
rescue ZbxAPI_GeneralError => e
|
168
|
+
if e.message["code"]==-32602
|
169
|
+
raise ZbxAPI_ExceptionBadAuth,'Bad username and/or password'
|
170
|
+
else
|
171
|
+
raise e
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
end
|
176
|
+
|
177
|
+
# Tests to determine if the login information is still valid
|
178
|
+
# returns: true if it is valid or false if it is not.
|
179
|
+
def test_login
|
180
|
+
if @auth!='' then
|
181
|
+
result = do_request(json_obj('user.checkauth',
|
182
|
+
{'sessionid'=>@auth}))
|
183
|
+
if !result['result'] then
|
184
|
+
@auth=''
|
185
|
+
return false #auth hash bad
|
186
|
+
end
|
187
|
+
return true #auth hash good
|
188
|
+
else
|
189
|
+
return false
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
#Returns true if a login was performed
|
194
|
+
def loggedin?
|
195
|
+
!(@auth=='' or @auth.nil?)
|
196
|
+
end
|
197
|
+
|
198
|
+
#wrapper to loggedin?
|
199
|
+
#returns nothing, raises the exception ZbxAPI_ExceptionBadAuth if loggedin? returns false
|
200
|
+
def checkauth
|
201
|
+
raise ZbxAPI_ExceptionBadAuth, 'Not logged in' if !loggedin?
|
202
|
+
end
|
203
|
+
|
204
|
+
#returns the version number for the API from the server
|
205
|
+
def API_version(options={})
|
206
|
+
return "#{@major}.#{@minor}"
|
207
|
+
end
|
208
|
+
|
209
|
+
# Provides raw access to the API via a small wrapper.
|
210
|
+
# _method_ is the method to be called
|
211
|
+
# _params_ are the parameters to be passed to the call
|
212
|
+
# returns a hash of the results from the server
|
213
|
+
def raw_api(method,params=nil)
|
214
|
+
debug(6,method,"method")
|
215
|
+
debug(6,params,"Parameters")
|
216
|
+
|
217
|
+
checkauth
|
218
|
+
checkversion(1,1)
|
219
|
+
params={} if params==nil
|
220
|
+
|
221
|
+
obj=do_request(json_obj(method,params))
|
222
|
+
return obj['result']
|
223
|
+
end
|
224
|
+
|
225
|
+
# Function to test whether or not a function will work with the current API version of the server
|
226
|
+
# If no options are presented the major and minor are assumed to be the minimum version
|
227
|
+
# number suitable to run the function
|
228
|
+
# Does not explicitly return anything, but raises ZbxAPI_ExceptionVersion if there is a problem
|
229
|
+
def checkversion(major,minor,options=nil)
|
230
|
+
caller[0]=~/`(.*?)'/
|
231
|
+
caller_func=$1
|
232
|
+
|
233
|
+
raise ZbxAPI_ExceptionVersion, "#{caller_func} requires API version #{major}.#{minor} or higher" if major>@major
|
234
|
+
raise ZbxAPI_ExceptionVersion, "#{caller_func} requires API version #{major}.#{minor} or higher" if minor>@minor
|
235
|
+
|
236
|
+
end
|
237
|
+
|
238
|
+
#Sends JSON encoded string to server
|
239
|
+
def do_request(json_obj)
|
240
|
+
#puts json_obj
|
241
|
+
redirects=0
|
242
|
+
begin # This is here for redirects
|
243
|
+
http = Net::HTTP.new(@url.host, @url.port)
|
244
|
+
http.use_ssl=true if @url.class==URI::HTTPS
|
245
|
+
response = nil
|
246
|
+
# http.set_debug_output($stderr) #Uncomment to see low level HTTP debug
|
247
|
+
# http.use_ssl = @url.scheme=='https' ? true : false
|
248
|
+
# http.start do |http|
|
249
|
+
headers={'Content-Type'=>'application/json-rpc',
|
250
|
+
'User-Agent'=>'Zbx Ruby CLI'}
|
251
|
+
debug(4,"Sending: #{json_obj}")
|
252
|
+
response = http.post(@url.path, json_obj,headers)
|
253
|
+
if response.code=="301"
|
254
|
+
puts "Redirecting to #{response['location']}"
|
255
|
+
@url=URI.parse(response['location'])
|
256
|
+
raise Redirect
|
257
|
+
end
|
258
|
+
debug(4,"Response Code: #{response.code}")
|
259
|
+
debug(4,response.body,"Response Body",5000)
|
260
|
+
# end
|
261
|
+
|
262
|
+
@id+=1 # increment the ID value for the API call
|
263
|
+
|
264
|
+
# check return code and throw exception for error checking
|
265
|
+
resp = JSON.parse(response.body) #parse the JSON Object so we can use it
|
266
|
+
if !resp["error"].nil?
|
267
|
+
errcode=resp["error"]["code"].to_i
|
268
|
+
case errcode
|
269
|
+
when -32602 then
|
270
|
+
raise ZbxAPI_ExceptionLoginPermission.new(resp["error"],:retry=>true)
|
271
|
+
when -32500 then
|
272
|
+
raise ZbxAPI_ExceptionPermissionError.new(resp["error"],:retry=>true)
|
273
|
+
else
|
274
|
+
puts "other error"
|
275
|
+
raise ZbxAPI_GeneralError, resp["error"]
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
return resp
|
280
|
+
|
281
|
+
rescue Redirect
|
282
|
+
redirects+=1
|
283
|
+
retry if redirects<=5
|
284
|
+
raise ZbxAPI_GeneralError, "Too many redirects"
|
285
|
+
rescue NoMethodError
|
286
|
+
raise ZbxAPI_GeneralError.new("Unable to connect to #{@url.host}", :retry=>false)
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
private
|
291
|
+
|
292
|
+
def setup_connection
|
293
|
+
@http=Net::HTTP.new(@url.host, @url.port)
|
294
|
+
http.use_ssl=true if @url.class==URI::HTTPS
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
# Class: Zbx_API_Sub
|
299
|
+
# Wrapper class to ensure all class calls goes to the parent object not the
|
300
|
+
# currently instantiated object.
|
301
|
+
# Also ensures class specific variable sanity for global functions
|
302
|
+
class ZbxAPI_Sub < ZabbixAPI #:nodoc: all
|
303
|
+
attr_accessor :parent
|
304
|
+
|
305
|
+
def initialize(parent)
|
306
|
+
@parent=parent
|
307
|
+
end
|
308
|
+
|
309
|
+
def checkauth
|
310
|
+
@parent.checkauth
|
311
|
+
end
|
312
|
+
|
313
|
+
def checkversion(major,minor,options=nil)
|
314
|
+
@parent.checkversion(major,minor,options)
|
315
|
+
end
|
316
|
+
|
317
|
+
def do_request(req)
|
318
|
+
return @parent.do_request(req)
|
319
|
+
end
|
320
|
+
|
321
|
+
def json_obj(method, param)
|
322
|
+
return @parent.json_obj(method, param)
|
323
|
+
end
|
324
|
+
|
325
|
+
def debug(level,param="",message=nil)
|
326
|
+
@parent.debug(level,param,message)
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
# Class ZbxAPI_User
|
331
|
+
#
|
332
|
+
# Class encapsulating User functions
|
333
|
+
#
|
334
|
+
# API Function Status
|
335
|
+
# [get] Implemented, need error checking
|
336
|
+
# [authenticate] Will not implement here, belongs in ZabbixAPI main class
|
337
|
+
# [checkauth] Will not implement here, belongs in ZabbixAPI main class
|
338
|
+
# [getid] Implemented
|
339
|
+
# [create] Implemented, need to test more to find fewest items
|
340
|
+
# needed, input value testing needed
|
341
|
+
# [update]
|
342
|
+
#
|
343
|
+
# [addmedia]
|
344
|
+
#
|
345
|
+
# [deletemedia]
|
346
|
+
#
|
347
|
+
# [updatemedia]
|
348
|
+
# [delete] Implemented, checking of input values needed
|
349
|
+
#
|
350
|
+
# All functions expect a hash of options to add.
|
351
|
+
# If multiple users need to be manipulated it must be broken out into different calls
|
352
|
+
|
353
|
+
class ZbxAPI_User < ZbxAPI_Sub
|
354
|
+
def get(options={})
|
355
|
+
checkauth
|
356
|
+
checkversion(1,1)
|
357
|
+
|
358
|
+
obj=do_request(json_obj('user.get',options))
|
359
|
+
return obj['result']
|
360
|
+
end
|
361
|
+
|
362
|
+
def getid(username)
|
363
|
+
raise ZbxAPI_ExceptionArgumentError, "String argument expected" if username.class != String
|
364
|
+
|
365
|
+
checkauth
|
366
|
+
checkversion(1,1)
|
367
|
+
|
368
|
+
obj=do_request(json_obj('user.getid',{'alias'=>username}))
|
369
|
+
return obj['result']
|
370
|
+
end
|
371
|
+
|
372
|
+
def create(options)
|
373
|
+
checkauth
|
374
|
+
checkversion(1,1)
|
375
|
+
|
376
|
+
#Check input parameters
|
377
|
+
|
378
|
+
raise ZbxAPI_ParameterError, "Missing 'name' argument", "User.create" if options["name"].nil?
|
379
|
+
raise ZbxAPI_ParameterError, "Missing 'alias' argument", "User.create" if options["alias"].nil?
|
380
|
+
raise ZbxAPI_ParameterError, "Missing 'passwd' argument", "User.create" if options["passwd"].nil?
|
381
|
+
|
382
|
+
obj=do_request(json_obj('user.create',options))
|
383
|
+
return obj['result']
|
384
|
+
end
|
385
|
+
|
386
|
+
# Alias function name for code written to work against 1.0 API
|
387
|
+
# may be removed in future versions
|
388
|
+
|
389
|
+
def add(options)
|
390
|
+
puts "WARNING API Function User.add is deprecated and will be removed in the future without further warning"
|
391
|
+
create(options)
|
392
|
+
end
|
393
|
+
|
394
|
+
def delete(userid)
|
395
|
+
checkauth
|
396
|
+
checkversion(1,1)
|
397
|
+
|
398
|
+
obj=do_request(json_obj('user.delete',[userid]))
|
399
|
+
return obj['result']
|
400
|
+
end
|
401
|
+
|
402
|
+
def update(options)
|
403
|
+
checkauth
|
404
|
+
checkversion(1,1)
|
405
|
+
|
406
|
+
obj=do_request(json_obj('user.update',options))
|
407
|
+
return obj['result']
|
408
|
+
end
|
409
|
+
|
410
|
+
# addmedia expects a hash of the following variables
|
411
|
+
# userid, mediatypeid, sendto, severity, active, period
|
412
|
+
def addmedia(options)
|
413
|
+
debug(8, "User.addmedia Start")
|
414
|
+
checkauth
|
415
|
+
checkversion(1,1)
|
416
|
+
|
417
|
+
# p options
|
418
|
+
|
419
|
+
raise ZbxAPI_ParameterError, "Missing 'userid' argument", "User.addmedia" if options["userid"].nil?
|
420
|
+
raise ZbxAPI_ParameterError, "Missing 'mediatypeid' argument", "User.addmedia" if options["mediatypeid"].nil?
|
421
|
+
raise ZbxAPI_ParameterError, "Missing 'severity' argument", "User.addmedia" if options["severity"].nil?
|
422
|
+
raise ZbxAPI_ParameterError, "Missing 'active' argument", "User.addmedia" if options["active"].nil?
|
423
|
+
raise ZbxAPI_ParameterError, "Missing 'period' argument", "User.addmedia" if options["period"].nil?
|
424
|
+
|
425
|
+
args = {}
|
426
|
+
args["userid"]=options["userid"]
|
427
|
+
args["medias"]={}
|
428
|
+
args["medias"]["mediatypeid"]=options["mediatypeid"]
|
429
|
+
args["medias"]["sendto"]=options["sendto"]
|
430
|
+
args["medias"]["severity"]=options["severity"]
|
431
|
+
args["medias"]["active"]=options["active"]
|
432
|
+
args["medias"]["period"]=options["period"]
|
433
|
+
|
434
|
+
# p args
|
435
|
+
|
436
|
+
obj=do_request(json_obj('user.addMedia',args))
|
437
|
+
return obj['result']
|
438
|
+
end
|
439
|
+
end
|
440
|
+
|
441
|
+
#******************************************************************************
|
442
|
+
#
|
443
|
+
# Class ZbxAPI_Host
|
444
|
+
#
|
445
|
+
# Class encapsulating Host and template functions
|
446
|
+
#
|
447
|
+
# API Function Status
|
448
|
+
# get Basic function implemented
|
449
|
+
# getid
|
450
|
+
# create Basic function implemented 20091020
|
451
|
+
# update
|
452
|
+
# massupdate
|
453
|
+
# delete Implimented
|
454
|
+
#
|
455
|
+
# template.create implemented as host.create_template
|
456
|
+
# template.get implemented as host.get_template
|
457
|
+
# template.delete implemented as host.delete_template
|
458
|
+
#
|
459
|
+
#******************************************************************************
|
460
|
+
|
461
|
+
class ZbxAPI_Host < ZbxAPI_Sub
|
462
|
+
def get(options={})
|
463
|
+
checkauth
|
464
|
+
checkversion(1,1)
|
465
|
+
|
466
|
+
obj=do_request(json_obj('host.get',options))
|
467
|
+
obj['result']
|
468
|
+
end
|
469
|
+
|
470
|
+
def get_template(options={})
|
471
|
+
checkauth
|
472
|
+
checkversion(1,3)
|
473
|
+
|
474
|
+
obj=do_request(json_obj('template.get',options))
|
475
|
+
obj['result']
|
476
|
+
end
|
477
|
+
|
478
|
+
def create(options={})
|
479
|
+
checkauth
|
480
|
+
checkversion(1,1)
|
481
|
+
|
482
|
+
obj=do_request(json_obj('host.create',options))
|
483
|
+
obj['result']
|
484
|
+
end
|
485
|
+
|
486
|
+
def create_template(options={})
|
487
|
+
checkauth
|
488
|
+
checkversion(1,3)
|
489
|
+
|
490
|
+
obj=do_request(json_obj('template.create',options))
|
491
|
+
obj['result']
|
492
|
+
end
|
493
|
+
|
494
|
+
# http://www.zabbix.com/documentation/1.8/api/objects/host#hostdelete
|
495
|
+
#Accepts a single host id or an array of host id's to be deleted
|
496
|
+
def delete(ids)
|
497
|
+
checkauth
|
498
|
+
checkversion(1,3)
|
499
|
+
|
500
|
+
obj=do_request(json_obj('host.delete',delete_helper("hostid",ids)))
|
501
|
+
obj['result']
|
502
|
+
end
|
503
|
+
|
504
|
+
def delete_template(ids)
|
505
|
+
checkauth
|
506
|
+
checkversion(1,3)
|
507
|
+
|
508
|
+
obj=do_request(json_obj('template.delete',delete_helper("templateid",ids)))
|
509
|
+
obj['result']
|
510
|
+
end
|
511
|
+
|
512
|
+
private
|
513
|
+
|
514
|
+
def delete_helper(id_type,ids)
|
515
|
+
if ids.class==Fixnum
|
516
|
+
ids=[ids]
|
517
|
+
elsif ids.class==Array
|
518
|
+
ids=ids
|
519
|
+
else
|
520
|
+
raise ZbxAPI_ParameterError, "ids parameter must be number or array"
|
521
|
+
end
|
522
|
+
|
523
|
+
ids.map do |id|
|
524
|
+
{id_type=>id}
|
525
|
+
end
|
526
|
+
end
|
527
|
+
|
528
|
+
end
|
529
|
+
|
530
|
+
#******************************************************************************
|
531
|
+
#
|
532
|
+
# Class ZbxAPI_Item
|
533
|
+
#
|
534
|
+
# Class encapsulating Item functions
|
535
|
+
#
|
536
|
+
# API Function Status
|
537
|
+
# get Basic Function working
|
538
|
+
# getid Function implemented
|
539
|
+
# create Function implemented
|
540
|
+
# update
|
541
|
+
# delete Function implemented - need to add type checking to input
|
542
|
+
#
|
543
|
+
#******************************************************************************
|
544
|
+
|
545
|
+
class ZbxAPI_Item < ZbxAPI_Sub
|
546
|
+
def get(options={})
|
547
|
+
checkauth
|
548
|
+
checkversion(1,1)
|
549
|
+
|
550
|
+
obj=do_request(json_obj('item.get',options))
|
551
|
+
return obj['result']
|
552
|
+
end
|
553
|
+
|
554
|
+
def getid(options)
|
555
|
+
checkauth
|
556
|
+
checkversion(1,1)
|
557
|
+
|
558
|
+
obj=do_request(json_obj('item.getid', options))
|
559
|
+
return obj['result']
|
560
|
+
end
|
561
|
+
|
562
|
+
def create(options)
|
563
|
+
debug(8,options)
|
564
|
+
checkauth
|
565
|
+
checkversion(1,1)
|
566
|
+
|
567
|
+
obj=do_request(json_obj('item.create', options))
|
568
|
+
return obj['result']
|
569
|
+
end
|
570
|
+
|
571
|
+
# Alias function for code written against 1.0 API
|
572
|
+
def add(options)
|
573
|
+
puts "WARNING API Function Item.add is deprecated and will be removed in the future without further warning"
|
574
|
+
create(options)
|
575
|
+
end
|
576
|
+
|
577
|
+
def delete(ids)
|
578
|
+
checkauth
|
579
|
+
checkversion(1,1)
|
580
|
+
|
581
|
+
obj=do_request(json_obj('item.delete', ids))
|
582
|
+
return obj['result']
|
583
|
+
end
|
584
|
+
end
|
585
|
+
|
586
|
+
#******************************************************************************
|
587
|
+
#
|
588
|
+
# Class ZbxAPI_UserGroup
|
589
|
+
#
|
590
|
+
# Class encapsulating User Group functions
|
591
|
+
#
|
592
|
+
# API Function Status
|
593
|
+
# get Basic function implemented
|
594
|
+
# getid
|
595
|
+
# create
|
596
|
+
# update
|
597
|
+
# updaterights
|
598
|
+
# addrights
|
599
|
+
# addusers
|
600
|
+
# removeusers
|
601
|
+
# delete
|
602
|
+
#
|
603
|
+
#******************************************************************************
|
604
|
+
|
605
|
+
class ZbxAPI_UserGroup < ZbxAPI_Sub
|
606
|
+
def get(options={})
|
607
|
+
checkauth
|
608
|
+
checkversion(1,1)
|
609
|
+
|
610
|
+
obj=do_request(json_obj('usergroup.get',options))
|
611
|
+
return obj['result']
|
612
|
+
end
|
613
|
+
end
|
614
|
+
|
615
|
+
#******************************************************************************
|
616
|
+
#
|
617
|
+
# Class ZbxAPI_HostGroup
|
618
|
+
#
|
619
|
+
# Class encapsulating User Group functions
|
620
|
+
#
|
621
|
+
# API Function Status
|
622
|
+
# get Basic function implemented
|
623
|
+
# getid
|
624
|
+
# create
|
625
|
+
# update
|
626
|
+
# delete
|
627
|
+
# addhosts
|
628
|
+
# removehost
|
629
|
+
# addgroupstohost
|
630
|
+
# updategroupstohost
|
631
|
+
#
|
632
|
+
#******************************************************************************
|
633
|
+
|
634
|
+
class ZbxAPI_HostGroup < ZbxAPI_Sub
|
635
|
+
def create(options={})
|
636
|
+
debug(8, "HostGroup.create Start")
|
637
|
+
checkauth
|
638
|
+
checkversion(1,1)
|
639
|
+
|
640
|
+
obj=do_request(json_obj('hostgroup.create',options))
|
641
|
+
return obj['result']
|
642
|
+
end
|
643
|
+
|
644
|
+
# alias function for code written against 1.0 API
|
645
|
+
def add(options={})
|
646
|
+
puts "WARNING API Function HostGroup.add is deprecated and will be removed in the future without further warning"
|
647
|
+
create(options)
|
648
|
+
end
|
649
|
+
|
650
|
+
def get(options={})
|
651
|
+
debug(8, "HostGroup.get Start")
|
652
|
+
checkauth
|
653
|
+
checkversion(1,1)
|
654
|
+
|
655
|
+
obj=do_request(json_obj('hostgroup.get',options))
|
656
|
+
return obj['result']
|
657
|
+
end
|
658
|
+
|
659
|
+
def getId(name)
|
660
|
+
puts "WARNING API Function HostGroup.getId is deprecated and will be removed in the future without further warning"
|
661
|
+
getObjects(name)
|
662
|
+
end
|
663
|
+
|
664
|
+
def getObjects(name)
|
665
|
+
debug(8, "HostGroup.getId Start")
|
666
|
+
checkauth
|
667
|
+
checkversion(1,1)
|
668
|
+
|
669
|
+
begin
|
670
|
+
if name.class==String
|
671
|
+
do_request(json_obj('hostgroup.getObjects',{"name"=>name}))['result']
|
672
|
+
elsif name.class==Array
|
673
|
+
valid = name.map {|item| item.class==String ? nil : false} # create a validation array of nils or false
|
674
|
+
valid.compact! # remove nils
|
675
|
+
raise ZbxAPI_ParameterError, "Expected a string or an array of strings" if !valid.empty?
|
676
|
+
|
677
|
+
results=[]
|
678
|
+
name.each do |item|
|
679
|
+
response=do_request(json_obj('hostgroup.getObjects',{"name"=>item}))
|
680
|
+
response['result'].each {|result| results << result } # Just in case the server returns an array
|
681
|
+
end
|
682
|
+
results
|
683
|
+
else
|
684
|
+
raise ZbxAPI_ParameterError, "Expected a string or an array of strings"
|
685
|
+
end
|
686
|
+
rescue ZbxAPI_GeneralError => e
|
687
|
+
if e.message["code"]==-32602
|
688
|
+
return 0
|
689
|
+
else
|
690
|
+
raise e
|
691
|
+
end
|
692
|
+
end
|
693
|
+
end
|
694
|
+
end
|
695
|
+
|
696
|
+
#******************************************************************************
|
697
|
+
|
698
|
+
#
|
699
|
+
# Class ZbxAPI_Application
|
700
|
+
#
|
701
|
+
# Class encapsulating application functions
|
702
|
+
#
|
703
|
+
# API Function Status
|
704
|
+
# get Not implemented
|
705
|
+
# getById Implemented
|
706
|
+
# getId Not implemented
|
707
|
+
# create Not implemented
|
708
|
+
# update Not implemented
|
709
|
+
# delete Not implemented
|
710
|
+
#
|
711
|
+
#******************************************************************************
|
712
|
+
|
713
|
+
|
714
|
+
class ZbxAPI_Application < ZbxAPI_Sub
|
715
|
+
def get(options={})
|
716
|
+
debug(8, "Application.get Start")
|
717
|
+
checkauth
|
718
|
+
checkversion(1,1)
|
719
|
+
|
720
|
+
obj=do_request(json_obj('application.get',options))
|
721
|
+
return obj['result']
|
722
|
+
end
|
723
|
+
|
724
|
+
def create(options={})
|
725
|
+
debug(8, "Application.create Start")
|
726
|
+
checkauth
|
727
|
+
checkversion(1,1)
|
728
|
+
|
729
|
+
obj=do_request(json_obj('application.create',options))
|
730
|
+
return obj['result']
|
731
|
+
end
|
732
|
+
|
733
|
+
# Alias function for code written against 1.0 API
|
734
|
+
def add(options={})
|
735
|
+
puts "WARNING API Function Application.add is deprecated and will be removed in the future without further warning"
|
736
|
+
create(options)
|
737
|
+
end
|
738
|
+
|
739
|
+
def getid(options={})
|
740
|
+
debug(8, "Application.getid Start")
|
741
|
+
checkauth
|
742
|
+
checkversion(1,1)
|
743
|
+
|
744
|
+
begin
|
745
|
+
obj=do_request(json_obj('application.getid',options))
|
746
|
+
rescue ZbxAPI_GeneralError => e
|
747
|
+
if e.message["code"]==-32400
|
748
|
+
return 0
|
749
|
+
else
|
750
|
+
raise e
|
751
|
+
end
|
752
|
+
end
|
753
|
+
return obj['result']
|
754
|
+
end
|
755
|
+
end
|
756
|
+
|
757
|
+
#******************************************************************************
|
758
|
+
#
|
759
|
+
# Class ZbxAPI_Trigger
|
760
|
+
#
|
761
|
+
# Class encapsulating trigger functions
|
762
|
+
#
|
763
|
+
# get Implemented
|
764
|
+
# getById Not implemented
|
765
|
+
# getId Not implemented
|
766
|
+
# create Implemented
|
767
|
+
# update Not implemented
|
768
|
+
# delete Not implemented
|
769
|
+
# addDependency Not implemented
|
770
|
+
#
|
771
|
+
#******************************************************************************
|
772
|
+
|
773
|
+
|
774
|
+
class ZbxAPI_Trigger < ZbxAPI_Sub
|
775
|
+
def get(options={})
|
776
|
+
debug(8, "Trigger.get Start")
|
777
|
+
checkauth
|
778
|
+
checkversion(1,1)
|
779
|
+
|
780
|
+
obj=do_request(json_obj('trigger.get',options))
|
781
|
+
return obj['result']
|
782
|
+
end
|
783
|
+
|
784
|
+
# Function name changed to reflect 1.1 API changes
|
785
|
+
def create(options={})
|
786
|
+
debug(8, "Trigger.create Start")
|
787
|
+
checkauth
|
788
|
+
checkversion(1,1)
|
789
|
+
|
790
|
+
obj=do_request(json_obj('trigger.create',options))
|
791
|
+
return obj['result']
|
792
|
+
end
|
793
|
+
|
794
|
+
# Alias function for code written against 1.0 api
|
795
|
+
def add(options={})
|
796
|
+
puts "WARNING API Function Trigger.add is deprecated and will be removed in the future without further warning"
|
797
|
+
create(options)
|
798
|
+
end
|
799
|
+
end
|
800
|
+
|
801
|
+
#******************************************************************************
|
802
|
+
#
|
803
|
+
# Class ZbxAPI_Sysmap
|
804
|
+
#
|
805
|
+
# Class encapsulating sysmap functions
|
806
|
+
#
|
807
|
+
# get Not implemented
|
808
|
+
# cr eate Basic implementation
|
809
|
+
#
|
810
|
+
#******************************************************************************
|
811
|
+
|
812
|
+
class ZbxAPI_Sysmap < ZbxAPI_Sub
|
813
|
+
def create(options={})
|
814
|
+
debug(8, "Sysmap.create Start")
|
815
|
+
checkauth
|
816
|
+
checkversion(1,1)
|
817
|
+
|
818
|
+
obj=do_request(json_obj('map.create',options))
|
819
|
+
return obj['result']
|
820
|
+
end
|
821
|
+
|
822
|
+
# Alias function for code written against 1.0 API
|
823
|
+
def add(options={})
|
824
|
+
puts "WARNING API Function Sysmap.add is deprecated and will be removed in the future without further warning"
|
825
|
+
create(options)
|
826
|
+
end
|
827
|
+
|
828
|
+
def addelement(options={})
|
829
|
+
debug(8, "Sysmap.addelement Start")
|
830
|
+
checkauth
|
831
|
+
checkversion(1,1)
|
832
|
+
|
833
|
+
obj=do_request(json_obj('map.addelement',options))
|
834
|
+
return obj['result']
|
835
|
+
end
|
836
|
+
|
837
|
+
def addlink(options={})
|
838
|
+
debug(8, "Sysmap.addlink Start")
|
839
|
+
checkauth
|
840
|
+
checkversion(1,1)
|
841
|
+
|
842
|
+
obj=do_request(json_obj('map.addlink',options))
|
843
|
+
return obj['result']
|
844
|
+
end
|
845
|
+
|
846
|
+
def getseid(options={})
|
847
|
+
debug(8, "Sysmap.getseid Start")
|
848
|
+
checkauth
|
849
|
+
checkversion(1,1)
|
850
|
+
|
851
|
+
obj=do_request(json_obj('map.getseid',options))
|
852
|
+
return obj['result']
|
853
|
+
end
|
854
|
+
|
855
|
+
def addlinktrigger(options={})
|
856
|
+
debug(8, "Sysmap.addlinktrigger Start")
|
857
|
+
checkauth
|
858
|
+
checkversion(1,1)
|
859
|
+
|
860
|
+
obj=do_request(json_obj('map.addlinktrigger',options))
|
861
|
+
return obj['result']
|
862
|
+
end
|
863
|
+
end
|
864
|
+
|
865
|
+
#******************************************************************************
|
866
|
+
#
|
867
|
+
# Class ZbxAPI_History
|
868
|
+
#
|
869
|
+
# Class encapsulating history functions
|
870
|
+
#
|
871
|
+
# get
|
872
|
+
#
|
873
|
+
#******************************************************************************
|
874
|
+
|
875
|
+
class ZbxAPI_History
|
876
|
+
|
877
|
+
def initialize(server)
|
878
|
+
@server=server
|
879
|
+
end
|
880
|
+
|
881
|
+
#Get the history for an item.
|
882
|
+
# itemids is a required option
|
883
|
+
# example: get({"itemids"=>12345})
|
884
|
+
def get(options)
|
885
|
+
@server.checkauth
|
886
|
+
@server.checkversion(1,3)
|
887
|
+
|
888
|
+
raise ZbxAPI_ParameterError, "Missing 'itemid'", "History.get" if options["itemids"].nil?
|
889
|
+
|
890
|
+
p obj=@server.raw_api("history.get",options)
|
891
|
+
return obj['result']
|
892
|
+
end
|
893
|
+
|
894
|
+
end
|
895
|
+
|
896
|
+
|
897
|
+
#******************************************************************************
|
898
|
+
|
899
|
+
|
900
|
+
if __FILE__ == $0
|
901
|
+
|
902
|
+
puts "Performing login"
|
903
|
+
zbx_api = ZabbixAPI.new('http://localhost')
|
904
|
+
zbx_api.login('apitest','test')
|
905
|
+
|
906
|
+
puts
|
907
|
+
puts "Getting user groups"
|
908
|
+
p zbx_api.usergroup.get
|
909
|
+
|
910
|
+
puts
|
911
|
+
puts "testing user.get"
|
912
|
+
zbx_api.debug_level=8
|
913
|
+
p zbx_api.user.get()
|
914
|
+
p zbx_api.user.get({"extendoutput"=>true})
|
915
|
+
zbx_api.debug_level=0
|
916
|
+
|
917
|
+
|
918
|
+
puts
|
919
|
+
puts "Getting by username, admin, number should be seen"
|
920
|
+
p zbx_api.user.getid('admin')
|
921
|
+
puts "Trying a bogus username"
|
922
|
+
p zbx_api.user.getid('bogus')
|
923
|
+
|
924
|
+
puts
|
925
|
+
puts "adding the user 'test' to Zabbix"
|
926
|
+
uid= zbx_api.user.create(
|
927
|
+
[{ "name"=>"test",
|
928
|
+
"alias"=>"testapiuser",
|
929
|
+
"password"=>"test",
|
930
|
+
"url"=>"",
|
931
|
+
"autologin"=>0,
|
932
|
+
"autologout"=>900,
|
933
|
+
"theme"=>"default.css",
|
934
|
+
"refresh"=>60,
|
935
|
+
"rows_per_page"=>50,
|
936
|
+
"lang"=>"en_GB",
|
937
|
+
"type"=>3}])
|
938
|
+
p uid
|
939
|
+
puts "Deleting userid #{uid.keys[0]}"
|
940
|
+
p zbx_api.user.delete(uid.values[0])
|
941
|
+
|
942
|
+
puts
|
943
|
+
puts "getting items"
|
944
|
+
p zbx_api.item.get
|
945
|
+
|
946
|
+
puts
|
947
|
+
puts "getting items by host"
|
948
|
+
puts "host: #{hosts.values[0]}"
|
949
|
+
p items=zbx_api.item.get({'hostids'=>hosts.values[0]})
|
950
|
+
|
951
|
+
end
|