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.
@@ -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.9.3-p125
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
- CREATE TABLE `logs` (
52
- `id` int(11) NOT NULL AUTO_INCREMENT,
53
- `date` datetime NOT NULL,
54
- `client` varchar(255) NOT NULL,
55
- `query` varchar(255) NOT NULL,
56
- `q_type` varchar(255) NOT NULL,
57
- `server` varchar(255) NOT NULL,
58
- PRIMARY KEY (`id`)
59
- ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;
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
@@ -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
- if @webserver_port
120
- BindLogAnalyzer::WebServer.run!({ port: @webserver_port.to_i})
121
- else
122
- BindLogAnalyzer::WebServer.run!
123
- end
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
@@ -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 = "The provided log file doesn't exist"
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 = %r{^(\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})\)$}
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
@@ -1,4 +1,4 @@
1
1
  module BindLogAnalyzer
2
2
  # @return [String] The version of the gem
3
- VERSION = "0.2.3"
3
+ VERSION = "0.2.4"
4
4
  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.limit(30)
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.limit(30)
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
@@ -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__), '..', 'config', 'databases.yml')))['database']
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.should == nil
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.should == @filename
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.should == @new_filename
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.should_not == 'unexisting_test_file'
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 a line" do
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, 31),
89
+ date: Time.local('2012','mar',28, 16, 48, 32),
67
90
  client: "192.168.10.201",
68
91
  query: "google.com",
69
- type: "AAAA",
92
+ q_type: "AAAA",
70
93
  server: "192.168.10.1"
71
94
  }
72
95
  parsed_line = @base.parse_line(line)
73
- parsed_line.should == test_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
- @base = BindLogAnalyzer::Base.new(@db_params, @filename)
78
- @base.connected?.should == true
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.should_not == NilClass
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.3
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: 2012-04-10 00:00:00.000000000 Z
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: &11031580 !ruby/object:Gem::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: *11031580
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: &11031060 !ruby/object:Gem::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: *11031060
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: &11131100 !ruby/object:Gem::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: *11131100
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: &11130560 !ruby/object:Gem::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: *11130560
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: &11130060 !ruby/object:Gem::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: *11130060
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: &11129560 !ruby/object:Gem::Requirement
72
- none: false
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: *11129560
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: 1.8.15
210
+ rubygems_version: 2.2.2
166
211
  signing_key:
167
- specification_version: 3
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: