eye-patch 0.5.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.hound.yml +2 -0
- data/.rubocop.yml +46 -0
- data/.rubocop_todo.yml +22 -0
- data/Gemfile +3 -1
- data/Rakefile +2 -0
- data/bin/eye-patch +2 -1
- data/bin/eye-patch-loader +13 -12
- data/eye-patch.gemspec +12 -8
- data/lib/eye/notify/awssdk.rb +17 -11
- data/lib/eye/notify/datadog.rb +17 -13
- data/lib/eye/notify/ses.rb +9 -4
- data/lib/eye/patch.rb +9 -1
- data/lib/eye/patch/application.rb +6 -1
- data/lib/eye/patch/capistrano.rb +2 -2
- data/lib/eye/patch/capistrano3.rb +2 -2
- data/lib/eye/patch/config.rb +6 -2
- data/lib/eye/patch/group_set.rb +7 -2
- data/lib/eye/patch/option_set.rb +5 -0
- data/lib/eye/patch/overrides.rb +24 -24
- data/lib/eye/patch/process_set.rb +14 -5
- data/lib/eye/patch/settings.rb +7 -2
- data/lib/eye/patch/value_parser.rb +9 -6
- data/lib/eye/patch/version.rb +7 -1
- data/test/lib/eye/patch/settings_test.rb +6 -0
- data/test/lib/eye/patch/value_parser_test.rb +2 -1
- data/test/lib/eye/patch/version_test.rb +2 -1
- data/test/lib/eye/patch_test.rb +14 -11
- data/test/test_helper.rb +3 -1
- metadata +28 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f040c35d2b8df2e0be5a9c2cdaf839187a438882
|
4
|
+
data.tar.gz: b8966ebf6aff7d2a03f6d34a790010864b6c9491
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 833f95e305b8af149028dab3356565e7c302358f6d8d8eab4ef5439786529d3e0de915e5f5da8a9b235c1f45e8b994fa67aaf0104930b8361c03f7de33083474
|
7
|
+
data.tar.gz: 7177aeee067ff241387f13f8dedb3d150b1cced75cf1089171fea952ac68e9edf7a1fd370b352b88f0b90caa701dc1676f51be476bc7000a3d2db279e6e41699
|
data/.hound.yml
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.4.2
|
3
|
+
|
4
|
+
inherit_from: .rubocop_todo.yml
|
5
|
+
|
6
|
+
Layout/EmptyLinesAroundClassBody:
|
7
|
+
EnforcedStyle: empty_lines
|
8
|
+
|
9
|
+
Layout/EmptyLinesAroundModuleBody:
|
10
|
+
EnforcedStyle: empty_lines
|
11
|
+
|
12
|
+
Layout/MultilineMethodCallIndentation:
|
13
|
+
EnforcedStyle: indented
|
14
|
+
|
15
|
+
Metrics/BlockLength:
|
16
|
+
Exclude:
|
17
|
+
- lib/eye/patch/capistrano.rb
|
18
|
+
- lib/eye/patch/capistrano3.rb
|
19
|
+
- lib/eye/patch/overrides.rb
|
20
|
+
- test/**/*.rb
|
21
|
+
|
22
|
+
Metrics/CyclomaticComplexity:
|
23
|
+
Exclude:
|
24
|
+
- lib/eye/patch/overrides.rb
|
25
|
+
|
26
|
+
Metrics/PerceivedComplexity:
|
27
|
+
Exclude:
|
28
|
+
- lib/eye/patch/overrides.rb
|
29
|
+
|
30
|
+
Style/Documentation:
|
31
|
+
Enabled: false
|
32
|
+
|
33
|
+
Style/StringLiterals:
|
34
|
+
EnforcedStyle: double_quotes
|
35
|
+
|
36
|
+
Style/ClassAndModuleChildren:
|
37
|
+
Enabled: false
|
38
|
+
|
39
|
+
Style/TrailingCommaInArguments:
|
40
|
+
EnforcedStyleForMultiline: comma
|
41
|
+
|
42
|
+
Style/TrailingCommaInArrayLiteral:
|
43
|
+
EnforcedStyleForMultiline: comma
|
44
|
+
|
45
|
+
Style/TrailingCommaInHashLiteral:
|
46
|
+
EnforcedStyleForMultiline: comma
|
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# This configuration was generated by
|
2
|
+
# `rubocop --auto-gen-config`
|
3
|
+
# on 2018-04-04 14:04:52 -0600 using RuboCop version 0.54.0.
|
4
|
+
# The point is for the user to remove these configuration records
|
5
|
+
# one by one as the offenses are removed from the code base.
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
8
|
+
|
9
|
+
# Offense count: 5
|
10
|
+
Metrics/AbcSize:
|
11
|
+
Max: 40
|
12
|
+
|
13
|
+
# Offense count: 7
|
14
|
+
# Configuration parameters: CountComments.
|
15
|
+
Metrics/MethodLength:
|
16
|
+
Max: 25
|
17
|
+
|
18
|
+
# Offense count: 32
|
19
|
+
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
20
|
+
# URISchemes: http, https
|
21
|
+
Metrics/LineLength:
|
22
|
+
Max: 183
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
data/bin/eye-patch
CHANGED
data/bin/eye-patch-loader
CHANGED
@@ -1,33 +1,34 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), %w[.. lib]))
|
3
5
|
require "eye/loader"
|
4
6
|
require "optparse"
|
5
7
|
require "eye/patch"
|
6
8
|
|
7
|
-
options = {:
|
9
|
+
options = { debug: false }
|
8
10
|
|
9
11
|
OptionParser.new do |opts|
|
10
|
-
opts.on(
|
12
|
+
opts.on("-h", "--help", "Display this screen") do
|
11
13
|
puts opts
|
12
14
|
exit
|
13
15
|
end
|
14
16
|
|
15
|
-
opts.on(
|
17
|
+
opts.on("-c", "--config CONFIG", "load with config") do |config_path|
|
16
18
|
options[:config] = config_path
|
17
19
|
end
|
18
20
|
|
19
|
-
opts.on(
|
21
|
+
opts.on("-s", "--socket SOCKET", "start listen on socket") do |socket_path|
|
20
22
|
options[:socket_path] = socket_path
|
21
23
|
end
|
22
24
|
|
23
|
-
opts.on(
|
25
|
+
opts.on("-l", "--logger LOGGER", "custom logger") do |logger|
|
24
26
|
options[:logger] = logger
|
25
27
|
end
|
26
28
|
|
27
|
-
opts.on(
|
29
|
+
opts.on("-d", "--debug", "debug info to logger") do
|
28
30
|
options[:debug] = true
|
29
31
|
end
|
30
|
-
|
31
32
|
end.parse!
|
32
33
|
|
33
34
|
Eye::Local.ensure_eye_dir
|
@@ -42,7 +43,7 @@ config = options[:config]
|
|
42
43
|
config = File.expand_path(config) if config && !config.empty?
|
43
44
|
|
44
45
|
if config
|
45
|
-
res = server.command(
|
46
|
+
res = server.command("load", config)
|
46
47
|
exit if res.values.any? { |r| r[:error] }
|
47
48
|
end
|
48
49
|
|
@@ -50,8 +51,8 @@ Eye::Control.set_proc_line
|
|
50
51
|
|
51
52
|
server.async.run
|
52
53
|
|
53
|
-
trap("INT"){ exit }
|
54
|
-
trap("USR1"){ Eye::Logger.reopen }
|
55
|
-
trap("USR2"){ GC.start }
|
54
|
+
trap("INT") { exit }
|
55
|
+
trap("USR1") { Eye::Logger.reopen }
|
56
|
+
trap("USR2") { GC.start }
|
56
57
|
|
57
58
|
sleep
|
data/eye-patch.gemspec
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path("lib", __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require "eye/patch/version"
|
5
6
|
|
@@ -9,23 +10,26 @@ Gem::Specification.new do |spec|
|
|
9
10
|
spec.authors = ["Andrew Horner"]
|
10
11
|
spec.email = ["andrew@tablexi.com"]
|
11
12
|
spec.description = "Easily load your eye configuration from a YAML file."
|
12
|
-
spec.summary =
|
13
|
+
spec.summary = "
|
13
14
|
Eye::Patch abstracts out the Eye DSL to allow you to load your configuration
|
14
15
|
from a structured YAML file, rather than relying on Eye's built-in DSL.
|
15
|
-
|
16
|
+
"
|
16
17
|
spec.homepage = "https://github.com/tablexi/eye-patch"
|
17
18
|
spec.license = "MIT"
|
18
19
|
|
19
|
-
spec.files = `git ls-files`.split(
|
20
|
+
spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
20
21
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
21
22
|
spec.test_files = spec.files.grep(%r{^test/})
|
22
23
|
spec.require_paths = ["lib"]
|
23
24
|
|
24
|
-
spec.
|
25
|
+
spec.required_ruby_version = ">= 2.4.2"
|
26
|
+
|
25
27
|
spec.add_dependency "chronic_duration"
|
28
|
+
spec.add_dependency "eye", ">= 0.6.2"
|
26
29
|
|
27
30
|
spec.add_development_dependency "bundler", "~> 1.3"
|
28
|
-
spec.add_development_dependency "rake"
|
29
|
-
spec.add_development_dependency "mocha"
|
30
31
|
spec.add_development_dependency "minitest"
|
32
|
+
spec.add_development_dependency "mocha"
|
33
|
+
spec.add_development_dependency "rake"
|
34
|
+
spec.add_development_dependency "rubocop"
|
31
35
|
end
|
data/lib/eye/notify/awssdk.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require "aws-sdk-core"
|
3
4
|
|
4
5
|
begin
|
@@ -10,8 +11,11 @@ rescue LoadError
|
|
10
11
|
end
|
11
12
|
|
12
13
|
module Eye
|
14
|
+
|
13
15
|
class Notify
|
16
|
+
|
14
17
|
class AWSSDK < Eye::Notify
|
18
|
+
|
15
19
|
param :region, String
|
16
20
|
param :access_key_id, String
|
17
21
|
param :secret_access_key, String
|
@@ -20,33 +24,35 @@ module Eye
|
|
20
24
|
def execute
|
21
25
|
options = { region: "us-east-1" } # default to us-east-1
|
22
26
|
options[:region] = region if region
|
23
|
-
if access_key_id && secret_access_key
|
24
|
-
options[:credentials] = Aws::Credentials.new(access_key_id, secret_access_key)
|
25
|
-
end
|
27
|
+
options[:credentials] = Aws::Credentials.new(access_key_id, secret_access_key) if access_key_id && secret_access_key
|
26
28
|
client = Aws::SES::Client.new(options)
|
27
29
|
client.send_email(message)
|
28
30
|
end
|
29
31
|
|
30
32
|
def message
|
31
|
-
{
|
33
|
+
{
|
34
|
+
source: from,
|
32
35
|
destination: {
|
33
|
-
to_addresses: [contact]
|
36
|
+
to_addresses: [contact],
|
34
37
|
},
|
35
38
|
message: {
|
36
39
|
subject: {
|
37
|
-
data: message_subject
|
40
|
+
data: message_subject,
|
38
41
|
},
|
39
42
|
body: {
|
40
43
|
text: {
|
41
|
-
data: message_body
|
44
|
+
data: message_body,
|
42
45
|
},
|
43
46
|
html: {
|
44
|
-
data: message_body
|
45
|
-
}
|
46
|
-
}
|
47
|
-
}
|
47
|
+
data: message_body,
|
48
|
+
},
|
49
|
+
},
|
50
|
+
},
|
48
51
|
}
|
49
52
|
end
|
53
|
+
|
50
54
|
end
|
55
|
+
|
51
56
|
end
|
57
|
+
|
52
58
|
end
|
data/lib/eye/notify/datadog.rb
CHANGED
@@ -3,8 +3,11 @@
|
|
3
3
|
require "dogapi"
|
4
4
|
|
5
5
|
module Eye
|
6
|
+
|
6
7
|
class Notify
|
8
|
+
|
7
9
|
class DataDog < Eye::Notify
|
10
|
+
|
8
11
|
param :aggregation_key, String
|
9
12
|
param :alert_type, String
|
10
13
|
param :api_key, String, true
|
@@ -16,7 +19,7 @@ module Eye
|
|
16
19
|
alert_type: "error",
|
17
20
|
aggregation_key: msg_host + msg_full_name,
|
18
21
|
source_type: "None",
|
19
|
-
tags: ["eye"]
|
22
|
+
tags: ["eye"],
|
20
23
|
}
|
21
24
|
|
22
25
|
options[:alert_type] = alert_type if alert_type
|
@@ -24,20 +27,21 @@ module Eye
|
|
24
27
|
options[:source_type] = source_type if source_type
|
25
28
|
options[:tags] = tags if tags
|
26
29
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
host: msg_host,
|
36
|
-
source_type: options[:source_type],
|
37
|
-
tags: options[:tags]
|
38
|
-
)
|
30
|
+
event = Dogapi::Event.new(
|
31
|
+
message_body,
|
32
|
+
aggregation_key: options[:aggregation_key],
|
33
|
+
alert_type: options[:alert_type],
|
34
|
+
msg_title: message_subject,
|
35
|
+
host: msg_host,
|
36
|
+
source_type: options[:source_type],
|
37
|
+
tags: options[:tags],
|
39
38
|
)
|
39
|
+
|
40
|
+
Dogapi::Client.new(api_key).emit_event(event)
|
40
41
|
end
|
42
|
+
|
41
43
|
end
|
44
|
+
|
42
45
|
end
|
46
|
+
|
43
47
|
end
|
data/lib/eye/notify/ses.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require "aws/ses"
|
3
4
|
|
4
5
|
class Eye::Notify::SES < Eye::Notify
|
@@ -9,14 +10,18 @@ class Eye::Notify::SES < Eye::Notify
|
|
9
10
|
|
10
11
|
def execute
|
11
12
|
AWS::SES::Base.new(
|
12
|
-
access_key_id:
|
13
|
-
secret_access_key: secret_access_key
|
13
|
+
access_key_id: access_key_id,
|
14
|
+
secret_access_key: secret_access_key,
|
15
|
+
).send_email(message)
|
14
16
|
end
|
15
17
|
|
16
18
|
def message
|
17
|
-
{
|
19
|
+
{
|
20
|
+
to: contact,
|
18
21
|
from: from,
|
19
22
|
subject: message_subject,
|
20
|
-
text_body: message_body
|
23
|
+
text_body: message_body,
|
24
|
+
}
|
21
25
|
end
|
26
|
+
|
22
27
|
end
|
data/lib/eye/patch.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "eye"
|
2
4
|
require "eye/patch/overrides"
|
3
5
|
|
@@ -6,11 +8,15 @@ Eye::Notify::TYPES[:aws_sdk] = "AWSSDK"
|
|
6
8
|
Eye::Notify::TYPES[:datadog] = "DataDog"
|
7
9
|
|
8
10
|
module Eye
|
11
|
+
|
9
12
|
class Notify
|
13
|
+
|
10
14
|
autoload :SES, "eye/notify/ses"
|
11
15
|
autoload :AWSSDK, "eye/notify/awssdk"
|
12
16
|
autoload :DataDog, "eye/notify/datadog"
|
17
|
+
|
13
18
|
end
|
19
|
+
|
14
20
|
end
|
15
21
|
|
16
22
|
module Eye::Patch
|
@@ -25,7 +31,8 @@ module Eye::Patch
|
|
25
31
|
|
26
32
|
config = ::Eye::Config.new(
|
27
33
|
Config.new(settings),
|
28
|
-
Application.new(settings)
|
34
|
+
Application.new(settings),
|
35
|
+
)
|
29
36
|
config.validate!
|
30
37
|
|
31
38
|
config.applications.values.each do |application|
|
@@ -35,4 +42,5 @@ module Eye::Patch
|
|
35
42
|
|
36
43
|
config
|
37
44
|
end
|
45
|
+
|
38
46
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative "group_set"
|
2
4
|
require_relative "option_set"
|
3
5
|
|
@@ -25,7 +27,8 @@ module Eye::Patch
|
|
25
27
|
name: @settings[:name],
|
26
28
|
notify: notifications,
|
27
29
|
triggers: triggers,
|
28
|
-
checks: checks
|
30
|
+
checks: checks,
|
31
|
+
)
|
29
32
|
end
|
30
33
|
|
31
34
|
def parse_processes
|
@@ -45,5 +48,7 @@ module Eye::Patch
|
|
45
48
|
def checks
|
46
49
|
OptionSet.new(Eye::Checker, @settings[:checks])
|
47
50
|
end
|
51
|
+
|
48
52
|
end
|
53
|
+
|
49
54
|
end
|
data/lib/eye/patch/capistrano.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
+
Capistrano::Configuration.instance.load do
|
3
4
|
_cset(:eye_default_hooks) { true }
|
4
5
|
_cset(:eye_config) { "config/eye.yml" }
|
5
6
|
_cset(:eye_bin) { "bundle exec eye-patch" }
|
@@ -12,7 +13,6 @@ Capistrano::Configuration.instance.load do
|
|
12
13
|
end
|
13
14
|
|
14
15
|
namespace :eye do
|
15
|
-
|
16
16
|
desc "Start eye with the desired configuration file"
|
17
17
|
task :load_config, roles: -> { fetch(:eye_roles) } do
|
18
18
|
run "cd #{current_path} && #{fetch(:eye_bin)} quit"
|
@@ -1,5 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
+
namespace :load do
|
3
4
|
task :defaults do
|
4
5
|
set :eye_config, -> { "config/eye.yml" }
|
5
6
|
set :eye_bin, -> { "eye-patch" }
|
@@ -13,7 +14,6 @@ namespace :load do
|
|
13
14
|
end
|
14
15
|
|
15
16
|
namespace :eye do
|
16
|
-
|
17
17
|
desc "Start eye with the desired configuration file"
|
18
18
|
task :load_config do
|
19
19
|
on roles(fetch(:eye_roles)) do
|
data/lib/eye/patch/config.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Eye::Patch::Config < Hash
|
2
4
|
|
3
5
|
def initialize(settings)
|
4
6
|
super()
|
5
|
-
|
7
|
+
merge!(parse(settings))
|
6
8
|
end
|
7
9
|
|
8
10
|
private
|
@@ -29,7 +31,9 @@ class Eye::Patch::Config < Hash
|
|
29
31
|
name: notify[:name].to_s,
|
30
32
|
type: notify[:type].to_sym,
|
31
33
|
contact: notify[:contact].to_s,
|
32
|
-
opts: {}
|
34
|
+
opts: {},
|
35
|
+
}
|
33
36
|
end
|
34
37
|
end
|
38
|
+
|
35
39
|
end
|
data/lib/eye/patch/group_set.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative "process_set"
|
2
4
|
|
3
5
|
module Eye::Patch
|
@@ -7,7 +9,7 @@ module Eye::Patch
|
|
7
9
|
def initialize(application, processes)
|
8
10
|
@application = application
|
9
11
|
|
10
|
-
Array(processes).group_by{ |item| item[:group] }.each do |group_name, items|
|
12
|
+
Array(processes).group_by { |item| item[:group] }.each do |group_name, items|
|
11
13
|
name = group_name || "__default__"
|
12
14
|
parse_group(name, items)
|
13
15
|
end
|
@@ -18,9 +20,12 @@ module Eye::Patch
|
|
18
20
|
def parse_group(name, processes)
|
19
21
|
self[name] = @application.merge(
|
20
22
|
name: name,
|
21
|
-
application: @application[:name]
|
23
|
+
application: @application[:name],
|
24
|
+
)
|
22
25
|
|
23
26
|
self[name][:processes] = ProcessSet.new(self[name], processes)
|
24
27
|
end
|
28
|
+
|
25
29
|
end
|
30
|
+
|
26
31
|
end
|
data/lib/eye/patch/option_set.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Eye::Patch
|
4
|
+
|
2
5
|
class OptionSet < Hash
|
3
6
|
|
4
7
|
def initialize(option_class, options)
|
@@ -7,5 +10,7 @@ module Eye::Patch
|
|
7
10
|
self[option_data[:name]] = option[:config].merge(type: option_data[:type])
|
8
11
|
end
|
9
12
|
end
|
13
|
+
|
10
14
|
end
|
15
|
+
|
11
16
|
end
|
data/lib/eye/patch/overrides.rb
CHANGED
@@ -1,62 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
Eye::Cli.class_eval do
|
2
4
|
private
|
3
5
|
|
4
6
|
def loader_path
|
5
7
|
filename = File.expand_path(File.join(File.dirname(__FILE__), %w[.. .. .. bin eye-patch-loader]))
|
6
|
-
File.
|
8
|
+
File.exist?(filename) ? filename : nil
|
7
9
|
end
|
8
10
|
end
|
9
11
|
|
10
12
|
require "eye/utils/mini_active_support"
|
11
13
|
Eye::Process.class_eval do
|
12
|
-
|
13
14
|
def daemonize_process
|
14
|
-
time_before = Time.now
|
15
15
|
res = Eye::System.daemonize(self[:start_command], config)
|
16
|
-
start_time = Time.now - time_before
|
17
16
|
|
18
17
|
info "daemonizing: `#{self[:start_command]}` with start_grace: #{self[:start_grace].to_f}s, env: #{self[:environment].inspect}, working_dir: #{self[:working_dir]}, <#{res[:pid]}>"
|
19
18
|
|
20
19
|
if res[:error]
|
21
|
-
|
22
|
-
if res[:error].message == 'Permission denied - open'
|
20
|
+
if res[:error].message == "Permission denied - open"
|
23
21
|
error "daemonize failed with #{res[:error].inspect}; make sure #{[self[:stdout], self[:stderr]]} are writable"
|
24
22
|
else
|
25
23
|
error "daemonize failed with #{res[:error].inspect}"
|
26
24
|
end
|
27
25
|
|
28
|
-
return {:
|
26
|
+
return { error: res[:error].inspect }
|
29
27
|
end
|
30
28
|
|
31
29
|
self.pid = res[:pid]
|
32
30
|
|
33
|
-
unless
|
34
|
-
error
|
35
|
-
return {:
|
31
|
+
unless pid
|
32
|
+
error "no pid was returned"
|
33
|
+
return { error: :empty_pid }
|
36
34
|
end
|
37
35
|
|
38
36
|
sleep_grace(:start_grace)
|
39
37
|
|
40
38
|
unless process_really_running?
|
41
|
-
error "process <#{
|
42
|
-
return {:
|
39
|
+
error "process <#{pid}> not found, it may have crashed (#{check_logs_str})"
|
40
|
+
return { error: :not_really_running }
|
43
41
|
end
|
44
42
|
|
45
43
|
if !self[:smart_pid] && !failsafe_save_pid
|
46
|
-
error "expected to manage pidfile for process <#{
|
47
|
-
return {:
|
44
|
+
error "expected to manage pidfile for process <#{pid}>; pidfile is unwritable"
|
45
|
+
return { error: :cant_write_pid }
|
48
46
|
end
|
49
47
|
|
50
48
|
res
|
51
49
|
end
|
52
50
|
|
53
51
|
def control_pid?
|
54
|
-
!!self[:daemonize] && !self[:smart_pid]
|
52
|
+
!!self[:daemonize] && !self[:smart_pid] # rubocop:disable Style/DoubleNegation
|
55
53
|
end
|
56
54
|
end
|
57
55
|
|
58
56
|
Eye::System.class_eval do
|
59
57
|
class << self
|
58
|
+
|
60
59
|
alias_method :daemonize_without_hook, :daemonize
|
61
60
|
alias_method :exec_without_hook, :exec
|
62
61
|
|
@@ -75,11 +74,12 @@ Eye::System.class_eval do
|
|
75
74
|
def spawn_options(config = {})
|
76
75
|
options = {
|
77
76
|
pgroup: true,
|
78
|
-
chdir: config[:working_dir] ||
|
79
|
-
close_others: !config[:preserve_fds]
|
77
|
+
chdir: config[:working_dir] || "/",
|
78
|
+
close_others: !config[:preserve_fds],
|
79
|
+
}
|
80
80
|
|
81
|
-
options[:out] = [config[:stdout],
|
82
|
-
options[:err] = [config[:stderr],
|
81
|
+
options[:out] = [config[:stdout], "a"] if config[:stdout]
|
82
|
+
options[:err] = [config[:stderr], "a"] if config[:stderr]
|
83
83
|
options[:in] = config[:stdin] if config[:stdin]
|
84
84
|
options[:umask] = config[:umask] if config[:umask]
|
85
85
|
|
@@ -90,17 +90,17 @@ Eye::System.class_eval do
|
|
90
90
|
|
91
91
|
options
|
92
92
|
end
|
93
|
+
|
93
94
|
end
|
94
95
|
end
|
95
96
|
|
96
97
|
Eye::Controller.class_eval do
|
97
|
-
|
98
98
|
def invoke_spawn_callback
|
99
99
|
debug "Attempting before_spawn hook"
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
100
|
+
return unless respond_to?(:before_spawn)
|
101
|
+
|
102
|
+
debug "Invoking before_spawn hook"
|
103
|
+
before_spawn
|
104
104
|
end
|
105
105
|
|
106
106
|
private
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Eye::Patch
|
2
4
|
|
3
5
|
class ProcessSet < Hash
|
@@ -19,7 +21,8 @@ module Eye::Patch
|
|
19
21
|
parse_single_process(
|
20
22
|
process[:name],
|
21
23
|
process[:config],
|
22
|
-
process_monitors(process)
|
24
|
+
process_monitors(process),
|
25
|
+
)
|
23
26
|
end
|
24
27
|
end
|
25
28
|
|
@@ -29,7 +32,8 @@ module Eye::Patch
|
|
29
32
|
parse_single_process(
|
30
33
|
name,
|
31
34
|
indexed_config(process[:config], index),
|
32
|
-
process_monitors(process)
|
35
|
+
process_monitors(process),
|
36
|
+
)
|
33
37
|
end
|
34
38
|
end
|
35
39
|
|
@@ -47,7 +51,8 @@ module Eye::Patch
|
|
47
51
|
|
48
52
|
monitor_options = OptionSet.new(
|
49
53
|
Eye::Checker,
|
50
|
-
config[:monitor_children][:checks]
|
54
|
+
config[:monitor_children][:checks],
|
55
|
+
)
|
51
56
|
|
52
57
|
self[name][:monitor_children][:checks] = monitor_options
|
53
58
|
end
|
@@ -59,8 +64,12 @@ module Eye::Patch
|
|
59
64
|
end
|
60
65
|
|
61
66
|
def process_monitors(config)
|
62
|
-
{
|
63
|
-
|
67
|
+
{
|
68
|
+
triggers: OptionSet.new(Eye::Trigger, config[:triggers]),
|
69
|
+
checks: OptionSet.new(Eye::Checker, config[:checks]),
|
70
|
+
}
|
64
71
|
end
|
72
|
+
|
65
73
|
end
|
74
|
+
|
66
75
|
end
|
data/lib/eye/patch/settings.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "erb"
|
2
4
|
require "forwardable"
|
3
5
|
require_relative "value_parser"
|
@@ -5,6 +7,7 @@ require_relative "value_parser"
|
|
5
7
|
module Eye::Patch
|
6
8
|
|
7
9
|
class Settings
|
10
|
+
|
8
11
|
extend Forwardable
|
9
12
|
def_delegators :parsed, :[], :fetch
|
10
13
|
|
@@ -13,9 +16,9 @@ module Eye::Patch
|
|
13
16
|
erb = ERB.new(file.read)
|
14
17
|
erb.filename = file.path
|
15
18
|
|
16
|
-
@settings = YAML.
|
19
|
+
@settings = YAML.safe_load(erb.result)
|
17
20
|
ensure
|
18
|
-
file
|
21
|
+
file&.close
|
19
22
|
end
|
20
23
|
|
21
24
|
private
|
@@ -38,5 +41,7 @@ module Eye::Patch
|
|
38
41
|
item
|
39
42
|
end
|
40
43
|
end
|
44
|
+
|
41
45
|
end
|
46
|
+
|
42
47
|
end
|
@@ -1,14 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "chronic_duration"
|
2
4
|
|
3
5
|
module Eye::Patch
|
4
6
|
|
5
7
|
class ValueParser
|
6
8
|
|
7
|
-
TIME_MATCHER = /\s(?<duration>(?:week|day|hour|minute|second)s?)(?:\s|\Z)
|
8
|
-
SIZE_MATCHER = /\s(?<size>(?:tera|giga|mega|kilo)?bytes?)(?:\s|\Z)
|
9
|
-
MATCHERS
|
9
|
+
TIME_MATCHER = /\s(?<duration>(?:week|day|hour|minute|second)s?)(?:\s|\Z)/
|
10
|
+
SIZE_MATCHER = /\s(?<size>(?:tera|giga|mega|kilo)?bytes?)(?:\s|\Z)/
|
11
|
+
MATCHERS = {
|
10
12
|
time: TIME_MATCHER,
|
11
|
-
size: SIZE_MATCHER
|
13
|
+
size: SIZE_MATCHER,
|
14
|
+
}.freeze
|
12
15
|
|
13
16
|
def self.parse(value)
|
14
17
|
return value unless value.is_a?(String)
|
@@ -20,8 +23,6 @@ module Eye::Patch
|
|
20
23
|
result || value
|
21
24
|
end
|
22
25
|
|
23
|
-
private
|
24
|
-
|
25
26
|
def self.parse_time(value)
|
26
27
|
ChronicDuration.parse(value)
|
27
28
|
end
|
@@ -30,5 +31,7 @@ module Eye::Patch
|
|
30
31
|
unit = value.match(SIZE_MATCHER)[:size]
|
31
32
|
value.gsub(/[^\d.]/, "").to_f.send(unit)
|
32
33
|
end
|
34
|
+
|
33
35
|
end
|
36
|
+
|
34
37
|
end
|
data/lib/eye/patch/version.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative "../../../test_helper"
|
2
4
|
require "tempfile"
|
3
5
|
|
4
6
|
module Eye
|
7
|
+
|
5
8
|
module Patch
|
9
|
+
|
6
10
|
describe Settings do
|
7
11
|
it "evaluates the yaml as ERB" do
|
8
12
|
file = Tempfile.new("yaml")
|
@@ -22,5 +26,7 @@ module Eye
|
|
22
26
|
)
|
23
27
|
end
|
24
28
|
end
|
29
|
+
|
25
30
|
end
|
31
|
+
|
26
32
|
end
|
@@ -1,7 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative "../../../test_helper"
|
2
4
|
|
3
5
|
describe Eye::Patch::ValueParser do
|
4
|
-
|
5
6
|
it "parses time values" do
|
6
7
|
assert_equal 2.weeks, Eye::Patch::ValueParser.parse("2 weeks")
|
7
8
|
assert_equal 1.5.hours, Eye::Patch::ValueParser.parse("1.5 hours")
|
data/test/lib/eye/patch_test.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative "../../test_helper"
|
2
4
|
|
3
5
|
describe Eye::Patch do
|
@@ -8,7 +10,7 @@ describe Eye::Patch do
|
|
8
10
|
describe ".parse" do
|
9
11
|
before do
|
10
12
|
@fixture = File.expand_path(File.join(File.dirname(__FILE__), %w[.. .. fixtures test.yml]))
|
11
|
-
@original = YAML.
|
13
|
+
@original = YAML.safe_load(File.open(@fixture))
|
12
14
|
@parsed = Eye::Patch.parse(@fixture)
|
13
15
|
|
14
16
|
@settings = @parsed.settings
|
@@ -37,7 +39,7 @@ describe Eye::Patch do
|
|
37
39
|
trigger = @original["triggers"].first
|
38
40
|
parsed_trigger = @application[:triggers][trigger["name"].to_sym]
|
39
41
|
|
40
|
-
%w
|
42
|
+
%w[times within].each do |setting|
|
41
43
|
assert_equal Eye::Patch::ValueParser.parse(trigger["config"][setting]), parsed_trigger[setting.to_sym]
|
42
44
|
end
|
43
45
|
end
|
@@ -46,7 +48,7 @@ describe Eye::Patch do
|
|
46
48
|
check = @original["checks"].first
|
47
49
|
parsed_check = @application[:checks][check["name"].to_sym]
|
48
50
|
|
49
|
-
%w
|
51
|
+
%w[times every below].each do |setting|
|
50
52
|
assert_equal Eye::Patch::ValueParser.parse(check["config"][setting]), parsed_check[setting.to_sym]
|
51
53
|
end
|
52
54
|
end
|
@@ -66,9 +68,9 @@ describe Eye::Patch do
|
|
66
68
|
end
|
67
69
|
|
68
70
|
it "creates process clusters" do
|
69
|
-
process = @original["processes"].detect { |
|
71
|
+
process = @original["processes"].detect { |p| p["count"] }
|
70
72
|
process["count"].times do |index|
|
71
|
-
name = "#{process[
|
73
|
+
name = "#{process['name']}-#{index}"
|
72
74
|
parsed_process = @application[:groups][process["group"]][:processes][name]
|
73
75
|
|
74
76
|
assert_equal process["group"], parsed_process[:group]
|
@@ -84,10 +86,11 @@ describe Eye::Patch do
|
|
84
86
|
check = process_config["config"]["monitor_children"]["checks"].first
|
85
87
|
parsed_check = process[:monitor_children][:checks][check["name"].to_sym]
|
86
88
|
|
87
|
-
%w
|
89
|
+
%w[times every below].each do |setting|
|
88
90
|
assert_equal(
|
89
91
|
Eye::Patch::ValueParser.parse(check["config"][setting]),
|
90
|
-
parsed_check[setting.to_sym]
|
92
|
+
parsed_check[setting.to_sym],
|
93
|
+
)
|
91
94
|
end
|
92
95
|
end
|
93
96
|
|
@@ -97,7 +100,7 @@ describe Eye::Patch do
|
|
97
100
|
end
|
98
101
|
|
99
102
|
it "sets :stderr and :stdout options for each process from passed :stdall" do
|
100
|
-
process = @original["processes"].reject { |
|
103
|
+
process = @original["processes"].reject { |p| p["group"] }.first
|
101
104
|
parsed_process = @application[:groups]["__default__"][:processes].values.first
|
102
105
|
|
103
106
|
assert_equal process["config"]["stdall"], parsed_process[:stdout]
|
@@ -108,7 +111,7 @@ describe Eye::Patch do
|
|
108
111
|
describe ".parse with per-process overrides" do
|
109
112
|
before do
|
110
113
|
@fixture = File.expand_path(File.join(File.dirname(__FILE__), %w[.. .. fixtures overrides.yml]))
|
111
|
-
@original = YAML.
|
114
|
+
@original = YAML.safe_load(File.open(@fixture))
|
112
115
|
@parsed = Eye::Patch.parse(@fixture)
|
113
116
|
|
114
117
|
@settings = @parsed.settings
|
@@ -121,7 +124,7 @@ describe Eye::Patch do
|
|
121
124
|
trigger = @original["processes"].detect { |p| p["name"] == process[:name] }["triggers"].first
|
122
125
|
parsed_trigger = process[:triggers][trigger["name"].to_sym]
|
123
126
|
|
124
|
-
%w
|
127
|
+
%w[times within].each do |setting|
|
125
128
|
assert_equal Eye::Patch::ValueParser.parse(trigger["config"][setting]), parsed_trigger[setting.to_sym]
|
126
129
|
end
|
127
130
|
end
|
@@ -131,7 +134,7 @@ describe Eye::Patch do
|
|
131
134
|
check = @original["processes"].detect { |p| p["name"] == process[:name] }["checks"].first
|
132
135
|
parsed_check = process[:checks][check["name"].to_sym]
|
133
136
|
|
134
|
-
%w
|
137
|
+
%w[times every below].each do |setting|
|
135
138
|
assert_equal Eye::Patch::ValueParser.parse(check["config"][setting]), parsed_check[setting.to_sym]
|
136
139
|
end
|
137
140
|
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eye-patch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Horner
|
@@ -11,33 +11,33 @@ cert_chain: []
|
|
11
11
|
date: 2018-04-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: chronic_duration
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0
|
19
|
+
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: eye
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 0.6.2
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 0.6.2
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,7 +53,7 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.3'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: minitest
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
@@ -81,7 +81,21 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
86
100
|
requirements:
|
87
101
|
- - ">="
|
@@ -104,6 +118,9 @@ extensions: []
|
|
104
118
|
extra_rdoc_files: []
|
105
119
|
files:
|
106
120
|
- ".gitignore"
|
121
|
+
- ".hound.yml"
|
122
|
+
- ".rubocop.yml"
|
123
|
+
- ".rubocop_todo.yml"
|
107
124
|
- Gemfile
|
108
125
|
- LICENSE.txt
|
109
126
|
- README.md
|
@@ -150,7 +167,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
150
167
|
requirements:
|
151
168
|
- - ">="
|
152
169
|
- !ruby/object:Gem::Version
|
153
|
-
version:
|
170
|
+
version: 2.4.2
|
154
171
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
172
|
requirements:
|
156
173
|
- - ">="
|
@@ -158,7 +175,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
158
175
|
version: '0'
|
159
176
|
requirements: []
|
160
177
|
rubyforge_project:
|
161
|
-
rubygems_version: 2.
|
178
|
+
rubygems_version: 2.6.13
|
162
179
|
signing_key:
|
163
180
|
specification_version: 4
|
164
181
|
summary: Eye::Patch abstracts out the Eye DSL to allow you to load your configuration
|