alerty 0.3.0 → 0.4.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/.travis.yml +8 -0
- data/CHANGELOG.md +6 -0
- data/README.md +10 -0
- data/lib/alerty.rb +19 -0
- data/lib/alerty/cli.rb +19 -7
- data/lib/alerty/command.rb +2 -12
- data/lib/alerty/version.rb +1 -1
- data/spec/cli_spec.rb +29 -13
- data/spec/command_spec.rb +10 -10
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca4e9b30326bd03ff18ef0c79614f9134716221f
|
4
|
+
data.tar.gz: d4cbe7d427ebc8ab5a967d7dd2a3226c4b98f4d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e8a5cb471fcd6d320d29412474bfc860e49877bbda411c7ae71f6f3c8342d8edb196da7517697bd8822edd9bfb952a7dec85bc9439433aa0148c4c3ae5569571
|
7
|
+
data.tar.gz: e8f6947ff4dad1cb48abaef96f00f11c7706d8422091ee3444d469e89fe69dbb3270b74a9dbf42942f5016eb4cc34bc73ec5eb50b2b35704a667bf090846c231
|
data/.travis.yml
ADDED
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -58,6 +58,16 @@ Usage: alerty [options] -- command
|
|
58
58
|
--dotenv Load environment variables from .env file with dotenv
|
59
59
|
```
|
60
60
|
|
61
|
+
### Experimental: Send alert from STDIN
|
62
|
+
|
63
|
+
This interface allows us to send notification even if a command does not fail.
|
64
|
+
|
65
|
+
CLI Example:
|
66
|
+
|
67
|
+
```
|
68
|
+
$ echo 'this is a test' | alerty -c example.yml
|
69
|
+
```
|
70
|
+
|
61
71
|
## Plugins
|
62
72
|
|
63
73
|
Following plugins are available:
|
data/lib/alerty.rb
CHANGED
@@ -13,4 +13,23 @@ class Alerty
|
|
13
13
|
logger.level = Config.log_level
|
14
14
|
end
|
15
15
|
end
|
16
|
+
|
17
|
+
# @param [Hash] record
|
18
|
+
# @option record [String] :hostname
|
19
|
+
# @option record [String] :command
|
20
|
+
# @option record [Integer] :exitstatus
|
21
|
+
# @option record [String] :output
|
22
|
+
# @option record [Float] :started_at unix timestamp
|
23
|
+
# @option record [Float] :duration
|
24
|
+
# @option record [Integer] :retries number of being retried
|
25
|
+
def self.send(record)
|
26
|
+
PluginFactory.plugins.each do |plugin|
|
27
|
+
begin
|
28
|
+
plugin.alert(record)
|
29
|
+
rescue => e
|
30
|
+
puts "#{e.class} #{e.message} #{e.backtrace.join("\n")}" if Config.debug?
|
31
|
+
Alerty.logger.warn "#{e.class} #{e.message} #{e.backtrace.join("\n")}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
16
35
|
end
|
data/lib/alerty/cli.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'optparse'
|
2
|
+
require 'socket'
|
2
3
|
require_relative '../alerty'
|
3
4
|
|
4
5
|
class Alerty
|
@@ -55,11 +56,7 @@ class Alerty
|
|
55
56
|
}
|
56
57
|
|
57
58
|
op.parse!(argv)
|
58
|
-
opts[:command] = argv.join(' ')
|
59
|
-
|
60
|
-
if opts[:command].empty?
|
61
|
-
raise OptionParser::InvalidOption.new("No command is given")
|
62
|
-
end
|
59
|
+
opts[:command] = argv.join(' ') || ''
|
63
60
|
|
64
61
|
opts
|
65
62
|
end
|
@@ -73,8 +70,23 @@ class Alerty
|
|
73
70
|
|
74
71
|
Config.configure(opts)
|
75
72
|
PluginFactory.plugins # load plugins in early stage
|
76
|
-
|
77
|
-
command.
|
73
|
+
|
74
|
+
if !opts[:command].empty?
|
75
|
+
command = Command.new(command: opts[:command])
|
76
|
+
record = command.run
|
77
|
+
unless record[:exitstatus] == 0
|
78
|
+
Alerty.send(record)
|
79
|
+
exit record[:exitstatus]
|
80
|
+
end
|
81
|
+
else
|
82
|
+
begin
|
83
|
+
stdin = $stdin.read_nonblock(100 * 1024 * 1024)
|
84
|
+
record = {hostname: Socket.gethostname, output: stdin}
|
85
|
+
Alerty.send(record)
|
86
|
+
rescue IO::EAGAINWaitReadable => e
|
87
|
+
usage 'command argument or STDIN is required'
|
88
|
+
end
|
89
|
+
end
|
78
90
|
end
|
79
91
|
end
|
80
92
|
end
|
data/lib/alerty/command.rb
CHANGED
@@ -10,7 +10,7 @@ class Alerty
|
|
10
10
|
@hostname = Socket.gethostname
|
11
11
|
end
|
12
12
|
|
13
|
-
def run
|
13
|
+
def run
|
14
14
|
record = {}
|
15
15
|
with_retry do |retries|
|
16
16
|
started_at = Time.now
|
@@ -50,17 +50,7 @@ class Alerty
|
|
50
50
|
Alerty.logger.info { "result: #{record.to_json}" }
|
51
51
|
record
|
52
52
|
end
|
53
|
-
|
54
|
-
PluginFactory.plugins.each do |plugin|
|
55
|
-
begin
|
56
|
-
plugin.alert(record)
|
57
|
-
rescue => e
|
58
|
-
puts "#{e.class} #{e.message} #{e.backtrace.join("\n")}" if Config.debug?
|
59
|
-
Alerty.logger.warn "#{e.class} #{e.message} #{e.backtrace.join("\n")}"
|
60
|
-
end
|
61
|
-
end
|
62
|
-
exit record[:exitstatus]
|
63
|
-
end
|
53
|
+
record
|
64
54
|
end
|
65
55
|
|
66
56
|
private
|
data/lib/alerty/version.rb
CHANGED
data/spec/cli_spec.rb
CHANGED
@@ -7,10 +7,6 @@ describe Alerty::CLI do
|
|
7
7
|
OUTPUT_FILE = File.join(File.dirname(__FILE__), 'cli_spec.out')
|
8
8
|
|
9
9
|
describe '#parse_options' do
|
10
|
-
it 'incorrect' do
|
11
|
-
expect { Alerty::CLI.new.parse_options([]) }.to raise_error(OptionParser::InvalidOption)
|
12
|
-
end
|
13
|
-
|
14
10
|
it 'command' do
|
15
11
|
expect(Alerty::CLI.new.parse_options(['--', 'ls', '-l'])[:command]).to eql('ls -l')
|
16
12
|
end
|
@@ -21,28 +17,48 @@ describe Alerty::CLI do
|
|
21
17
|
end
|
22
18
|
|
23
19
|
describe '#run' do
|
24
|
-
context 'with
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
20
|
+
context 'with command' do
|
21
|
+
context 'with success' do
|
22
|
+
before :all do
|
23
|
+
FileUtils.rm(OUTPUT_FILE, force: true)
|
24
|
+
system("#{File.join(BIN_DIR, 'alerty')} -c #{CONFIG_PATH} -- echo foo")
|
25
|
+
sleep 0.1
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should not output' do
|
29
|
+
expect(File.size?(OUTPUT_FILE)).to be_falsey
|
30
|
+
end
|
31
|
+
|
32
|
+
it { expect($?.exitstatus).to eq(0) }
|
29
33
|
end
|
30
34
|
|
31
|
-
|
32
|
-
|
35
|
+
context 'with failure' do
|
36
|
+
before :all do
|
37
|
+
FileUtils.rm(OUTPUT_FILE, force: true)
|
38
|
+
system("#{File.join(BIN_DIR, 'alerty')} -c #{CONFIG_PATH} -- [ a = b ]")
|
39
|
+
sleep 0.1
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should output' do
|
43
|
+
expect(File.size?(OUTPUT_FILE)).to be_truthy
|
44
|
+
end
|
45
|
+
|
46
|
+
it { expect($?.exitstatus).to eq(1) }
|
33
47
|
end
|
34
48
|
end
|
35
49
|
|
36
|
-
context 'with
|
50
|
+
context 'with stdin' do
|
37
51
|
before :all do
|
38
52
|
FileUtils.rm(OUTPUT_FILE, force: true)
|
39
|
-
|
53
|
+
open("| #{File.join(BIN_DIR, 'alerty')} -c #{CONFIG_PATH}", 'w') {|f| f.puts 'test' }
|
40
54
|
sleep 0.1
|
41
55
|
end
|
42
56
|
|
43
57
|
it 'should output' do
|
44
58
|
expect(File.size?(OUTPUT_FILE)).to be_truthy
|
45
59
|
end
|
60
|
+
|
61
|
+
it { expect($?.exitstatus).to eq(0) }
|
46
62
|
end
|
47
63
|
end
|
48
64
|
end
|
data/spec/command_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Alerty::Command do
|
4
|
-
describe 'run
|
4
|
+
describe 'run' do
|
5
5
|
context 'Frontkick.exec' do
|
6
6
|
before do
|
7
7
|
Alerty::Config.configure(
|
@@ -21,7 +21,7 @@ describe Alerty::Command do
|
|
21
21
|
exclusive: '/tmp/lock',
|
22
22
|
popen2e: true,
|
23
23
|
}).and_return(Frontkick::Result.new(exit_code: 0))
|
24
|
-
|
24
|
+
command.run
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
@@ -48,8 +48,8 @@ describe Alerty::Command do
|
|
48
48
|
exclusive: nil,
|
49
49
|
popen2e: true,
|
50
50
|
}).and_return(Frontkick::Result.new(stdout: 'foo', exit_code: 1))
|
51
|
-
|
52
|
-
expect(
|
51
|
+
record = command.run
|
52
|
+
expect(record[:output]).to eql("foo")
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
@@ -76,8 +76,8 @@ describe Alerty::Command do
|
|
76
76
|
exclusive: '/tmp/lock',
|
77
77
|
popen2e: true,
|
78
78
|
}).and_raise(Frontkick::Timeout.new(111, 'sleep 1', true))
|
79
|
-
|
80
|
-
expect(
|
79
|
+
record = command.run
|
80
|
+
expect(record[:output]).to include("timeout")
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
@@ -104,8 +104,8 @@ describe Alerty::Command do
|
|
104
104
|
exclusive: '/tmp/lock',
|
105
105
|
popen2e: true,
|
106
106
|
}).and_raise(Frontkick::Locked)
|
107
|
-
|
108
|
-
expect(
|
107
|
+
record = command.run
|
108
|
+
expect(record[:output]).to include("lock")
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
@@ -131,8 +131,8 @@ describe Alerty::Command do
|
|
131
131
|
exclusive: nil,
|
132
132
|
popen2e: true,
|
133
133
|
}).and_return(Frontkick::Result.new(stdout: 'foo', exit_code: 1))
|
134
|
-
|
135
|
-
expect(
|
134
|
+
record = command.run
|
135
|
+
expect(record[:retries]).to eql(1)
|
136
136
|
end
|
137
137
|
end
|
138
138
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alerty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Naotoshi Seo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hashie
|
@@ -145,6 +145,7 @@ extensions: []
|
|
145
145
|
extra_rdoc_files: []
|
146
146
|
files:
|
147
147
|
- ".gitignore"
|
148
|
+
- ".travis.yml"
|
148
149
|
- CHANGELOG.md
|
149
150
|
- Gemfile
|
150
151
|
- LICENSE
|
@@ -191,7 +192,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
191
192
|
version: '0'
|
192
193
|
requirements: []
|
193
194
|
rubyforge_project:
|
194
|
-
rubygems_version: 2.
|
195
|
+
rubygems_version: 2.6.13
|
195
196
|
signing_key:
|
196
197
|
specification_version: 4
|
197
198
|
summary: Send an alert if a given command failed
|