minicron 0.7.7 → 0.7.8
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Gem Version](http://img.shields.io/gem/v/minicron.svg)](https://rubygems.org/gems/minicron)
|
5
5
|
[![Build Status](http://img.shields.io/travis/jamesrwhite/minicron.svg)](http://travis-ci.org/jamesrwhite/minicron)
|
6
|
-
[![Coverage Status](
|
6
|
+
[![Coverage Status](https://coveralls.io/repos/jamesrwhite/minicron/badge.svg?branch=develop)](https://coveralls.io/r/jamesrwhite/minicron?branch=develop)
|
7
7
|
[![Code Climate](http://img.shields.io/codeclimate/github/jamesrwhite/minicron.svg)](https://codeclimate.com/github/jamesrwhite/minicron)
|
8
8
|
[![Dependency Status](http://img.shields.io/gemnasium/jamesrwhite/minicron.svg)](https://gemnasium.com/jamesrwhite/minicron)
|
9
9
|
[![Inline docs](http://inch-ci.org/github/jamesrwhite/minicron.png)](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
|