sensu-settings 5.2.0 → 6.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 +4 -4
- data/lib/sensu/settings/loader.rb +47 -13
- data/lib/sensu/settings/rules.rb +4 -2
- data/lib/sensu/settings/validators/check.rb +17 -7
- data/sensu-settings.gemspec +1 -1
- data/spec/loader_spec.rb +15 -3
- data/spec/validator_spec.rb +24 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b4a1cb240875b92bbe08382f6b826cdd5842fbe8
|
4
|
+
data.tar.gz: a106106ad7f49e8431fef9ffcfa4ce0465b95a5a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b835741087e47bd2a3aad317dfd9d00f162182348c5e545bc249fdc0d1a91775a05e3510cc3e13abc81a76d73ef3bad98619da29421545652f3632469722b316
|
7
|
+
data.tar.gz: 5546f23571be9b5d6414b730fc14913272f3493ec7e0aaa2cb4caf44f633504f5475a111579c6fec99a2b0adb01e4da4e8e6f713614f76d8fdced1191cca0f35
|
@@ -29,6 +29,23 @@ module Sensu
|
|
29
29
|
self.class.create_category_methods
|
30
30
|
end
|
31
31
|
|
32
|
+
# Auto-detected defaults for client definition
|
33
|
+
#
|
34
|
+
# Client name defaults to system hostname.
|
35
|
+
# Client address defaults to first detected non-loopback ipv4 address.
|
36
|
+
#
|
37
|
+
# Client subscriptions are intentionally omitted here as sensu-client
|
38
|
+
# will provide defaults using client name after final settings are
|
39
|
+
# loaded.
|
40
|
+
#
|
41
|
+
# @return [Hash] default client settings
|
42
|
+
def client_defaults
|
43
|
+
{
|
44
|
+
:name => system_hostname,
|
45
|
+
:address => system_address
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
32
49
|
# Default settings.
|
33
50
|
#
|
34
51
|
# @return [Hash] settings.
|
@@ -47,6 +64,9 @@ module Sensu
|
|
47
64
|
CATEGORIES.each do |category|
|
48
65
|
default[category] = {}
|
49
66
|
end
|
67
|
+
if ["client", "rspec"].include?(sensu_service_name)
|
68
|
+
default[:client] = client_defaults
|
69
|
+
end
|
50
70
|
default
|
51
71
|
end
|
52
72
|
|
@@ -139,8 +159,12 @@ module Sensu
|
|
139
159
|
def load_directory(directory)
|
140
160
|
warning("loading config files from directory", :directory => directory)
|
141
161
|
path = directory.gsub(/\\(?=\S)/, "/")
|
142
|
-
|
143
|
-
|
162
|
+
if File.readable?(path) && File.executable?(path)
|
163
|
+
Dir.glob(File.join(path, "**{,/*/**}/*.json")).uniq.each do |file|
|
164
|
+
load_file(file)
|
165
|
+
end
|
166
|
+
else
|
167
|
+
load_error("insufficient permissions for loading", :directory => directory)
|
144
168
|
end
|
145
169
|
end
|
146
170
|
|
@@ -249,20 +273,19 @@ module Sensu
|
|
249
273
|
end
|
250
274
|
|
251
275
|
# Load Sensu client settings from the environment. This method
|
252
|
-
# loads client settings from several variables
|
253
|
-
# `SENSU_CLIENT_NAME
|
254
|
-
# `
|
255
|
-
#
|
256
|
-
#
|
276
|
+
# loads client settings from several variables:
|
277
|
+
# `SENSU_CLIENT_NAME`, `SENSU_CLIENT_ADDRESS`, and
|
278
|
+
# `SENSU_CLIENT_SUBSCRIPTIONS`.
|
279
|
+
#
|
280
|
+
# The client subscriptions defaults to an empty array.
|
257
281
|
def load_client_env
|
258
|
-
if ENV["SENSU_CLIENT_NAME"]
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
@settings[:client][:subscriptions] = ENV.fetch("SENSU_CLIENT_SUBSCRIPTIONS", "").split(",")
|
282
|
+
@settings[:client][:name] = ENV["SENSU_CLIENT_NAME"] if ENV["SENSU_CLIENT_NAME"]
|
283
|
+
@settings[:client][:address] = ENV["SENSU_CLIENT_ADDRESS"] if ENV["SENSU_CLIENT_ADDRESS"]
|
284
|
+
@settings[:client][:subscriptions] = ENV.fetch("SENSU_CLIENT_SUBSCRIPTIONS", "").split(",")
|
285
|
+
if ENV.keys.any? {|k| k =~ /^SENSU_CLIENT/}
|
263
286
|
warning("using sensu client environment variables", :client => @settings[:client])
|
264
|
-
@indifferent_access = false
|
265
287
|
end
|
288
|
+
@indifferent_access = false
|
266
289
|
end
|
267
290
|
|
268
291
|
# Load Sensu API settings from the environment. This method sets
|
@@ -372,6 +395,17 @@ module Sensu
|
|
372
395
|
Socket.gethostname rescue "unknown"
|
373
396
|
end
|
374
397
|
|
398
|
+
# Retrieve the system IP address. If a valid non-loopback
|
399
|
+
# IPv4 address cannot be found and an error is thrown,
|
400
|
+
# "unknown" will be returned.
|
401
|
+
#
|
402
|
+
# @return [String] system ip address
|
403
|
+
def system_address
|
404
|
+
Socket.ip_address_list.find { |address|
|
405
|
+
address.ipv4? && !address.ipv4_loopback?
|
406
|
+
}.ip_address rescue "unknown"
|
407
|
+
end
|
408
|
+
|
375
409
|
# Record a warning.
|
376
410
|
#
|
377
411
|
# @param message [String] warning message.
|
data/lib/sensu/settings/rules.rb
CHANGED
@@ -113,10 +113,12 @@ module Sensu
|
|
113
113
|
# Check that value items are all strings and not empty.
|
114
114
|
#
|
115
115
|
# @param value [Array] with items to check.
|
116
|
+
# @param regex [Regexp] to validate string items with.
|
116
117
|
# @return [TrueClass, FalseClass]
|
117
|
-
def items_must_be_strings(value)
|
118
|
+
def items_must_be_strings(value, regex=nil)
|
118
119
|
value.all? do |item|
|
119
|
-
item.is_a?(String) && !item.empty?
|
120
|
+
item.is_a?(String) && !item.empty? &&
|
121
|
+
(regex.nil? || item =~ regex)
|
120
122
|
end
|
121
123
|
end
|
122
124
|
|
@@ -97,12 +97,22 @@ module Sensu
|
|
97
97
|
#
|
98
98
|
# @param check [Hash] sensu check definition.
|
99
99
|
def validate_check_aggregate(check)
|
100
|
-
if
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
invalid(check, "check
|
100
|
+
if check[:aggregates]
|
101
|
+
if is_an_array?(check[:aggregates])
|
102
|
+
items_must_be_strings(check[:aggregates], /\A[\w\.:|-]+\z/) ||
|
103
|
+
invalid(check, "check aggregates items must be strings without spaces or special characters")
|
104
|
+
else
|
105
|
+
invalid(check, "check aggregates must be an array")
|
106
|
+
end
|
107
|
+
end
|
108
|
+
if check[:aggregate]
|
109
|
+
if is_a_string?(check[:aggregate])
|
110
|
+
must_match_regex(/\A[\w\.:|-]+\z/, check[:aggregate]) ||
|
111
|
+
invalid(check, "check aggregate cannot contain spaces or special characters")
|
112
|
+
else
|
113
|
+
must_be_boolean(check[:aggregate]) ||
|
114
|
+
invalid(check, "check aggregate must be a string (name) or boolean")
|
115
|
+
end
|
106
116
|
end
|
107
117
|
end
|
108
118
|
|
@@ -129,7 +139,7 @@ module Sensu
|
|
129
139
|
validate_check_scheduling(check)
|
130
140
|
validate_check_handling(check)
|
131
141
|
validate_check_ttl(check) if check[:ttl]
|
132
|
-
validate_check_aggregate(check)
|
142
|
+
validate_check_aggregate(check)
|
133
143
|
validate_check_flap_detection(check)
|
134
144
|
validate_subdue(check) if check[:subdue]
|
135
145
|
end
|
data/sensu-settings.gemspec
CHANGED
data/spec/loader_spec.rb
CHANGED
@@ -25,6 +25,13 @@ describe "Sensu::Settings::Loader" do
|
|
25
25
|
expect(failures.size).to eq(0)
|
26
26
|
end
|
27
27
|
|
28
|
+
it "can load Sensu client settings with auto-detected defaults" do
|
29
|
+
@loader.load_env
|
30
|
+
expect(@loader.warnings.size).to eq(0)
|
31
|
+
expect(@loader.default_settings[:client][:name]).to be_kind_of(String)
|
32
|
+
expect(@loader.default_settings[:client][:address]).to be_kind_of(String)
|
33
|
+
end
|
34
|
+
|
28
35
|
it "can load Sensu transport settings from the environment" do
|
29
36
|
ENV["SENSU_TRANSPORT_NAME"] = "redis"
|
30
37
|
@loader.load_env
|
@@ -77,6 +84,8 @@ describe "Sensu::Settings::Loader" do
|
|
77
84
|
expect(client[:address]).to eq("127.0.0.1")
|
78
85
|
expect(client[:subscriptions]).to eq(["foo", "bar", "baz"])
|
79
86
|
ENV["SENSU_CLIENT_NAME"] = nil
|
87
|
+
ENV["SENSU_CLIENT_ADDRESS"] = nil
|
88
|
+
ENV["SENSU_CLIENT_SUBSCRIPTIONS"] = nil
|
80
89
|
end
|
81
90
|
|
82
91
|
it "can load Sensu API settings from the environment" do
|
@@ -153,10 +162,13 @@ describe "Sensu::Settings::Loader" do
|
|
153
162
|
end
|
154
163
|
|
155
164
|
it "can attempt to load settings from files in a nonexistent directory" do
|
156
|
-
|
165
|
+
expect {
|
166
|
+
@loader.load_directory("/tmp/rottentomatos")
|
167
|
+
}.to raise_error(Sensu::Settings::Loader::Error)
|
157
168
|
expect(@loader.warnings.size).to eq(1)
|
158
|
-
|
159
|
-
expect(
|
169
|
+
expect(@loader.warnings.first[:message]).to eq("loading config files from directory")
|
170
|
+
expect(@loader.errors.size).to eq(1)
|
171
|
+
expect(@loader.errors.first[:message]).to eq("insufficient permissions for loading")
|
160
172
|
end
|
161
173
|
|
162
174
|
it "can set environment variables for child processes" do
|
data/spec/validator_spec.rb
CHANGED
@@ -188,6 +188,27 @@ describe "Sensu::Settings::Validator" do
|
|
188
188
|
check[:ttl] = 1
|
189
189
|
@validator.validate_check(check)
|
190
190
|
expect(@validator.reset).to eq(0)
|
191
|
+
check[:aggregates] = "string"
|
192
|
+
@validator.validate_check(check)
|
193
|
+
expect(@validator.reset).to eq(1)
|
194
|
+
check[:aggregates] = true
|
195
|
+
@validator.validate_check(check)
|
196
|
+
expect(@validator.reset).to eq(1)
|
197
|
+
check[:aggregates] = [1]
|
198
|
+
@validator.validate_check(check)
|
199
|
+
expect(@validator.reset).to eq(1)
|
200
|
+
check[:aggregates] = [true]
|
201
|
+
@validator.validate_check(check)
|
202
|
+
expect(@validator.reset).to eq(1)
|
203
|
+
check[:aggregates] = ["foo", "$bar$"]
|
204
|
+
@validator.validate_check(check)
|
205
|
+
expect(@validator.reset).to eq(1)
|
206
|
+
check[:aggregates] = ["foo", "bar"]
|
207
|
+
@validator.validate_check(check)
|
208
|
+
expect(@validator.reset).to eq(0)
|
209
|
+
check[:aggregates] = [":::some_custom_attr:::-checks", ":::another_custom_attr|default_value:::-checks"]
|
210
|
+
@validator.validate_check(check)
|
211
|
+
expect(@validator.reset).to eq(0)
|
191
212
|
check[:aggregate] = 1
|
192
213
|
@validator.validate_check(check)
|
193
214
|
expect(@validator.reset).to eq(1)
|
@@ -200,6 +221,9 @@ describe "Sensu::Settings::Validator" do
|
|
200
221
|
check[:aggregate] = "test"
|
201
222
|
@validator.validate_check(check)
|
202
223
|
expect(@validator.reset).to eq(0)
|
224
|
+
check[:aggregate] = ":::some_custom_attribute|magic:::"
|
225
|
+
@validator.validate_check(check)
|
226
|
+
expect(@validator.reset).to eq(0)
|
203
227
|
check[:low_flap_threshold] = "25"
|
204
228
|
@validator.validate_check(check)
|
205
229
|
expect(@validator.reset).to eq(2)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sensu-settings
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 6.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Porter
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-07-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sensu-json
|