minicron 0.7.7 → 0.7.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.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/lib/minicron.rb +3 -0
- data/lib/minicron/alert.rb +17 -1
- data/lib/minicron/alert/aws_sns.rb +49 -0
- data/lib/minicron/constants.rb +1 -1
- data/lib/minicron/hub/assets/app/controllers/hosts.js +1 -1
- data/lib/minicron/monitor.rb +4 -2
- data/spec/minicron/alert/aws_sns_spec.rb +85 -0
- data/spec/minicron/alert_spec.rb +21 -0
- data/spec/minicron_spec.rb +3 -0
- data/spec/valid_config.toml +3 -0
- metadata +81 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 70d5c6fda70a68b9ecfa2a36e281149e13698d24
|
4
|
+
data.tar.gz: 218a1309dac82cea4a52b68b9b439a828282c71d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ddea0612497a763de534ba45b673e88f3323a5d0073a8b9dbf157e1d017dba51aeefb03f11f546e0b2cbcd49cacdc5a6af5cf01d4c3755b46ee796dac3d95920
|
7
|
+
data.tar.gz: 1191ed1757310c295be9c4febe73e9de77e0808e5bb6e29f40affa6cd80a9ad94bf20f94dfde76baaefaf7cfaad7055beaad9c192d328b3bc992638cd7418d14
|
data/README.md
CHANGED
@@ -3,7 +3,7 @@ minicron
|
|
3
3
|
|
4
4
|
[](https://rubygems.org/gems/minicron)
|
5
5
|
[](http://travis-ci.org/jamesrwhite/minicron)
|
6
|
-
[](https://coveralls.io/r/jamesrwhite/minicron?branch=develop)
|
7
7
|
[](https://codeclimate.com/github/jamesrwhite/minicron)
|
8
8
|
[](https://gemnasium.com/jamesrwhite/minicron)
|
9
9
|
[](http://inch-ci.org/github/jamesrwhite/minicron)
|
@@ -107,7 +107,7 @@ but I encourage you to give it a try in a non critical environment and help me t
|
|
107
107
|
|
108
108
|
2. On some distributions you may need to install the ````ruby-dev```` and ````build-essential```` packages
|
109
109
|
|
110
|
-
3. To install the latest release (currently 0.7.
|
110
|
+
3. To install the latest release (currently 0.7.8) you can ````gem install minicron````, depending on your ruby setup
|
111
111
|
you may need to run this with ````sudo````
|
112
112
|
|
113
113
|
4. Set your database configuration options in ````/etc/minicron.toml````, you can use the [minicron.toml](https://github.com/jamesrwhite/minicron/blob/master/config/minicron.toml) as a guide on what options are configurable
|
data/lib/minicron.rb
CHANGED
data/lib/minicron/alert.rb
CHANGED
@@ -2,6 +2,7 @@ module Minicron
|
|
2
2
|
autoload :Email, 'minicron/alert/email'
|
3
3
|
autoload :SMS, 'minicron/alert/sms'
|
4
4
|
autoload :PagerDuty, 'minicron/alert/pagerduty'
|
5
|
+
autoload :AwsSns, 'minicron/alert/aws_sns'
|
5
6
|
|
6
7
|
module Hub
|
7
8
|
autoload :Alert, 'minicron/hub/models/alert'
|
@@ -19,6 +20,10 @@ module Minicron
|
|
19
20
|
# @option options [Time] expected_at only applies to 'miss' alerts
|
20
21
|
def send_all(options = {})
|
21
22
|
Minicron.config['alerts'].each do |medium, value|
|
23
|
+
|
24
|
+
# Add the alert medium into the options hash so that it can be passed to sent?
|
25
|
+
options[:medium] = medium
|
26
|
+
|
22
27
|
# Check if the medium is enabled and alert hasn't already been sent
|
23
28
|
if value['enabled'] && !sent?(options)
|
24
29
|
send(
|
@@ -27,7 +32,7 @@ module Minicron
|
|
27
32
|
:execution_id => options[:execution_id],
|
28
33
|
:job_id => options[:job_id],
|
29
34
|
:expected_at => options[:expected_at],
|
30
|
-
:medium => medium
|
35
|
+
:medium => options[:medium]
|
31
36
|
)
|
32
37
|
end
|
33
38
|
end
|
@@ -53,6 +58,8 @@ module Minicron
|
|
53
58
|
send_sms(options)
|
54
59
|
when 'pagerduty'
|
55
60
|
send_pagerduty(options)
|
61
|
+
when 'aws_sns'
|
62
|
+
send_aws_sns(options)
|
56
63
|
else
|
57
64
|
fail Exception, "The medium '#{options[:medium]}' is not supported!"
|
58
65
|
end
|
@@ -99,6 +106,15 @@ module Minicron
|
|
99
106
|
)
|
100
107
|
end
|
101
108
|
|
109
|
+
# Send an aws sns alert, this has the same options as #send
|
110
|
+
def send_aws_sns(options = {})
|
111
|
+
sns = Minicron::AwsSns.new
|
112
|
+
sns.send(
|
113
|
+
"minicron alert for job '#{options[:job].name}'!",
|
114
|
+
sns.get_message(options)
|
115
|
+
)
|
116
|
+
end
|
117
|
+
|
102
118
|
# Queries the database to determine if an alert for this kind has already
|
103
119
|
# been sent
|
104
120
|
#
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'aws-sdk-core'
|
2
|
+
|
3
|
+
module Minicron
|
4
|
+
# Allows the sending of AWS SNS alerts
|
5
|
+
class AwsSns
|
6
|
+
# Used to set up on the AWS::SNS::Topic
|
7
|
+
def initialize
|
8
|
+
# Get an instance of the sns client
|
9
|
+
@client = Aws::SNS::Client.new({
|
10
|
+
:access_key_id => Minicron.config['alerts']['aws_sns']['access_key_id'],
|
11
|
+
:secret_access_key => Minicron.config['alerts']['aws_sns']['secret_access_key'],
|
12
|
+
:region => Minicron.config['alerts']['aws_sns']['region']
|
13
|
+
})
|
14
|
+
end
|
15
|
+
|
16
|
+
# Return the message for an alert
|
17
|
+
#
|
18
|
+
# @option options [Minicron::Hub::Job] job a job instance
|
19
|
+
# @option options [String] kind 'fail' or 'miss'
|
20
|
+
# @option options [Integer, nil] schedule_id only applies to 'miss' alerts
|
21
|
+
# @option options [Integer, nil] execution_id only used by 'fail' alerts
|
22
|
+
# @option options [Integer] job_id used to look up the job name for the alert message
|
23
|
+
# @option options [Time] expected_at when the schedule was expected to execute
|
24
|
+
# @option options [String] medium the medium to send the alert via
|
25
|
+
def get_message(options = {})
|
26
|
+
case options[:kind]
|
27
|
+
when 'miss'
|
28
|
+
"minicron alert - job missed!\nJob ##{options[:job_id]} failed to execute at its expected time: #{options[:expected_at]}"
|
29
|
+
when 'fail'
|
30
|
+
"minicron alert - job failed!\nExecution ##{options[:execution_id]} of Job ##{options[:job_id]} failed"
|
31
|
+
else
|
32
|
+
fail Exception, "The kind '#{options[:kind]} is not supported!"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Send an sns alert
|
37
|
+
#
|
38
|
+
# @param from [String]
|
39
|
+
# @param to [String]
|
40
|
+
# @param message [String]
|
41
|
+
def send(subject, message)
|
42
|
+
@client.publish(
|
43
|
+
:topic_arn => Minicron.config['alerts']['aws_sns']['topic_arn'],
|
44
|
+
:subject => subject,
|
45
|
+
:message => message
|
46
|
+
)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/minicron/constants.rb
CHANGED
@@ -31,7 +31,7 @@
|
|
31
31
|
// TODO: make this use a bootstrap model as a component
|
32
32
|
var results = 'Test Results\n\n';
|
33
33
|
results += 'connect: ' + data.connect + '\n';
|
34
|
-
results += '/etc writeable:
|
34
|
+
results += '/etc writeable: ' + data.etc.write + '\n';
|
35
35
|
results += '/etc executable: ' + data.etc.execute + '\n';
|
36
36
|
results += 'crontab readable: ' + data.crontab.read + '\n';
|
37
37
|
results += 'crontab writeable: ' + data.crontab.write;
|
data/lib/minicron/monitor.rb
CHANGED
@@ -108,8 +108,10 @@ module Minicron
|
|
108
108
|
expected_by = expected_at + 60
|
109
109
|
|
110
110
|
# We only need to check jobs that are expected to under the monitor start time
|
111
|
-
# and jobs that have passed their expected by time
|
112
|
-
|
111
|
+
# and jobs that have passed their expected by time and the time the schedule
|
112
|
+
# was last updated isn't before when it was expected, i.e we aren't checking for something
|
113
|
+
# that should have happened earlier in the day.
|
114
|
+
if expected_at > @start_time && Time.now > expected_by && expected_by > schedule.updated_at
|
113
115
|
# Check if this execution was created inside a minute window
|
114
116
|
# starting when it was expected to run
|
115
117
|
check = Minicron::Hub::Execution.exists?(
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'minicron/alert/aws_sns'
|
3
|
+
|
4
|
+
describe Minicron::AwsSns do
|
5
|
+
before (:each) do
|
6
|
+
Minicron.parse_config_hash({
|
7
|
+
'alerts' => {
|
8
|
+
'aws_sns' => {
|
9
|
+
'secret_access_key' => 'fd;sflksk;lfsdlfksdfsd',
|
10
|
+
'access_key_id' => 'fdsfsdfsdfsd',
|
11
|
+
'region' => 'us-west-2',
|
12
|
+
'topic_arn' => 'arn:aws:sns:us-west-2:2342423423:yo'
|
13
|
+
}
|
14
|
+
}
|
15
|
+
})
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#intiailize' do
|
19
|
+
it 'should create an instance of the SNS gem' do
|
20
|
+
sns = Minicron::AwsSns.new
|
21
|
+
|
22
|
+
expect(sns.instance_variable_get(:@client)).to be_a Aws::SNS::Client
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#get_message' do
|
27
|
+
context 'when kind is miss' do
|
28
|
+
it 'should return the correct message' do
|
29
|
+
sns = Minicron::AwsSns.new
|
30
|
+
time = Time.now.utc
|
31
|
+
options = {
|
32
|
+
:job_id => 1,
|
33
|
+
:expected_at => time,
|
34
|
+
:execution_id => 2,
|
35
|
+
:kind => 'miss'
|
36
|
+
}
|
37
|
+
message = "minicron alert - job missed!\nJob #1 failed to execute at its expected time: #{time}"
|
38
|
+
|
39
|
+
expect(sns.get_message(options)).to eq message
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'when kind is fail' do
|
44
|
+
it 'should return the correct message' do
|
45
|
+
sns = Minicron::AwsSns.new
|
46
|
+
options = {
|
47
|
+
:job_id => 1,
|
48
|
+
:execution_id => 2,
|
49
|
+
:kind => 'fail'
|
50
|
+
}
|
51
|
+
message = "minicron alert - job failed!\nExecution #2 of Job #1 failed"
|
52
|
+
|
53
|
+
expect(sns.get_message(options)).to eq message
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'when kind is not supported' do
|
58
|
+
it 'should raise an Exception' do
|
59
|
+
sns = Minicron::AwsSns.new
|
60
|
+
options = {
|
61
|
+
:kind => 'derp'
|
62
|
+
}
|
63
|
+
|
64
|
+
expect do
|
65
|
+
sns.get_message(options)
|
66
|
+
end.to raise_error Exception
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe '#send' do
|
72
|
+
it 'sends message to the topic_arn' do
|
73
|
+
sns = Minicron::AwsSns.new
|
74
|
+
subject = 'subject'
|
75
|
+
message = 'message'
|
76
|
+
expect_any_instance_of(Aws::SNS::Client).to receive(:publish).with(
|
77
|
+
topic_arn: Minicron.config['alerts']['aws_sns']['topic_arn'],
|
78
|
+
subject: subject,
|
79
|
+
message: message
|
80
|
+
)
|
81
|
+
|
82
|
+
sns.send(subject, message)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'minicron/alert'
|
3
|
+
require 'minicron/alert/aws_sns'
|
4
|
+
|
5
|
+
describe Minicron::Alert do
|
6
|
+
describe '#send' do
|
7
|
+
context 'when medium is AWS SNS' do
|
8
|
+
it 'sends message' do
|
9
|
+
alert = Minicron::Alert.new
|
10
|
+
allow(Minicron::Hub::Job).to receive(:find).and_return(nil)
|
11
|
+
allow(Minicron::Hub::Alert).to receive(:create).and_return(nil)
|
12
|
+
expect_any_instance_of(Minicron::Alert).to receive(:send_aws_sns)
|
13
|
+
|
14
|
+
alert.send({
|
15
|
+
:medium => 'aws_sns',
|
16
|
+
:job_id => 1
|
17
|
+
})
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/spec/minicron_spec.rb
CHANGED
data/spec/valid_config.toml
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: minicron
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James White
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06-
|
11
|
+
date: 2015-06-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rainbow
|
@@ -416,6 +416,20 @@ dependencies:
|
|
416
416
|
- - "~>"
|
417
417
|
- !ruby/object:Gem::Version
|
418
418
|
version: '1.1'
|
419
|
+
- !ruby/object:Gem::Dependency
|
420
|
+
name: aws-sdk
|
421
|
+
requirement: !ruby/object:Gem::Requirement
|
422
|
+
requirements:
|
423
|
+
- - "~>"
|
424
|
+
- !ruby/object:Gem::Version
|
425
|
+
version: '2.1'
|
426
|
+
type: :runtime
|
427
|
+
prerelease: false
|
428
|
+
version_requirements: !ruby/object:Gem::Requirement
|
429
|
+
requirements:
|
430
|
+
- - "~>"
|
431
|
+
- !ruby/object:Gem::Version
|
432
|
+
version: '2.1'
|
419
433
|
- !ruby/object:Gem::Dependency
|
420
434
|
name: bundler
|
421
435
|
requirement: !ruby/object:Gem::Requirement
|
@@ -472,6 +486,66 @@ dependencies:
|
|
472
486
|
- - "~>"
|
473
487
|
- !ruby/object:Gem::Version
|
474
488
|
version: '0.8'
|
489
|
+
- !ruby/object:Gem::Dependency
|
490
|
+
name: guard
|
491
|
+
requirement: !ruby/object:Gem::Requirement
|
492
|
+
requirements:
|
493
|
+
- - "~>"
|
494
|
+
- !ruby/object:Gem::Version
|
495
|
+
version: '2.12'
|
496
|
+
- - ">="
|
497
|
+
- !ruby/object:Gem::Version
|
498
|
+
version: 2.12.6
|
499
|
+
type: :development
|
500
|
+
prerelease: false
|
501
|
+
version_requirements: !ruby/object:Gem::Requirement
|
502
|
+
requirements:
|
503
|
+
- - "~>"
|
504
|
+
- !ruby/object:Gem::Version
|
505
|
+
version: '2.12'
|
506
|
+
- - ">="
|
507
|
+
- !ruby/object:Gem::Version
|
508
|
+
version: 2.12.6
|
509
|
+
- !ruby/object:Gem::Dependency
|
510
|
+
name: guard-rspec
|
511
|
+
requirement: !ruby/object:Gem::Requirement
|
512
|
+
requirements:
|
513
|
+
- - "~>"
|
514
|
+
- !ruby/object:Gem::Version
|
515
|
+
version: '4.5'
|
516
|
+
- - ">="
|
517
|
+
- !ruby/object:Gem::Version
|
518
|
+
version: 4.5.2
|
519
|
+
type: :development
|
520
|
+
prerelease: false
|
521
|
+
version_requirements: !ruby/object:Gem::Requirement
|
522
|
+
requirements:
|
523
|
+
- - "~>"
|
524
|
+
- !ruby/object:Gem::Version
|
525
|
+
version: '4.5'
|
526
|
+
- - ">="
|
527
|
+
- !ruby/object:Gem::Version
|
528
|
+
version: 4.5.2
|
529
|
+
- !ruby/object:Gem::Dependency
|
530
|
+
name: guard-bundler
|
531
|
+
requirement: !ruby/object:Gem::Requirement
|
532
|
+
requirements:
|
533
|
+
- - "~>"
|
534
|
+
- !ruby/object:Gem::Version
|
535
|
+
version: '2.1'
|
536
|
+
- - ">="
|
537
|
+
- !ruby/object:Gem::Version
|
538
|
+
version: 2.1.0
|
539
|
+
type: :development
|
540
|
+
prerelease: false
|
541
|
+
version_requirements: !ruby/object:Gem::Requirement
|
542
|
+
requirements:
|
543
|
+
- - "~>"
|
544
|
+
- !ruby/object:Gem::Version
|
545
|
+
version: '2.1'
|
546
|
+
- - ">="
|
547
|
+
- !ruby/object:Gem::Version
|
548
|
+
version: 2.1.0
|
475
549
|
description:
|
476
550
|
email:
|
477
551
|
- dev.jameswhite+minicron@gmail.com
|
@@ -486,6 +560,7 @@ files:
|
|
486
560
|
- bin/minicron
|
487
561
|
- lib/minicron.rb
|
488
562
|
- lib/minicron/alert.rb
|
563
|
+
- lib/minicron/alert/aws_sns.rb
|
489
564
|
- lib/minicron/alert/email.rb
|
490
565
|
- lib/minicron/alert/pagerduty.rb
|
491
566
|
- lib/minicron/alert/sms.rb
|
@@ -573,8 +648,10 @@ files:
|
|
573
648
|
- lib/minicron/transport/server.rb
|
574
649
|
- lib/minicron/transport/ssh.rb
|
575
650
|
- spec/invalid_config.toml
|
651
|
+
- spec/minicron/alert/aws_sns_spec.rb
|
576
652
|
- spec/minicron/alert/pagerduty_spec.rb
|
577
653
|
- spec/minicron/alert/sms_spec.rb
|
654
|
+
- spec/minicron/alert_spec.rb
|
578
655
|
- spec/minicron/cli_spec.rb
|
579
656
|
- spec/minicron/transport/client_spec.rb
|
580
657
|
- spec/minicron/transport/faye/client_spec.rb
|
@@ -613,8 +690,10 @@ specification_version: 4
|
|
613
690
|
summary: A system to make it easier to manage and monitor cron jobs
|
614
691
|
test_files:
|
615
692
|
- spec/invalid_config.toml
|
693
|
+
- spec/minicron/alert/aws_sns_spec.rb
|
616
694
|
- spec/minicron/alert/pagerduty_spec.rb
|
617
695
|
- spec/minicron/alert/sms_spec.rb
|
696
|
+
- spec/minicron/alert_spec.rb
|
618
697
|
- spec/minicron/cli_spec.rb
|
619
698
|
- spec/minicron/transport/client_spec.rb
|
620
699
|
- spec/minicron/transport/faye/client_spec.rb
|