net-dns 0.8.0 → 0.20.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 +6 -14
- data/.rspec +1 -0
- data/.travis.yml +9 -16
- data/CHANGELOG.md +37 -13
- data/LICENSE.txt +56 -0
- data/README.md +94 -77
- data/demo/check_soa.rb +27 -38
- data/demo/threads.rb +3 -7
- data/lib/net/dns/header.rb +86 -110
- data/lib/net/dns/names.rb +31 -31
- data/lib/net/dns/packet.rb +148 -158
- data/lib/net/dns/question.rb +41 -42
- data/lib/net/dns/resolver/socks.rb +47 -55
- data/lib/net/dns/resolver/timeouts.rb +19 -30
- data/lib/net/dns/resolver.rb +151 -176
- data/lib/net/dns/rr/a.rb +45 -55
- data/lib/net/dns/rr/aaaa.rb +39 -50
- data/lib/net/dns/rr/classes.rb +32 -37
- data/lib/net/dns/rr/cname.rb +31 -41
- data/lib/net/dns/rr/hinfo.rb +40 -56
- data/lib/net/dns/rr/mr.rb +31 -42
- data/lib/net/dns/rr/mx.rb +35 -47
- data/lib/net/dns/rr/ns.rb +31 -41
- data/lib/net/dns/rr/null.rb +10 -15
- data/lib/net/dns/rr/ptr.rb +16 -24
- data/lib/net/dns/rr/soa.rb +36 -35
- data/lib/net/dns/rr/srv.rb +18 -19
- data/lib/net/dns/rr/txt.rb +11 -16
- data/lib/net/dns/rr/types.rb +118 -109
- data/lib/net/dns/rr.rb +107 -117
- data/lib/net/dns/version.rb +5 -13
- data/lib/net/dns.rb +6 -11
- metadata +18 -83
- data/.gitignore +0 -8
- data/Gemfile +0 -4
- data/Rakefile +0 -71
- data/fixtures/resolv.conf +0 -4
- data/lib/net/dns/core_ext.rb +0 -52
- data/net-dns.gemspec +0 -35
- data/test/header_test.rb +0 -167
- data/test/names_test.rb +0 -21
- data/test/packet_test.rb +0 -49
- data/test/question_test.rb +0 -83
- data/test/resolver/timeouts_test.rb +0 -109
- data/test/resolver_test.rb +0 -117
- data/test/rr/a_test.rb +0 -113
- data/test/rr/aaaa_test.rb +0 -109
- data/test/rr/classes_test.rb +0 -85
- data/test/rr/cname_test.rb +0 -97
- data/test/rr/hinfo_test.rb +0 -117
- data/test/rr/mr_test.rb +0 -105
- data/test/rr/mx_test.rb +0 -112
- data/test/rr/ns_test.rb +0 -86
- data/test/rr/types_test.rb +0 -69
- data/test/rr_test.rb +0 -131
- data/test/test_helper.rb +0 -4
data/lib/net/dns/rr/a.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module Net
|
2
2
|
module DNS
|
3
3
|
class RR
|
4
|
-
|
5
4
|
#
|
6
5
|
# = IPv4 Address Record (A)
|
7
6
|
#
|
@@ -23,13 +22,10 @@ module Net
|
|
23
22
|
# without any embedded space (e.g. "10.2.0.52" or "192.0.5.6").
|
24
23
|
#
|
25
24
|
class A < RR
|
26
|
-
|
27
25
|
# Gets the current IPv4 address for this record.
|
28
26
|
#
|
29
27
|
# Returns an instance of IPAddr.
|
30
|
-
|
31
|
-
@address
|
32
|
-
end
|
28
|
+
attr_reader :address
|
33
29
|
|
34
30
|
# Assigns a new IPv4 address to this record, which can be in the
|
35
31
|
# form of a <tt>String</tt> or an <tt>IPAddr</tt> object.
|
@@ -54,71 +50,65 @@ module Net
|
|
54
50
|
address.to_s
|
55
51
|
end
|
56
52
|
|
57
|
-
|
58
53
|
private
|
59
54
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
end
|
55
|
+
def subclass_new_from_hash(options)
|
56
|
+
if options.key?(:address)
|
57
|
+
@address = check_address(options[:address])
|
58
|
+
elsif options.key?(:rdata)
|
59
|
+
@address = check_address(options[:rdata])
|
60
|
+
else
|
61
|
+
raise ArgumentError, ":address or :rdata field is mandatory"
|
68
62
|
end
|
63
|
+
end
|
69
64
|
|
70
|
-
|
71
|
-
|
72
|
-
|
65
|
+
def subclass_new_from_string(str)
|
66
|
+
@address = check_address(str)
|
67
|
+
end
|
73
68
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
69
|
+
def subclass_new_from_binary(data, offset)
|
70
|
+
a, b, c, d = data.unpack("@#{offset} CCCC")
|
71
|
+
@address = IPAddr.new("#{a}.#{b}.#{c}.#{d}")
|
72
|
+
offset + 4
|
73
|
+
end
|
79
74
|
|
75
|
+
def set_type
|
76
|
+
@type = Net::DNS::RR::Types.new("A")
|
77
|
+
end
|
80
78
|
|
81
|
-
|
82
|
-
|
83
|
-
|
79
|
+
def get_inspect
|
80
|
+
value
|
81
|
+
end
|
84
82
|
|
85
|
-
|
86
|
-
|
83
|
+
def check_address(input)
|
84
|
+
address = case input
|
85
|
+
when IPAddr
|
86
|
+
input
|
87
|
+
# Address in numeric form
|
88
|
+
when Integer
|
89
|
+
IPAddr.new(input, Socket::AF_INET)
|
90
|
+
when String
|
91
|
+
IPAddr.new(input)
|
92
|
+
else
|
93
|
+
raise ArgumentError, "Invalid IP address `#{input}'"
|
87
94
|
end
|
88
95
|
|
89
|
-
|
90
|
-
|
91
|
-
address = case input
|
92
|
-
when IPAddr
|
93
|
-
input
|
94
|
-
when Integer # Address in numeric form
|
95
|
-
tmp = [(input >> 24), (input >> 16) & 0xFF, (input >> 8) & 0xFF, input & 0xFF]
|
96
|
-
tmp = tmp.collect { |x| x.to_s }.join(".")
|
97
|
-
IPAddr.new(tmp)
|
98
|
-
when String
|
99
|
-
IPAddr.new(input)
|
100
|
-
else
|
101
|
-
raise ArgumentError, "Invalid IP address `#{input}'"
|
102
|
-
end
|
103
|
-
|
104
|
-
if !address.ipv4?
|
105
|
-
raise(ArgumentError, "Must specify an IPv4 address")
|
106
|
-
end
|
107
|
-
|
108
|
-
address
|
96
|
+
unless address.ipv4?
|
97
|
+
raise(ArgumentError, "Must specify an IPv4 address")
|
109
98
|
end
|
110
99
|
|
111
|
-
|
112
|
-
|
113
|
-
@rdlength = @address_pack.size
|
114
|
-
end
|
100
|
+
address
|
101
|
+
end
|
115
102
|
|
116
|
-
|
117
|
-
|
118
|
-
|
103
|
+
def build_pack
|
104
|
+
@address_pack = @address.hton
|
105
|
+
@rdlength = @address_pack.size
|
106
|
+
end
|
119
107
|
|
108
|
+
def get_data
|
109
|
+
@address_pack
|
110
|
+
end
|
120
111
|
end
|
121
|
-
|
122
112
|
end
|
123
113
|
end
|
124
114
|
end
|
data/lib/net/dns/rr/aaaa.rb
CHANGED
@@ -1,20 +1,16 @@
|
|
1
1
|
module Net
|
2
2
|
module DNS
|
3
3
|
class RR
|
4
|
-
|
5
4
|
#
|
6
5
|
# = IPv6 Address Record (AAAA)
|
7
6
|
#
|
8
7
|
# Class for DNS IPv6 Address (AAAA) resource records.
|
9
8
|
#
|
10
9
|
class AAAA < RR
|
11
|
-
|
12
10
|
# Gets the current IPv6 address for this record.
|
13
11
|
#
|
14
12
|
# Returns an instance of IPAddr.
|
15
|
-
|
16
|
-
@address
|
17
|
-
end
|
13
|
+
attr_reader :address
|
18
14
|
|
19
15
|
# Assigns a new IPv6 address to this record, which can be in the
|
20
16
|
# form of a <tt>String</tt> or an <tt>IPAddr</tt> object.
|
@@ -39,65 +35,58 @@ module Net
|
|
39
35
|
address.to_s
|
40
36
|
end
|
41
37
|
|
42
|
-
|
43
38
|
private
|
44
39
|
|
45
|
-
|
46
|
-
|
47
|
-
@address = check_address(options[:address])
|
48
|
-
else
|
49
|
-
raise ArgumentError, ":address field is mandatory"
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def subclass_new_from_string(str)
|
54
|
-
@address = check_address(str)
|
55
|
-
end
|
56
|
-
|
57
|
-
def subclass_new_from_binary(data, offset)
|
58
|
-
tokens = data.unpack("@#{offset} n8")
|
59
|
-
@address = IPAddr.new(sprintf("%x:%x:%x:%x:%x:%x:%x:%x", *tokens))
|
60
|
-
offset + 16
|
61
|
-
end
|
62
|
-
|
40
|
+
def subclass_new_from_hash(options)
|
41
|
+
raise ArgumentError, ":address field is mandatory" unless options.key?(:address)
|
63
42
|
|
64
|
-
|
65
|
-
|
66
|
-
end
|
43
|
+
@address = check_address(options[:address])
|
44
|
+
end
|
67
45
|
|
68
|
-
|
69
|
-
|
70
|
-
|
46
|
+
def subclass_new_from_string(str)
|
47
|
+
@address = check_address(str)
|
48
|
+
end
|
71
49
|
|
50
|
+
def subclass_new_from_binary(data, offset)
|
51
|
+
tokens = data.unpack("@#{offset} n8")
|
52
|
+
@address = IPAddr.new(format("%x:%x:%x:%x:%x:%x:%x:%x", *tokens))
|
53
|
+
offset + 16
|
54
|
+
end
|
72
55
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
input
|
77
|
-
when String
|
78
|
-
IPAddr.new(input)
|
79
|
-
else
|
80
|
-
raise ArgumentError, "Invalid IP address `#{input}'"
|
81
|
-
end
|
56
|
+
def set_type
|
57
|
+
@type = Net::DNS::RR::Types.new("AAAA")
|
58
|
+
end
|
82
59
|
|
83
|
-
|
84
|
-
|
85
|
-
|
60
|
+
def get_inspect
|
61
|
+
value
|
62
|
+
end
|
86
63
|
|
87
|
-
|
64
|
+
def check_address(input)
|
65
|
+
address = case input
|
66
|
+
when IPAddr
|
67
|
+
input
|
68
|
+
when String
|
69
|
+
IPAddr.new(input)
|
70
|
+
else
|
71
|
+
raise ArgumentError, "Invalid IP address `#{input}'"
|
88
72
|
end
|
89
73
|
|
90
|
-
|
91
|
-
|
92
|
-
@rdlength = @address_pack.size
|
74
|
+
unless address.ipv6?
|
75
|
+
raise(ArgumentError, "Must specify an IPv6 address")
|
93
76
|
end
|
94
77
|
|
95
|
-
|
96
|
-
|
97
|
-
end
|
78
|
+
address
|
79
|
+
end
|
98
80
|
|
99
|
-
|
81
|
+
def build_pack
|
82
|
+
@address_pack = @address.hton
|
83
|
+
@rdlength = @address_pack.size
|
84
|
+
end
|
100
85
|
|
86
|
+
def get_data
|
87
|
+
@address_pack
|
88
|
+
end
|
89
|
+
end
|
101
90
|
end
|
102
91
|
end
|
103
92
|
end
|
data/lib/net/dns/rr/classes.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
module Net
|
2
2
|
module DNS
|
3
|
-
|
4
3
|
class RR
|
5
|
-
|
6
4
|
#
|
7
5
|
# = Net::DNS::Classes
|
8
6
|
#
|
@@ -10,37 +8,35 @@ module Net
|
|
10
8
|
# class field in a DNS packet.
|
11
9
|
#
|
12
10
|
class Classes
|
13
|
-
|
14
11
|
# Hash with the values of each RR class stored with the
|
15
12
|
# respective id number.
|
16
13
|
CLASSES = {
|
17
|
-
'IN'
|
18
|
-
'CH'
|
19
|
-
'HS'
|
20
|
-
'NONE'
|
21
|
-
'ANY'
|
22
|
-
}
|
14
|
+
'IN' => 1, # RFC 1035
|
15
|
+
'CH' => 3, # RFC 1035
|
16
|
+
'HS' => 4, # RFC 1035
|
17
|
+
'NONE' => 254, # RFC 2136
|
18
|
+
'ANY' => 255, # RFC 1035
|
19
|
+
}.freeze
|
23
20
|
|
24
21
|
# The default value when class is nil in Resource Records
|
25
22
|
@@default = CLASSES["IN"]
|
26
23
|
|
27
|
-
|
28
24
|
# Creates a new object representing an RR class. Performs some
|
29
25
|
# checks on the argument validity too. Il +cls+ is +nil+, the
|
30
26
|
# default value is +ANY+ or the one set with Classes.default=
|
31
27
|
def initialize(cls)
|
32
28
|
case cls
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
29
|
+
when String
|
30
|
+
initialize_from_str(cls)
|
31
|
+
when Integer
|
32
|
+
initialize_from_num(cls)
|
33
|
+
when nil
|
34
|
+
initialize_from_num(@@default)
|
39
35
|
end
|
40
36
|
|
41
|
-
|
42
|
-
|
43
|
-
|
37
|
+
return unless @str.nil? || @num.nil?
|
38
|
+
|
39
|
+
raise ArgumentError, "Unable to create a `Classes' from `#{cls}'"
|
44
40
|
end
|
45
41
|
|
46
42
|
# Returns the class in number format
|
@@ -64,16 +60,16 @@ module Net
|
|
64
60
|
@num.to_i
|
65
61
|
end
|
66
62
|
|
67
|
-
|
63
|
+
def self.default
|
64
|
+
@@default
|
65
|
+
end
|
68
66
|
|
69
67
|
# Be able to control the default class to assign when
|
70
68
|
# cls argument is +nil+. Default to +IN+
|
71
69
|
def self.default=(str)
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
raise ArgumentError, "Unknown class `#{str}'"
|
76
|
-
end
|
70
|
+
raise ArgumentError, "Unknown class `#{str}'" unless CLASSES[str]
|
71
|
+
|
72
|
+
@@default = CLASSES[str]
|
77
73
|
end
|
78
74
|
|
79
75
|
# Returns whether <tt>cls</tt> is a valid RR class.
|
@@ -96,12 +92,12 @@ module Net
|
|
96
92
|
#
|
97
93
|
def self.valid?(cls)
|
98
94
|
case cls
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
95
|
+
when String
|
96
|
+
CLASSES.key?(cls)
|
97
|
+
when Integer
|
98
|
+
CLASSES.invert.key?(cls)
|
99
|
+
else
|
100
|
+
raise ArgumentError, "Wrong cls class: #{cls.class}"
|
105
101
|
end
|
106
102
|
end
|
107
103
|
|
@@ -111,23 +107,22 @@ module Net
|
|
111
107
|
CLASSES.keys.sort.join("|")
|
112
108
|
end
|
113
109
|
|
114
|
-
|
115
|
-
private
|
110
|
+
private
|
116
111
|
|
117
112
|
# Initialize a new instance from a Class name.
|
118
113
|
def initialize_from_str(str)
|
119
114
|
key = str.to_s.upcase
|
120
|
-
@num
|
115
|
+
@num = CLASSES[key]
|
116
|
+
@str = key
|
121
117
|
end
|
122
118
|
|
123
119
|
# Initialize a new instance from the Class value.
|
124
120
|
def initialize_from_num(num)
|
125
121
|
key = num.to_i
|
126
|
-
@num
|
122
|
+
@num = key
|
123
|
+
@str = CLASSES.invert[key]
|
127
124
|
end
|
128
|
-
|
129
125
|
end
|
130
|
-
|
131
126
|
end
|
132
127
|
end
|
133
128
|
end
|
data/lib/net/dns/rr/cname.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module Net # :nodoc:
|
2
2
|
module DNS
|
3
3
|
class RR
|
4
|
-
|
5
4
|
#
|
6
5
|
# = Canonical Name Record (CNAME)
|
7
6
|
#
|
@@ -12,13 +11,10 @@ module Net # :nodoc:
|
|
12
11
|
# Canonical means expected or real name.
|
13
12
|
#
|
14
13
|
class CNAME < RR
|
15
|
-
|
16
14
|
# Gets the canonical name value.
|
17
15
|
#
|
18
16
|
# Returns a String.
|
19
|
-
|
20
|
-
@cname
|
21
|
-
end
|
17
|
+
attr_reader :cname
|
22
18
|
|
23
19
|
# Gets the standardized value for this record,
|
24
20
|
# represented by the value of <tt>cname</tt>.
|
@@ -28,55 +24,49 @@ module Net # :nodoc:
|
|
28
24
|
cname.to_s
|
29
25
|
end
|
30
26
|
|
31
|
-
|
32
27
|
private
|
33
28
|
|
34
|
-
|
35
|
-
|
36
|
-
@cname = check_name(options[:cname])
|
37
|
-
else
|
38
|
-
raise ArgumentError, ":cname field is mandatory"
|
39
|
-
end
|
40
|
-
end
|
29
|
+
def subclass_new_from_hash(options)
|
30
|
+
raise ArgumentError, ":cname field is mandatory" unless options.key?(:cname)
|
41
31
|
|
42
|
-
|
43
|
-
|
44
|
-
end
|
45
|
-
|
46
|
-
def subclass_new_from_binary(data, offset)
|
47
|
-
@cname, offset = dn_expand(data, offset)
|
48
|
-
offset
|
49
|
-
end
|
32
|
+
@cname = check_name(options[:cname])
|
33
|
+
end
|
50
34
|
|
35
|
+
def subclass_new_from_string(str)
|
36
|
+
@cname = check_name(str)
|
37
|
+
end
|
51
38
|
|
52
|
-
|
53
|
-
|
54
|
-
|
39
|
+
def subclass_new_from_binary(data, offset)
|
40
|
+
@cname, offset = dn_expand(data, offset)
|
41
|
+
offset
|
42
|
+
end
|
55
43
|
|
56
|
-
|
57
|
-
|
58
|
-
|
44
|
+
def set_type
|
45
|
+
@type = Net::DNS::RR::Types.new("CNAME")
|
46
|
+
end
|
59
47
|
|
48
|
+
def get_inspect
|
49
|
+
value
|
50
|
+
end
|
60
51
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
end
|
66
|
-
name
|
52
|
+
def check_name(input)
|
53
|
+
name = input.to_s
|
54
|
+
unless name =~ /(\w\.?)+\s*$/ && name =~ /[a-zA-Z]/
|
55
|
+
raise ArgumentError, "Invalid Canonical Name `#{name}'"
|
67
56
|
end
|
68
57
|
|
69
|
-
|
70
|
-
|
71
|
-
@rdlength = @cname_pack.size
|
72
|
-
end
|
58
|
+
name
|
59
|
+
end
|
73
60
|
|
74
|
-
|
75
|
-
|
76
|
-
|
61
|
+
def build_pack
|
62
|
+
@cname_pack = pack_name(@cname)
|
63
|
+
@rdlength = @cname_pack.size
|
64
|
+
end
|
77
65
|
|
66
|
+
def get_data
|
67
|
+
@cname_pack
|
68
|
+
end
|
78
69
|
end
|
79
|
-
|
80
70
|
end
|
81
71
|
end
|
82
72
|
end
|
data/lib/net/dns/rr/hinfo.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module Net # :nodoc:
|
2
2
|
module DNS
|
3
3
|
class RR
|
4
|
-
|
5
4
|
#
|
6
5
|
# = System Information Record (HINFO)
|
7
6
|
#
|
@@ -13,30 +12,24 @@ module Net # :nodoc:
|
|
13
12
|
# Single space between CPU and OS parameters.
|
14
13
|
#
|
15
14
|
class HINFO < RR
|
16
|
-
|
17
15
|
# Gets the CPU value.
|
18
16
|
#
|
19
17
|
# Returns a String.
|
20
|
-
|
21
|
-
@cpu
|
22
|
-
end
|
18
|
+
attr_reader :cpu
|
23
19
|
|
24
20
|
# Gets the OS value.
|
25
21
|
#
|
26
22
|
# Returns a String.
|
27
|
-
|
28
|
-
@os
|
29
|
-
end
|
23
|
+
attr_reader :os
|
30
24
|
|
31
25
|
# Gets the standardized value for this record,
|
32
26
|
# represented by the value of <tt>cpu</tt> and <tt>os</tt>.
|
33
27
|
#
|
34
28
|
# Returns a String.
|
35
29
|
def value
|
36
|
-
%Q
|
30
|
+
%Q("#{cpu}" "#{os}")
|
37
31
|
end
|
38
32
|
|
39
|
-
|
40
33
|
# Gets a list of all the attributes for this record.
|
41
34
|
#
|
42
35
|
# Returns an Array of values.
|
@@ -44,65 +37,56 @@ module Net # :nodoc:
|
|
44
37
|
[nil, nil, cls.to_s, type.to_s, value]
|
45
38
|
end
|
46
39
|
|
47
|
-
|
48
40
|
private
|
49
41
|
|
50
|
-
|
51
|
-
|
52
|
-
@cpu = options[:cpu]
|
53
|
-
@os = options[:os]
|
54
|
-
else
|
55
|
-
raise ArgumentError, ":cpu and :os fields are mandatory"
|
56
|
-
end
|
57
|
-
end
|
42
|
+
def subclass_new_from_hash(options)
|
43
|
+
raise ArgumentError, ":cpu and :os fields are mandatory" unless options.key?(:cpu) && options.key?(:os)
|
58
44
|
|
59
|
-
|
60
|
-
|
61
|
-
|
45
|
+
@cpu = options[:cpu]
|
46
|
+
@os = options[:os]
|
47
|
+
end
|
62
48
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
@cpu = data[offset..(offset + len)]
|
67
|
-
offset += len
|
68
|
-
|
69
|
-
len = data.unpack("@#{offset} C").first
|
70
|
-
offset += 1
|
71
|
-
@os = data[offset..(offset + len)]
|
72
|
-
offset += len
|
73
|
-
end
|
49
|
+
def subclass_new_from_string(str)
|
50
|
+
@cpu, @os = check_hinfo(str)
|
51
|
+
end
|
74
52
|
|
53
|
+
def subclass_new_from_binary(data, offset)
|
54
|
+
len = data.unpack1("@#{offset} C")
|
55
|
+
offset += 1
|
56
|
+
@cpu = data[offset..(offset + len)]
|
57
|
+
offset += len
|
75
58
|
|
76
|
-
|
77
|
-
|
78
|
-
|
59
|
+
len = data.unpack1("@#{offset} C")
|
60
|
+
offset += 1
|
61
|
+
@os = data[offset..(offset + len)]
|
62
|
+
offset += len
|
63
|
+
end
|
79
64
|
|
80
|
-
|
81
|
-
|
82
|
-
|
65
|
+
def set_type
|
66
|
+
@type = Net::DNS::RR::Types.new("HINFO")
|
67
|
+
end
|
83
68
|
|
69
|
+
def get_inspect
|
70
|
+
value
|
71
|
+
end
|
84
72
|
|
85
|
-
|
86
|
-
|
87
|
-
[$1, $2]
|
88
|
-
else
|
89
|
-
raise ArgumentError, "Invalid HINFO Section `#{input}'"
|
90
|
-
end
|
91
|
-
end
|
73
|
+
def check_hinfo(input)
|
74
|
+
raise ArgumentError, "Invalid HINFO Section `#{input}'" unless input.to_s.strip =~ /^(?:["']?(.*?)["']?)\s+(?:["']?(.*?)["']?)$/
|
92
75
|
|
93
|
-
|
94
|
-
|
95
|
-
@hinfo_pack += [cpu.size].pack("C") + cpu
|
96
|
-
@hinfo_pack += [os.size ].pack("C") + os
|
97
|
-
@rdlength = @hinfo_pack.size
|
98
|
-
end
|
76
|
+
[Regexp.last_match(1), Regexp.last_match(2)]
|
77
|
+
end
|
99
78
|
|
100
|
-
|
101
|
-
|
102
|
-
|
79
|
+
def build_pack
|
80
|
+
@hinfo_pack = ""
|
81
|
+
@hinfo_pack += [cpu.size].pack("C") + cpu
|
82
|
+
@hinfo_pack += [os.size].pack("C") + os
|
83
|
+
@rdlength = @hinfo_pack.size
|
84
|
+
end
|
103
85
|
|
86
|
+
def get_data
|
87
|
+
@hinfo_pack
|
88
|
+
end
|
104
89
|
end
|
105
|
-
|
106
90
|
end
|
107
91
|
end
|
108
92
|
end
|