sms-logparser 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +31 -17
- data/lib/sms-logparser/api.rb +7 -2
- data/lib/sms-logparser/cli.rb +94 -23
- data/lib/sms-logparser/mysql.rb +42 -14
- data/lib/sms-logparser/parser.rb +8 -2
- data/lib/sms-logparser/version.rb +1 -1
- data/sms-logparser.gemspec +2 -0
- data/spec/api_spec.rb +60 -0
- data/spec/cli_spec.rb +4 -4
- data/spec/parser_spec.rb +19 -11
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7d8d1676ea63d17f63d196dd955d52bcd822c28b
|
4
|
+
data.tar.gz: 6a0a0341ed6a5050cefa8871835247122f2a2934
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dabe200a09f9dd8f508726c6b8ba8471847c713ae0e142c0121ea8eafb526321cc023972c6c0d830996de5107158981fafa987c53f44074af772947fe9a9bae8
|
7
|
+
data.tar.gz: b5e7aa89a019a2582fbf0296fc38a3350da2a7aba1cc41c03b7fed1f01948b768f570807fce987b81a9cf6842b7fb770c68ce363946ce55f4a1ed3a14c19825e
|
data/README.md
CHANGED
@@ -1,46 +1,60 @@
|
|
1
|
-
#
|
1
|
+
# SMS Logparser
|
2
2
|
|
3
|
-
sms-logparser -
|
3
|
+
sms-logparser - Logparser for Simplex Media Server (SMS). Reads access logs stored in a MySQL database (coming from the SWISS TXT CDN) and sends them to the SMS API.
|
4
4
|
|
5
5
|
[![Gem Version](https://badge.fury.io/rb/sms-logparser.png)](http://badge.fury.io/rb/sms-logparser)
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
9
|
-
|
9
|
+
Install the sms-logpaser gem:
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
$ bundle
|
16
|
-
|
17
|
-
Or install it yourself as:
|
18
|
-
|
19
|
-
$ gem install sms-logparser
|
11
|
+
```bash
|
12
|
+
$ gem install sms-logparser
|
13
|
+
```
|
20
14
|
|
21
15
|
## Setup
|
22
16
|
|
23
17
|
Create the database table to track which logs have been parsed:
|
24
18
|
|
25
|
-
|
19
|
+
```bash
|
20
|
+
$ sms-logparser setup
|
21
|
+
```
|
26
22
|
|
27
23
|
Make a test run:
|
28
24
|
|
29
|
-
|
25
|
+
```bash
|
26
|
+
$ sms-logparser parse --simulate --verbose
|
27
|
+
```
|
30
28
|
|
31
29
|
## Usage
|
32
30
|
|
33
31
|
See available commands:
|
34
32
|
|
35
|
-
|
33
|
+
```bash
|
34
|
+
$ sms-logparser help
|
35
|
+
```
|
36
36
|
|
37
37
|
Parse logs from database and send them to the API
|
38
38
|
|
39
|
-
|
39
|
+
```bash
|
40
|
+
$ sms-logparser parse
|
41
|
+
```
|
40
42
|
|
41
43
|
Show the last parser runs:
|
42
44
|
|
43
|
-
|
45
|
+
```bash
|
46
|
+
$ sms-logparser history
|
47
|
+
``
|
48
|
+
|
49
|
+
## Configuration file
|
50
|
+
|
51
|
+
sms-logparser tries to read default options from a yaml file named '.sms-logparser.yml' placed in your home directory. Using the "-c/--config" flag you can adapt the path to the configuration file.
|
52
|
+
|
53
|
+
An configuration for adapting the default MySQL password could look like this:
|
54
|
+
|
55
|
+
```yaml
|
56
|
+
:mysql_password: "my!secret"
|
57
|
+
```
|
44
58
|
|
45
59
|
## Development
|
46
60
|
|
data/lib/sms-logparser/api.rb
CHANGED
@@ -6,12 +6,17 @@ module SmsLogparser
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def send(data)
|
9
|
+
urls = []
|
9
10
|
base_url = "#{@options[:api_base_path]}/"
|
10
11
|
base_url += "#{data[:customer_id]}/"
|
11
12
|
base_url += "#{data[:author_id]}/"
|
12
13
|
base_url += "#{data[:project_id]}"
|
13
|
-
|
14
|
-
|
14
|
+
unless data[:file] =~ /.*\.m3u8$/
|
15
|
+
urls = ["#{base_url}/#{data[:traffic_type]}/#{data[:bytes]}"]
|
16
|
+
end
|
17
|
+
if data[:visitor_type]
|
18
|
+
urls << "#{base_url}/#{data[:visitor_type]}/1"
|
19
|
+
end
|
15
20
|
unless @options[:simulate]
|
16
21
|
urls.each do |url|
|
17
22
|
begin
|
data/lib/sms-logparser/cli.rb
CHANGED
@@ -1,22 +1,56 @@
|
|
1
1
|
module SmsLogparser
|
2
2
|
class Cli < Thor
|
3
|
+
require 'yaml'
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
STATUS = {
|
6
|
+
:ok => 0,
|
7
|
+
:api_error => 1
|
8
|
+
}
|
8
9
|
|
9
|
-
|
10
|
+
class_option :config,
|
11
|
+
:default => File.join(Dir.home, '.sms-logparser.yml'),
|
12
|
+
:aliases => %w(-c),
|
13
|
+
:desc => "Configuration file for default options"
|
14
|
+
|
15
|
+
class_option :mysql_host,
|
16
|
+
:default => 'localhost',
|
17
|
+
:aliases => %w(-h),
|
18
|
+
:desc => "MySQL host"
|
19
|
+
|
20
|
+
class_option :mysql_user,
|
21
|
+
:default => 'root',
|
22
|
+
:aliases => %w(-u),
|
23
|
+
:desc => "MySQL user"
|
24
|
+
|
25
|
+
class_option :mysql_password,
|
26
|
+
:aliases => %w(-p),
|
27
|
+
:desc => "MySQL password"
|
28
|
+
|
29
|
+
class_option :mysql_db,
|
30
|
+
:default => 'Syslog',
|
31
|
+
:aliases => %w(-d),
|
32
|
+
:desc => "MySQL database"
|
33
|
+
|
34
|
+
desc "version", "Print cloudstack-cli version number"
|
10
35
|
def version
|
11
36
|
say "sms-logparser version #{SmsLogparser::VERSION}"
|
12
37
|
end
|
13
38
|
map %w(-v --version) => :version
|
14
39
|
|
15
|
-
desc "parse", "Check the database for pcache logs and send them to SMS"
|
16
|
-
option :api_base_path,
|
17
|
-
|
18
|
-
|
19
|
-
option :
|
40
|
+
desc "parse", "Check the database for pcache logs and send them to the SMS-API"
|
41
|
+
option :api_base_path,
|
42
|
+
:default => 'http://dev.simplex.tv/creator/rest',
|
43
|
+
:aliases => %w(-a)
|
44
|
+
option :api_key,
|
45
|
+
:aliases => %w(-k)
|
46
|
+
option :simulate,
|
47
|
+
:type => :boolean,
|
48
|
+
:default => false,
|
49
|
+
:aliases => %w(-s)
|
50
|
+
option :verbose,
|
51
|
+
:type => :boolean,
|
52
|
+
:default => false,
|
53
|
+
:aliases => %w(-v)
|
20
54
|
def parse
|
21
55
|
start_time = Time.now
|
22
56
|
count = 0
|
@@ -25,44 +59,61 @@ module SmsLogparser
|
|
25
59
|
entries = mysql.get_entries
|
26
60
|
api = Api.new(options)
|
27
61
|
last_id = mysql.get_last_parse_id
|
62
|
+
status = STATUS[:ok]
|
28
63
|
entries.each do |entry|
|
29
|
-
if Parser.match(entry['Message'])
|
64
|
+
if Parser.match?(entry['Message'])
|
30
65
|
data = Parser.extract_data_from_msg(entry['Message'])
|
31
66
|
begin
|
32
67
|
urls = api.send(data)
|
33
68
|
rescue => e
|
34
69
|
say "Error: #{e.message}", :red
|
35
70
|
say "Aborting parser run...", :red
|
71
|
+
status = STATUS[:api_error]
|
36
72
|
break
|
37
73
|
end
|
38
74
|
last_id = entry['ID']
|
39
75
|
count += 1
|
40
|
-
|
76
|
+
if options[:verbose]
|
77
|
+
verbose_parser_output(data, urls, entry)
|
78
|
+
end
|
41
79
|
end
|
42
80
|
end
|
43
|
-
|
81
|
+
unless options[:simulate]
|
82
|
+
mysql.write_parse_result(last_id, count, status)
|
83
|
+
end
|
44
84
|
say "Started:\t", :cyan
|
45
85
|
say start_time.strftime('%d.%d.%Y %T')
|
46
86
|
say "Runtime:\t", :cyan
|
47
87
|
say "#{(Time.now - start_time).round(2)}s"
|
48
|
-
options[:simulate]
|
88
|
+
if options[:simulate]
|
89
|
+
say("Events found:\t", :cyan)
|
90
|
+
else
|
91
|
+
say("Events sent:\t", :cyan)
|
92
|
+
end
|
49
93
|
say count
|
50
94
|
rescue => e
|
51
95
|
say "Error: #{e.message}", :red
|
52
96
|
end
|
53
97
|
end
|
54
98
|
|
55
|
-
desc "
|
56
|
-
|
99
|
+
desc "history", "List the last paser runs"
|
100
|
+
option :results,
|
101
|
+
:type => :numeric,
|
102
|
+
:default => 10,
|
103
|
+
:aliases => %w(-n),
|
104
|
+
:desc => "Number of results to display"
|
105
|
+
def history
|
106
|
+
puts options
|
57
107
|
begin
|
58
|
-
runs = Mysql.new(options).last_runs
|
108
|
+
runs = Mysql.new(options).last_runs(options[:results])
|
59
109
|
if runs.size > 0
|
60
|
-
table = [%w(RunAt #Events LastEventID)]
|
61
|
-
runs.each do |run|
|
110
|
+
table = [%w(RunAt #Events LastEventID Status)]
|
111
|
+
runs.to_a.reverse.each do |run|
|
62
112
|
table << [
|
63
113
|
run['RunAt'],
|
64
114
|
run['EventsFound'],
|
65
|
-
run['LastEventID']
|
115
|
+
run['LastEventID'],
|
116
|
+
STATUS.index(run['Status']).upcase
|
66
117
|
]
|
67
118
|
end
|
68
119
|
print_table table
|
@@ -75,26 +126,46 @@ module SmsLogparser
|
|
75
126
|
end
|
76
127
|
|
77
128
|
desc "setup", "Create the parser table to track the last logs parsed"
|
129
|
+
option :force,
|
130
|
+
:type => :boolean,
|
131
|
+
:default => false,
|
132
|
+
:aliases => %w(-f),
|
133
|
+
:desc => "Drop an existing table if it exists"
|
78
134
|
def setup
|
79
135
|
begin
|
80
|
-
Mysql.new(options).create_parser_table
|
81
|
-
|
136
|
+
case Mysql.new(options).create_parser_table(options[:force])
|
137
|
+
when 0
|
138
|
+
say "OK, table created.", :green
|
139
|
+
when 1
|
140
|
+
say "Table already exists.", :yellow
|
141
|
+
end
|
82
142
|
rescue => e
|
83
143
|
say "Error: #{e.message}", :red
|
84
144
|
end
|
85
145
|
end
|
86
146
|
|
87
147
|
no_commands do
|
148
|
+
|
88
149
|
def verbose_parser_output(data, urls, entry)
|
89
150
|
say "ID:\t", :cyan
|
90
151
|
say entry['ID']
|
91
152
|
say "URL:\t", :cyan
|
92
153
|
say urls.join("\n\t")
|
93
154
|
say "Data:\t", :cyan
|
94
|
-
say data.map{|k,v| "#{k}:\t#{v}"}.join("\n\t")
|
155
|
+
say data.map{|k,v| "#{k}:\t#{v}"}.join("\n\t") || "\n"
|
156
|
+
puts
|
95
157
|
puts "-" * 100
|
96
158
|
puts
|
97
159
|
end
|
160
|
+
|
161
|
+
def options
|
162
|
+
original_options = super
|
163
|
+
filename = original_options[:config] || File.join(Dir.home, '.sms-logparser.yml')
|
164
|
+
return original_options unless File.exists?(filename)
|
165
|
+
defaults = ::YAML::load_file(filename) || {}
|
166
|
+
defaults.merge(original_options)
|
167
|
+
end
|
168
|
+
|
98
169
|
end
|
99
170
|
|
100
171
|
end
|
data/lib/sms-logparser/mysql.rb
CHANGED
@@ -14,27 +14,54 @@ module SmsLogparser
|
|
14
14
|
)
|
15
15
|
end
|
16
16
|
|
17
|
-
def last_runs
|
17
|
+
def last_runs(results = 10)
|
18
18
|
begin
|
19
19
|
runs = client.query(
|
20
|
-
"SELECT * FROM SmsParserRuns ORDER BY ID
|
20
|
+
"SELECT * FROM SmsParserRuns ORDER BY ID DESC LIMIT #{results}"
|
21
21
|
)
|
22
22
|
rescue Mysql2::Error => e
|
23
23
|
raise e
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
def
|
27
|
+
def parser_table_exists?
|
28
28
|
begin
|
29
29
|
return client.query(
|
30
|
-
"
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
30
|
+
"SHOW TABLES LIKE 'SmsParserRuns'"
|
31
|
+
).size > 0
|
32
|
+
rescue Mysql2::Error => e
|
33
|
+
raise e
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_parser_table(force = false)
|
38
|
+
if force
|
39
|
+
drop_parser_table
|
40
|
+
elsif parser_table_exists?
|
41
|
+
return 1
|
42
|
+
end
|
43
|
+
begin
|
44
|
+
client.query(
|
45
|
+
"CREATE TABLE SmsParserRuns(\
|
46
|
+
ID SERIAL PRIMARY KEY AUTO_INCREMENT,\
|
47
|
+
RunAt datetime DEFAULT NULL,\
|
48
|
+
LastEventID BIGINT(20) UNSIGNED DEFAULT 0,\
|
49
|
+
EventsFound INT DEFAULT 0,\
|
50
|
+
Status TINYINT UNSIGNED DEFAULT 0,\
|
51
|
+
INDEX `LastEventID_I1` (`LastEventID`)
|
52
|
+
)"
|
53
|
+
)
|
54
|
+
rescue Mysql2::Error => e
|
55
|
+
raise e
|
56
|
+
end
|
57
|
+
return 0
|
58
|
+
end
|
59
|
+
|
60
|
+
def drop_parser_table
|
61
|
+
return nil unless parser_table_exists?
|
62
|
+
begin
|
63
|
+
return client.query(
|
64
|
+
"DROP TABLE SmsParserRuns"
|
38
65
|
)
|
39
66
|
rescue Mysql2::Error => e
|
40
67
|
raise e
|
@@ -53,12 +80,13 @@ module SmsLogparser
|
|
53
80
|
end
|
54
81
|
end
|
55
82
|
|
56
|
-
def write_parse_result(id, count)
|
57
|
-
client.query("INSERT INTO SmsParserRuns(RunAt, LastEventID, EventsFound)\
|
83
|
+
def write_parse_result(id, count, status)
|
84
|
+
client.query("INSERT INTO SmsParserRuns(RunAt, LastEventID, EventsFound, Status)\
|
58
85
|
VALUES(\
|
59
86
|
'#{Time.now.strftime("%Y-%m-%d %H:%M:%S")}',\
|
60
87
|
#{id},\
|
61
|
-
#{count}
|
88
|
+
#{count},\
|
89
|
+
#{status}
|
62
90
|
)"
|
63
91
|
)
|
64
92
|
end
|
data/lib/sms-logparser/parser.rb
CHANGED
@@ -18,8 +18,14 @@ module SmsLogparser
|
|
18
18
|
}
|
19
19
|
end
|
20
20
|
|
21
|
-
def self.match(message)
|
22
|
-
|
21
|
+
def self.match?(message)
|
22
|
+
match = message.match(
|
23
|
+
/\/content\/.+\/(\w+\.(f4v|flv|mp4|mp3|ts|m3u8)) .+ (200|206)/i
|
24
|
+
)
|
25
|
+
if match
|
26
|
+
return true unless match[1] =~ /detect.mp4|index.m3u8/i
|
27
|
+
end
|
28
|
+
false
|
23
29
|
end
|
24
30
|
|
25
31
|
# see https://developer.mozilla.org/en-US/docs/Browser_detection_using_the_user_agent
|
data/sms-logparser.gemspec
CHANGED
@@ -18,6 +18,8 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
+
spec.required_ruby_version = '>= 1.9.3'
|
22
|
+
|
21
23
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
24
|
spec.add_development_dependency "rake"
|
23
25
|
|
data/spec/api_spec.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SmsLogparser::Api do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@api = SmsLogparser::Api.new(
|
7
|
+
simulate: true,
|
8
|
+
api_base_path: "http://myapi.com/rest/"
|
9
|
+
)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "sends the correct information to the api" do
|
13
|
+
data = {
|
14
|
+
:customer_id => 1,
|
15
|
+
:author_id => 2,
|
16
|
+
:project_id => 3,
|
17
|
+
:file => 'myfile.mp4',
|
18
|
+
:bytes => 128,
|
19
|
+
:user_agent => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko)",
|
20
|
+
:traffic_type => 'TRAFFIC_WEBCAST',
|
21
|
+
:visitor_type => 'VISITORS_WEBCAST'
|
22
|
+
}
|
23
|
+
urls = @api.send(data)
|
24
|
+
urls.size.must_equal 2
|
25
|
+
urls[0].must_match /.+\/1\/2\/3\/TRAFFIC_WEBCAST\/128$/
|
26
|
+
urls[1].must_match /.+\/1\/2\/3\/VISITORS_WEBCAST\/1$/
|
27
|
+
end
|
28
|
+
|
29
|
+
it "does not send traffic for m3u8 files" do
|
30
|
+
data = {
|
31
|
+
:customer_id => 100,
|
32
|
+
:author_id => 200,
|
33
|
+
:project_id => 300,
|
34
|
+
:file => 'myfile.m3u8',
|
35
|
+
:bytes => 512,
|
36
|
+
:user_agent => 'Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0',
|
37
|
+
:traffic_type => 'TRAFFIC_MOBILE',
|
38
|
+
:visitor_type => 'VISITORS_MOBILE'
|
39
|
+
}
|
40
|
+
urls = @api.send(data)
|
41
|
+
urls.size.must_equal 1
|
42
|
+
urls[0].must_match /.+\/100\/200\/300\/VISITORS_MOBILE\/1$/
|
43
|
+
end
|
44
|
+
|
45
|
+
it "does not send visitor info if no visitor_type" do
|
46
|
+
data = {
|
47
|
+
:customer_id => 101,
|
48
|
+
:author_id => 202,
|
49
|
+
:project_id => 303,
|
50
|
+
:file => 'myfile.mp4',
|
51
|
+
:bytes => 48,
|
52
|
+
:user_agent => 'Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0',
|
53
|
+
:traffic_type => 'TRAFFIC_MOBILE',
|
54
|
+
}
|
55
|
+
urls = @api.send(data)
|
56
|
+
urls.size.must_equal 1
|
57
|
+
urls[0].must_match /.+\/101\/202\/303\/TRAFFIC_MOBILE\/48$/
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
data/spec/cli_spec.rb
CHANGED
@@ -14,7 +14,7 @@ describe SmsLogparser::Cli do
|
|
14
14
|
out, err = capture_io do
|
15
15
|
TestHelper.sms_logparser.setup
|
16
16
|
end
|
17
|
-
out.must_match /OK
|
17
|
+
out.must_match /OK.*/
|
18
18
|
end
|
19
19
|
|
20
20
|
it "can parse a log database and find matches" do
|
@@ -40,15 +40,15 @@ describe SmsLogparser::Cli do
|
|
40
40
|
out.must_match /\s+0$/
|
41
41
|
end
|
42
42
|
|
43
|
-
it "
|
43
|
+
it "can show the parser history" do
|
44
44
|
TestHelper.seed_db(1)
|
45
45
|
parser = TestHelper.sms_logparser
|
46
46
|
parser.options[:api_base_path] = 'http://devnull-as-a-service.com/dev/null/'
|
47
47
|
out, err = capture_io do
|
48
48
|
TestHelper.sms_logparser.setup
|
49
49
|
parser.parse
|
50
|
-
parser.
|
50
|
+
parser.history
|
51
51
|
end
|
52
|
-
|
52
|
+
err.must_equal ""
|
53
53
|
end
|
54
54
|
end
|
data/spec/parser_spec.rb
CHANGED
@@ -4,41 +4,49 @@ describe SmsLogparser::Parser do
|
|
4
4
|
|
5
5
|
%w(f4v flv mp4 mp3 ts m3u8).each do |extension|
|
6
6
|
it "matches #{extension} files" do
|
7
|
-
SmsLogparser::Parser.match(
|
7
|
+
SmsLogparser::Parser.match?(
|
8
8
|
"GET /content/2/719/54986/file.#{extension} HTTP/1.1\" 200 6741309 "
|
9
|
-
).
|
9
|
+
).must_equal true
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
13
|
%w(jpg js css m4a docx).each do |extension|
|
14
14
|
it "does not matche #{extension} files" do
|
15
|
-
SmsLogparser::Parser.match(
|
15
|
+
SmsLogparser::Parser.match?(
|
16
16
|
"GET /content/2/719/54986/file.#{extension} HTTP/1.1\" 200 6741309 "
|
17
|
-
).
|
17
|
+
).must_equal false
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
21
|
%w(200 206).each do |status|
|
22
22
|
it "does match status code #{status}" do
|
23
|
-
SmsLogparser::Parser.match(
|
23
|
+
SmsLogparser::Parser.match?(
|
24
24
|
"GET /content/2/719/54986/file.mp4 HTTP/1.1\" #{status} 50000 "
|
25
|
-
).
|
25
|
+
).must_equal true
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
29
|
%w(404 500 304).each do |status|
|
30
30
|
it "does not match status code #{status}" do
|
31
|
-
SmsLogparser::Parser.match(
|
31
|
+
SmsLogparser::Parser.match?(
|
32
32
|
"GET /content/2/719/54986/file.mp4 HTTP/1.1\" #{status} 50000 "
|
33
|
-
).
|
33
|
+
).must_equal false
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
%w(contents public index
|
37
|
+
%w(contents public index assets).each do |dir|
|
38
38
|
it "does not match directories other than /content" do
|
39
|
-
SmsLogparser::Parser.match(
|
39
|
+
SmsLogparser::Parser.match?(
|
40
40
|
"GET /#{dir}/2/719/54986/file.mp4 HTTP/1.1\" 200 50000 "
|
41
|
-
).
|
41
|
+
).must_equal false
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
%w(detect.mp4 index.m3u8).each do |file|
|
46
|
+
it "does not match excluded files" do
|
47
|
+
SmsLogparser::Parser.match?(
|
48
|
+
"GET /content/2/719/54986/#{file} HTTP/1.1\" 200 128 "
|
49
|
+
).must_equal false
|
42
50
|
end
|
43
51
|
end
|
44
52
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sms-logparser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- niwo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -101,6 +101,7 @@ files:
|
|
101
101
|
- lib/sms-logparser/parser.rb
|
102
102
|
- lib/sms-logparser/version.rb
|
103
103
|
- sms-logparser.gemspec
|
104
|
+
- spec/api_spec.rb
|
104
105
|
- spec/cli_spec.rb
|
105
106
|
- spec/parser_spec.rb
|
106
107
|
- spec/spec_helper.rb
|
@@ -116,7 +117,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
116
117
|
requirements:
|
117
118
|
- - '>='
|
118
119
|
- !ruby/object:Gem::Version
|
119
|
-
version:
|
120
|
+
version: 1.9.3
|
120
121
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
122
|
requirements:
|
122
123
|
- - '>='
|
@@ -129,6 +130,7 @@ signing_key:
|
|
129
130
|
specification_version: 4
|
130
131
|
summary: SMS Logparser
|
131
132
|
test_files:
|
133
|
+
- spec/api_spec.rb
|
132
134
|
- spec/cli_spec.rb
|
133
135
|
- spec/parser_spec.rb
|
134
136
|
- spec/spec_helper.rb
|