dns_one 0.4.5 → 0.4.7
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 +4 -4
- data/lib/dns_one/backend/db.rb +22 -2
- data/lib/dns_one/cache.rb +4 -0
- data/lib/dns_one/cli.rb +2 -1
- data/lib/dns_one/core_ext/blank.rb +160 -0
- data/lib/dns_one/core_ext/exception.rb +9 -0
- data/lib/dns_one/core_ext/string.rb +13 -0
- data/lib/dns_one/log.rb +41 -15
- data/lib/dns_one/server.rb +11 -9
- data/lib/dns_one/util.rb +4 -0
- data/lib/dns_one/version.rb +1 -1
- data/lib/dns_one/zone_search.rb +15 -13
- data/lib/dns_one.rb +42 -15
- data/util/sample_conf.yml +2 -1
- metadata +4 -2
- data/lib/dns_one/core_extensions.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 34e353b91f2c725a06a2bc095d1990e48e0ab914
|
4
|
+
data.tar.gz: dbed7b26aa08686cfceafd0dbd659df692dd5aef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e5cbbad25694937f59a0e2b4271b3ea2f180264b6f11f4d7209d2d5f4f51b1e69e2c511fbea333e0e768cb645db3160e30adfc028d2f23dc56edb2b6195c654
|
7
|
+
data.tar.gz: b59b7281f46ad5233461d07bb62ff8e6973bf51dea119a089a7d883699bb671200d79b1a7890213ca0dc71897c417409715511f837a4f32210bfe1e22c29acba
|
data/lib/dns_one/backend/db.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Backend; class BackendDB
|
2
2
|
def initialize conf
|
3
3
|
@query = conf.delete :query
|
4
|
-
@
|
4
|
+
@conf = conf
|
5
5
|
setup_db
|
6
6
|
end
|
7
7
|
|
@@ -44,7 +44,27 @@ module Backend; class BackendDB
|
|
44
44
|
|
45
45
|
def setup_db
|
46
46
|
ActiveRecord::Base.logger = Log.logger
|
47
|
-
|
47
|
+
|
48
|
+
gem_name = {
|
49
|
+
'postgresql' => 'pg',
|
50
|
+
'mysql' => 'mysql',
|
51
|
+
'mysql2' => 'mysql2'
|
52
|
+
}[ @conf[:adapter] ]
|
53
|
+
|
54
|
+
unless gem_name
|
55
|
+
Util.die "Database adapter '#{@conf[:adapter]}' not supported. Aborting."
|
56
|
+
end
|
57
|
+
|
58
|
+
begin
|
59
|
+
require gem_name.to_s
|
60
|
+
|
61
|
+
rescue LoadError => e
|
62
|
+
Util.die "Error loading database dependency.\nMake sure #{gem_name} it is installed, if it is not, install with 'gem install #{gem_name}'\nError Details: #{e.desc}"
|
63
|
+
rescue => e
|
64
|
+
Util.die "Error loading database dependency.\n#{e.desc}"
|
65
|
+
end
|
66
|
+
|
67
|
+
ActiveRecord::Base.establish_connection @conf
|
48
68
|
end
|
49
69
|
|
50
70
|
end; end
|
data/lib/dns_one/cache.rb
CHANGED
data/lib/dns_one/cli.rb
CHANGED
@@ -10,8 +10,9 @@ class DnsOne::CLI < Thor
|
|
10
10
|
desc "run", "run server"
|
11
11
|
option :conf
|
12
12
|
option :log
|
13
|
+
option :work_dir
|
13
14
|
def run_srv
|
14
|
-
DnsOne::DnsOne.new(conf_file: options[:conf], log_file: options[:log]).start
|
15
|
+
DnsOne::DnsOne.new(conf_file: options[:conf], log_file: options[:log], work_dir: options[:work_dir]).start
|
15
16
|
end
|
16
17
|
default_task :run_srv
|
17
18
|
|
@@ -0,0 +1,160 @@
|
|
1
|
+
|
2
|
+
# activesupport-5.1.1/lib/active_support/core_ext/regexp.rb
|
3
|
+
|
4
|
+
class Regexp #:nodoc:
|
5
|
+
def multiline?
|
6
|
+
options & MULTILINE == MULTILINE
|
7
|
+
end
|
8
|
+
|
9
|
+
def match?(string, pos = 0)
|
10
|
+
!!match(string, pos)
|
11
|
+
end unless //.respond_to?(:match?)
|
12
|
+
end
|
13
|
+
|
14
|
+
# activesupport-5.1.1/lib/active_support/core_ext/object/blank.rb
|
15
|
+
|
16
|
+
class Object
|
17
|
+
# An object is blank if it's false, empty, or a whitespace string.
|
18
|
+
# For example, +false+, '', ' ', +nil+, [], and {} are all blank.
|
19
|
+
#
|
20
|
+
# This simplifies
|
21
|
+
#
|
22
|
+
# !address || address.empty?
|
23
|
+
#
|
24
|
+
# to
|
25
|
+
#
|
26
|
+
# address.blank?
|
27
|
+
#
|
28
|
+
# @return [true, false]
|
29
|
+
def blank?
|
30
|
+
respond_to?(:empty?) ? !!empty? : !self
|
31
|
+
end
|
32
|
+
|
33
|
+
# An object is present if it's not blank.
|
34
|
+
#
|
35
|
+
# @return [true, false]
|
36
|
+
def present?
|
37
|
+
!blank?
|
38
|
+
end
|
39
|
+
|
40
|
+
# Returns the receiver if it's present otherwise returns +nil+.
|
41
|
+
# <tt>object.presence</tt> is equivalent to
|
42
|
+
#
|
43
|
+
# object.present? ? object : nil
|
44
|
+
#
|
45
|
+
# For example, something like
|
46
|
+
#
|
47
|
+
# state = params[:state] if params[:state].present?
|
48
|
+
# country = params[:country] if params[:country].present?
|
49
|
+
# region = state || country || 'US'
|
50
|
+
#
|
51
|
+
# becomes
|
52
|
+
#
|
53
|
+
# region = params[:state].presence || params[:country].presence || 'US'
|
54
|
+
#
|
55
|
+
# @return [Object]
|
56
|
+
def presence
|
57
|
+
self if present?
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class NilClass
|
62
|
+
# +nil+ is blank:
|
63
|
+
#
|
64
|
+
# nil.blank? # => true
|
65
|
+
#
|
66
|
+
# @return [true]
|
67
|
+
def blank?
|
68
|
+
true
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
class FalseClass
|
73
|
+
# +false+ is blank:
|
74
|
+
#
|
75
|
+
# false.blank? # => true
|
76
|
+
#
|
77
|
+
# @return [true]
|
78
|
+
def blank?
|
79
|
+
true
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
class TrueClass
|
84
|
+
# +true+ is not blank:
|
85
|
+
#
|
86
|
+
# true.blank? # => false
|
87
|
+
#
|
88
|
+
# @return [false]
|
89
|
+
def blank?
|
90
|
+
false
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
class Array
|
95
|
+
# An array is blank if it's empty:
|
96
|
+
#
|
97
|
+
# [].blank? # => true
|
98
|
+
# [1,2,3].blank? # => false
|
99
|
+
#
|
100
|
+
# @return [true, false]
|
101
|
+
alias_method :blank?, :empty?
|
102
|
+
end
|
103
|
+
|
104
|
+
class Hash
|
105
|
+
# A hash is blank if it's empty:
|
106
|
+
#
|
107
|
+
# {}.blank? # => true
|
108
|
+
# { key: 'value' }.blank? # => false
|
109
|
+
#
|
110
|
+
# @return [true, false]
|
111
|
+
alias_method :blank?, :empty?
|
112
|
+
end
|
113
|
+
|
114
|
+
class String
|
115
|
+
unless BLANK_RE
|
116
|
+
BLANK_RE = /\A[[:space:]]*\z/
|
117
|
+
end
|
118
|
+
|
119
|
+
# A string is blank if it's empty or contains whitespaces only:
|
120
|
+
#
|
121
|
+
# ''.blank? # => true
|
122
|
+
# ' '.blank? # => true
|
123
|
+
# "\t\n\r".blank? # => true
|
124
|
+
# ' blah '.blank? # => false
|
125
|
+
#
|
126
|
+
# Unicode whitespace is supported:
|
127
|
+
#
|
128
|
+
# "\u00a0".blank? # => true
|
129
|
+
#
|
130
|
+
# @return [true, false]
|
131
|
+
def blank?
|
132
|
+
# The regexp that matches blank strings is expensive. For the case of empty
|
133
|
+
# strings we can speed up this method (~3.5x) with an empty? call. The
|
134
|
+
# penalty for the rest of strings is marginal.
|
135
|
+
empty? || BLANK_RE.match?(self)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
class Numeric #:nodoc:
|
140
|
+
# No number is blank:
|
141
|
+
#
|
142
|
+
# 1.blank? # => false
|
143
|
+
# 0.blank? # => false
|
144
|
+
#
|
145
|
+
# @return [false]
|
146
|
+
def blank?
|
147
|
+
false
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
class Time #:nodoc:
|
152
|
+
# No Time is blank:
|
153
|
+
#
|
154
|
+
# Time.now.blank? # => false
|
155
|
+
#
|
156
|
+
# @return [false]
|
157
|
+
def blank?
|
158
|
+
false
|
159
|
+
end
|
160
|
+
end
|
data/lib/dns_one/log.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
class Log < Logger
|
3
3
|
class << self
|
4
4
|
|
5
|
+
# 'def [d|i|w|e|f] msg' for DEBUG INFO WARN ERROR FATAL
|
5
6
|
Logger::Severity::constants.each_with_index do |severity, severity_num|
|
6
7
|
next if severity == :UNKNOWN
|
7
8
|
method_name = severity.to_s[0].downcase
|
@@ -10,42 +11,67 @@ class Log < Logger
|
|
10
11
|
end
|
11
12
|
end
|
12
13
|
|
13
|
-
def setup file, syslog_name
|
14
|
+
def setup file, syslog_name, syslog_min_severity = Logger::WARN
|
15
|
+
@syslog_min_severity = syslog_min_severity
|
14
16
|
@syslog = Syslog::Logger.new syslog_name
|
15
17
|
@log_file = setfile file
|
16
18
|
@logger = Logger.new @log_file
|
17
19
|
end
|
18
20
|
|
19
|
-
def
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
def change_log_file file
|
22
|
+
new_log_file = setfile file, allow_stdout: false
|
23
|
+
if new_log_file and new_log_file != @log_file
|
24
|
+
@log_file = new_log_file
|
25
|
+
@logger = Logger.new @log_file
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def exc e
|
30
|
+
e e.desc
|
31
|
+
end
|
32
|
+
|
33
|
+
def logger
|
34
|
+
@logger
|
35
|
+
end
|
36
|
+
|
37
|
+
def log_file_desc
|
38
|
+
case @log_file
|
39
|
+
when STDOUT
|
40
|
+
'STDOUT'
|
41
|
+
when STDERR
|
42
|
+
'STDERR'
|
24
43
|
else
|
44
|
+
@log_file
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def setfile file, allow_stdout: true
|
51
|
+
if [STDOUT, STDERR].include? file or
|
52
|
+
File.writable? file or
|
53
|
+
File.writable? File.dirname(file)
|
54
|
+
file
|
55
|
+
elsif allow_stdout
|
25
56
|
STDOUT
|
26
57
|
end
|
27
58
|
end
|
28
59
|
|
29
60
|
def log severity, msg
|
30
61
|
met_name = Logger::Severity::constants[severity].downcase
|
62
|
+
|
31
63
|
@logger.send met_name, msg
|
32
|
-
|
64
|
+
|
65
|
+
if severity >= @syslog_min_severity
|
33
66
|
@syslog.send met_name, msg
|
34
67
|
end
|
68
|
+
|
35
69
|
if severity == Logger::FATAL and
|
36
70
|
@log_file != STDOUT and
|
37
71
|
@log_file != STDERR
|
38
72
|
STDERR.puts msg
|
39
73
|
end
|
40
74
|
end
|
41
|
-
|
42
|
-
def exc e
|
43
|
-
e e.desc
|
44
|
-
end
|
45
|
-
|
46
|
-
def logger
|
47
|
-
@logger
|
48
|
-
end
|
49
75
|
end
|
50
76
|
end
|
51
77
|
|
data/lib/dns_one/server.rb
CHANGED
@@ -3,21 +3,23 @@ module DnsOne; class Server # < RExec::Daemon::Base
|
|
3
3
|
|
4
4
|
DNS_DAEMON_RUN_AS = "dnsserver"
|
5
5
|
DNS_DAEMON_INTERFACES = [
|
6
|
-
[:udp, "0.0.0.0",
|
7
|
-
[:tcp, "0.0.0.0",
|
8
|
-
[:udp, "::",
|
9
|
-
[:tcp, "::",
|
6
|
+
[:udp, "0.0.0.0", 53],
|
7
|
+
[:tcp, "0.0.0.0", 53],
|
8
|
+
[:udp, "::", 5300],
|
9
|
+
[:tcp, "::", 5300]
|
10
10
|
]
|
11
11
|
|
12
|
-
def initialize conf
|
13
|
-
|
12
|
+
def initialize conf, conf_zone_search
|
13
|
+
@conf = conf
|
14
|
+
ZoneSearch.instance.setup conf_zone_search
|
14
15
|
end
|
15
16
|
|
16
17
|
def run
|
18
|
+
conf = @conf
|
17
19
|
RubyDNS::run_server(listen: dns_daemon_interfaces, logger: Log.logger) do
|
18
20
|
on(:start) do
|
19
|
-
if RExec.current_user == 'root' and
|
20
|
-
RExec.change_user
|
21
|
+
if RExec.current_user == 'root' and conf[:run_as]
|
22
|
+
RExec.change_user conf[:run_as]
|
21
23
|
end
|
22
24
|
Log.i "Running as #{RExec.current_user}"
|
23
25
|
end
|
@@ -42,7 +44,7 @@ module DnsOne; class Server # < RExec::Daemon::Base
|
|
42
44
|
end
|
43
45
|
|
44
46
|
def dns_daemon_interfaces
|
45
|
-
if
|
47
|
+
if RExec.current_user == 'root'
|
46
48
|
DNS_DAEMON_INTERFACES
|
47
49
|
else
|
48
50
|
ports = DNS_DAEMON_INTERFACES.map do |port|
|
data/lib/dns_one/util.rb
CHANGED
data/lib/dns_one/version.rb
CHANGED
data/lib/dns_one/zone_search.rb
CHANGED
@@ -9,10 +9,10 @@ module DnsOne; class ZoneSearch
|
|
9
9
|
@conf = conf
|
10
10
|
check_record_sets
|
11
11
|
@backend = set_backend
|
12
|
-
@cache = Cache.new @conf
|
12
|
+
@cache = Cache.new @conf[:cache_max]
|
13
13
|
|
14
14
|
@ignore_subdomains_re = nil
|
15
|
-
if ignore_subdomains = @conf
|
15
|
+
if ignore_subdomains = @conf[:ignore_subdomains]
|
16
16
|
unless ignore_subdomains.empty?
|
17
17
|
subdoms = ignore_subdomains.strip.split(/\s+/).map(&:downcase).join('|')
|
18
18
|
@ignore_subdomains_re = /^(#{ subdoms })\./i
|
@@ -26,22 +26,24 @@ module DnsOne; class ZoneSearch
|
|
26
26
|
Log.d "searching #{ dom_name }..."
|
27
27
|
|
28
28
|
rec_set_name = find_record_set dom_name
|
29
|
-
Log.d "record set name #{ rec_set_name ? 'found' : '
|
29
|
+
Log.d "record set name #{ rec_set_name ? 'found' : 'not found' } for #{dom_name} #{res_class}"
|
30
30
|
rec_set_name or return
|
31
31
|
|
32
32
|
if rec_set_name == ''
|
33
|
-
rec_set_name = @conf.
|
33
|
+
rec_set_name = @conf[:ecord_sets].keys.first.to_s
|
34
34
|
end
|
35
35
|
|
36
|
-
rec_set = @conf
|
37
|
-
Log.d "record set #{ rec_set ? 'found' : 'not found' }"
|
36
|
+
rec_set = @conf[:record_sets][rec_set_name.to_sym]
|
37
|
+
Log.d "record set #{ rec_set ? 'found' : 'not found' } for #{dom_name} #{res_class}"
|
38
38
|
rec_set or return
|
39
39
|
|
40
40
|
answer = nil
|
41
41
|
|
42
42
|
unless res_class == IN::NS
|
43
|
-
|
44
|
-
|
43
|
+
if rec = rec_set[ res_class.to_s.split('::').last.to_sym ]
|
44
|
+
answer = rec
|
45
|
+
answer = [answer] unless answer.is_a? Array
|
46
|
+
end
|
45
47
|
end
|
46
48
|
|
47
49
|
other_records = []
|
@@ -57,13 +59,13 @@ module DnsOne; class ZoneSearch
|
|
57
59
|
private
|
58
60
|
|
59
61
|
def set_backend
|
60
|
-
if file = @conf
|
62
|
+
if file = @conf[:backend][:file]
|
61
63
|
unless File.exists? file
|
62
64
|
Util.die "Domain list file #{file} not found."
|
63
65
|
end
|
64
66
|
Backend::BackendFile.new file
|
65
67
|
else
|
66
|
-
Backend::BackendDB.new @conf
|
68
|
+
Backend::BackendDB.new @conf[:backend]
|
67
69
|
end
|
68
70
|
end
|
69
71
|
|
@@ -83,7 +85,7 @@ module DnsOne; class ZoneSearch
|
|
83
85
|
enabled_cache = use_cache && @backend.allow_cache
|
84
86
|
|
85
87
|
if enabled_cache and rec_set = @cache.find(dom_name)
|
86
|
-
Log.d "found in cache"
|
88
|
+
Log.d "found in cache (#{@cache.stat})"
|
87
89
|
rec_set
|
88
90
|
else
|
89
91
|
if rec_set = @backend.find(dom_name)
|
@@ -96,11 +98,11 @@ module DnsOne; class ZoneSearch
|
|
96
98
|
end
|
97
99
|
|
98
100
|
def check_record_sets
|
99
|
-
|
101
|
+
if @conf[:record_sets].blank?
|
100
102
|
Util.die "Record sets cannot be empty. Check file."
|
101
103
|
end
|
102
104
|
|
103
|
-
@conf
|
105
|
+
@conf[:record_sets].each_pair do |rec_set_name, records|
|
104
106
|
unless records[:NS] and records[:NS].length >= 1
|
105
107
|
Util.die "Record set #{rec_set_name} is invalid. It must have at least 1 NS record."
|
106
108
|
end
|
data/lib/dns_one.rb
CHANGED
@@ -10,7 +10,10 @@ require 'rexec'
|
|
10
10
|
|
11
11
|
# DnsOne
|
12
12
|
|
13
|
-
require "dns_one/
|
13
|
+
require "dns_one/core_ext/exception"
|
14
|
+
require "dns_one/core_ext/string"
|
15
|
+
require "dns_one/core_ext/blank"
|
16
|
+
|
14
17
|
require "dns_one/log"
|
15
18
|
require "dns_one/util"
|
16
19
|
|
@@ -24,30 +27,42 @@ require 'dns_one/backend/db'
|
|
24
27
|
|
25
28
|
module DnsOne; class DnsOne
|
26
29
|
|
27
|
-
DEFAULT_LOG_FILE = "/var/log/
|
30
|
+
DEFAULT_LOG_FILE = "/var/log/dns_one.log"
|
28
31
|
DEFAULT_CONF_FILE = '/etc/dns_one/conf.yml'
|
29
|
-
WORK_DIR = "/var/local/
|
32
|
+
WORK_DIR = "/var/local/dns_one"
|
30
33
|
|
31
34
|
CONF_DIR = "/etc/dns_one"
|
32
35
|
SYSLOG_NAME = 'dns_one'
|
33
36
|
|
34
|
-
def initialize conf_file: nil, log_file: nil
|
35
|
-
log_file
|
36
|
-
|
37
|
-
|
37
|
+
def initialize conf_file: nil, log_file: nil, work_dir: nil
|
38
|
+
cmd_log_file = log_file
|
39
|
+
log_file ||= DEFAULT_LOG_FILE
|
38
40
|
Log.setup log_file, SYSLOG_NAME
|
39
|
-
@conf = parse_conf conf_file
|
40
41
|
|
41
|
-
|
42
|
+
conf_file ||= DEFAULT_CONF_FILE
|
43
|
+
@conf_all = parse_conf conf_file
|
44
|
+
@conf = @conf_all.main
|
45
|
+
|
46
|
+
work_dir ||= WORK_DIR
|
47
|
+
|
48
|
+
# Redefine log file if set in conf file
|
49
|
+
unless cmd_log_file
|
50
|
+
if f = @conf[:log_file].presence
|
51
|
+
unless Log.change_log_file f
|
52
|
+
Log.w "Unable to change logfile to #{f}. Will continue with #{Log.log_file_desc}."
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
42
57
|
begin
|
43
|
-
Dir.chdir
|
58
|
+
Dir.chdir work_dir
|
44
59
|
rescue => e
|
45
60
|
Log.w "Cannot change working dir to #{WORK_DIR}. Will continue in #{Dir.pwd}."
|
46
61
|
end
|
47
62
|
end
|
48
63
|
|
49
64
|
def start
|
50
|
-
Server.new(@
|
65
|
+
Server.new(@conf_all.server, @conf_all.zone_search).run
|
51
66
|
end
|
52
67
|
|
53
68
|
private
|
@@ -58,9 +73,21 @@ module DnsOne; class DnsOne
|
|
58
73
|
conf = YAML.load_file conf_file
|
59
74
|
conf.deep_symbolize_keys!
|
60
75
|
|
61
|
-
|
62
|
-
|
63
|
-
|
76
|
+
OpenStruct.new(
|
77
|
+
main: {
|
78
|
+
work_dir: conf[:work_dir],
|
79
|
+
log_file: conf[:log_file]
|
80
|
+
},
|
81
|
+
server: {
|
82
|
+
run_as: conf[:run_as]
|
83
|
+
},
|
84
|
+
zone_search: {
|
85
|
+
ignore_subdomains: conf[:ignore_subdomains],
|
86
|
+
cache_max: conf[:cache_max],
|
87
|
+
record_sets: conf[:record_sets],
|
88
|
+
backend: conf[:backend]
|
89
|
+
}
|
90
|
+
)
|
64
91
|
end
|
65
92
|
|
66
93
|
def check_conf_file conf_file
|
@@ -74,7 +101,7 @@ module DnsOne; class DnsOne
|
|
74
101
|
# Util.die "Conf file #{conf_file} must have mode 0600. Aborting."
|
75
102
|
end
|
76
103
|
|
77
|
-
unless match_root conf_stat
|
104
|
+
unless Util.match_root conf_stat
|
78
105
|
# Util.die "Conf file #{conf_file} must have uid/gid set to root. Aborting."
|
79
106
|
end
|
80
107
|
end
|
data/util/sample_conf.yml
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
|
2
2
|
config:
|
3
3
|
run_as: dnsserver # optional, but highly recommended! adduser --system dnsserver
|
4
|
-
ignore_subdomains: www en it es pt ru fr at # optional
|
4
|
+
ignore_subdomains: www en it es pt ru fr at # optional, defaults to an empty list
|
5
5
|
# cache_max: 100000 # optional, defaults to 10000
|
6
|
+
# log_file: /var/log/dns_one.log # optional, defaults to /var/log/dns_one.log
|
6
7
|
|
7
8
|
backend:
|
8
9
|
##############
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dns_one
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Lobato
|
@@ -136,7 +136,9 @@ files:
|
|
136
136
|
- lib/dns_one/backend/file.rb
|
137
137
|
- lib/dns_one/cache.rb
|
138
138
|
- lib/dns_one/cli.rb
|
139
|
-
- lib/dns_one/
|
139
|
+
- lib/dns_one/core_ext/blank.rb
|
140
|
+
- lib/dns_one/core_ext/exception.rb
|
141
|
+
- lib/dns_one/core_ext/string.rb
|
140
142
|
- lib/dns_one/log.rb
|
141
143
|
- lib/dns_one/server.rb
|
142
144
|
- lib/dns_one/setup.rb
|
@@ -1,24 +0,0 @@
|
|
1
|
-
|
2
|
-
class String
|
3
|
-
def to_a
|
4
|
-
[self]
|
5
|
-
end
|
6
|
-
def strip_text
|
7
|
-
split("\n")
|
8
|
-
.map{|l| l.strip}
|
9
|
-
.join("\n")
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
class Exception
|
14
|
-
def desc
|
15
|
-
"#{e.class}: #{ message }\n#{ backtrace&.join "\n" }"
|
16
|
-
end
|
17
|
-
def puts_stderr
|
18
|
-
STDERR.puts e.desc
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def match_root stat
|
23
|
-
stat.uid == 0 && stat.gid == 0
|
24
|
-
end
|