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.
@@ -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: