watchmonkey_cli 1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +45 -0
- data/Rakefile +1 -0
- data/VERSION +1 -0
- data/bin/watchmonkey +8 -0
- data/bin/watchmonkey.sh +14 -0
- data/lib/watchmonkey_cli/application/colorize.rb +22 -0
- data/lib/watchmonkey_cli/application/configuration.rb +55 -0
- data/lib/watchmonkey_cli/application/configuration.tpl +142 -0
- data/lib/watchmonkey_cli/application/dispatch.rb +86 -0
- data/lib/watchmonkey_cli/application.rb +255 -0
- data/lib/watchmonkey_cli/checker.rb +228 -0
- data/lib/watchmonkey_cli/checkers/ftp_availability.rb +22 -0
- data/lib/watchmonkey_cli/checkers/mysql_replication.rb +57 -0
- data/lib/watchmonkey_cli/checkers/ssl_expiration.rb +83 -0
- data/lib/watchmonkey_cli/checkers/unix_defaults.rb +40 -0
- data/lib/watchmonkey_cli/checkers/unix_df.rb +41 -0
- data/lib/watchmonkey_cli/checkers/unix_file_exists.rb +25 -0
- data/lib/watchmonkey_cli/checkers/unix_load.rb +30 -0
- data/lib/watchmonkey_cli/checkers/unix_mdadm.rb +60 -0
- data/lib/watchmonkey_cli/checkers/unix_memory.rb +37 -0
- data/lib/watchmonkey_cli/checkers/www_availability.rb +54 -0
- data/lib/watchmonkey_cli/helpers.rb +19 -0
- data/lib/watchmonkey_cli/hooks/platypus.rb +38 -0
- data/lib/watchmonkey_cli/hooks/requeue.rb +106 -0
- data/lib/watchmonkey_cli/loopback_connection.rb +36 -0
- data/lib/watchmonkey_cli/ssh_connection.rb +50 -0
- data/lib/watchmonkey_cli/version.rb +4 -0
- data/lib/watchmonkey_cli.rb +41 -0
- data/watchmonkey_cli.gemspec +27 -0
- metadata +163 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
module WatchmonkeyCli
|
2
|
+
module Helpers
|
3
|
+
BYTE_UNITS = %W(TiB GiB MiB KiB B).freeze
|
4
|
+
|
5
|
+
def human_filesize(s)
|
6
|
+
s = s.to_f
|
7
|
+
i = BYTE_UNITS.length - 1
|
8
|
+
while s > 512 && i > 0
|
9
|
+
i -= 1
|
10
|
+
s /= 1024
|
11
|
+
end
|
12
|
+
((s > 9 || s.modulo(1) < 0.1 ? '%d' : '%.1f') % s) + ' ' + BYTE_UNITS[i]
|
13
|
+
end
|
14
|
+
|
15
|
+
def human_number(n)
|
16
|
+
n.to_s.reverse.gsub(/...(?=.)/,'\&,').reverse
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module WatchmonkeyCli
|
2
|
+
class Platypus
|
3
|
+
def self.hook!(app, opts = {})
|
4
|
+
opts = opts.reverse_merge(notifications: true)
|
5
|
+
app.instance_eval do
|
6
|
+
# send errors via notification center
|
7
|
+
hook :result_dump do |robj, args, checker|
|
8
|
+
if robj.error?
|
9
|
+
robj.messages.each do |m|
|
10
|
+
msg = "#{robj.args[0].try(:name) || robj.args[0].presence || "?"}: #{m}"
|
11
|
+
|
12
|
+
case opts[:notifications]
|
13
|
+
when 1
|
14
|
+
# makes no sound
|
15
|
+
fmsg = msg.gsub('"', '\"').gsub("'", %{'"'"'})
|
16
|
+
`osascript -e 'display notification "#{fmsg}" with title "WatchMonkey"'`
|
17
|
+
when 2
|
18
|
+
# makes a sound
|
19
|
+
sync { puts "NOTIFICATION:#{msg}" }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end if opts[:notifications]
|
24
|
+
|
25
|
+
hook :wm_work_start, :wm_work_end do
|
26
|
+
# mastermind calculation I swear :D (<-- no idea what I did here)
|
27
|
+
# sync { puts "PROGRESS:#{((@threads.length-@threads.select{|t| t[:working] }.length.to_d) / @threads.length * 100).to_i}" }
|
28
|
+
sync do
|
29
|
+
active = @threads.select{|t| t[:working] }.length
|
30
|
+
total = @threads.select{|t| t[:working] }.length + @queue.length
|
31
|
+
perc = total.zero? ? 100 : (active.to_d / total * 100).to_i
|
32
|
+
puts "PROGRESS:#{perc}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
module WatchmonkeyCli
|
2
|
+
class Requeue
|
3
|
+
def self.hook!(app)
|
4
|
+
app.instance_eval do
|
5
|
+
# app options
|
6
|
+
@opts[:loop_forever] = true
|
7
|
+
@opts[:logfile] = logger_filename # enable logging
|
8
|
+
|
9
|
+
# module options
|
10
|
+
@opts[:default_requeue] = 60
|
11
|
+
# @opts[:default_requeue_ftp_availability] = 60
|
12
|
+
@opts[:default_requeue_mysql_replication] = 30
|
13
|
+
@opts[:default_requeue_ssl_expiration] = 1.hour
|
14
|
+
@opts[:default_requeue_unix_defaults] = false
|
15
|
+
# @opts[:default_requeue_unix_df] = 60
|
16
|
+
# @opts[:default_requeue_unix_file_exists] = 60
|
17
|
+
# @opts[:default_requeue_unix_load] = 60
|
18
|
+
@opts[:default_requeue_unix_mdadm] = 5.minutes
|
19
|
+
# @opts[:default_requeue_unix_memory] = 60
|
20
|
+
@opts[:default_requeue_www_availability] = 30
|
21
|
+
|
22
|
+
# Requeue threads
|
23
|
+
@requeue = []
|
24
|
+
|
25
|
+
|
26
|
+
# =================
|
27
|
+
# = Status thread =
|
28
|
+
# =================
|
29
|
+
@platypus_status_thread = Thread.new do
|
30
|
+
Thread.current.abort_on_exception = true
|
31
|
+
while STDIN.gets
|
32
|
+
sync do
|
33
|
+
puts "========== STATUS =========="
|
34
|
+
puts " Queue: #{@queue.length}"
|
35
|
+
puts " Requeue: #{@requeue.length}"
|
36
|
+
puts " Workers: #{@threads.select{|t| t[:working] }.length}/#{@threads.length} working (#{@threads.select(&:alive?).length} alive)"
|
37
|
+
puts " Threads: #{Thread.list.length}"
|
38
|
+
# puts " #{@threads.select(&:alive?).length} alive"
|
39
|
+
# puts " #{@threads.select{|t| t.status == "run" }.length} running"
|
40
|
+
# puts " #{@threads.select{|t| t.status == "sleep" }.length} sleeping"
|
41
|
+
puts " Processed: #{@processed}"
|
42
|
+
puts "========== //STATUS =========="
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
# =========
|
49
|
+
# = Hooks =
|
50
|
+
# =========
|
51
|
+
hook :dequeue do |checker, args|
|
52
|
+
opts = args.extract_options!
|
53
|
+
retry_in = opts[:every] if opts[:every].is_a?(Fixnum)
|
54
|
+
retry_in = @opts[:"default_requeue_#{checker.class.checker_name}"] if retry_in.nil?
|
55
|
+
retry_in = @opts[:default_requeue] if retry_in.nil?
|
56
|
+
if retry_in
|
57
|
+
debug "Requeuing #{checker} in #{retry_in} seconds"
|
58
|
+
requeue checker, args + [opts], retry_in
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
hook :wm_shutdown do
|
63
|
+
sync do
|
64
|
+
debug "[ReQ] #{@requeue.length} items in requeue..."
|
65
|
+
unless @requeue.empty?
|
66
|
+
@requeue.each(&:kill).each(&:join).select!(&:alive?)
|
67
|
+
debug "[ReQ] #{@requeue.length} items in requeue..."
|
68
|
+
end
|
69
|
+
@requeue_status_thread.try(:kill).try(:join)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
# ===========
|
75
|
+
# = Methods =
|
76
|
+
# ===========
|
77
|
+
def requeue checker, args, delay = 10
|
78
|
+
return if $wm_runtime_exiting
|
79
|
+
sync do
|
80
|
+
@requeue << Thread.new {
|
81
|
+
Thread.current.abort_on_exception = true
|
82
|
+
sleep(delay)
|
83
|
+
checker.enqueue(*args)
|
84
|
+
sync { @requeue.delete Thread.current }
|
85
|
+
}
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
__END__
|
95
|
+
|
96
|
+
|
97
|
+
log "checking...", false
|
98
|
+
log "PROGRESS:100", false
|
99
|
+
$threads.select!(&:alive?)
|
100
|
+
GC.start
|
101
|
+
sleep 3
|
102
|
+
log "sleeping...", false
|
103
|
+
20.times do |i|
|
104
|
+
log "PROGRESS:#{(100-(i*3/60.0*100)).round(0)}", false
|
105
|
+
sleep 3
|
106
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module WatchmonkeyCli
|
2
|
+
class LoopbackConnection
|
3
|
+
def initialize(id, opts = {}, &initializer)
|
4
|
+
@id = id
|
5
|
+
@opts = {}.merge(opts)
|
6
|
+
# @mutex = Monitor.new
|
7
|
+
initializer.try(:call, @opts)
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_s
|
11
|
+
"#<WatchmonkeyCli::LoopbackConnection:#{@id}>"
|
12
|
+
end
|
13
|
+
|
14
|
+
def name
|
15
|
+
"lo:#{@id}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def sync &block
|
19
|
+
# @mutex.synchronize(&block)
|
20
|
+
block.try(:call)
|
21
|
+
end
|
22
|
+
|
23
|
+
def exec cmd, chomp = true
|
24
|
+
_stdin, _stdouterr, _thread = Open3.popen2e(cmd)
|
25
|
+
_thread.join
|
26
|
+
res = _stdouterr.read
|
27
|
+
chomp ? res.chomp : res
|
28
|
+
ensure
|
29
|
+
_stdin.close rescue false
|
30
|
+
_stdouterr.close rescue false
|
31
|
+
end
|
32
|
+
|
33
|
+
def close!
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module WatchmonkeyCli
|
2
|
+
class SshConnection
|
3
|
+
def initialize(id, opts = {}, &initializer)
|
4
|
+
@id = id
|
5
|
+
|
6
|
+
if opts.is_a?(String)
|
7
|
+
u, h = opts.split("@", 2)
|
8
|
+
opts = { user: u, host_name: h }
|
9
|
+
elsif opts[:host].is_a?(String)
|
10
|
+
u, h = opts[:host].split("@", 2)
|
11
|
+
opts = opts.merge(user: u, host_name: h)
|
12
|
+
opts.delete(:host)
|
13
|
+
end
|
14
|
+
|
15
|
+
# net/ssh options
|
16
|
+
@opts = {
|
17
|
+
config: false,
|
18
|
+
}.merge(opts)
|
19
|
+
@mutex = Monitor.new
|
20
|
+
initializer.try(:call, @opts)
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_s
|
24
|
+
"#<WatchmonkeyCli::SshConnection:#{@id}>"
|
25
|
+
end
|
26
|
+
|
27
|
+
def name
|
28
|
+
"ssh:#{@id}"
|
29
|
+
end
|
30
|
+
|
31
|
+
def sync &block
|
32
|
+
@mutex.synchronize(&block)
|
33
|
+
end
|
34
|
+
|
35
|
+
def exec cmd, chomp = true
|
36
|
+
sync do
|
37
|
+
res = connection.exec!(cmd)
|
38
|
+
chomp ? res.chomp : res
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def connection
|
43
|
+
sync { @ssh ||= Net::SSH.start(nil, nil, @opts) }
|
44
|
+
end
|
45
|
+
|
46
|
+
def close!
|
47
|
+
@ssh.try(:close) rescue false
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
STDOUT.sync = true
|
2
|
+
|
3
|
+
# stdlib
|
4
|
+
require "benchmark"
|
5
|
+
require "fileutils"
|
6
|
+
require "thread"
|
7
|
+
require "monitor"
|
8
|
+
require "optparse"
|
9
|
+
require "open3"
|
10
|
+
require "net/ftp"
|
11
|
+
require 'net/https'
|
12
|
+
|
13
|
+
# 3rd party
|
14
|
+
require "active_support"
|
15
|
+
require "active_support/core_ext"
|
16
|
+
begin ; require "pry" ; rescue LoadError ; end
|
17
|
+
require "httparty"
|
18
|
+
require 'net/ssh'
|
19
|
+
|
20
|
+
# lib
|
21
|
+
require "watchmonkey_cli/version"
|
22
|
+
require "watchmonkey_cli/loopback_connection"
|
23
|
+
require "watchmonkey_cli/ssh_connection"
|
24
|
+
require "watchmonkey_cli/helpers"
|
25
|
+
require "watchmonkey_cli/checker"
|
26
|
+
require "watchmonkey_cli/application/colorize"
|
27
|
+
require "watchmonkey_cli/application/configuration"
|
28
|
+
require "watchmonkey_cli/application/dispatch"
|
29
|
+
require "watchmonkey_cli/application"
|
30
|
+
|
31
|
+
# require buildin checkers
|
32
|
+
require "watchmonkey_cli/checkers/ftp_availability"
|
33
|
+
require "watchmonkey_cli/checkers/mysql_replication"
|
34
|
+
require "watchmonkey_cli/checkers/ssl_expiration"
|
35
|
+
require "watchmonkey_cli/checkers/unix_defaults"
|
36
|
+
require "watchmonkey_cli/checkers/unix_df"
|
37
|
+
require "watchmonkey_cli/checkers/unix_file_exists"
|
38
|
+
require "watchmonkey_cli/checkers/unix_load"
|
39
|
+
require "watchmonkey_cli/checkers/unix_mdadm"
|
40
|
+
require "watchmonkey_cli/checkers/unix_memory"
|
41
|
+
require "watchmonkey_cli/checkers/www_availability"
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'watchmonkey_cli/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "watchmonkey_cli"
|
8
|
+
spec.version = WatchmonkeyCli::VERSION
|
9
|
+
spec.authors = ["Sven Pachnit"]
|
10
|
+
spec.email = ["sven@bmonkeys.net"]
|
11
|
+
spec.summary = %q{Watchmonkey CLI - dead simple agentless monitoring via SSH, HTTP, FTP, etc.}
|
12
|
+
spec.description = %q{If you want an easy way to monitor services without the need of installing agents let a monkey do the job by polling status information via transport protocols.}
|
13
|
+
spec.homepage = "https://github.com/2called-chaos/watchmonkey_cli"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "activesupport"
|
22
|
+
spec.add_dependency "httparty"
|
23
|
+
spec.add_dependency "net-ssh"
|
24
|
+
spec.add_development_dependency "pry"
|
25
|
+
spec.add_development_dependency "bundler"
|
26
|
+
spec.add_development_dependency "rake"
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,163 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: watchmonkey_cli
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '1.4'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sven Pachnit
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-10-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: httparty
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: net-ssh
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: bundler
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
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
|
+
description: If you want an easy way to monitor services without the need of installing
|
98
|
+
agents let a monkey do the job by polling status information via transport protocols.
|
99
|
+
email:
|
100
|
+
- sven@bmonkeys.net
|
101
|
+
executables:
|
102
|
+
- watchmonkey
|
103
|
+
- watchmonkey.sh
|
104
|
+
extensions: []
|
105
|
+
extra_rdoc_files: []
|
106
|
+
files:
|
107
|
+
- ".gitignore"
|
108
|
+
- Gemfile
|
109
|
+
- LICENSE.txt
|
110
|
+
- README.md
|
111
|
+
- Rakefile
|
112
|
+
- VERSION
|
113
|
+
- bin/watchmonkey
|
114
|
+
- bin/watchmonkey.sh
|
115
|
+
- lib/watchmonkey_cli.rb
|
116
|
+
- lib/watchmonkey_cli/application.rb
|
117
|
+
- lib/watchmonkey_cli/application/colorize.rb
|
118
|
+
- lib/watchmonkey_cli/application/configuration.rb
|
119
|
+
- lib/watchmonkey_cli/application/configuration.tpl
|
120
|
+
- lib/watchmonkey_cli/application/dispatch.rb
|
121
|
+
- lib/watchmonkey_cli/checker.rb
|
122
|
+
- lib/watchmonkey_cli/checkers/ftp_availability.rb
|
123
|
+
- lib/watchmonkey_cli/checkers/mysql_replication.rb
|
124
|
+
- lib/watchmonkey_cli/checkers/ssl_expiration.rb
|
125
|
+
- lib/watchmonkey_cli/checkers/unix_defaults.rb
|
126
|
+
- lib/watchmonkey_cli/checkers/unix_df.rb
|
127
|
+
- lib/watchmonkey_cli/checkers/unix_file_exists.rb
|
128
|
+
- lib/watchmonkey_cli/checkers/unix_load.rb
|
129
|
+
- lib/watchmonkey_cli/checkers/unix_mdadm.rb
|
130
|
+
- lib/watchmonkey_cli/checkers/unix_memory.rb
|
131
|
+
- lib/watchmonkey_cli/checkers/www_availability.rb
|
132
|
+
- lib/watchmonkey_cli/helpers.rb
|
133
|
+
- lib/watchmonkey_cli/hooks/platypus.rb
|
134
|
+
- lib/watchmonkey_cli/hooks/requeue.rb
|
135
|
+
- lib/watchmonkey_cli/loopback_connection.rb
|
136
|
+
- lib/watchmonkey_cli/ssh_connection.rb
|
137
|
+
- lib/watchmonkey_cli/version.rb
|
138
|
+
- watchmonkey_cli.gemspec
|
139
|
+
homepage: https://github.com/2called-chaos/watchmonkey_cli
|
140
|
+
licenses:
|
141
|
+
- MIT
|
142
|
+
metadata: {}
|
143
|
+
post_install_message:
|
144
|
+
rdoc_options: []
|
145
|
+
require_paths:
|
146
|
+
- lib
|
147
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - ">="
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0'
|
152
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
153
|
+
requirements:
|
154
|
+
- - ">="
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
version: '0'
|
157
|
+
requirements: []
|
158
|
+
rubyforge_project:
|
159
|
+
rubygems_version: 2.6.6
|
160
|
+
signing_key:
|
161
|
+
specification_version: 4
|
162
|
+
summary: Watchmonkey CLI - dead simple agentless monitoring via SSH, HTTP, FTP, etc.
|
163
|
+
test_files: []
|