icinga2 0.9.2.1 → 0.9.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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