wvanbergen-request-log-analyzer 1.0.2 → 1.0.3
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.
@@ -3,6 +3,17 @@ require 'activerecord'
|
|
3
3
|
|
4
4
|
module RequestLogAnalyzer::Aggregator
|
5
5
|
|
6
|
+
# The database aggregator will create an SQLite3 database with all parsed request information.
|
7
|
+
#
|
8
|
+
# The prepare method will create a database schema according to the file format definitions.
|
9
|
+
# It will also create ActiveRecord::Base subclasses to interact with the created tables.
|
10
|
+
# Then, the aggregate method will be called for every parsed request. The information of
|
11
|
+
# these requests is inserted into the tables using the ActiveRecord classes.
|
12
|
+
#
|
13
|
+
# A requests table will be created, in which a record is inserted for every parsed request.
|
14
|
+
# For every line type, a separate table will be created with a request_id field to point to
|
15
|
+
# the request record, and a field for every parsed value. Finally, a warnings table will be
|
16
|
+
# created to log all parse warnings.
|
6
17
|
class Database < Base
|
7
18
|
|
8
19
|
# Establishes a connection to the database and creates the necessary database schema for the
|
@@ -54,7 +65,7 @@ module RequestLogAnalyzer::Aggregator
|
|
54
65
|
# This function creates a database table for a given line definition.
|
55
66
|
# It will create a field for every capture in the line, and adds a lineno field to indicate at
|
56
67
|
# what line in the original file the line was found, and a request_id to link lines related
|
57
|
-
# to the same request.
|
68
|
+
# to the same request. It will also create an index in the request_id field to speed up queries.
|
58
69
|
def create_database_table(name, definition)
|
59
70
|
ActiveRecord::Migration.verbose = options[:debug]
|
60
71
|
ActiveRecord::Migration.create_table("#{name}_lines") do |t|
|
@@ -64,6 +75,7 @@ module RequestLogAnalyzer::Aggregator
|
|
64
75
|
t.column(capture[:name], column_type(capture))
|
65
76
|
end
|
66
77
|
end
|
78
|
+
ActiveRecord::Migration.add_index("#{name}_lines", [:request_id])
|
67
79
|
end
|
68
80
|
|
69
81
|
# Creates an ActiveRecord class for a given line definition.
|
@@ -181,7 +181,7 @@ module RequestLogAnalyzer
|
|
181
181
|
|
182
182
|
begin
|
183
183
|
@source.requests do |request|
|
184
|
-
|
184
|
+
@filters.each { |filter| request = filter.filter(request) }
|
185
185
|
@aggregators.each { |agg| agg.aggregate(request) } if request
|
186
186
|
end
|
187
187
|
rescue Interrupt => e
|
@@ -198,4 +198,4 @@ module RequestLogAnalyzer
|
|
198
198
|
end
|
199
199
|
|
200
200
|
end
|
201
|
-
end
|
201
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module RequestLogAnalyzer::Filter
|
2
|
+
|
3
|
+
# Filter to select or reject a specific field
|
4
|
+
# Options
|
5
|
+
# * <tt>:mode</tt> :reject or :accept.
|
6
|
+
# * <tt>:field</tt> Specific field to accept or reject.
|
7
|
+
# * <tt>:value</tt> Value that the field should match to be accepted or rejected.
|
8
|
+
class Anonimize < Base
|
9
|
+
|
10
|
+
def prepare
|
11
|
+
end
|
12
|
+
|
13
|
+
def generate_random_ip
|
14
|
+
"#{rand(256)}.#{rand(256)}.#{rand(256)}.#{rand(256)}"
|
15
|
+
end
|
16
|
+
|
17
|
+
def anonymize_url(value)
|
18
|
+
return value.sub(/^https?\:\/\/[A-z0-9\.-]+\//, "http://example.com/")
|
19
|
+
end
|
20
|
+
|
21
|
+
def fuzz(value)
|
22
|
+
value * ((75 + rand(50)) / 100.0)
|
23
|
+
end
|
24
|
+
|
25
|
+
def filter(request)
|
26
|
+
return nil unless request
|
27
|
+
|
28
|
+
request.attributes.each do |key, value|
|
29
|
+
if key == :ip
|
30
|
+
request.attributes[key] = generate_random_ip
|
31
|
+
elsif key == :url
|
32
|
+
request.attributes[key] = anonymize_url(value)
|
33
|
+
elsif [ :duration, :view, :db, :type, :after_filters_time, :before_filters_time,
|
34
|
+
:action_time].include?(key)
|
35
|
+
request.attributes[key] = fuzz(value)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
return request
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -22,6 +22,11 @@ describe RequestLogAnalyzer::Aggregator::Database, "schema creation" do
|
|
22
22
|
ActiveRecord::Migration.should_receive(:create_table).with("first_lines")
|
23
23
|
ActiveRecord::Migration.should_receive(:create_table).with("test_lines")
|
24
24
|
ActiveRecord::Migration.should_receive(:create_table).with("last_lines")
|
25
|
+
|
26
|
+
ActiveRecord::Migration.should_receive(:add_index).with("first_lines", [:request_id])
|
27
|
+
ActiveRecord::Migration.should_receive(:add_index).with("test_lines", [:request_id])
|
28
|
+
ActiveRecord::Migration.should_receive(:add_index).with("last_lines", [:request_id])
|
29
|
+
|
25
30
|
@database_inserter.prepare
|
26
31
|
end
|
27
32
|
|
data/spec/filter_spec.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/spec_helper'
|
2
2
|
require File.dirname(__FILE__) + '/../lib/request_log_analyzer/filter/timespan'
|
3
3
|
require File.dirname(__FILE__) + '/../lib/request_log_analyzer/filter/field'
|
4
|
+
require File.dirname(__FILE__) + '/../lib/request_log_analyzer/filter/anonimize'
|
4
5
|
|
5
6
|
describe RequestLogAnalyzer::Filter::Timespan, 'both before and after' do
|
6
7
|
include RequestLogAnalyzerSpecHelper
|
@@ -134,4 +135,26 @@ describe RequestLogAnalyzer::Filter::Field, 'regexp in accept mode' do
|
|
134
135
|
it "should accept a request if the value is not the first value" do
|
135
136
|
@filter.filter(request([{:test => 'ignore'}, {:test => 'testing 123'}])).should_not be_nil
|
136
137
|
end
|
138
|
+
end
|
139
|
+
|
140
|
+
describe RequestLogAnalyzer::Filter::Anonimize, 'anonimize request' do
|
141
|
+
include RequestLogAnalyzerSpecHelper
|
142
|
+
|
143
|
+
before(:each) do
|
144
|
+
@filter = RequestLogAnalyzer::Filter::Anonimize.new(spec_format)
|
145
|
+
@filter.prepare
|
146
|
+
end
|
147
|
+
|
148
|
+
it "should anonimize ip" do
|
149
|
+
@filter.filter(request(:ip => '123.123.123.123'))[:ip].should_not eql('123.123.123.123')
|
150
|
+
end
|
151
|
+
|
152
|
+
it "should anonimize url" do
|
153
|
+
@filter.filter(request(:url => 'https://test.mysite.com/employees'))[:url].should eql('http://example.com/employees')
|
154
|
+
end
|
155
|
+
|
156
|
+
it "should anonimize url" do
|
157
|
+
@filter.filter(request(:duration => 100))[:duration].should_not eql(100)
|
158
|
+
end
|
159
|
+
|
137
160
|
end
|
data/tasks/github-gem.rake
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'rubygems'
|
2
|
+
require 'rubyforge'
|
2
3
|
require 'rake'
|
3
4
|
require 'rake/tasklib'
|
5
|
+
require 'rake/gempackagetask'
|
4
6
|
require 'date'
|
5
7
|
|
6
8
|
module Rake
|
@@ -25,22 +27,14 @@ module Rake
|
|
25
27
|
desc "Updates the file lists for this gem"
|
26
28
|
task(:manifest) { manifest_task }
|
27
29
|
|
28
|
-
desc "Builds a ruby gem for #{@name}"
|
29
|
-
task(:build => [:manifest]) { build_task }
|
30
|
-
|
31
|
-
desc "Installs the ruby gem for #{@name} locally"
|
32
|
-
task(:install => [:build]) { install_task }
|
33
|
-
|
34
|
-
desc "Uninstalls the ruby gem for #{@name} locally"
|
35
|
-
task(:uninstall) { uninstall_task }
|
36
|
-
|
37
30
|
desc "Releases a new version of #{@name}"
|
38
|
-
task(:release) { release_task }
|
39
|
-
|
31
|
+
task(:release => :package) { release_task }
|
32
|
+
|
33
|
+
Rake::GemPackageTask.new(@specification) do |pkg|
|
34
|
+
end
|
35
|
+
end
|
40
36
|
end
|
41
37
|
|
42
|
-
|
43
|
-
|
44
38
|
protected
|
45
39
|
|
46
40
|
def reload_gemspec!
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wvanbergen-request-log-analyzer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Willem van Bergen
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-01-
|
13
|
+
date: 2009-01-14 00:00:00 -08:00
|
14
14
|
default_executable: request-log-analyzer
|
15
15
|
dependencies: []
|
16
16
|
|
@@ -48,6 +48,7 @@ files:
|
|
48
48
|
- lib/request_log_analyzer/file_format/merb.rb
|
49
49
|
- lib/request_log_analyzer/file_format/rails.rb
|
50
50
|
- lib/request_log_analyzer/filter
|
51
|
+
- lib/request_log_analyzer/filter/anonimize.rb
|
51
52
|
- lib/request_log_analyzer/filter/base.rb
|
52
53
|
- lib/request_log_analyzer/filter/field.rb
|
53
54
|
- lib/request_log_analyzer/filter/timespan.rb
|
@@ -116,7 +117,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
116
117
|
version:
|
117
118
|
requirements: []
|
118
119
|
|
119
|
-
rubyforge_project:
|
120
|
+
rubyforge_project: r-l-a
|
120
121
|
rubygems_version: 1.2.0
|
121
122
|
signing_key:
|
122
123
|
specification_version: 2
|