ntail 1.0.0 → 1.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.
- 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
|
-
|