ronin-support 0.4.0.rc2 → 0.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.
- data/ChangeLog.md +6 -4
- data/README.md +1 -0
- data/lib/ronin/extensions/regexp.rb +31 -12
- data/lib/ronin/fuzzing/fuzzing.rb +164 -2
- data/lib/ronin/network.rb +1 -0
- data/lib/ronin/network/dns.rb +161 -0
- data/lib/ronin/network/http/http.rb +35 -0
- data/lib/ronin/network/mixins.rb +1 -0
- data/lib/ronin/network/mixins/dns.rb +55 -0
- data/lib/ronin/network/mixins/http.rb +35 -0
- data/lib/ronin/support/support.rb +1 -0
- data/lib/ronin/support/version.rb +1 -1
- data/spec/extensions/ip_addr_spec.rb +3 -3
- data/spec/extensions/regexp_spec.rb +385 -1
- data/spec/network/dns_spec.rb +137 -0
- data/spec/wordlist_spec.rb +1 -1
- metadata +26 -22
data/ChangeLog.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
### 0.4.0 / 2012-
|
1
|
+
### 0.4.0 / 2012-02-12
|
2
2
|
|
3
3
|
* Require uri-query_params ~> 0.6.
|
4
4
|
* Require parameters ~> 0.4.
|
@@ -9,13 +9,13 @@
|
|
9
9
|
* Added {Regexp::FILE_NAME}.
|
10
10
|
* Added {Regexp::FILE}.
|
11
11
|
* Added {Regexp::DIRECTORY}.
|
12
|
-
* Added {Regexp::
|
12
|
+
* Added {Regexp::RELATIVE_UNIX_PATH}.
|
13
13
|
* Added {Regexp::ABSOLUTE_UNIX_PATH}.
|
14
14
|
* Added {Regexp::UNIX_PATH}.
|
15
|
-
* Added {Regexp::
|
15
|
+
* Added {Regexp::RELATIVE_WINDOWS_PATH}.
|
16
16
|
* Added {Regexp::ABSOLUTE_WINDOWS_PATH}.
|
17
17
|
* Added {Regexp::WINDOWS_PATH}.
|
18
|
-
* Added {Regexp::
|
18
|
+
* Added {Regexp::RELATIVE_PATH}.
|
19
19
|
* Added {Regexp::ABSOLUTE_PATH}.
|
20
20
|
* Added {Regexp::PATH}.
|
21
21
|
* Added {String#repeating}.
|
@@ -41,7 +41,9 @@
|
|
41
41
|
* Added {Ronin::Fuzzing.sint32}.
|
42
42
|
* Added {Ronin::Fuzzing.sint64}.
|
43
43
|
* Added {Ronin::Wordlist}.
|
44
|
+
* Added {Ronin::Network::DNS}.
|
44
45
|
* Added {Ronin::Network::Mixins::Mixin}.
|
46
|
+
* Added {Ronin::Network::Mixins::DNS}.
|
45
47
|
* Added {Ronin::Network::Mixins::SSL}.
|
46
48
|
* Added missing {Ronin::Network::UDP#udp_send} and
|
47
49
|
{Ronin::Network::Mixins::UDP#udp_send} methods.
|
data/README.md
CHANGED
@@ -28,10 +28,29 @@ class Regexp
|
|
28
28
|
MAC = /[0-9a-fA-F]{2}(?::[0-9a-fA-F]{2}){5}/
|
29
29
|
|
30
30
|
# A regular expression for matching IPv4 Addresses.
|
31
|
-
IPv4 = /#{OCTET}(?:\.#{OCTET}){3}
|
31
|
+
IPv4 = /#{OCTET}(?:\.#{OCTET}){3}(?:\/\d{1,2})?/
|
32
32
|
|
33
33
|
# A regular expression for matching IPv6 Addresses.
|
34
|
-
IPv6 =
|
34
|
+
IPv6 = union(
|
35
|
+
/(?:[0-9a-f]{1,4}:){6}#{IPv4}/,
|
36
|
+
/(?:[0-9a-f]{1,4}:){5}[0-9a-f]{1,4}:#{IPv4}/,
|
37
|
+
/(?:[0-9a-f]{1,4}:){5}:[0-9a-f]{1,4}:#{IPv4}/,
|
38
|
+
/(?:[0-9a-f]{1,4}:){1,1}(?::[0-9a-f]{1,4}){1,4}:#{IPv4}/,
|
39
|
+
/(?:[0-9a-f]{1,4}:){1,2}(?::[0-9a-f]{1,4}){1,3}:#{IPv4}/,
|
40
|
+
/(?:[0-9a-f]{1,4}:){1,3}(?::[0-9a-f]{1,4}){1,2}:#{IPv4}/,
|
41
|
+
/(?:[0-9a-f]{1,4}:){1,4}(?::[0-9a-f]{1,4}){1,1}:#{IPv4}/,
|
42
|
+
/:(?::[0-9a-f]{1,4}){1,5}:#{IPv4}/,
|
43
|
+
/(?:(?:[0-9a-f]{1,4}:){1,5}|:):#{IPv4}/,
|
44
|
+
/(?:[0-9a-f]{1,4}:){1,1}(?::[0-9a-f]{1,4}){1,6}(?:\/\d{1,3})?/,
|
45
|
+
/(?:[0-9a-f]{1,4}:){1,2}(?::[0-9a-f]{1,4}){1,5}(?:\/\d{1,3})?/,
|
46
|
+
/(?:[0-9a-f]{1,4}:){1,3}(?::[0-9a-f]{1,4}){1,4}(?:\/\d{1,3})?/,
|
47
|
+
/(?:[0-9a-f]{1,4}:){1,4}(?::[0-9a-f]{1,4}){1,3}(?:\/\d{1,3})?/,
|
48
|
+
/(?:[0-9a-f]{1,4}:){1,5}(?::[0-9a-f]{1,4}){1,2}(?:\/\d{1,3})?/,
|
49
|
+
/(?:[0-9a-f]{1,4}:){1,6}(?::[0-9a-f]{1,4}){1,1}(?:\/\d{1,3})?/,
|
50
|
+
/[0-9a-f]{1,4}(?::[0-9a-f]{1,4}){7}(?:\/\d{1,3})?/,
|
51
|
+
/:(?::[0-9a-f]{1,4}){1,7}(?:\/\d{1,3})?/,
|
52
|
+
/(?:(?:[0-9a-f]{1,4}:){1,7}|:):(?:\/\d{1,3})?/
|
53
|
+
)
|
35
54
|
|
36
55
|
# A regular expression for matching IP Addresses.
|
37
56
|
IP = /#{IPv4}|#{IPv6}/
|
@@ -40,19 +59,19 @@ class Regexp
|
|
40
59
|
HOST_NAME = /(?:[a-zA-Z0-9]+(?:[_-][a-zA-Z0-9]+)*\.)+(?:#{union(Resolv::TLDS)})/i
|
41
60
|
|
42
61
|
# Regular expression to match a word in the username of an email address
|
43
|
-
USER_NAME = /[A-Za-z](?:[A-Za-z0-9]
|
62
|
+
USER_NAME = /[A-Za-z](?:[A-Za-z0-9]*[\._-])*[A-Za-z0-9]+/
|
44
63
|
|
45
64
|
# Regular expression to find email addresses in text
|
46
|
-
EMAIL_ADDR = /#{USER_NAME}
|
65
|
+
EMAIL_ADDR = /#{USER_NAME}\@#{HOST_NAME}/
|
47
66
|
|
48
67
|
# Regular expression to find deliminators in text
|
49
68
|
DELIM = /[;&\n\r]/
|
50
69
|
|
51
70
|
# Regular expression to find identifier in text
|
52
|
-
IDENTIFIER = /[
|
71
|
+
IDENTIFIER = /[_]*[a-zA-Z]+[a-zA-Z0-9_-]*/
|
53
72
|
|
54
73
|
# Regular expression to find File extensions in text
|
55
|
-
FILE_EXT = /(?:\.[A-Za-z0-
|
74
|
+
FILE_EXT = /(?:\.[A-Za-z0-9]+)+/
|
56
75
|
|
57
76
|
# Regular expression to find File names in text
|
58
77
|
FILE_NAME = /(?:[^\/\\\. ]|\\[\/\\ ])+/
|
@@ -64,25 +83,25 @@ class Regexp
|
|
64
83
|
DIRECTORY = /(?:\.\.|\.|#{FILE})/
|
65
84
|
|
66
85
|
# Regular expression to find local UNIX Paths in text
|
67
|
-
|
86
|
+
RELATIVE_UNIX_PATH = /(?:#{DIRECTORY}\/)+#{DIRECTORY}\/?/
|
68
87
|
|
69
88
|
# Regular expression to find absolute UNIX Paths in text
|
70
89
|
ABSOLUTE_UNIX_PATH = /(?:\/#{FILE})+\/?/
|
71
90
|
|
72
91
|
# Regular expression to find UNIX Paths in text
|
73
|
-
UNIX_PATH = /#{ABSOLUTE_UNIX_PATH}|#{
|
92
|
+
UNIX_PATH = /#{ABSOLUTE_UNIX_PATH}|#{RELATIVE_UNIX_PATH}/
|
74
93
|
|
75
94
|
# Regular expression to find local Windows Paths in text
|
76
|
-
|
95
|
+
RELATIVE_WINDOWS_PATH = /(?:#{DIRECTORY}\\)+#{DIRECTORY}\\?/
|
77
96
|
|
78
97
|
# Regular expression to find absolute Windows Paths in text
|
79
|
-
ABSOLUTE_WINDOWS_PATH = /[A-Za-z]:(?:\\#{
|
98
|
+
ABSOLUTE_WINDOWS_PATH = /[A-Za-z]:(?:\\#{FILE})+\\?/
|
80
99
|
|
81
100
|
# Regular expression to find Windows Paths in text
|
82
|
-
WINDOWS_PATH = /#{ABSOLUTE_WINDOWS_PATH}|#{
|
101
|
+
WINDOWS_PATH = /#{ABSOLUTE_WINDOWS_PATH}|#{RELATIVE_WINDOWS_PATH}/
|
83
102
|
|
84
103
|
# Regular expression to find local Paths in text
|
85
|
-
|
104
|
+
RELATIVE_PATH = /#{RELATIVE_UNIX_PATH}|#{RELATIVE_WINDOWS_PATH}/
|
86
105
|
|
87
106
|
# Regular expression to find absolute Paths in text
|
88
107
|
ABSOLUTE_PATH = /#{ABSOLUTE_UNIX_PATH}|#{ABSOLUTE_WINDOWS_PATH}/
|
@@ -20,9 +20,18 @@
|
|
20
20
|
require 'set'
|
21
21
|
|
22
22
|
module Ronin
|
23
|
+
#
|
24
|
+
# Contains class-methods which generate malicious data for fuzzing.
|
25
|
+
#
|
26
|
+
# @see Fuzzing.[]
|
27
|
+
#
|
28
|
+
# @since 0.4.0
|
29
|
+
#
|
23
30
|
module Fuzzing
|
31
|
+
# Short String lengths
|
24
32
|
SHORT_LENGTHS = SortedSet[1, 100, 500, 1_000, 10_000]
|
25
33
|
|
34
|
+
# Long String lengths
|
26
35
|
LONG_LENGTHS = SortedSet[
|
27
36
|
128, 255, 256, 257, 511, 512, 513, 1023, 1024, 2048, 2049, 4095,
|
28
37
|
4096, 4097, 5_000, 10_000, 20_000, 32762, 32763, 32764, 32765, 32766,
|
@@ -51,14 +60,23 @@ module Ronin
|
|
51
60
|
#
|
52
61
|
# @api semipublic
|
53
62
|
#
|
54
|
-
# @since 0.4.0
|
55
|
-
#
|
56
63
|
def self.[](name)
|
57
64
|
if (!Object.respond_to?(name) && respond_to?(name))
|
58
65
|
enum_for(name)
|
59
66
|
end
|
60
67
|
end
|
61
68
|
|
69
|
+
#
|
70
|
+
# Various bad-strings.
|
71
|
+
#
|
72
|
+
# @yield [string]
|
73
|
+
# The given block will be passed each bad-string.
|
74
|
+
#
|
75
|
+
# @yieldparam [String] string
|
76
|
+
# A bad-string containing known control characters, deliminators
|
77
|
+
# or null-bytes (see {NULL_BYTES}), of varying length
|
78
|
+
# (see {SHORT_LENGTHS} and {LONG_LENGTHS}).
|
79
|
+
#
|
62
80
|
def self.bad_strings(&block)
|
63
81
|
yield ''
|
64
82
|
|
@@ -91,6 +109,15 @@ module Ronin
|
|
91
109
|
yield "<>" * 500
|
92
110
|
end
|
93
111
|
|
112
|
+
#
|
113
|
+
# Various format-strings.
|
114
|
+
#
|
115
|
+
# @yield [fmt_string]
|
116
|
+
# The given block will be passed each format-string.
|
117
|
+
#
|
118
|
+
# @yieldparam [String] fmt_string
|
119
|
+
# A format-string containing format operators (see {FORMAT_STRINGS}).
|
120
|
+
#
|
94
121
|
def self.format_strings(&block)
|
95
122
|
FORMAT_STRINGS.each do |fmt|
|
96
123
|
yield fmt
|
@@ -100,6 +127,15 @@ module Ronin
|
|
100
127
|
end
|
101
128
|
end
|
102
129
|
|
130
|
+
#
|
131
|
+
# Various bad paths and directory traversals.
|
132
|
+
#
|
133
|
+
# @yield [path]
|
134
|
+
# The given block will be passed each path.
|
135
|
+
#
|
136
|
+
# @yieldparam [String] path
|
137
|
+
# A known bad path.
|
138
|
+
#
|
103
139
|
def self.bad_paths(&block)
|
104
140
|
padding = 'A' * 5_000
|
105
141
|
|
@@ -121,6 +157,15 @@ module Ronin
|
|
121
157
|
end
|
122
158
|
end
|
123
159
|
|
160
|
+
#
|
161
|
+
# The range of bit-fields.
|
162
|
+
#
|
163
|
+
# @yield [bitfield]
|
164
|
+
# The given block will be passed each bit-field.
|
165
|
+
#
|
166
|
+
# @yieldparam [String] bitfield
|
167
|
+
# A bit-field (8bit - 64bit).
|
168
|
+
#
|
124
169
|
def self.bit_fields(&block)
|
125
170
|
("\x00".."\xff").each do |c|
|
126
171
|
yield c
|
@@ -130,6 +175,15 @@ module Ronin
|
|
130
175
|
end
|
131
176
|
end
|
132
177
|
|
178
|
+
#
|
179
|
+
# The range of signed bit-fields.
|
180
|
+
#
|
181
|
+
# @yield [bitfield]
|
182
|
+
# The given block will be passed each bit-field.
|
183
|
+
#
|
184
|
+
# @yieldparam [String] bitfield
|
185
|
+
# A signed bit-field (8bit - 64bit).
|
186
|
+
#
|
133
187
|
def self.signed_bit_fields(&block)
|
134
188
|
("\x80".."\xff").each do |c|
|
135
189
|
yield c
|
@@ -139,50 +193,158 @@ module Ronin
|
|
139
193
|
end
|
140
194
|
end
|
141
195
|
|
196
|
+
#
|
197
|
+
# The range of unsigned 8bit integers.
|
198
|
+
#
|
199
|
+
# @yield [int]
|
200
|
+
# The given block will be passed each integer.
|
201
|
+
#
|
202
|
+
# @yieldparam [String] int
|
203
|
+
# A unsigned 8bit integer.
|
204
|
+
#
|
142
205
|
def self.uint8(&block)
|
143
206
|
("\x00".."\xff").each(&block)
|
144
207
|
end
|
145
208
|
|
209
|
+
#
|
210
|
+
# The range of unsigned 16bit integers.
|
211
|
+
#
|
212
|
+
# @yield [int]
|
213
|
+
# The given block will be passed each integer.
|
214
|
+
#
|
215
|
+
# @yieldparam [String] int
|
216
|
+
# A unsigned 16bit integer.
|
217
|
+
#
|
146
218
|
def self.uint16
|
147
219
|
uint8 { |c| yield c * 2 }
|
148
220
|
end
|
149
221
|
|
222
|
+
#
|
223
|
+
# The range of unsigned 32bit integers.
|
224
|
+
#
|
225
|
+
# @yield [int]
|
226
|
+
# The given block will be passed each integer.
|
227
|
+
#
|
228
|
+
# @yieldparam [String] int
|
229
|
+
# A unsigned 32bit integer.
|
230
|
+
#
|
150
231
|
def self.uint32
|
151
232
|
uint8 { |c| yield c * 4 }
|
152
233
|
end
|
153
234
|
|
235
|
+
#
|
236
|
+
# The range of unsigned 64bit integers.
|
237
|
+
#
|
238
|
+
# @yield [int]
|
239
|
+
# The given block will be passed each integer.
|
240
|
+
#
|
241
|
+
# @yieldparam [String] int
|
242
|
+
# A unsigned 64bit integer.
|
243
|
+
#
|
154
244
|
def self.uint64
|
155
245
|
uint8 { |c| yield c * 8 }
|
156
246
|
end
|
157
247
|
|
248
|
+
#
|
249
|
+
# The range of signed 8bit integers.
|
250
|
+
#
|
251
|
+
# @yield [int]
|
252
|
+
# The given block will be passed each integer.
|
253
|
+
#
|
254
|
+
# @yieldparam [String] int
|
255
|
+
# A signed 8bit integer.
|
256
|
+
#
|
158
257
|
def self.int8(&block)
|
159
258
|
("\x00".."\x70").each(&block)
|
160
259
|
end
|
161
260
|
|
261
|
+
#
|
262
|
+
# The range of signed 16bit integers.
|
263
|
+
#
|
264
|
+
# @yield [int]
|
265
|
+
# The given block will be passed each integer.
|
266
|
+
#
|
267
|
+
# @yieldparam [String] int
|
268
|
+
# A signed 16bit integer.
|
269
|
+
#
|
162
270
|
def self.int16
|
163
271
|
int8 { |c| yield c * 2 }
|
164
272
|
end
|
165
273
|
|
274
|
+
#
|
275
|
+
# The range of signed 32bit integers.
|
276
|
+
#
|
277
|
+
# @yield [int]
|
278
|
+
# The given block will be passed each integer.
|
279
|
+
#
|
280
|
+
# @yieldparam [String] int
|
281
|
+
# A signed 32bit integer.
|
282
|
+
#
|
166
283
|
def self.int32
|
167
284
|
int8 { |c| yield c * 4 }
|
168
285
|
end
|
169
286
|
|
287
|
+
#
|
288
|
+
# The range of signed 64bit integers.
|
289
|
+
#
|
290
|
+
# @yield [int]
|
291
|
+
# The given block will be passed each integer.
|
292
|
+
#
|
293
|
+
# @yieldparam [String] int
|
294
|
+
# A signed 64bit integer.
|
295
|
+
#
|
170
296
|
def self.int64
|
171
297
|
int8 { |c| yield c * 8 }
|
172
298
|
end
|
173
299
|
|
300
|
+
#
|
301
|
+
# The range of negative-signed 8bit integers.
|
302
|
+
#
|
303
|
+
# @yield [int]
|
304
|
+
# The given block will be passed each integer.
|
305
|
+
#
|
306
|
+
# @yieldparam [String] int
|
307
|
+
# A negative-signed 8bit integer.
|
308
|
+
#
|
174
309
|
def self.sint8(&block)
|
175
310
|
("\x80".."\xff").each(&block)
|
176
311
|
end
|
177
312
|
|
313
|
+
#
|
314
|
+
# The range of negative-signed 16bit integers.
|
315
|
+
#
|
316
|
+
# @yield [int]
|
317
|
+
# The given block will be passed each integer.
|
318
|
+
#
|
319
|
+
# @yieldparam [String] int
|
320
|
+
# A negative-signed 16bit integer.
|
321
|
+
#
|
178
322
|
def self.sint16
|
179
323
|
sint8 { |c| yield c * 2 }
|
180
324
|
end
|
181
325
|
|
326
|
+
#
|
327
|
+
# The range of negative-signed 32bit integers.
|
328
|
+
#
|
329
|
+
# @yield [int]
|
330
|
+
# The given block will be passed each integer.
|
331
|
+
#
|
332
|
+
# @yieldparam [String] int
|
333
|
+
# A negative-signed 32bit integer.
|
334
|
+
#
|
182
335
|
def self.sint32
|
183
336
|
sint8 { |c| yield c * 4 }
|
184
337
|
end
|
185
338
|
|
339
|
+
#
|
340
|
+
# The range of negative-signed 64bit integers.
|
341
|
+
#
|
342
|
+
# @yield [int]
|
343
|
+
# The given block will be passed each integer.
|
344
|
+
#
|
345
|
+
# @yieldparam [String] int
|
346
|
+
# A negative-signed 64bit integer.
|
347
|
+
#
|
186
348
|
def self.sint64
|
187
349
|
sint8 { |c| yield c * 8 }
|
188
350
|
end
|
data/lib/ronin/network.rb
CHANGED
@@ -0,0 +1,161 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2006-2012 Hal Brodigan (postmodern.mod3 at gmail.com)
|
3
|
+
#
|
4
|
+
# This file is part of Ronin Support.
|
5
|
+
#
|
6
|
+
# Ronin Support is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Lesser General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Ronin Support is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Lesser General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public License
|
17
|
+
# along with Ronin Support. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#
|
19
|
+
|
20
|
+
require 'resolv'
|
21
|
+
|
22
|
+
module Ronin
|
23
|
+
module Network
|
24
|
+
#
|
25
|
+
# Provides helper methods for performing DNS queries.
|
26
|
+
#
|
27
|
+
# @since 0.4.0
|
28
|
+
#
|
29
|
+
module DNS
|
30
|
+
#
|
31
|
+
# The DNS nameserver to query.
|
32
|
+
#
|
33
|
+
# @return [String, nil]
|
34
|
+
# The address of the nameserver.
|
35
|
+
#
|
36
|
+
# @api public
|
37
|
+
#
|
38
|
+
def self.nameserver
|
39
|
+
@nameserver
|
40
|
+
end
|
41
|
+
|
42
|
+
#
|
43
|
+
# Sets the DNS nameserver to be queried.
|
44
|
+
#
|
45
|
+
# @param [IPAddr, String, nil]
|
46
|
+
# The address of the nameserver.
|
47
|
+
#
|
48
|
+
# @return [String, nil]
|
49
|
+
# The address of the new nameserver.
|
50
|
+
#
|
51
|
+
# @api public
|
52
|
+
#
|
53
|
+
def self.nameserver=(address)
|
54
|
+
@nameserver = if address
|
55
|
+
address.to_s
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
#
|
60
|
+
# Creates a DNS Resolver for the nameserver.
|
61
|
+
#
|
62
|
+
# @param [String, nil] nameserver
|
63
|
+
# Optional DNS nameserver to query.
|
64
|
+
#
|
65
|
+
# @return [Resolv, Resolv::DNS]
|
66
|
+
# The DNS Resolver.
|
67
|
+
#
|
68
|
+
# @api public
|
69
|
+
#
|
70
|
+
def dns_resolver(nameserver=DNS.nameserver)
|
71
|
+
if nameserver
|
72
|
+
Resolv::DNS.new(:nameserver => nameserver)
|
73
|
+
else
|
74
|
+
Resolv
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
#
|
79
|
+
# Looks up the address of a hostname.
|
80
|
+
#
|
81
|
+
# @param [String] hostname
|
82
|
+
# The hostname to lookup.
|
83
|
+
#
|
84
|
+
# @param [String, nil] nameserver
|
85
|
+
# Optional DNS nameserver to query.
|
86
|
+
#
|
87
|
+
# @return [String, nil]
|
88
|
+
# The address of the hostname.
|
89
|
+
#
|
90
|
+
# @api public
|
91
|
+
#
|
92
|
+
def dns_lookup(hostname,nameserver=DNS.nameserver)
|
93
|
+
resolv = dns_resolver(nameserver)
|
94
|
+
|
95
|
+
begin
|
96
|
+
resolv.getaddress(hostname.to_s).to_s
|
97
|
+
rescue Resolv::ResolvError
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
#
|
102
|
+
# Looks up all addresses of a hostname.
|
103
|
+
#
|
104
|
+
# @param [String] hostname
|
105
|
+
# The hostname to lookup.
|
106
|
+
#
|
107
|
+
# @param [String, nil] nameserver
|
108
|
+
# Optional DNS nameserver to query.
|
109
|
+
#
|
110
|
+
# @return [Array<String>]
|
111
|
+
# The addresses of the hostname.
|
112
|
+
#
|
113
|
+
# @api public
|
114
|
+
#
|
115
|
+
def dns_lookup_all(hostname,nameserver=DNS.nameserver)
|
116
|
+
dns_resolver(nameserver).getaddresses(hostname.to_s).map(&:to_s)
|
117
|
+
end
|
118
|
+
|
119
|
+
#
|
120
|
+
# Looks up the hostname of the address.
|
121
|
+
#
|
122
|
+
# @param [String] address
|
123
|
+
# The address to lookup.
|
124
|
+
#
|
125
|
+
# @param [String, nil] nameserver
|
126
|
+
# Optional DNS nameserver to query.
|
127
|
+
#
|
128
|
+
# @return [String, nil]
|
129
|
+
# The hostname of the address.
|
130
|
+
#
|
131
|
+
# @api public
|
132
|
+
#
|
133
|
+
def dns_reverse_lookup(address,nameserver=DNS.nameserver)
|
134
|
+
resolv = dns_resolver(nameserver)
|
135
|
+
|
136
|
+
begin
|
137
|
+
resolv.getname(address.to_s).to_s
|
138
|
+
rescue Resolv::ResolvError
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
#
|
143
|
+
# Looks up all hostnames associated with the address.
|
144
|
+
#
|
145
|
+
# @param [String] address
|
146
|
+
# The address to lookup.
|
147
|
+
#
|
148
|
+
# @param [String, nil] nameserver
|
149
|
+
# Optional DNS nameserver to query.
|
150
|
+
#
|
151
|
+
# @return [Array<String>]
|
152
|
+
# The hostnames of the address.
|
153
|
+
#
|
154
|
+
# @api public
|
155
|
+
#
|
156
|
+
def dns_reverse_lookup_all(address,nameserver=DNS.nameserver)
|
157
|
+
dns_resolver(nameserver).getnames(address.to_s).map(&:to_s)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|