zabbix_manager 5.1.0 → 5.1.1.pre.alpha1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -2
- data/{LICENSE.txt → LICENSE} +6 -6
- data/README.md +3 -2
- data/lib/zabbix_manager/basic/basic_alias.rb +6 -8
- data/lib/zabbix_manager/basic/basic_func.rb +17 -18
- data/lib/zabbix_manager/basic/basic_init.rb +21 -18
- data/lib/zabbix_manager/basic/basic_logic.rb +143 -139
- data/lib/zabbix_manager/classes/actions.rb +1 -1
- data/lib/zabbix_manager/classes/applications.rb +8 -7
- data/lib/zabbix_manager/classes/configurations.rb +2 -2
- data/lib/zabbix_manager/classes/drules.rb +6 -6
- data/lib/zabbix_manager/classes/errors.rb +1 -1
- data/lib/zabbix_manager/classes/graphs.rb +6 -6
- data/lib/zabbix_manager/classes/hostgroups.rb +0 -34
- data/lib/zabbix_manager/classes/hostinterfaces.rb +26 -0
- data/lib/zabbix_manager/classes/hosts.rb +35 -153
- data/lib/zabbix_manager/classes/httptests.rb +3 -3
- data/lib/zabbix_manager/classes/items.rb +51 -49
- data/lib/zabbix_manager/classes/mediatypes.rb +5 -5
- data/lib/zabbix_manager/classes/problems.rb +43 -61
- data/lib/zabbix_manager/classes/proxies.rb +4 -24
- data/lib/zabbix_manager/classes/roles.rb +7 -7
- data/lib/zabbix_manager/classes/screens.rb +3 -3
- data/lib/zabbix_manager/classes/templates.rb +17 -33
- data/lib/zabbix_manager/classes/triggers.rb +31 -73
- data/lib/zabbix_manager/classes/usergroups.rb +6 -6
- data/lib/zabbix_manager/classes/usermacros.rb +38 -37
- data/lib/zabbix_manager/classes/users.rb +4 -4
- data/lib/zabbix_manager/classes/valuemaps.rb +8 -7
- data/lib/zabbix_manager/client.rb +70 -45
- data/lib/zabbix_manager/version.rb +2 -1
- data/lib/zabbix_manager.rb +18 -38
- data/zabbix_manager.gemspec +7 -11
- metadata +22 -66
- data/CODE_OF_CONDUCT.md +0 -84
- data/lib/zabbix_manager/basic/basic_extend.rb +0 -40
@@ -19,7 +19,7 @@ class ZabbixManager
|
|
19
19
|
# Get User macro object id from Zabbix API based on provided data
|
20
20
|
#
|
21
21
|
# @param data [Hash] Needs to include macro to properly identify user macros via Zabbix API
|
22
|
-
# @raise [
|
22
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call or missing object's id field name (identify).
|
23
23
|
# @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
|
24
24
|
# @return [Integer] Zabbix object id
|
25
25
|
def get_id(data)
|
@@ -29,7 +29,7 @@ class ZabbixManager
|
|
29
29
|
data = symbolize_keys(data) if data.key?(identify)
|
30
30
|
# raise an error if identify name was not supplied
|
31
31
|
name = data[identify.to_sym]
|
32
|
-
raise
|
32
|
+
raise ZbxError, "#{identify} not supplied in call to get_id" if name.nil?
|
33
33
|
|
34
34
|
result = request(data, "usermacro.get", "hostmacroid")
|
35
35
|
|
@@ -39,7 +39,7 @@ class ZabbixManager
|
|
39
39
|
# Get Global macro object id from Zabbix API based on provided data
|
40
40
|
#
|
41
41
|
# @param data [Hash] Needs to include macro to properly identify global macros via Zabbix API
|
42
|
-
# @raise [
|
42
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call or missing object's id field name (identify).
|
43
43
|
# @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
|
44
44
|
# @return [Integer] Zabbix object id
|
45
45
|
def get_id_global(data)
|
@@ -49,7 +49,7 @@ class ZabbixManager
|
|
49
49
|
data = symbolize_keys(data) if data.key?(identify)
|
50
50
|
# raise an error if identify name was not supplied
|
51
51
|
name = data[identify.to_sym]
|
52
|
-
raise
|
52
|
+
raise ZbxError, "#{identify} not supplied in call to get_id_global" if name.nil?
|
53
53
|
|
54
54
|
result = request(data, "usermacro.get", "globalmacroid")
|
55
55
|
|
@@ -59,7 +59,7 @@ class ZabbixManager
|
|
59
59
|
# Get full/extended User macro data from Zabbix API
|
60
60
|
#
|
61
61
|
# @param data [Hash] Should include object's id field name (identify) and id value
|
62
|
-
# @raise [
|
62
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call.
|
63
63
|
# @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
|
64
64
|
# @return [Hash]
|
65
65
|
def get_full_data(data)
|
@@ -71,7 +71,7 @@ class ZabbixManager
|
|
71
71
|
# Get full/extended Global macro data from Zabbix API
|
72
72
|
#
|
73
73
|
# @param data [Hash] Should include object's id field name (identify) and id value
|
74
|
-
# @raise [
|
74
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call.
|
75
75
|
# @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
|
76
76
|
# @return [Hash]
|
77
77
|
def get_full_data_global(data)
|
@@ -83,7 +83,7 @@ class ZabbixManager
|
|
83
83
|
# Create new User macro object using Zabbix API (with defaults)
|
84
84
|
#
|
85
85
|
# @param data [Hash] Needs to include hostid, macro, and value to create User macro via Zabbix API
|
86
|
-
# @raise [
|
86
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call.
|
87
87
|
# @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
|
88
88
|
# @return [Integer] The object id if a single object is created
|
89
89
|
# @return [Boolean] True/False if multiple objects are created
|
@@ -94,7 +94,7 @@ class ZabbixManager
|
|
94
94
|
# Create new Global macro object using Zabbix API (with defaults)
|
95
95
|
#
|
96
96
|
# @param data [Hash] Needs to include hostid, macro, and value to create Global macro via Zabbix API
|
97
|
-
# @raise [
|
97
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call.
|
98
98
|
# @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
|
99
99
|
# @return [Integer] The object id if a single object is created
|
100
100
|
# @return [Boolean] True/False if multiple objects are created
|
@@ -105,7 +105,7 @@ class ZabbixManager
|
|
105
105
|
# Delete User macro object using Zabbix API
|
106
106
|
#
|
107
107
|
# @param data [Hash] Should include hostmacroid's of User macros to delete
|
108
|
-
# @raise [
|
108
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call.
|
109
109
|
# @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
|
110
110
|
# @return [Integer] The object id if a single object is deleted
|
111
111
|
# @return [Boolean] True/False if multiple objects are deleted
|
@@ -117,7 +117,7 @@ class ZabbixManager
|
|
117
117
|
# Delete Global macro object using Zabbix API
|
118
118
|
#
|
119
119
|
# @param data [Hash] Should include hostmacroid's of Global macros to delete
|
120
|
-
# @raise [
|
120
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call.
|
121
121
|
# @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
|
122
122
|
# @return [Integer] The object id if a single object is deleted
|
123
123
|
# @return [Boolean] True/False if multiple objects are deleted
|
@@ -130,7 +130,7 @@ class ZabbixManager
|
|
130
130
|
#
|
131
131
|
# @param data [Hash] Should include object's id field name (identify), id value, and fields to update
|
132
132
|
# @param force [Boolean] Whether to force an object update even if provided data matches Zabbix
|
133
|
-
# @raise [
|
133
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call.
|
134
134
|
# @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
|
135
135
|
# @return [Integer] The object id if a single object is created
|
136
136
|
# @return [Boolean] True/False if multiple objects are created
|
@@ -142,7 +142,7 @@ class ZabbixManager
|
|
142
142
|
#
|
143
143
|
# @param data [Hash] Should include object's id field name (identify), id value, and fields to update
|
144
144
|
# @param force [Boolean] Whether to force an object update even if provided data matches Zabbix
|
145
|
-
# @raise [
|
145
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call.
|
146
146
|
# @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
|
147
147
|
# @return [Integer] The object id if a single object is created
|
148
148
|
# @return [Boolean] True/False if multiple objects are created
|
@@ -153,7 +153,7 @@ class ZabbixManager
|
|
153
153
|
# Get or Create User macro object using Zabbix API
|
154
154
|
#
|
155
155
|
# @param data [Hash] Needs to include macro and hostid to properly identify User macros via Zabbix API
|
156
|
-
# @raise [
|
156
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call.
|
157
157
|
# @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
|
158
158
|
# @return [Integer] Zabbix object id
|
159
159
|
def get_or_create(data)
|
@@ -168,7 +168,7 @@ class ZabbixManager
|
|
168
168
|
# Get or Create Global macro object using Zabbix API
|
169
169
|
#
|
170
170
|
# @param data [Hash] Needs to include macro and hostid to properly identify Global macros via Zabbix API
|
171
|
-
# @raise [
|
171
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call.
|
172
172
|
# @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
|
173
173
|
# @return [Integer] Zabbix object id
|
174
174
|
def get_or_create_global(data)
|
@@ -183,9 +183,9 @@ class ZabbixManager
|
|
183
183
|
# Create or update User macro object using Zabbix API
|
184
184
|
#
|
185
185
|
# @param data [Hash] Needs to include macro and hostid to properly identify User macros via Zabbix API
|
186
|
-
# @raise [
|
186
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call.
|
187
187
|
# @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
|
188
|
-
# @return [Integer] Zabbix object id
|
188
|
+
# @return [Integer, TrueClass, FalseClass, NilClass] Zabbix object id
|
189
189
|
def create_or_update(data)
|
190
190
|
hostmacroid = get_id(macro: data[:macro], hostid: data[:hostid])
|
191
191
|
hostmacroid ? update(data.merge(hostmacroid: hostmacroid)) : create(data)
|
@@ -194,36 +194,37 @@ class ZabbixManager
|
|
194
194
|
# Create or update Global macro object using Zabbix API
|
195
195
|
#
|
196
196
|
# @param data [Hash] Needs to include macro and hostid to properly identify Global macros via Zabbix API
|
197
|
-
# @raise [
|
197
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call.
|
198
198
|
# @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
|
199
|
-
# @return [Integer] Zabbix object id
|
199
|
+
# @return [Integer, TrueClass, FalseClass, NilClass] Zabbix object id
|
200
200
|
def create_or_update_global(data)
|
201
201
|
globalmacroid = get_id_global(macro: data[:macro], hostid: data[:hostid])
|
202
202
|
globalmacroid ? update_global(data.merge(globalmacroid: globalmacroid)) : create_global(data)
|
203
203
|
end
|
204
204
|
|
205
205
|
private
|
206
|
-
# Custom request method to handle both User and Global macros in one
|
207
|
-
#
|
208
|
-
# @param data [Hash] Needs to include macro and hostid to properly identify Global macros via Zabbix API
|
209
|
-
# @param method [String] Zabbix API method to use for the request
|
210
|
-
# @param result_key [String] Which key to use for parsing results based on User vs Global macros
|
211
|
-
# @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
|
212
|
-
# @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
|
213
|
-
# @return [Integer] Zabbix object id
|
214
|
-
def request(data, method, result_key)
|
215
|
-
# Zabbix has different result formats for gets vs updates
|
216
|
-
if method.include?(".get")
|
217
|
-
if result_key.include?("global")
|
218
|
-
@client.api_request(method: method, params: { globalmacro: true, filter: data })
|
219
|
-
else
|
220
|
-
@client.api_request(method: method, params: { filter: data })
|
221
|
-
end
|
222
|
-
else
|
223
|
-
result = @client.api_request(method: method, params: data)
|
224
206
|
|
225
|
-
|
207
|
+
# Custom request method to handle both User and Global macros in one
|
208
|
+
#
|
209
|
+
# @param data [Hash] Needs to include macro and hostid to properly identify Global macros via Zabbix API
|
210
|
+
# @param method [String] Zabbix API method to use for the request
|
211
|
+
# @param result_key [String] Which key to use for parsing results based on User vs Global macros
|
212
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call.
|
213
|
+
# @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
|
214
|
+
# @return [Integer, TrueClass, FalseClass, NilClass] Zabbix object id
|
215
|
+
def request(data, method, result_key)
|
216
|
+
# Zabbix has different result formats for gets vs updates
|
217
|
+
if method.include?(".get")
|
218
|
+
if result_key.include?("global")
|
219
|
+
@client.api_request(method: method, params: { globalmacro: true, filter: data })
|
220
|
+
else
|
221
|
+
@client.api_request(method: method, params: { filter: data })
|
226
222
|
end
|
223
|
+
else
|
224
|
+
result = @client.api_request(method: method, params: data)
|
225
|
+
|
226
|
+
result.key?(result_key) && !result[result_key].empty? ? result[result_key][0].to_i : nil
|
227
227
|
end
|
228
|
+
end
|
228
229
|
end
|
229
230
|
end
|
@@ -46,9 +46,9 @@ class ZabbixManager
|
|
46
46
|
# Add media to users using Zabbix API
|
47
47
|
#
|
48
48
|
# @param data [Hash] Needs to include userids and media to mass add media to users
|
49
|
-
# @raise [
|
49
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call.
|
50
50
|
# @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
|
51
|
-
# @return [Integer] Zabbix object id (media)
|
51
|
+
# @return [Integer, NilClass] Zabbix object id (media)
|
52
52
|
def add_medias(data)
|
53
53
|
medias_helper(data, "update")
|
54
54
|
end
|
@@ -56,9 +56,9 @@ class ZabbixManager
|
|
56
56
|
# Update media for users using Zabbix API
|
57
57
|
#
|
58
58
|
# @param data [Hash] Needs to include userids and media to mass update media for users
|
59
|
-
# @raise [
|
59
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call.
|
60
60
|
# @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
|
61
|
-
# @return [Integer] Zabbix object id (user)
|
61
|
+
# @return [Integer, NilClass] Zabbix object id (user)
|
62
62
|
def update_medias(data)
|
63
63
|
medias_helper(data, "update")
|
64
64
|
end
|
@@ -26,24 +26,25 @@ class ZabbixManager
|
|
26
26
|
# Get or Create ValueMap object using Zabbix API
|
27
27
|
#
|
28
28
|
# @param data [Hash] Needs to include valuemapids [List] to properly identify ValueMaps via Zabbix API
|
29
|
-
# @raise [
|
29
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call.
|
30
30
|
# @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
|
31
|
-
# @return [Integer] Zabbix object id
|
31
|
+
# @return [Integer, TrueClass, FalseClass] Zabbix object id
|
32
32
|
def get_or_create(data)
|
33
33
|
log "[DEBUG] Call get_or_create with parameters: #{data.inspect}"
|
34
34
|
|
35
|
-
|
36
|
-
id
|
35
|
+
if (id = get_id(valuemapids: data[:valuemapids]))
|
36
|
+
id
|
37
|
+
else
|
38
|
+
create(data)
|
37
39
|
end
|
38
|
-
id
|
39
40
|
end
|
40
41
|
|
41
42
|
# Create or update Item object using Zabbix API
|
42
43
|
#
|
43
44
|
# @param data [Hash] Needs to include valuemapids to properly identify ValueMaps via Zabbix API
|
44
|
-
# @raise [
|
45
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call.
|
45
46
|
# @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
|
46
|
-
# @return [Integer] Zabbix object id
|
47
|
+
# @return [Integer, TrueClass, FalseClass] Zabbix object id
|
47
48
|
def create_or_update(data)
|
48
49
|
valuemapid = get_id(name: data[:name])
|
49
50
|
valuemapid ? update(data.merge(valuemapids: [:valuemapid])) : create(data)
|
@@ -4,57 +4,74 @@ require "net/http"
|
|
4
4
|
require "json"
|
5
5
|
require "openssl"
|
6
6
|
|
7
|
+
# @author: WENWU YAN
|
8
|
+
# @email: 968828@gmail.com
|
9
|
+
# @date: 2023/3/25下午4:47
|
7
10
|
class ZabbixManager
|
8
11
|
class Client
|
9
|
-
# @param
|
12
|
+
# @param
|
10
13
|
# @return [Hash]
|
11
14
|
attr_reader :options
|
12
15
|
|
13
16
|
# @return [Integer]
|
14
17
|
def id
|
15
|
-
rand
|
18
|
+
@id ||= rand 100_000
|
16
19
|
end
|
17
20
|
|
18
21
|
# Returns the API version from the Zabbix Server
|
19
|
-
#
|
22
|
+
# @note 获取 zabbix api 版本
|
20
23
|
# @return [String, Hash]
|
21
24
|
def api_version
|
22
25
|
api_request(method: "apiinfo.version", params: {})
|
23
26
|
end
|
24
27
|
|
28
|
+
# ZabbixManager::Basic.log does not like @client.options[:debug]
|
29
|
+
# @note 是否启用 debug 模式
|
30
|
+
# @return [boolean]
|
31
|
+
def debug?
|
32
|
+
!@options || @options[:debug]
|
33
|
+
end
|
34
|
+
|
35
|
+
# Log messages to stdout when debugging
|
36
|
+
# @note debug 打印信息
|
37
|
+
# @param message [String]
|
38
|
+
def log(message)
|
39
|
+
puts message if debug?
|
40
|
+
end
|
41
|
+
|
25
42
|
# Log in to the Zabbix Server and generate an auth token using the API
|
26
|
-
#
|
43
|
+
# @note 用户鉴权,登录成功即可获取令牌
|
44
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call.
|
27
45
|
# @return [Hash, String]
|
28
46
|
def auth
|
29
47
|
api_request(
|
30
48
|
method: "user.login",
|
31
49
|
params: {
|
32
|
-
user:
|
50
|
+
user: @options[:user],
|
33
51
|
password: @options[:password]
|
34
52
|
}
|
35
53
|
)
|
36
54
|
end
|
37
55
|
|
38
|
-
# ZabbixManager::Basic.log does not like @client.options[:debug]
|
39
|
-
#
|
40
|
-
# @return [boolean]
|
41
|
-
def debug?
|
42
|
-
!@options || @options[:debug]
|
43
|
-
end
|
44
|
-
|
45
56
|
# Initializes a new Client object
|
46
|
-
#
|
57
|
+
# @see 实例化 HTTP 客户端,同时进行用户权限签证
|
47
58
|
# @param options [Hash]
|
48
|
-
# @option opts [String] :url The url of
|
49
|
-
# @
|
50
|
-
# @
|
59
|
+
# @option opts [String] :url The url of zabbix
|
60
|
+
# @example 'http://zabbix.com/api_jsonrpc.php'
|
61
|
+
# @see 'https://www.zabbix.com/documentation/current/en/manual/api/reference'
|
62
|
+
# @option opts [String] :user A user for api auth.(required)
|
63
|
+
# @option opts [String] :password A password for api auth.(required)
|
51
64
|
# @option opts [String] :http_user A user for basic auth.(optional)
|
52
65
|
# @option opts [String] :http_password A password for basic auth.(optional)
|
53
66
|
# @option opts [Integer] :timeout Set timeout for requests in seconds.(default: 60)
|
54
|
-
#
|
67
|
+
# @raise [ZbxError] Error raised when api_version not support.
|
55
68
|
# @return [ZabbixManager::Client]
|
56
69
|
def initialize(options = {})
|
57
70
|
@options = options
|
71
|
+
raise ZabbixManager::ZbxError, "Missing required argument: :url" unless @options.key?(:url)
|
72
|
+
raise ZabbixManager::ZbxError, "Missing required argument: :user" unless @options.key?(:user)
|
73
|
+
raise ZabbixManager::ZbxError, "Missing required argument: :password" unless @options.key?(:password)
|
74
|
+
|
58
75
|
if !ENV["http_proxy"].nil? && options[:no_proxy] != true
|
59
76
|
@proxy_uri = URI.parse(ENV["http_proxy"])
|
60
77
|
@proxy_host = @proxy_uri.host
|
@@ -65,42 +82,45 @@ class ZabbixManager
|
|
65
82
|
if api_version.match?(/^7\.\d+\.\d+$/)
|
66
83
|
message = "Zabbix API version: #{api_version} is not supported by this version of zabbix_manager"
|
67
84
|
if @options[:ignore_version]
|
68
|
-
|
85
|
+
log "[WARNING] #{message}"
|
69
86
|
else
|
70
|
-
raise ZabbixManager::
|
87
|
+
raise ZabbixManager::ZbxError, message
|
71
88
|
end
|
72
89
|
end
|
73
90
|
|
74
91
|
@auth_hash = auth
|
75
|
-
|
92
|
+
log "[DEBUG] Auth token: #{@auth_hash}"
|
76
93
|
end
|
77
94
|
|
78
|
-
# Convert
|
79
|
-
#
|
95
|
+
# Convert payload body to JSON string for the Zabbix API
|
96
|
+
# @note 将 ruby 数据结构转换为 json 字符串,除用户登录和获取API版本外均添加令牌
|
80
97
|
# @param body [Hash]
|
81
98
|
# @return [String]
|
82
|
-
def
|
83
|
-
|
84
|
-
method:
|
85
|
-
params:
|
86
|
-
id:
|
99
|
+
def json_payload(body)
|
100
|
+
payload = {
|
101
|
+
method: body[:method],
|
102
|
+
params: body[:params],
|
103
|
+
id: id,
|
87
104
|
jsonrpc: "2.0"
|
88
105
|
}
|
89
106
|
|
90
|
-
|
91
|
-
message[:auth] = @auth_hash unless body[:method] == "apiinfo.version" || body[:method] == "user.login"
|
107
|
+
payload[:auth] = @auth_hash unless body[:method] == "apiinfo.version" || body[:method] == "user.login"
|
92
108
|
|
93
|
-
JSON(
|
109
|
+
JSON(payload)
|
94
110
|
end
|
95
111
|
|
112
|
+
# HTTP Request with the Zabbix API
|
113
|
+
# @note 实例化 Net::HTTP 对象,并发起 api 请求
|
96
114
|
# @param body [String]
|
115
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call.
|
116
|
+
# @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
|
97
117
|
# @return [String]
|
98
118
|
def http_request(body)
|
99
119
|
uri = URI.parse(@options[:url])
|
100
120
|
|
101
121
|
# set the time out the default (60) or to what the user passed
|
102
122
|
timeout = @options[:timeout].nil? ? 60 : @options[:timeout]
|
103
|
-
|
123
|
+
log "[DEBUG] Timeout for request set to #{timeout} seconds"
|
104
124
|
|
105
125
|
http =
|
106
126
|
if @proxy_uri
|
@@ -121,48 +141,53 @@ class ZabbixManager
|
|
121
141
|
request.basic_auth @options[:http_user], @options[:http_password] if @options[:http_user]
|
122
142
|
request.add_field("Content-Type", "application/json-rpc")
|
123
143
|
request.body = body
|
124
|
-
|
144
|
+
log "[DEBUG] HTTP request params: #{pretty_body(request.body)}"
|
125
145
|
|
126
146
|
response = http.request(request)
|
127
147
|
raise HttpError.new("HTTP Error: #{response.code} on #{@options[:url]}", response) unless response.code == "200"
|
128
148
|
|
129
|
-
|
149
|
+
log "[DEBUG] HTTP response answer: #{pretty_body(response.body)}"
|
130
150
|
response.body
|
131
151
|
end
|
132
152
|
|
153
|
+
# Check the result returned by zabbix api is ok or not
|
154
|
+
# @note 发起 api 调用并对响应结果进行解析,如接口报错则抛出异常
|
155
|
+
# @@note 返回的数据为基于字符串索引,需要自行适配为符号索引
|
133
156
|
# @param body [String]
|
157
|
+
# @raise [ZbxError] Error returned when there is a problem with the Zabbix API call.
|
134
158
|
# @return [Hash, String]
|
135
159
|
def _request(body)
|
136
160
|
result = JSON.parse(http_request(body))
|
137
|
-
# 异常信息抛出
|
138
161
|
if result["error"]
|
139
|
-
raise
|
162
|
+
raise ZbxError.new(
|
140
163
|
"Server answer API error\n #{JSON.pretty_unparse(result["error"])}\n on request:\n #{pretty_body(body)}", result
|
141
164
|
)
|
165
|
+
else
|
166
|
+
result["result"]
|
142
167
|
end
|
143
|
-
|
144
|
-
result["result"]
|
145
168
|
end
|
146
169
|
|
170
|
+
# Pretty print json body
|
171
|
+
# @note 将 ruby 数据结构美化成 json 字符串后打印输出
|
172
|
+
# @param body [String]
|
173
|
+
# @return [Hash, String]
|
147
174
|
def pretty_body(body)
|
148
|
-
|
175
|
+
data = JSON.parse(body)
|
149
176
|
|
150
177
|
# If password is in body hide it
|
151
|
-
if
|
152
|
-
|
153
|
-
"***"
|
178
|
+
if data["params"].is_a?(Hash) && data["params"].key?("password")
|
179
|
+
data["params"]["password"] = "***"
|
154
180
|
end
|
155
181
|
|
156
|
-
JSON.pretty_unparse(
|
182
|
+
JSON.pretty_unparse(data)
|
157
183
|
end
|
158
184
|
|
159
185
|
# Execute Zabbix API requests and return response
|
160
|
-
#
|
186
|
+
# @note 通用的 api 调用发起方法
|
161
187
|
# @param body [Hash]
|
162
188
|
# @return [Hash, String]
|
163
189
|
def api_request(body)
|
164
|
-
|
165
|
-
_request message_json(body)
|
190
|
+
_request json_payload(body)
|
166
191
|
end
|
167
192
|
end
|
168
193
|
end
|
data/lib/zabbix_manager.rb
CHANGED
@@ -1,40 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
require "zabbix_manager/basic/basic_func"
|
8
|
-
require "zabbix_manager/basic/basic_init"
|
9
|
-
require "zabbix_manager/basic/basic_logic"
|
10
|
-
|
11
|
-
require "zabbix_manager/classes/actions"
|
12
|
-
require "zabbix_manager/classes/applications"
|
13
|
-
require "zabbix_manager/classes/configurations"
|
14
|
-
require "zabbix_manager/classes/errors"
|
15
|
-
require "zabbix_manager/classes/events"
|
16
|
-
require "zabbix_manager/classes/graphs"
|
17
|
-
require "zabbix_manager/classes/hostgroups"
|
18
|
-
require "zabbix_manager/classes/hosts"
|
19
|
-
require "zabbix_manager/classes/httptests"
|
20
|
-
require "zabbix_manager/classes/items"
|
21
|
-
require "zabbix_manager/classes/maintenance"
|
22
|
-
require "zabbix_manager/classes/mediatypes"
|
23
|
-
require "zabbix_manager/classes/proxies"
|
24
|
-
require "zabbix_manager/classes/problems"
|
25
|
-
require "zabbix_manager/classes/roles"
|
26
|
-
require "zabbix_manager/classes/screens"
|
27
|
-
require "zabbix_manager/classes/scripts"
|
28
|
-
require "zabbix_manager/classes/server"
|
29
|
-
require "zabbix_manager/classes/templates"
|
30
|
-
require "zabbix_manager/classes/triggers"
|
31
|
-
require "zabbix_manager/classes/unusable"
|
32
|
-
require "zabbix_manager/classes/usergroups"
|
33
|
-
require "zabbix_manager/classes/usermacros"
|
34
|
-
require "zabbix_manager/classes/users"
|
35
|
-
require "zabbix_manager/classes/valuemaps"
|
36
|
-
require "zabbix_manager/classes/drules"
|
3
|
+
# Dynamically load Ruby modules
|
4
|
+
Dir.glob(File.join(__dir__, "zabbix_manager", "**", "*.rb")).sort.each do |module_rb|
|
5
|
+
require module_rb
|
6
|
+
end
|
37
7
|
|
8
|
+
# @author: WENWU YAN
|
9
|
+
# @email: 968828@gmail.com
|
10
|
+
# @date: 2023/3/25下午4:47
|
38
11
|
class ZabbixManager
|
39
12
|
# @return [ZabbixManager::Client]
|
40
13
|
attr_reader :client
|
@@ -47,27 +20,29 @@ class ZabbixManager
|
|
47
20
|
new(options)
|
48
21
|
end
|
49
22
|
|
23
|
+
# @note TODO
|
50
24
|
# @return [ZabbixManager]
|
51
25
|
def self.current
|
52
26
|
@current ||= ZabbixManager.new
|
53
27
|
end
|
54
28
|
|
55
29
|
# Executes an API request directly using a custom query
|
56
|
-
#
|
30
|
+
# @note 通用的查询方法,自行提供 method 和 params
|
57
31
|
# @param data [Hash]
|
58
|
-
# @return [Hash]
|
32
|
+
# @return [Hash, String]
|
59
33
|
def query(data)
|
60
|
-
@client.
|
34
|
+
@client.api_request(method: data[:method], params: data[:params])
|
61
35
|
end
|
62
36
|
|
63
37
|
# Invalidate current authentication token
|
38
|
+
# @note TODO
|
64
39
|
# @return [Boolean]
|
65
40
|
def logout
|
66
41
|
@client.logout
|
67
42
|
end
|
68
43
|
|
69
44
|
# Initializes a new ZabbixManager object
|
70
|
-
#
|
45
|
+
# @note 实例化 ZabbixManager 对象,Client.new 进行参数检查
|
71
46
|
# @param options [Hash]
|
72
47
|
# @return [ZabbixManager::Client]
|
73
48
|
def initialize(options = {})
|
@@ -104,6 +79,11 @@ class ZabbixManager
|
|
104
79
|
@hostgroups ||= HostGroups.new(@client)
|
105
80
|
end
|
106
81
|
|
82
|
+
# @return [ZabbixManager::HostInterfaces]
|
83
|
+
def hostinterfaces
|
84
|
+
@hostinterfaces ||= HostInterfaces.new(@client)
|
85
|
+
end
|
86
|
+
|
107
87
|
# @return [ZabbixManager::Hosts]
|
108
88
|
def hosts
|
109
89
|
@hosts ||= Hosts.new(@client)
|
data/zabbix_manager.gemspec
CHANGED
@@ -8,31 +8,27 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
8
8
|
require "zabbix_manager/version"
|
9
9
|
|
10
10
|
Gem::Specification.new do |spec|
|
11
|
-
spec.add_dependency "http", "
|
12
|
-
spec.add_dependency "json", "
|
13
|
-
spec.
|
14
|
-
|
15
|
-
spec.add_development_dependency "rspec", "~> 3.11"
|
16
|
-
spec.add_development_dependency "yard", "~> 0.9.27"
|
17
|
-
spec.add_development_dependency "yardstick", ">= 0.9.9"
|
11
|
+
spec.add_dependency "http", "5.1.1"
|
12
|
+
spec.add_dependency "json", "2.6.3"
|
13
|
+
spec.add_dependency "activesupport", "~> 7.0.4"
|
18
14
|
|
19
15
|
spec.name = "zabbix_manager"
|
20
16
|
spec.version = ZabbixManager::VERSION
|
21
17
|
spec.authors = ["WENWU YAN"]
|
22
18
|
spec.email = ["careline@foxmail.com"]
|
23
19
|
|
24
|
-
spec.summary = "
|
25
|
-
spec.description = "
|
20
|
+
spec.summary = "Common code for Zabbix API clients"
|
21
|
+
spec.description = "A Ruby interface to the Zabbix API"
|
26
22
|
spec.homepage = "https://github.com/snmpd/zabbix_manager"
|
27
23
|
spec.licenses = "MIT"
|
28
24
|
|
29
|
-
|
25
|
+
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
30
26
|
|
31
27
|
spec.metadata["homepage_uri"] = spec.homepage
|
32
28
|
spec.metadata["source_code_uri"] = "https://github.com/snmpd/zabbix_manager"
|
33
29
|
spec.metadata["changelog_uri"] = "https://github.com/snmpd/zabbix_manager"
|
34
30
|
|
35
|
-
spec.files = %w[CHANGELOG.md LICENSE
|
31
|
+
spec.files = %w[CHANGELOG.md LICENSE README.md zabbix_manager.gemspec] + Dir["lib/**/*.rb"]
|
36
32
|
spec.require_paths = "lib"
|
37
33
|
spec.required_ruby_version = ">= 2.7.0"
|
38
34
|
end
|