apachelogregex 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +5 -0
- data/LICENSE.rdoc +25 -0
- data/Manifest +12 -0
- data/README.rdoc +97 -0
- data/Rakefile +56 -0
- data/apachelogregex.gemspec +38 -0
- data/lib/apache_log_regex.rb +174 -0
- data/lib/apache_log_regex/version.rb +30 -0
- data/lib/apachelogregex.rb +16 -0
- data/setup.rb +1585 -0
- data/test/apache_log_regex_test.rb +110 -0
- data/test/test_all.rb +18 -0
- data/test/test_helper.rb +24 -0
- metadata +93 -0
@@ -0,0 +1,110 @@
|
|
1
|
+
#
|
2
|
+
# = Apache Log Regex
|
3
|
+
#
|
4
|
+
# Ruby parser for Apache log files based on regular expressions.
|
5
|
+
#
|
6
|
+
# Category::
|
7
|
+
# Package:: ApacheLogRegex
|
8
|
+
# Author:: Simone Carletti <weppos@weppos.net>
|
9
|
+
# License::
|
10
|
+
#
|
11
|
+
#--
|
12
|
+
# SVN: $Id$
|
13
|
+
#++
|
14
|
+
|
15
|
+
|
16
|
+
require 'test_helper'
|
17
|
+
|
18
|
+
|
19
|
+
class ApacheLogRegexTest < Test::Unit::TestCase
|
20
|
+
|
21
|
+
def setup
|
22
|
+
@format = '%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"'
|
23
|
+
@parser = ApacheLogRegex.new(@format)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_regexp
|
27
|
+
regexp = '(?-mix:^(\\S*) (\\S*) (\\S*) (\\[[^\\]]+\\]) (?-mix:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)") (\\S*) (\\S*) (?-mix:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)") (?-mix:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)")$)'
|
28
|
+
assert_equal(regexp, @parser.regexp.to_s)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_parse_line
|
32
|
+
expected = { '%h' => '212.74.15.68',
|
33
|
+
'%l' => '-',
|
34
|
+
'%u' => '-',
|
35
|
+
'%t' => '[23/Jan/2004:11:36:20 +0000]',
|
36
|
+
'%r' => 'GET /images/previous.png HTTP/1.1',
|
37
|
+
'%>s' => '200',
|
38
|
+
'%b' => '2607',
|
39
|
+
'%{Referer}i' => 'http://peterhi.dyndns.org/bandwidth/index.html',
|
40
|
+
'%{User-Agent}i' => 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2) Gecko/20021202' }
|
41
|
+
results = @parser.parse(read_testcase('line.log'))
|
42
|
+
assert_kind_of(Hash, results)
|
43
|
+
assert_match_expected_hash(expected, results)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_parse_line_with_slash_quote_in_request
|
47
|
+
expected = { '%h' => '212.74.15.68',
|
48
|
+
'%l' => '-',
|
49
|
+
'%u' => '-',
|
50
|
+
'%t' => '[23/Jan/2004:11:36:20 +0000]',
|
51
|
+
'%r' => 'GET /images/previous.png=\" HTTP/1.1',
|
52
|
+
'%>s' => '200',
|
53
|
+
'%b' => '2607',
|
54
|
+
'%{Referer}i' => 'http://peterhi.dyndns.org/bandwidth/index.html',
|
55
|
+
'%{User-Agent}i' => 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2) Gecko/20021202' }
|
56
|
+
results = @parser.parse(read_testcase('line-with-slash-quote-in-request.log'))
|
57
|
+
assert_kind_of(Hash, results)
|
58
|
+
assert_match_expected_hash(expected, results)
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_parse_line_with_slash_quote_in_referer
|
62
|
+
expected = { '%h' => '4.224.234.46',
|
63
|
+
'%l' => '-',
|
64
|
+
'%u' => '-',
|
65
|
+
'%t' => '[20/Jul/2004:13:18:55 -0700]',
|
66
|
+
'%r' => 'GET /core/listing/pl_boat_detail.jsp?&units=Feet&checked_boats=1176818&slim=broker&&hosturl=giffordmarine&&ywo=giffordmarine& HTTP/1.1',
|
67
|
+
'%>s' => '200',
|
68
|
+
'%b' => '2888',
|
69
|
+
'%{Referer}i' => 'http://search.yahoo.com/bin/search?p=\"grady%20white%20306%20bimini\"',
|
70
|
+
'%{User-Agent}i' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; YPC 3.0.3; yplus 4.0.00d)' }
|
71
|
+
results = @parser.parse(read_testcase('line-with-slash-quote-in-referer.log'))
|
72
|
+
assert_kind_of(Hash, results)
|
73
|
+
assert_match_expected_hash(expected, results)
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_parse_line_should_return_nil_on_invalid_format
|
77
|
+
results = @parser.parse('foobar')
|
78
|
+
assert_nil(results)
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_parse_log
|
82
|
+
results = File.open("#{TESTCASES_PATH}/log.log").readlines.map { |line| @parser.parse(line) }.compact # skip last line
|
83
|
+
assert_equal(5, results.length)
|
84
|
+
assert_equal(%w(87.18.183.252 79.28.16.191 79.28.16.191 69.150.40.169 217.220.110.75), results.map { |r| r['%h'] })
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_stricparse_line
|
88
|
+
testcase = read_testcase('line.log')
|
89
|
+
assert_equal(@parser.parse(testcase), @parser.parse!(testcase))
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_stricparse_line_should_raise_on_invalid_format
|
93
|
+
error = assert_raise(ApacheLogRegex::ParseError) { results = @parser.parse!('foobar') }
|
94
|
+
assert_match(/Invalid format/, error.message)
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
protected
|
99
|
+
|
100
|
+
def read_testcase(filename)
|
101
|
+
File.read("#{TESTCASES_PATH}/#{filename}")
|
102
|
+
end
|
103
|
+
|
104
|
+
def assert_match_expected_hash(expected, current)
|
105
|
+
expected.each do |key, value|
|
106
|
+
assert_equal(value, current[key], "Expected `#{key}` to match value `#{value}` but `#{current[:key]}`")
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
data/test/test_all.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#
|
2
|
+
# = Apache Log Regex
|
3
|
+
#
|
4
|
+
# Ruby parser for Apache log files based on regular expressions.
|
5
|
+
#
|
6
|
+
# Category::
|
7
|
+
# Package:: ApacheLogRegex
|
8
|
+
# Author:: Simone Carletti <weppos@weppos.net>
|
9
|
+
# License::
|
10
|
+
#
|
11
|
+
#--
|
12
|
+
# SVN: $Id$
|
13
|
+
#++
|
14
|
+
|
15
|
+
|
16
|
+
require 'test_helper'
|
17
|
+
|
18
|
+
Dir.glob(File.dirname(__FILE__) + '/**/*_test.rb').sort.each { |unit| require unit }
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#
|
2
|
+
# = Apache Log Regex
|
3
|
+
#
|
4
|
+
# Ruby parser for Apache log files based on regular expressions.
|
5
|
+
#
|
6
|
+
# Category::
|
7
|
+
# Package:: ApacheLogRegex
|
8
|
+
# Author:: Simone Carletti <weppos@weppos.net>
|
9
|
+
# License::
|
10
|
+
#
|
11
|
+
#--
|
12
|
+
# SVN: $Id$
|
13
|
+
#++
|
14
|
+
|
15
|
+
|
16
|
+
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
17
|
+
|
18
|
+
require 'rubygems'
|
19
|
+
require 'test/unit'
|
20
|
+
require 'apache_log_regex'
|
21
|
+
|
22
|
+
# testcase file path
|
23
|
+
TESTCASES_PATH = File.dirname(__FILE__) + '/testcases' unless defined?(TESTCASES_PATH)
|
24
|
+
FIXTURES_PATH = File.dirname(__FILE__) + '/fixtures' unless defined?(FIXTURES_PATH)
|
metadata
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: apachelogregex
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Simone Carletti
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-02-13 00:00:00 +01:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rake
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0.8"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: echoe
|
27
|
+
type: :development
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "3.1"
|
34
|
+
version:
|
35
|
+
description: Apache Log Regex is a Ruby port of Peter Hickman's Apache::LogRegex 1.4 Perl module. It provides functionalities to parse a line from an Apache log file into a hash.
|
36
|
+
email: weppos@weppos.net
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
42
|
+
- CHANGELOG.rdoc
|
43
|
+
- lib/apache_log_regex/version.rb
|
44
|
+
- lib/apache_log_regex.rb
|
45
|
+
- lib/apachelogregex.rb
|
46
|
+
- README.rdoc
|
47
|
+
files:
|
48
|
+
- CHANGELOG.rdoc
|
49
|
+
- lib/apache_log_regex/version.rb
|
50
|
+
- lib/apache_log_regex.rb
|
51
|
+
- lib/apachelogregex.rb
|
52
|
+
- LICENSE.rdoc
|
53
|
+
- Manifest
|
54
|
+
- Rakefile
|
55
|
+
- README.rdoc
|
56
|
+
- setup.rb
|
57
|
+
- test/apache_log_regex_test.rb
|
58
|
+
- test/test_all.rb
|
59
|
+
- test/test_helper.rb
|
60
|
+
- apachelogregex.gemspec
|
61
|
+
has_rdoc: true
|
62
|
+
homepage: http://code.simonecarletti.com/apachelogregex
|
63
|
+
post_install_message:
|
64
|
+
rdoc_options:
|
65
|
+
- --line-numbers
|
66
|
+
- --inline-source
|
67
|
+
- --title
|
68
|
+
- Apachelogregex
|
69
|
+
- --main
|
70
|
+
- README.rdoc
|
71
|
+
require_paths:
|
72
|
+
- lib
|
73
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: "0"
|
78
|
+
version:
|
79
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: "1.2"
|
84
|
+
version:
|
85
|
+
requirements: []
|
86
|
+
|
87
|
+
rubyforge_project: apachelogregex
|
88
|
+
rubygems_version: 1.3.1
|
89
|
+
signing_key:
|
90
|
+
specification_version: 2
|
91
|
+
summary: Ruby parser for Apache log files based on regular expressions.
|
92
|
+
test_files:
|
93
|
+
- test/test_all.rb
|