resolv 0.5.0 → 0.6.1
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/.github/workflows/push_gem.yml +5 -5
- data/.github/workflows/test.yml +19 -1
- data/.gitignore +1 -0
- data/Gemfile +1 -0
- data/README.md +6 -4
- data/Rakefile +8 -0
- data/ext/win32/resolv/extconf.rb +1 -1
- data/ext/win32/resolv/lib/resolv.rb +144 -0
- data/ext/win32/resolv/resolv.c +2 -0
- data/lib/resolv.rb +65 -38
- metadata +4 -7
- data/ext/win32/resolv/lib/win32/resolv.rb +0 -135
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f0831b1c59e6ce967c8d36a7a5ddc962985c81ace17de45165dd7fb420398725
|
4
|
+
data.tar.gz: fab3f3c3175d01df8e15383cd83e0b4526e35e21da55fa373bc62419555c66f4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cd0445cd68e2cf4cab80734796084377eb151969df16b29a86865602604852c0830ce7cdb28bbaac8aa7f2ce3abb6c55d1fee8145799965aa385b5b522fdbbf6
|
7
|
+
data.tar.gz: 4ea52516c3cad7419b6234c6aac594894f7a723fa1e9dacffeb3ccc6d935811a7a27ecbf5db898a467cc4a19acf67866cbe0a17270dd30b830eb28bd6d3820a2
|
@@ -23,24 +23,24 @@ jobs:
|
|
23
23
|
|
24
24
|
steps:
|
25
25
|
- name: Harden Runner
|
26
|
-
uses: step-security/harden-runner@
|
26
|
+
uses: step-security/harden-runner@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1
|
27
27
|
with:
|
28
28
|
egress-policy: audit
|
29
29
|
|
30
|
-
- uses: actions/checkout@
|
30
|
+
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
31
31
|
|
32
32
|
- name: Set up Ruby
|
33
|
-
uses: ruby/setup-ruby@
|
33
|
+
uses: ruby/setup-ruby@a4effe49ee8ee5b8b5091268c473a4628afb5651 # v1.245.0
|
34
34
|
with:
|
35
35
|
bundler-cache: true
|
36
36
|
ruby-version: ruby
|
37
37
|
|
38
38
|
- name: Publish to RubyGems
|
39
|
-
uses: rubygems/release-gem@
|
39
|
+
uses: rubygems/release-gem@a25424ba2ba8b387abc8ef40807c2c85b96cbe32 # v1.1.1
|
40
40
|
|
41
41
|
- name: Create GitHub release
|
42
42
|
run: |
|
43
43
|
tag_name="$(git describe --tags --abbrev=0)"
|
44
44
|
gh release create "${tag_name}" --verify-tag --generate-notes
|
45
45
|
env:
|
46
|
-
GITHUB_TOKEN: ${{ secrets.
|
46
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
data/.github/workflows/test.yml
CHANGED
@@ -6,7 +6,7 @@ jobs:
|
|
6
6
|
ruby-versions:
|
7
7
|
uses: ruby/actions/.github/workflows/ruby_versions.yml@master
|
8
8
|
with:
|
9
|
-
engine: cruby
|
9
|
+
engine: cruby-jruby
|
10
10
|
min_version: 2.5
|
11
11
|
|
12
12
|
build:
|
@@ -32,3 +32,21 @@ jobs:
|
|
32
32
|
bundler-cache: true
|
33
33
|
- name: Run test
|
34
34
|
run: bundle exec rake test
|
35
|
+
timeout-minutes: 3
|
36
|
+
continue-on-error: ${{ startsWith(matrix.ruby, 'jruby') }}
|
37
|
+
- name: Build package
|
38
|
+
id: build
|
39
|
+
shell: bash
|
40
|
+
run: |
|
41
|
+
if ruby -e 'exit RUBY_VERSION>="3.0."'; then
|
42
|
+
bundle exec rake build
|
43
|
+
set pkg/*.gem
|
44
|
+
echo pkg=$1 >> $GITHUB_OUTPUT
|
45
|
+
fi
|
46
|
+
- name: Install gem
|
47
|
+
run: |
|
48
|
+
gem install ${{ steps.build.outputs.pkg }}
|
49
|
+
ruby -rresolv -e 'puts $LOADED_FEATURES.grep(/resolv/)'
|
50
|
+
ruby -rresolv -e 'puts Resolv::VERSION'
|
51
|
+
if: ${{ steps.build.outputs.pkg }}
|
52
|
+
continue-on-error: ${{ startsWith(matrix.ruby, 'jruby') }}
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -14,15 +14,18 @@ gem 'resolv'
|
|
14
14
|
|
15
15
|
And then execute:
|
16
16
|
|
17
|
-
|
17
|
+
```bash
|
18
|
+
bundle install
|
19
|
+
```
|
18
20
|
|
19
21
|
Or install it yourself as:
|
20
22
|
|
21
|
-
|
23
|
+
```bash
|
24
|
+
gem install resolv
|
25
|
+
```
|
22
26
|
|
23
27
|
## Usage
|
24
28
|
|
25
|
-
|
26
29
|
```ruby
|
27
30
|
p Resolv.getaddress "www.ruby-lang.org"
|
28
31
|
p Resolv.getname "210.251.121.214"
|
@@ -44,4 +47,3 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
44
47
|
## Contributing
|
45
48
|
|
46
49
|
Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/resolv.
|
47
|
-
|
data/Rakefile
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
2
|
require "rake/testtask"
|
3
3
|
|
4
|
+
if RUBY_ENGINE == "ruby"
|
5
|
+
require "ruby-core/extensiontask"
|
6
|
+
helper = Bundler::GemHelper.instance
|
7
|
+
extask = RubyCore::ExtensionTask.new(helper.gemspec)
|
8
|
+
task :test => :compile
|
9
|
+
end
|
10
|
+
|
4
11
|
Rake::TestTask.new(:test) do |t|
|
12
|
+
t.libs.unshift(*extask.libs) if extask
|
5
13
|
t.libs << "test/lib"
|
6
14
|
t.ruby_opts << "-rhelper"
|
7
15
|
t.test_files = FileList["test/**/test_*.rb"]
|
data/ext/win32/resolv/extconf.rb
CHANGED
@@ -0,0 +1,144 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
=begin
|
3
|
+
= Win32 DNS and DHCP I/F
|
4
|
+
|
5
|
+
=end
|
6
|
+
|
7
|
+
module Win32
|
8
|
+
module Resolv
|
9
|
+
def self.get_hosts_path
|
10
|
+
path = get_hosts_dir
|
11
|
+
path = File.expand_path('hosts', path)
|
12
|
+
File.exist?(path) ? path : nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.get_resolv_info
|
16
|
+
search, nameserver = get_info
|
17
|
+
if search.empty?
|
18
|
+
search = nil
|
19
|
+
else
|
20
|
+
search.delete("")
|
21
|
+
search.uniq!
|
22
|
+
end
|
23
|
+
if nameserver.empty?
|
24
|
+
nameserver = nil
|
25
|
+
else
|
26
|
+
nameserver.delete("")
|
27
|
+
nameserver.delete("0.0.0.0")
|
28
|
+
nameserver.uniq!
|
29
|
+
end
|
30
|
+
[ search, nameserver ]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
begin
|
36
|
+
require 'win32/resolv.so'
|
37
|
+
rescue LoadError
|
38
|
+
end
|
39
|
+
|
40
|
+
module Win32
|
41
|
+
#====================================================================
|
42
|
+
# Windows NT
|
43
|
+
#====================================================================
|
44
|
+
module Resolv
|
45
|
+
begin
|
46
|
+
require 'win32/registry'
|
47
|
+
module SZ
|
48
|
+
refine Registry do
|
49
|
+
# ad hoc workaround for broken registry
|
50
|
+
def read_s(key)
|
51
|
+
type, str = read(key)
|
52
|
+
unless type == Registry::REG_SZ
|
53
|
+
warn "Broken registry, #{name}\\#{key} was #{Registry.type2name(type)}, ignored"
|
54
|
+
return String.new
|
55
|
+
end
|
56
|
+
str
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
using SZ
|
61
|
+
rescue LoadError
|
62
|
+
require "open3"
|
63
|
+
end
|
64
|
+
|
65
|
+
TCPIP_NT = 'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters'
|
66
|
+
|
67
|
+
class << self
|
68
|
+
private
|
69
|
+
def get_hosts_dir
|
70
|
+
get_item_property(TCPIP_NT, 'DataBasePath', expand: true)
|
71
|
+
end
|
72
|
+
|
73
|
+
def get_info
|
74
|
+
search = nil
|
75
|
+
nameserver = get_dns_server_list
|
76
|
+
|
77
|
+
slist = get_item_property(TCPIP_NT, 'SearchList')
|
78
|
+
search = slist.split(/,\s*/) unless slist.empty?
|
79
|
+
|
80
|
+
if add_search = search.nil?
|
81
|
+
search = []
|
82
|
+
nvdom = get_item_property(TCPIP_NT, 'NV Domain')
|
83
|
+
|
84
|
+
unless nvdom.empty?
|
85
|
+
@search = [ nvdom ]
|
86
|
+
udmnd = get_item_property(TCPIP_NT, 'UseDomainNameDevolution').to_i
|
87
|
+
if udmnd != 0
|
88
|
+
if /^\w+\./ =~ nvdom
|
89
|
+
devo = $'
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
ifs = if defined?(Win32::Registry)
|
96
|
+
Registry::HKEY_LOCAL_MACHINE.open(TCPIP_NT + '\Interfaces') do |reg|
|
97
|
+
reg.keys
|
98
|
+
rescue Registry::Error
|
99
|
+
[]
|
100
|
+
end
|
101
|
+
else
|
102
|
+
cmd = "Get-ChildItem 'HKLM:\\#{TCPIP_NT}\\Interfaces' | ForEach-Object { $_.PSChildName }"
|
103
|
+
output, _ = Open3.capture2('powershell', '-Command', cmd)
|
104
|
+
output.split(/\n+/)
|
105
|
+
end
|
106
|
+
|
107
|
+
ifs.each do |iface|
|
108
|
+
next unless ns = %w[NameServer DhcpNameServer].find do |key|
|
109
|
+
ns = get_item_property(TCPIP_NT + '\Interfaces' + "\\#{iface}", key)
|
110
|
+
break ns.split(/[,\s]\s*/) unless ns.empty?
|
111
|
+
end
|
112
|
+
|
113
|
+
next if (nameserver & ns).empty?
|
114
|
+
|
115
|
+
if add_search
|
116
|
+
[ 'Domain', 'DhcpDomain' ].each do |key|
|
117
|
+
dom = get_item_property(TCPIP_NT + '\Interfaces' + "\\#{iface}", key)
|
118
|
+
unless dom.empty?
|
119
|
+
search.concat(dom.split(/,\s*/))
|
120
|
+
break
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
search << devo if add_search and devo
|
126
|
+
[ search.uniq, nameserver.uniq ]
|
127
|
+
end
|
128
|
+
|
129
|
+
def get_item_property(path, name, expand: false)
|
130
|
+
if defined?(Win32::Registry)
|
131
|
+
Registry::HKEY_LOCAL_MACHINE.open(path) do |reg|
|
132
|
+
expand ? reg.read_s_expand(name) : reg.read_s(name)
|
133
|
+
rescue Registry::Error
|
134
|
+
""
|
135
|
+
end
|
136
|
+
else
|
137
|
+
cmd = "Get-ItemProperty -Path 'HKLM:\\#{path}' -Name '#{name}' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty '#{name}'"
|
138
|
+
output, _ = Open3.capture2('powershell', '-Command', cmd)
|
139
|
+
output.strip
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
data/ext/win32/resolv/resolv.c
CHANGED
data/lib/resolv.rb
CHANGED
@@ -3,11 +3,7 @@
|
|
3
3
|
require 'socket'
|
4
4
|
require 'timeout'
|
5
5
|
require 'io/wait'
|
6
|
-
|
7
|
-
begin
|
8
|
-
require 'securerandom'
|
9
|
-
rescue LoadError
|
10
|
-
end
|
6
|
+
require 'securerandom'
|
11
7
|
|
12
8
|
# Resolv is a thread-aware DNS resolver library written in Ruby. Resolv can
|
13
9
|
# handle multiple DNS requests concurrently without blocking the entire Ruby
|
@@ -37,7 +33,7 @@ end
|
|
37
33
|
|
38
34
|
class Resolv
|
39
35
|
|
40
|
-
VERSION = "0.
|
36
|
+
VERSION = "0.6.1"
|
41
37
|
|
42
38
|
##
|
43
39
|
# Looks up the first IP address for +name+.
|
@@ -83,9 +79,22 @@ class Resolv
|
|
83
79
|
|
84
80
|
##
|
85
81
|
# Creates a new Resolv using +resolvers+.
|
82
|
+
#
|
83
|
+
# If +resolvers+ is not given, a hash, or +nil+, uses a Hosts resolver and
|
84
|
+
# and a DNS resolver. If +resolvers+ is a hash, uses the hash as
|
85
|
+
# configuration for the DNS resolver.
|
86
86
|
|
87
|
-
def initialize(resolvers=nil, use_ipv6: nil)
|
88
|
-
|
87
|
+
def initialize(resolvers=(arg_not_set = true; nil), use_ipv6: (keyword_not_set = true; nil))
|
88
|
+
if !keyword_not_set && !arg_not_set
|
89
|
+
warn "Support for separate use_ipv6 keyword is deprecated, as it is ignored if an argument is provided. Do not provide a positional argument if using the use_ipv6 keyword argument.", uplevel: 1
|
90
|
+
end
|
91
|
+
|
92
|
+
@resolvers = case resolvers
|
93
|
+
when Hash, nil
|
94
|
+
[Hosts.new, DNS.new(DNS::Config.default_config_hash.merge(resolvers || {}))]
|
95
|
+
else
|
96
|
+
resolvers
|
97
|
+
end
|
89
98
|
end
|
90
99
|
|
91
100
|
##
|
@@ -164,13 +173,16 @@ class Resolv
|
|
164
173
|
|
165
174
|
class ResolvTimeout < Timeout::Error; end
|
166
175
|
|
176
|
+
WINDOWS = /mswin|cygwin|mingw|bccwin/ =~ RUBY_PLATFORM || ::RbConfig::CONFIG['host_os'] =~ /mswin/
|
177
|
+
private_constant :WINDOWS
|
178
|
+
|
167
179
|
##
|
168
180
|
# Resolv::Hosts is a hostname resolver that uses the system hosts file.
|
169
181
|
|
170
182
|
class Hosts
|
171
|
-
if
|
183
|
+
if WINDOWS
|
172
184
|
begin
|
173
|
-
require 'win32/resolv'
|
185
|
+
require 'win32/resolv' unless defined?(Win32::Resolv)
|
174
186
|
DefaultFileName = Win32::Resolv.get_hosts_path || IO::NULL
|
175
187
|
rescue LoadError
|
176
188
|
end
|
@@ -615,16 +627,10 @@ class Resolv
|
|
615
627
|
}
|
616
628
|
end
|
617
629
|
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
rescue NotImplementedError
|
623
|
-
rand(arg)
|
624
|
-
end
|
625
|
-
end
|
626
|
-
else
|
627
|
-
def self.random(arg) # :nodoc:
|
630
|
+
def self.random(arg) # :nodoc:
|
631
|
+
begin
|
632
|
+
SecureRandom.random_number(arg)
|
633
|
+
rescue NotImplementedError
|
628
634
|
rand(arg)
|
629
635
|
end
|
630
636
|
end
|
@@ -656,8 +662,20 @@ class Resolv
|
|
656
662
|
}
|
657
663
|
end
|
658
664
|
|
659
|
-
|
660
|
-
|
665
|
+
case RUBY_PLATFORM
|
666
|
+
when *[
|
667
|
+
# https://www.rfc-editor.org/rfc/rfc6056.txt
|
668
|
+
# Appendix A. Survey of the Algorithms in Use by Some Popular Implementations
|
669
|
+
/freebsd/, /linux/, /netbsd/, /openbsd/, /solaris/,
|
670
|
+
/darwin/, # the same as FreeBSD
|
671
|
+
] then
|
672
|
+
def self.bind_random_port(udpsock, bind_host="0.0.0.0") # :nodoc:
|
673
|
+
udpsock.bind(bind_host, 0)
|
674
|
+
end
|
675
|
+
else
|
676
|
+
# Sequential port assignment
|
677
|
+
def self.bind_random_port(udpsock, bind_host="0.0.0.0") # :nodoc:
|
678
|
+
# Ephemeral port number range recommended by RFC 6056
|
661
679
|
port = random(1024..65535)
|
662
680
|
udpsock.bind(bind_host, port)
|
663
681
|
rescue Errno::EADDRINUSE, # POSIX
|
@@ -980,13 +998,13 @@ class Resolv
|
|
980
998
|
next unless keyword
|
981
999
|
case keyword
|
982
1000
|
when 'nameserver'
|
983
|
-
nameserver.concat(args)
|
1001
|
+
nameserver.concat(args.each(&:freeze))
|
984
1002
|
when 'domain'
|
985
1003
|
next if args.empty?
|
986
|
-
search = [args[0]]
|
1004
|
+
search = [args[0].freeze]
|
987
1005
|
when 'search'
|
988
1006
|
next if args.empty?
|
989
|
-
search = args
|
1007
|
+
search = args.each(&:freeze)
|
990
1008
|
when 'options'
|
991
1009
|
args.each {|arg|
|
992
1010
|
case arg
|
@@ -997,22 +1015,22 @@ class Resolv
|
|
997
1015
|
end
|
998
1016
|
}
|
999
1017
|
}
|
1000
|
-
return { :nameserver => nameserver, :search => search, :ndots => ndots }
|
1018
|
+
return { :nameserver => nameserver.freeze, :search => search.freeze, :ndots => ndots.freeze }.freeze
|
1001
1019
|
end
|
1002
1020
|
|
1003
1021
|
def Config.default_config_hash(filename="/etc/resolv.conf")
|
1004
1022
|
if File.exist? filename
|
1005
|
-
|
1023
|
+
Config.parse_resolv_conf(filename)
|
1024
|
+
elsif WINDOWS
|
1025
|
+
require 'win32/resolv' unless defined?(Win32::Resolv)
|
1026
|
+
search, nameserver = Win32::Resolv.get_resolv_info
|
1027
|
+
config_hash = {}
|
1028
|
+
config_hash[:nameserver] = nameserver if nameserver
|
1029
|
+
config_hash[:search] = [search].flatten if search
|
1030
|
+
config_hash
|
1006
1031
|
else
|
1007
|
-
|
1008
|
-
require 'win32/resolv'
|
1009
|
-
search, nameserver = Win32::Resolv.get_resolv_info
|
1010
|
-
config_hash = {}
|
1011
|
-
config_hash[:nameserver] = nameserver if nameserver
|
1012
|
-
config_hash[:search] = [search].flatten if search
|
1013
|
-
end
|
1032
|
+
{}
|
1014
1033
|
end
|
1015
|
-
config_hash || {}
|
1016
1034
|
end
|
1017
1035
|
|
1018
1036
|
def lazy_initialize
|
@@ -2107,7 +2125,14 @@ class Resolv
|
|
2107
2125
|
|
2108
2126
|
attr_reader :ttl
|
2109
2127
|
|
2110
|
-
ClassHash =
|
2128
|
+
ClassHash = Module.new do
|
2129
|
+
module_function
|
2130
|
+
|
2131
|
+
def []=(type_class_value, klass)
|
2132
|
+
type_value, class_value = type_class_value
|
2133
|
+
Resource.const_set(:"Type#{type_value}_Class#{class_value}", klass)
|
2134
|
+
end
|
2135
|
+
end
|
2111
2136
|
|
2112
2137
|
def encode_rdata(msg) # :nodoc:
|
2113
2138
|
raise NotImplementedError.new
|
@@ -2145,7 +2170,9 @@ class Resolv
|
|
2145
2170
|
end
|
2146
2171
|
|
2147
2172
|
def self.get_class(type_value, class_value) # :nodoc:
|
2148
|
-
|
2173
|
+
cache = :"Type#{type_value}_Class#{class_value}"
|
2174
|
+
|
2175
|
+
return (const_defined?(cache) && const_get(cache)) ||
|
2149
2176
|
Generic.create(type_value, class_value)
|
2150
2177
|
end
|
2151
2178
|
|
@@ -2574,7 +2601,7 @@ class Resolv
|
|
2574
2601
|
end
|
2575
2602
|
|
2576
2603
|
##
|
2577
|
-
# Flags for this
|
2604
|
+
# Flags for this property:
|
2578
2605
|
# - Bit 0 : 0 = not critical, 1 = critical
|
2579
2606
|
|
2580
2607
|
attr_reader :flags
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resolv
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tanaka Akira
|
8
|
-
autorequire:
|
9
8
|
bindir: exe
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
12
11
|
dependencies: []
|
13
12
|
description: Thread-aware DNS resolver library in Ruby.
|
14
13
|
email:
|
@@ -31,7 +30,7 @@ files:
|
|
31
30
|
- bin/console
|
32
31
|
- bin/setup
|
33
32
|
- ext/win32/resolv/extconf.rb
|
34
|
-
- ext/win32/resolv/lib/
|
33
|
+
- ext/win32/resolv/lib/resolv.rb
|
35
34
|
- ext/win32/resolv/resolv.c
|
36
35
|
- lib/resolv.rb
|
37
36
|
- resolv.gemspec
|
@@ -42,7 +41,6 @@ licenses:
|
|
42
41
|
metadata:
|
43
42
|
homepage_uri: https://github.com/ruby/resolv
|
44
43
|
source_code_uri: https://github.com/ruby/resolv
|
45
|
-
post_install_message:
|
46
44
|
rdoc_options: []
|
47
45
|
require_paths:
|
48
46
|
- lib
|
@@ -57,8 +55,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
57
55
|
- !ruby/object:Gem::Version
|
58
56
|
version: '0'
|
59
57
|
requirements: []
|
60
|
-
rubygems_version: 3.
|
61
|
-
signing_key:
|
58
|
+
rubygems_version: 3.6.7
|
62
59
|
specification_version: 4
|
63
60
|
summary: Thread-aware DNS resolver library in Ruby.
|
64
61
|
test_files: []
|
@@ -1,135 +0,0 @@
|
|
1
|
-
# frozen_string_literal: false
|
2
|
-
=begin
|
3
|
-
= Win32 DNS and DHCP I/F
|
4
|
-
|
5
|
-
=end
|
6
|
-
|
7
|
-
require 'win32/registry'
|
8
|
-
|
9
|
-
module Win32
|
10
|
-
module Resolv
|
11
|
-
API = Registry::API
|
12
|
-
Error = Registry::Error
|
13
|
-
|
14
|
-
def self.get_hosts_path
|
15
|
-
path = get_hosts_dir
|
16
|
-
path = File.expand_path('hosts', path)
|
17
|
-
File.exist?(path) ? path : nil
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.get_resolv_info
|
21
|
-
search, nameserver = get_info
|
22
|
-
if search.empty?
|
23
|
-
search = nil
|
24
|
-
else
|
25
|
-
search.delete("")
|
26
|
-
search.uniq!
|
27
|
-
end
|
28
|
-
if nameserver.empty?
|
29
|
-
nameserver = nil
|
30
|
-
else
|
31
|
-
nameserver.delete("")
|
32
|
-
nameserver.delete("0.0.0.0")
|
33
|
-
nameserver.uniq!
|
34
|
-
end
|
35
|
-
[ search, nameserver ]
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
begin
|
41
|
-
require 'win32/resolv.so'
|
42
|
-
rescue LoadError
|
43
|
-
end
|
44
|
-
|
45
|
-
module Win32
|
46
|
-
#====================================================================
|
47
|
-
# Windows NT
|
48
|
-
#====================================================================
|
49
|
-
module Resolv
|
50
|
-
module SZ
|
51
|
-
refine Registry do
|
52
|
-
# ad hoc workaround for broken registry
|
53
|
-
def read_s(key)
|
54
|
-
type, str = read(key)
|
55
|
-
unless type == Registry::REG_SZ
|
56
|
-
warn "Broken registry, #{name}\\#{key} was #{Registry.type2name(type)}, ignored"
|
57
|
-
return String.new
|
58
|
-
end
|
59
|
-
str
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
using SZ
|
64
|
-
|
65
|
-
TCPIP_NT = 'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters'
|
66
|
-
|
67
|
-
class << self
|
68
|
-
private
|
69
|
-
def get_hosts_dir
|
70
|
-
Registry::HKEY_LOCAL_MACHINE.open(TCPIP_NT) do |reg|
|
71
|
-
reg.read_s_expand('DataBasePath')
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def get_info
|
76
|
-
search = nil
|
77
|
-
nameserver = get_dns_server_list
|
78
|
-
Registry::HKEY_LOCAL_MACHINE.open(TCPIP_NT) do |reg|
|
79
|
-
begin
|
80
|
-
slist = reg.read_s('SearchList')
|
81
|
-
search = slist.split(/,\s*/) unless slist.empty?
|
82
|
-
rescue Registry::Error
|
83
|
-
end
|
84
|
-
|
85
|
-
if add_search = search.nil?
|
86
|
-
search = []
|
87
|
-
begin
|
88
|
-
nvdom = reg.read_s('NV Domain')
|
89
|
-
unless nvdom.empty?
|
90
|
-
@search = [ nvdom ]
|
91
|
-
if reg.read_i('UseDomainNameDevolution') != 0
|
92
|
-
if /^\w+\./ =~ nvdom
|
93
|
-
devo = $'
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
rescue Registry::Error
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
reg.open('Interfaces') do |h|
|
102
|
-
h.each_key do |iface, |
|
103
|
-
h.open(iface) do |regif|
|
104
|
-
next unless ns = %w[NameServer DhcpNameServer].find do |key|
|
105
|
-
begin
|
106
|
-
ns = regif.read_s(key)
|
107
|
-
rescue Registry::Error
|
108
|
-
else
|
109
|
-
break ns.split(/[,\s]\s*/) unless ns.empty?
|
110
|
-
end
|
111
|
-
end
|
112
|
-
next if (nameserver & ns).empty?
|
113
|
-
|
114
|
-
if add_search
|
115
|
-
begin
|
116
|
-
[ 'Domain', 'DhcpDomain' ].each do |key|
|
117
|
-
dom = regif.read_s(key)
|
118
|
-
unless dom.empty?
|
119
|
-
search.concat(dom.split(/,\s*/))
|
120
|
-
break
|
121
|
-
end
|
122
|
-
end
|
123
|
-
rescue Registry::Error
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
search << devo if add_search and devo
|
130
|
-
end
|
131
|
-
[ search.uniq, nameserver.uniq ]
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|