ntail 1.0.0 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.ruby-version +1 -0
- data/Gemfile +13 -10
- data/Gemfile.lock +38 -19
- data/Guardfile +19 -0
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/lib/ntail/http_user_agent.rb +30 -22
- data/lib/ntail/log_line.rb +14 -0
- data/lib/ntail/options.rb +5 -1
- data/ntail.gemspec +29 -39
- data/spec/application_spec.rb +20 -0
- data/spec/spec_helper.rb +18 -0
- metadata +134 -53
- data/.rvmrc +0 -55
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.9.3-p374
|
data/Gemfile
CHANGED
@@ -3,9 +3,9 @@ source "http://rubygems.org"
|
|
3
3
|
# Add dependencies required to use your gem here.
|
4
4
|
# Example:
|
5
5
|
# gem "activesupport", ">= 2.3.5"
|
6
|
-
gem "rainbow"
|
7
|
-
gem "user-agent"
|
8
|
-
gem "treetop"
|
6
|
+
gem "rainbow"
|
7
|
+
gem "user-agent"
|
8
|
+
gem "treetop"
|
9
9
|
# gem 'sequel'
|
10
10
|
# gem 'mongoid'
|
11
11
|
# gem 'sqlite3-ruby', :require => 'sqlite3'
|
@@ -13,11 +13,14 @@ gem "treetop", "~> 1.4.9"
|
|
13
13
|
# Add dependencies to develop your gem here.
|
14
14
|
# Include everything needed to run rake, tests, features, etc.
|
15
15
|
group :development do
|
16
|
-
gem "rake"
|
17
|
-
gem "shoulda"
|
18
|
-
gem "bundler"
|
19
|
-
gem "jeweler"
|
20
|
-
gem "simplecov"
|
21
|
-
gem "geoip"
|
22
|
-
gem "rspec"
|
16
|
+
gem "rake"
|
17
|
+
gem "shoulda"
|
18
|
+
gem "bundler"
|
19
|
+
gem "jeweler"
|
20
|
+
gem "simplecov"
|
21
|
+
gem "geoip"
|
22
|
+
gem "rspec"
|
23
|
+
gem "guard"
|
24
|
+
gem "growl"
|
25
|
+
gem "guard-rspec"
|
23
26
|
end
|
data/Gemfile.lock
CHANGED
@@ -2,29 +2,45 @@ GEM
|
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
4
|
diff-lcs (1.1.3)
|
5
|
+
ffi (1.0.11)
|
5
6
|
geoip (1.1.2)
|
6
7
|
git (1.2.5)
|
7
|
-
|
8
|
-
|
8
|
+
growl (1.0.3)
|
9
|
+
guard (1.0.1)
|
10
|
+
ffi (>= 0.5.0)
|
11
|
+
thor (~> 0.14.6)
|
12
|
+
guard-rspec (0.7.0)
|
13
|
+
guard (>= 0.10.0)
|
14
|
+
jeweler (1.8.3)
|
15
|
+
bundler (~> 1.0)
|
9
16
|
git (>= 1.2.5)
|
10
17
|
rake
|
11
|
-
|
18
|
+
rdoc
|
19
|
+
json (1.6.6)
|
20
|
+
multi_json (1.3.2)
|
12
21
|
polyglot (0.3.3)
|
13
22
|
rainbow (1.1.3)
|
14
23
|
rake (0.9.2.2)
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
rspec-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
rspec-
|
23
|
-
|
24
|
-
|
25
|
-
|
24
|
+
rdoc (3.12)
|
25
|
+
json (~> 1.4)
|
26
|
+
rspec (2.9.0)
|
27
|
+
rspec-core (~> 2.9.0)
|
28
|
+
rspec-expectations (~> 2.9.0)
|
29
|
+
rspec-mocks (~> 2.9.0)
|
30
|
+
rspec-core (2.9.0)
|
31
|
+
rspec-expectations (2.9.1)
|
32
|
+
diff-lcs (~> 1.1.3)
|
33
|
+
rspec-mocks (2.9.0)
|
34
|
+
shoulda (3.0.1)
|
35
|
+
shoulda-context (~> 1.0.0)
|
36
|
+
shoulda-matchers (~> 1.0.0)
|
37
|
+
shoulda-context (1.0.0)
|
38
|
+
shoulda-matchers (1.0.0)
|
39
|
+
simplecov (0.6.2)
|
40
|
+
multi_json (~> 1.3)
|
26
41
|
simplecov-html (~> 0.5.3)
|
27
42
|
simplecov-html (0.5.3)
|
43
|
+
thor (0.14.6)
|
28
44
|
treetop (1.4.10)
|
29
45
|
polyglot
|
30
46
|
polyglot (>= 0.3.1)
|
@@ -34,13 +50,16 @@ PLATFORMS
|
|
34
50
|
ruby
|
35
51
|
|
36
52
|
DEPENDENCIES
|
37
|
-
bundler
|
53
|
+
bundler
|
38
54
|
geoip
|
39
|
-
|
55
|
+
growl
|
56
|
+
guard
|
57
|
+
guard-rspec
|
58
|
+
jeweler
|
40
59
|
rainbow
|
41
|
-
rake
|
42
|
-
rspec
|
60
|
+
rake
|
61
|
+
rspec
|
43
62
|
shoulda
|
44
63
|
simplecov
|
45
|
-
treetop
|
64
|
+
treetop
|
46
65
|
user-agent
|
data/Guardfile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'rspec', :cli => '--color', :version => 2 do
|
5
|
+
watch(%r{^spec/.+_spec\.rb$})
|
6
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
7
|
+
watch('spec/spec_helper.rb') { "spec" }
|
8
|
+
|
9
|
+
# Rails example
|
10
|
+
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
11
|
+
watch(%r{^app/(.*)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
12
|
+
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
13
|
+
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
14
|
+
watch('config/routes.rb') { "spec/routing" }
|
15
|
+
watch('app/controllers/application_controller.rb') { "spec/controllers" }
|
16
|
+
# Capybara request specs
|
17
|
+
watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/requests/#{m[1]}_spec.rb" }
|
18
|
+
end
|
19
|
+
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.
|
1
|
+
1.0.2
|
@@ -27,17 +27,21 @@ class SearchBot < Agent
|
|
27
27
|
# ia_archiver (+http://www.alexa.com/site/help/webmasters; crawler@alexa.com)
|
28
28
|
# Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)
|
29
29
|
# Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
|
30
|
+
# ClickTale bot
|
31
|
+
# "Mozilla/5.0 (compatible; MSIE 7.0; MSIE 6.0; ScanAlert; +http://www.scanalert.com/bot.jsp) Firefox/2.0.0.3"
|
30
32
|
#
|
31
33
|
|
32
34
|
KNOWN_SEARCH_BOTS = [
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
PINGDOM_BOT
|
38
|
-
|
39
|
-
|
40
|
-
|
35
|
+
GOOGLE_RSS = Regexp.compile('Feedfetcher-Google.*\/'),
|
36
|
+
GOOGLE_BOT = Regexp.compile('Googlebot.*\/'),
|
37
|
+
MSN_BOT = Regexp.compile('msnbot\/'),
|
38
|
+
YAHOO_BOT = Regexp.compile('Yahoo! Slurp\/?'),
|
39
|
+
PINGDOM_BOT = Regexp.compile('Pingdom.com_bot_version_'),
|
40
|
+
ALEXA_BOT = Regexp.compile('ia_archiver'),
|
41
|
+
YANDEX_BOT = Regexp.compile('YandexBot\/'),
|
42
|
+
BING_BOT = Regexp.compile('bingbot\/'),
|
43
|
+
CLICKTALE_BOT = Regexp.compile('ClickTale bot'),
|
44
|
+
SCANALERT_BOT = Regexp.compile('ScanAlert; '),
|
41
45
|
]
|
42
46
|
|
43
47
|
def self.search_bot?(http_user_agent)
|
@@ -55,26 +59,30 @@ class SearchBot < Agent
|
|
55
59
|
|
56
60
|
def self.name_for_user_agent string
|
57
61
|
case string
|
58
|
-
when
|
59
|
-
when
|
60
|
-
when
|
61
|
-
when
|
62
|
-
when
|
63
|
-
when
|
64
|
-
when
|
62
|
+
when GOOGLE_BOT then :googlebot
|
63
|
+
when MSN_BOT then :msnbot
|
64
|
+
when YAHOO_BOT then :yahoo_slurp
|
65
|
+
when ALEXA_BOT then :ia_archiver
|
66
|
+
when PINGDOM_BOT then :pingdom_bot
|
67
|
+
when YANDEX_BOT then :yandex_bot
|
68
|
+
when BING_BOT then :bingbot
|
69
|
+
when CLICKTALE_BOT then :clicktale_bot
|
70
|
+
when SCANALERT_BOT then :scanalert_bot
|
65
71
|
else super(string)
|
66
72
|
end
|
67
73
|
end
|
68
74
|
|
69
75
|
def self.os_for_user_agent string
|
70
76
|
case string
|
71
|
-
when
|
72
|
-
when
|
73
|
-
when
|
74
|
-
when
|
75
|
-
when
|
76
|
-
when
|
77
|
-
when
|
77
|
+
when GOOGLE_BOT then :"google.com"
|
78
|
+
when MSN_BOT then :"msn.com"
|
79
|
+
when YAHOO_BOT then :"yahoo.com"
|
80
|
+
when ALEXA_BOT then :"alexa.com"
|
81
|
+
when PINGDOM_BOT then :"pingdom.com"
|
82
|
+
when YANDEX_BOT then :"yandex.com"
|
83
|
+
when BING_BOT then :"bing.com"
|
84
|
+
when CLICKTALE_BOT then :"clicktale.com"
|
85
|
+
when SCANALERT_BOT then :"mcafeesecure.com"
|
78
86
|
else super(string)
|
79
87
|
end
|
80
88
|
end
|
data/lib/ntail/log_line.rb
CHANGED
@@ -25,6 +25,11 @@ module NginxTail
|
|
25
25
|
:http_user_agent, # %U
|
26
26
|
:proxy_addresses, # %p
|
27
27
|
|
28
|
+
# UPSTREAM = NGINX + ...
|
29
|
+
|
30
|
+
:upstream_response_time, # %?
|
31
|
+
:request_time, # %D
|
32
|
+
|
28
33
|
# APACHE
|
29
34
|
|
30
35
|
:server_name, # %V
|
@@ -75,6 +80,12 @@ module NginxTail
|
|
75
80
|
# http://wiki.nginx.org/NginxHttpLogModule#log_format - we currently only support the default "combined" log format...
|
76
81
|
#
|
77
82
|
|
83
|
+
UPSTREAM_LOG_PATTERN = Regexp.compile(/\A(\S+) - (\S+) \[([^\]]+)\] "([^"]+)" (\S+) (\S+) "([^"]*?)" "([^"]*?)"( "([^"]*?)")? - ([\d]+\.[\d]+) ([\d]+\.[\d]+)\Z/)
|
84
|
+
|
85
|
+
#
|
86
|
+
# http://wiki.nginx.org/NginxHttpLogModule#log_format - we currently only support the default "combined" log format...
|
87
|
+
#
|
88
|
+
|
78
89
|
NGINX_LOG_PATTERN = Regexp.compile(/\A(\S+) - (\S+) \[([^\]]+)\] "([^"]+)" (\S+) (\S+) "([^"]*?)" "([^"]*?)"( "([^"]*?)")?\Z/)
|
79
90
|
|
80
91
|
#
|
@@ -86,6 +97,7 @@ module NginxTail
|
|
86
97
|
def self.set_pattern(pattern)
|
87
98
|
@@log_pattern = case pattern
|
88
99
|
when :nginx then NGINX_LOG_PATTERN
|
100
|
+
when :upstream then UPSTREAM_LOG_PATTERN
|
89
101
|
when :apache then APACHE_LOG_PATTERN
|
90
102
|
end
|
91
103
|
end
|
@@ -98,6 +110,8 @@ module NginxTail
|
|
98
110
|
@parsable = if @@log_pattern.match(@raw_line = line)
|
99
111
|
if @@log_pattern == NGINX_LOG_PATTERN
|
100
112
|
@remote_addr, @remote_user, @time_local, @request, @status, @body_bytes_sent, @http_referer, @http_user_agent, @proxy_addresses = $~.captures
|
113
|
+
elsif @@log_pattern == UPSTREAM_LOG_PATTERN
|
114
|
+
@remote_addr, @remote_user, @time_local, @request, @status, @body_bytes_sent, @http_referer, @http_user_agent, @proxy_addresses, _, @upstream_response_time, @request_time = $~.captures
|
101
115
|
elsif @@log_pattern == APACHE_LOG_PATTERN
|
102
116
|
@server_name, @remote_addr, @remote_log_name, @remote_user, @time_local, @request, @status, @body_bytes_sent, @http_referer, @http_user_agent, @http_cookie, @time_taken = $~.captures
|
103
117
|
@proxy_addresses = nil
|
data/lib/ntail/options.rb
CHANGED
@@ -43,6 +43,10 @@ module NginxTail
|
|
43
43
|
options.output = :html
|
44
44
|
end
|
45
45
|
|
46
|
+
opts.on '--upstream', "Try to match lines using the extended nginx 'upstream' log format" do |value|
|
47
|
+
options.pattern = :upstream
|
48
|
+
end
|
49
|
+
|
46
50
|
opts.on '--apache', "Try to match lines using the Apache log format instead of nginx (the default)" do |value|
|
47
51
|
options.pattern = :apache
|
48
52
|
end
|
@@ -83,4 +87,4 @@ module NginxTail
|
|
83
87
|
end
|
84
88
|
|
85
89
|
end # module Options
|
86
|
-
end # module NginxTail
|
90
|
+
end # module NginxTail
|
data/ntail.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "ntail"
|
8
|
-
s.version = "1.0.
|
8
|
+
s.version = "1.0.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Peter Vandenberk"]
|
12
|
-
s.date = "
|
12
|
+
s.date = "2013-12-20"
|
13
13
|
s.description = "A tail(1)-like utility for nginx log files. It supports parsing, filtering and formatting individual log lines."
|
14
14
|
s.email = "pvandenberk@mac.com"
|
15
15
|
s.executables = ["ntail"]
|
@@ -19,9 +19,10 @@ Gem::Specification.new do |s|
|
|
19
19
|
]
|
20
20
|
s.files = [
|
21
21
|
".document",
|
22
|
-
".
|
22
|
+
".ruby-version",
|
23
23
|
"Gemfile",
|
24
24
|
"Gemfile.lock",
|
25
|
+
"Guardfile",
|
25
26
|
"LICENSE.txt",
|
26
27
|
"README.md",
|
27
28
|
"Rakefile",
|
@@ -71,28 +72,8 @@ Gem::Specification.new do |s|
|
|
71
72
|
s.homepage = "http://github.com/pvdb/ntail"
|
72
73
|
s.licenses = ["MIT"]
|
73
74
|
s.require_paths = ["lib"]
|
74
|
-
s.rubygems_version = "1.8.
|
75
|
+
s.rubygems_version = "1.8.23"
|
75
76
|
s.summary = "A tail(1)-like utility for nginx log files"
|
76
|
-
s.test_files = [
|
77
|
-
"spec/application_spec.rb",
|
78
|
-
"spec/spec_helper.rb",
|
79
|
-
"test/helper.rb",
|
80
|
-
"test/ntail/test_formatting.rb",
|
81
|
-
"test/ntail/test_http_method.rb",
|
82
|
-
"test/ntail/test_http_referer.rb",
|
83
|
-
"test/ntail/test_http_user_agent.rb",
|
84
|
-
"test/ntail/test_http_version.rb",
|
85
|
-
"test/ntail/test_known_ip_addresses.rb",
|
86
|
-
"test/ntail/test_local_ip_addresses.rb",
|
87
|
-
"test/ntail/test_log_line.rb",
|
88
|
-
"test/ntail/test_remote_addr.rb",
|
89
|
-
"test/ntail/test_remote_user.rb",
|
90
|
-
"test/ntail/test_request.rb",
|
91
|
-
"test/ntail/test_status.rb",
|
92
|
-
"test/ntail/test_time_local.rb",
|
93
|
-
"test/ntail/test_uri.rb",
|
94
|
-
"test/test_ntail.rb"
|
95
|
-
]
|
96
77
|
|
97
78
|
if s.respond_to? :specification_version then
|
98
79
|
s.specification_version = 3
|
@@ -100,37 +81,46 @@ Gem::Specification.new do |s|
|
|
100
81
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
101
82
|
s.add_runtime_dependency(%q<rainbow>, [">= 0"])
|
102
83
|
s.add_runtime_dependency(%q<user-agent>, [">= 0"])
|
103
|
-
s.add_runtime_dependency(%q<treetop>, ["
|
104
|
-
s.add_development_dependency(%q<rake>, ["
|
84
|
+
s.add_runtime_dependency(%q<treetop>, [">= 0"])
|
85
|
+
s.add_development_dependency(%q<rake>, [">= 0"])
|
105
86
|
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
106
|
-
s.add_development_dependency(%q<bundler>, ["
|
107
|
-
s.add_development_dependency(%q<jeweler>, ["
|
87
|
+
s.add_development_dependency(%q<bundler>, [">= 0"])
|
88
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
108
89
|
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
109
90
|
s.add_development_dependency(%q<geoip>, [">= 0"])
|
110
|
-
s.add_development_dependency(%q<rspec>, [">=
|
91
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
92
|
+
s.add_development_dependency(%q<guard>, [">= 0"])
|
93
|
+
s.add_development_dependency(%q<growl>, [">= 0"])
|
94
|
+
s.add_development_dependency(%q<guard-rspec>, [">= 0"])
|
111
95
|
else
|
112
96
|
s.add_dependency(%q<rainbow>, [">= 0"])
|
113
97
|
s.add_dependency(%q<user-agent>, [">= 0"])
|
114
|
-
s.add_dependency(%q<treetop>, ["
|
115
|
-
s.add_dependency(%q<rake>, ["
|
98
|
+
s.add_dependency(%q<treetop>, [">= 0"])
|
99
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
116
100
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
117
|
-
s.add_dependency(%q<bundler>, ["
|
118
|
-
s.add_dependency(%q<jeweler>, ["
|
101
|
+
s.add_dependency(%q<bundler>, [">= 0"])
|
102
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
119
103
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
120
104
|
s.add_dependency(%q<geoip>, [">= 0"])
|
121
|
-
s.add_dependency(%q<rspec>, [">=
|
105
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
106
|
+
s.add_dependency(%q<guard>, [">= 0"])
|
107
|
+
s.add_dependency(%q<growl>, [">= 0"])
|
108
|
+
s.add_dependency(%q<guard-rspec>, [">= 0"])
|
122
109
|
end
|
123
110
|
else
|
124
111
|
s.add_dependency(%q<rainbow>, [">= 0"])
|
125
112
|
s.add_dependency(%q<user-agent>, [">= 0"])
|
126
|
-
s.add_dependency(%q<treetop>, ["
|
127
|
-
s.add_dependency(%q<rake>, ["
|
113
|
+
s.add_dependency(%q<treetop>, [">= 0"])
|
114
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
128
115
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
129
|
-
s.add_dependency(%q<bundler>, ["
|
130
|
-
s.add_dependency(%q<jeweler>, ["
|
116
|
+
s.add_dependency(%q<bundler>, [">= 0"])
|
117
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
131
118
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
132
119
|
s.add_dependency(%q<geoip>, [">= 0"])
|
133
|
-
s.add_dependency(%q<rspec>, [">=
|
120
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
121
|
+
s.add_dependency(%q<guard>, [">= 0"])
|
122
|
+
s.add_dependency(%q<growl>, [">= 0"])
|
123
|
+
s.add_dependency(%q<guard-rspec>, [">= 0"])
|
134
124
|
end
|
135
125
|
end
|
136
126
|
|
data/spec/application_spec.rb
CHANGED
@@ -8,6 +8,8 @@ describe NginxTail::Application do
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
+
# specs governing processing behaviour
|
12
|
+
|
11
13
|
it "has a default 'exit' value of 0" do
|
12
14
|
NginxTail::Application.new.exit.should eq(0)
|
13
15
|
end
|
@@ -19,5 +21,23 @@ describe NginxTail::Application do
|
|
19
21
|
it "has a default 'interrupted' value of false" do
|
20
22
|
NginxTail::Application.new.interrupted.should eq(false)
|
21
23
|
end
|
24
|
+
|
25
|
+
# specs governing the help function
|
26
|
+
|
27
|
+
it "doesn't run when printing help" do
|
28
|
+
stfu do
|
29
|
+
NginxTail::Application.new(['--help']).running.should eq(false)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# specs governing pattern matching behaviour
|
34
|
+
|
35
|
+
it "has a default 'pattern' value for nginx" do
|
36
|
+
NginxTail::Application.new.pattern.should eq(:nginx)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "has a 'pattern' that can be set via options" do
|
40
|
+
NginxTail::Application.new(['--apache']).pattern.should eq(:apache)
|
41
|
+
end
|
22
42
|
|
23
43
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -7,3 +7,21 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
7
7
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
8
8
|
|
9
9
|
require 'ntail'
|
10
|
+
|
11
|
+
def stfu # "shut the f*ck up", in case you're wondering :-)
|
12
|
+
begin
|
13
|
+
orig_stderr = $stderr.clone
|
14
|
+
orig_stdout = $stdout.clone
|
15
|
+
$stderr.reopen File.new('/dev/null', 'w')
|
16
|
+
$stdout.reopen File.new('/dev/null', 'w')
|
17
|
+
return_value = yield
|
18
|
+
rescue
|
19
|
+
$stdout.reopen orig_stdout
|
20
|
+
$stderr.reopen orig_stderr
|
21
|
+
raise $!
|
22
|
+
ensure
|
23
|
+
$stdout.reopen orig_stdout
|
24
|
+
$stderr.reopen orig_stderr
|
25
|
+
end
|
26
|
+
return_value
|
27
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ntail
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-12-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rainbow
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: user-agent
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ! '>='
|
@@ -32,32 +37,47 @@ dependencies:
|
|
32
37
|
version: '0'
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: treetop
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
|
-
- -
|
51
|
+
- - ! '>='
|
42
52
|
- !ruby/object:Gem::Version
|
43
|
-
version:
|
53
|
+
version: '0'
|
44
54
|
type: :runtime
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: rake
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
|
-
- -
|
67
|
+
- - ! '>='
|
53
68
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0
|
69
|
+
version: '0'
|
55
70
|
type: :development
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
58
78
|
- !ruby/object:Gem::Dependency
|
59
79
|
name: shoulda
|
60
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
61
81
|
none: false
|
62
82
|
requirements:
|
63
83
|
- - ! '>='
|
@@ -65,32 +85,47 @@ dependencies:
|
|
65
85
|
version: '0'
|
66
86
|
type: :development
|
67
87
|
prerelease: false
|
68
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
69
94
|
- !ruby/object:Gem::Dependency
|
70
95
|
name: bundler
|
71
|
-
requirement:
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
72
97
|
none: false
|
73
98
|
requirements:
|
74
|
-
- -
|
99
|
+
- - ! '>='
|
75
100
|
- !ruby/object:Gem::Version
|
76
|
-
version:
|
101
|
+
version: '0'
|
77
102
|
type: :development
|
78
103
|
prerelease: false
|
79
|
-
version_requirements:
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
80
110
|
- !ruby/object:Gem::Dependency
|
81
111
|
name: jeweler
|
82
|
-
requirement:
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
83
113
|
none: false
|
84
114
|
requirements:
|
85
|
-
- -
|
115
|
+
- - ! '>='
|
86
116
|
- !ruby/object:Gem::Version
|
87
|
-
version:
|
117
|
+
version: '0'
|
88
118
|
type: :development
|
89
119
|
prerelease: false
|
90
|
-
version_requirements:
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
91
126
|
- !ruby/object:Gem::Dependency
|
92
127
|
name: simplecov
|
93
|
-
requirement:
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
94
129
|
none: false
|
95
130
|
requirements:
|
96
131
|
- - ! '>='
|
@@ -98,10 +133,15 @@ dependencies:
|
|
98
133
|
version: '0'
|
99
134
|
type: :development
|
100
135
|
prerelease: false
|
101
|
-
version_requirements:
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
102
142
|
- !ruby/object:Gem::Dependency
|
103
143
|
name: geoip
|
104
|
-
requirement:
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
105
145
|
none: false
|
106
146
|
requirements:
|
107
147
|
- - ! '>='
|
@@ -109,18 +149,76 @@ dependencies:
|
|
109
149
|
version: '0'
|
110
150
|
type: :development
|
111
151
|
prerelease: false
|
112
|
-
version_requirements:
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
113
158
|
- !ruby/object:Gem::Dependency
|
114
159
|
name: rspec
|
115
|
-
requirement:
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - ! '>='
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ! '>='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
- !ruby/object:Gem::Dependency
|
175
|
+
name: guard
|
176
|
+
requirement: !ruby/object:Gem::Requirement
|
177
|
+
none: false
|
178
|
+
requirements:
|
179
|
+
- - ! '>='
|
180
|
+
- !ruby/object:Gem::Version
|
181
|
+
version: '0'
|
182
|
+
type: :development
|
183
|
+
prerelease: false
|
184
|
+
version_requirements: !ruby/object:Gem::Requirement
|
185
|
+
none: false
|
186
|
+
requirements:
|
187
|
+
- - ! '>='
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: '0'
|
190
|
+
- !ruby/object:Gem::Dependency
|
191
|
+
name: growl
|
192
|
+
requirement: !ruby/object:Gem::Requirement
|
193
|
+
none: false
|
194
|
+
requirements:
|
195
|
+
- - ! '>='
|
196
|
+
- !ruby/object:Gem::Version
|
197
|
+
version: '0'
|
198
|
+
type: :development
|
199
|
+
prerelease: false
|
200
|
+
version_requirements: !ruby/object:Gem::Requirement
|
201
|
+
none: false
|
202
|
+
requirements:
|
203
|
+
- - ! '>='
|
204
|
+
- !ruby/object:Gem::Version
|
205
|
+
version: '0'
|
206
|
+
- !ruby/object:Gem::Dependency
|
207
|
+
name: guard-rspec
|
208
|
+
requirement: !ruby/object:Gem::Requirement
|
116
209
|
none: false
|
117
210
|
requirements:
|
118
211
|
- - ! '>='
|
119
212
|
- !ruby/object:Gem::Version
|
120
|
-
version: '
|
213
|
+
version: '0'
|
121
214
|
type: :development
|
122
215
|
prerelease: false
|
123
|
-
version_requirements:
|
216
|
+
version_requirements: !ruby/object:Gem::Requirement
|
217
|
+
none: false
|
218
|
+
requirements:
|
219
|
+
- - ! '>='
|
220
|
+
- !ruby/object:Gem::Version
|
221
|
+
version: '0'
|
124
222
|
description: A tail(1)-like utility for nginx log files. It supports parsing, filtering
|
125
223
|
and formatting individual log lines.
|
126
224
|
email: pvandenberk@mac.com
|
@@ -132,9 +230,10 @@ extra_rdoc_files:
|
|
132
230
|
- README.md
|
133
231
|
files:
|
134
232
|
- .document
|
135
|
-
- .
|
233
|
+
- .ruby-version
|
136
234
|
- Gemfile
|
137
235
|
- Gemfile.lock
|
236
|
+
- Guardfile
|
138
237
|
- LICENSE.txt
|
139
238
|
- README.md
|
140
239
|
- Rakefile
|
@@ -195,7 +294,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
195
294
|
version: '0'
|
196
295
|
segments:
|
197
296
|
- 0
|
198
|
-
hash:
|
297
|
+
hash: 696242616465862469
|
199
298
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
200
299
|
none: false
|
201
300
|
requirements:
|
@@ -204,26 +303,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
204
303
|
version: '0'
|
205
304
|
requirements: []
|
206
305
|
rubyforge_project:
|
207
|
-
rubygems_version: 1.8.
|
306
|
+
rubygems_version: 1.8.23
|
208
307
|
signing_key:
|
209
308
|
specification_version: 3
|
210
309
|
summary: A tail(1)-like utility for nginx log files
|
211
|
-
test_files:
|
212
|
-
- spec/application_spec.rb
|
213
|
-
- spec/spec_helper.rb
|
214
|
-
- test/helper.rb
|
215
|
-
- test/ntail/test_formatting.rb
|
216
|
-
- test/ntail/test_http_method.rb
|
217
|
-
- test/ntail/test_http_referer.rb
|
218
|
-
- test/ntail/test_http_user_agent.rb
|
219
|
-
- test/ntail/test_http_version.rb
|
220
|
-
- test/ntail/test_known_ip_addresses.rb
|
221
|
-
- test/ntail/test_local_ip_addresses.rb
|
222
|
-
- test/ntail/test_log_line.rb
|
223
|
-
- test/ntail/test_remote_addr.rb
|
224
|
-
- test/ntail/test_remote_user.rb
|
225
|
-
- test/ntail/test_request.rb
|
226
|
-
- test/ntail/test_status.rb
|
227
|
-
- test/ntail/test_time_local.rb
|
228
|
-
- test/ntail/test_uri.rb
|
229
|
-
- test/test_ntail.rb
|
310
|
+
test_files: []
|
data/.rvmrc
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
#!/usr/bin/env bash
|
2
|
-
|
3
|
-
# This is an RVM Project .rvmrc file, used to automatically load the ruby
|
4
|
-
# development environment upon cd'ing into the directory
|
5
|
-
|
6
|
-
# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional.
|
7
|
-
environment_id="ruby-1.9.3-p0@ntail"
|
8
|
-
|
9
|
-
#
|
10
|
-
# Uncomment following line if you want options to be set only for given project.
|
11
|
-
#
|
12
|
-
# PROJECT_JRUBY_OPTS=( --1.9 )
|
13
|
-
|
14
|
-
#
|
15
|
-
# First we attempt to load the desired environment directly from the environment
|
16
|
-
# file. This is very fast and efficient compared to running through the entire
|
17
|
-
# CLI and selector. If you want feedback on which environment was used then
|
18
|
-
# insert the word 'use' after --create as this triggers verbose mode.
|
19
|
-
#
|
20
|
-
if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
|
21
|
-
&& -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
|
22
|
-
then
|
23
|
-
\. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
|
24
|
-
|
25
|
-
if [[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]]
|
26
|
-
then
|
27
|
-
. "${rvm_path:-$HOME/.rvm}/hooks/after_use"
|
28
|
-
fi
|
29
|
-
else
|
30
|
-
# If the environment file has not yet been created, use the RVM CLI to select.
|
31
|
-
if ! rvm --create "$environment_id"
|
32
|
-
then
|
33
|
-
echo "Failed to create RVM environment '${environment_id}'."
|
34
|
-
return 1
|
35
|
-
fi
|
36
|
-
fi
|
37
|
-
|
38
|
-
#
|
39
|
-
# If you use an RVM gemset file to install a list of gems (*.gems), you can have
|
40
|
-
# it be automatically loaded. Uncomment the following and adjust the filename if
|
41
|
-
# necessary.
|
42
|
-
#
|
43
|
-
# filename=".gems"
|
44
|
-
# if [[ -s "$filename" ]]
|
45
|
-
# then
|
46
|
-
# rvm gemset import "$filename" | grep -v already | grep -v listed | grep -v complete | sed '/^$/d'
|
47
|
-
# fi
|
48
|
-
|
49
|
-
# If you use bundler, this might be useful to you:
|
50
|
-
# if command -v bundle && [[ -s Gemfile ]]
|
51
|
-
# then
|
52
|
-
# bundle install
|
53
|
-
# fi
|
54
|
-
|
55
|
-
|