middleman-core 3.3.12 → 3.4.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/.rspec +1 -0
- data/cucumber.yml +2 -0
- data/features/asset_hash.feature +9 -0
- data/features/chained_templates.feature +4 -1
- data/features/cli/preview_server.feature +532 -0
- data/features/i18n_link_to.feature +209 -0
- data/features/javascript-testing.feature +18 -0
- data/features/redirects.feature +1 -0
- data/features/relative_assets.feature +11 -0
- data/features/support/env.rb +3 -0
- data/fixtures/asset-hash-app/source/fonts/fontawesome-webfont.woff +0 -0
- data/fixtures/asset-hash-app/source/fonts/fontawesome-webfont.woff2 +0 -0
- data/fixtures/asset-hash-app/source/stylesheets/uses_fonts.css +4 -0
- data/fixtures/chained-app/source/test.erb.combobreaker.str.erb +8 -0
- data/fixtures/javascript-app/config.rb +0 -0
- data/fixtures/javascript-app/source/index.html +17 -0
- data/fixtures/preview-server-app/bin/dns_server.rb +33 -0
- data/fixtures/preview-server-app/config-complications.rb +11 -0
- data/fixtures/preview-server-app/config-empty.rb +0 -0
- data/fixtures/preview-server-app/config.rb +11 -0
- data/fixtures/preview-server-app/source/index.html.erb +1 -0
- data/fixtures/preview-server-app/source/layout.erb +9 -0
- data/fixtures/preview-server-app/source/layouts/custom.erb +8 -0
- data/fixtures/preview-server-app/source/real.html +1 -0
- data/fixtures/preview-server-app/source/real/index.html.erb +5 -0
- data/fixtures/preview-server-app/source/should_be_ignored.html +1 -0
- data/fixtures/preview-server-app/source/should_be_ignored2.html +1 -0
- data/fixtures/preview-server-app/source/should_be_ignored3.html +1 -0
- data/fixtures/preview-server-app/source/static.html +1 -0
- data/fixtures/relative-assets-app/source/absolute_image_relative_css.html.erb +9 -0
- data/fixtures/relative-assets-app/source/javascripts/app.js +3 -0
- data/fixtures/relative-assets-app/source/relative_image.html.erb +1 -0
- data/fixtures/relative-assets-app/source/relative_image_absolute_css.html.erb +9 -0
- data/lib/middleman-core/application.rb +11 -5
- data/lib/middleman-core/cli/build.rb +3 -1
- data/lib/middleman-core/cli/bundler.rb +1 -1
- data/lib/middleman-core/cli/extension.rb +2 -2
- data/lib/middleman-core/cli/init.rb +3 -3
- data/lib/middleman-core/cli/server.rb +9 -1
- data/lib/middleman-core/configuration.rb +0 -2
- data/lib/middleman-core/core_extensions/data.rb +2 -2
- data/lib/middleman-core/core_extensions/external_helpers.rb +2 -1
- data/lib/middleman-core/core_extensions/file_watcher.rb +7 -0
- data/lib/middleman-core/core_extensions/front_matter.rb +13 -4
- data/lib/middleman-core/core_extensions/rendering.rb +20 -6
- data/lib/middleman-core/core_extensions/request.rb +2 -2
- data/lib/middleman-core/dns_resolver.rb +73 -0
- data/lib/middleman-core/dns_resolver/basic_network_resolver.rb +52 -0
- data/lib/middleman-core/dns_resolver/hosts_resolver.rb +63 -0
- data/lib/middleman-core/dns_resolver/local_link_resolver.rb +44 -0
- data/lib/middleman-core/dns_resolver/network_resolver.rb +42 -0
- data/lib/middleman-core/extension.rb +0 -1
- data/lib/middleman-core/meta_pages.rb +1 -1
- data/lib/middleman-core/preview_server.rb +94 -37
- data/lib/middleman-core/preview_server/checks.rb +81 -0
- data/lib/middleman-core/preview_server/information.rb +273 -0
- data/lib/middleman-core/preview_server/network_interface_inventory.rb +65 -0
- data/lib/middleman-core/preview_server/server_hostname.rb +39 -0
- data/lib/middleman-core/preview_server/server_information.rb +144 -0
- data/lib/middleman-core/preview_server/server_information_validator.rb +18 -0
- data/lib/middleman-core/preview_server/server_ip_address.rb +55 -0
- data/lib/middleman-core/preview_server/server_url.rb +50 -0
- data/lib/middleman-core/preview_server/tcp_port_prober.rb +29 -0
- data/lib/middleman-core/sitemap.rb +4 -4
- data/lib/middleman-core/sitemap/extensions/ignores.rb +5 -1
- data/lib/middleman-core/sitemap/extensions/proxies.rb +0 -1
- data/lib/middleman-core/sitemap/extensions/redirects.rb +2 -1
- data/lib/middleman-core/sitemap/queryable.rb +2 -1
- data/lib/middleman-core/sitemap/store.rb +3 -3
- data/lib/middleman-core/step_definitions.rb +1 -0
- data/lib/middleman-core/step_definitions/builder_steps.rb +7 -7
- data/lib/middleman-core/step_definitions/commandline_steps.rb +88 -0
- data/lib/middleman-core/step_definitions/server_steps.rb +25 -28
- data/lib/middleman-core/templates/extension/Gemfile +0 -1
- data/lib/middleman-core/templates/extension/Rakefile +1 -1
- data/lib/middleman-core/util.rb +24 -0
- data/lib/middleman-core/version.rb +1 -1
- data/lib/middleman-more/core_extensions/default_helpers.rb +49 -8
- data/lib/middleman-more/core_extensions/i18n.rb +101 -27
- data/lib/middleman-more/extensions/asset_hash.rb +1 -1
- data/lib/middleman-more/extensions/asset_host.rb +1 -1
- data/lib/middleman-more/extensions/automatic_image_sizes.rb +7 -0
- data/lib/middleman-more/extensions/cache_buster.rb +1 -1
- data/lib/middleman-more/extensions/lorem.rb +2 -2
- data/lib/middleman-more/extensions/minify_javascript.rb +6 -4
- data/lib/middleman-more/extensions/relative_assets.rb +4 -8
- data/middleman-core.gemspec +3 -3
- data/spec/middleman-core/dns_resolver_spec.rb +118 -0
- data/spec/middleman-core/preview_server/server_hostname_spec.rb +39 -0
- data/spec/middleman-core/preview_server/server_ip_address_spec.rb +43 -0
- data/spec/spec_helper.rb +26 -0
- metadata +81 -17
|
@@ -8,10 +8,6 @@ require 'i18n'
|
|
|
8
8
|
# users expect.
|
|
9
9
|
::I18n.enforce_available_locales = false
|
|
10
10
|
|
|
11
|
-
# Use ActiveSupport JSON
|
|
12
|
-
require 'active_support/json'
|
|
13
|
-
require 'active_support/core_ext/integer/inflections'
|
|
14
|
-
|
|
15
11
|
# Simple callback library
|
|
16
12
|
require 'hooks'
|
|
17
13
|
|
|
@@ -57,7 +53,9 @@ module Middleman
|
|
|
57
53
|
# Root project directory (overwritten in middleman build/server)
|
|
58
54
|
# @return [String]
|
|
59
55
|
def self.root
|
|
60
|
-
ENV['MM_ROOT']
|
|
56
|
+
r = ENV['MM_ROOT'] ? ENV['MM_ROOT'].dup : ::Middleman::Util.current_directory
|
|
57
|
+
r.encode!('UTF-8', 'UTF-8-MAC') if RUBY_PLATFORM =~ /darwin/
|
|
58
|
+
r
|
|
61
59
|
end
|
|
62
60
|
delegate :root, to: :"self.class"
|
|
63
61
|
|
|
@@ -71,6 +69,14 @@ module Middleman
|
|
|
71
69
|
# @return [Fixnum]
|
|
72
70
|
config.define_setting :port, 4567, 'The preview server port'
|
|
73
71
|
|
|
72
|
+
# Which server name should be used
|
|
73
|
+
# @return [NilClass, String]
|
|
74
|
+
config.define_setting :server_name, nil, 'The server name of preview server'
|
|
75
|
+
|
|
76
|
+
# Which bind address the preview server should use
|
|
77
|
+
# @return [NilClass, String]
|
|
78
|
+
config.define_setting :bind_address, nil, 'The bind address of the preview server'
|
|
79
|
+
|
|
74
80
|
# Whether to serve the preview server over HTTPS.
|
|
75
81
|
# @return [Boolean]
|
|
76
82
|
config.define_setting :https, false, 'Serve the preview server over SSL/TLS'
|
|
@@ -138,7 +138,9 @@ module Middleman::Cli
|
|
|
138
138
|
base.remove_file f, force: true
|
|
139
139
|
end
|
|
140
140
|
|
|
141
|
-
|
|
141
|
+
::Middleman::Util.glob_directory(@build_dir.join('**', '*'))
|
|
142
|
+
.select { |d| File.directory?(d) }
|
|
143
|
+
.each do |d|
|
|
142
144
|
base.remove_file d, force: true if directory_empty? d
|
|
143
145
|
end
|
|
144
146
|
end
|
|
@@ -35,13 +35,13 @@ module Middleman::Cli
|
|
|
35
35
|
# Output a .gitignore file
|
|
36
36
|
class_option :git, type: :boolean, default: true
|
|
37
37
|
|
|
38
|
-
no_tasks
|
|
38
|
+
no_tasks do
|
|
39
39
|
# Write a .gitignore file for project
|
|
40
40
|
# @return [void]
|
|
41
41
|
def generate_gitignore!
|
|
42
42
|
return unless options[:git]
|
|
43
43
|
copy_file 'gitignore', File.join(name, '.gitignore')
|
|
44
44
|
end
|
|
45
|
-
|
|
45
|
+
end
|
|
46
46
|
end
|
|
47
47
|
end
|
|
@@ -14,6 +14,12 @@ module Middleman::Cli
|
|
|
14
14
|
method_option :port,
|
|
15
15
|
aliases: '-p',
|
|
16
16
|
desc: 'The port Middleman will listen on'
|
|
17
|
+
method_option :server_name,
|
|
18
|
+
aliases: '-s',
|
|
19
|
+
desc: 'The server name name Middleman will use'
|
|
20
|
+
method_option :bind_address,
|
|
21
|
+
aliases: '-b',
|
|
22
|
+
desc: 'The bind address Middleman will listen on'
|
|
17
23
|
method_option :https,
|
|
18
24
|
type: :boolean,
|
|
19
25
|
desc: 'Serve the preview server over SSL/TLS'
|
|
@@ -59,13 +65,15 @@ module Middleman::Cli
|
|
|
59
65
|
unless ENV['MM_ROOT']
|
|
60
66
|
puts '== Could not find a Middleman project config.rb'
|
|
61
67
|
puts '== Treating directory as a static site to be served'
|
|
62
|
-
ENV['MM_ROOT'] =
|
|
68
|
+
ENV['MM_ROOT'] = ::Middleman::Util.current_directory
|
|
63
69
|
ENV['MM_SOURCE'] = ''
|
|
64
70
|
end
|
|
65
71
|
|
|
66
72
|
params = {
|
|
67
73
|
port: options['port'],
|
|
74
|
+
bind_address: options['bind_address'],
|
|
68
75
|
https: options['https'],
|
|
76
|
+
server_name: options['server_name'],
|
|
69
77
|
ssl_certificate: options['ssl_certificate'],
|
|
70
78
|
ssl_private_key: options['ssl_private_key'],
|
|
71
79
|
environment: options['environment'],
|
|
@@ -118,7 +118,6 @@ module Middleman
|
|
|
118
118
|
# Set the value of a setting by key. Creates the setting if it doesn't exist.
|
|
119
119
|
# @param [Symbol] key
|
|
120
120
|
# @param [Object] val
|
|
121
|
-
# rubocop:disable UselessSetterCall
|
|
122
121
|
def []=(key, val)
|
|
123
122
|
setting_obj = setting(key) || define_setting(key)
|
|
124
123
|
setting_obj.value = val
|
|
@@ -228,7 +227,6 @@ module Middleman
|
|
|
228
227
|
end
|
|
229
228
|
|
|
230
229
|
# Whether or not there has been a value set beyond the default
|
|
231
|
-
# rubocop:disable TrivialAccessors
|
|
232
230
|
def value_set?
|
|
233
231
|
@value_set
|
|
234
232
|
end
|
|
@@ -9,7 +9,7 @@ module Middleman
|
|
|
9
9
|
def registered(app)
|
|
10
10
|
# Data formats
|
|
11
11
|
require 'yaml'
|
|
12
|
-
require '
|
|
12
|
+
require 'json'
|
|
13
13
|
|
|
14
14
|
app.config.define_setting :data_dir, 'data', 'The directory data files are stored in'
|
|
15
15
|
app.send :include, InstanceMethods
|
|
@@ -98,7 +98,7 @@ module Middleman
|
|
|
98
98
|
if %w(.yaml .yml).include?(extension)
|
|
99
99
|
data = YAML.load_file(full_path)
|
|
100
100
|
elsif extension == '.json'
|
|
101
|
-
data =
|
|
101
|
+
data = JSON.parse(full_path.read)
|
|
102
102
|
else
|
|
103
103
|
return
|
|
104
104
|
end
|
|
@@ -19,7 +19,8 @@ module Middleman
|
|
|
19
19
|
helpers_path = File.join(root, config[:helpers_dir])
|
|
20
20
|
next unless File.exist?(helpers_path)
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
glob = File.join(helpers_path, config[:helpers_filename_glob])
|
|
23
|
+
::Middleman::Util.glob_directory(glob).each do |filename|
|
|
23
24
|
module_name = config[:helpers_filename_to_module_name_proc].call(filename)
|
|
24
25
|
next unless module_name
|
|
25
26
|
|
|
@@ -95,6 +95,8 @@ module Middleman
|
|
|
95
95
|
# @param [Pathname] path The file that changed
|
|
96
96
|
# @return [void]
|
|
97
97
|
def did_change(path)
|
|
98
|
+
path = path.to_s.encode!('UTF-8', 'UTF-8-MAC') if RUBY_PLATFORM =~ /darwin/
|
|
99
|
+
|
|
98
100
|
path = Pathname(path)
|
|
99
101
|
logger.debug "== File Change: #{path}"
|
|
100
102
|
@known_paths << path
|
|
@@ -106,6 +108,8 @@ module Middleman
|
|
|
106
108
|
# @param [Pathname] path The file that was deleted
|
|
107
109
|
# @return [void]
|
|
108
110
|
def did_delete(path)
|
|
111
|
+
path = path.to_s.encode!('UTF-8', 'UTF-8-MAC') if RUBY_PLATFORM =~ /darwin/
|
|
112
|
+
|
|
109
113
|
path = Pathname(path)
|
|
110
114
|
logger.debug "== File Deletion: #{path}"
|
|
111
115
|
@known_paths.delete(path)
|
|
@@ -146,7 +150,10 @@ module Middleman
|
|
|
146
150
|
end
|
|
147
151
|
|
|
148
152
|
def exists?(path)
|
|
153
|
+
path = path.to_s.encode!('UTF-8', 'UTF-8-MAC') if RUBY_PLATFORM =~ /darwin/
|
|
154
|
+
|
|
149
155
|
p = Pathname(path)
|
|
156
|
+
|
|
150
157
|
p = p.relative_path_from(Pathname(@app.root)) unless p.relative?
|
|
151
158
|
@known_paths.include?(p)
|
|
152
159
|
end
|
|
@@ -5,7 +5,7 @@ require 'pathname'
|
|
|
5
5
|
require 'yaml'
|
|
6
6
|
|
|
7
7
|
# Parsing JSON frontmatter
|
|
8
|
-
require '
|
|
8
|
+
require 'json'
|
|
9
9
|
|
|
10
10
|
# Extensions namespace
|
|
11
11
|
module Middleman::CoreExtensions
|
|
@@ -101,7 +101,7 @@ module Middleman::CoreExtensions
|
|
|
101
101
|
data, content = frontmatter_and_content(p)
|
|
102
102
|
|
|
103
103
|
if app.files.exists?("#{path}.frontmatter")
|
|
104
|
-
external_data,
|
|
104
|
+
external_data, = frontmatter_and_content("#{p}.frontmatter")
|
|
105
105
|
data = external_data.deep_merge(data)
|
|
106
106
|
end
|
|
107
107
|
|
|
@@ -154,7 +154,7 @@ module Middleman::CoreExtensions
|
|
|
154
154
|
|
|
155
155
|
begin
|
|
156
156
|
json = ($1 + $2).sub(';;;', '{').sub(';;;', '}')
|
|
157
|
-
data =
|
|
157
|
+
data = JSON.parse(json).symbolize_keys
|
|
158
158
|
rescue => e
|
|
159
159
|
app.logger.error "JSON Exception parsing #{full_path}: #{e.message}"
|
|
160
160
|
return false
|
|
@@ -185,7 +185,7 @@ module Middleman::CoreExtensions
|
|
|
185
185
|
|
|
186
186
|
# Avoid weird race condition when a file is renamed.
|
|
187
187
|
content = begin
|
|
188
|
-
|
|
188
|
+
read_data_file(full_path)
|
|
189
189
|
rescue ::EOFError
|
|
190
190
|
rescue ::IOError
|
|
191
191
|
rescue ::Errno::ENOENT
|
|
@@ -208,6 +208,15 @@ module Middleman::CoreExtensions
|
|
|
208
208
|
[data, content]
|
|
209
209
|
end
|
|
210
210
|
|
|
211
|
+
def read_data_file(path)
|
|
212
|
+
data = File.open(path, 'rb') { |io| io.read }
|
|
213
|
+
if data.respond_to?(:force_encoding)
|
|
214
|
+
# Set it to the default external (without verifying)
|
|
215
|
+
data.force_encoding(Encoding.default_external) if Encoding.default_external
|
|
216
|
+
end
|
|
217
|
+
data
|
|
218
|
+
end
|
|
219
|
+
|
|
211
220
|
def normalize_path(path)
|
|
212
221
|
path.sub(%r{^#{Regexp.escape(app.source_dir)}\/}, '')
|
|
213
222
|
end
|
|
@@ -217,10 +217,19 @@ module Middleman
|
|
|
217
217
|
# Render the partial if found, otherwide throw exception
|
|
218
218
|
_render_with_all_renderers(found_partial, locals, self, options, &block)
|
|
219
219
|
else
|
|
220
|
-
|
|
220
|
+
read_template_file(found_partial)
|
|
221
221
|
end
|
|
222
222
|
end
|
|
223
223
|
|
|
224
|
+
def read_template_file(path)
|
|
225
|
+
data = ::File.open(path, 'rb') { |io| io.read }
|
|
226
|
+
if data.respond_to?(:force_encoding)
|
|
227
|
+
# Set it to the default external (without verifying)
|
|
228
|
+
data.force_encoding(::Encoding.default_external) if ::Encoding.default_external
|
|
229
|
+
end
|
|
230
|
+
data
|
|
231
|
+
end
|
|
232
|
+
|
|
224
233
|
# Partial locator.
|
|
225
234
|
#
|
|
226
235
|
# @param [String] partial_name
|
|
@@ -277,6 +286,7 @@ module Middleman
|
|
|
277
286
|
extension = File.extname(path)
|
|
278
287
|
options = opts.dup.merge(options_for_ext(extension))
|
|
279
288
|
options[:outvar] ||= '@_out_buf'
|
|
289
|
+
options[:default_encoding] ||= 'UTF-8'
|
|
280
290
|
options.delete(:layout)
|
|
281
291
|
|
|
282
292
|
# Overwrite with frontmatter options
|
|
@@ -300,7 +310,7 @@ module Middleman
|
|
|
300
310
|
end
|
|
301
311
|
|
|
302
312
|
# Render using Tilt
|
|
303
|
-
content = template.render(context, locs, &block)
|
|
313
|
+
content = template.render(context || ::Object.new, locs, &block)
|
|
304
314
|
|
|
305
315
|
# Allow hooks to manipulate the result after render
|
|
306
316
|
self.class.callbacks_for_hook(:after_render).each do |callback|
|
|
@@ -326,7 +336,7 @@ module Middleman
|
|
|
326
336
|
# @param [String] path
|
|
327
337
|
# @return [String]
|
|
328
338
|
def template_data_for_file(path)
|
|
329
|
-
|
|
339
|
+
read_template_file(File.expand_path(path, source_dir))
|
|
330
340
|
end
|
|
331
341
|
|
|
332
342
|
# Get a hash of configuration options for a given file extension, from
|
|
@@ -418,11 +428,16 @@ module Middleman
|
|
|
418
428
|
|
|
419
429
|
layout_path = locate_layout(layout_name, current_engine)
|
|
420
430
|
|
|
431
|
+
unless layout_path
|
|
432
|
+
raise ::Middleman::CoreExtensions::Rendering::TemplateNotFound, "Could not locate layout: #{layout_name}"
|
|
433
|
+
end
|
|
434
|
+
|
|
421
435
|
extension = File.extname(layout_path)
|
|
422
436
|
engine = extension[1..-1].to_sym
|
|
423
437
|
|
|
424
438
|
# Store last engine for later (could be inside nested renders)
|
|
425
|
-
self.current_engine
|
|
439
|
+
self.current_engine = engine
|
|
440
|
+
engine_was = current_engine
|
|
426
441
|
|
|
427
442
|
begin
|
|
428
443
|
content = if block_given?
|
|
@@ -447,7 +462,6 @@ module Middleman
|
|
|
447
462
|
end
|
|
448
463
|
|
|
449
464
|
# The currently rendering engine
|
|
450
|
-
# rubocop:disable TrivialAccessors
|
|
451
465
|
# @return [Symbol, nil]
|
|
452
466
|
def current_engine=(v)
|
|
453
467
|
@_current_engine = v
|
|
@@ -502,7 +516,7 @@ module Middleman
|
|
|
502
516
|
|
|
503
517
|
found_path = nil
|
|
504
518
|
search_paths.each do |path_with_ext|
|
|
505
|
-
found_path =
|
|
519
|
+
found_path = ::Middleman::Util.glob_directory(path_with_ext).find do |path|
|
|
506
520
|
::Tilt[path]
|
|
507
521
|
end
|
|
508
522
|
|
|
@@ -173,8 +173,8 @@ module Middleman
|
|
|
173
173
|
def current_path=(path)
|
|
174
174
|
Thread.current[:current_path] = path
|
|
175
175
|
Thread.current[:legacy_request] = ::Thor::CoreExt::HashWithIndifferentAccess.new(
|
|
176
|
-
|
|
177
|
-
|
|
176
|
+
path: path,
|
|
177
|
+
params: req ? ::Thor::CoreExt::HashWithIndifferentAccess.new(req.params) : {}
|
|
178
178
|
)
|
|
179
179
|
end
|
|
180
180
|
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
require 'resolv'
|
|
2
|
+
require 'middleman-core/dns_resolver/network_resolver'
|
|
3
|
+
require 'middleman-core/dns_resolver/hosts_resolver'
|
|
4
|
+
|
|
5
|
+
module Middleman
|
|
6
|
+
# This resolves IP address to names and vice versa
|
|
7
|
+
class DnsResolver
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
attr_reader :resolvers
|
|
11
|
+
|
|
12
|
+
public
|
|
13
|
+
|
|
14
|
+
# Create resolver
|
|
15
|
+
#
|
|
16
|
+
# First the local resolver is used. If environment variable HOSTSRC is
|
|
17
|
+
# given this file is used for local name lookup.
|
|
18
|
+
#
|
|
19
|
+
# @param [#getnames, #getaddresses] network_resolver
|
|
20
|
+
# The resolver which uses a network name server to resolve ip addresses
|
|
21
|
+
# and names.
|
|
22
|
+
#
|
|
23
|
+
# @param [#getnames, #getaddresses] local_resolver
|
|
24
|
+
# The resolver uses /etc/hosts on POSIX-systems and
|
|
25
|
+
# C:\Windows\System32\drivers\etc\hosts on Windows-operating systems to
|
|
26
|
+
# resolve ip addresses and names.
|
|
27
|
+
#
|
|
28
|
+
# First the local resolver is queried. If this raises an error or returns
|
|
29
|
+
# nil or [] the network resolver is queried.
|
|
30
|
+
def initialize(opts={})
|
|
31
|
+
@resolvers = []
|
|
32
|
+
@resolvers << opts.fetch(:hosts_resolver, HostsResolver.new)
|
|
33
|
+
|
|
34
|
+
if RUBY_VERSION >= '2.1'
|
|
35
|
+
require 'middleman-core/dns_resolver/local_link_resolver'
|
|
36
|
+
@resolvers << opts.fetch(:local_link_resolver, LocalLinkResolver.new)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
@resolvers << opts.fetch(:network_resolver, NetworkResolver.new)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Get names for given ip
|
|
43
|
+
#
|
|
44
|
+
# @param [String] ip
|
|
45
|
+
# The ip which should be resolved.
|
|
46
|
+
def names_for(ip)
|
|
47
|
+
resolvers.each do |r|
|
|
48
|
+
names = r.getnames(ip)
|
|
49
|
+
|
|
50
|
+
return names unless names.nil? || names.empty?
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
[]
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Get ips for given name
|
|
57
|
+
#
|
|
58
|
+
# First the local resolver is used. On POSIX-systems /etc/hosts is used. On
|
|
59
|
+
# Windows C:\Windows\System32\drivers\etc\hosts is used.
|
|
60
|
+
#
|
|
61
|
+
# @param [String] name
|
|
62
|
+
# The name which should be resolved.
|
|
63
|
+
def ips_for(name)
|
|
64
|
+
resolvers.each do |r|
|
|
65
|
+
ips = r.getaddresses(name)
|
|
66
|
+
|
|
67
|
+
return ips unless ips.nil? || ips.empty?
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
[]
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
module Middleman
|
|
2
|
+
class DnsResolver
|
|
3
|
+
# Use network name server to resolve ips and names
|
|
4
|
+
class BasicNetworkResolver
|
|
5
|
+
private
|
|
6
|
+
|
|
7
|
+
attr_reader :resolver, :timeouts
|
|
8
|
+
|
|
9
|
+
public
|
|
10
|
+
|
|
11
|
+
def initialize(opts={})
|
|
12
|
+
@timeouts = opts.fetch(:timeouts, 2)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Get names for ip
|
|
16
|
+
#
|
|
17
|
+
# @param [#to_s] ip
|
|
18
|
+
# The ip to resolve into names
|
|
19
|
+
#
|
|
20
|
+
# @return [Array]
|
|
21
|
+
# Array of Names
|
|
22
|
+
def getnames(ip)
|
|
23
|
+
resolver.getnames(ip.to_s).map(&:to_s)
|
|
24
|
+
rescue Resolv::ResolvError, Errno::EADDRNOTAVAIL
|
|
25
|
+
[]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Get ips for name
|
|
29
|
+
#
|
|
30
|
+
# @param [#to_s] name
|
|
31
|
+
# The name to resolve into ips
|
|
32
|
+
#
|
|
33
|
+
# @return [Array]
|
|
34
|
+
# Array of ipaddresses
|
|
35
|
+
def getaddresses(name)
|
|
36
|
+
resolver.getaddresses(name.to_s).map(&:to_s)
|
|
37
|
+
rescue Resolv::ResolvError, Errno::EADDRNOTAVAIL
|
|
38
|
+
[]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Set timeout for lookup
|
|
42
|
+
#
|
|
43
|
+
# @param [Integer] value
|
|
44
|
+
# The timeout value
|
|
45
|
+
def timeouts=(timeouts)
|
|
46
|
+
return if RUBY_VERSION < '2'
|
|
47
|
+
|
|
48
|
+
resolver.timeouts = timeouts
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|