sensu-extensions 1.0.0 → 1.1.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: 4f57126991763e89e26528b447af7a360ef8dc68
4
- data.tar.gz: 0544fed9f3a43312082531cf59db8ddae44f2fc0
3
+ metadata.gz: e4bc92d117b837c89057ba3c0dec38b2bd76db80
4
+ data.tar.gz: f3fc9a6727262dca6e5d84991e767d0e5c91fdcb
5
5
  SHA512:
6
- metadata.gz: 12db8e2e16ac764b716d58f2745c067c8b7550f66dbd7de5397ca76be5855c7de2f0140cccff865ddcf2a657d0f539778dca3a3721485f9b8a350ab48018303d
7
- data.tar.gz: 330bff41a52ef0283f81fc47623d7b2c5b746e702132f4a97dd9aa7c00f55ef400d2326feca48c8d512a55ab8313aebc2fd8fd4c9963f5c06a1f8dfd97151bb7
6
+ metadata.gz: 9cfeb24e06c88fb9966a8f882a70a5554bc92b33e9fd42986585a140890a9ac567cb36674fde37e147f6ba8019552edf09753bc9e59bc735dad71fd66b6e19a5
7
+ data.tar.gz: fb778e2d246b5764e37d25142b85a23ead28bd2001f5b40461b2e426d645e85d41248264bd5fdf1d3c23cdf589f7491f85b7927a17188a6163710a0c5ae1327e
@@ -0,0 +1,71 @@
1
+ require "sensu/extension"
2
+
3
+ module Sensu
4
+ module Sandbox
5
+ def self.eval(eval_string, value=nil)
6
+ result = Proc.new do
7
+ $SAFE = (RUBY_VERSION < "2.1.0" ? 4 : 3)
8
+ Kernel.eval(eval_string)
9
+ end
10
+ result.call
11
+ end
12
+ end
13
+
14
+ module Extension
15
+ class Attributes < Filter
16
+ def name
17
+ "attributes"
18
+ end
19
+
20
+ def description
21
+ "filters events using event attributes"
22
+ end
23
+
24
+ def run(event, options)
25
+ status = filter_event?(options[:filter_name], event) ? 0 : 1
26
+ yield "", status
27
+ end
28
+
29
+ def eval_attribute_value(raw_eval_string, value)
30
+ begin
31
+ eval_string = raw_eval_string.gsub(/^eval:(\s+)?/, "")
32
+ !!Sandbox.eval(eval_string, value)
33
+ rescue => error
34
+ @logger.error("filter attribute eval error", {
35
+ :raw_eval_string => raw_eval_string,
36
+ :value => value,
37
+ :error => error.to_s
38
+ })
39
+ false
40
+ end
41
+ end
42
+
43
+ def attributes_match?(hash_one, hash_two)
44
+ hash_one.all? do |key, value_one|
45
+ value_two = hash_two[key]
46
+ case
47
+ when value_one == value_two
48
+ true
49
+ when value_one.is_a?(Hash) && value_two.is_a?(Hash)
50
+ attributes_match?(value_one, value_two)
51
+ when value_one.is_a?(String) && value_one.start_with?("eval:")
52
+ eval_attribute_value(value_one, value_two)
53
+ else
54
+ false
55
+ end
56
+ end
57
+ end
58
+
59
+ def filter_event?(filter_name, event)
60
+ if @settings.filter_exists?(filter_name)
61
+ filter = @settings[:filters][filter_name]
62
+ matched = attributes_match?(filter[:attributes], event)
63
+ filter[:negate] ? matched : !matched
64
+ else
65
+ @logger.error("unknown filter", :filter_name => filter_name)
66
+ false
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "sensu-extensions"
5
- spec.version = "1.0.0"
5
+ spec.version = "1.1.0"
6
6
  spec.authors = ["Sean Porter"]
7
7
  spec.email = ["portertech@gmail.com"]
8
8
  spec.summary = "The Sensu extension loader library"
@@ -16,11 +16,16 @@ Gem::Specification.new do |spec|
16
16
  spec.require_paths = ["lib"]
17
17
 
18
18
  spec.add_dependency "sensu-em"
19
+ spec.add_dependency "sensu-logger"
20
+ spec.add_dependency "sensu-settings"
19
21
  spec.add_dependency "sensu-extension"
22
+
20
23
  spec.add_dependency "multi_json"
21
24
 
22
25
  spec.add_development_dependency "bundler", "~> 1.6"
26
+ spec.add_development_dependency "uuidtools"
23
27
  spec.add_development_dependency "rake"
24
28
  spec.add_development_dependency "rspec"
25
- spec.add_development_dependency "codeclimate-test-reporter"
29
+ spec.add_development_dependency "bouncy-castle-java" if RUBY_PLATFORM =~ /java/
30
+ spec.add_development_dependency "codeclimate-test-reporter" unless RUBY_VERSION < "1.9"
26
31
  end
@@ -0,0 +1,11 @@
1
+ {
2
+ "filters": {
3
+ "production": {
4
+ "attributes": {
5
+ "client": {
6
+ "environment": "production"
7
+ }
8
+ }
9
+ }
10
+ }
11
+ }
@@ -54,6 +54,7 @@ describe "Sensu::Extensions" do
54
54
 
55
55
  it "can load the built-in extensions" do
56
56
  extensions = Sensu::Extensions.load
57
+ expect(extensions.filter_exists?("attributes")).to be(true)
57
58
  expect(extensions.mutator_exists?("json")).to be(true)
58
59
  expect(extensions.mutator_exists?("ruby_hash")).to be(true)
59
60
  expect(extensions.mutator_exists?("only_check_output")).to be(true)
@@ -0,0 +1,53 @@
1
+ require File.join(File.dirname(__FILE__), "..", "helpers")
2
+ require "sensu/extensions/filters/attributes"
3
+
4
+ describe "Sensu::Extension::Attributes" do
5
+ include Helpers
6
+
7
+ before do
8
+ @extension = Sensu::Extension::Attributes.new
9
+ @extension.logger = logger
10
+ @extension.settings = settings
11
+ end
12
+
13
+ it "can determine if filter attributes match an event" do
14
+ attributes = {
15
+ :occurrences => 1
16
+ }
17
+ event = event_template
18
+ expect(@extension.attributes_match?(attributes, event)).to be(true)
19
+ event[:occurrences] = 2
20
+ expect(@extension.attributes_match?(attributes, event)).to be(false)
21
+ attributes[:occurrences] = "eval: value == 1 || value % 60 == 0"
22
+ event[:occurrences] = 1
23
+ expect(@extension.attributes_match?(attributes, event)).to be(true)
24
+ event[:occurrences] = 2
25
+ expect(@extension.attributes_match?(attributes, event)).to be(false)
26
+ event[:occurrences] = 120
27
+ expect(@extension.attributes_match?(attributes, event)).to be(true)
28
+ end
29
+
30
+ it "can run, filtering an event with a nonexistent filter" do
31
+ event = event_template
32
+ options = {:filter_name => "nonexistent"}
33
+ @extension.safe_run(event, options) do |output, status|
34
+ expect(output).to eq("")
35
+ expect(status).to eq(1)
36
+ end
37
+ end
38
+
39
+ it "can run, filtering an event with a filter" do
40
+ event = event_template
41
+ event[:client][:environment] = "development"
42
+ options = {:filter_name => "production"}
43
+ @extension.safe_run(event, options) do |output, status|
44
+ expect(output).to eq("")
45
+ expect(status).to eq(0)
46
+ event[:client][:environment] = "production"
47
+ @extension.safe_run(event, options) do |output, status|
48
+ expect(output).to eq("")
49
+ expect(status).to eq(1)
50
+ end
51
+ end
52
+ end
53
+ end
@@ -1,5 +1,8 @@
1
1
  require "rspec"
2
2
  require "eventmachine"
3
+ require "sensu/logger"
4
+ require "sensu/settings"
5
+ require "uuidtools"
3
6
 
4
7
  unless RUBY_VERSION < "1.9" || RUBY_PLATFORM =~ /java/
5
8
  require "codeclimate-test-reporter"
@@ -26,4 +29,52 @@ module Helpers
26
29
  def async_done
27
30
  EM.stop_event_loop
28
31
  end
32
+
33
+ def logger
34
+ Sensu::Logger.get(:log_level => :fatal)
35
+ end
36
+
37
+ def settings
38
+ asset_dir = File.join(File.dirname(__FILE__), "assets")
39
+ config_file = File.join(asset_dir, "config.json")
40
+ Sensu::Settings.get(:config_file => config_file)
41
+ end
42
+
43
+ def epoch
44
+ Time.now.to_i
45
+ end
46
+
47
+ def client_template
48
+ {
49
+ :name => "i-424242",
50
+ :address => "127.0.0.1",
51
+ :subscriptions => [
52
+ "test"
53
+ ]
54
+ }
55
+ end
56
+
57
+ def check_template
58
+ {
59
+ :name => "test",
60
+ :command => "echo WARNING && exit 1",
61
+ :issued => epoch
62
+ }
63
+ end
64
+
65
+ def event_template
66
+ client = client_template
67
+ client[:timestamp] = epoch
68
+ check = check_template
69
+ check[:output] = "WARNING"
70
+ check[:status] = 1
71
+ check[:history] = [1]
72
+ {
73
+ :id => UUIDTools::UUID.random_create.to_s,
74
+ :client => client,
75
+ :check => check,
76
+ :occurrences => 1,
77
+ :action => :create
78
+ }
79
+ end
29
80
  end
@@ -79,6 +79,7 @@ describe "Sensu::Extensions::Loader" do
79
79
  expect(@loader.all).to include(extension)
80
80
  expect(@loader.handler_exists?("debug")).to be(true)
81
81
  expect(@loader.mutator_exists?("only_check_output")).to be(true)
82
+ expect(@loader.filter_exists?("attributes")).to be(true)
82
83
  end
83
84
 
84
85
  it "can load specific extension categories for a sensu client" do
@@ -92,6 +93,7 @@ describe "Sensu::Extensions::Loader" do
92
93
  @loader.load_instances("server")
93
94
  expect(@loader.handler_exists?("debug")).to be(true)
94
95
  expect(@loader.mutator_exists?("only_check_output")).to be(true)
96
+ expect(@loader.filter_exists?("attributes")).to be(true)
95
97
  expect(@loader.check_exists?("mock_check")).to be(false)
96
98
  end
97
99
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu-extensions
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.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: 2014-06-12 00:00:00.000000000 Z
11
+ date: 2014-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sensu-em
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: sensu-logger
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: sensu-settings
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: sensu-extension
29
57
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +94,20 @@ dependencies:
66
94
  - - "~>"
67
95
  - !ruby/object:Gem::Version
68
96
  version: '1.6'
97
+ - !ruby/object:Gem::Dependency
98
+ name: uuidtools
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
69
111
  - !ruby/object:Gem::Dependency
70
112
  name: rake
71
113
  requirement: !ruby/object:Gem::Requirement
@@ -122,16 +164,19 @@ files:
122
164
  - README.md
123
165
  - Rakefile
124
166
  - lib/sensu/extensions.rb
167
+ - lib/sensu/extensions/filters/attributes.rb
125
168
  - lib/sensu/extensions/handlers/debug.rb
126
169
  - lib/sensu/extensions/loader.rb
127
170
  - lib/sensu/extensions/mutators/json.rb
128
171
  - lib/sensu/extensions/mutators/only_check_output.rb
129
172
  - lib/sensu/extensions/mutators/ruby_hash.rb
130
173
  - sensu-extensions.gemspec
174
+ - spec/assets/config.json
131
175
  - spec/assets/extensions/error.rb
132
176
  - spec/assets/extensions/mock_check.rb
133
177
  - spec/assets/extensions/test.rb
134
178
  - spec/extensions_spec.rb
179
+ - spec/filters/attributes_spec.rb
135
180
  - spec/handlers/debug_spec.rb
136
181
  - spec/helpers.rb
137
182
  - spec/loader_spec.rb
@@ -158,15 +203,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
158
203
  version: '0'
159
204
  requirements: []
160
205
  rubyforge_project:
161
- rubygems_version: 2.2.0
206
+ rubygems_version: 2.2.2
162
207
  signing_key:
163
208
  specification_version: 4
164
209
  summary: The Sensu extension loader library
165
210
  test_files:
211
+ - spec/assets/config.json
166
212
  - spec/assets/extensions/error.rb
167
213
  - spec/assets/extensions/mock_check.rb
168
214
  - spec/assets/extensions/test.rb
169
215
  - spec/extensions_spec.rb
216
+ - spec/filters/attributes_spec.rb
170
217
  - spec/handlers/debug_spec.rb
171
218
  - spec/helpers.rb
172
219
  - spec/loader_spec.rb