eventmachine-tail 0.1.20100505022629 → 0.1.20100506012705
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.
- data/bin/rtail +32 -0
- data/lib/em/filetail.rb +19 -11
- data/lib/em/globwatcher.rb +9 -6
- data/samples/glob-tail.rb +4 -7
- data/samples/tail.rb +2 -1
- metadata +6 -5
data/bin/rtail
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "rubygems"
|
3
|
+
require "eventmachine"
|
4
|
+
require "eventmachine-tail"
|
5
|
+
|
6
|
+
class Reader < EventMachine::FileTail
|
7
|
+
def initialize(path, startpos=-1)
|
8
|
+
super(path, startpos)
|
9
|
+
@buffer = BufferedTokenizer.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def receive_data(data)
|
13
|
+
@buffer.extract(data).each do |line|
|
14
|
+
puts "#{path}: #{line}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def main(args)
|
20
|
+
if args.length == 0
|
21
|
+
puts "Usage: #{$0} <path_or_glob> [path_or_glob2] [...]"
|
22
|
+
return 1
|
23
|
+
end
|
24
|
+
|
25
|
+
EventMachine.run do
|
26
|
+
args.each do |path|
|
27
|
+
EventMachine::FileGlobWatchTail.new(path, Reader)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end # def main
|
31
|
+
|
32
|
+
exit(main(ARGV))
|
data/lib/em/filetail.rb
CHANGED
@@ -40,7 +40,8 @@ class EventMachine::FileTail
|
|
40
40
|
def initialize(path, startpos=-1)
|
41
41
|
@path = path
|
42
42
|
@logger = Logger.new(STDOUT)
|
43
|
-
@logger.level = Logger::WARN
|
43
|
+
@logger.level = ($DEBUG and Logger::DEBUG or Logger::WARN)
|
44
|
+
@logger.debug("Tailing #{path} starting at position #{startpos}")
|
44
45
|
|
45
46
|
@fstat = File.stat(@path)
|
46
47
|
|
@@ -73,6 +74,11 @@ class EventMachine::FileTail
|
|
73
74
|
end
|
74
75
|
end
|
75
76
|
|
77
|
+
public
|
78
|
+
def receive_data(data)
|
79
|
+
@logger.warn("Got #{data.length} bytes")
|
80
|
+
end
|
81
|
+
|
76
82
|
private
|
77
83
|
def open
|
78
84
|
@file.close if @file
|
@@ -90,7 +96,7 @@ class EventMachine::FileTail
|
|
90
96
|
|
91
97
|
private
|
92
98
|
def watch
|
93
|
-
EventMachine::watch_file(@path, FileWatcher, self)
|
99
|
+
EventMachine::watch_file(@path, EventMachine::FileTail::FileWatcher, self)
|
94
100
|
end
|
95
101
|
|
96
102
|
private
|
@@ -147,39 +153,41 @@ end # class EventMachine::FileTail
|
|
147
153
|
|
148
154
|
# Internal usage only
|
149
155
|
class EventMachine::FileTail::FileWatcher < EventMachine::FileWatch
|
150
|
-
def initialize(
|
151
|
-
@
|
156
|
+
def initialize(filewatch)
|
157
|
+
@filewatch = filewatch
|
152
158
|
@logger = Logger.new(STDOUT)
|
153
|
-
@logger.level = Logger::WARN
|
159
|
+
@logger.level = ($DEBUG and Logger::DEBUG or Logger::WARN)
|
160
|
+
@logger.debug("Watching on #{filewatch.path}")
|
154
161
|
end
|
155
162
|
|
156
163
|
def file_modified
|
157
|
-
@
|
164
|
+
@filewatch.notify :modified
|
158
165
|
end
|
159
166
|
|
160
167
|
def file_moved
|
161
|
-
@
|
168
|
+
@filewatch.notify :moved
|
162
169
|
end
|
163
170
|
|
164
171
|
def file_deleted
|
165
|
-
@
|
172
|
+
@filewatch.notify :deleted
|
166
173
|
end
|
167
174
|
|
168
175
|
def unbind
|
169
|
-
@
|
176
|
+
@filewatch.notify :unbind
|
170
177
|
end
|
171
178
|
end # class EventMachine::FileTail::FileWatch < EventMachine::FileWatch
|
172
179
|
|
173
180
|
# Add EventMachine::file_tail
|
174
181
|
module EventMachine
|
175
|
-
|
176
182
|
# Tail a file.
|
177
183
|
#
|
178
184
|
# path is the path to the file to tail.
|
179
185
|
# handler should be a module implementing 'receive_data' or
|
180
186
|
# must be a subclasses of EventMachine::FileTail
|
181
187
|
def self.file_tail(path, handler=nil, *args)
|
182
|
-
|
188
|
+
# This code mostly styled on what EventMachine does in many of it's other
|
189
|
+
# methods.
|
190
|
+
args = [path, *args]
|
183
191
|
klass = klass_from_handler(EventMachine::FileTail, handler, *args);
|
184
192
|
c = klass.new(*args)
|
185
193
|
yield c if block_given?
|
data/lib/em/globwatcher.rb
CHANGED
@@ -20,11 +20,10 @@ require "em/filetail"
|
|
20
20
|
class EventMachine::FileGlobWatch
|
21
21
|
def initialize(pathglob, interval=60)
|
22
22
|
@pathglob = pathglob
|
23
|
-
#@handler = handler
|
24
23
|
@files = Set.new
|
25
24
|
@watches = Hash.new
|
26
25
|
@logger = Logger.new(STDOUT)
|
27
|
-
@logger.level = Logger::
|
26
|
+
@logger.level = ($DEBUG and Logger::DEBUG or Logger::WARN)
|
28
27
|
|
29
28
|
# We periodically check here because it is easier than writing our own glob
|
30
29
|
# parser (so we can smartly watch globs like /foo/*/bar*/*.log)
|
@@ -69,7 +68,11 @@ class EventMachine::FileGlobWatch
|
|
69
68
|
# If EventMachine::watch_file fails, that's ok, I guess.
|
70
69
|
# We'll still find the file 'missing' from the next glob attempt.
|
71
70
|
begin
|
72
|
-
|
71
|
+
# EM currently has a bug that only the first handler for a watch_file
|
72
|
+
# on each file gets events. This causes globtails to never get data
|
73
|
+
# since the glob is watching the file already.
|
74
|
+
# Until we fix that, let's skip file watching here.
|
75
|
+
#@watches[path] = EventMachine::watch_file(path, GlobFileWatch, self)
|
73
76
|
rescue Errno::EACCES => e
|
74
77
|
@logger.warn(e)
|
75
78
|
end
|
@@ -94,15 +97,15 @@ class EventMachine::FileGlobWatch
|
|
94
97
|
end # class EventMachine::FileGlobWatch
|
95
98
|
|
96
99
|
class EventMachine::FileGlobWatchTail < EventMachine::FileGlobWatch
|
97
|
-
def initialize(path, handler=nil, *args)
|
98
|
-
super(path,
|
100
|
+
def initialize(path, handler=nil, interval=60, *args)
|
101
|
+
super(path, interval)
|
99
102
|
@handler = handler
|
100
103
|
@args = args
|
101
104
|
end
|
102
105
|
|
103
106
|
def file_found(path)
|
104
107
|
begin
|
105
|
-
EventMachine::file_tail(path, @handler
|
108
|
+
EventMachine::file_tail(path, @handler)
|
106
109
|
rescue Errno::EACCES => e
|
107
110
|
file_error(path, e)
|
108
111
|
rescue Errno::EISDIR => e
|
data/samples/glob-tail.rb
CHANGED
@@ -16,17 +16,17 @@
|
|
16
16
|
require "rubygems"
|
17
17
|
require "eventmachine"
|
18
18
|
require "eventmachine-tail"
|
19
|
-
require "ap" # from rubygem awesome_print
|
20
19
|
|
21
20
|
class Reader < EventMachine::FileTail
|
22
|
-
def initialize(
|
23
|
-
super(
|
21
|
+
def initialize(path, startpos=-1)
|
22
|
+
super(path, startpos)
|
23
|
+
puts "Tailing #{path}"
|
24
24
|
@buffer = BufferedTokenizer.new
|
25
25
|
end
|
26
26
|
|
27
27
|
def receive_data(data)
|
28
28
|
@buffer.extract(data).each do |line|
|
29
|
-
|
29
|
+
puts "#{path}: #{line}"
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
@@ -38,11 +38,8 @@ def main(args)
|
|
38
38
|
end
|
39
39
|
|
40
40
|
EventMachine.run do
|
41
|
-
#handler = EventMachine::FileGlobWatchTail.new(Reader)
|
42
41
|
args.each do |path|
|
43
42
|
EventMachine::FileGlobWatchTail.new(path, Reader)
|
44
|
-
#EventMachine::FileGlobWatch.new(path, handler)
|
45
|
-
#EventMachine::file_tail(path, handler)
|
46
43
|
end
|
47
44
|
end
|
48
45
|
end # def main
|
data/samples/tail.rb
CHANGED
@@ -9,8 +9,9 @@ require "eventmachine"
|
|
9
9
|
require "eventmachine-tail"
|
10
10
|
|
11
11
|
class Reader < EventMachine::FileTail
|
12
|
-
def initialize(path, startpos
|
12
|
+
def initialize(path, startpos=-1)
|
13
13
|
super(path, startpos)
|
14
|
+
puts "Tailing #{path}"
|
14
15
|
@buffer = BufferedTokenizer.new
|
15
16
|
end
|
16
17
|
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 20100506012705
|
9
|
+
version: 0.1.20100506012705
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jordan Sissel
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-05-
|
17
|
+
date: 2010-05-06 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -31,8 +31,8 @@ dependencies:
|
|
31
31
|
version_requirements: *id001
|
32
32
|
description: Add file 'tail' implemented with EventMachine. Also includes a 'glob watch' class for watching a directory pattern for new matches, like /var/log/*.log
|
33
33
|
email: jls@semicomplete.com
|
34
|
-
executables:
|
35
|
-
|
34
|
+
executables:
|
35
|
+
- rtail
|
36
36
|
extensions: []
|
37
37
|
|
38
38
|
extra_rdoc_files: []
|
@@ -45,6 +45,7 @@ files:
|
|
45
45
|
- samples/glob-tail.rb
|
46
46
|
- samples/globwatch.rb
|
47
47
|
- test/test_filetail.rb
|
48
|
+
- bin/rtail
|
48
49
|
has_rdoc: true
|
49
50
|
homepage: http://code.google.com/p/semicomplete/wiki/EventMachineTail
|
50
51
|
licenses: []
|