bind_log_analyzer 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|