icinga2 0.9.2.8 → 1.0.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7f33482da16075121f4e961b687fdb49458a197c
4
- data.tar.gz: f3aba7b6edf26ae6bfe5b014a265e6a3a0ed4a59
3
+ metadata.gz: 9a7a28e46c91e531a8442586d4f1a920ad2e01c2
4
+ data.tar.gz: 949ef6c923a5f5efe3a4dde2b983a5877f5e3e17
5
5
  SHA512:
6
- metadata.gz: f5d780e4b7d7bb08dd97f87a75a4c0148a3e70b1439151bee9d18abe86503045455e9630d0caee5f5bef4680afb8c4a8b38dfe682960dfa1440066b66b4e46cc
7
- data.tar.gz: 86dfdbd9573c2a55da7a57f0d1e2c2b1e13b43b5c0a63f8f7f11e32baeaaff826eaefffd40f482912fc99b4a52e1a5ee605d5e8b0a8aedffecfa05851ae6726f
6
+ metadata.gz: 8fbf96dde58391e3a0cba5d6fc497359fe52835919043f170df30c55ed9adf9e2d34a218076e36755da54271845807736fd861174833e48bd8c784ae6179fe5f
7
+ data.tar.gz: f8310775e88be3c876024b5510d1f0e26a85147f9dab5ac8994cb73fe4edc0d71692b2f4a6b3ec5a63d7c0c3cc9e8d8319b5f1842c63c3914c46e5b316ea5a30
data/README.md CHANGED
@@ -144,6 +144,7 @@ supports the following API Calls:
144
144
 
145
145
  - [Downtimes](doc/downtimes.md)
146
146
  * [add downtime](doc/downtimes.md#add-downtime)
147
+ * [remove downtime](doc/downtimes.md#remove-downtime)
147
148
  * [list downtimes](doc/downtimes.md#list-downtimes)
148
149
 
149
150
  - [Notifications](doc/notifications.md)
@@ -165,12 +166,3 @@ supports the following API Calls:
165
166
  * [statistic data for hosts](doc/statistics.md#stats-hosts)
166
167
  * [queue statistics from the api](doc/statistics.md#stats-work-queue)
167
168
 
168
-
169
-
170
- ## Contributing
171
-
172
- 1. Fork it
173
- 2. Create your feature branch (`git checkout -b my-new-feature`)
174
- 3. Commit your changes (`git commit -am 'Add some feature'`)
175
- 4. Push to the branch (`git push origin my-new-feature`)
176
- 5. Create new Pull Request
@@ -18,6 +18,45 @@
18
18
  @icinga.add_downtime( param )
19
19
 
20
20
 
21
+ ## <a name="remove-downtime"></a>remove a downtime
22
+ remove_downtime( params )
23
+
24
+ ### Example
25
+
26
+ remove all downtimes from the user `icingaadmin` and the comment `test downtime`
27
+
28
+ ```bash
29
+ param = {
30
+ comment: 'test downtime',
31
+ author: 'icingaadmin'
32
+ }
33
+ @icinga.remove_downtime(param)
34
+ ```
35
+
36
+ remove a downtime from a host but not the services filtered by the author name.
37
+ This example uses filter variables explained in the
38
+ [advanced filters](https://github.com/Icinga/icinga2/blob/master/doc/12-icinga2-api.md#icinga2-api-advanced-filters)
39
+ chapter from the official API documentation.
40
+
41
+ ```bash
42
+ param = {
43
+ filter: '"host.name == filterHost && !service && downtime.author == filterAuthor"',
44
+ filter_vars: { filterHost: 'c1-mysql-1', filterAuthor: 'icingaadmin' }
45
+ )
46
+ @icinga.remove_downtime(param)
47
+ ```
48
+
49
+ remove a downtime for service `ping4` and host `c1-mysql-1`
50
+
51
+ ```bash
52
+ param = {
53
+ host_name: 'c1-mysql-1',
54
+ service_name: 'ping4'
55
+ }
56
+ @icinga.remove_downtime(param)
57
+ ```
58
+
59
+
21
60
  ## <a name="list-downtimes"></a>list all downtimes
22
61
  downtimes
23
62
 
@@ -0,0 +1,152 @@
1
+
2
+ # frozen_string_literal: false
3
+
4
+ module Icinga2
5
+
6
+ # namespace for action handling
7
+ #
8
+ # There are several actions available for Icinga 2 provided by the /v1/actions URL endpoint.
9
+ #
10
+ #
11
+ # original API Documentation: https://www.icinga.com/docs/icinga2/latest/doc/12-icinga2-api/#actions
12
+ #
13
+ module Actions
14
+
15
+ # Process a check result for a host or a service.
16
+ #
17
+ # FUNCTION IS NOT IMPLEMENTED YET
18
+ #
19
+ # original Documentation: https://www.icinga.com/docs/icinga2/latest/doc/12-icinga2-api/#process-check-result
20
+ #
21
+ # @param [Hash] params
22
+ # @option params [Integer] exit_status For services: 0=OK, 1=WARNING, 2=CRITICAL, 3=UNKNOWN, for hosts: 0=OK, 1=CRITICAL.
23
+ # @option params [String] plugin_output One or more lines of the plugin main output. Does not contain the performance data.
24
+ # @option params [Array] performance_data The performance data.
25
+ # @option params [Array] check_command The first entry should be the check commands path, then one entry for each command line option followed by an entry for each of its argument.
26
+ # @option params [String] check_source Usually the name of the command_endpoint
27
+ # @option params [Integer] execution_start The timestamp where a script/process started its execution.
28
+ # @option params [Integer] execution_end The timestamp where a script/process ended its execution. This timestamp is used in features to determine e.g. the metric timestamp.
29
+ # @option params [String] host_name
30
+ # @option params [String] service_name
31
+ # @option params [String] type
32
+ # @option params [String] filter
33
+ #
34
+ # @example
35
+ # params = {
36
+ # host_name: 'example.localdomain',
37
+ # service_name: 'passive-ping6',
38
+ # exit_status: 2,
39
+ # plugin_output: 'PING CRITICAL - Packet loss = 100%',
40
+ # performance_data: [
41
+ # 'rta=5000.000000ms;3000.000000;5000.000000;0.000000',
42
+ # 'pl=100%;80;100;0'
43
+ # ],
44
+ # check_source: 'example.localdomain'
45
+ # }
46
+ # process_check_result(params)
47
+ #
48
+ # params = {
49
+ # exit_status: 1,
50
+ # plugin_output: 'Host is not available.',
51
+ # type: 'Host',
52
+ # filter: 'host.name == "example.localdomain"'
53
+ # }
54
+ # process_check_result(params)
55
+ #
56
+ # @return [Hash] result
57
+ #
58
+ # def process_check_result(params)
59
+ #
60
+ # raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
61
+ # raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
62
+ #
63
+ # # exit_status = validate( params, required: true, var: 'exit_status', type: Integer )
64
+ # # plugin_output = validate( params, required: true, var: 'plugin_output', type: String )
65
+ # # performance_data = validate( params, required: false, var: 'performance_data', type: Array )
66
+ # # check_command = validate( params, required: false, var: 'check_command', type: Array )
67
+ # # check_source = validate( params, required: false, var: 'check_source', type: String )
68
+ # # execution_start = validate( params, required: false, var: 'execution_start', type: Integer )
69
+ # # execution_end = validate( params, required: false, var: 'execution_end', type: String )
70
+ #
71
+ # end
72
+
73
+ #
74
+ # original Documentation: https://www.icinga.com/docs/icinga2/latest/doc/12-icinga2-api/#reschedule-check
75
+ # def reschedule_check(params)
76
+ #
77
+ # # $ curl -k -s -u root:icinga -H 'Accept: application/json' -X POST 'https://localhost:5665/v1/actions/reschedule-check' \
78
+ # # -d '{ "type": "Service", "filter": "service.name==\"ping6\"" }' | python -m json.tool
79
+ # end
80
+
81
+ #
82
+ # original Documentation: https://www.icinga.com/docs/icinga2/latest/doc/12-icinga2-api/#send-custom-notification
83
+ # def send_custom_notification
84
+ # end
85
+
86
+ #
87
+ # original Documentation: https://www.icinga.com/docs/icinga2/latest/doc/12-icinga2-api/#delay-notification
88
+ # def delay_notification
89
+ # end
90
+
91
+ #
92
+ # original Documentation: https://www.icinga.com/docs/icinga2/latest/doc/12-icinga2-api/#acknowledge-problem
93
+ # def acknowledge_problem
94
+ # end
95
+
96
+ #
97
+ # original Documentation: https://www.icinga.com/docs/icinga2/latest/doc/12-icinga2-api/#remove-acknowledgement
98
+ # def remove_acknowledgement
99
+ # end
100
+
101
+ #
102
+ # original Documentation: https://www.icinga.com/docs/icinga2/latest/doc/12-icinga2-api/#add-comment
103
+ # def add_comment
104
+ # end
105
+
106
+ #
107
+ # original Documentation: https://www.icinga.com/docs/icinga2/latest/doc/12-icinga2-api/#remove-comment
108
+ # def remove_comment
109
+ # end
110
+
111
+ #
112
+ # original Documentation: https://www.icinga.com/docs/icinga2/latest/doc/12-icinga2-api/#schedule-downtime
113
+ # def schedule_downtime
114
+ # end
115
+
116
+ # Shuts down Icinga2.
117
+ #
118
+ # @example
119
+ # shutdown_process
120
+ #
121
+ # @return [Hash]
122
+ #
123
+ def shutdown_process
124
+ post(
125
+ url: format('%s/actions/shutdown-process', @icinga_api_url_base),
126
+ headers: @headers,
127
+ options: @options
128
+ )
129
+ end
130
+
131
+ # Restarts Icinga2.
132
+ #
133
+ # @example
134
+ # restart_process
135
+ #
136
+ # @return [Hash]
137
+ #
138
+ def restart_process
139
+ post(
140
+ url: format('%s/actions/restart-process', @icinga_api_url_base),
141
+ headers: @headers,
142
+ options: @options
143
+ )
144
+ end
145
+
146
+ #
147
+ # original Documentation: https://www.icinga.com/docs/icinga2/latest/doc/12-icinga2-api/#generate-ticket
148
+ # def generate_ticket
149
+ # end
150
+
151
+ end
152
+ end
@@ -13,6 +13,8 @@ require_relative 'services'
13
13
  require_relative 'servicegroups'
14
14
  require_relative 'users'
15
15
  require_relative 'usergroups'
16
+ require_relative 'configuration_management'
17
+ require_relative 'actions'
16
18
 
17
19
  # -------------------------------------------------------------------------------------------------------------------
18
20
  #
@@ -59,15 +61,19 @@ module Icinga2
59
61
  include Icinga2::Servicegroups
60
62
  include Icinga2::Users
61
63
  include Icinga2::Usergroups
64
+ include Icinga2::ConfigurationManagement
65
+ include Icinga2::Actions
62
66
 
63
67
  # Returns a new instance of Client
64
68
  #
65
69
  # @param [Hash, #read] settings the settings for Icinga2
66
- # @option settings [String] :host the Icinga2 Hostname
67
- # @option settings [Integer] :port (5665) the Icinga2 API Port
68
- # @option settings [String] :username the Icinga2 API User
69
- # @option settings [String] :password the Icinga2 API Password
70
- # @option settings [Integer] :version (1) the Icinga2 API Version
70
+ # @option settings [String] host the Icinga2 Hostname
71
+ # @option settings [Integer] port (5665) the Icinga2 API Port
72
+ # @option settings [String] username the Icinga2 API User
73
+ # @option settings [String] password the Icinga2 API Password
74
+ # @option settings [Integer] version (1) the Icinga2 API Version
75
+ # @option settings [String] pki_path the location of the Certificate Files
76
+ # @option settings [String] node_name overwrite the Icnag2 hostname for the PKI. if the node_name no set, we try to resolve with gethostbyname()
71
77
  #
72
78
  # @example to create an new Instance
73
79
  # config = {
@@ -119,16 +125,16 @@ module Icinga2
119
125
  # create a HTTP Header based on a Icinga2 Certificate or an User API Login
120
126
  #
121
127
  # @param [Hash, #read] params
122
- # @option params [String] :pki_path the location of the Certificate Files
123
- # @option params [String] :node_name the Icinga2 Hostname
124
- # @option params [String] :user the Icinga2 API User
125
- # @option params [String] :password the Icinga2 API Password
128
+ # @option params [String] pki_path the location of the Certificate Files
129
+ # @option params [String] node_name the Icinga2 Hostname
130
+ # @option params [String] user the Icinga2 API User
131
+ # @option params [String] password the Icinga2 API Password
126
132
  #
127
133
  # @example with Certificate
128
- # @icinga.cert?(pki_path: '/etc/icinga2', node_name: 'icinga2-dashing')
134
+ # cert?(pki_path: '/etc/icinga2', node_name: 'icinga2-dashing')
129
135
  #
130
136
  # @example with User
131
- # @icinga.cert?(username: 'root', password: 'icinga')
137
+ # cert?(username: 'root', password: 'icinga')
132
138
  #
133
139
  # @return [Array]
134
140
  #
@@ -190,7 +196,7 @@ module Icinga2
190
196
  # return Icinga2 Application data
191
197
  #
192
198
  # @example
193
- # @icinga.application_data
199
+ # application_data
194
200
  #
195
201
  # @return [Hash]
196
202
  #
@@ -203,6 +209,7 @@ module Icinga2
203
209
  )
204
210
 
205
211
  return nil if( data.nil? )
212
+ return nil unless(data.is_a?(Hash))
206
213
 
207
214
  app_data = data.dig('icingaapplication','app')
208
215
 
@@ -219,7 +226,7 @@ module Icinga2
219
226
  # return Icinga2 CIB
220
227
  #
221
228
  # @example
222
- # @icinga.cib_data
229
+ # cib_data
223
230
  #
224
231
  # @return [Hash]
225
232
  #
@@ -278,7 +285,7 @@ module Icinga2
278
285
  # return Icinga2 Status Data
279
286
  #
280
287
  # @example
281
- # @icinga.status_data
288
+ # status_data
282
289
  #
283
290
  # @return [Hash]
284
291
  #
@@ -296,7 +303,7 @@ module Icinga2
296
303
  # return Icinga2 API Listener
297
304
  #
298
305
  # @example
299
- # @icinga.api_listener
306
+ # api_listener
300
307
  #
301
308
  # @return [Hash]
302
309
  #
@@ -314,7 +321,7 @@ module Icinga2
314
321
  # check the availability of a Icinga network connect
315
322
  #
316
323
  # @example
317
- # @icinga.available?
324
+ # available?
318
325
  #
319
326
  # @return [Bool]
320
327
  #
@@ -330,9 +337,9 @@ module Icinga2
330
337
  # return Icinga2 version and revision
331
338
  #
332
339
  # @example
333
- # @icinga.version.values
340
+ # version.values
334
341
  #
335
- # v = @icinga.version
342
+ # v = version
336
343
  # version = v.dig(:version)
337
344
  #
338
345
  # @return [Hash]
@@ -355,7 +362,7 @@ module Icinga2
355
362
  # return Icinga2 node_name
356
363
  #
357
364
  # @example
358
- # @icinga.node_name
365
+ # node_name
359
366
  #
360
367
  # @return [String]
361
368
  #
@@ -371,7 +378,7 @@ module Icinga2
371
378
  # return Icinga2 start time
372
379
  #
373
380
  # @example
374
- # @icinga.start_time
381
+ # start_time
375
382
  #
376
383
  # @return [String]
377
384
  #
@@ -387,8 +394,8 @@ module Icinga2
387
394
  # return Icinga2 uptime
388
395
  #
389
396
  # @example
390
- # @icinga.cib_data
391
- # @icinga.uptime
397
+ # cib_data
398
+ # uptime
392
399
  #
393
400
  # @return [String]
394
401
  #
@@ -0,0 +1,312 @@
1
+
2
+ # frozen_string_literal: true
3
+
4
+ module Icinga2
5
+
6
+ # namespace for config packages
7
+ #
8
+ # The main idea behind configuration management is to allow external applications creating configuration packages and stages based on configuration files and directory trees.
9
+ #
10
+ # This replaces any additional SSH connection and whatnot to dump configuration files to Icinga 2 directly.
11
+ #
12
+ # In case you are pushing a new configuration stage to a package, Icinga 2 will validate the configuration asynchronously and populate a status log which can be fetched in a separated request.
13
+ #
14
+ # original API Documentation: https://www.icinga.com/docs/icinga2/latest/doc/12-icinga2-api/#configuration-management
15
+ #
16
+ module ConfigurationManagement
17
+
18
+ # create a new empty configuration package.
19
+ #
20
+ # Package names starting with an underscore are reserved for internal packages and can not be used.
21
+ #
22
+ # @param [String] name the name for the new package.
23
+ #
24
+ # @example
25
+ # create_config_package('cfg-package')
26
+ #
27
+ # @return [Hash]
28
+ #
29
+ def create_config_package(name)
30
+
31
+ raise ArgumentError.new(format('wrong type. \'name\' must be an String, given \'%s\'', name.class.to_s)) unless( name.is_a?(String) )
32
+ raise ArgumentError.new('missing \'name\'') if( name.size.zero? )
33
+
34
+ return { 'code' => 404, 'name' => name, 'status' => 'Package names starting with an underscore are reserved for internal packages and can not be used.' } if( name.initial == '_' )
35
+
36
+ post(
37
+ url: format( '%s/config/packages/%s', @icinga_api_url_base, name ),
38
+ headers: @headers,
39
+ options: @options
40
+ )
41
+ end
42
+
43
+ # Configuration files in packages are managed in stages.
44
+ # Stages provide a way to maintain multiple configuration versions for a package.
45
+ #
46
+ # @param [Hash] params
47
+ # @option params [String] package name of the package
48
+ # @option params [String] name name for the package
49
+ # @option params [Bool] cluser (false) package for an satellite
50
+ # @option params [Bool] reload (true) reload icinga2 after upload
51
+ # @option params [String] vars
52
+ #
53
+ # @example
54
+ # params = {
55
+ # package: 'cfg-package',
56
+ # name: 'host1',
57
+ # cluster: false,
58
+ # vars: 'object Host "cmdb-host" { chec_command = "dummy" }',
59
+ # reload: false
60
+ # }
61
+ # upload_config_package(params)
62
+ #
63
+ # @return [Hash]
64
+ #
65
+ def upload_config_package(params)
66
+
67
+ raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
68
+ raise ArgumentError.new('missing params') if( params.size.zero? )
69
+
70
+ package = validate( params, required: true, var: 'package', type: String )
71
+ name = validate( params, required: true, var: 'name', type: String )
72
+ cluster = validate( params, required: false, var: 'cluster', type: Boolean ) || false
73
+ vars = validate( params, required: false, var: 'vars', type: String )
74
+ reload = validate( params, required: false, var: 'reload', type: Boolean ) || true
75
+ name = name.gsub('.conf','')
76
+
77
+ return { 'code' => 404, 'status' => format('no package \'%s\' exists', package) } unless(package_exists?(package))
78
+
79
+ path = 'conf.d'
80
+ path = 'zones.d/satellite' if(cluster)
81
+ file = format( '%s/%s.conf', path, name )
82
+
83
+ payload = {
84
+ 'files' => {
85
+ file.to_s => vars
86
+ },
87
+ 'reload' => reload
88
+ }
89
+
90
+ post(
91
+ url: format( '%s/config/stages/%s', @icinga_api_url_base, package ),
92
+ headers: @headers,
93
+ options: @options,
94
+ payload: payload
95
+ )
96
+ end
97
+
98
+ # A list of packages.
99
+ #
100
+ # @example
101
+ # list_config_packages
102
+ #
103
+ # @return [Hash]
104
+ #
105
+ def list_config_packages
106
+
107
+ get(
108
+ url: format( '%s/config/packages', @icinga_api_url_base ),
109
+ headers: @headers,
110
+ options: @options
111
+ )
112
+ end
113
+
114
+ # A list of packages and their stages.
115
+ #
116
+ # @param [Hash] params
117
+ # @option params [String] package
118
+ # @option params [String] stage
119
+ #
120
+ # @example
121
+ # params = {
122
+ # package: 'cfg-package',
123
+ # stage: 'example.localdomain-1441625839-0'
124
+ # }
125
+ # list_config_stages(params)
126
+ #
127
+ # @return [Hash]
128
+ #
129
+ def list_config_stages(params)
130
+
131
+ raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
132
+ raise ArgumentError.new('missing params') if( params.size.zero? )
133
+
134
+ package = validate( params, required: true, var: 'package', type: String )
135
+ stage = validate( params, required: true, var: 'stage', type: String )
136
+
137
+ get(
138
+ url: format( '%s/config/stages/%s/%s', @icinga_api_url_base, package, stage ),
139
+ headers: @headers,
140
+ options: @options
141
+ )
142
+ end
143
+
144
+
145
+ # fetched the whole config package and return them as a String.
146
+ #
147
+ # @param [Hash] params
148
+ # @option params [String] package
149
+ # @option params [String] stage
150
+ # @option params [Bool] cluser (false) package for an satellite
151
+ # @option params [String] name
152
+ #
153
+ # @example
154
+ # params = {
155
+ # package: 'cfg-package',
156
+ # stage: 'example.localdomain-1441625839-0',
157
+ # name: 'host1',
158
+ # cluster: false
159
+ # }
160
+ # fetch_config_stages(params)
161
+ #
162
+ # @return [String]
163
+ #
164
+ def fetch_config_stages(params)
165
+
166
+ raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
167
+ raise ArgumentError.new('missing params') if( params.size.zero? )
168
+
169
+ package = validate( params, required: true, var: 'package', type: String )
170
+ stage = validate( params, required: true, var: 'stage', type: String )
171
+ name = validate( params, required: true, var: 'name', type: String )
172
+ cluster = validate( params, required: false, var: 'cluster', type: Boolean ) || false
173
+ name = name.gsub('.conf','')
174
+
175
+ return { 'code' => 404, 'status' => format('no package \'%s\' exists', package) } unless(package_exists?(package))
176
+
177
+ path = 'conf.d'
178
+ path = 'zones.d/satellite' if(cluster)
179
+ file = format( '%s/%s/%s/%s.conf', package, stage, path, name )
180
+
181
+ get(
182
+ url: format( '%s/config/files/%s', @icinga_api_url_base, file ),
183
+ headers: {},
184
+ options: @options
185
+ )
186
+ end
187
+
188
+ # fetch the startup.log from the named packe / stage combination to see possible errors.
189
+ #
190
+ # @param [Hash] params
191
+ # @option params [String] package
192
+ # @option params [String] stage
193
+ # @option params [Bool] cluser (false) package for an satellite
194
+ #
195
+ # @example
196
+ # params = {
197
+ # package: 'cfg-package',
198
+ # stage: 'example.localdomain-1441625839-0',
199
+ # cluster: false
200
+ # }
201
+ # package_stage_errors(params)
202
+ #
203
+ # @return [String]
204
+ #
205
+ def package_stage_errors(params)
206
+
207
+ raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
208
+ raise ArgumentError.new('missing params') if( params.size.zero? )
209
+
210
+ package = validate( params, required: true, var: 'package', type: String )
211
+ stage = validate( params, required: true, var: 'stage', type: String )
212
+ # cluster = validate( params, required: false, var: 'cluster', type: Boolean ) || false
213
+
214
+ return { 'code' => 404, 'status' => format('no package \'%s\' exists', package) } unless(package_exists?(package))
215
+
216
+ file = format( '%s/%s/startup.log', package, stage )
217
+
218
+ get(
219
+ url: format( '%s/config/files/%s', @icinga_api_url_base, file ),
220
+ headers: {},
221
+ options: @options
222
+ )
223
+ end
224
+
225
+ # Deleting Configuration Package Stage
226
+ #
227
+ # @param [Hash] params
228
+ # @option params [String] package
229
+ # @option params [String] stage
230
+ #
231
+ # @example
232
+ # params = {
233
+ # package: 'cfg-package',
234
+ # stage: 'example.localdomain-1441625839-0',
235
+ # cluster: false
236
+ # }
237
+ # remove_config_stage(params)
238
+ #
239
+ # @return [Hash]
240
+ #
241
+ def remove_config_stage(params)
242
+
243
+ raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
244
+ raise ArgumentError.new('missing params') if( params.size.zero? )
245
+
246
+ package = validate( params, required: true, var: 'package', type: String )
247
+ stage = validate( params, required: true, var: 'stage', type: String )
248
+
249
+ return { 'code' => 404, 'name' => package, 'status' => 'Package names starting with an underscore are reserved for internal packages and can not be used.' } if( package.initial == '_' )
250
+ return { 'code' => 404, 'status' => format('no package \'%s\' exists', name) } unless(package_exists?(package))
251
+
252
+ delete(
253
+ url: format( '%s/config/stages/%s/%s', @icinga_api_url_base, package, stage ),
254
+ headers: @headers,
255
+ options: @options
256
+ )
257
+ end
258
+
259
+ # Deleting Configuration Package
260
+ #
261
+ # @param [String] name the name for the package.
262
+ #
263
+ # @example
264
+ # remove_config_package('cfg-package')
265
+ #
266
+ # @return [Hash]
267
+ #
268
+ def remove_config_package(name)
269
+
270
+ raise ArgumentError.new(format('wrong type. \'name\' must be an String, given \'%s\'', name.class.to_s)) unless( name.is_a?(String) )
271
+ raise ArgumentError.new('missing \'name\'') if( name.size.zero? )
272
+
273
+ return { 'code' => 404, 'name' => name, 'status' => 'Package names starting with an underscore are reserved for internal packages and can not be used.' } if( name.initial == '_' )
274
+ return { 'code' => 404, 'status' => format('no package \'%s\' exists', name) } unless(package_exists?(name))
275
+
276
+ delete(
277
+ url: format( '%s/config/packages/%s', @icinga_api_url_base, name ),
278
+ headers: @headers,
279
+ options: @options
280
+ )
281
+ end
282
+
283
+ # check if a package exists
284
+ #
285
+ # @param [String] name the name for the package.
286
+ #
287
+ # @example
288
+ # package_exists?('cfg-package')
289
+ #
290
+ # @return [Bool]
291
+ #
292
+ def package_exists?(name)
293
+
294
+ raise ArgumentError.new(format('wrong type. \'name\' must be an String, given \'%s\'', name.class.to_s)) unless( name.is_a?(String) )
295
+ raise ArgumentError.new('missing \'name\'') if( name.size.zero? )
296
+
297
+ current_packages = list_config_packages
298
+
299
+ return { 'code' => 404, 'status' => 'error to get packages' } if( current_packages.nil? && current_packages.dig('code') != 200 )
300
+
301
+ current_packages = current_packages.dig('results')
302
+
303
+ data = current_packages.select { |k,_| k['name'] == name }
304
+ data = data.first if( data )
305
+
306
+ return false unless(data)
307
+
308
+ true
309
+ end
310
+
311
+ end
312
+ end