zabbix_manager 5.0.1 → 5.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.idea/workspace.xml +69 -0
  3. data/lib/zabbix_manager/basic/basic_alias.rb +37 -0
  4. data/lib/zabbix_manager/basic/basic_extend.rb +38 -0
  5. data/lib/zabbix_manager/basic/basic_func.rb +103 -0
  6. data/lib/zabbix_manager/basic/basic_init.rb +46 -0
  7. data/lib/zabbix_manager/basic/basic_logic.rb +227 -0
  8. data/lib/zabbix_manager/classes/actions.rb +41 -0
  9. data/lib/zabbix_manager/classes/applications.rb +43 -0
  10. data/lib/zabbix_manager/classes/configurations.rb +42 -0
  11. data/lib/zabbix_manager/classes/drules.rb +55 -0
  12. data/lib/zabbix_manager/classes/errors.rb +28 -0
  13. data/lib/zabbix_manager/classes/events.rb +18 -0
  14. data/lib/zabbix_manager/classes/graphs.rb +111 -0
  15. data/lib/zabbix_manager/classes/hostgroups.rb +58 -0
  16. data/lib/zabbix_manager/classes/hosts.rb +218 -0
  17. data/lib/zabbix_manager/classes/httptests.rb +54 -0
  18. data/lib/zabbix_manager/classes/items.rb +146 -0
  19. data/lib/zabbix_manager/classes/maintenance.rb +17 -0
  20. data/lib/zabbix_manager/classes/mediatypes.rb +109 -0
  21. data/lib/zabbix_manager/classes/problems.rb +133 -0
  22. data/lib/zabbix_manager/classes/proxies.rb +68 -0
  23. data/lib/zabbix_manager/classes/roles.rb +114 -0
  24. data/lib/zabbix_manager/classes/screens.rb +94 -0
  25. data/lib/zabbix_manager/classes/scripts.rb +35 -0
  26. data/lib/zabbix_manager/classes/server.rb +16 -0
  27. data/lib/zabbix_manager/classes/templates.rb +123 -0
  28. data/lib/zabbix_manager/classes/triggers.rb +166 -0
  29. data/lib/zabbix_manager/classes/unusable.rb +8 -0
  30. data/lib/zabbix_manager/classes/usergroups.rb +73 -0
  31. data/lib/zabbix_manager/classes/usermacros.rb +228 -0
  32. data/lib/zabbix_manager/classes/users.rb +64 -0
  33. data/lib/zabbix_manager/classes/valuemaps.rb +50 -0
  34. data/lib/zabbix_manager/client.rb +158 -0
  35. data/lib/zabbix_manager/version.rb +1 -1
  36. data/zabbix_manager-5.0.1.gem +0 -0
  37. data/zabbix_manager-5.0.2.gem +0 -0
  38. metadata +81 -4
@@ -0,0 +1,123 @@
1
+ class ZabbixManager
2
+ class Templates < Basic
3
+ # The method name used for interacting with Templates via Zabbix API
4
+ #
5
+ # @return [String]
6
+ def method_name
7
+ 'template'
8
+ end
9
+
10
+ # The id field name used for identifying specific Template objects via Zabbix API
11
+ #
12
+ # @return [String]
13
+ def identify
14
+ 'host'
15
+ end
16
+
17
+ # Delete Template object using Zabbix API
18
+ #
19
+ # @param data [Array] Should include array of templateid's
20
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
21
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
22
+ # @return [Integer] The Template object id that was deleted
23
+ def delete(data)
24
+ result = @client.api_request(method: 'template.delete', params: [data])
25
+ result.empty? ? nil : result['templateids'][0].to_i
26
+ end
27
+
28
+ # Get Template ids for Host from Zabbix API
29
+ #
30
+ # @param data [Hash] Should include host value to query for matching templates
31
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
32
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
33
+ # @return [Array] Returns array of Template ids
34
+ def get_ids_by_host(data)
35
+ @client.api_request(method: 'template.get', params: data).map do |tmpl|
36
+ tmpl['templateid']
37
+ end
38
+ end
39
+
40
+ # Get or Create Template object using Zabbix API
41
+ #
42
+ # @param data [Hash] Needs to include host to properly identify Templates via Zabbix API
43
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
44
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
45
+ # @return [Integer] Zabbix object id
46
+ def get_or_create(data)
47
+ unless (templateid = get_id(host: data[:host]))
48
+ templateid = create(data)
49
+ end
50
+ templateid
51
+ end
52
+
53
+ # Mass update Templates for Hosts using Zabbix API
54
+ #
55
+ # @param data [Hash] Should include hosts_id array and templates_id array
56
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
57
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
58
+ # @return [Boolean]
59
+ def mass_update(data)
60
+ result = @client.api_request(
61
+ method: 'template.massUpdate',
62
+ params: {
63
+ hosts: data[:hosts_id].map { |t| { hostid: t } },
64
+ templates: data[:templates_id].map { |t| { templateid: t } }
65
+ }
66
+ )
67
+ result.empty? ? false : true
68
+ end
69
+
70
+ # Mass add Templates to Hosts using Zabbix API
71
+ #
72
+ # @param data [Hash] Should include hosts_id array and templates_id array
73
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
74
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
75
+ # @return [Boolean]
76
+ def mass_add(data)
77
+ result = @client.api_request(
78
+ method: 'template.massAdd',
79
+ params: {
80
+ hosts: data[:hosts_id].map { |t| { hostid: t } },
81
+ templates: data[:templates_id].map { |t| { templateid: t } }
82
+ }
83
+ )
84
+ result.empty? ? false : true
85
+ end
86
+
87
+ # Mass remove Templates to Hosts using Zabbix API
88
+ #
89
+ # @param data [Hash] Should include hosts_id array and templates_id array
90
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
91
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
92
+ # @return [Boolean]
93
+ def mass_remove(data)
94
+ result = @client.api_request(
95
+ method: 'template.massRemove',
96
+ params: {
97
+ hostids: data[:hosts_id],
98
+ templateids: data[:templates_id],
99
+ groupids: data[:group_id],
100
+ force: 1
101
+ }
102
+ )
103
+ result.empty? ? false : true
104
+ end
105
+
106
+ # 新增 get_template_id 方法,使用列表 flatten 功能拉平数组对象
107
+ def get_template_ids(data)
108
+ # 直接调后端接口
109
+ result = @client.api_request(
110
+ method: 'template.get',
111
+ params: {
112
+ output: "extend",
113
+ filter: {
114
+ host: [data].flatten
115
+ }
116
+ }
117
+ ).map { |temp| [templateid: temp['templateid']]}
118
+
119
+ # 返回 template 模板数组对象
120
+ result.empty? ? nil : result.flatten
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,166 @@
1
+ class ZabbixManager
2
+ class Triggers < Basic
3
+ # The method name used for interacting with Triggers via Zabbix API
4
+ #
5
+ # @return [String]
6
+ def method_name
7
+ 'trigger'
8
+ end
9
+
10
+ # The id field name used for identifying specific Trigger objects via Zabbix API
11
+ #
12
+ # @return [String]
13
+ def identify
14
+ 'description'
15
+ end
16
+
17
+ # Dump Trigger object data by key from Zabbix API
18
+ #
19
+ # @param data [Hash] Should include desired object's key and value
20
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
21
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
22
+ # @return [Hash]
23
+ def dump_by_id(data)
24
+ log "[DEBUG] Call dump_by_id with parameters: #{data.inspect}"
25
+
26
+ @client.api_request(
27
+ method: 'trigger.get',
28
+ params: {
29
+ filter: {
30
+ keys.to_sym => data[keys.to_sym]
31
+ },
32
+ output: 'extend',
33
+ select_items: 'extend',
34
+ select_functions: 'extend'
35
+ }
36
+ )
37
+ end
38
+
39
+ # Safely update Trigger object using Zabbix API by deleting and replacing trigger
40
+ #
41
+ # @param data [Hash] Needs to include description and hostid to properly identify Triggers via Zabbix API
42
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
43
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
44
+ # @return [Integer] Zabbix object id
45
+ def safe_update(data)
46
+ log "[DEBUG] Call safe_update with parameters: #{data.inspect}"
47
+
48
+ dump = {}
49
+ item_id = data[key.to_sym].to_i
50
+ dump_by_id(key.to_sym => data[key.to_sym]).each do |item|
51
+ dump = symbolize_keys(item) if item[key].to_i == data[key.to_sym].to_i
52
+ end
53
+
54
+ expression = dump[:items][0][:key_] + '.' + dump[:functions][0][:function] + '(' + dump[:functions][0][:parameter] + ')'
55
+ dump[:expression] = dump[:expression].gsub(/\{(\d*)\}/, "{#{expression}}") # TODO: ugly regexp
56
+ dump.delete(:functions)
57
+ dump.delete(:items)
58
+
59
+ old_expression = data[:expression]
60
+ data[:expression] = data[:expression].gsub(/\{.*\:/, '{') # TODO: ugly regexp
61
+ data.delete(:templateid)
62
+
63
+ log "[DEBUG] expression: #{dump[:expression]}\n data: #{data[:expression]}"
64
+
65
+ if hash_equals?(dump, data)
66
+ log "[DEBUG] Equal keys #{dump} and #{data}, skip safe_update"
67
+ item_id
68
+ else
69
+ data[:expression] = old_expression
70
+ # disable old trigger
71
+ log '[DEBUG] disable :' + @client.api_request(method: "#{method_name}.update", params: [{ triggerid: data[:triggerid], status: '1' }]).inspect
72
+ # create new trigger
73
+ data.delete(:triggerid)
74
+ create(data)
75
+ end
76
+ end
77
+
78
+ # Get or Create Trigger object using Zabbix API
79
+ #
80
+ # @param data [Hash] Needs to include description and hostid to properly identify Triggers via Zabbix API
81
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
82
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
83
+ # @return [Integer] Zabbix object id
84
+ def get_or_create(data)
85
+ log "[DEBUG] Call get_or_create with parameters: #{data.inspect}"
86
+
87
+ unless (id = get_id(description: data[:description], hostid: data[:hostid]))
88
+ id = create(data)
89
+ end
90
+ id
91
+ end
92
+
93
+ # Create or update Trigger object using Zabbix API
94
+ #
95
+ # @param data [Hash] Needs to include description and hostid to properly identify Triggers via Zabbix API
96
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
97
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
98
+ # @return [Integer] Zabbix object id
99
+ def create_or_update(data)
100
+ triggerid = get_id(description: data[:description], hostid: data[:hostid])
101
+
102
+ triggerid ? update(data.merge(triggerid: triggerid)) : create(data)
103
+ end
104
+
105
+ # 测试数据
106
+ def mojo_data
107
+ data = {
108
+ comments: "MOJO1",
109
+ opdata: "MOJO_OPDATA",
110
+ priority: 1,
111
+ description: "MOJO1",
112
+ expression: "{SZX1-ISP-SW7:net.if.in[ifHCInOctets.1].avg(15m)}>=450000000 or {SZX1-ISP-SW7:net.if.out[ifHCOutOctets.1].avg(15m)}>=450000000",
113
+ recovery_expression: "{SZX1-ISP-SW7:net.if.in[ifHCInOctets.1].avg(15m)}<=350000000 or {SZX1-ISP-SW7:net.if.out[ifHCOutOctets.1].avg(15m)}<=350000000",
114
+ }
115
+
116
+ create_trigger data.stringify_keys!
117
+
118
+ end
119
+
120
+ # 设置触发器
121
+ def create_trigger(data = {})
122
+ data = data.with_indifferent_access
123
+ # 请求生成触发器
124
+ result = @client.api_request(
125
+ method: 'trigger.create',
126
+ params: {
127
+ comments: data["comments"],
128
+ priority: data["priority"],
129
+ description: data["description"],
130
+ expression: data["expression"],
131
+ recovery_expression: data["recovery_expression"],
132
+ opdata: data["opdata"],
133
+ recovery_mode: 1,
134
+ type: 0,
135
+ manual_close: 1,
136
+ }
137
+ )
138
+ # 检查是是否存在
139
+ result.empty? ? nil : result["triggerids"]
140
+ end
141
+
142
+ # 更新触发器
143
+ def update_trigger(triggerid, data = {})
144
+ data = data.with_indifferent_access
145
+ # 请求生成触发器
146
+ result = @client.api_request(
147
+ method: 'trigger.update',
148
+ params: {
149
+ triggerid: triggerid.to_i,
150
+ comments: data["comments"],
151
+ priority: data["priority"],
152
+ description: data["description"],
153
+ expression: data["expression"],
154
+ recovery_expression: data["recovery_expression"],
155
+ opdata: data["opdata"],
156
+ recovery_mode: 1,
157
+ type: 1,
158
+ manual_close: 1,
159
+ }
160
+ )
161
+ ap result
162
+ # 检查是是否存在
163
+ result.empty? ? nil : result["triggerids"]
164
+ end
165
+ end
166
+ end
@@ -0,0 +1,8 @@
1
+ class ZabbixManager
2
+ class Triggers < Basic
3
+ def create_or_update(data)
4
+ log "[DEBUG] Call create_or_update with parameters: #{data.inspect}"
5
+ get_or_create(data)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,73 @@
1
+ class ZabbixManager
2
+ class Usergroups < Basic
3
+ # The method name used for interacting with Usergroups via Zabbix API
4
+ #
5
+ # @return [String]
6
+ def method_name
7
+ 'usergroup'
8
+ end
9
+
10
+ # The key field name used for Usergroup objects via Zabbix API
11
+ #
12
+ # @return [String]
13
+ def key
14
+ 'usrgrpid'
15
+ end
16
+
17
+ # The id field name used for identifying specific Usergroup objects via Zabbix API
18
+ #
19
+ # @return [String]
20
+ def identify
21
+ 'name'
22
+ end
23
+
24
+ # Set permissions for usergroup using Zabbix API
25
+ #
26
+ # @param data [Hash] Needs to include usrgrpids and hostgroupids along with permissions to set
27
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
28
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
29
+ # @return [Integer] Zabbix object id (usergroup)
30
+ def permissions(data)
31
+ permission = data[:permission] || 2
32
+ result = @client.api_request(
33
+ method: 'usergroup.update',
34
+ params: {
35
+ usrgrpid: data[:usrgrpid],
36
+ rights: data[:hostgroupids].map { |t| { permission: permission, id: t } }
37
+ }
38
+ )
39
+ result ? result['usrgrpids'][0].to_i : nil
40
+ end
41
+
42
+ # Add users to usergroup using Zabbix API
43
+ #
44
+ # @deprecated Zabbix has removed massAdd in favor of update.
45
+ # @param data [Hash] Needs to include userids and usrgrpids to mass add users to groups
46
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
47
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
48
+ # @return [Integer] Zabbix object id (usergroup)
49
+ def add_user(data)
50
+ update_users(data)
51
+ end
52
+
53
+ # Update users in usergroups using Zabbix API
54
+ #
55
+ # @param data [Hash] Needs to include userids and usrgrpids to mass update users in groups
56
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
57
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
58
+ # @return [Integer] Zabbix object id (usergroup)
59
+ def update_users(data)
60
+ user_groups = data[:usrgrpids].map do |t|
61
+ {
62
+ usrgrpid: t,
63
+ userids: data[:userids],
64
+ }
65
+ end
66
+ result = @client.api_request(
67
+ method: 'usergroup.update',
68
+ params: user_groups,
69
+ )
70
+ result ? result['usrgrpids'][0].to_i : nil
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,228 @@
1
+ class ZabbixManager
2
+ class Usermacros < Basic
3
+ # The id field name used for identifying specific User macro objects via Zabbix API
4
+ #
5
+ # @return [String]
6
+ def identify
7
+ 'macro'
8
+ end
9
+
10
+ # The method name used for interacting with User macros via Zabbix API
11
+ #
12
+ # @return [String]
13
+ def method_name
14
+ 'usermacro'
15
+ end
16
+
17
+ # Get User macro object id from Zabbix API based on provided data
18
+ #
19
+ # @param data [Hash] Needs to include macro to properly identify user macros via Zabbix API
20
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call or missing object's id field name (identify).
21
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
22
+ # @return [Integer] Zabbix object id
23
+ def get_id(data)
24
+ log "[DEBUG] Call get_id with parameters: #{data.inspect}"
25
+
26
+ # symbolize keys if the user used string keys instead of symbols
27
+ data = symbolize_keys(data) if data.key?(identify)
28
+ # raise an error if identify name was not supplied
29
+ name = data[identify.to_sym]
30
+ raise ManagerError.new("#{identify} not supplied in call to get_id") if name.nil?
31
+
32
+ result = request(data, 'usermacro.get', 'hostmacroid')
33
+
34
+ !result.empty? && result[0].key?('hostmacroid') ? result[0]['hostmacroid'].to_i : nil
35
+ end
36
+
37
+ # Get Global macro object id from Zabbix API based on provided data
38
+ #
39
+ # @param data [Hash] Needs to include macro to properly identify global macros via Zabbix API
40
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call or missing object's id field name (identify).
41
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
42
+ # @return [Integer] Zabbix object id
43
+ def get_id_global(data)
44
+ log "[DEBUG] Call get_id_global with parameters: #{data.inspect}"
45
+
46
+ # symbolize keys if the user used string keys instead of symbols
47
+ data = symbolize_keys(data) if data.key?(identify)
48
+ # raise an error if identify name was not supplied
49
+ name = data[identify.to_sym]
50
+ raise ManagerError.new("#{identify} not supplied in call to get_id_global") if name.nil?
51
+
52
+ result = request(data, 'usermacro.get', 'globalmacroid')
53
+
54
+ !result.empty? && result[0].key?('globalmacroid') ? result[0]['globalmacroid'].to_i : nil
55
+ end
56
+
57
+ # Get full/extended User macro data from Zabbix API
58
+ #
59
+ # @param data [Hash] Should include object's id field name (identify) and id value
60
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
61
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
62
+ # @return [Hash]
63
+ def get_full_data(data)
64
+ log "[DEBUG] Call get_full_data with parameters: #{data.inspect}"
65
+
66
+ request(data, 'usermacro.get', 'hostmacroid')
67
+ end
68
+
69
+ # Get full/extended Global macro data from Zabbix API
70
+ #
71
+ # @param data [Hash] Should include object's id field name (identify) and id value
72
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
73
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
74
+ # @return [Hash]
75
+ def get_full_data_global(data)
76
+ log "[DEBUG] Call get_full_data_global with parameters: #{data.inspect}"
77
+
78
+ request(data, 'usermacro.get', 'globalmacroid')
79
+ end
80
+
81
+ # Create new User macro object using Zabbix API (with defaults)
82
+ #
83
+ # @param data [Hash] Needs to include hostid, macro, and value to create User macro via Zabbix API
84
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
85
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
86
+ # @return [Integer] The object id if a single object is created
87
+ # @return [Boolean] True/False if multiple objects are created
88
+ def create(data)
89
+ request(data, 'usermacro.create', 'hostmacroids')
90
+ end
91
+
92
+ # Create new Global macro object using Zabbix API (with defaults)
93
+ #
94
+ # @param data [Hash] Needs to include hostid, macro, and value to create Global macro via Zabbix API
95
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
96
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
97
+ # @return [Integer] The object id if a single object is created
98
+ # @return [Boolean] True/False if multiple objects are created
99
+ def create_global(data)
100
+ request(data, 'usermacro.createglobal', 'globalmacroids')
101
+ end
102
+
103
+ # Delete User macro object using Zabbix API
104
+ #
105
+ # @param data [Hash] Should include hostmacroid's of User macros to delete
106
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
107
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
108
+ # @return [Integer] The object id if a single object is deleted
109
+ # @return [Boolean] True/False if multiple objects are deleted
110
+ def delete(data)
111
+ data_delete = [data]
112
+ request(data_delete, 'usermacro.delete', 'hostmacroids')
113
+ end
114
+
115
+ # Delete Global macro object using Zabbix API
116
+ #
117
+ # @param data [Hash] Should include hostmacroid's of Global macros to delete
118
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
119
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
120
+ # @return [Integer] The object id if a single object is deleted
121
+ # @return [Boolean] True/False if multiple objects are deleted
122
+ def delete_global(data)
123
+ data_delete = [data]
124
+ request(data_delete, 'usermacro.deleteglobal', 'globalmacroids')
125
+ end
126
+
127
+ # Update User macro object using Zabbix API
128
+ #
129
+ # @param data [Hash] Should include object's id field name (identify), id value, and fields to update
130
+ # @param force [Boolean] Whether to force an object update even if provided data matches Zabbix
131
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
132
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
133
+ # @return [Integer] The object id if a single object is created
134
+ # @return [Boolean] True/False if multiple objects are created
135
+ def update(data)
136
+ request(data, 'usermacro.update', 'hostmacroids')
137
+ end
138
+
139
+ # Update Global macro object using Zabbix API
140
+ #
141
+ # @param data [Hash] Should include object's id field name (identify), id value, and fields to update
142
+ # @param force [Boolean] Whether to force an object update even if provided data matches Zabbix
143
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
144
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
145
+ # @return [Integer] The object id if a single object is created
146
+ # @return [Boolean] True/False if multiple objects are created
147
+ def update_global(data)
148
+ request(data, 'usermacro.updateglobal', 'globalmacroids')
149
+ end
150
+
151
+ # Get or Create User macro object using Zabbix API
152
+ #
153
+ # @param data [Hash] Needs to include macro and hostid to properly identify User macros via Zabbix API
154
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
155
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
156
+ # @return [Integer] Zabbix object id
157
+ def get_or_create(data)
158
+ log "[DEBUG] Call get_or_create with parameters: #{data.inspect}"
159
+
160
+ unless (id = get_id(macro: data[:macro], hostid: data[:hostid]))
161
+ id = create(data)
162
+ end
163
+ id
164
+ end
165
+
166
+ # Get or Create Global macro object using Zabbix API
167
+ #
168
+ # @param data [Hash] Needs to include macro and hostid to properly identify Global macros via Zabbix API
169
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
170
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
171
+ # @return [Integer] Zabbix object id
172
+ def get_or_create_global(data)
173
+ log "[DEBUG] Call get_or_create_global with parameters: #{data.inspect}"
174
+
175
+ unless (id = get_id_global(macro: data[:macro], hostid: data[:hostid]))
176
+ id = create_global(data)
177
+ end
178
+ id
179
+ end
180
+
181
+ # Create or update User macro object using Zabbix API
182
+ #
183
+ # @param data [Hash] Needs to include macro and hostid to properly identify User macros via Zabbix API
184
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
185
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
186
+ # @return [Integer] Zabbix object id
187
+ def create_or_update(data)
188
+ hostmacroid = get_id(macro: data[:macro], hostid: data[:hostid])
189
+ hostmacroid ? update(data.merge(hostmacroid: hostmacroid)) : create(data)
190
+ end
191
+
192
+ # Create or update Global macro object using Zabbix API
193
+ #
194
+ # @param data [Hash] Needs to include macro and hostid to properly identify Global macros via Zabbix API
195
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
196
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
197
+ # @return [Integer] Zabbix object id
198
+ def create_or_update_global(data)
199
+ globalmacroid = get_id_global(macro: data[:macro], hostid: data[:hostid])
200
+ globalmacroid ? update_global(data.merge(globalmacroid: globalmacroid)) : create_global(data)
201
+ end
202
+
203
+ private
204
+
205
+ # Custom request method to handle both User and Global macros in one
206
+ #
207
+ # @param data [Hash] Needs to include macro and hostid to properly identify Global macros via Zabbix API
208
+ # @param method [String] Zabbix API method to use for the request
209
+ # @param result_key [String] Which key to use for parsing results based on User vs Global macros
210
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
211
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
212
+ # @return [Integer] Zabbix object id
213
+ def request(data, method, result_key)
214
+ # Zabbix has different result formats for gets vs updates
215
+ if method.include?('.get')
216
+ if result_key.include?('global')
217
+ @client.api_request(method: method, params: { globalmacro: true, filter: data })
218
+ else
219
+ @client.api_request(method: method, params: { filter: data })
220
+ end
221
+ else
222
+ result = @client.api_request(method: method, params: data)
223
+
224
+ result.key?(result_key) && !result[result_key].empty? ? result[result_key][0].to_i : nil
225
+ end
226
+ end
227
+ end
228
+ end
@@ -0,0 +1,64 @@
1
+ class ZabbixManager
2
+ class Users < Basic
3
+ # The method name used for interacting with Users via Zabbix API
4
+ #
5
+ # @return [String]
6
+ def method_name
7
+ 'user'
8
+ end
9
+
10
+ # The keys field name used for User objects via Zabbix API
11
+ #
12
+ # @return [String]
13
+ def keys
14
+ 'userids'
15
+ end
16
+
17
+ # The key field name used for User objects via Zabbix API
18
+ #
19
+ # @return [String]
20
+ def key
21
+ 'userid'
22
+ end
23
+
24
+ # The id field name used for identifying specific User objects via Zabbix API
25
+ #
26
+ # @return [String]
27
+ def identify
28
+ 'alias'
29
+ end
30
+
31
+ def medias_helper(data, action)
32
+ result = @client.api_request(
33
+ method: "user.#{action}",
34
+ params: data[:userids].map do |t|
35
+ {
36
+ userid: t,
37
+ user_medias: data[:media],
38
+ }
39
+ end,
40
+ )
41
+ result ? result['userids'][0].to_i : nil
42
+ end
43
+
44
+ # Add media to users using Zabbix API
45
+ #
46
+ # @param data [Hash] Needs to include userids and media to mass add media to users
47
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
48
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
49
+ # @return [Integer] Zabbix object id (media)
50
+ def add_medias(data)
51
+ medias_helper(data, 'update')
52
+ end
53
+
54
+ # Update media for users using Zabbix API
55
+ #
56
+ # @param data [Hash] Needs to include userids and media to mass update media for users
57
+ # @raise [ManagerError] Error returned when there is a problem with the Zabbix API call.
58
+ # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK.
59
+ # @return [Integer] Zabbix object id (user)
60
+ def update_medias(data)
61
+ medias_helper(data, 'update')
62
+ end
63
+ end
64
+ end