icinga2 0.9.2.1 → 0.9.2.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +25 -22
  3. data/doc/Array.html +4 -6
  4. data/doc/Boolean.html +4 -6
  5. data/doc/FalseClass.html +4 -6
  6. data/doc/Hash.html +126 -8
  7. data/doc/Icinga2.html +7 -9
  8. data/doc/Logging.html +5 -7
  9. data/doc/Object.html +8 -10
  10. data/doc/Time.html +4 -6
  11. data/doc/TrueClass.html +4 -6
  12. data/doc/_index.html +20 -7
  13. data/doc/class_list.html +1 -1
  14. data/doc/file.README.html +32 -30
  15. data/doc/frames.html +1 -1
  16. data/doc/index.html +32 -30
  17. data/doc/method_list.html +34 -2
  18. data/doc/services.md +45 -62
  19. data/doc/top-level-namespace.html +4 -6
  20. data/examples/_blank.rb +2 -2
  21. data/examples/config.rb +23 -0
  22. data/examples/downtimes.rb +4 -33
  23. data/examples/hostgroups.rb +4 -33
  24. data/examples/hosts.rb +18 -33
  25. data/examples/informations.rb +4 -33
  26. data/examples/notifications.rb +4 -33
  27. data/examples/servicegroups.rb +4 -25
  28. data/examples/services.rb +46 -67
  29. data/examples/statistics.rb +4 -33
  30. data/examples/test.rb +7 -28
  31. data/examples/usergroups.rb +4 -33
  32. data/examples/users.rb +4 -33
  33. data/lib/icinga2/client.rb +16 -42
  34. data/lib/icinga2/converts.rb +16 -54
  35. data/lib/icinga2/downtimes.rb +46 -44
  36. data/lib/icinga2/hostgroups.rb +35 -35
  37. data/lib/icinga2/hosts.rb +235 -228
  38. data/lib/icinga2/network.rb +53 -125
  39. data/lib/icinga2/notifications.rb +37 -46
  40. data/lib/icinga2/servicegroups.rb +31 -41
  41. data/lib/icinga2/services.rb +211 -236
  42. data/lib/icinga2/tools.rb +10 -9
  43. data/lib/icinga2/usergroups.rb +22 -32
  44. data/lib/icinga2/users.rb +64 -59
  45. data/lib/icinga2/validator.rb +59 -0
  46. data/lib/icinga2/version.rb +1 -1
  47. metadata +78 -7
  48. data/lib/icinga2/network.rb-SAVE +0 -1004
@@ -9,11 +9,11 @@ module Icinga2
9
9
  # add a servicegroup
10
10
  #
11
11
  # @param [Hash] params
12
- # @option params [String] :service_group servicegroup to create
13
- # @option params [String] :display_name the displayed name
14
- # @option params [String] :notes
15
- # @option params [String] :notes_url
16
- # @option params [String] :action_url
12
+ # @option params [String] service_group servicegroup to create
13
+ # @option params [String] display_name the displayed name
14
+ # @option params [String] notes
15
+ # @option params [String] notes_url
16
+ # @option params [String] action_url
17
17
  #
18
18
  # @example
19
19
  # @icinga.add_servicegroup(service_group: 'foo', display_name: 'FOO')
@@ -25,33 +25,24 @@ module Icinga2
25
25
  raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
26
26
  raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
27
27
 
28
- service_group = params.dig(:service_group)
29
- display_name = params.dig(:display_name)
30
- notes = params.dig(:notes)
31
- notes_url = params.dig(:notes_url)
32
- action_url = params.dig(:action_url)
33
-
34
- # ignore = params.dig(:ignore)
35
- # assgin = params.dig(:assign)
36
-
37
- raise ArgumentError.new('Missing \'service_group\'') if( service_group.nil? )
38
- raise ArgumentError.new('Missing \'display_name\'') if( display_name.nil? )
28
+ service_group = validate( params, required: true, var: 'service_group', type: String )
29
+ display_name = validate( params, required: true, var: 'display_name', type: String )
30
+ notes = validate( params, required: false, var: 'notes', type: String )
31
+ notes_url = validate( params, required: false, var: 'notes_url', type: String )
32
+ action_url = validate( params, required: false, var: 'action_url', type: String )
39
33
 
40
34
  payload = {
41
- 'attrs' => {
42
- 'display_name' => display_name,
43
- 'notes' => notes,
44
- 'notes_url' => notes_url,
45
- 'action_url' => action_url
35
+ attrs: {
36
+ display_name: display_name,
37
+ notes: notes,
38
+ notes_url: notes_url,
39
+ action_url: action_url
46
40
  }
47
41
  }
48
42
 
49
- # payload['attrs']['assign'] ||= format('assgin where %s', assign) unless(assign.nil?)
50
- # payload['attrs']['ignore'] ||= format('ignore where %s', assign) unless(assign.nil?)
51
-
52
43
  # remove all empty attrs
53
44
  payload.reject!{ |_k, v| v.nil? }
54
- payload['attrs'].reject!{ |_k, v| v.nil? }
45
+ payload[:attrs].reject!{ |_k, v| v.nil? }
55
46
 
56
47
  put(
57
48
  url: format( '%s/objects/servicegroups/%s', @icinga_api_url_base, service_group ),
@@ -64,10 +55,11 @@ module Icinga2
64
55
  # delete a servicegroup
65
56
  #
66
57
  # @param [Hash] params
67
- # @option params [String] :service_group servicegroup to delete
58
+ # @option params [String] name servicegroup to delete
59
+ # @option params [Bool] cascade (false) delete servicegroup also when other objects depend on it
68
60
  #
69
61
  # @example
70
- # @icinga.delete_servicegroup(service_group: 'foo')
62
+ # @icinga.delete_servicegroup('foo')
71
63
  #
72
64
  # @return [Array] result
73
65
  #
@@ -76,12 +68,15 @@ module Icinga2
76
68
  raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
77
69
  raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
78
70
 
79
- service_group = params.dig(:service_group)
71
+ name = validate( params, required: true, var: 'name', type: String )
72
+ cascade = validate( params, required: false, var: 'cascade', type: Boolean ) || false
80
73
 
81
- raise ArgumentError.new('Missing \'service_group\'') if( service_group.nil? )
74
+ return { 'code' => 404, 'status' => 'Object not Found' } if( exists_servicegroup?( name ) == false )
75
+
76
+ url = format( '%s/objects/servicegroups/%s%s', @icinga_api_url_base, name, cascade.is_a?(TrueClass) ? '?cascade=1' : nil )
82
77
 
83
78
  delete(
84
- url: format( '%s/objects/servicegroups/%s?cascade=1', @icinga_api_url_base, service_group ),
79
+ url: url,
85
80
  headers: @headers,
86
81
  options: @options
87
82
  )
@@ -89,8 +84,7 @@ module Icinga2
89
84
 
90
85
  # returns all servicegroups
91
86
  #
92
- # @param [Hash] params
93
- # @option params [String] :service_group ('') optional for a single servicegroup
87
+ # @param [String] service_group (nil) optional for a single servicegroup
94
88
  #
95
89
  # @example to get all users
96
90
  # @icinga.servicegroups
@@ -100,16 +94,12 @@ module Icinga2
100
94
  #
101
95
  # @return [Array] returns a hash with all servicegroups
102
96
  #
103
- def servicegroups( params = {} )
97
+ def servicegroups( service_group = nil )
104
98
 
105
- service_group = params.dig(:service_group)
99
+ raise ArgumentError.new(format('wrong type. \'service_group\' must be an String, given \'%s\'', service_group.class.to_s)) unless( service_group.nil? || service_group.is_a?(String) )
106
100
 
107
- url =
108
- if( service_group.nil? )
109
- format( '%s/objects/servicegroups' , @icinga_api_url_base )
110
- else
111
- format( '%s/objects/servicegroups/%s', @icinga_api_url_base, service_group )
112
- end
101
+ url = format( '%s/objects/servicegroups' , @icinga_api_url_base )
102
+ url = format( '%s/objects/servicegroups/%s', @icinga_api_url_base, service_group ) unless( service_group.nil? )
113
103
 
114
104
  api_data(
115
105
  url: url,
@@ -132,7 +122,7 @@ module Icinga2
132
122
  raise ArgumentError.new(format('wrong type. \'service_group\' must be an String, given \'%s\'', service_group.class.to_s)) unless( service_group.is_a?(String) )
133
123
  raise ArgumentError.new('Missing \'service_group\'') if( service_group.size.zero? )
134
124
 
135
- result = servicegroups( service_group: service_group )
125
+ result = servicegroups(service_group)
136
126
  result = JSON.parse( result ) if result.is_a?( String )
137
127
  result = result.first if( result.is_a?(Array) )
138
128
 
@@ -8,10 +8,35 @@ module Icinga2
8
8
  # add service
9
9
  #
10
10
  # @param [Hash] params
11
- # @option params [String] :name
12
- # @option params [String] :host_name
13
- # @option params [Array] :templates
14
- # @option params [Hash] :vars
11
+ # @option params [String] name
12
+ # @option params [String] host_name
13
+ # @option params [String] display_name
14
+ # @option params [Array] templates
15
+ # @option params [Array] groups
16
+ # @option params [String] notes
17
+ # @option params [String] notes_url
18
+ # @option params [String] action_url
19
+ # @option params [String] check_command
20
+ # @option params [Integer] check_interval
21
+ # @option params [String] check_period
22
+ # @option params [Integer] check_timeout
23
+ # @option params [String] command_endpoint
24
+ # @option params [Boolean] enable_active_checks
25
+ # @option params [Boolean] enable_event_handler
26
+ # @option params [Boolean] enable_flapping
27
+ # @option params [Boolean] enable_notifications
28
+ # @option params [Boolean] enable_passive_checks
29
+ # @option params [Boolean] enable_perfdata
30
+ # @option params [String] event_command
31
+ # @option params [Integer] flapping_threshold_high
32
+ # @option params [Integer] flapping_threshold_low
33
+ # @option params [Integer] flapping_threshold
34
+ # @option params [String] icon_image_alt
35
+ # @option params [String] icon_image
36
+ # @option params [Integer] max_check_attempts
37
+ # @option params [Integer] retry_interval
38
+ # @option params [Boolean] volatile
39
+ # @option params [Hash] vars
15
40
  #
16
41
  # @example
17
42
  # @icinga.add_service(
@@ -31,122 +56,77 @@ module Icinga2
31
56
  # * status
32
57
  # * message
33
58
  #
34
- def add_service( params = {} )
59
+ def add_service( params )
35
60
 
36
61
  raise ArgumentError.new(format('wrong type. params must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
37
62
  raise ArgumentError.new('missing params') if( params.size.zero? )
38
63
 
39
- name = params.dig(:name)
40
- host_name = params.dig(:host_name)
41
- display_name = params.dig(:display_name)
42
- groups = params.dig(:groups)
43
- check_command = params.dig(:check_command)
44
- max_check_attempts = params.dig(:max_check_attempts)
45
- check_period = params.dig(:check_period)
46
- check_timeout = params.dig(:check_timeout)
47
- check_interval = params.dig(:check_interval)
48
- retry_interval = params.dig(:retry_interval)
49
- enable_notifications = params.dig(:enable_notifications)
50
- enable_active_checks = params.dig(:enable_active_checks)
51
- enable_passive_checks = params.dig(:enable_passive_checks)
52
- enable_event_handler = params.dig(:enable_event_handler)
53
- enable_flapping = params.dig(:enable_flapping)
54
- flapping_threshold = params.dig(:flapping_threshold)
55
- enable_perfdata = params.dig(:enable_perfdata)
56
- event_command = params.dig(:event_command)
57
- volatile = params.dig(:volatile)
58
- zone = params.dig(:zone)
59
- command_endpoint = params.dig(:command_endpoint)
60
- notes = params.dig(:notes)
61
- notes_url = params.dig(:notes_url)
62
- action_url = params.dig(:action_url)
63
- icon_image = params.dig(:icon_image)
64
- icon_image_alt = params.dig(:icon_image_alt)
65
- templates = params.dig(:templates) || ['generic-service']
66
- vars = params.dig(:vars) || {}
67
-
68
- raise ArgumentError.new('missing name') if( name.nil? )
69
-
70
- %w[display_name
71
- host_name
72
- check_command
73
- check_period
74
- event_command
75
- zone
76
- name
77
- command_endpoint
78
- notes
79
- notes_url
80
- action_url
81
- icon_image
82
- icon_image_alt
83
- ].each do |attr|
84
- v = eval(attr)
85
- raise ArgumentError.new(format('wrong type. \'%s\' must be an String, given \'%s\'', attr, v.class.to_s)) unless( v.is_a?(String) || v.nil? )
86
- end
87
-
88
- %w[max_check_attempts
89
- flapping_threshold
90
- check_timeout
91
- check_interval
92
- retry_interval].each do |attr|
93
- v = eval(attr)
94
- raise ArgumentError.new(format('wrong type. \'%s\' must be an Integer, given \'%s\'', attr, v.class.to_s)) unless( v.is_a?(Integer) || v.nil? )
95
- end
96
-
97
- %w[enable_notifications
98
- enable_active_checks
99
- enable_passive_checks
100
- enable_event_handler
101
- enable_flapping
102
- enable_perfdata
103
- volatile].each do |attr|
104
- v = eval(attr)
105
- raise ArgumentError.new(format('wrong type. \'%s\' must be True or False, given \'%s\'', attr, v.class.to_s)) unless( v.is_a?(TrueClass) || v.is_a?(FalseClass) || v.nil? )
106
- end
107
-
108
- %w[groups templates].each do |attr|
109
- v = eval(attr)
110
- raise ArgumentError.new(format('wrong type. \'%s\' must be an Array, given \'%s\'', attr, v.class.to_s)) unless( v.is_a?(Array) || v.nil? )
111
- end
112
-
113
- raise ArgumentError.new(format('wrong type. \'vars\' must be an Hash, given \'%s\'', v.class.to_s)) unless( vars.is_a?(Hash) )
64
+ name = validate( params, required: true, var: 'name', type: String )
65
+ host_name = validate( params, required: true, var: 'host_name', type: String )
66
+ display_name = validate( params, required: false, var: 'display_name', type: String )
67
+ groups = validate( params, required: false, var: 'groups', type: Array )
68
+ check_command = validate( params, required: false, var: 'check_command', type: String )
69
+ max_check_attempts = validate( params, required: false, var: 'max_check_attempts', type: Integer ) || 3
70
+ check_interval = validate( params, required: false, var: 'check_interval', type: Integer ) || 60
71
+ check_period = validate( params, required: false, var: 'check_period', type: Integer )
72
+ check_timeout = validate( params, required: false, var: 'check_timeout', type: Integer )
73
+ retry_interval = validate( params, required: false, var: 'retry_interval', type: Integer ) || 45
74
+ enable_active_checks = validate( params, required: false, var: 'enable_active_checks', type: Boolean )
75
+ enable_event_handler = validate( params, required: false, var: 'enable_event_handler', type: Boolean )
76
+ enable_flapping = validate( params, required: false, var: 'enable_flapping', type: Boolean )
77
+ enable_notifications = validate( params, required: false, var: 'enable_notifications', type: Boolean ) || false
78
+ enable_passive_checks = validate( params, required: false, var: 'enable_passive_checks', type: Boolean )
79
+ flapping_threshold = validate( params, required: false, var: 'flapping_threshold', type: Integer )
80
+ enable_perfdata = validate( params, required: false, var: 'enable_perfdata', type: Boolean )
81
+ event_command = validate( params, required: false, var: 'event_command', type: String )
82
+ volatile = validate( params, required: false, var: 'volatile', type: Boolean )
83
+ zone = validate( params, required: false, var: 'zone', type: String )
84
+ command_endpoint = validate( params, required: false, var: 'command_endpoint', type: String )
85
+ notes = validate( params, required: false, var: 'notes', type: String )
86
+ notes_url = validate( params, required: false, var: 'notes_url', type: String )
87
+ action_url = validate( params, required: false, var: 'action_url', type: String )
88
+ icon_image = validate( params, required: false, var: 'icon_image', type: String )
89
+ icon_image_alt = validate( params, required: false, var: 'icon_image_alt', type: String )
90
+ templates = validate( params, required: false, var: 'templates', type: Array ) || ['generic-service']
91
+ vars = validate( params, required: false, var: 'vars', type: Hash ) || {}
92
+
93
+ # check if host exists
94
+ return { 'code' => 404, 'name' => host_name, 'status' => 'Object not Found' } unless( exists_host?( host_name ) )
114
95
 
115
96
  payload = {
116
- 'templates' => templates,
117
- 'attrs' => {
118
- 'display_name' => display_name,
119
- 'groups' => groups,
120
- 'check_command' => check_command,
121
- 'max_check_attempts' => max_check_attempts,
122
- 'check_period' => check_period,
123
- 'check_timeout' => check_timeout,
124
- 'check_interval' => check_interval,
125
- 'retry_interval' => retry_interval,
126
- 'enable_notifications' => enable_notifications,
127
- 'enable_active_checks' => enable_active_checks,
128
- 'enable_passive_checks' => enable_passive_checks,
129
- 'enable_event_handler' => enable_event_handler,
130
- 'enable_flapping' => enable_flapping,
131
- 'flapping_threshold' => flapping_threshold,
132
- 'zone' => zone,
133
- 'enable_perfdata' => enable_perfdata,
134
- 'event_command' => event_command,
135
- 'volatile' => volatile,
136
- 'command_endpoint' => command_endpoint,
137
- 'notes' => notes,
138
- 'notes_url' => notes_url,
139
- 'action_url' => action_url,
140
- 'icon_image' => icon_image,
141
- 'icon_image_alt' => icon_image_alt,
97
+ templates: templates,
98
+ attrs: {
99
+ display_name: display_name,
100
+ groups: groups,
101
+ check_command: check_command,
102
+ max_check_attempts: max_check_attempts,
103
+ check_period: check_period,
104
+ check_timeout: check_timeout,
105
+ check_interval: check_interval,
106
+ retry_interval: retry_interval,
107
+ enable_notifications: enable_notifications,
108
+ enable_active_checks: enable_active_checks,
109
+ enable_passive_checks: enable_passive_checks,
110
+ enable_event_handler: enable_event_handler,
111
+ enable_flapping: enable_flapping,
112
+ flapping_threshold: flapping_threshold,
113
+ zone: zone,
114
+ enable_perfdata: enable_perfdata,
115
+ event_command: event_command,
116
+ volatile: volatile,
117
+ command_endpoint: command_endpoint,
118
+ notes: notes,
119
+ notes_url: notes_url,
120
+ action_url: action_url,
121
+ icon_image: icon_image,
122
+ icon_image_alt: icon_image_alt,
123
+ vars: vars
142
124
  }
143
125
  }
144
126
 
145
- payload['attrs']['vars'] = vars unless vars.empty?
146
-
147
127
  # clear undefined settings
148
128
  payload.reject!{ |_k, v| v.nil? }
149
- payload['attrs'].reject!{ |_k, v| v.nil? }
129
+ payload[:attrs].reject!{ |_k, v| v.nil? }
150
130
 
151
131
  put(
152
132
  url: format( '%s/objects/services/%s!%s', @icinga_api_url_base, host_name, name ),
@@ -159,9 +139,9 @@ module Icinga2
159
139
  # delete a service
160
140
  #
161
141
  # @param [Hash] params
162
- # @option params [String] :host_name host name for the service
163
- # @option params [String] :name
164
- # @option params [Bool] :cascade (false) delete service also when other objects depend on it
142
+ # @option params [String] name service name
143
+ # @option params [String] host_name host name for the service
144
+ # @option params [Bool] cascade (false) delete service also when other objects depend on it
165
145
  #
166
146
  # @example
167
147
  # @icinga.delete_service(host_name: 'foo', name: 'http2')
@@ -174,16 +154,9 @@ module Icinga2
174
154
  raise ArgumentError.new('only Hash are allowed') unless( params.is_a?(Hash) )
175
155
  raise ArgumentError.new('missing params') if( params.size.zero? )
176
156
 
177
- host_name = params.dig(:host_name)
178
- name = params.dig(:name)
179
- cascade = params.dig(:cascade)
180
-
181
- raise ArgumentError.new('Missing host') if( host_name.nil? )
182
- raise ArgumentError.new('Missing service name') if( name.nil? )
183
-
184
- if( ! cascade.nil? && ( ! cascade.is_a?(TrueClass) && ! cascade.is_a?(FalseClass) ) )
185
- raise ArgumentError.new('cascade can only be true or false')
186
- end
157
+ name = validate( params, required: true, var: 'name', type: String )
158
+ host_name = validate( params, required: true, var: 'host_name', type: String )
159
+ cascade = validate( params, required: false, var: 'cascade', type: Boolean ) || false
187
160
 
188
161
  url = format( '%s/objects/services/%s!%s%s', @icinga_api_url_base, host_name, name, cascade.is_a?(TrueClass) ? '?cascade=1' : nil )
189
162
 
@@ -198,22 +171,18 @@ module Icinga2
198
171
  # modify an service
199
172
  #
200
173
  # @param [Hash] params
201
- # @option params [String] :name
202
- # @option params [Array] :templates
203
- # @option params [Hash] :vars
174
+ # @option params [String] name
175
+ # @option params [Array] templates
176
+ # @option params [Hash] vars
204
177
  #
205
178
  # @example
206
179
  # @icinga.modify_service(
207
180
  # name: 'http2',
181
+ # check_interval: 60,
182
+ # retry_interval: 10,
208
183
  # vars: {
209
- # attrs: {
210
- # check_interval: 60,
211
- # retry_interval: 10,
212
- # vars: {
213
- # http_url: '/access/login' ,
214
- # http_address: '10.41.80.63'
215
- # }
216
- # }
184
+ # http_url: '/access/login' ,
185
+ # http_address: '10.41.80.63'
217
186
  # }
218
187
  # )
219
188
  #
@@ -223,29 +192,77 @@ module Icinga2
223
192
  #
224
193
  def modify_service( params )
225
194
 
226
- raise ArgumentError.new('only Hash are allowed') unless( params.is_a?(Hash) )
227
- raise ArgumentError.new('missing params') if( params.size.zero? )
228
-
229
- templates = params.dig(:templates) || ['generic-service']
230
- vars = params.dig(:vars)
231
- name = params.dig(:name)
232
-
233
- raise ArgumentError.new('Missing service name') if( name.nil? )
234
- raise ArgumentError.new('only Array for templates are allowed') unless( templates.is_a?(Array) )
235
- raise ArgumentError.new('Missing vars') if( vars.nil? )
236
- raise ArgumentError.new('only Hash for vars are allowed') unless( vars.is_a?(Hash) )
195
+ raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
196
+ raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
197
+
198
+ name = validate( params, required: true, var: 'name', type: String )
199
+ display_name = validate( params, required: false, var: 'display_name', type: String )
200
+ groups = validate( params, required: false, var: 'groups', type: Array )
201
+ check_command = validate( params, required: false, var: 'check_command', type: String )
202
+ max_check_attempts = validate( params, required: false, var: 'max_check_attempts', type: Integer ) || 3
203
+ check_interval = validate( params, required: false, var: 'check_interval', type: Integer ) || 60
204
+ check_period = validate( params, required: false, var: 'check_period', type: Integer )
205
+ check_timeout = validate( params, required: false, var: 'check_timeout', type: Integer )
206
+ retry_interval = validate( params, required: false, var: 'retry_interval', type: Integer ) || 45
207
+ enable_active_checks = validate( params, required: false, var: 'enable_active_checks', type: Boolean )
208
+ enable_event_handler = validate( params, required: false, var: 'enable_event_handler', type: Boolean )
209
+ enable_flapping = validate( params, required: false, var: 'enable_flapping', type: Boolean )
210
+ enable_notifications = validate( params, required: false, var: 'enable_notifications', type: Boolean ) || false
211
+ enable_passive_checks = validate( params, required: false, var: 'enable_passive_checks', type: Boolean )
212
+ flapping_threshold = validate( params, required: false, var: 'flapping_threshold', type: Integer )
213
+ enable_perfdata = validate( params, required: false, var: 'enable_perfdata', type: Boolean )
214
+ event_command = validate( params, required: false, var: 'event_command', type: String )
215
+ volatile = validate( params, required: false, var: 'volatile', type: Boolean )
216
+ zone = validate( params, required: false, var: 'zone', type: String )
217
+ command_endpoint = validate( params, required: false, var: 'command_endpoint', type: String )
218
+ notes = validate( params, required: false, var: 'notes', type: String )
219
+ notes_url = validate( params, required: false, var: 'notes_url', type: String )
220
+ action_url = validate( params, required: false, var: 'action_url', type: String )
221
+ icon_image = validate( params, required: false, var: 'icon_image', type: String )
222
+ icon_image_alt = validate( params, required: false, var: 'icon_image_alt', type: String )
223
+ templates = validate( params, required: false, var: 'templates', type: Array ) || ['generic-service']
224
+ vars = validate( params, required: false, var: 'vars', type: Hash ) || {}
225
+
226
+ # check if service exists
227
+ # return { 'code' => 404, 'name' => name, 'status' => 'Object not Found' } unless( exists_service?( host_name: host_name, service_name: name ) )
228
+ # # check if host exists
229
+ # return { 'code' => 404, 'name' => host_name, 'status' => 'Object not Found' } unless( exists_host?( host_name ) )
237
230
 
238
- payload = {}
239
-
240
- vars.each_value do |v|
241
-
242
- payload = {
243
- 'templates' => templates,
244
- 'attrs' => v
231
+ payload = {
232
+ templates: templates,
233
+ filter: format( 'service.name == "%s"', name ),
234
+ attrs: {
235
+ display_name: display_name,
236
+ groups: groups,
237
+ check_command: check_command,
238
+ max_check_attempts: max_check_attempts,
239
+ check_period: check_period,
240
+ check_timeout: check_timeout,
241
+ check_interval: check_interval,
242
+ retry_interval: retry_interval,
243
+ enable_notifications: enable_notifications,
244
+ enable_active_checks: enable_active_checks,
245
+ enable_passive_checks: enable_passive_checks,
246
+ enable_event_handler: enable_event_handler,
247
+ enable_flapping: enable_flapping,
248
+ flapping_threshold: flapping_threshold,
249
+ zone: zone,
250
+ enable_perfdata: enable_perfdata,
251
+ event_command: event_command,
252
+ volatile: volatile,
253
+ command_endpoint: command_endpoint,
254
+ notes: notes,
255
+ notes_url: notes_url,
256
+ action_url: action_url,
257
+ icon_image: icon_image,
258
+ icon_image_alt: icon_image_alt,
259
+ vars: vars
245
260
  }
246
- end
261
+ }
247
262
 
248
- payload['filter'] = format( 'service.name=="%s"', name )
263
+ # clear undefined settings
264
+ payload.reject!{ |_k, v| v.nil? }
265
+ payload[:attrs].reject!{ |_k, v| v.nil? }
249
266
 
250
267
  post(
251
268
  url: format( '%s/objects/services', @icinga_api_url_base ),
@@ -264,13 +281,17 @@ module Icinga2
264
281
  #
265
282
  def unhandled_services
266
283
 
267
- payload = {}
268
-
269
284
  filter = 'service.state != ServiceOK && service.downtime_depth == 0.0 && service.acknowledgement == 0.0'
270
285
  attrs = %w[__name name state acknowledgement downtime_depth last_check]
271
286
 
272
- payload['attrs'] = attrs unless attrs.nil?
273
- payload['filter'] = filter unless filter.nil?
287
+ payload = {
288
+ attrs: attrs,
289
+ filter: filter
290
+ }
291
+
292
+ # remove all empty attrs
293
+ payload.reject!{ |_k, v| v.nil? }
294
+ payload[:attrs].reject!{ |_k, v| v.nil? }
274
295
 
275
296
  api_data(
276
297
  url: format( '%s/objects/services', @icinga_api_url_base ),
@@ -283,8 +304,8 @@ module Icinga2
283
304
  # return services
284
305
  #
285
306
  # @param [Hash] params
286
- # @option params [String] :host_name
287
- # @option params [String] :name
307
+ # @option params [String] host_name
308
+ # @option params [String] name
288
309
  #
289
310
  # @example to get all services
290
311
  # @icinga.services
@@ -296,17 +317,13 @@ module Icinga2
296
317
  #
297
318
  def services( params = {} )
298
319
 
299
- raise ArgumentError.new('only Hash are allowed') unless( params.is_a?(Hash) )
320
+ raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
300
321
 
301
- host_name = params.dig(:host_name)
302
- name = params.dig(:name)
322
+ host_name = validate( params, required: false, var: 'host_name', type: String )
323
+ name = validate( params, required: false, var: 'name', type: String )
303
324
 
304
- url =
305
- if( name.nil? )
306
- format( '%s/objects/services/%s', @icinga_api_url_base, host_name )
307
- else
308
- format( '%s/objects/services/%s!%s', @icinga_api_url_base, host_name, name )
309
- end
325
+ url = format( '%s/objects/services/%s', @icinga_api_url_base, host_name )
326
+ url = format( '%s/objects/services/%s!%s', @icinga_api_url_base, host_name, name ) unless( name.nil? )
310
327
 
311
328
  api_data(
312
329
  url: url,
@@ -318,8 +335,8 @@ module Icinga2
318
335
  # returns true if the service exists
319
336
  #
320
337
  # @param [Hash] params
321
- # @option params [String] :host_name
322
- # @option params [String] :name
338
+ # @option params [String] host_name
339
+ # @option params [String] name
323
340
  #
324
341
  # @example
325
342
  # @icinga.exists_service?(host_name: 'icinga2', name: 'users')
@@ -328,16 +345,13 @@ module Icinga2
328
345
  #
329
346
  def exists_service?( params )
330
347
 
331
- raise ArgumentError.new('only Hash are allowed') unless( params.is_a?(Hash) )
348
+ raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
332
349
  raise ArgumentError.new('missing params') if( params.size.zero? )
333
350
 
334
- host = params.dig(:host_name)
335
- service = params.dig(:name)
351
+ host_name = validate( params, required: true, var: 'host_name', type: String )
352
+ name = validate( params, required: true, var: 'name', type: String )
336
353
 
337
- raise ArgumentError.new('Missing host') if( host.nil? )
338
- raise ArgumentError.new('Missing service') if( service.nil? )
339
-
340
- result = services( host_name: host, name: service )
354
+ result = services( host_name: host_name, name: name )
341
355
  result = JSON.parse( result ) if result.is_a?( String )
342
356
  result = result.first if( result.is_a?(Array) )
343
357
 
@@ -349,9 +363,9 @@ module Icinga2
349
363
  # returns service objects
350
364
  #
351
365
  # @param [Hash] params
352
- # @option params [Array] :attrs (['name', 'state', 'acknowledgement', 'downtime_depth', 'last_check'])
353
- # @option params [Array] :filter ([])
354
- # @option params [Array] :joins (['host.name','host.state','host.acknowledgement','host.downtime_depth','host.last_check'])
366
+ # @option params [Array] attrs (['name', 'state', 'acknowledgement', 'downtime_depth', 'last_check'])
367
+ # @option params [String] filter ([])
368
+ # @option params [Array] joins (['host.name','host.state','host.acknowledgement','host.downtime_depth','host.last_check'])
355
369
  #
356
370
  # @example with default attrs and joins
357
371
  # @icinga.service_objects
@@ -363,22 +377,17 @@ module Icinga2
363
377
  #
364
378
  def service_objects( params = {} )
365
379
 
366
- attrs = params.dig(:attrs)
367
- filter = params.dig(:filter)
368
- joins = params.dig(:joins)
369
- payload = {}
370
-
371
- if( attrs.nil? )
372
- attrs = %w[name state acknowledgement downtime_depth last_check]
373
- end
380
+ attrs = validate( params, required: false, var: 'attrs', type: Array ) || %w[name state acknowledgement downtime_depth last_check]
381
+ filter = validate( params, required: false, var: 'filter', type: String )
382
+ joins = validate( params, required: false, var: 'joins', type: Array ) || ['host.name', 'host.state', 'host.acknowledgement', 'host.downtime_depth', 'host.last_check']
374
383
 
375
- if( joins.nil? )
376
- joins = ['host.name', 'host.state', 'host.acknowledgement', 'host.downtime_depth', 'host.last_check']
377
- end
384
+ payload = {
385
+ attrs: attrs,
386
+ filter: filter,
387
+ joins: joins
388
+ }
378
389
 
379
- payload['attrs'] = attrs unless attrs.nil?
380
- payload['filter'] = filter unless filter.nil?
381
- payload['joins'] = joins unless joins.nil?
390
+ payload.reject!{ |_k, v| v.nil? }
382
391
 
383
392
  data = api_data(
384
393
  url: format( '%s/objects/services', @icinga_api_url_base ),
@@ -478,6 +487,8 @@ module Icinga2
478
487
  #
479
488
  def list_services_with_problems( max_items = 5 )
480
489
 
490
+ raise ArgumentError.new(format('wrong type. \'max_items\' must be an Integer, given \'%s\'', max_items.class.to_s)) unless( max_items.is_a?(Integer) )
491
+
481
492
  services_with_problems = {}
482
493
  services_with_problems_and_severity = {}
483
494
 
@@ -486,11 +497,10 @@ module Icinga2
486
497
  services_data = JSON.parse( services_data ) if services_data.is_a?(String)
487
498
 
488
499
  unless( services_data.nil? )
489
-
490
500
  services_data.each do |s|
491
-
492
501
  name = s.dig('name')
493
502
  state = s.dig('attrs','state')
503
+
494
504
  next if state.zero?
495
505
 
496
506
  services_with_problems[name] = service_severity(s)
@@ -613,8 +623,6 @@ module Icinga2
613
623
  critical: problems_critical.to_i,
614
624
  unknown: problems_unknown.to_i
615
625
  }
616
-
617
- # [problems_all,problems_critical,problems_warning,problems_unknown]
618
626
  end
619
627
 
620
628
  protected
@@ -638,16 +646,14 @@ module Icinga2
638
646
  #
639
647
  def service_severity( params )
640
648
 
641
- raise ArgumentError.new('only Hash are allowed') unless( params.is_a?(Hash) )
649
+ raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
642
650
  raise ArgumentError.new('missing params') if( params.size.zero? )
643
651
 
644
- state = params.dig('attrs','state')
645
- acknowledgement = params.dig('attrs','acknowledgement') || 0
646
- downtime_depth = params.dig('attrs','downtime_depth') || 0
652
+ attrs = params.dig('attrs')
647
653
 
648
- raise ArgumentError.new('only Float for state are allowed') unless( state.is_a?(Float) )
649
- raise ArgumentError.new('only Float for acknowledgement are allowed') unless( acknowledgement.is_a?(Float) )
650
- raise ArgumentError.new('only Float for downtime_depth are allowed') unless( downtime_depth.is_a?(Float) )
654
+ state = validate( attrs, required: true, var: 'state', type: Float )
655
+ acknowledgement = validate( attrs, required: false, var: 'acknowledgement', type: Float ) || 0
656
+ downtime_depth = validate( attrs, required: false, var: 'downtime_depth', type: Float ) || 0
651
657
 
652
658
  severity = 0
653
659
 
@@ -663,7 +669,6 @@ module Icinga2
663
669
  severity += 16 if object_has_been_checked?(params)
664
670
 
665
671
  unless state.zero?
666
-
667
672
  severity +=
668
673
  if state == 1
669
674
  32
@@ -698,35 +703,5 @@ module Icinga2
698
703
  severity
699
704
  end
700
705
 
701
- private
702
- # update host
703
- #
704
- # @param [Hash] hash
705
- # @param [String] host
706
- #
707
- # @api protected
708
- #
709
- # @return [Hash]
710
- #
711
- def update_host( hash, host )
712
-
713
- hash.each do |k, v|
714
-
715
- if( k == 'host' && v.is_a?( String ) )
716
- v.replace( host )
717
-
718
- elsif( v.is_a?( Hash ) )
719
-
720
- update_host( v, host )
721
-
722
- elsif( v.is_a?(Array) )
723
-
724
- v.flatten.each { |x| update_host( x, host ) if x.is_a?( Hash ) }
725
- end
726
- end
727
-
728
- hash
729
- end
730
-
731
706
  end
732
707
  end