dns-sniper 0.0.1pre → 0.0.1.pre2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9c6bab67f9579e0762d197d29dd188ced90277fa05573bb84e472be2c42a5a3e
4
- data.tar.gz: 4123ba5a1c02a7f5d4972055b4b1743aae7bd4f995cd1336626a3f8a68ca7e23
3
+ metadata.gz: 4e0cfd33b8c953620c67bd40ea77e26ed12f7a9a10716918ee130a87a8617975
4
+ data.tar.gz: 9c74827c20d2d3a6cef9ca2876eb9659475401088e05d963778eed19c6d11374
5
5
  SHA512:
6
- metadata.gz: 479adbba0f5d557ef178acadc65461ee0be27684f4a4ab95bdd8f2b129a15b2583658fcea86193ee1c30519c5dba712b6c784619d79eaa345b7fcd993a1a19c1
7
- data.tar.gz: b5ef2952418417f81d8c47b7cfe3052fe5e18242d5d87c3328f9713b5175bf94f48dc0ac3e3a9c8b4ddcc944637f2d8aea07fef00d15dc2b84c24e8f72fc3b8c
6
+ metadata.gz: 57d9eaeeb39531a8ec3a5ca9bc0ea21e4dd8277c97b7ecb01fbd49f3109db725efc58096ce60768fb20585d19de26880e34c97e10f2011d2e4ea4e58d09d8d00
7
+ data.tar.gz: e673010ec9e40910411c4cb63f9f018c70faff0704bc96fc060900cf1188d74df37571821509e06bc98b7092c31b6cf0c8fab615f78fe086ecf892f199ddbbd8
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
- source "https://rubygems.org"
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
2
4
 
3
5
  gemspec
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2020 Brody Hoskins
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,77 @@
1
+ # dns-sniper
2
+
3
+ dns-sniper is a command line utility that combines online DNS blacklists and combines them into the desired configuration format.
4
+
5
+ ## Supported Formats
6
+
7
+ ### Input formats
8
+
9
+ * HOSTS
10
+ * plaintext (hostnames as newline-seperated list)
11
+
12
+ ### Output formats
13
+
14
+ * bind 8
15
+ * dnsmasq
16
+ * HOSTS
17
+ * plaintext (hostnames as newline-seperated list)
18
+ * unbound
19
+
20
+ ## Installation
21
+
22
+ Using bundler, add to the `Gemfile`:
23
+
24
+ ```ruby
25
+ gem 'dns-sniper'
26
+ ```
27
+
28
+ Or standalone:
29
+
30
+ ```
31
+ $ gem install dns-sniper
32
+ ```
33
+
34
+ ## Sample Usage
35
+
36
+ ### From within Ruby
37
+
38
+ ```ruby
39
+ require 'dns-sniper'
40
+
41
+ hostnames = DNSSniper::Hostnames.new
42
+
43
+ # Block domain names
44
+ hostnames.add_from('https://pgl.yoyo.org/as/serverlist.php?hostformat=hosts;showintro=0;mimetype=plaintext') # From the web
45
+ hostnames.add_from('https://raw.githubusercontent.com/brodyhoskins/dns-blocklists/master/tracking.list')
46
+ hostnames.add_from('~/.config/dns-sniper/blocklists.list') # From filesystem
47
+
48
+ # Manually add domain name
49
+ hostnames.add('ads.yahoo.com')
50
+ hostnames.add(['ads.doubleclick.net', 'ads.msn.com'])
51
+
52
+ # Remove whitelisted domain names
53
+ hostnames.remove_from('~/.config/dns-sniper/whitelisted-hostnames.list')
54
+ hostnames.remove_from('https://example.com/whitelisted.hosts')
55
+
56
+ # Manually remove domain name
57
+ hostnames.remove('favoritewebsite.com')
58
+ hostnames.remove(['favoritewebsite.com', 'otherfavoritewebsite.com'])
59
+
60
+ # Convert to configuration file
61
+ hostnames.to_format('dnsmasq')
62
+ hostnames.to_format('unbound')
63
+ ```
64
+
65
+ ### From CLI
66
+
67
+ See `dns-sniper --help`
68
+
69
+ Using the CLI version makes it easy to update configuration formats automatically. For example:
70
+
71
+ ```bash
72
+ #!/usr/bin/env bash
73
+
74
+ /path/to/dns-sniper -f ~/.config/dns-sniper/blacklist.list -w ~/.config/dns-sniper/whitelist.list -o unbound > /etc/unbound/unbound.conf.t/blocklist.conf
75
+
76
+ service unbound reload
77
+ ```
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
6
- task :default => :spec
8
+ task default: :spec
@@ -1,50 +1,51 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- require "optparse"
4
- require "set"
5
- require "dns-sniper"
4
+ require 'optparse'
5
+ require 'set'
6
+ require 'dns-sniper'
6
7
 
7
- VALID_FORMATS = ["text", "unbound"]
8
+ VALID_FORMATS = DNSSniper::Formatters.all.inject([]) { |arr, f| arr << f.name.to_s.sub('DNSSniper::', '').downcase }
8
9
  Options = Struct.new(:blacklist_urls_file, :whitelisted_hosts_file, :format)
9
10
 
10
11
  class Parser
11
12
  def self.parse(options)
12
- args = Options.new("world")
13
+ args = Options.new('world')
13
14
  opt_parser = OptionParser.new do |opts|
14
15
  opts.banner = "Usage: #{File.basename(__FILE__)} -f PATH -o FORMAT [options]\n#{File.basename(__FILE__)} combines online DNS blacklists and combines them into the desired configuration FORMAT.\n\n"
15
- opts.on("-f", "--blacklist=PATH", "PATH to file with line-separated list of URL’s of blacklists") do |path|
16
+ opts.on('-f', '--blacklist=PATH', 'PATH to file with line-separated list of URL’s of blacklists') do |path|
16
17
  args.blacklist_urls_file = path
17
18
  end
18
- opts.on("-w", "--whitelist=path", "Path to file with line-separated list of whitelisted hostnames") do |path|
19
+ opts.on('-w', '--whitelist=path', 'Path to file with line-separated list of whitelisted hostnames') do |path|
19
20
  args.whitelisted_hosts_file = path
20
21
  end
21
- opts.on("-o", "--output=FORMAT", "FORMAT to output — one of #{VALID_FORMATS.join(", ")}") do |format|
22
+ opts.on('-o', '--output=FORMAT', "FORMAT to output — one of #{VALID_FORMATS.join(', ')}") do |format|
22
23
  args.format = format
23
24
  end
24
- opts.on("-h", "--help", "Prints this help") do
25
+ opts.on('-h', '--help', 'Prints this help') do
25
26
  puts opts
26
27
  exit
27
28
  end
28
29
  end
29
30
  opt_parser.parse!(options)
30
- return args
31
+ args
31
32
  end
32
33
  end
33
34
 
34
35
  options = Parser.parse ARGV
35
36
 
36
37
  unless VALID_FORMATS.include?(options[:format])
37
- STDERR.puts "Error: Format ”#{options[:format]}” unrecognized"
38
+ warn options[:format].blank? ? 'Error: Format not defined' : "Error: Invalid format \"#{options[:format]}\""
38
39
  exit(-1)
39
40
  end
40
41
 
41
42
  unless File.exist?(options[:blacklist_urls_file])
42
- STDERR.puts "Error: Unable to access ”#{options[:blacklist_urls_file]}”"
43
+ warn "Error: Unable to access ”#{options[:blacklist_urls_file]}”"
43
44
  exit(-1)
44
45
  end
45
46
 
46
- if options[:whitelisted_hosts_file] and not File.exist?(options[:whitelisted_hosts_file])
47
- STDERR.puts "Error: Unable to access ”#{options[:whitelisted_hosts_file]}”"
47
+ if options[:whitelisted_hosts_file] && !File.exist?(options[:whitelisted_hosts_file])
48
+ warn "Error: Unable to access ”#{options[:whitelisted_hosts_file]}”"
48
49
  exit(-1)
49
50
  end
50
51
 
@@ -1,23 +1,35 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Gem::Specification.new do |spec|
2
- spec.name = "dns-sniper"
3
- spec.license = "MIT"
4
- spec.version = "0.0.1pre"
5
- spec.date = "2020-08-13"
6
- spec.authors = ["Brody Hoskins"]
7
- spec.email = ["brody@brody.digital"]
4
+ spec.name = 'dns-sniper'
5
+ spec.license = 'MIT'
6
+ spec.version = '0.0.1.pre2'
7
+ spec.date = '2020-11-01'
8
+
9
+ spec.authors = ['Brody Hoskins']
10
+ spec.email = ['brody@brody.digital']
8
11
 
9
- spec.summary = "Command line utility that combines online DNS blacklists and combines them into the desired configuration format"
10
- spec.description = "Command line utility that combines online DNS blacklists and combines them into the desired configuration format"
11
- spec.homepage = "https://github.com/brodyhoskins/dns-sniper"
12
+ spec.summary = 'Combine DNS blacklists into desired configuration format'
13
+ spec.description = <<~DESC.gsub(/\n/, ' ').strip
14
+ dns-sniper generates DNS configuration files based on various user-defined
15
+ blacklists online. Configuration files can be generated for use in Ruby
16
+ applications or from the command line.
17
+ DESC
18
+ spec.homepage = 'https://github.com/brodyhoskins/dns-sniper'
12
19
 
13
- spec.files = `git ls-files`.split($/)
20
+ spec.metadata = {
21
+ 'homepage_uri' => 'https://github.com/brodyhoskins/dns-sniper',
22
+ 'source_code_uri' => 'https://github.com/brodyhoskins/dns-sniper'
23
+ }
14
24
 
15
- spec.bindir = "bin"
16
- spec.executables = "dns-sniper"
17
- spec.require_paths = ["lib"]
25
+ spec.files = Dir['lib/**/*']
26
+ spec.files += Dir['[A-Z]*'] + Dir['test/**/*']
27
+ spec.files.reject! { |fn| fn.include? 'CVS' }
28
+ spec.require_paths = ['lib']
18
29
 
19
- spec.add_development_dependency "bundler", "~> 2.1.2"
30
+ spec.bindir = 'bin'
31
+ spec.executables = 'dns-sniper'
20
32
 
21
- spec.add_development_dependency "down", "~> 5.1"
22
- spec.add_development_dependency "hosts_file", "~> 1.0"
33
+ spec.add_dependency 'down', '~> 5.1'
34
+ spec.add_dependency 'hosts_file', '~> 1.0'
23
35
  end
@@ -1,3 +1,5 @@
1
- require "dns-sniper/hostnames"
2
- require "dns-sniper/formatter"
3
- require "dns-sniper/formatters"
1
+ # frozen_string_literal: true
2
+
3
+ require 'dns-sniper/hostnames'
4
+ require 'dns-sniper/formatter'
5
+ require 'dns-sniper/formatters'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DNSSniper
2
4
  class Formatter
3
5
  def initialize(hostnames, options = {})
@@ -1,24 +1,31 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DNSSniper
2
4
  module Formatters
3
5
  extend self
6
+ # module_function
4
7
 
5
8
  attr_reader :registered
6
9
  @registered = []
7
10
 
8
11
  def register(class_name, autoload_require)
9
12
  DNSSniper.autoload(class_name, autoload_require)
10
- self.registered << class_name
13
+ @registered << class_name
11
14
  end
12
15
 
13
16
  def all
14
- Sniper::Formatters.registered.map { |name| Sniper.const_get(name) }
17
+ @registered.map { |name| DNSSniper.const_get(name) }
15
18
  end
16
19
 
17
20
  def find(name)
18
- all.find { |c| c.name.downcase == name.to_s.downcase } or raise NameError, "unknown carrier #{name}"
21
+ all.find { |c| c.name.downcase == name.to_s.downcase } or raise NameError, "Unknown formatter \"#{name}\""
19
22
  end
20
23
  end
21
24
  end
22
25
 
23
- DNSSniper::Formatters.register :Text, "dns-sniper/formatters/text"
24
- DNSSniper::Formatters.register :Unbound, "dns-sniper/formatters/unbound"
26
+ DNSSniper::Formatters.register :Bind8, 'dns-sniper/formatters/bind8'
27
+ DNSSniper::Formatters.register :Dnsmasq, 'dns-sniper/formatters/dnsmasq'
28
+ DNSSniper::Formatters.register :Hosts, 'dns-sniper/formatters/hosts'
29
+ DNSSniper::Formatters.register :Netgear, 'dns-sniper/formatters/netgear'
30
+ DNSSniper::Formatters.register :Text, 'dns-sniper/formatters/text'
31
+ DNSSniper::Formatters.register :Unbound, 'dns-sniper/formatters/unbound'
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DNSSniper
4
+ class Bind8 < Formatter
5
+ def initialize(hostnames, options = {})
6
+ @hostnames = hostnames
7
+ @options = options
8
+ end
9
+
10
+ def output(options = {})
11
+ raise ArgumentError, 'zone_file is required' unless defined?(options[:zone_file])
12
+
13
+ str = ''.dup
14
+ @hostnames.each do |hostname|
15
+ str << "zone \"#{hostname}\" { type master; notify no; file \"#{options[:zone_file]}\"; };#{$INPUT_RECORD_SEPARATOR}"
16
+ end
17
+ str
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DNSSniper
4
+ class Dnsmasq < Formatter
5
+ def initialize(hostnames, options = {})
6
+ @hostnames = hostnames
7
+ @options = options
8
+ end
9
+
10
+ def output(_options = {})
11
+ str = ''.dup
12
+ @hostnames.each do |hostname|
13
+ str << "server=/#{hostname}/#{$INPUT_RECORD_SEPARATOR}"
14
+ end
15
+ str
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DNSSniper
4
+ class Hosts < Formatter
5
+ def initialize(hostnames, options = {})
6
+ @hostnames = hostnames
7
+ @options = options
8
+ end
9
+
10
+ def output(_options = {})
11
+ str = ''.dup
12
+ @hostnames.each do |hostname|
13
+ str << "127.0.0.1\t#{hostname}#{$INPUT_RECORD_SEPARATOR}"
14
+ end
15
+ str
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DNSSniper
4
+ class Netgear < Formatter
5
+ def initialize(hostnames, options = {})
6
+ @hostnames = hostnames
7
+ @options = options
8
+ end
9
+
10
+ def output(_options = {})
11
+ str = ''.dup
12
+ @hostnames.each_with_index do |hostname, i|
13
+ str << "[517003_e]: #{i + 1}) #{hostname}\n"
14
+ end
15
+ str
16
+ end
17
+ end
18
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DNSSniper
2
4
  class Text < Formatter
3
5
  def initialize(hostnames, options = {})
@@ -5,8 +7,8 @@ module DNSSniper
5
7
  @options = options
6
8
  end
7
9
 
8
- def output
9
- @hostnames.to_a.join($/)
10
+ def output(_options = {})
11
+ @hostnames.to_a.join($INPUT_RECORD_SEPARATOR)
10
12
  end
11
13
  end
12
14
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DNSSniper
2
4
  class Unbound < Formatter
3
5
  def initialize(hostnames, options = {})
@@ -5,10 +7,11 @@ module DNSSniper
5
7
  @options = options
6
8
  end
7
9
 
8
- def output
9
- str = "server:#{$/}"
10
+ def output(_options = {})
11
+ str = ''.dup
12
+ str << "server:#{$INPUT_RECORD_SEPARATOR}"
10
13
  @hostnames.each do |hostname|
11
- str << " local-zone: \"#{hostname}\" static#{$/}"
14
+ str << " local-zone: \"#{hostname}\" static#{$INPUT_RECORD_SEPARATOR}"
12
15
  end
13
16
  str
14
17
  end
@@ -1,31 +1,27 @@
1
- require "down"
2
- require "hosts_file"
3
- require "open-uri"
4
- require "resolv"
1
+ # frozen_string_literal: true
2
+
3
+ require 'down'
4
+ require 'hosts_file'
5
+ require 'open-uri'
6
+ require 'resolv'
5
7
 
6
8
  module DNSSniper
7
9
  class Hostnames
8
- def initialize(options = {})
10
+ def initialize(_options = {})
9
11
  @hostnames = [].to_set
10
12
  self
11
13
  end
12
14
 
13
- def add(hostname)
14
- hostname = clean(hostname)
15
- @hostnames << hostname if hostname
16
- self
17
- end
18
-
19
- def add_many(hostnames)
20
- hostnames.each { |hostname| add(hostname) }
15
+ def add(hostnames)
16
+ hostnames = clean(hostnames.class == String ? [hostnames] : hostnames)
17
+ @hostnames += hostnames unless hostnames.empty?
21
18
  self
22
19
  end
23
20
 
24
21
  def add_from(paths_or_urls)
25
22
  return self unless paths_or_urls
26
- if (paths_or_urls.class == String)
27
- paths_or_urls = [paths_or_urls]
28
- end
23
+
24
+ paths_or_urls = [paths_or_urls] if paths_or_urls.class == String
29
25
 
30
26
  paths_or_urls.each do |path_or_url|
31
27
  path_or_url = path_or_url.strip
@@ -38,44 +34,38 @@ module DNSSniper
38
34
  path_or_url = down.path
39
35
  contents = down.readlines
40
36
  rescue Down::NotFound
41
- STDERR.puts "\"#{path_or_url}\" does not exist"
37
+ warn "\"#{path_or_url}\" does not exist"
42
38
  return self
43
39
  rescue Down::ResponseError
44
- STDERR.puts "\"#{path_or_url}\": No data from server"
40
+ warn "\"#{path_or_url}\": No data from server"
45
41
  return self
46
42
  end
47
43
  end
48
44
 
49
45
  case syntax(path_or_url, contents)
50
46
  when nil
51
- STDERR.puts "Error: Syntax: Syntax of \"#{path_or_url}\" not recognized, ignored"
47
+ warn "Error: Syntax: Syntax of \"#{path_or_url}\" not recognized, ignored"
52
48
  return self
53
- when "hosts"
54
- add_many from_hosts_file(path_or_url)
55
- when "hostnames"
56
- add_many from_hostnames_file(contents)
49
+ when 'hosts'
50
+ add from_hosts_file(path_or_url)
51
+ when 'hostnames'
52
+ add from_hostnames_file(contents)
57
53
  end
58
54
  end
59
55
 
60
56
  self
61
57
  end
62
58
 
63
- def remove(hostname)
64
- hostname = clean(hostname)
65
- @hostnames = @hostnames - [hostname] if hostname
66
- self
67
- end
68
-
69
- def remove_many(hostnames)
70
- hostnames.each { |hostname| remove(hostname) }
59
+ def remove(hostnames)
60
+ hostnames = clean(hostnames.class == String ? [hostnames] : hostnames)
61
+ @hostnames -= hostnames unless hostnames.empty?
71
62
  self
72
63
  end
73
64
 
74
65
  def remove_from(paths_or_urls)
75
66
  return self unless paths_or_urls
76
- if (paths_or_urls.class == String)
77
- paths_or_urls = [paths_or_urls]
78
- end
67
+
68
+ paths_or_urls = [paths_or_urls] if paths_or_urls.class == String
79
69
 
80
70
  paths_or_urls.each do |path_or_url|
81
71
  path_or_url = path_or_url.strip
@@ -88,35 +78,35 @@ module DNSSniper
88
78
  path_or_url = down.path
89
79
  contents = down.readlines
90
80
  rescue Down::NotFound
91
- STDERR.puts "\"#{path_or_url}\" does not exist"
81
+ warn "\"#{path_or_url}\" does not exist"
92
82
  return self
93
83
  rescue Down::ResponseError
94
- STDERR.puts "\"#{path_or_url}\": No data from server"
84
+ warn "\"#{path_or_url}\": No data from server"
95
85
  return self
96
86
  end
97
87
  end
98
88
 
99
89
  case syntax(path_or_url, contents)
100
90
  when nil
101
- STDERR.puts "Error: Syntax: Syntax of \"#{path_or_url}\" not recognized, ignored"
91
+ warn "Error: Syntax: Syntax of \"#{path_or_url}\" not recognized, ignored"
102
92
  return self
103
- when "hosts"
104
- remove_many from_hosts_file(path_or_url)
105
- when "hostnames"
106
- remove_many from_hostnames_file(contents)
93
+ when 'hosts'
94
+ remove from_hosts_file(path_or_url)
95
+ when 'hostnames'
96
+ remove from_hostnames_file(contents)
107
97
  end
108
98
  end
109
99
 
110
100
  self
111
101
  end
112
102
 
113
- def to_format(format)
103
+ def to_format(format, options = {})
114
104
  format = format.capitalize
115
105
  begin
116
- klass = Sniper.const_get(format)
117
- klass.new(@hostnames.to_a).output
106
+ klass = DNSSniper.const_get(format)
107
+ klass.new(@hostnames.to_a).output(options)
118
108
  rescue NameError
119
- return false
109
+ false
120
110
  end
121
111
  end
122
112
 
@@ -124,41 +114,32 @@ module DNSSniper
124
114
  @hostnames.to_a
125
115
  end
126
116
 
127
- def to_text
128
- @hostnames.to_a.join("\n")
129
- end
130
-
131
- def to_unbound
132
- str = "server:\n"
133
- @hostnames.each do |hostname|
134
- str << " local-zone: \"#{hostname}\" static\n"
135
- end
136
- str
137
- end
138
-
139
117
  private
140
118
 
141
- def clean(hostname)
142
- hostname = hostname.downcase.strip
143
- hostname = hostname.sub("www.", "")
144
- hostname_top_domain = "#{hostname.split(".")[-2]}.#{hostname.split(".")[-1]}"
119
+ def clean(hostnames)
120
+ cleaned_hostnames = []
121
+ hostnames.each do |hostname|
122
+ hostname = hostname.downcase.strip
123
+ hostname = hostname.sub('www.', '')
124
+ hostname_top_domain = "#{hostname.split('.')[-2]}.#{hostname.split('.')[-1]}"
145
125
 
146
- if not hostname.include?("#") and not ["broadcasthost", "localhost", ""].include?(hostname) and not @hostnames.include?(hostname_top_domain)
147
- hostname
148
- else
149
- nil
126
+ if !hostname.include?('#') && !['broadcasthost', 'localhost', ''].include?(hostname) && !@hostnames.include?(hostname_top_domain)
127
+ cleaned_hostnames << hostname
128
+ end
150
129
  end
130
+ cleaned_hostnames
151
131
  end
152
132
 
153
133
  def syntax(path_or_url, contents)
154
134
  contents.each do |line|
155
- next if line.include?("#")
135
+ next if line.include?('#')
136
+
156
137
  line = line.downcase
157
138
 
158
139
  if line.strip.split(/\s/).first =~ Regexp.union([Resolv::IPv4::Regex, Resolv::IPv6::Regex])
159
- return "hosts"
160
- elsif line.include? "." and not line.include? "http" and path_or_url.end_with?(".list")
161
- return "hostnames"
140
+ return 'hosts'
141
+ elsif line.include?('.') && (!line.include? 'http') && path_or_url.end_with?('.list')
142
+ return 'hostnames'
162
143
  end
163
144
  end
164
145
  nil
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dns-sniper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1pre
4
+ version: 0.0.1.pre2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brody Hoskins
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-13 00:00:00.000000000 Z
11
+ date: 2020-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: 2.1.2
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: 2.1.2
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: down
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -31,7 +17,7 @@ dependencies:
31
17
  - - "~>"
32
18
  - !ruby/object:Gem::Version
33
19
  version: '5.1'
34
- type: :development
20
+ type: :runtime
35
21
  prerelease: false
36
22
  version_requirements: !ruby/object:Gem::Requirement
37
23
  requirements:
@@ -45,15 +31,16 @@ dependencies:
45
31
  - - "~>"
46
32
  - !ruby/object:Gem::Version
47
33
  version: '1.0'
48
- type: :development
34
+ type: :runtime
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
38
  - - "~>"
53
39
  - !ruby/object:Gem::Version
54
40
  version: '1.0'
55
- description: Command line utility that combines online DNS blacklists and combines
56
- them into the desired configuration format
41
+ description: dns-sniper generates DNS configuration files based on various user-defined
42
+ blacklists online. Configuration files can be generated for use in Ruby applications
43
+ or from the command line.
57
44
  email:
58
45
  - brody@brody.digital
59
46
  executables:
@@ -61,22 +48,29 @@ executables:
61
48
  extensions: []
62
49
  extra_rdoc_files: []
63
50
  files:
64
- - ".gitignore"
65
51
  - Gemfile
66
52
  - Gemfile.lock
53
+ - MIT-LICENSE
54
+ - README.md
67
55
  - Rakefile
68
56
  - bin/dns-sniper
69
57
  - dns-sniper.gemspec
70
58
  - lib/dns-sniper.rb
71
59
  - lib/dns-sniper/formatter.rb
72
60
  - lib/dns-sniper/formatters.rb
61
+ - lib/dns-sniper/formatters/bind8.rb
62
+ - lib/dns-sniper/formatters/dnsmasq.rb
63
+ - lib/dns-sniper/formatters/hosts.rb
64
+ - lib/dns-sniper/formatters/netgear.rb
73
65
  - lib/dns-sniper/formatters/text.rb
74
66
  - lib/dns-sniper/formatters/unbound.rb
75
67
  - lib/dns-sniper/hostnames.rb
76
68
  homepage: https://github.com/brodyhoskins/dns-sniper
77
69
  licenses:
78
70
  - MIT
79
- metadata: {}
71
+ metadata:
72
+ homepage_uri: https://github.com/brodyhoskins/dns-sniper
73
+ source_code_uri: https://github.com/brodyhoskins/dns-sniper
80
74
  post_install_message:
81
75
  rdoc_options: []
82
76
  require_paths:
@@ -95,6 +89,5 @@ requirements: []
95
89
  rubygems_version: 3.0.3
96
90
  signing_key:
97
91
  specification_version: 4
98
- summary: Command line utility that combines online DNS blacklists and combines them
99
- into the desired configuration format
92
+ summary: Combine DNS blacklists into desired configuration format
100
93
  test_files: []
data/.gitignore DELETED
@@ -1,9 +0,0 @@
1
- .DS_Store
2
- .DS_Store?
3
- ._*
4
- .Spotlight-V100
5
- .Trashes
6
- ehthumbs.db
7
- Thumbs.db
8
-
9
- .ruby-version