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,40 +9,11 @@
9
9
  # -----------------------------------------------------------------------------
10
10
 
11
11
  require_relative '../lib/icinga2'
12
+ require_relative 'config'
12
13
 
13
14
  # -----------------------------------------------------------------------------
14
15
 
15
- icinga_host = ENV.fetch( 'ICINGA_HOST' , 'icinga2' )
16
- icinga_api_port = ENV.fetch( 'ICINGA_API_PORT' , 5665 )
17
- icinga_api_user = ENV.fetch( 'ICINGA_API_USER' , 'admin' )
18
- icinga_api_pass = ENV.fetch( 'ICINGA_API_PASSWORD' , nil )
19
- icinga_api_pki_path = ENV.fetch( 'ICINGA_API_PKI_PATH' , '/etc/icinga2' )
20
- icinga_api_node_name = ENV.fetch( 'ICINGA_API_NODE_NAME' , nil )
21
- icinga_cluster = ENV.fetch( 'ICINGA_CLUSTER' , false )
22
- icinga_satellite = ENV.fetch( 'ICINGA_CLUSTER_SATELLITE', nil )
23
-
24
-
25
- # convert string to bool
26
- icinga_cluster = icinga_cluster.to_s.eql?('true') ? true : false
27
-
28
- config = {
29
- icinga: {
30
- host: icinga_host,
31
- api: {
32
- port: icinga_api_port,
33
- user: icinga_api_user,
34
- password: icinga_api_pass,
35
- pki_path: icinga_api_pki_path,
36
- node_name: icinga_api_node_name
37
- },
38
- cluster: icinga_cluster,
39
- satellite: icinga_satellite
40
- }
41
- }
42
-
43
- # ---------------------------------------------------------------------------------------
44
-
45
- i = Icinga2::Client.new( config )
16
+ i = Icinga2::Client.new( @config )
46
17
 
47
18
  unless( i.nil? )
48
19
 
@@ -87,8 +58,8 @@ unless( i.nil? )
87
58
  puts ''
88
59
 
89
60
  rescue => e
90
- $stderr.puts( e )
91
- $stderr.puts( e.backtrace.join("\n") )
61
+ warn( e )
62
+ warn( e.backtrace.join("\n") )
92
63
  end
93
64
  end
94
65
 
@@ -1,5 +1,6 @@
1
1
 
2
2
  require_relative 'version'
3
+ require_relative 'validator'
3
4
  require_relative 'network'
4
5
  require_relative 'statistics'
5
6
  require_relative 'converts'
@@ -45,6 +46,7 @@ module Icinga2
45
46
 
46
47
  include Logging
47
48
 
49
+ include Icinga2::Validator
48
50
  include Icinga2::Network
49
51
  include Icinga2::Statistics
50
52
  include Icinga2::Converts
@@ -61,48 +63,39 @@ module Icinga2
61
63
  # Returns a new instance of Client
62
64
  #
63
65
  # @param [Hash, #read] settings the settings for Icinga2
64
- # @option settings [String] :host ('localhost') the Icinga2 Hostname
66
+ # @option settings [String] :host the Icinga2 Hostname
65
67
  # @option settings [Integer] :port (5665) the Icinga2 API Port
66
- # @option settings [String] :user the Icinga2 API User
68
+ # @option settings [String] :username the Icinga2 API User
67
69
  # @option settings [String] :password the Icinga2 API Password
68
70
  # @option settings [Integer] :version (1) the Icinga2 API Version
69
- # @option settings [Bool] :cluster Icinga2 Cluster Mode
70
- # @option settings [Bool] :notifications (false) enable Icinga2 Host Notifications
71
71
  #
72
72
  # @example to create an new Instance
73
73
  # config = {
74
74
  # icinga: {
75
75
  # host: '192.168.33.5',
76
76
  # api: {
77
- # port: 5665,
78
- # user: 'root',
77
+ # username: 'root',
79
78
  # password: 'icinga',
80
79
  # version: 1
81
- # },
82
- # cluster: false,
83
- # satellite: true
80
+ # }
84
81
  # }
85
82
  # }
86
- #
87
83
  # @icinga = Icinga2::Client.new(config)
88
84
  #
89
85
  # @return [instance, #read]
90
86
  #
91
87
  def initialize( settings )
92
88
 
93
- raise ArgumentError.new('only Hash are allowed') unless( settings.is_a?(Hash) )
89
+ raise ArgumentError.new(format('wrong type. \'settings\' must be an Hash, given \'%s\'', settings.class.to_s)) unless( settings.is_a?(Hash) )
94
90
  raise ArgumentError.new('missing settings') if( settings.size.zero? )
95
91
 
96
- icinga_host = settings.dig(:icinga, :host) || 'localhost'
92
+ icinga_host = settings.dig(:icinga, :host)
97
93
  icinga_api_port = settings.dig(:icinga, :api, :port) || 5665
98
- icinga_api_user = settings.dig(:icinga, :api, :user)
94
+ icinga_api_user = settings.dig(:icinga, :api, :username)
99
95
  icinga_api_pass = settings.dig(:icinga, :api, :password)
100
96
  icinga_api_version = settings.dig(:icinga, :api, :version) || 1
101
97
  icinga_api_pki_path = settings.dig(:icinga, :api, :pki_path)
102
98
  icinga_api_node_name = settings.dig(:icinga, :api, :node_name)
103
- @icinga_cluster = settings.dig(:icinga, :cluster) || false
104
- @icinga_satellite = settings.dig(:icinga, :satellite)
105
- @icinga_notifications = settings.dig(:icinga, :notifications) || false
106
99
 
107
100
  @last_call_timeout = 320
108
101
  @last_cib_data_called = 0
@@ -116,13 +109,11 @@ module Icinga2
116
109
  _has_cert, @options = cert?(
117
110
  pki_path: icinga_api_pki_path,
118
111
  node_name: icinga_api_node_name,
119
- user: icinga_api_user,
112
+ username: icinga_api_user,
120
113
  password: icinga_api_pass
121
114
  )
122
115
 
123
116
  @headers = { 'Content-Type' => 'application/json', 'Accept' => 'application/json' }
124
-
125
- self
126
117
  end
127
118
 
128
119
  # create a HTTP Header based on a Icinga2 Certificate or an User API Login
@@ -137,9 +128,9 @@ module Icinga2
137
128
  # @icinga.cert?(pki_path: '/etc/icinga2', node_name: 'icinga2-dashing')
138
129
  #
139
130
  # @example with User
140
- # @icinga.cert?(user: 'root', password: 'icinga')
131
+ # @icinga.cert?(username: 'root', password: 'icinga')
141
132
  #
142
- # @return [Bool, #read]
133
+ # @return [Array]
143
134
  #
144
135
  def cert?( params )
145
136
 
@@ -148,7 +139,7 @@ module Icinga2
148
139
 
149
140
  pki_path = params.dig(:pki_path)
150
141
  node_name = params.dig(:node_name)
151
- user = params.dig(:user)
142
+ username = params.dig(:username)
152
143
  password = params.dig(:password)
153
144
 
154
145
  if( node_name.nil? )
@@ -156,7 +147,6 @@ module Icinga2
156
147
  node_name = Socket.gethostbyname(Socket.gethostname).first
157
148
  logger.debug(format('node name: %s', node_name))
158
149
  rescue SocketError => e
159
-
160
150
  raise format("can't resolve hostname (%s)", e)
161
151
  end
162
152
  end
@@ -184,19 +174,17 @@ module Icinga2
184
174
  } ]
185
175
 
186
176
  else
187
-
188
177
  logger.debug( 'PKI not found, using basic auth for connection to Icinga 2 API' )
189
178
 
190
- raise ArgumentError.new('Missing user_name') if( user.nil? )
191
- raise ArgumentError.new('Missing password') if( password.nil? )
179
+ raise ArgumentError.new('Missing \'username\'') if( username.nil? )
180
+ raise ArgumentError.new('Missing \'password\'') if( password.nil? )
192
181
 
193
182
  [false, {
194
- user: user,
183
+ user: username,
195
184
  password: password,
196
185
  verify_ssl: OpenSSL::SSL::VERIFY_NONE
197
186
  } ]
198
187
  end
199
-
200
188
  end
201
189
 
202
190
  # return Icinga2 Application data
@@ -214,28 +202,14 @@ module Icinga2
214
202
  options: @options
215
203
  )
216
204
 
217
- #puts '---'
218
- #puts data
219
- #puts data.class.to_s
220
- #puts '---'
221
-
222
205
  return nil if( data.nil? )
223
- # return data if( data.is_a?(Hash) && data.dig('code').to_i != 200 )
224
- #puts '.'
225
206
 
226
207
  app_data = data.dig('icingaapplication','app')
227
208
 
228
- #puts '---'
229
- #puts app_data
230
- #puts app_data.class.to_s
231
- #puts '---'
232
-
233
209
  # version and revision
234
210
  @version, @revision = parse_version(app_data.dig('version'))
235
-
236
211
  # - node_name
237
212
  @node_name = app_data.dig('node_name')
238
-
239
213
  # - start_time
240
214
  @start_time = Time.at(app_data.dig('program_start').to_f)
241
215
 
@@ -8,6 +8,12 @@ module Icinga2
8
8
  #
9
9
  module Converts
10
10
 
11
+ HOST_STATE_STRING = %w[Up Down].freeze
12
+ SERVICE_STATE_STRING = %w[OK Warning Critical Unknown].freeze
13
+
14
+ HOST_STATE_COLOR = %w[green red].freeze
15
+ SERVICE_STATE_COLOR = %w[green yellow red purple].freeze
16
+
11
17
  # convert a Icinga2 state into a human readable state
12
18
  #
13
19
  # @param [String] state the Icinga2 State
@@ -15,33 +21,11 @@ module Icinga2
15
21
  #
16
22
  # @return [String]
17
23
  #
18
- def self.state_to_string( state, is_host = false )
19
-
20
- state =
21
- if( is_host == true )
22
- case state
23
- when 0
24
- 'Up'
25
- when 1
26
- 'Down'
27
- else
28
- 'Undefined'
29
- end
30
- else
31
- case state
32
- when 0
33
- 'OK'
34
- when 1
35
- 'Warning'
36
- when 2
37
- 'Critical'
38
- when 3
39
- 'Unknown'
40
- else
41
- 'Undefined'
42
- end
43
- end
44
- state
24
+ def state_to_string( state, is_host = false )
25
+ result = SERVICE_STATE_STRING[state] unless( is_host )
26
+ result = HOST_STATE_STRING[state] if( is_host )
27
+ result = 'Undefined' if( result.nil? )
28
+ result
45
29
  end
46
30
 
47
31
  # convert a Icinga2 state into a named color
@@ -51,33 +35,11 @@ module Icinga2
51
35
  #
52
36
  # @return [String]
53
37
  #
54
- def self.state_to_color( state, is_host = false )
55
-
56
- state =
57
- if( is_host == true )
58
- case state
59
- when 0
60
- 'green'
61
- when 1
62
- 'red'
63
- else
64
- 'blue'
65
- end
66
- else
67
- case state
68
- when 0
69
- 'green'
70
- when 1
71
- 'yellow'
72
- when 2
73
- 'red'
74
- when 3
75
- 'purple'
76
- else
77
- 'blue'
78
- end
79
- end
80
- state
38
+ def state_to_color( state, is_host = false )
39
+ result = SERVICE_STATE_COLOR[state] unless( is_host )
40
+ result = HOST_STATE_COLOR[state] if( is_host )
41
+ result = 'blue' if( result.nil? )
42
+ result
81
43
  end
82
44
 
83
45
  # reformat a service check name
@@ -4,19 +4,28 @@
4
4
  module Icinga2
5
5
 
6
6
  # namespace for downtimes handling
7
+ #
8
+ # Schedule a downtime for hosts and services.
9
+ #
7
10
  module Downtimes
8
11
 
9
12
  # add downtime
10
13
  #
11
14
  # @param [Hash] params
12
- # @option params [String] :name
13
- # @option params [String] :host_name
14
- # @option params [String] :host_group
15
- # @option params [Integer] :start_time (Time.new.to_i)
16
- # @option params [Integer] :end_time
17
- # @option params [String] :author
18
- # @option params [String] :comment
19
- # @option params [String] :type 'host' or 'service' downtime
15
+ # @option params [String] host_name
16
+ # @option params [String] host_group
17
+ # @option params [String] type 'host' or 'service' downtime
18
+ # @option params [Integer] start_time (Time.new.to_i) Timestamp marking the beginning of the downtime. (required)
19
+ # @option params [Integer] end_time Timestamp marking the end of the downtime. (required)
20
+ # @option params [String] author Name of the author. (required)
21
+ # @option params [String] comment Comment text. (required)
22
+ # @option params [String] config_owner
23
+ # @option params [Integer] duration Duration of the downtime in seconds if fixed is set to false. (Required for flexible downtimes.)
24
+ # @option params [Integer] entry_time
25
+ # @option params [Boolean] fixed (true) Defaults to true. If true, the downtime is fixed otherwise flexible. See downtimes for more information.
26
+ # @option params [String] scheduled_by
27
+ # @option params [String] service_name
28
+ # @option params [String] triggered_by Sets the trigger for a triggered downtime. See downtimes for more information on triggered downtimes.
20
29
  #
21
30
  # @example
22
31
  # param = {
@@ -37,60 +46,53 @@ module Icinga2
37
46
  raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
38
47
  raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
39
48
 
40
- name = params.dig(:name)
41
- host_name = params.dig(:host_name)
42
- host_group = params.dig(:host_group)
43
- start_time = params.dig(:start_time) || Time.now.to_i
44
- end_time = params.dig(:end_time)
45
- author = params.dig(:author)
46
- comment = params.dig(:comment)
47
- type = params.dig(:type)
48
- fixed = params.dig(:fixed) || true
49
- duration = params.dig(:duration) || 30
50
- entry_time = params.dig(:entry_time)
51
- scheduled_by = params.dig(:scheduled_by)
52
- service_name = params.dig(:service_name)
53
- triggered_by = params.dig(:triggered_by)
54
- config_owner = params.dig(:config_owner)
49
+ host_name = validate( params, required: false, var: 'host_name', type: String )
50
+ host_group = validate( params, required: false, var: 'host_group', type: String )
51
+ start_time = validate( params, required: false, var: 'start_time', type: Integer ) || Time.now.to_i
52
+ end_time = validate( params, required: false, var: 'end_time', type: Integer )
53
+ author = validate( params, required: true, var: 'author', type: String )
54
+ comment = validate( params, required: true, var: 'comment', type: String )
55
+ type = validate( params, required: false, var: 'type', type: String )
56
+ fixed = validate( params, required: false, var: 'fixed', type: Boolean ) || true
57
+ duration_required = true if( fixed == false )
58
+ duration = validate( params, required: duration_required, var: 'duration', type: Integer )
59
+ entry_time = validate( params, required: false, var: 'entry_time', type: Integer )
60
+ scheduled_by = validate( params, required: false, var: 'scheduled_by', type: String )
61
+ service_name = validate( params, required: false, var: 'service_name', type: String )
62
+ triggered_by = validate( params, required: false, var: 'triggered_by', type: String )
63
+ config_owner = validate( params, required: false, var: 'config_owner', type: String )
55
64
  filter = nil
56
65
 
57
66
  # sanitychecks
58
67
  #
59
- raise ArgumentError.new('Missing name') if( name.nil? )
60
- raise ArgumentError.new("wrong downtype type. only 'host' or' service' allowed ('#{type}' giving)") if( %w[host service].include?(type.downcase) == false )
61
- raise ArgumentError.new('choose host or host_group, not both') if( !host_group.nil? && !host_name.nil? )
62
- raise ArgumentError.new('Missing downtime author') if( author.nil? )
63
- raise ArgumentError.new("these author are not exists: #{author}") unless( exists_user?( author ) )
64
- raise ArgumentError.new('Missing downtime comment') if( comment.nil? )
65
- raise ArgumentError.new('Missing downtime end_time') if( end_time.nil? )
66
- raise ArgumentError.new('end_time are equal or smaller then start_time') if( end_time.to_i <= start_time )
67
-
68
- raise ArgumentError.new(format('wrong type. \'duration\' must be Integer, given \'%s\'', duration.class.to_s)) unless( duration.is_a?(Integer) )
69
- raise ArgumentError.new(format('wrong type. \'fixed\' must be True or False, given \'%s\'', fixed.class.to_s)) unless( fixed.is_a?(TrueClass) || fixed.is_a?(FalseClass) )
68
+ raise ArgumentError.new(format('wrong downtype type. only \'host\' os \'service\' allowed, given \%s\'', type)) if( %w[host service].include?(type.downcase) == false )
69
+ raise ArgumentError.new('choose \'host_name\' or \'host_group\', not both') unless( host_group.nil? || host_name.nil? )
70
+ raise ArgumentError.new(format('these \'author\' are not exists: \'%s\'', author)) unless( exists_user?( author ) )
71
+ raise ArgumentError.new('Missing downtime \'end_time\'') if( end_time.nil? )
72
+ raise ArgumentError.new('\'end_time\' are equal or smaller then \'start_time\'') if( end_time.to_i <= start_time )
70
73
 
71
74
  # TODO
72
- # check if host_name exists!
75
+ # - more flexibility (e.g. support scheduled_by ...)
73
76
 
77
+ unless( host_name.nil? )
78
+ return { 'code' => 404, 'name' => host_name, 'status' => 'Object not Found' } unless( exists_host?( host_name ) )
79
+ filter = format( 'host.name == "%s"', host_name )
80
+ end
74
81
 
75
- if( !host_name.nil? )
76
-
77
- filter = format( 'host.name=="%s"', host_name )
78
- elsif( !host_group.nil? )
79
-
80
- # check if hostgroup available ?
81
- #
82
+ unless( host_group.nil? )
83
+ return { 'code' => 404, 'name' => host_group, 'status' => 'Object not Found' } unless( exists_hostgroup?( host_group ) )
82
84
  filter = format( '"%s" in host.groups', host_group )
83
85
  end
84
86
 
85
87
  payload = {
86
88
  type: type.capitalize, # we need the first char as Uppercase
89
+ filter: filter,
90
+ fixed: fixed,
87
91
  start_time: start_time,
88
92
  end_time: end_time,
89
93
  author: author,
90
94
  comment: comment,
91
- fixed: fixed,
92
95
  duration: duration,
93
- filter: filter,
94
96
  entry_time: entry_time,
95
97
  scheduled_by: scheduled_by,
96
98
  host_name: host_name,
@@ -9,11 +9,12 @@ module Icinga2
9
9
  # add a hostgroup
10
10
  #
11
11
  # @param [Hash] params
12
- # @option params [String] :host_group hostgroup 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] host_group hostgroup 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
+ # @option params [Hash] vars ({})
17
18
  #
18
19
  # @example
19
20
  # @icinga.add_hostgroup(host_group: 'foo', display_name: 'FOO')
@@ -25,27 +26,26 @@ module Icinga2
25
26
  raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
26
27
  raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
27
28
 
28
- host_group = params.dig(:host_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
- raise ArgumentError.new('Missing \'host_group\'') if( host_group.nil? )
35
- raise ArgumentError.new('Missing \'display_name\'') if( display_name.nil? )
29
+ host_group = validate( params, required: true, var: 'host_group', type: String )
30
+ display_name = validate( params, required: false, var: 'display_name', type: String )
31
+ notes = validate( params, required: false, var: 'notes', type: String )
32
+ notes_url = validate( params, required: false, var: 'notes_url', type: String )
33
+ action_url = validate( params, required: false, var: 'action_url', type: String )
34
+ vars = validate( params, required: false, var: 'vars', type: Hash ) || {}
36
35
 
37
36
  payload = {
38
- 'attrs' => {
39
- 'display_name' => display_name,
40
- 'notes' => notes,
41
- 'notes_url' => notes_url,
42
- 'action_url' => action_url
37
+ attrs: {
38
+ display_name: display_name,
39
+ notes: notes,
40
+ notes_url: notes_url,
41
+ action_url: action_url,
42
+ vars: vars
43
43
  }
44
44
  }
45
45
 
46
46
  # remove all empty attrs
47
47
  payload.reject!{ |_k, v| v.nil? }
48
- payload['attrs'].reject!{ |_k, v| v.nil? }
48
+ payload[:attrs].reject!{ |_k, v| v.nil? }
49
49
 
50
50
  put(
51
51
  url: format('%s/objects/hostgroups/%s', @icinga_api_url_base, host_group),
@@ -58,10 +58,12 @@ module Icinga2
58
58
  # delete a hostgroup
59
59
  #
60
60
  # @param [Hash] params
61
- # @option params [String] :name hostgroup to delete
61
+ # @option params [String] name hostgroup to delete
62
+ # @option params [Bool] cascade (false) delete hostgroup also when other objects depend on it
62
63
  #
63
64
  # @example
64
- # @icinga.delete_hostgroup(host_group: 'foo')
65
+ # @icinga.delete_hostgroup(name: 'foo')
66
+ # @icinga.delete_hostgroup(name: 'foo', cascade: true)
65
67
  #
66
68
  # @return [Hash] result
67
69
  #
@@ -70,12 +72,15 @@ module Icinga2
70
72
  raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
71
73
  raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
72
74
 
73
- host_group = params.dig(:host_group)
75
+ name = validate( params, required: true, var: 'name', type: String )
76
+ cascade = validate( params, required: false, var: 'cascade', type: Boolean ) || false
77
+
78
+ return { 'code' => 404, 'status' => 'Object not Found' } if( exists_hostgroup?( name ) == false )
74
79
 
75
- raise ArgumentError.new('Missing \'host_group\'') if( host_group.nil? )
80
+ url = format( '%s/objects/hostgroups/%s%s', @icinga_api_url_base, name, cascade.is_a?(TrueClass) ? '?cascade=1' : nil )
76
81
 
77
82
  delete(
78
- url: format('%s/objects/hostgroups/%s?cascade=1', @icinga_api_url_base, host_group),
83
+ url: url,
79
84
  headers: @headers,
80
85
  options: @options
81
86
  )
@@ -83,8 +88,7 @@ module Icinga2
83
88
 
84
89
  # returns all usersgroups
85
90
  #
86
- # @param [Hash] params
87
- # @option params [String] :host_group ('') optional for a single hostgroup
91
+ # @param [String] host_group (nil) optional for a single hostgroup
88
92
  #
89
93
  # @example to get all users
90
94
  # @icinga.hostgroups
@@ -94,16 +98,12 @@ module Icinga2
94
98
  #
95
99
  # @return [Hash] returns a hash with all hostgroups
96
100
  #
97
- def hostgroups( params = {} )
101
+ def hostgroups( host_group = nil )
98
102
 
99
- host_group = params.dig(:host_group)
103
+ raise ArgumentError.new(format('wrong type. \'host_group\' must be an String, given \'%s\'', host_group.class.to_s)) unless( host_group.nil? || host_group.is_a?(String) )
100
104
 
101
- url =
102
- if( host_group.nil? )
103
- format( '%s/objects/hostgroups' , @icinga_api_url_base )
104
- else
105
- format( '%s/objects/hostgroups/%s', @icinga_api_url_base, host_group )
106
- end
105
+ url = format( '%s/objects/hostgroups' , @icinga_api_url_base )
106
+ url = format( '%s/objects/hostgroups/%s', @icinga_api_url_base, host_group ) unless( host_group.nil? )
107
107
 
108
108
  api_data(
109
109
  url: url,
@@ -126,7 +126,7 @@ module Icinga2
126
126
  raise ArgumentError.new(format('wrong type. \'host_group\' must be an String, given \'%s\'', host_group.class.to_s)) unless( host_group.is_a?(String) )
127
127
  raise ArgumentError.new('Missing \'host_group\'') if( host_group.size.zero? )
128
128
 
129
- result = hostgroups(host_group: host_group)
129
+ result = hostgroups(host_group)
130
130
  result = JSON.parse( result ) if( result.is_a?(String) )
131
131
  result = result.first if( result.is_a?(Array) )
132
132