log_replay 0.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/README +0 -0
- data/lib/log_replay.rb +4 -0
- data/lib/log_replay/request.rb +124 -0
- metadata +68 -0
data/README
ADDED
File without changes
|
data/lib/log_replay.rb
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
require 'time'
|
2
|
+
require 'uri/generic'
|
3
|
+
require 'ipaddr'
|
4
|
+
|
5
|
+
|
6
|
+
module LogReplay
|
7
|
+
|
8
|
+
class Request
|
9
|
+
|
10
|
+
attr_reader :time, :path, :params, :request_id, :client_ip, :location,
|
11
|
+
:log_entry, :status
|
12
|
+
|
13
|
+
METHOD = /\[(GET|POST|PUT|DELETE)\]/
|
14
|
+
TIME = /\s(\d\d\d\d\-\d\d\-\d\d\s\d\d\:\d\d\:\d\d)\)/
|
15
|
+
PARAMS = /Parameters\:\s(.+)/
|
16
|
+
LOCATION = /Location\:\s.+\/([a-f0-9]+)\r\n/
|
17
|
+
ERROR = /.+Error\s\(/
|
18
|
+
IPV4 = /\(for\s([0-9\.]+)\sat/
|
19
|
+
RESPONSE = /\s\|\s(\d\d\d)\s(.+)\s\[(.+)\]/
|
20
|
+
|
21
|
+
|
22
|
+
def initialize options
|
23
|
+
@log_entry = options[:log_entry]
|
24
|
+
@time = Time.parse( options[:time] )
|
25
|
+
@method = options[:method]
|
26
|
+
@client_ip = options[:client_ip]
|
27
|
+
@status = options[:status]
|
28
|
+
@message = options[:message]
|
29
|
+
@url = options[:url]
|
30
|
+
@path = URI.parse( options[:url] ).path
|
31
|
+
@request_id = options[:params].delete("id") rescue ""
|
32
|
+
@params = options[:params]
|
33
|
+
@location = options[:location]
|
34
|
+
|
35
|
+
if @method == "PUT" && @params["upload[attachment]"]
|
36
|
+
@params["upload[attachment]"] = File.open("file1.png")
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.each logfile_path, &block
|
42
|
+
|
43
|
+
unless File.exist?(logfile_path)
|
44
|
+
raise ArgumentError, "Logfile does not exist"
|
45
|
+
end
|
46
|
+
|
47
|
+
File.open( logfile_path, "r" ) do |file|
|
48
|
+
file.each("\n\n") do |request|
|
49
|
+
next unless options = parse_request( request )
|
50
|
+
|
51
|
+
yield Request.new( options )
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.each_with_timing logfile_path, &block
|
58
|
+
previous_timestamp = nil
|
59
|
+
|
60
|
+
each( logfile_path ) do |request|
|
61
|
+
previous_timestamp ||= request.time
|
62
|
+
|
63
|
+
time_to_sleep = request.time - previous_timestamp
|
64
|
+
sleep time_to_sleep
|
65
|
+
|
66
|
+
yield request
|
67
|
+
|
68
|
+
previous_timestamp = request.time
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.parse_request request
|
73
|
+
begin
|
74
|
+
request.gsub!(/\#\<File.+\>\}/, "\"fileupload\"}")
|
75
|
+
|
76
|
+
request_params = {}
|
77
|
+
|
78
|
+
request_params[:log_entry]= request
|
79
|
+
request_params[:client_ip]= request.match(IPV4)[1]
|
80
|
+
request_params[:time] = request.match(TIME)[1]
|
81
|
+
request_params[:method] = request.match(METHOD)[1]
|
82
|
+
|
83
|
+
params_hash = eval( (request.match(PARAMS)[1] rescue "") )
|
84
|
+
request_params[:params] = resolve_params( params_hash )
|
85
|
+
|
86
|
+
request_info = request.match(RESPONSE)
|
87
|
+
request_params[:status] = request_info[1]
|
88
|
+
request_params[:message] = request_info[2]
|
89
|
+
request_params[:url] = request_info[3]
|
90
|
+
|
91
|
+
if ( request_params[:method] == "POST" ) && ( request =~ /Redirected/ )
|
92
|
+
request_params[:location] = request.match(/Redirected\sto\s(.+)\n/)[1]
|
93
|
+
end
|
94
|
+
|
95
|
+
request_params
|
96
|
+
rescue => exception
|
97
|
+
puts exception
|
98
|
+
nil
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.resolve_params params_hash
|
103
|
+
params_hash ||= {}
|
104
|
+
|
105
|
+
params_hash.inject({}) do |options, (key, value)|
|
106
|
+
|
107
|
+
if value.is_a?(Hash)
|
108
|
+
value.each do |k,v|
|
109
|
+
options["#{key}[#{k}]"] = v
|
110
|
+
end
|
111
|
+
else
|
112
|
+
options[key] = value
|
113
|
+
end
|
114
|
+
|
115
|
+
options
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def request_method
|
120
|
+
@method
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
end
|
metadata
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: log_replay
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- hukl
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-07-13 00:00:00 +02:00
|
18
|
+
default_executable:
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: "[description]"
|
22
|
+
email: contact@smyck.org
|
23
|
+
executables: []
|
24
|
+
|
25
|
+
extensions: []
|
26
|
+
|
27
|
+
extra_rdoc_files: []
|
28
|
+
|
29
|
+
files:
|
30
|
+
- README
|
31
|
+
- lib/log_replay.rb
|
32
|
+
- lib/log_replay/request.rb
|
33
|
+
has_rdoc: true
|
34
|
+
homepage: http://github.com/hukl/log_replay
|
35
|
+
licenses: []
|
36
|
+
|
37
|
+
post_install_message:
|
38
|
+
rdoc_options: []
|
39
|
+
|
40
|
+
require_paths:
|
41
|
+
- lib
|
42
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
segments:
|
48
|
+
- 0
|
49
|
+
version: "0"
|
50
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 1
|
57
|
+
- 3
|
58
|
+
- 7
|
59
|
+
version: 1.3.7
|
60
|
+
requirements: []
|
61
|
+
|
62
|
+
rubyforge_project: "[none]"
|
63
|
+
rubygems_version: 1.3.7
|
64
|
+
signing_key:
|
65
|
+
specification_version: 3
|
66
|
+
summary: "[summary]"
|
67
|
+
test_files: []
|
68
|
+
|