snoopit 0.0.1 → 0.0.2
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/.travis.yml +3 -0
- data/Gemfile +5 -2
- data/lib/snoopit.rb +1 -0
- data/lib/snoopit/detected.rb +5 -0
- data/lib/snoopit/file_info.rb +6 -0
- data/lib/snoopit/file_tracker.rb +7 -0
- data/lib/snoopit/logger.rb +3 -0
- data/lib/snoopit/notification_manager.rb +10 -0
- data/lib/snoopit/notifiers/stomp.rb +1 -0
- data/lib/snoopit/sniffer.rb +12 -0
- data/lib/snoopit/snooper.rb +41 -2
- data/lib/snoopit/snoopy.rb +16 -0
- data/lib/snoopit/version.rb +1 -1
- data/snoopit.gemspec +3 -1
- metadata +10 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 988a42e05de998211eac2a93a6c6692c320369be
|
4
|
+
data.tar.gz: 9fad23966cbbe1a33ab254a5f55b2d4960ecdbba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c7b97959b9e5f0ec282990567eef77141da2cc06f4be52fa21065afc848039737069fa8c4febdbb72a32a1be936a291f48bb5d24928e717965942edea4ca430
|
7
|
+
data.tar.gz: b230a55bf4487df00f0fb36d3a377b8b7ad7c7ff57d483f54ff99f23080ae2befd0453efd32e43172782338e94ff5a104dcb50336026f525038d4010ba4d88a8
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -3,9 +3,12 @@ source 'https://rubygems.org'
|
|
3
3
|
# Specify your gem's dependencies in snoopit.gemspec
|
4
4
|
gemspec
|
5
5
|
|
6
|
+
group :debug do
|
7
|
+
gem 'pry', '~> 0.9.12.6', require: false
|
8
|
+
gem 'pry-byebug', '~> 1.3.0', require: false
|
9
|
+
end
|
10
|
+
|
6
11
|
group :test, :development do
|
7
|
-
gem 'pry', '~> 0.9.12.6'
|
8
|
-
gem 'pry-byebug', '~> 1.3.0'
|
9
12
|
gem 'coveralls', :require => false
|
10
13
|
end
|
11
14
|
|
data/lib/snoopit.rb
CHANGED
data/lib/snoopit/detected.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
module Snoopit
|
2
|
+
|
3
|
+
# When the sniffer detects a match it saves the contextual information in a +Detected+ instances
|
2
4
|
class Detected
|
3
5
|
|
4
6
|
attr :comment, :before, :after, :after_count, :regexp, :match, :finished, :file, :line_no
|
5
7
|
|
8
|
+
# These are parameters from the match
|
6
9
|
def initialize(comment, pre_before, after, match, file, line_no)
|
7
10
|
setup_before pre_before
|
8
11
|
@comment = comment
|
@@ -14,10 +17,12 @@ module Snoopit
|
|
14
17
|
@finished = false
|
15
18
|
end
|
16
19
|
|
20
|
+
# Get the lines before the found match
|
17
21
|
def setup_before(pre_before)
|
18
22
|
@before = Register.new pre_before.size, pre_before.register
|
19
23
|
end
|
20
24
|
|
25
|
+
# This collects the lines after a match is found
|
21
26
|
def track(line)
|
22
27
|
return if line == @match
|
23
28
|
if @after_count < @after.size
|
data/lib/snoopit/file_info.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'time'
|
2
2
|
|
3
3
|
module Snoopit
|
4
|
+
|
5
|
+
# Holds and manages the file read information
|
4
6
|
class FileInfo
|
5
7
|
|
6
8
|
attr_accessor :file, :line_no, :offset, :size, :mtime, :last_line, :init_stat
|
@@ -18,6 +20,7 @@ module Snoopit
|
|
18
20
|
# Update file Info if the file has changed use the file handle to move the file pointer
|
19
21
|
# to the character where reading will start
|
20
22
|
#
|
23
|
+
# @param file_handle [File]
|
21
24
|
# @return [boolean] true if updated false not updated
|
22
25
|
def updated?(file_handle)
|
23
26
|
c_stat = File.stat @file
|
@@ -38,6 +41,7 @@ module Snoopit
|
|
38
41
|
updated
|
39
42
|
end
|
40
43
|
|
44
|
+
# This is a new file reset or start reading from the beginning
|
41
45
|
def new_file?(file_handle, stat)
|
42
46
|
# seek to 0
|
43
47
|
Snoopit.logger.debug 'FileTracker.updated? file new read from start of file: ' + @file
|
@@ -49,6 +53,7 @@ module Snoopit
|
|
49
53
|
true
|
50
54
|
end
|
51
55
|
|
56
|
+
# Continue reading from last location, which maybe on new file on initialization
|
52
57
|
def read_from_last?(file_handle, stat)
|
53
58
|
# seek to last position + 1
|
54
59
|
old_size = @size
|
@@ -60,6 +65,7 @@ module Snoopit
|
|
60
65
|
true
|
61
66
|
end
|
62
67
|
|
68
|
+
# Get the last line of the file
|
63
69
|
def get_last_line(file_handle)
|
64
70
|
line = nil
|
65
71
|
unless @last_line.nil?
|
data/lib/snoopit/file_tracker.rb
CHANGED
@@ -1,4 +1,8 @@
|
|
1
1
|
module Snoopit
|
2
|
+
|
3
|
+
# Used to track file locations of the last requested snoops per +snooper.json+
|
4
|
+
# This is handy for repeated invocations via +cron+ so that the snooper does not send repeated notifications
|
5
|
+
# This is a very simple json file with **NO** concurrency.
|
2
6
|
class FileTracker
|
3
7
|
|
4
8
|
attr_accessor :files, :db_file
|
@@ -13,6 +17,7 @@ module Snoopit
|
|
13
17
|
end
|
14
18
|
end
|
15
19
|
|
20
|
+
# Used to start reading lines from the last read invocation
|
16
21
|
def foreach(file, &block)
|
17
22
|
file_info = get_file(file)
|
18
23
|
unless file_info.nil?
|
@@ -21,12 +26,14 @@ module Snoopit
|
|
21
26
|
end
|
22
27
|
end
|
23
28
|
|
29
|
+
# Get the last read file information
|
24
30
|
def get_file(file)
|
25
31
|
return nil unless File.exist? file
|
26
32
|
@files[file] = FileInfo.new(file) if @files[file].nil?
|
27
33
|
@files[file]
|
28
34
|
end
|
29
35
|
|
36
|
+
# Used to start reading lines from the last read invocation
|
30
37
|
def read_lines(file_info, block)
|
31
38
|
begin
|
32
39
|
fh = File.new(file_info.file)
|
data/lib/snoopit/logger.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module Snoopit
|
2
2
|
|
3
|
+
# Instantiates all specified +Notifiers+
|
3
4
|
class NotificationManager
|
4
5
|
|
5
6
|
attr :active, :config
|
@@ -10,6 +11,7 @@ module Snoopit
|
|
10
11
|
load_default_notifiers unless @config.nil?
|
11
12
|
end
|
12
13
|
|
14
|
+
# Load default notifiers and configured notifiers
|
13
15
|
def load_notifier_config(config)
|
14
16
|
@config = config
|
15
17
|
load_default_notifiers
|
@@ -17,12 +19,16 @@ module Snoopit
|
|
17
19
|
load_files(load) unless load.nil?
|
18
20
|
end
|
19
21
|
|
22
|
+
# Register the specified +Notifier+
|
23
|
+
# @param notifier [Notifier]
|
20
24
|
def register(notifier)
|
21
25
|
raise NameError.new "Notifier missing valid name: #{notifier.inspect}" if notifier.name.nil?
|
22
26
|
Snoopit.logger.debug "Registering notifier #{notifier.name}"
|
23
27
|
@active[notifier.name] = notifier
|
24
28
|
end
|
25
29
|
|
30
|
+
# Unregister the specified +Notifier+
|
31
|
+
# @param notifier [Notifier]
|
26
32
|
def unregister(notifier)
|
27
33
|
self.unregister_by_name notifier.name
|
28
34
|
end
|
@@ -35,6 +41,8 @@ module Snoopit
|
|
35
41
|
@active[name]
|
36
42
|
end
|
37
43
|
|
44
|
+
# Invoke all notifications that this list of snoopies is subscribed to via the +snooper.json+
|
45
|
+
# @param snoopies [Snoopy]
|
38
46
|
def notify(snoopies)
|
39
47
|
snoopies.each do |snoopy|
|
40
48
|
snoopy.sniffers.each do |sniffer|
|
@@ -43,6 +51,8 @@ module Snoopit
|
|
43
51
|
end
|
44
52
|
end
|
45
53
|
|
54
|
+
# Snoopies use sniffers that may or may not be associated with a notifier
|
55
|
+
# @param sniffer [Sniffer]
|
46
56
|
def sniffer_notify(sniffer)
|
47
57
|
messages = get_sniffed_messages sniffer
|
48
58
|
sniffer.notifiers.each do |key, value|
|
data/lib/snoopit/sniffer.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
module Snoopit
|
2
|
+
|
3
|
+
# Does the actual searching for the given regular expression
|
2
4
|
class Sniffer
|
3
5
|
|
4
6
|
attr :pre_before, :before, :after, :comment, :regexp, :sniffed, :notifiers
|
5
7
|
|
8
|
+
# This creates a +Sniffer+ which was specified in the +snoopers.json+ file in the +sniffers+ section
|
9
|
+
# @param sniffer_params [Hash] this is a hash from the +snoopers.json+ file in the +sniffers+ section for the assciated +Snoopy+
|
6
10
|
def initialize(sniffer_params)
|
7
11
|
@before = sniffer_params['lines']['before'].nil? ? 2 : sniffer_params['lines']['before']
|
8
12
|
@pre_before = Register.new @before
|
@@ -14,10 +18,16 @@ module Snoopit
|
|
14
18
|
@sniffed = []
|
15
19
|
end
|
16
20
|
|
21
|
+
# Set up the specified notifier parameters
|
22
|
+
# @param params [Hash] this is a hash from the +snoopers.json+ file in the +notify+ section for the associated +Sniffer+
|
17
23
|
def setup_notifiers(params)
|
18
24
|
@notifiers = params['notify'] unless params['notify'].nil?
|
19
25
|
end
|
20
26
|
|
27
|
+
# This sniffer tracks through a file until it detects a match
|
28
|
+
# @param file [String] file the +sniffer+ is tracking
|
29
|
+
# @param line_no [Integer] line number the +sniffer+ is tracking
|
30
|
+
# @param line [String] line the +sniffer+ is tracking
|
21
31
|
def track(file, line_no, line)
|
22
32
|
matched = @regexp.match(line) do |m|
|
23
33
|
@sniffed << Detected.new(@comment, @pre_before, @after, line, file, line_no)
|
@@ -26,6 +36,8 @@ module Snoopit
|
|
26
36
|
tracking line
|
27
37
|
end
|
28
38
|
|
39
|
+
# This is tracking the lines after the match
|
40
|
+
# The +Detected+ instance will let us know when we are finished collecting lines
|
29
41
|
def tracking(line)
|
30
42
|
@sniffed.each do |detected|
|
31
43
|
detected.track line unless detected.finished?
|
data/lib/snoopit/snooper.rb
CHANGED
@@ -1,11 +1,19 @@
|
|
1
1
|
require 'json'
|
2
2
|
module Snoopit
|
3
|
+
|
4
|
+
# Coordinates activities between the +NotificationManager+ the +Snoopies+ their
|
5
|
+
# +Sniffers+ and the +FileTracker+
|
3
6
|
class Snooper
|
4
7
|
|
8
|
+
# +snoopies+ table of +Snoopy+ instances that snoop files
|
9
|
+
# +notifier+ +NotificationManager+ manages distributing notifications
|
10
|
+
# +file_tracker+
|
5
11
|
attr_accessor :snoopies, :notifier, :file_tracker
|
6
12
|
|
7
13
|
# Snoopies are the list of available named snoopers
|
8
|
-
#
|
14
|
+
# @param [boolean #notifications] generate notifications
|
15
|
+
# @param [String #db_file] used for file tracking
|
16
|
+
# @param [Logger #logger] use the passed in logger
|
9
17
|
def initialize(notifications=true, db_file=nil, logger=nil, log_level=::Logger::INFO)
|
10
18
|
@snoopies = { }
|
11
19
|
@file_tracker = FileTracker.new db_file unless db_file.nil?
|
@@ -42,19 +50,29 @@ module Snoopit
|
|
42
50
|
raise ArgumentError.new 'There are no Snoopies in the JSON Snooper ' if @snoopies.size == 0
|
43
51
|
end
|
44
52
|
|
53
|
+
# Load notifiers from the +notifiers+ section
|
54
|
+
# @param json_hash [Hash]
|
45
55
|
def load_notifiers(json_hash)
|
46
56
|
@notifier.load_notifier_config json_hash['notifiers'] unless @notifier.nil?
|
47
57
|
end
|
48
58
|
|
59
|
+
# Register the given +notifier+ that inherits from the +Notifier+ class and implements the
|
60
|
+
# +notify+ method
|
61
|
+
# @params notifier [Notifier]
|
49
62
|
def register_notifier(notifier)
|
50
63
|
@notifier.register notifier
|
51
64
|
end
|
52
65
|
|
66
|
+
# Unegister the given +notifier+ that inherits from the +Notifier+ class and implements the
|
67
|
+
# +notify+ method
|
68
|
+
# @params notifier [Notifier]
|
53
69
|
def unregister_notifier(notifier)
|
54
70
|
@notifier.unregister notifier
|
55
71
|
end
|
56
72
|
|
57
|
-
#
|
73
|
+
# Start the snooping files. If a list of names are given then the only the snoopies in the
|
74
|
+
# list will be used
|
75
|
+
# @param names [Array] - an array of string names
|
58
76
|
def snoop(names=[])
|
59
77
|
snoopers = get_snoopers names
|
60
78
|
snoopers.each do |snoopy|
|
@@ -68,6 +86,8 @@ module Snoopit
|
|
68
86
|
snoopers
|
69
87
|
end
|
70
88
|
|
89
|
+
# Get all the snoopers or only the named snoopers
|
90
|
+
# @param names [Array] - an array of string names
|
71
91
|
def get_snoopers(names=[])
|
72
92
|
snoopers = []
|
73
93
|
use_names = (names.size == 0 ? false : true)
|
@@ -81,6 +101,8 @@ module Snoopit
|
|
81
101
|
snoopers
|
82
102
|
end
|
83
103
|
|
104
|
+
# Have the given +snoopy+ sniff the files in its specified directory
|
105
|
+
# @param snoopy [Snoopy] - current active snoopy
|
84
106
|
def snoop_dir(snoopy)
|
85
107
|
Snoopit.logger.debug "Snooping directory: #{snoopy.dir}"
|
86
108
|
get_files(snoopy).each do |file|
|
@@ -89,6 +111,8 @@ module Snoopit
|
|
89
111
|
end
|
90
112
|
end
|
91
113
|
|
114
|
+
# Get the files the +snoopy+ must sniff out for information
|
115
|
+
# @param snoopy [Snoopy] - current active snoopy
|
92
116
|
def get_files(snoopy)
|
93
117
|
if snoopy.glob?
|
94
118
|
files = get_glob_list snoopy
|
@@ -98,6 +122,8 @@ module Snoopit
|
|
98
122
|
files
|
99
123
|
end
|
100
124
|
|
125
|
+
# Get the files that match the glob expression so the +snoopy+ can snoop the files
|
126
|
+
# @param snoopy [Snoopy] - current active snoopy
|
101
127
|
def get_glob_list(snoopy)
|
102
128
|
Snoopit.logger.debug "Snooping glob: #{snoopy.glob}"
|
103
129
|
cwd = Dir.getwd
|
@@ -110,17 +136,24 @@ module Snoopit
|
|
110
136
|
files
|
111
137
|
end
|
112
138
|
|
139
|
+
# Get the files that match the glob expression so the +snoopy+ can snoop the files
|
140
|
+
# @param snoopy [Snoopy] - current active snoopy
|
113
141
|
def get_file_list(snoopy)
|
114
142
|
Snoopit.logger.debug "Snooper directory: #{snoopy.dir}"
|
115
143
|
Dir.entries snoopy.dir
|
116
144
|
end
|
117
145
|
|
146
|
+
# Have the +snoopy+ snoop a file
|
147
|
+
# @param snoopy [Snoopy] - current active snoopy
|
118
148
|
def snoop_file(snoopy)
|
119
149
|
raise ArgumentError.new "Could find file #{snoopy.input}" unless File.exist? snoopy.input
|
120
150
|
Snoopit.logger.debug "Snooping file: #{snoopy.input} with snoopy: #{snoopy.name}"
|
121
151
|
sniff_it snoopy, snoopy.input
|
122
152
|
end
|
123
153
|
|
154
|
+
# Have the +snoopy+ sniff a file for
|
155
|
+
# @param snoopy [Snoopy] - current active snoopy
|
156
|
+
# @param file_name [String] - file to be snooped
|
124
157
|
def sniff_it(snoopy, file_name)
|
125
158
|
Snoopit.logger.debug "Sniffing file: #{file_name} with snoopy: #{snoopy.name}"
|
126
159
|
unless @file_tracker.nil?
|
@@ -130,12 +163,18 @@ module Snoopit
|
|
130
163
|
end
|
131
164
|
end
|
132
165
|
|
166
|
+
# Have the +snoopy+ sniff a file that is being tracked
|
167
|
+
# @param snoopy [Snoopy] - current active snoopy
|
168
|
+
# @param file_name [String] - file to be snooped
|
133
169
|
def file_track_read(snoopy, file_name)
|
134
170
|
@file_tracker.foreach file_name do |line, line_no|
|
135
171
|
snoopy.sniff snoopy.input, line_no, line
|
136
172
|
end
|
137
173
|
end
|
138
174
|
|
175
|
+
# Have the +snoopy+ sniff a file
|
176
|
+
# @param snoopy [Snoopy] - current active snoopy
|
177
|
+
# @param file_name [String] - file to be snooped
|
139
178
|
def file_read(snoopy, file_name)
|
140
179
|
line_no = 0
|
141
180
|
File.foreach file_name do |line|
|
data/lib/snoopit/snoopy.rb
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
module Snoopit
|
2
|
+
|
3
|
+
# Snoops around the specified file or directory of files
|
2
4
|
class Snoopy
|
3
5
|
|
4
6
|
attr :name, :input, :output, :dir, :glob, :sniffers
|
5
7
|
|
8
|
+
# This creates a +Snoopy+ which was specified in the +snoopers.json+ file in the +snoopers+ section
|
9
|
+
# @param name [String] the name of the snoopy
|
10
|
+
# @param params [Hash] this is a hash from the +snoopers.json+ file in the +snoopers+ section for this +Snoopy+
|
6
11
|
def initialize(name, params)
|
7
12
|
@name = name
|
8
13
|
@output = params['output']
|
@@ -12,21 +17,28 @@ module Snoopit
|
|
12
17
|
setup_sniffers params
|
13
18
|
end
|
14
19
|
|
20
|
+
# Get the name of the file to snoop if specified
|
21
|
+
# @param params [Hash] this is a hash from the +snoopers.json+ file in the +snoopers+ section for this +Snoopy+
|
15
22
|
def setup_input(params)
|
16
23
|
@input = params['snoop']
|
17
24
|
end
|
18
25
|
|
26
|
+
# Get the name of the directory to snoop if specified
|
27
|
+
# @param params [Hash] this is a hash from the +snoopers.json+ file in the +snoopers+ section for this +Snoopy+
|
19
28
|
def setup_dir(params)
|
20
29
|
@dir = params['dir']['path']
|
21
30
|
@glob = params['dir']['glob']
|
22
31
|
end
|
23
32
|
|
33
|
+
# Ensure we have something to snoop
|
24
34
|
def input_check?
|
25
35
|
return true unless @input.nil?
|
26
36
|
return true unless @dir.nil?
|
27
37
|
raise ArgumentError.new('Snooper JSON must contain either an input or dir parameter')
|
28
38
|
end
|
29
39
|
|
40
|
+
# Create the specified sniffers
|
41
|
+
# @param params [Hash] this is a hash from the +snoopers.json+ file in the +sniffers+ section for this +Snoopy+
|
30
42
|
def setup_sniffers(params)
|
31
43
|
raise ArgumentError.new('Snooper JSON missing sniffers array') if params['sniffers'].nil?
|
32
44
|
@sniffers = []
|
@@ -43,6 +55,10 @@ module Snoopit
|
|
43
55
|
! @glob.nil?
|
44
56
|
end
|
45
57
|
|
58
|
+
# Sniff specified line which is from the named file
|
59
|
+
# param file [String] file +Snoopy+ is sniffing
|
60
|
+
# param line_no [Integer] line_n0 +Snoopy+ is sniffing
|
61
|
+
# param line [String] line +Snoopy+ is sniffing
|
46
62
|
def sniff(file, line_no, line)
|
47
63
|
@sniffers.each do |sniffer|
|
48
64
|
sniffer.track file, line_no, line
|
data/lib/snoopit/version.rb
CHANGED
data/snoopit.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ['Robert Birch']
|
10
10
|
spec.email = ['robdbirch@gmail.com']
|
11
11
|
spec.description = %q{Snoops files for specified information via a simple configuration file}
|
12
|
-
spec.summary = %q{
|
12
|
+
spec.summary = %q{Simple tool for monitoring process log files for specified events and then generating basic notifications. This is an extensible and data driven solution. It provides a single location to manage log scraping duties.}
|
13
13
|
spec.homepage = 'https://github.com/robdbirch/snoopit/blob/master/README.md'
|
14
14
|
spec.license = 'MIT'
|
15
15
|
|
@@ -18,6 +18,8 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
|
+
spec.required_ruby_version = '>=1.9.3', '<3.0'
|
22
|
+
|
21
23
|
spec.add_runtime_dependency 'awesome_print', '~> 1.2'
|
22
24
|
spec.add_runtime_dependency 'stomp', '~> 1.3'
|
23
25
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: snoopit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Birch
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-06-
|
11
|
+
date: 2014-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: awesome_print
|
@@ -155,7 +155,10 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
155
155
|
requirements:
|
156
156
|
- - ">="
|
157
157
|
- !ruby/object:Gem::Version
|
158
|
-
version:
|
158
|
+
version: 1.9.3
|
159
|
+
- - "<"
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
version: '3.0'
|
159
162
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
160
163
|
requirements:
|
161
164
|
- - ">="
|
@@ -166,8 +169,9 @@ rubyforge_project:
|
|
166
169
|
rubygems_version: 2.2.2
|
167
170
|
signing_key:
|
168
171
|
specification_version: 4
|
169
|
-
summary:
|
170
|
-
|
172
|
+
summary: Simple tool for monitoring process log files for specified events and then
|
173
|
+
generating basic notifications. This is an extensible and data driven solution.
|
174
|
+
It provides a single location to manage log scraping duties.
|
171
175
|
test_files:
|
172
176
|
- spec/bin/snoopit_spec.rb
|
173
177
|
- spec/file_info_spec.rb
|
@@ -188,3 +192,4 @@ test_files:
|
|
188
192
|
- spec/support/snoopies_notifiers.json
|
189
193
|
- spec/support/test_notifier.rb
|
190
194
|
- spec/support/test_notifier_load.rb
|
195
|
+
has_rdoc:
|