bind_log_analyzer 0.2.3 → 0.2.4
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.
- checksums.yaml +7 -0
- data/.rspec +1 -0
- data/README.md +48 -15
- data/Rakefile +3 -3
- data/bin/bind_log_analyzer +13 -6
- data/bind_log_analyzer.gemspec +2 -0
- data/lib/bind_log_analyzer/base.rb +14 -8
- data/lib/bind_log_analyzer/version.rb +1 -1
- data/lib/bind_log_analyzer/web_server.rb +4 -4
- data/lib/models/log.rb +6 -2
- data/spec/bind_log_analyzer_spec.rb +47 -24
- metadata +79 -35
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 73d6e2a5532462fc85106a803d3398cd85c038af
|
4
|
+
data.tar.gz: 93b13cf73e6491fbc2a836e5cd39f42a7e8d3b19
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2c948ff70f1a7f56c0000996a6ecff63525d8450c1e849b2f71303f7c41e55dd91c23021f994fb7397792eef0b595c130753542cfda2150b89495930dbc39fa1
|
7
|
+
data.tar.gz: c6488eadea3f12fc2afd3effd3b99ca6756ee67c737c2939cb5795cef2f811800583de2a7f2611908ab28c89cae1d9cdecc9e9453056c2d3379de9ce1abf3813
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@ The gem includes a web interface to analyze the data collected from the analyzed
|
|
9
9
|
|
10
10
|
This gem was tested with:
|
11
11
|
|
12
|
-
- ruby-1.
|
12
|
+
- ruby-2.1.x
|
13
13
|
- rubygem (1.8.15)
|
14
14
|
- bundler (1.0.21)
|
15
15
|
- activerecord (3.2.2)
|
@@ -48,15 +48,17 @@ or the regexp will fail :(
|
|
48
48
|
To store the logs you can use every database supported by ActiveRecord. Just create a database and a user with the right privileges. You can provide the -s flag to *BindLogAnalyzer* to make it create the table. Otherwise create it by yourself.
|
49
49
|
This is the MySQL CREATE TABLE syntax:
|
50
50
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
51
|
+
```
|
52
|
+
CREATE TABLE `logs` (
|
53
|
+
`id` int(11) NOT NULL AUTO_INCREMENT,
|
54
|
+
`date` datetime NOT NULL,
|
55
|
+
`client` varchar(255) NOT NULL,
|
56
|
+
`query` varchar(255) NOT NULL,
|
57
|
+
`q_type` varchar(255) NOT NULL,
|
58
|
+
`server` varchar(255) NOT NULL,
|
59
|
+
PRIMARY KEY (`id`)
|
60
|
+
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;
|
61
|
+
```
|
60
62
|
|
61
63
|
## Usage
|
62
64
|
|
@@ -84,7 +86,7 @@ The database credentials can be provided using the needed flags or creating a YA
|
|
84
86
|
host: localhost
|
85
87
|
port: 3306
|
86
88
|
username: root
|
87
|
-
password:
|
89
|
+
password:
|
88
90
|
|
89
91
|
There are two usage of the gem:
|
90
92
|
|
@@ -108,7 +110,7 @@ A good way to use this script is to let it be launched by **logrotate** so creat
|
|
108
110
|
exec su - YOUR_USER -c '/usr/local/bin/update_bind_log_analyzer.sh /var/log/named/query.log.1'
|
109
111
|
fi
|
110
112
|
endscript
|
111
|
-
}
|
113
|
+
}
|
112
114
|
|
113
115
|
The script **/usr/local/bin/update_bind_log_analyzer.sh** can be wherever you prefer. Its typical content if you use RVM and a dedicated gemset for *BindLogAnalyzer*, can be:
|
114
116
|
|
@@ -132,14 +134,45 @@ The script **/usr/local/bin/update_bind_log_analyzer.sh** can be wherever you pr
|
|
132
134
|
|
133
135
|
On a 1.6 Ghz Intel Core i5 with SSD SATA2 disk, using Ruby-1.9.3-p125 and MySQL 5.5.15, this is the performance:
|
134
136
|
|
135
|
-
~$ time bind_log_analyzer -f query.log -c database.yml
|
137
|
+
~$ time bind_log_analyzer -f query.log -c database.yml
|
136
138
|
Analyzed 319758 lines and correctly stored 319758 logs
|
137
139
|
bind_log_analyzer -f query.log -c database.yml 322,44s user 22,90s system 76% cpu 7:33,17 total
|
138
|
-
|
140
|
+
|
139
141
|
which is equivalent to ±706 query/sec.
|
140
142
|
|
143
|
+
## Development
|
144
|
+
|
145
|
+
First, create a database and add its credentials in the `database.yml` file.
|
146
|
+
|
147
|
+
Then create the `logs` table with the following query:
|
148
|
+
|
149
|
+
```
|
150
|
+
CREATE TABLE `logs` (
|
151
|
+
`id` int(11) NOT NULL AUTO_INCREMENT,
|
152
|
+
`date` datetime NOT NULL,
|
153
|
+
`client` varchar(255) NOT NULL,
|
154
|
+
`query` varchar(255) NOT NULL,
|
155
|
+
`q_type` varchar(255) NOT NULL,
|
156
|
+
`server` varchar(255) NOT NULL,
|
157
|
+
PRIMARY KEY (`id`)
|
158
|
+
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;
|
159
|
+
```
|
160
|
+
|
161
|
+
### Run tests
|
162
|
+
|
163
|
+
```
|
164
|
+
bundle exec rspec
|
165
|
+
```
|
166
|
+
|
141
167
|
## Changelog
|
142
168
|
|
169
|
+
###0.2.4
|
170
|
+
|
171
|
+
Support both old and new Bind log versions
|
172
|
+
Add `--bind` option to the cli to bind Sinatra on specified IP
|
173
|
+
Reverse the order of the last queries in the GUI
|
174
|
+
Fix tests
|
175
|
+
|
143
176
|
### 0.2.3
|
144
177
|
|
145
178
|
Added the -u|--uniqueness flag to check if a record exists in the db before inserting a new one
|
@@ -158,4 +191,4 @@ First version including the web interface
|
|
158
191
|
|
159
192
|
### 0.1.0
|
160
193
|
|
161
|
-
First stable version
|
194
|
+
First stable version
|
data/Rakefile
CHANGED
@@ -30,7 +30,7 @@ end
|
|
30
30
|
task :build do
|
31
31
|
system "gem build bind_log_analyzer.gemspec"
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
task :release => :build do
|
35
35
|
system "gem push pkg/bind_log_analyzer-#{BindLogAnalyzer::VERSION}.gem"
|
36
36
|
end
|
@@ -66,7 +66,7 @@ SQL
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
task :environment do
|
71
71
|
DATABASE_ENV = ENV['DATABASE_ENV'] || 'development'
|
72
72
|
MIGRATIONS_DIR = ENV['MIGRATIONS_DIR'] || 'db/migrate'
|
@@ -107,4 +107,4 @@ SQL
|
|
107
107
|
task :version => :configure_connection do
|
108
108
|
puts "Current version: #{ActiveRecord::Migrator.current_version}"
|
109
109
|
end
|
110
|
-
end
|
110
|
+
end
|
data/bin/bind_log_analyzer
CHANGED
@@ -8,6 +8,7 @@ require "optparse"
|
|
8
8
|
@database_confs = nil
|
9
9
|
@setup_database = false
|
10
10
|
@webserver = false
|
11
|
+
@webserver_ip = nil
|
11
12
|
@webserver_port = nil
|
12
13
|
@db_yaml = nil
|
13
14
|
@db_adapter = 'mysql2'
|
@@ -47,6 +48,11 @@ optparse = OptionParser.new do |opts|
|
|
47
48
|
@webserver_port = opt if opt != true
|
48
49
|
end
|
49
50
|
|
51
|
+
opts.on( '-b', '--bind [IP_ADDRESS]', "Sinatra will listen on the specified IP (default: 127.0.0.1)" ) do |opt|
|
52
|
+
@webserver = true
|
53
|
+
@webserver_ip = opt if opt != true
|
54
|
+
end
|
55
|
+
|
50
56
|
opts.on( '-s', '--setup', "Creates the needed tables in the database." ) do |opt|
|
51
57
|
@setup_database = true
|
52
58
|
end
|
@@ -116,15 +122,16 @@ EOF
|
|
116
122
|
@log_level = 1 if @log_level == 0
|
117
123
|
logger = BindLogAnalyzer::LogUtils.set_log_level(@log_level)
|
118
124
|
BindLogAnalyzer::Connector.establish_connection(@database_confs, logger)
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
125
|
+
|
126
|
+
@webserver_ip ||= '127.0.0.1'
|
127
|
+
@webserver_port ||= "4567"
|
128
|
+
puts @webserver_ip
|
129
|
+
BindLogAnalyzer::WebServer.run!({ bind: @webserver_ip, port: @webserver_port.to_i})
|
130
|
+
|
124
131
|
elsif @filename
|
125
132
|
base = BindLogAnalyzer::Base.new(@database_confs, @filename, @setup_database, @log_level, @check_uniq)
|
126
133
|
base.analyze
|
127
134
|
else
|
128
135
|
puts optparse.banner
|
129
136
|
exit -1
|
130
|
-
end
|
137
|
+
end
|
data/bind_log_analyzer.gemspec
CHANGED
@@ -22,6 +22,8 @@ Gem::Specification.new do |s|
|
|
22
22
|
s.add_dependency "json"
|
23
23
|
s.add_dependency "sinatra"
|
24
24
|
s.add_dependency "haml"
|
25
|
+
s.add_development_dependency "rake"
|
25
26
|
s.add_development_dependency "rspec"
|
26
27
|
s.add_development_dependency "simplecov"
|
28
|
+
s.add_development_dependency "pry"
|
27
29
|
end
|
@@ -12,7 +12,7 @@ module BindLogAnalyzer
|
|
12
12
|
# @attribute [r]
|
13
13
|
# @return [String] The file containing the logs to be analyzed
|
14
14
|
attr_reader :log_filename
|
15
|
-
|
15
|
+
|
16
16
|
# The constructor of BindLogAnalyzer::Base sets some vars and manages the setup of the database
|
17
17
|
# @param [Hash, String] database_params The path to the database configurations file or a hash containing such informations
|
18
18
|
# @param [String] logfile The path to the file containing the Bind's logs to analyze
|
@@ -35,7 +35,7 @@ module BindLogAnalyzer
|
|
35
35
|
if FileTest.exists?(logfile)
|
36
36
|
@log_filename = logfile
|
37
37
|
else
|
38
|
-
@log.error
|
38
|
+
@log.error("The provided log file doesn't exist")
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
@@ -50,14 +50,20 @@ module BindLogAnalyzer
|
|
50
50
|
# @return [Hash, false] The hash containing the parsed line or false if the line couldn't be parsed
|
51
51
|
def parse_line(line)
|
52
52
|
query = {}
|
53
|
-
regexp =
|
54
|
-
|
53
|
+
regexp = /^(\d{2}-\w{3}-\d{4}\s+\d{2}:\d{2}:\d{2}\.\d{3})\s+client\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})#\d+\s+\(.+\):\s+query:\s+(.*)\s+IN\s+(\w+)\s+\+\s+\((\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\)$/
|
54
|
+
old_regexp = /^(\d{2}-\w{3}-\d{4}\s+\d{2}:\d{2}:\d{2}\.\d{3})\s+client\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})#\d+:\s+query:\s+(.*)\s+IN\s+(\w+)\s+\+\s+\((\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\)$/
|
55
|
+
|
55
56
|
parsed_line = line.scan(regexp)
|
57
|
+
# Try the old version
|
58
|
+
if parsed_line.size == 0
|
59
|
+
parsed_line = line.scan(old_regexp)
|
60
|
+
end
|
61
|
+
|
56
62
|
if parsed_line.size > 0
|
57
63
|
# Parse timestamp
|
58
64
|
parsed_timestamp = Date._strptime(parsed_line[0][0], "%d-%b-%Y %H:%M:%S.%L")
|
59
65
|
query_time = Time.local(parsed_timestamp[:year], parsed_timestamp[:mon], parsed_timestamp[:mday], parsed_timestamp[:hour], parsed_timestamp[:min], parsed_timestamp[:sec], parsed_timestamp[:sec_fraction], parsed_timestamp[:zone])
|
60
|
-
|
66
|
+
|
61
67
|
query[:date] = query_time
|
62
68
|
query[:client] = parsed_line[0][1]
|
63
69
|
query[:query] = parsed_line[0][2]
|
@@ -71,7 +77,7 @@ module BindLogAnalyzer
|
|
71
77
|
end
|
72
78
|
end
|
73
79
|
|
74
|
-
# Stores the parsed log line into the database and increments @stored_queries if successful.
|
80
|
+
# Stores the parsed log line into the database and increments @stored_queries if successful.
|
75
81
|
# It checks the uniqueness of a record if the @check_uniq flag is set
|
76
82
|
# @param [Hash] query The log line parsed by #parse_line
|
77
83
|
def store_query(query)
|
@@ -97,7 +103,7 @@ module BindLogAnalyzer
|
|
97
103
|
# @return [true, false] False if there's a problem with the log file. True elsewhere.
|
98
104
|
def analyze
|
99
105
|
return false unless @log_filename
|
100
|
-
|
106
|
+
|
101
107
|
lines = 0
|
102
108
|
File.new(@log_filename).each do |line|
|
103
109
|
@log.debug "Got line: \"#{line}\""
|
@@ -112,4 +118,4 @@ module BindLogAnalyzer
|
|
112
118
|
return true
|
113
119
|
end
|
114
120
|
end
|
115
|
-
end
|
121
|
+
end
|
@@ -9,19 +9,19 @@ module BindLogAnalyzer
|
|
9
9
|
|
10
10
|
set :static, true
|
11
11
|
set :public_folder, File.expand_path('../../../resources/assets/', __FILE__)
|
12
|
-
|
12
|
+
|
13
13
|
set :views, File.expand_path('../../../resources/views/', __FILE__)
|
14
14
|
set :haml, { :format => :html5 }
|
15
15
|
|
16
16
|
# Root serving Backbone.js
|
17
17
|
get '/' do
|
18
|
-
@logs = Log.
|
18
|
+
@logs = Log.last_queries
|
19
19
|
haml :index, :layout => :layout
|
20
20
|
end
|
21
21
|
|
22
22
|
# Last 30 queries
|
23
23
|
get '/last_queries' do
|
24
|
-
@logs = Log.
|
24
|
+
@logs = Log.last_queries
|
25
25
|
haml :last_queries, :layout => :layout
|
26
26
|
end
|
27
27
|
|
@@ -42,4 +42,4 @@ module BindLogAnalyzer
|
|
42
42
|
{ :key1 => 'value1', :key2 => 'value2' }.to_json
|
43
43
|
end
|
44
44
|
end
|
45
|
-
end
|
45
|
+
end
|
data/lib/models/log.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
# The Log object represents a log line of a Bind's query
|
2
2
|
class Log < ActiveRecord::Base
|
3
|
-
|
3
|
+
# Shows last 30 queries
|
4
|
+
def self.last_queries
|
5
|
+
self.order(date: :desc).limit(30)
|
6
|
+
end
|
7
|
+
|
4
8
|
# Shows 50 top queries
|
5
9
|
def self.top_queries
|
6
10
|
self.select('query, count(*) as hits').group(:query).order('hits DESC').limit(50)
|
@@ -10,4 +14,4 @@ class Log < ActiveRecord::Base
|
|
10
14
|
def self.top_clients
|
11
15
|
self.select('client, count(*) as hits').group(:client).order('hits DESC').limit(50)
|
12
16
|
end
|
13
|
-
end
|
17
|
+
end
|
@@ -2,7 +2,7 @@ require File.join(File.dirname(__FILE__), 'spec_helper')
|
|
2
2
|
|
3
3
|
describe BindLogAnalyzer do
|
4
4
|
before :all do
|
5
|
-
@db_params = YAML::load(File.open(File.join(File.dirname(__FILE__), '..', '
|
5
|
+
@db_params = YAML::load(File.open(File.join(File.dirname(__FILE__), '..', 'database.yml')))['database']
|
6
6
|
|
7
7
|
# Create a test logfile
|
8
8
|
@filename = 'test_file.log'
|
@@ -11,7 +11,7 @@ describe BindLogAnalyzer do
|
|
11
11
|
28-Mar-2012 16:48:32.412 client 192.168.10.201#60303: query: google.com IN AAAA + (192.168.10.1)
|
12
12
|
28-Mar-2012 16:48:32.898 client 192.168.10.114#53309: query: www.nasa.gov IN A + (192.168.10.1)
|
13
13
|
EOF
|
14
|
-
|
14
|
+
|
15
15
|
File.open(@filename, 'w') { |f| f.write(@doc) } unless FileTest.exists?(@filename)
|
16
16
|
end
|
17
17
|
|
@@ -20,22 +20,14 @@ EOF
|
|
20
20
|
File.delete(@filename) if FileTest.exists?(@filename)
|
21
21
|
end
|
22
22
|
|
23
|
-
before :each do
|
24
|
-
end
|
25
|
-
|
26
|
-
#it "can't be instantiated without database params" do
|
27
|
-
# base = BindLogAnalyzer::Base.new
|
28
|
-
# ??
|
29
|
-
#end
|
30
|
-
|
31
23
|
it "can be instantiated without a logfile" do
|
32
24
|
base = BindLogAnalyzer::Base.new(@db_params)
|
33
|
-
base.logfile.
|
25
|
+
expect(base.logfile).to be_nil
|
34
26
|
end
|
35
27
|
|
36
28
|
it "permit setting a logfile from initializer" do
|
37
29
|
@base = BindLogAnalyzer::Base.new(@db_params, @filename)
|
38
|
-
@base.logfile.
|
30
|
+
expect(@base.logfile).to eq(@filename)
|
39
31
|
end
|
40
32
|
|
41
33
|
it "should update the logfile name" do
|
@@ -47,7 +39,7 @@ EOF
|
|
47
39
|
File.open(@new_filename, 'w') { |f| f.write(doc) } unless FileTest.exists?(@new_filename)
|
48
40
|
|
49
41
|
@base.logfile = @new_filename
|
50
|
-
@base.logfile.
|
42
|
+
expect(@base.logfile).to eq(@new_filename)
|
51
43
|
|
52
44
|
# Delete the file
|
53
45
|
File.delete(@new_filename)
|
@@ -56,31 +48,62 @@ EOF
|
|
56
48
|
it "shouldn't update the logfile name if it doesn't exist" do
|
57
49
|
@base = BindLogAnalyzer::Base.new(@db_params, @filename)
|
58
50
|
@base.logfile = 'unexisting_test_file'
|
59
|
-
@base.logfile.
|
51
|
+
expect(@base.logfile).not_to eq('unexisting_test_file')
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should correctly parse a Bind log (>= 9.9.x)" do
|
55
|
+
@base = BindLogAnalyzer::Base.new(@db_params, @filename)
|
56
|
+
lines = [
|
57
|
+
{
|
58
|
+
line: "25-Nov-2015 10:29:53.073 client 192.168.16.7#60458 (host.example.com): query: host.example.com IN A + (192.168.16.1)",
|
59
|
+
test_line: {
|
60
|
+
date: Time.local('2015','Nov', 25, 10, 29, 53),
|
61
|
+
client: "192.168.16.7",
|
62
|
+
query: "host.example.com",
|
63
|
+
q_type: "A",
|
64
|
+
server: "192.168.16.1"
|
65
|
+
}
|
66
|
+
},
|
67
|
+
{
|
68
|
+
line: "03-Mar-2016 21:36:47.901 client 192.168.100.105#39709 (cm.g.doubleclick.net): query: cm.g.doubleclick.net IN A + (192.168.100.2)",
|
69
|
+
test_line: {
|
70
|
+
date: Time.local('2016','Mar', 3, 21, 36, 47),
|
71
|
+
client: "192.168.100.105",
|
72
|
+
query: "cm.g.doubleclick.net",
|
73
|
+
q_type: "A",
|
74
|
+
server: "192.168.100.2"
|
75
|
+
}
|
76
|
+
}
|
77
|
+
]
|
78
|
+
|
79
|
+
lines.each do |obj|
|
80
|
+
parsed_line = @base.parse_line(obj[:line])
|
81
|
+
expect(parsed_line).to eq(obj[:test_line])
|
82
|
+
end
|
60
83
|
end
|
61
84
|
|
62
|
-
it "should correctly parse
|
85
|
+
it "should correctly parse old Bind versions logs" do
|
63
86
|
@base = BindLogAnalyzer::Base.new(@db_params, @filename)
|
64
87
|
line = "28-Mar-2012 16:48:32.412 client 192.168.10.201#60303: query: google.com IN AAAA + (192.168.10.1)"
|
65
88
|
test_line = {
|
66
|
-
date: Time.local('2012','mar',28, 16, 48,
|
89
|
+
date: Time.local('2012','mar',28, 16, 48, 32),
|
67
90
|
client: "192.168.10.201",
|
68
91
|
query: "google.com",
|
69
|
-
|
92
|
+
q_type: "AAAA",
|
70
93
|
server: "192.168.10.1"
|
71
94
|
}
|
72
95
|
parsed_line = @base.parse_line(line)
|
73
|
-
parsed_line.
|
96
|
+
expect(parsed_line).to eq(test_line)
|
74
97
|
end
|
75
98
|
|
76
|
-
it "should be connected after setup_db is called" do
|
77
|
-
|
78
|
-
|
79
|
-
end
|
99
|
+
# it "should be connected after setup_db is called" do
|
100
|
+
# @base = BindLogAnalyzer::Base.new(@db_params, @filename)
|
101
|
+
# expect(@base.connected?).to be true
|
102
|
+
# end
|
80
103
|
|
81
104
|
it "should be possible to instantiate a Log class after BindLogAnalyzer::Base initialization" do
|
82
105
|
@base = BindLogAnalyzer::Base.new(@db_params, @filename)
|
83
106
|
log = Log.new
|
84
|
-
log.class.
|
107
|
+
expect(log.class).not_to be_instance_of(NilClass)
|
85
108
|
end
|
86
|
-
end
|
109
|
+
end
|
metadata
CHANGED
@@ -1,82 +1,127 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bind_log_analyzer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.4
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Tommaso Visconti
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2016-03-05 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: activerecord
|
16
|
-
requirement:
|
17
|
-
none: false
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
|
-
version_requirements:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
25
27
|
- !ruby/object:Gem::Dependency
|
26
28
|
name: json
|
27
|
-
requirement:
|
28
|
-
none: false
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
29
30
|
requirements:
|
30
|
-
- -
|
31
|
+
- - ">="
|
31
32
|
- !ruby/object:Gem::Version
|
32
33
|
version: '0'
|
33
34
|
type: :runtime
|
34
35
|
prerelease: false
|
35
|
-
version_requirements:
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
36
41
|
- !ruby/object:Gem::Dependency
|
37
42
|
name: sinatra
|
38
|
-
requirement:
|
39
|
-
none: false
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
40
44
|
requirements:
|
41
|
-
- -
|
45
|
+
- - ">="
|
42
46
|
- !ruby/object:Gem::Version
|
43
47
|
version: '0'
|
44
48
|
type: :runtime
|
45
49
|
prerelease: false
|
46
|
-
version_requirements:
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
47
55
|
- !ruby/object:Gem::Dependency
|
48
56
|
name: haml
|
49
|
-
requirement:
|
50
|
-
none: false
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
51
58
|
requirements:
|
52
|
-
- -
|
59
|
+
- - ">="
|
53
60
|
- !ruby/object:Gem::Version
|
54
61
|
version: '0'
|
55
62
|
type: :runtime
|
56
63
|
prerelease: false
|
57
|
-
version_requirements:
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
58
83
|
- !ruby/object:Gem::Dependency
|
59
84
|
name: rspec
|
60
|
-
requirement:
|
61
|
-
none: false
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
62
86
|
requirements:
|
63
|
-
- -
|
87
|
+
- - ">="
|
64
88
|
- !ruby/object:Gem::Version
|
65
89
|
version: '0'
|
66
90
|
type: :development
|
67
91
|
prerelease: false
|
68
|
-
version_requirements:
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
98
|
name: simplecov
|
71
|
-
requirement:
|
72
|
-
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
107
|
requirements:
|
74
|
-
- -
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: pry
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
75
116
|
- !ruby/object:Gem::Version
|
76
117
|
version: '0'
|
77
118
|
type: :development
|
78
119
|
prerelease: false
|
79
|
-
version_requirements:
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
80
125
|
description: BindLogAnalyzer analyzes a Bind query log file and stores its data into
|
81
126
|
a SQL database using ActiveRecord. It provides a fancy web interface to show some
|
82
127
|
query stats and graphs.
|
@@ -87,7 +132,8 @@ executables:
|
|
87
132
|
extensions: []
|
88
133
|
extra_rdoc_files: []
|
89
134
|
files:
|
90
|
-
- .gitignore
|
135
|
+
- ".gitignore"
|
136
|
+
- ".rspec"
|
91
137
|
- Gemfile
|
92
138
|
- README.md
|
93
139
|
- Rakefile
|
@@ -144,30 +190,28 @@ files:
|
|
144
190
|
- spec/spec_helper.rb
|
145
191
|
homepage: https://github.com/tommyblue/Bind-Log-Analyzer
|
146
192
|
licenses: []
|
193
|
+
metadata: {}
|
147
194
|
post_install_message:
|
148
195
|
rdoc_options: []
|
149
196
|
require_paths:
|
150
197
|
- lib
|
151
198
|
required_ruby_version: !ruby/object:Gem::Requirement
|
152
|
-
none: false
|
153
199
|
requirements:
|
154
|
-
- -
|
200
|
+
- - ">="
|
155
201
|
- !ruby/object:Gem::Version
|
156
202
|
version: '0'
|
157
203
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
158
|
-
none: false
|
159
204
|
requirements:
|
160
|
-
- -
|
205
|
+
- - ">="
|
161
206
|
- !ruby/object:Gem::Version
|
162
207
|
version: '0'
|
163
208
|
requirements: []
|
164
209
|
rubyforge_project: bind_log_analyzer
|
165
|
-
rubygems_version:
|
210
|
+
rubygems_version: 2.2.2
|
166
211
|
signing_key:
|
167
|
-
specification_version:
|
212
|
+
specification_version: 4
|
168
213
|
summary: Log analysis and SQL storage for Bind DNS server
|
169
214
|
test_files:
|
170
215
|
- spec/bind_log_analyzer_spec.rb
|
171
216
|
- spec/spec.opts
|
172
217
|
- spec/spec_helper.rb
|
173
|
-
has_rdoc:
|