what 0.2.7 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +2 -0
- data/Rakefile +30 -0
- data/example/modules/custom_module.rb +2 -2
- data/lib/what/config.rb +0 -3
- data/lib/what/helpers.rb +0 -4
- data/lib/what/modules/base.rb +52 -13
- data/lib/what/modules/disk.rb +1 -1
- data/lib/what/modules/existence.rb +1 -1
- data/lib/what/modules/memory.rb +1 -1
- data/lib/what/modules/process.rb +1 -1
- data/lib/what/modules/unicorn.rb +1 -1
- data/lib/what/modules/what.rb +3 -2
- data/lib/what/modules.rb +10 -39
- data/lib/what/monitor.rb +33 -44
- data/lib/what/server.rb +5 -3
- data/lib/what/version.rb +1 -1
- data/lib/what.rb +2 -2
- data/what.gemspec +1 -1
- metadata +26 -43
- data/bin/whatch +0 -39
- data/lib/what/ch.rb +0 -65
- data/lib/what/status.rb +0 -17
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 76f5b8ecf552ae3e9be47ddb3dac0bc0563a1fec
|
4
|
+
data.tar.gz: d09ff6b7677d83e629bab958b5d5c4802505714b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e2664f1e98896d28f1d5f55b2f28bf83ff781f3d1d2529ebbffe9c67048e2de981a6ef1bf8618d3431596a5614f6796f5019d95c84a21b1b521b2f7545bd0cfd
|
7
|
+
data.tar.gz: b471ae59e93c4d062f88aac1d5bfe8b59fc56e7e1c6c733bfd75c57e3003f7aa4aaa14cd4a201a8c2ff8fb2c821a207e9b84316f4f57edbffe719c4446bff169
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -1,2 +1,32 @@
|
|
1
1
|
require 'bundler'
|
2
2
|
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
# Example session:
|
5
|
+
# [1] pry(main)> mod = What::Modules::Disk.new({}, nil)
|
6
|
+
# => #<Celluloid::ActorProxy(What::Modules::Disk:0x3fe77443812c) ... >
|
7
|
+
# [2] pry(main)> mod.check
|
8
|
+
# => {"size"=>"391Gi",
|
9
|
+
# "used"=>"251Gi",
|
10
|
+
# "avail"=>"139Gi",
|
11
|
+
# "use%"=>65,
|
12
|
+
# "warning%"=>90,
|
13
|
+
# "alert%"=>99,
|
14
|
+
# "regexp"=>"/$"}
|
15
|
+
# [3] pry(main)> mod.status
|
16
|
+
# => {"type"=>"disk",
|
17
|
+
# "health"=>"ok",
|
18
|
+
# "details"=>
|
19
|
+
# {"size"=>"391Gi",
|
20
|
+
# "used"=>"251Gi",
|
21
|
+
# "avail"=>"139Gi",
|
22
|
+
# "use%"=>65,
|
23
|
+
# "warning%"=>90,
|
24
|
+
# "alert%"=>99,
|
25
|
+
# "regexp"=>"/$"}}
|
26
|
+
desc "Start a REPL with all Bunch modules loaded"
|
27
|
+
task :repl do
|
28
|
+
require "pry"
|
29
|
+
require "what"
|
30
|
+
What::Modules.load_all
|
31
|
+
Pry.start
|
32
|
+
end
|
@@ -15,10 +15,10 @@ class What::Modules::CustomModule < What::Modules::Base
|
|
15
15
|
@hellos = 1
|
16
16
|
end
|
17
17
|
|
18
|
-
# The check
|
18
|
+
# The check method is called every Config['interval'] seconds. It should
|
19
19
|
# collect whatever information is needed and put it into instance vars.
|
20
20
|
# (optional)
|
21
|
-
def check
|
21
|
+
def check
|
22
22
|
@hellos = Kernel.rand(4) + 1
|
23
23
|
end
|
24
24
|
|
data/lib/what/config.rb
CHANGED
data/lib/what/helpers.rb
CHANGED
data/lib/what/modules/base.rb
CHANGED
@@ -1,33 +1,73 @@
|
|
1
1
|
module What
|
2
2
|
class Modules::Base
|
3
|
+
include Celluloid
|
3
4
|
|
4
5
|
attr_reader :interval
|
5
6
|
|
6
|
-
def initialize(params
|
7
|
+
def initialize(params, output)
|
7
8
|
defaults = (self.class)::DEFAULTS rescue {}
|
8
9
|
@name = params['name']
|
9
10
|
@config = defaults.merge(params['config'] || {})
|
10
11
|
@max = params['max'] || 'alert'
|
11
|
-
# Use global interval setting if not set on a
|
12
|
-
# per module basis
|
13
12
|
@interval = params['interval'] || Config['interval']
|
13
|
+
@output = output
|
14
|
+
@failures = 0
|
14
15
|
initialize_module
|
15
16
|
end
|
16
17
|
|
17
18
|
def initialize_module
|
18
19
|
end
|
19
20
|
|
21
|
+
def start_monitoring
|
22
|
+
@output[identifier] = nil
|
23
|
+
|
24
|
+
loop do
|
25
|
+
check
|
26
|
+
@output[identifier] = status
|
27
|
+
sleep interval
|
28
|
+
end
|
29
|
+
rescue Exception => e
|
30
|
+
# stop looping -- the Monitor will restart if necessary
|
31
|
+
@failures += 1
|
32
|
+
output = shared_status.merge(
|
33
|
+
"health" => "alert",
|
34
|
+
"error" => "#{e.class}: #{e.message}",
|
35
|
+
"failures" => @failures
|
36
|
+
)
|
37
|
+
puts "Error in module:\n#{YAML.dump(output)}"
|
38
|
+
@output[identifier] = output
|
39
|
+
end
|
40
|
+
|
20
41
|
def name
|
21
42
|
Helpers.underscore(self.class.name.split('::').last)
|
22
43
|
end
|
23
44
|
|
24
|
-
|
45
|
+
# A unique identifier that we can use to match results up with this
|
46
|
+
# specific instance. This is necessary because Celluloid weirds identity.
|
47
|
+
def identifier
|
48
|
+
object_id
|
49
|
+
end
|
50
|
+
|
51
|
+
# This method should be overridden. The implementation here is for
|
52
|
+
# backwards compatibility with older modules that implement check!
|
53
|
+
# instead of check.
|
54
|
+
def check
|
55
|
+
check!
|
56
|
+
end
|
57
|
+
|
58
|
+
# This method must be overridden.
|
59
|
+
def health
|
60
|
+
raise "Module #{self.class.name} doesn't override 'health'"
|
61
|
+
end
|
62
|
+
|
63
|
+
# This method may be overridden, to provide extra details based on the
|
64
|
+
# results of the check.
|
65
|
+
def details
|
66
|
+
{}
|
25
67
|
end
|
26
68
|
|
27
69
|
def status
|
28
|
-
status =
|
29
|
-
status['name'] = @name if @name
|
30
|
-
status['type'] = name # FIXME
|
70
|
+
status = shared_status
|
31
71
|
status['health'] = if @max == 'ok' || health == 'ok'
|
32
72
|
'ok'
|
33
73
|
elsif @max == 'warning' || health == 'warning'
|
@@ -39,12 +79,11 @@ module What
|
|
39
79
|
status
|
40
80
|
end
|
41
81
|
|
42
|
-
def
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
{}
|
82
|
+
def shared_status
|
83
|
+
status = {}
|
84
|
+
status['name'] = @name if @name
|
85
|
+
status['type'] = name # FIXME
|
86
|
+
status
|
48
87
|
end
|
49
88
|
end
|
50
89
|
end
|
data/lib/what/modules/disk.rb
CHANGED
data/lib/what/modules/memory.rb
CHANGED
data/lib/what/modules/process.rb
CHANGED
data/lib/what/modules/unicorn.rb
CHANGED
data/lib/what/modules/what.rb
CHANGED
@@ -8,9 +8,10 @@ module What
|
|
8
8
|
@whats = {}
|
9
9
|
end
|
10
10
|
|
11
|
-
def check
|
11
|
+
def check
|
12
12
|
@config.map do |name, uri|
|
13
|
-
|
13
|
+
body = open(uri).read
|
14
|
+
@whats[name] = JSON.parse(body) rescue nil
|
14
15
|
end
|
15
16
|
end
|
16
17
|
|
data/lib/what/modules.rb
CHANGED
@@ -1,58 +1,29 @@
|
|
1
|
-
require
|
1
|
+
require "what/config"
|
2
2
|
|
3
3
|
module What
|
4
4
|
module Modules
|
5
|
-
|
6
|
-
def self.default_modules_full_path
|
7
|
-
File.join(File.dirname(__FILE__), 'modules')
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.config_module_full_paths
|
11
|
-
(Config['module_paths'] || []).map do |p|
|
12
|
-
if p.match(%r(^/))
|
13
|
-
p
|
14
|
-
else
|
15
|
-
File.join(Config['base'], p)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
# load all modules defined in what/modules, in addition to any paths
|
21
|
-
# specified in the config file.
|
5
|
+
# Load all modules from any paths specified in the config file.
|
22
6
|
def self.load_all
|
23
|
-
|
24
|
-
|
25
|
-
require_dir(self.default_modules_full_path)
|
26
|
-
|
27
|
-
self.config_module_full_paths.each do |path|
|
7
|
+
config_module_full_paths.each do |path|
|
28
8
|
require_dir(path)
|
29
9
|
end
|
30
10
|
end
|
31
11
|
|
32
|
-
def self.
|
33
|
-
|
34
|
-
|
35
|
-
loaded = false
|
36
|
-
|
37
|
-
short_module_name = module_name.sub(/\.rb$/, '')
|
12
|
+
def self.config_module_full_paths
|
13
|
+
paths = Config["module_paths"] || []
|
38
14
|
|
39
|
-
|
40
|
-
|
41
|
-
if File.exists?("#{candidate}.rb")
|
42
|
-
loaded = require candidate
|
43
|
-
end
|
15
|
+
paths.map do |path|
|
16
|
+
path.include?("/") ? path : File.join(Config["base"], path)
|
44
17
|
end
|
45
|
-
|
46
|
-
loaded
|
47
18
|
end
|
48
19
|
|
49
|
-
private
|
50
|
-
|
51
20
|
def self.require_dir(path)
|
52
21
|
Dir[File.join(path, '*.rb')].each do |fn|
|
53
22
|
require fn
|
54
23
|
end
|
55
24
|
end
|
56
|
-
|
57
25
|
end
|
58
26
|
end
|
27
|
+
|
28
|
+
require "what/modules/base"
|
29
|
+
What::Modules.require_dir File.expand_path("../modules", __FILE__)
|
data/lib/what/monitor.rb
CHANGED
@@ -1,57 +1,46 @@
|
|
1
|
-
|
2
|
-
require 'what/modules'
|
3
|
-
require 'what/helpers'
|
4
|
-
|
5
1
|
module What
|
6
2
|
class Monitor
|
7
|
-
|
8
|
-
# don't worry, these method names are ironic
|
9
|
-
|
10
|
-
def initialize(modules)
|
11
|
-
@modules = modules.map do |mod|
|
12
|
-
name = Helpers.camelize(mod.delete('type'))
|
13
|
-
Modules.const_get(name).new(mod)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
3
|
+
# don't worry, this method name is ironic
|
17
4
|
def go!
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
5
|
+
# For now, use a hash as the centralized collection point for data. We
|
6
|
+
# can't use a method on the module because Celluloid will block that call
|
7
|
+
# until after whatever method is currently running, which could be
|
8
|
+
# unacceptably slow. We could use a fancy thread-safe data structure
|
9
|
+
# instead of a hash, but the GIL means hash assignment and reading are
|
10
|
+
# safe as long as we're on MRI.
|
11
|
+
@results = {}
|
12
|
+
@modules = Config['modules'].map do |config_hash|
|
13
|
+
name = Helpers.camelize(config_hash.delete('type'))
|
14
|
+
klass = Modules.const_get(name)
|
15
|
+
instance = klass.new(config_hash, @results)
|
16
|
+
{
|
17
|
+
class: klass,
|
18
|
+
config_hash: config_hash,
|
19
|
+
module: instance,
|
20
|
+
id: instance.identifier
|
21
|
+
}
|
27
22
|
end
|
28
|
-
end
|
29
23
|
|
30
|
-
|
31
|
-
|
32
|
-
statuses = []
|
33
|
-
healths = []
|
34
|
-
@threads.each do |th|
|
35
|
-
if th[:status]
|
36
|
-
healths << th[:status]['health']
|
37
|
-
statuses << th[:status]
|
38
|
-
end
|
39
|
-
end
|
40
|
-
yield Helpers.overall_health(healths), statuses
|
41
|
-
sleep interval
|
24
|
+
@modules.each do |mod|
|
25
|
+
mod[:module].async.start_monitoring
|
42
26
|
end
|
43
27
|
end
|
44
28
|
|
45
|
-
def
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
29
|
+
def status
|
30
|
+
statuses = []
|
31
|
+
healths = []
|
32
|
+
|
33
|
+
@modules.each do |mod|
|
34
|
+
status = @results[mod[:id]] || {"health" => nil}
|
35
|
+
healths << status['health']
|
36
|
+
statuses << status
|
37
|
+
|
38
|
+
if status["error"] && status["failures"] < 6
|
39
|
+
mod[:module].async.start_monitoring
|
52
40
|
end
|
53
41
|
end
|
54
|
-
end
|
55
42
|
|
43
|
+
{"health" => Helpers.overall_health(healths), "details" => statuses}
|
44
|
+
end
|
56
45
|
end
|
57
46
|
end
|
data/lib/what/server.rb
CHANGED
@@ -3,17 +3,19 @@ module What
|
|
3
3
|
def initialize
|
4
4
|
Modules.load_all
|
5
5
|
Formatters.load_all
|
6
|
-
Monitor.
|
6
|
+
@monitor = Monitor.new
|
7
|
+
@monitor.go!
|
7
8
|
end
|
8
9
|
|
9
10
|
def call(env)
|
10
11
|
if Config['secret_token'] && Config['secret_token'] != env['QUERY_STRING']
|
11
12
|
[403, {'Content-Type' => 'text/plain'}, ["403 Forbidden\n"]]
|
12
13
|
else
|
14
|
+
status = @monitor.status
|
13
15
|
[
|
14
|
-
|
16
|
+
status['health'] != 'alert' ? 200 : 503,
|
15
17
|
{'Content-Type' => Formatter.mime},
|
16
|
-
[Formatter.format(
|
18
|
+
[Formatter.format(status)]
|
17
19
|
]
|
18
20
|
end
|
19
21
|
end
|
data/lib/what/version.rb
CHANGED
data/lib/what.rb
CHANGED
@@ -5,7 +5,8 @@ require 'json'
|
|
5
5
|
require 'yaml'
|
6
6
|
require 'webrick'
|
7
7
|
require 'rack'
|
8
|
-
require '
|
8
|
+
require 'open-uri'
|
9
|
+
require 'celluloid'
|
9
10
|
|
10
11
|
require 'what/config'
|
11
12
|
require 'what/formatter'
|
@@ -14,5 +15,4 @@ require 'what/helpers'
|
|
14
15
|
require 'what/modules'
|
15
16
|
require 'what/monitor'
|
16
17
|
require 'what/server'
|
17
|
-
require 'what/status'
|
18
18
|
require 'what/version'
|
data/what.gemspec
CHANGED
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: what
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
version: 0.2.7
|
4
|
+
version: 0.3.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Ryan Fitzgerald
|
@@ -11,73 +10,61 @@ authors:
|
|
11
10
|
autorequire:
|
12
11
|
bindir: bin
|
13
12
|
cert_chain: []
|
14
|
-
date:
|
13
|
+
date: 2013-07-15 00:00:00.000000000 Z
|
15
14
|
dependencies:
|
16
15
|
- !ruby/object:Gem::Dependency
|
17
|
-
|
16
|
+
name: rack
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: 1.1.2
|
22
|
-
none: false
|
23
|
-
name: rack
|
24
22
|
type: :runtime
|
25
23
|
prerelease: false
|
26
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
25
|
requirements:
|
28
|
-
- -
|
26
|
+
- - '>='
|
29
27
|
- !ruby/object:Gem::Version
|
30
28
|
version: 1.1.2
|
31
|
-
none: false
|
32
29
|
- !ruby/object:Gem::Dependency
|
33
|
-
|
30
|
+
name: json
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
34
32
|
requirements:
|
35
|
-
- -
|
33
|
+
- - '>='
|
36
34
|
- !ruby/object:Gem::Version
|
37
|
-
version: 0
|
38
|
-
none: false
|
39
|
-
name: excon
|
35
|
+
version: '0'
|
40
36
|
type: :runtime
|
41
37
|
prerelease: false
|
42
|
-
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
39
|
requirements:
|
44
|
-
- -
|
40
|
+
- - '>='
|
45
41
|
- !ruby/object:Gem::Version
|
46
|
-
version: 0
|
47
|
-
none: false
|
42
|
+
version: '0'
|
48
43
|
- !ruby/object:Gem::Dependency
|
49
|
-
|
44
|
+
name: celluloid
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
50
46
|
requirements:
|
51
|
-
- -
|
47
|
+
- - '>='
|
52
48
|
- !ruby/object:Gem::Version
|
53
49
|
version: '0'
|
54
|
-
none: false
|
55
|
-
name: json
|
56
50
|
type: :runtime
|
57
51
|
prerelease: false
|
58
|
-
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
59
53
|
requirements:
|
60
|
-
- -
|
54
|
+
- - '>='
|
61
55
|
- !ruby/object:Gem::Version
|
62
56
|
version: '0'
|
63
|
-
|
64
|
-
|
65
|
-
services
|
66
|
-
|
57
|
+
description: |
|
58
|
+
What uses WEBrick to serve a JSON object representing the state of services
|
67
59
|
running on a machine. It currently includes modules for monitoring Unicorn
|
68
|
-
|
69
60
|
workers, checking for the existence of files and processes, and combining
|
70
|
-
|
71
61
|
the output of other What servers.
|
72
|
-
|
73
|
-
'
|
74
62
|
email:
|
75
63
|
- rwfitzge@gmail.com
|
76
64
|
- rpjlower@gmail.com
|
77
65
|
- colin.t.curtin@gmail.com
|
78
66
|
executables:
|
79
67
|
- what
|
80
|
-
- whatch
|
81
68
|
- whatsup
|
82
69
|
extensions: []
|
83
70
|
extra_rdoc_files: []
|
@@ -88,12 +75,10 @@ files:
|
|
88
75
|
- README.md
|
89
76
|
- Rakefile
|
90
77
|
- bin/what
|
91
|
-
- bin/whatch
|
92
78
|
- bin/whatsup
|
93
79
|
- example/modules/custom_module.rb
|
94
80
|
- example/what.yml
|
95
81
|
- lib/what.rb
|
96
|
-
- lib/what/ch.rb
|
97
82
|
- lib/what/config.rb
|
98
83
|
- lib/what/formatter.rb
|
99
84
|
- lib/what/formatters.rb
|
@@ -111,32 +96,30 @@ files:
|
|
111
96
|
- lib/what/modules/what.rb
|
112
97
|
- lib/what/monitor.rb
|
113
98
|
- lib/what/server.rb
|
114
|
-
- lib/what/status.rb
|
115
99
|
- lib/what/sup.rb
|
116
100
|
- lib/what/version.rb
|
117
101
|
- what.gemspec
|
118
102
|
homepage: http://academia.edu/
|
119
103
|
licenses: []
|
104
|
+
metadata: {}
|
120
105
|
post_install_message:
|
121
106
|
rdoc_options: []
|
122
107
|
require_paths:
|
123
108
|
- lib
|
124
109
|
required_ruby_version: !ruby/object:Gem::Requirement
|
125
110
|
requirements:
|
126
|
-
- -
|
111
|
+
- - '>='
|
127
112
|
- !ruby/object:Gem::Version
|
128
113
|
version: '0'
|
129
|
-
none: false
|
130
114
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
115
|
requirements:
|
132
|
-
- -
|
116
|
+
- - '>='
|
133
117
|
- !ruby/object:Gem::Version
|
134
118
|
version: '0'
|
135
|
-
none: false
|
136
119
|
requirements: []
|
137
120
|
rubyforge_project: what
|
138
|
-
rubygems_version:
|
121
|
+
rubygems_version: 2.0.2
|
139
122
|
signing_key:
|
140
|
-
specification_version:
|
123
|
+
specification_version: 4
|
141
124
|
summary: Simple server monitoring tool
|
142
125
|
test_files: []
|
data/bin/whatch
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'optparse'
|
5
|
-
require 'what/version'
|
6
|
-
require 'what/ch'
|
7
|
-
|
8
|
-
options = Struct.new(:interval, :all).new
|
9
|
-
|
10
|
-
opts = OptionParser.new do |opts|
|
11
|
-
opts.banner = "Usage: what [options] module_name1 [ module_name2 ... ]"
|
12
|
-
opts.separator ""
|
13
|
-
|
14
|
-
opts.on_tail('-v', '--version', 'Show the version number.') do
|
15
|
-
puts What::VERSION
|
16
|
-
exit
|
17
|
-
end
|
18
|
-
|
19
|
-
opts.on_tail('-h', '--help', 'Show this message.') do
|
20
|
-
puts opts
|
21
|
-
exit
|
22
|
-
end
|
23
|
-
|
24
|
-
opts.on('-c', '--config FILE', 'Specify the location of the YAML config file.') do |fn|
|
25
|
-
What::Config.load(fn)
|
26
|
-
end
|
27
|
-
|
28
|
-
opts.on('-n', '--interval SECS', 'Run module check every SECS seconds.') do |secs|
|
29
|
-
options.interval = secs
|
30
|
-
end
|
31
|
-
|
32
|
-
opts.on_tail('-a', '--all', 'Load all modules specified in config option (which must be present too).') do
|
33
|
-
options.all = true
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
opts.parse!(ARGV)
|
38
|
-
|
39
|
-
What::Ch.run(ARGV, options)
|
data/lib/what/ch.rb
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
## Impletments the whatsch CLI for running modules from the command line
|
2
|
-
|
3
|
-
require 'what/config'
|
4
|
-
require 'what/modules'
|
5
|
-
require 'what/monitor'
|
6
|
-
|
7
|
-
module What
|
8
|
-
class Ch
|
9
|
-
|
10
|
-
def self.run(module_names, opts)
|
11
|
-
new(module_names, opts).run
|
12
|
-
end
|
13
|
-
|
14
|
-
def initialize(module_names, opts)
|
15
|
-
if opts.all && !Config.loaded?
|
16
|
-
self.error "Use all: No config given to read for module names"
|
17
|
-
end
|
18
|
-
|
19
|
-
if 0 == module_names.size && !opts.all
|
20
|
-
self.error "No module names given"
|
21
|
-
end
|
22
|
-
|
23
|
-
@modules = if What::Config.loaded?
|
24
|
-
if opts.all
|
25
|
-
What::Config['modules']
|
26
|
-
else
|
27
|
-
What::Config['modules'].select{|m| module_names.include?(m['name'])}
|
28
|
-
end
|
29
|
-
else
|
30
|
-
What::Config.set_defaults
|
31
|
-
module_names.uniq.map{|mn| {'type' => mn, 'name' => mn} }
|
32
|
-
end
|
33
|
-
|
34
|
-
if 0 == @modules.size
|
35
|
-
self.error "No modules to use"
|
36
|
-
end
|
37
|
-
|
38
|
-
@interval = (opts.interval || 10).to_i
|
39
|
-
end
|
40
|
-
|
41
|
-
def run
|
42
|
-
@modules.each do |m|
|
43
|
-
unless Modules.load_module(m['type'])
|
44
|
-
self.error("Unknown module #{m['type']}")
|
45
|
-
end
|
46
|
-
end
|
47
|
-
@monitor = Monitor.new(@modules)
|
48
|
-
@monitor.go!
|
49
|
-
@monitor.do_it(@interval) do |health, statuses|
|
50
|
-
self.report health, statuses
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def report(health, statuses)
|
55
|
-
$stdout.puts health
|
56
|
-
$stdout.puts statuses.inspect
|
57
|
-
end
|
58
|
-
|
59
|
-
def error(message)
|
60
|
-
$stderr.puts message
|
61
|
-
exit(1)
|
62
|
-
end
|
63
|
-
|
64
|
-
end
|
65
|
-
end
|