@@ -14,117 +14,117 @@ module Async::DNS
14
14
module System
15
15
RESOLV_CONF = "/etc/resolv.conf"
16
16
HOSTS = "/etc/hosts"
17
-
17
+
18
18
def self . hosts_path
19
19
if RUBY_PLATFORM =~ /mswin32|mingw|bccwin/
20
20
Win32 ::Resolv . get_hosts_path
21
21
else
22
22
HOSTS
23
23
end
24
24
end
25
-
25
+
26
26
# This code is very experimental
27
27
class Hosts
28
28
def initialize
29
29
@addresses = { }
30
30
@names = { }
31
31
end
32
-
32
+
33
33
attr :addresses
34
34
attr :names
35
-
35
+
36
36
# This is used to match names against the list of known hosts:
37
37
def call ( name )
38
38
@names . include? ( name )
39
39
end
40
-
40
+
41
41
def lookup ( name )
42
42
addresses = @names [ name ]
43
-
43
+
44
44
if addresses
45
45
addresses . last
46
46
else
47
47
nil
48
48
end
49
49
end
50
-
50
+
51
51
alias [] lookup
52
-
52
+
53
53
def add ( address , names )
54
54
@addresses [ address ] ||= [ ]
55
55
@addresses [ address ] += names
56
-
56
+
57
57
names . each do |name |
58
58
@names [ name ] ||= [ ]
59
59
@names [ name ] << address
60
60
end
61
61
end
62
-
62
+
63
63
def parse_hosts ( io )
64
64
io . each do |line |
65
65
line . sub! ( /#.*/ , '' )
66
66
address , hostname , *aliases = line . split ( /\s +/ )
67
-
67
+
68
68
add ( address , [ hostname ] + aliases )
69
69
end
70
70
end
71
-
71
+
72
72
def self . local
73
73
hosts = self . new
74
-
74
+
75
75
path = System ::hosts_path
76
-
76
+
77
77
if path and File . exist? ( path )
78
78
File . open ( path ) do |file |
79
79
hosts . parse_hosts ( file )
80
80
end
81
81
end
82
-
82
+
83
83
return hosts
84
84
end
85
85
end
86
-
86
+
87
87
def self . parse_resolv_configuration ( path )
88
88
nameservers = [ ]
89
89
File . open ( path ) do |file |
90
90
file . each do |line |
91
91
# Remove any comments:
92
92
line . sub! ( /[#;].*/ , '' )
93
-
93
+
94
94
# Extract resolv.conf command:
95
95
keyword , *args = line . split ( /\s +/ )
96
-
96
+
97
97
case keyword
98
98
when 'nameserver'
99
99
nameservers += args
100
100
end
101
101
end
102
102
end
103
-
103
+
104
104
return nameservers
105
105
end
106
-
106
+
107
107
def self . standard_connections ( nameservers , **options )
108
108
connections = [ ]
109
-
109
+
110
110
nameservers . each do |host |
111
111
connections << IO ::Endpoint . udp ( host , 53 , **options )
112
112
connections << IO ::Endpoint . tcp ( host , 53 , **options )
113
113
end
114
-
114
+
115
115
return IO ::Endpoint . composite ( connections )
116
116
end
117
-
117
+
118
118
# Get a list of standard nameserver connections which can be used for querying any standard servers that the system has been configured with. There is no equivalent facility to use the `hosts` file at present.
119
119
def self . nameservers ( **options )
120
120
nameservers = [ ]
121
-
121
+
122
122
if File . exist? RESOLV_CONF
123
123
nameservers = parse_resolv_configuration ( RESOLV_CONF )
124
124
elsif defined? ( Win32 ::Resolv ) and RUBY_PLATFORM =~ /mswin32|cygwin|mingw|bccwin/
125
125
search , nameservers = Win32 ::Resolv . get_resolv_info
126
126
end
127
-
127
+
128
128
return standard_connections ( nameservers , **options )
129
129
end
130
130
0 commit comments