devdnsd 3.1.2 → 4.0.0
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/.gitignore +2 -2
- data/.rubocop.yml +82 -0
- data/.travis-gemfile +4 -10
- data/.travis.yml +11 -5
- data/CHANGELOG.md +11 -0
- data/Gemfile +9 -8
- data/README.md +4 -5
- data/Rakefile +22 -6
- data/bin/devdnsd +42 -36
- data/config/devdnsd_config.sample +11 -11
- data/devdnsd.gemspec +7 -6
- data/doc/DevDNSd.html +6 -6
- data/doc/DevDNSd/{ApplicationMethods/Aliases.html → Aliases.html} +96 -100
- data/doc/DevDNSd/Application.html +2170 -1084
- data/doc/DevDNSd/Configuration.html +63 -33
- data/doc/DevDNSd/Errors.html +3 -3
- data/doc/DevDNSd/Errors/InvalidRule.html +3 -3
- data/doc/DevDNSd/{ApplicationMethods/System.html → OSX.html} +116 -489
- data/doc/DevDNSd/Rule.html +448 -749
- data/doc/DevDNSd/{ApplicationMethods/Server.html → Server.html} +77 -73
- data/doc/DevDNSd/System.html +895 -0
- data/doc/DevDNSd/Version.html +6 -6
- data/doc/_index.html +28 -27
- data/doc/class_list.html +6 -2
- data/doc/file.README.html +8 -9
- data/doc/file_list.html +5 -1
- data/doc/frames.html +1 -1
- data/doc/index.html +8 -9
- data/doc/js/full_list.js +4 -1
- data/doc/method_list.html +106 -84
- data/doc/top-level-namespace.html +3 -3
- data/lib/devdnsd.rb +10 -8
- data/lib/devdnsd/aliases.rb +171 -0
- data/lib/devdnsd/application.rb +93 -704
- data/lib/devdnsd/configuration.rb +20 -11
- data/lib/devdnsd/errors.rb +1 -1
- data/lib/devdnsd/osx.rb +217 -0
- data/lib/devdnsd/rule.rb +65 -94
- data/lib/devdnsd/server.rb +118 -0
- data/lib/devdnsd/system.rb +102 -0
- data/lib/devdnsd/version.rb +3 -3
- data/locales/en.yml +17 -16
- data/locales/it.yml +17 -16
- data/spec/devdnsd/application_spec.rb +188 -184
- data/spec/devdnsd/configuration_spec.rb +2 -2
- data/spec/devdnsd/rule_spec.rb +33 -34
- data/spec/resolver_helper.rb +10 -27
- data/spec/spec_helper.rb +21 -7
- metadata +36 -21
- data/doc/DevDNSd/ApplicationMethods.html +0 -125
- data/doc/DevDNSd/ApplicationMethods/System/ClassMethods.html +0 -538
- data/spec/coverage_helper.rb +0 -20
@@ -65,28 +65,37 @@ module DevDNSd
|
|
65
65
|
super(file, overrides, logger)
|
66
66
|
|
67
67
|
# Make sure some arguments are of correct type
|
68
|
-
self.log_file =
|
69
|
-
when "STDOUT" then $stdout
|
70
|
-
when "STDERR" then $stderr
|
71
|
-
else File.absolute_path(File.expand_path(log_file))
|
72
|
-
end
|
68
|
+
self.log_file = resolve_log_file
|
73
69
|
|
74
70
|
self.pid_file = File.absolute_path(File.expand_path(pid_file))
|
75
71
|
self.port = port.to_integer
|
76
72
|
self.log_level = log_level.to_integer
|
77
73
|
|
78
74
|
# Add a default rule
|
79
|
-
add_rule(/.+/, "127.0.0.1") if rules.blank?
|
75
|
+
add_rule(match: /.+/, reply: "127.0.0.1") if rules.blank?
|
80
76
|
end
|
81
77
|
|
82
78
|
# Adds a rule to the configuration.
|
83
79
|
#
|
84
|
-
# @param
|
85
|
-
# @param
|
80
|
+
# @param match [String|Regexp] The pattern to match.
|
81
|
+
# @param reply [String|Symbol] The IP or hostname to reply back to the client. It can be omitted (and it will be ignored) if a block is provided.
|
82
|
+
# @param type [Symbol] The type of request to match.
|
83
|
+
# @param options [Hash] A list of options for the request.
|
84
|
+
# @param block [Proc] An optional block to compute the reply instead of using the `reply` parameter.
|
86
85
|
# @return [Array] The current set of rule.
|
87
|
-
|
88
|
-
|
89
|
-
|
86
|
+
def add_rule(match: /.+/, reply: "127.0.0.1", type: :A, options: {}, &block)
|
87
|
+
rules << DevDNSd::Rule.create(match: match, reply: reply, type: type, options: options, &block)
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
# :nodoc:
|
93
|
+
def resolve_log_file
|
94
|
+
case log_file
|
95
|
+
when "STDOUT" then $stdout
|
96
|
+
when "STDERR" then $stderr
|
97
|
+
else File.absolute_path(File.expand_path(log_file))
|
98
|
+
end
|
90
99
|
end
|
91
100
|
end
|
92
101
|
end
|
data/lib/devdnsd/errors.rb
CHANGED
data/lib/devdnsd/osx.rb
ADDED
@@ -0,0 +1,217 @@
|
|
1
|
+
# This file is part of the devdnsd gem. Copyright (C) 2013 and above Shogun <shogun@cowtech.it>.
|
2
|
+
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
3
|
+
#
|
4
|
+
|
5
|
+
# A small DNS server to enable local .dev domain resolution.
|
6
|
+
module DevDNSd
|
7
|
+
# OSX management methods.
|
8
|
+
module OSX
|
9
|
+
# Gets the path for the resolver file.
|
10
|
+
#
|
11
|
+
# @param tld [String] The TLD to manage.
|
12
|
+
# @return [String] The path for the resolver file.
|
13
|
+
def resolver_path(tld = nil)
|
14
|
+
tld ||= @config.tld
|
15
|
+
"/etc/resolver/#{tld}"
|
16
|
+
end
|
17
|
+
|
18
|
+
# Gets the path for the launch agent file.
|
19
|
+
#
|
20
|
+
# @param name [String] The base name for the agent.
|
21
|
+
# @return [String] The path for the launch agent file.
|
22
|
+
def launch_agent_path(name = "it.cowtech.devdnsd")
|
23
|
+
ENV["HOME"] + "/Library/LaunchAgents/#{name}.plist"
|
24
|
+
end
|
25
|
+
|
26
|
+
# Executes a shell command.
|
27
|
+
#
|
28
|
+
# @param command [String] The command to execute.
|
29
|
+
# @return [Boolean] `true` if command succeeded, `false` otherwise.
|
30
|
+
def execute_command(command)
|
31
|
+
system("#{command} 2>&1 > /dev/null")
|
32
|
+
end
|
33
|
+
|
34
|
+
# Updates DNS cache.
|
35
|
+
#
|
36
|
+
# @return [Boolean] `true` if command succeeded, `false` otherwise.
|
37
|
+
def dns_update
|
38
|
+
@logger.info(i18n.dns_update)
|
39
|
+
|
40
|
+
script = Tempfile.new("devdnsd-dns-cache-script")
|
41
|
+
script.write("dscacheutil -flushcache 2>&1 > /dev/null\n")
|
42
|
+
script.write("killall -9 mDNSResponder 2>&1 > /dev/null\n")
|
43
|
+
script.write("killall -9 mDNSResponderHelper 2>&1 > /dev/null\n")
|
44
|
+
script.close
|
45
|
+
|
46
|
+
Kernel.system("/usr/bin/osascript -e 'do shell script \"sh #{script.path}\" with administrator privileges' 2>&1 > /dev/null")
|
47
|
+
script.unlink
|
48
|
+
end
|
49
|
+
|
50
|
+
# Checks if we are running on MacOS X.
|
51
|
+
#
|
52
|
+
# System services are only available on that platform.
|
53
|
+
#
|
54
|
+
# @return [Boolean] `true` if the current platform is MacOS X, `false` otherwise.
|
55
|
+
def osx?
|
56
|
+
::RbConfig::CONFIG['host_os'] =~ /^darwin/
|
57
|
+
end
|
58
|
+
alias_method :is_osx?, :osx?
|
59
|
+
|
60
|
+
# Adds aliases to an interface.
|
61
|
+
#
|
62
|
+
# @param options [Hash] The options provided by the user.
|
63
|
+
# @return [Boolean] `true` if action succeeded, `false` otherwise.
|
64
|
+
def action_add(options)
|
65
|
+
manage_aliases(:add, i18n.add_empty, options)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Removes aliases from an interface.
|
69
|
+
#
|
70
|
+
# @param options [Hash] The options provided by the user.
|
71
|
+
# @return [Boolean] `true` if action succeeded, `false` otherwise.
|
72
|
+
def action_remove(options)
|
73
|
+
manage_aliases(:remove, i18n.remove_empty, options)
|
74
|
+
end
|
75
|
+
|
76
|
+
# Installs the application into the autolaunch.
|
77
|
+
#
|
78
|
+
# @return [Boolean] `true` if action succeeded, `false` otherwise.
|
79
|
+
def action_install
|
80
|
+
manage_installation(launch_agent_path, resolver_path, :create_resolver, :create_agent, :load_agent)
|
81
|
+
end
|
82
|
+
|
83
|
+
# Uninstalls the application from the autolaunch.
|
84
|
+
#
|
85
|
+
# @return [Boolean] `true` if action succeeded, `false` otherwise.
|
86
|
+
def action_uninstall
|
87
|
+
manage_installation(launch_agent_path, resolver_path, :delete_resolver, :unload_agent, :delete_agent)
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
# :nodoc:
|
93
|
+
def log_status(pid, status)
|
94
|
+
logger.info(status == :running ? replace_markers(i18n.status_running(pid)) : replace_markers(i18n.send("status_#{status}")))
|
95
|
+
end
|
96
|
+
|
97
|
+
# :nodoc:
|
98
|
+
def manage_installation(launch_agent, resolver_path, first_operation, second_operation, third_operation)
|
99
|
+
rv = check_agent_available
|
100
|
+
|
101
|
+
logger.warn(replace_markers(i18n.admin_privileges_warning))
|
102
|
+
rv = send(first_operation, launch_agent, resolver_path) if rv
|
103
|
+
rv = send(second_operation, launch_agent, resolver_path) if rv
|
104
|
+
rv = send(third_operation, launch_agent, resolver_path) if rv
|
105
|
+
dns_update
|
106
|
+
rv
|
107
|
+
end
|
108
|
+
|
109
|
+
# :nodoc:
|
110
|
+
def delete_file(file, before_message, error_message)
|
111
|
+
logger.info(i18n.send(before_message, file))
|
112
|
+
::File.delete(file)
|
113
|
+
true
|
114
|
+
rescue
|
115
|
+
logger.warn(i18n.send(error_message))
|
116
|
+
false
|
117
|
+
end
|
118
|
+
|
119
|
+
# :nodoc:
|
120
|
+
def check_agent_available
|
121
|
+
rv = true
|
122
|
+
unless osx?
|
123
|
+
logger.fatal(i18n.no_agent)
|
124
|
+
rv = false
|
125
|
+
end
|
126
|
+
|
127
|
+
rv
|
128
|
+
end
|
129
|
+
|
130
|
+
# :nodoc:
|
131
|
+
def create_resolver(_, resolver_path)
|
132
|
+
logger.info(replace_markers(i18n.resolver_creating(resolver_path)))
|
133
|
+
|
134
|
+
script_file = create_resolver_script(resolver_path)
|
135
|
+
Kernel.system("/usr/bin/osascript -e 'do shell script \"sh #{script_file.path}\" with administrator privileges' 2>&1 > /dev/null")
|
136
|
+
script_file.unlink
|
137
|
+
true
|
138
|
+
rescue
|
139
|
+
logger.error(i18n.resolver_creating_error)
|
140
|
+
false
|
141
|
+
end
|
142
|
+
|
143
|
+
# :nodoc:
|
144
|
+
def create_resolver_script(resolver_path)
|
145
|
+
script = "mkdir -p '#{File.dirname(resolver_path)}'\nrm -rf '#{resolver_path}'\necho 'nameserver 127.0.0.1\\nport #{@config.port}' >> '#{resolver_path}'"
|
146
|
+
f = Tempfile.new("devdnsd-install-script")
|
147
|
+
f.write(script)
|
148
|
+
f.close
|
149
|
+
f
|
150
|
+
end
|
151
|
+
|
152
|
+
# :nodoc:
|
153
|
+
def delete_resolver(_, resolver_path)
|
154
|
+
logger.info(i18n.resolver_deleting(resolver_path))
|
155
|
+
Kernel.system("/usr/bin/osascript -e 'do shell script \"rm #{resolver_path}\" with administrator privileges' 2>&1 > /dev/null")
|
156
|
+
true
|
157
|
+
rescue
|
158
|
+
logger.warn(i18n.resolver_deleting_error)
|
159
|
+
false
|
160
|
+
end
|
161
|
+
|
162
|
+
# :nodoc:
|
163
|
+
def create_agent(launch_agent, _)
|
164
|
+
logger.info(replace_markers(i18n.agent_creating(launch_agent)))
|
165
|
+
program, args = prepare_agent
|
166
|
+
|
167
|
+
::File.open(launch_agent, "w") do |f|
|
168
|
+
f.write({"KeepAlive" => true, "Label" => "it.cowtech.devdnsd", "Program" => program, "ProgramArguments" => args, "RunAtLoad" => true}.to_plist)
|
169
|
+
f.flush
|
170
|
+
end
|
171
|
+
|
172
|
+
true
|
173
|
+
rescue
|
174
|
+
logger.error(i18n.agent_creating_error)
|
175
|
+
false
|
176
|
+
end
|
177
|
+
|
178
|
+
# :nodoc:
|
179
|
+
def prepare_agent
|
180
|
+
[
|
181
|
+
(::Pathname.new(Dir.pwd) + $PROGRAM_NAME).to_s,
|
182
|
+
(ARGV ? ARGV[0, ARGV.length - 1] : [])
|
183
|
+
]
|
184
|
+
end
|
185
|
+
|
186
|
+
# :nodoc:
|
187
|
+
def delete_agent(launch_agent, _)
|
188
|
+
delete_file(launch_agent, :agent_deleting, :agent_deleting_error)
|
189
|
+
end
|
190
|
+
|
191
|
+
# :nodoc:
|
192
|
+
def load_agent(launch_agent, _)
|
193
|
+
toggle_agent(launch_agent, "load", :agent_loading, :agent_loading_error, :error)
|
194
|
+
end
|
195
|
+
|
196
|
+
# :nodoc:
|
197
|
+
def unload_agent(launch_agent, _)
|
198
|
+
toggle_agent(launch_agent, "unload", :agent_unloading, :agent_unloading_error, :warn)
|
199
|
+
end
|
200
|
+
|
201
|
+
# :nodoc:
|
202
|
+
def toggle_agent(launch_agent, operation, info_message, error_message, error_level)
|
203
|
+
logger.info(i18n.send(info_message, launch_agent))
|
204
|
+
raise RuntimeError unless File.exist?(launch_agent)
|
205
|
+
execute_command("launchctl #{operation} -w \"#{launch_agent}\" > /dev/null 2>&1")
|
206
|
+
true
|
207
|
+
rescue
|
208
|
+
logger.send(error_level, i18n.send(error_message))
|
209
|
+
false
|
210
|
+
end
|
211
|
+
|
212
|
+
# :nodoc:
|
213
|
+
def replace_markers(message)
|
214
|
+
@command.application.console.replace_markers(message)
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
data/lib/devdnsd/rule.rb
CHANGED
@@ -24,19 +24,54 @@ module DevDNSd
|
|
24
24
|
attr_accessor :options
|
25
25
|
attr_accessor :block
|
26
26
|
|
27
|
-
|
27
|
+
# Class methods
|
28
|
+
class << self
|
29
|
+
# Creates a new rule.
|
30
|
+
#
|
31
|
+
# @param match [String|Regexp] The pattern to match.
|
32
|
+
# @param reply [String|Symbol] The IP or hostname to reply back to the client. It can be omitted (and it will be ignored) if a block is provided.
|
33
|
+
# @param type [Symbol] The type of request to match.
|
34
|
+
# @param options [Hash] A list of options for the request.
|
35
|
+
# @param block [Proc] An optional block to compute the reply instead of using the `reply` parameter.
|
36
|
+
# @return [Rule] The new rule.
|
37
|
+
def create(match: /.+/, reply: "127.0.0.1", type: :A, options: {}, &block)
|
38
|
+
new(match: match, reply: reply, type: type, options: options, &block)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Converts a class to the correspondent symbol.
|
42
|
+
#
|
43
|
+
# @param klass [Class] The class to convert.
|
44
|
+
# @return [Symbol] The symbol representation of the class.
|
45
|
+
def resource_class_to_symbol(klass)
|
46
|
+
klass.to_s.gsub(/(.+::)?(.+)/, "\\2").to_sym
|
47
|
+
end
|
48
|
+
|
49
|
+
# Converts a symbol to the correspondent DNS resource class.
|
50
|
+
#
|
51
|
+
# @param symbol [Symbol] The symbol to convert.
|
52
|
+
# @param locale [Symbol] The locale to use for the messages.
|
53
|
+
# @return [Symbol] The class associated to the symbol.
|
54
|
+
def symbol_to_resource_class(symbol, locale = nil)
|
55
|
+
symbol = symbol.to_s.upcase
|
56
|
+
|
57
|
+
begin
|
58
|
+
"Resolv::DNS::Resource::IN::#{symbol}".constantize
|
59
|
+
rescue ::NameError
|
60
|
+
i18n = Bovem::I18n.new(locale, root: "devdnsd", path: ::Pathname.new(::File.dirname(__FILE__)).to_s + "/../../locales/")
|
61
|
+
raise(DevDNSd::Errors::InvalidRule, i18n.rule_invalid_resource(symbol))
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
28
65
|
|
29
66
|
# Creates a new rule.
|
30
67
|
#
|
31
68
|
# @param match [String|Regexp] The pattern to match.
|
32
|
-
# @param reply [String] The IP or hostname to reply back to the client.
|
69
|
+
# @param reply [String|Symbol] The IP or hostname to reply back to the client. It can be omitted (and it will be ignored) if a block is provided.
|
33
70
|
# @param type [Symbol] The type of request to match.
|
34
71
|
# @param options [Hash] A list of options for the request.
|
35
72
|
# @param block [Proc] An optional block to compute the reply instead of using the `reply` parameter.
|
36
73
|
# @see .create
|
37
|
-
def initialize(match
|
38
|
-
i18n_setup(:devdnsd, ::File.absolute_path(::Pathname.new(::File.dirname(__FILE__)).to_s + "/../../locales/"))
|
39
|
-
self.i18n = options[:locale]
|
74
|
+
def initialize(match: /.+/, reply: "127.0.0.1", type: :A, options: {}, &block)
|
40
75
|
setup(match, reply, type, options, block)
|
41
76
|
validate_rule
|
42
77
|
end
|
@@ -45,122 +80,58 @@ module DevDNSd
|
|
45
80
|
#
|
46
81
|
# @return [Array|Class] The class(es) for the current rule.
|
47
82
|
def resource_class
|
48
|
-
classes = @type.ensure_array(
|
83
|
+
classes = @type.ensure_array(no_duplicates: true, compact: true, flatten: true) { |cls| self.class.symbol_to_resource_class(cls, options[:locale]) }
|
49
84
|
classes.length == 1 ? classes.first : classes
|
50
85
|
end
|
51
86
|
|
52
87
|
# Checks if the rule is a regexp.
|
53
88
|
#
|
54
89
|
# @return [Boolean] `true` if the rule is a Regexp, `false` otherwise.
|
55
|
-
def
|
90
|
+
def regexp?
|
56
91
|
@match.is_a?(::Regexp)
|
57
92
|
end
|
93
|
+
alias_method :is_regexp?, :regexp?
|
58
94
|
|
59
95
|
# Checks if the rule is a regexp.
|
60
96
|
#
|
61
97
|
# @return [Boolean] `true` if the rule has a block, `false` otherwise.
|
62
|
-
def
|
98
|
+
def block?
|
63
99
|
@block.present?
|
64
100
|
end
|
101
|
+
alias_method :has_block?, :block?
|
65
102
|
|
66
103
|
# Matches a hostname to the rule.
|
67
104
|
#
|
68
105
|
# @param hostname [String] The hostname to match.
|
69
106
|
# @return [MatchData|Boolean|Nil] Return `true` or MatchData (if the pattern is a regexp) if the rule matches, `false` or `nil` otherwise.
|
70
107
|
def match_host(hostname)
|
71
|
-
|
72
|
-
end
|
73
|
-
|
74
|
-
# Creates a new rule.
|
75
|
-
#
|
76
|
-
# @param match [String|Regexp] The pattern to match.
|
77
|
-
# @param reply_or_type [String|Symbol] The IP or hostname to reply back to the client (or the type of request to match, if a block is provided).
|
78
|
-
# @param type [Symbol] The type of request to match. This is ignored if a block is provided.
|
79
|
-
# @param options [Hash] A list of options for the request.
|
80
|
-
# @param block [Proc] An optional block to compute the reply instead of using the `reply_or_type` parameter. In this case `reply_or_type` is used for the type of the request and `type` is ignored.
|
81
|
-
# @return [Rule] The new rule.
|
82
|
-
def self.create(match, reply_or_type = nil, type = nil, options = {}, &block)
|
83
|
-
validate_options(reply_or_type, options, block, Lazier::Localizer.new(:devdnsd, ::File.absolute_path(::Pathname.new(::File.dirname(__FILE__)).to_s + "/../../locales/"), options.is_a?(Hash) ? options[:locale] : nil))
|
84
|
-
setup(new(match), reply_or_type, type, options, block)
|
85
|
-
end
|
86
|
-
|
87
|
-
# Converts a class to the correspondent symbol.
|
88
|
-
#
|
89
|
-
# @param klass [Class] The class to convert.
|
90
|
-
# @return [Symbol] The symbol representation of the class.
|
91
|
-
def self.resource_class_to_symbol(klass)
|
92
|
-
klass.to_s.gsub(/(.+::)?(.+)/, "\\2").to_sym
|
108
|
+
regexp? ? @match.match(hostname) : (@match == hostname)
|
93
109
|
end
|
94
110
|
|
95
|
-
|
96
|
-
#
|
97
|
-
# @param symbol [Symbol] The symbol to convert.
|
98
|
-
# @param locale [Symbol] The locale to use for the messages.
|
99
|
-
# @return [Symbol] The class associated to the symbol.
|
100
|
-
def self.symbol_to_resource_class(symbol, locale = nil)
|
101
|
-
symbol = symbol.to_s.upcase
|
111
|
+
private
|
102
112
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
raise(DevDNSd::Errors::InvalidRule.new(Lazier::Localizer.new(:devdnsd, ::File.absolute_path(::Pathname.new(::File.dirname(__FILE__)).to_s + "/../../locales/"), locale).i18n.invalid_class(symbol)))
|
107
|
-
end
|
108
|
-
end
|
113
|
+
# :nodoc:
|
114
|
+
def setup(match, reply, type, options, block)
|
115
|
+
@match = match
|
109
116
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
#
|
114
|
-
|
115
|
-
# @param type [Symbol] The type of request to match.
|
116
|
-
# @param options [Hash] A list of options for the request.
|
117
|
-
# @param block [Proc] An optional block to compute the reply instead of using the `reply` parameter.
|
118
|
-
def setup(match, reply, type, options, block)
|
119
|
-
@match = match
|
117
|
+
if block.present? # reply acts like a type, type is ignored
|
118
|
+
@type = type || :A
|
119
|
+
@reply = nil
|
120
|
+
else # reply acts like a reply
|
121
|
+
@reply = reply || "127.0.0.1"
|
120
122
|
@type = type || :A
|
121
|
-
@reply = block.blank? ? (reply || "127.0.0.1") : nil
|
122
|
-
@options = options
|
123
|
-
@block = block
|
124
|
-
end
|
125
|
-
|
126
|
-
# Validates a newly created rule.
|
127
|
-
def validate_rule
|
128
|
-
raise(DevDNSd::Errors::InvalidRule.new(i18n.rule_invalid_call)) if @reply.blank? && @block.nil?
|
129
|
-
raise(DevDNSd::Errors::InvalidRule.new(i18n.rule_invalid_options)) if !@options.is_a?(::Hash)
|
130
123
|
end
|
131
124
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
# @param options [Hash] A list of options for the request.
|
138
|
-
# @param block [Proc] An optional block to compute the reply instead of using the `reply_or_type` parameter. In this case `reply_or_type` is used for the type of the request and `type` is ignored.
|
139
|
-
# @return [Rule] The new rule.
|
140
|
-
def self.setup(rv, reply_or_type, type, options = {}, block)
|
141
|
-
rv.options = options
|
142
|
-
rv.block = block
|
143
|
-
|
144
|
-
if block.present? then # reply_or_type acts like a type, type is ignored
|
145
|
-
rv.type = reply_or_type || :A
|
146
|
-
rv.reply = nil
|
147
|
-
else # reply_or_type acts like a reply
|
148
|
-
rv.reply = reply_or_type || "127.0.0.1"
|
149
|
-
rv.type = type || :A
|
150
|
-
end
|
151
|
-
|
152
|
-
rv
|
153
|
-
end
|
125
|
+
@options = options
|
126
|
+
@block = block
|
127
|
+
locale = options.is_a?(Hash) ? options[:locale] : :en
|
128
|
+
@i18n = Bovem::I18n.new(locale, root: "devdnsd", path: ::Pathname.new(::File.dirname(__FILE__)).to_s + "/../../locales/")
|
129
|
+
end
|
154
130
|
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
# @param localizer [Localizer] A localizer object.
|
161
|
-
def self.validate_options(reply_or_type, options, block, localizer)
|
162
|
-
raise(DevDNSd::Errors::InvalidRule.new(localizer.i18n.rule_invalid_call)) if reply_or_type.blank? && block.nil?
|
163
|
-
raise(DevDNSd::Errors::InvalidRule.new(localizer.i18n.rule_invalid_options)) if !options.is_a?(::Hash)
|
164
|
-
end
|
131
|
+
# Validates a newly created rule.
|
132
|
+
def validate_rule
|
133
|
+
raise(DevDNSd::Errors::InvalidRule, @i18n.rule_invalid_call) if @reply.blank? && @block.nil?
|
134
|
+
raise(DevDNSd::Errors::InvalidRule, @i18n.rule_invalid_options) unless @options.is_a?(::Hash)
|
135
|
+
end
|
165
136
|
end
|
166
137
|
end
|