dnsruby 1.55 → 1.56.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.
Files changed (158) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +96 -0
  3. data/Rakefile +30 -29
  4. data/demo/axfr.rb +93 -93
  5. data/demo/check_soa.rb +99 -99
  6. data/demo/check_zone.rb +59 -59
  7. data/demo/digdlv.rb +43 -43
  8. data/demo/digroot.rb +34 -34
  9. data/demo/example_recurse.rb +14 -14
  10. data/demo/mresolv.rb +30 -30
  11. data/demo/mx.rb +31 -31
  12. data/demo/rubydig.rb +37 -37
  13. data/demo/to_resolve.txt +3088 -3088
  14. data/demo/trace_dns.rb +46 -46
  15. data/lib/dnsruby.rb +161 -526
  16. data/lib/dnsruby/DNS.rb +305 -0
  17. data/lib/{Dnsruby/Cache.rb → dnsruby/cache.rb} +152 -152
  18. data/lib/{Dnsruby → dnsruby}/code_mapper.rb +48 -52
  19. data/lib/dnsruby/code_mappers.rb +295 -0
  20. data/lib/{Dnsruby/Config.rb → dnsruby/config.rb} +454 -454
  21. data/lib/{Dnsruby → dnsruby}/dnssec.rb +91 -91
  22. data/lib/{Dnsruby/Hosts.rb → dnsruby/hosts.rb} +125 -125
  23. data/lib/{Dnsruby → dnsruby}/ipv4.rb +26 -26
  24. data/lib/{Dnsruby → dnsruby}/ipv6.rb +42 -42
  25. data/lib/{Dnsruby → dnsruby}/key_cache.rb +29 -29
  26. data/lib/dnsruby/message/decoder.rb +164 -0
  27. data/lib/dnsruby/message/encoder.rb +75 -0
  28. data/lib/dnsruby/message/header.rb +249 -0
  29. data/lib/dnsruby/message/message.rb +629 -0
  30. data/lib/dnsruby/message/question.rb +86 -0
  31. data/lib/dnsruby/message/section.rb +96 -0
  32. data/lib/{Dnsruby → dnsruby}/name.rb +141 -141
  33. data/lib/dnsruby/packet_sender.rb +661 -0
  34. data/lib/{Dnsruby/Recursor.rb → dnsruby/recursor.rb} +235 -233
  35. data/lib/dnsruby/resolv.rb +113 -0
  36. data/lib/dnsruby/resolver.rb +1192 -0
  37. data/lib/dnsruby/resource/A.rb +56 -0
  38. data/lib/dnsruby/resource/AAAA.rb +54 -0
  39. data/lib/{Dnsruby → dnsruby}/resource/AFSDB.rb +68 -68
  40. data/lib/{Dnsruby → dnsruby}/resource/CERT.rb +105 -105
  41. data/lib/{Dnsruby → dnsruby}/resource/DHCID.rb +54 -54
  42. data/lib/dnsruby/resource/DLV.rb +27 -0
  43. data/lib/{Dnsruby → dnsruby}/resource/DNSKEY.rb +372 -372
  44. data/lib/{Dnsruby → dnsruby}/resource/DS.rb +255 -255
  45. data/lib/{Dnsruby → dnsruby}/resource/HINFO.rb +71 -71
  46. data/lib/{Dnsruby → dnsruby}/resource/HIP.rb +29 -29
  47. data/lib/{Dnsruby → dnsruby}/resource/IN.rb +30 -30
  48. data/lib/{Dnsruby → dnsruby}/resource/IPSECKEY.rb +31 -31
  49. data/lib/{Dnsruby → dnsruby}/resource/ISDN.rb +62 -62
  50. data/lib/{Dnsruby → dnsruby}/resource/KX.rb +65 -65
  51. data/lib/{Dnsruby → dnsruby}/resource/LOC.rb +263 -263
  52. data/lib/{Dnsruby → dnsruby}/resource/MINFO.rb +69 -69
  53. data/lib/{Dnsruby → dnsruby}/resource/MX.rb +65 -65
  54. data/lib/{Dnsruby → dnsruby}/resource/NAPTR.rb +98 -98
  55. data/lib/{Dnsruby → dnsruby}/resource/NSAP.rb +171 -171
  56. data/lib/dnsruby/resource/NSEC.rb +275 -0
  57. data/lib/dnsruby/resource/NSEC3.rb +332 -0
  58. data/lib/dnsruby/resource/NSEC3PARAM.rb +135 -0
  59. data/lib/dnsruby/resource/OPT.rb +272 -0
  60. data/lib/{Dnsruby → dnsruby}/resource/PX.rb +70 -70
  61. data/lib/{Dnsruby → dnsruby}/resource/RP.rb +75 -75
  62. data/lib/dnsruby/resource/RR.rb +421 -0
  63. data/lib/dnsruby/resource/RRSIG.rb +275 -0
  64. data/lib/dnsruby/resource/RRSet.rb +190 -0
  65. data/lib/{Dnsruby → dnsruby}/resource/RT.rb +67 -67
  66. data/lib/{Dnsruby → dnsruby}/resource/SOA.rb +94 -94
  67. data/lib/dnsruby/resource/SPF.rb +29 -0
  68. data/lib/dnsruby/resource/SRV.rb +112 -0
  69. data/lib/{Dnsruby → dnsruby}/resource/SSHFP.rb +14 -14
  70. data/lib/dnsruby/resource/TKEY.rb +163 -0
  71. data/lib/dnsruby/resource/TSIG.rb +593 -0
  72. data/lib/{Dnsruby → dnsruby}/resource/TXT.rb +191 -191
  73. data/lib/dnsruby/resource/X25.rb +55 -0
  74. data/lib/{Dnsruby → dnsruby}/resource/domain_name.rb +25 -25
  75. data/lib/{Dnsruby → dnsruby}/resource/generic.rb +80 -80
  76. data/lib/dnsruby/resource/resource.rb +25 -0
  77. data/lib/{Dnsruby → dnsruby}/select_thread.rb +148 -148
  78. data/lib/{Dnsruby/SingleResolver.rb → dnsruby/single_resolver.rb} +60 -60
  79. data/lib/{Dnsruby → dnsruby}/single_verifier.rb +344 -344
  80. data/lib/dnsruby/the_log.rb +44 -0
  81. data/lib/dnsruby/update.rb +278 -0
  82. data/lib/dnsruby/validator_thread.rb +124 -0
  83. data/lib/dnsruby/version.rb +3 -0
  84. data/lib/{Dnsruby → dnsruby}/zone_reader.rb +93 -93
  85. data/lib/{Dnsruby → dnsruby}/zone_transfer.rb +377 -377
  86. data/test/spec_helper.rb +16 -0
  87. data/test/tc_axfr.rb +31 -34
  88. data/test/tc_cache.rb +32 -32
  89. data/test/tc_dlv.rb +28 -28
  90. data/test/tc_dns.rb +73 -76
  91. data/test/tc_dnskey.rb +31 -32
  92. data/test/tc_dnsruby.rb +50 -44
  93. data/test/tc_ds.rb +36 -36
  94. data/test/tc_escapedchars.rb +252 -255
  95. data/test/tc_hash.rb +17 -21
  96. data/test/tc_header.rb +48 -57
  97. data/test/tc_hip.rb +19 -22
  98. data/test/tc_ipseckey.rb +18 -21
  99. data/test/tc_keith.rb +300 -0
  100. data/test/tc_message.rb +87 -0
  101. data/test/tc_misc.rb +83 -87
  102. data/test/tc_name.rb +81 -84
  103. data/test/tc_naptr.rb +18 -21
  104. data/test/tc_nsec.rb +55 -55
  105. data/test/tc_nsec3.rb +23 -24
  106. data/test/tc_nsec3param.rb +20 -21
  107. data/test/tc_packet.rb +90 -93
  108. data/test/tc_packet_unique_push.rb +48 -51
  109. data/test/tc_question.rb +30 -33
  110. data/test/tc_queue.rb +16 -17
  111. data/test/tc_recur.rb +16 -17
  112. data/test/tc_res_config.rb +38 -41
  113. data/test/tc_res_env.rb +29 -32
  114. data/test/tc_res_file.rb +26 -29
  115. data/test/tc_res_opt.rb +62 -65
  116. data/test/tc_resolver.rb +287 -242
  117. data/test/tc_rr-opt.rb +70 -63
  118. data/test/tc_rr-txt.rb +68 -71
  119. data/test/tc_rr-unknown.rb +45 -48
  120. data/test/tc_rr.rb +76 -70
  121. data/test/tc_rrset.rb +21 -22
  122. data/test/tc_rrsig.rb +19 -20
  123. data/test/tc_single_resolver.rb +294 -297
  124. data/test/tc_soak.rb +199 -202
  125. data/test/tc_soak_base.rb +29 -34
  126. data/test/tc_sshfp.rb +20 -23
  127. data/test/tc_tcp.rb +32 -35
  128. data/test/tc_tkey.rb +41 -44
  129. data/test/tc_tsig.rb +81 -84
  130. data/test/tc_update.rb +108 -111
  131. data/test/tc_validator.rb +29 -29
  132. data/test/tc_verifier.rb +81 -82
  133. data/test/ts_dnsruby.rb +16 -15
  134. data/test/ts_offline.rb +62 -63
  135. data/test/ts_online.rb +115 -115
  136. metadata +155 -90
  137. data/README +0 -59
  138. data/lib/Dnsruby/DNS.rb +0 -305
  139. data/lib/Dnsruby/PacketSender.rb +0 -656
  140. data/lib/Dnsruby/Resolver.rb +0 -1189
  141. data/lib/Dnsruby/TheLog.rb +0 -44
  142. data/lib/Dnsruby/message.rb +0 -1230
  143. data/lib/Dnsruby/resource/A.rb +0 -56
  144. data/lib/Dnsruby/resource/AAAA.rb +0 -54
  145. data/lib/Dnsruby/resource/DLV.rb +0 -27
  146. data/lib/Dnsruby/resource/NSEC.rb +0 -298
  147. data/lib/Dnsruby/resource/NSEC3.rb +0 -340
  148. data/lib/Dnsruby/resource/NSEC3PARAM.rb +0 -135
  149. data/lib/Dnsruby/resource/OPT.rb +0 -213
  150. data/lib/Dnsruby/resource/RRSIG.rb +0 -275
  151. data/lib/Dnsruby/resource/SPF.rb +0 -29
  152. data/lib/Dnsruby/resource/SRV.rb +0 -112
  153. data/lib/Dnsruby/resource/TKEY.rb +0 -163
  154. data/lib/Dnsruby/resource/TSIG.rb +0 -593
  155. data/lib/Dnsruby/resource/X25.rb +0 -55
  156. data/lib/Dnsruby/resource/resource.rb +0 -678
  157. data/lib/Dnsruby/update.rb +0 -278
  158. data/lib/Dnsruby/validator_thread.rb +0 -124
@@ -1,66 +1,66 @@
1
- #--
2
- #Copyright 2007 Nominet UK
3
- #
4
- #Licensed under the Apache License, Version 2.0 (the "License");
5
- #you may not use this file except in compliance with the License.
6
- #You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- #Unless required by applicable law or agreed to in writing, software
11
- #distributed under the License is distributed on an "AS IS" BASIS,
12
- #WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- #See the License for the specific language governing permissions and
14
- #limitations under the License.
15
- #++
16
- module Dnsruby
17
- class RR
18
- #Class for DNS Key Exchange (KX) resource records.
19
- #RFC 2230
20
- class KX < RR
21
- ClassValue = nil #:nodoc: all
22
- TypeValue= Types::KX #:nodoc: all
23
-
24
- #The preference for this mail exchange.
25
- attr_accessor :preference
26
- #The name of this mail exchange.
27
- attr_accessor :exchange
28
-
29
- def from_hash(hash) #:nodoc: all
30
- @preference = hash[:preference]
31
- @exchange = Name.create(hash[:exchange])
32
- end
33
-
34
- def from_data(data) #:nodoc: all
35
- @preference, @exchange = data
36
- end
37
-
38
- def from_string(input) #:nodoc: all
39
- if (input.length > 0)
40
- names = input.split(" ")
41
- @preference = names[0].to_i
42
- @exchange = Name.create(names[1])
43
- end
44
- end
45
-
46
- def rdata_to_string #:nodoc: all
47
- if (@preference!=nil)
48
- return "#{@preference} #{@exchange.to_s(true)}"
49
- else
50
- return ""
51
- end
52
- end
53
-
54
- def encode_rdata(msg, canonical=false) #:nodoc: all
55
- msg.put_pack('n', @preference)
56
- msg.put_name(@exchange, true)
57
- end
58
-
59
- def self.decode_rdata(msg) #:nodoc: all
60
- preference, = msg.get_unpack('n')
61
- exchange = msg.get_name
62
- return self.new([preference, exchange])
63
- end
64
- end
65
- end
1
+ # --
2
+ # Copyright 2007 Nominet UK
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ # ++
16
+ module Dnsruby
17
+ class RR
18
+ # Class for DNS Key Exchange (KX) resource records.
19
+ # RFC 2230
20
+ class KX < RR
21
+ ClassValue = nil #:nodoc: all
22
+ TypeValue= Types::KX #:nodoc: all
23
+
24
+ # The preference for this mail exchange.
25
+ attr_accessor :preference
26
+ # The name of this mail exchange.
27
+ attr_accessor :exchange
28
+
29
+ def from_hash(hash) #:nodoc: all
30
+ @preference = hash[:preference]
31
+ @exchange = Name.create(hash[:exchange])
32
+ end
33
+
34
+ def from_data(data) #:nodoc: all
35
+ @preference, @exchange = data
36
+ end
37
+
38
+ def from_string(input) #:nodoc: all
39
+ if (input.length > 0)
40
+ names = input.split(" ")
41
+ @preference = names[0].to_i
42
+ @exchange = Name.create(names[1])
43
+ end
44
+ end
45
+
46
+ def rdata_to_string #:nodoc: all
47
+ if (@preference!=nil)
48
+ return "#{@preference} #{@exchange.to_s(true)}"
49
+ else
50
+ return ""
51
+ end
52
+ end
53
+
54
+ def encode_rdata(msg, canonical=false) #:nodoc: all
55
+ msg.put_pack('n', @preference)
56
+ msg.put_name(@exchange, true)
57
+ end
58
+
59
+ def self.decode_rdata(msg) #:nodoc: all
60
+ preference, = msg.get_unpack('n')
61
+ exchange = msg.get_name
62
+ return self.new([preference, exchange])
63
+ end
64
+ end
65
+ end
66
66
  end
@@ -1,264 +1,264 @@
1
- #--
2
- #Copyright 2007 Nominet UK
3
- #
4
- #Licensed under the Apache License, Version 2.0 (the "License");
5
- #you may not use this file except in compliance with the License.
6
- #You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- #Unless required by applicable law or agreed to in writing, software
11
- #distributed under the License is distributed on an "AS IS" BASIS,
12
- #WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- #See the License for the specific language governing permissions and
14
- #limitations under the License.
15
- #++
16
- module Dnsruby
17
- class RR
18
- #Class for DNS Location (LOC) resource records. See RFC 1876 for
19
- #details.
20
- class LOC < RR
21
- ClassValue = nil #:nodoc: all
22
- TypeValue = Types::LOC #:nodoc: all
23
-
24
- #The version number of the representation; programs should
25
- #always check this. Dnsruby currently supports only version 0.
26
- attr_accessor :version
27
- @version = 0
28
-
29
- #The diameter of a sphere enclosing the described entity,
30
- #in centimeters.
31
- attr_accessor :size
32
- #The horizontal precision of the data, in centimeters.
33
- attr_accessor :horiz_pre
34
- #The vertical precision of the data, in centimeters.
35
- attr_accessor :vert_pre
36
- #The latitude of the center of the sphere described by
37
- #the size method, in thousandths of a second of arc. 2**31
38
- #represents the equator; numbers above that are north latitude.
39
- attr_accessor :latitude
40
- #The longitude of the center of the sphere described by
41
- #the size method, in thousandths of a second of arc. 2**31
42
- #represents the prime meridian; numbers above that are east
43
- #longitude.
44
- attr_accessor :longitude
45
- #The altitude of the center of the sphere described by
46
- #the size method, in centimeters, from a base of 100,000m
47
- #below the WGS 84 reference spheroid used by GPS.
48
- attr_accessor :altitude
49
- # Powers of 10 from 0 to 9 (used to speed up calculations).
50
- POWEROFTEN = [1, 10, 100, 1_000, 10_000, 100_000, 1_000_000, 10_000_000, 100_000_000, 1_000_000_000]
51
-
52
- # Reference altitude in centimeters (see RFC 1876).
53
- REFERENCE_ALT = 100_000 * 100;
54
-
55
- # Reference lat/lon (see RFC 1876).
56
- REFERENCE_LATLON = 2**31;
57
-
58
- # Conversions to/from thousandths of a degree.
59
- CONV_SEC = 1000;
60
- CONV_MIN = 60 * CONV_SEC;
61
- CONV_DEG = 60 * CONV_MIN;
62
-
63
- # Defaults (from RFC 1876, Section 3).
64
- DEFAULT_MIN = 0;
65
- DEFAULT_SEC = 0;
66
- DEFAULT_SIZE = 1;
67
- DEFAULT_HORIZ_PRE = 10_000;
68
- DEFAULT_VERT_PRE = 10;
69
-
70
-
71
- def latlon2dms(rawmsec, hems)
72
- # Tried to use modulus here, but Perl dumped core if
73
- # the value was >= 2**31.
74
-
75
- abs = (rawmsec - REFERENCE_LATLON).abs;
76
- deg = (abs / CONV_DEG).round;
77
- abs -= deg * CONV_DEG;
78
- min = (abs / CONV_MIN).round;
79
- abs -= min * CONV_MIN;
80
- sec = (abs / CONV_SEC).round; # $conv_sec
81
- abs -= sec * CONV_SEC;
82
- msec = abs;
83
-
84
- hem = hems[(rawmsec >= REFERENCE_LATLON ? 0 : 1), 1]
85
-
86
- return sprintf("%d %02d %02d.%03d %s", deg, min, sec, msec, hem);
87
- end
88
-
89
- def dms2latlon(deg, min, sec, hem)
90
- retval=0
91
-
92
- retval = (deg * CONV_DEG) + (min * CONV_MIN) + (sec * CONV_SEC).round;
93
- retval = -retval if ((hem != nil) && ((hem == "S") || (hem == "W")));
94
- retval += REFERENCE_LATLON;
95
- return retval;
96
- end
97
-
98
- #Returns the latitude and longitude as floating-point degrees.
99
- #Positive numbers represent north latitude or east longitude;
100
- #negative numbers represent south latitude or west longitude.
101
- #
102
- # lat, lon = rr.latlon
103
- # system("xearth", "-pos", "fixed #{lat} #{lon}")
104
- #
105
- def latlon
106
- retlat, retlon = nil
107
-
108
- if (@version == 0)
109
- retlat = latlon2deg(@latitude);
110
- retlon = latlon2deg(@longitude);
111
- end
112
-
113
- return retlat, retlon
114
- end
115
-
116
- def latlon2deg(rawmsec)
117
- deg=0;
118
-
119
- deg = (rawmsec - reference_latlon) / CONV_DEG;
120
- return deg;
121
- end
122
-
123
- def from_data(data) #:nodoc: all
124
- @version, @size, @horiz_pre, @vert_pre, @latitude, @longitude, @altitude = data
125
- end
126
-
127
- def from_string(string) #:nodoc: all
128
- if (string &&
129
- string =~ /^ (\d+) \s+ # deg lat
130
- ((\d+) \s+)? # min lat
131
- (([\d.]+) \s+)? # sec lat
132
- (N|S) \s+ # hem lat
133
- (\d+) \s+ # deg lon
134
- ((\d+) \s+)? # min lon
135
- (([\d.]+) \s+)? # sec lon
136
- (E|W) \s+ # hem lon
137
- (-?[\d.]+) m? # altitude
138
- (\s+ ([\d.]+) m?)? # size
139
- (\s+ ([\d.]+) m?)? # horiz precision
140
- (\s+ ([\d.]+) m?)? # vert precision
141
- /ix) #
142
-
143
- size = DEFAULT_SIZE
144
-
145
- # What to do for other versions?
146
- version = 0;
147
-
148
- horiz_pre = DEFAULT_HORIZ_PRE
149
- vert_pre = DEFAULT_VERT_PRE
150
- latdeg, latmin, latsec, lathem = $1.to_i, $3.to_i, $5.to_f, $6;
151
- londeg, lonmin, lonsec, lonhem = $7.to_i, $9.to_i, $11.to_f, $12
152
- alt = $13.to_i
153
- if ($15)
154
- size = $15.to_f
155
- end
156
- if ($17)
157
- horiz_pre = $17.to_f
158
- end
159
- if ($19)
160
- vert_pre = $19.to_f
161
- end
162
-
163
- latmin = DEFAULT_MIN unless latmin;
164
- latsec = DEFAULT_SEC unless latsec;
165
- lathem = lathem.upcase;
166
-
167
- lonmin = DEFAULT_MIN unless lonmin;
168
- lonsec = DEFAULT_SEC unless lonsec;
169
- lonhem = lonhem.upcase
170
-
171
- @version = version;
172
- @size = size * 100;
173
- @horiz_pre = horiz_pre * 100;
174
- @vert_pre = vert_pre * 100;
175
- @latitude = dms2latlon(latdeg, latmin, latsec, lathem);
176
- @longitude = dms2latlon(londeg, lonmin, lonsec, lonhem);
177
- @altitude = alt * 100 + REFERENCE_ALT;
178
- end
179
- end
180
-
181
- def from_hash(hash) #:nodoc: all
182
- super(hash)
183
- if (@size == nil)
184
- @size = DEFAULT_SIZE * 100
185
- end
186
- if @horiz_pre == nil
187
- @horiz_pre = DEFAULT_HORIZ_PRE * 100
188
- end
189
- if @vert_pre == nil
190
- @vert_pre = DEFAULT_VERT_PRE * 100
191
- end
192
- end
193
-
194
- def rdata_to_string #:nodoc: all
195
- rdatastr=""
196
-
197
- if (defined?@version)
198
- if (@version == 0)
199
- lat = @latitude;
200
- lon = @longitude;
201
- altitude = @altitude;
202
- size = @size;
203
- horiz_pre = @horiz_pre;
204
- vert_pre = @vert_pre;
205
-
206
- altitude = (altitude - REFERENCE_ALT) / 100;
207
- size /= 100;
208
- horiz_pre /= 100;
209
- vert_pre /= 100;
210
-
211
- rdatastr = latlon2dms(lat, "NS") + " " +
212
- latlon2dms(lon, "EW") + " " +
213
- sprintf("%.2fm", altitude) + " " +
214
- sprintf("%.2fm", size) + " " +
215
- sprintf("%.2fm", horiz_pre) + " " +
216
- sprintf("%.2fm", vert_pre);
217
- else
218
- rdatastr = "; version " + @version + " not supported";
219
- end
220
- else
221
- rdatastr = '';
222
- end
223
-
224
- return rdatastr;
225
- end
226
-
227
- def self.decode_rdata(msg) #:nodoc: all
228
- version, = msg.get_unpack("C")
229
- if (version == 0)
230
- size, horiz_pre, vert_pre, latitude, longitude, altitude = msg.get_unpack('CCCNNN')
231
- size = precsize_ntoval(size)
232
- horiz_pre = precsize_ntoval(horiz_pre)
233
- vert_pre = precsize_ntoval(vert_pre)
234
- return self.new([version, size, horiz_pre, vert_pre, latitude, longitude, altitude])
235
- end
236
- end
237
-
238
- def encode_rdata(msg, canonical=false) #:nodoc: all
239
- msg.put_pack('C', @version)
240
- if (@version == 0)
241
- msg.put_pack('CCCNNN', precsize_valton(@size),
242
- precsize_valton(@horiz_pre), precsize_valton(@vert_pre),
243
- @latitude, @longitude, @altitude)
244
- end
245
- end
246
-
247
- def self.precsize_ntoval(prec)
248
- mantissa = ((prec >> 4) & 0x0f) % 10;
249
- exponent = (prec & 0x0f) % 10;
250
- return mantissa * POWEROFTEN[exponent];
251
- end
252
-
253
- def precsize_valton(val)
254
- exponent = 0;
255
- while (val >= 10)
256
- val /= 10;
257
- exponent+=1
258
- end
259
- return (val.round << 4) | (exponent & 0x0f);
260
- end
261
-
262
- end
263
- end
1
+ # --
2
+ # Copyright 2007 Nominet UK
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ # ++
16
+ module Dnsruby
17
+ class RR
18
+ # Class for DNS Location (LOC) resource records. See RFC 1876 for
19
+ # details.
20
+ class LOC < RR
21
+ ClassValue = nil #:nodoc: all
22
+ TypeValue = Types::LOC #:nodoc: all
23
+
24
+ # The version number of the representation; programs should
25
+ # always check this. Dnsruby currently supports only version 0.
26
+ attr_accessor :version
27
+ @version = 0
28
+
29
+ # The diameter of a sphere enclosing the described entity,
30
+ # in centimeters.
31
+ attr_accessor :size
32
+ # The horizontal precision of the data, in centimeters.
33
+ attr_accessor :horiz_pre
34
+ # The vertical precision of the data, in centimeters.
35
+ attr_accessor :vert_pre
36
+ # The latitude of the center of the sphere described by
37
+ # the size method, in thousandths of a second of arc. 2**31
38
+ # represents the equator; numbers above that are north latitude.
39
+ attr_accessor :latitude
40
+ # The longitude of the center of the sphere described by
41
+ # the size method, in thousandths of a second of arc. 2**31
42
+ # represents the prime meridian; numbers above that are east
43
+ # longitude.
44
+ attr_accessor :longitude
45
+ # The altitude of the center of the sphere described by
46
+ # the size method, in centimeters, from a base of 100,000m
47
+ # below the WGS 84 reference spheroid used by GPS.
48
+ attr_accessor :altitude
49
+ # Powers of 10 from 0 to 9 (used to speed up calculations).
50
+ POWEROFTEN = [1, 10, 100, 1_000, 10_000, 100_000, 1_000_000, 10_000_000, 100_000_000, 1_000_000_000]
51
+
52
+ # Reference altitude in centimeters (see RFC 1876).
53
+ REFERENCE_ALT = 100_000 * 100;
54
+
55
+ # Reference lat/lon (see RFC 1876).
56
+ REFERENCE_LATLON = 2**31;
57
+
58
+ # Conversions to/from thousandths of a degree.
59
+ CONV_SEC = 1000;
60
+ CONV_MIN = 60 * CONV_SEC;
61
+ CONV_DEG = 60 * CONV_MIN;
62
+
63
+ # Defaults (from RFC 1876, Section 3).
64
+ DEFAULT_MIN = 0;
65
+ DEFAULT_SEC = 0;
66
+ DEFAULT_SIZE = 1;
67
+ DEFAULT_HORIZ_PRE = 10_000;
68
+ DEFAULT_VERT_PRE = 10;
69
+
70
+
71
+ def latlon2dms(rawmsec, hems)
72
+ # Tried to use modulus here, but Perl dumped core if
73
+ # the value was >= 2**31.
74
+
75
+ abs = (rawmsec - REFERENCE_LATLON).abs;
76
+ deg = (abs / CONV_DEG).round;
77
+ abs -= deg * CONV_DEG;
78
+ min = (abs / CONV_MIN).round;
79
+ abs -= min * CONV_MIN;
80
+ sec = (abs / CONV_SEC).round; # $conv_sec
81
+ abs -= sec * CONV_SEC;
82
+ msec = abs;
83
+
84
+ hem = hems[(rawmsec >= REFERENCE_LATLON ? 0 : 1), 1]
85
+
86
+ return sprintf("%d %02d %02d.%03d %s", deg, min, sec, msec, hem);
87
+ end
88
+
89
+ def dms2latlon(deg, min, sec, hem)
90
+ retval=0
91
+
92
+ retval = (deg * CONV_DEG) + (min * CONV_MIN) + (sec * CONV_SEC).round;
93
+ retval = -retval if ((hem != nil) && ((hem == "S") || (hem == "W")));
94
+ retval += REFERENCE_LATLON;
95
+ return retval;
96
+ end
97
+
98
+ # Returns the latitude and longitude as floating-point degrees.
99
+ # Positive numbers represent north latitude or east longitude;
100
+ # negative numbers represent south latitude or west longitude.
101
+ #
102
+ # lat, lon = rr.latlon
103
+ # system("xearth", "-pos", "fixed #{lat} #{lon}")
104
+ #
105
+ def latlon
106
+ retlat, retlon = nil
107
+
108
+ if (@version == 0)
109
+ retlat = latlon2deg(@latitude);
110
+ retlon = latlon2deg(@longitude);
111
+ end
112
+
113
+ return retlat, retlon
114
+ end
115
+
116
+ def latlon2deg(rawmsec)
117
+ deg=0;
118
+
119
+ deg = (rawmsec - reference_latlon) / CONV_DEG;
120
+ return deg;
121
+ end
122
+
123
+ def from_data(data) #:nodoc: all
124
+ @version, @size, @horiz_pre, @vert_pre, @latitude, @longitude, @altitude = data
125
+ end
126
+
127
+ def from_string(string) #:nodoc: all
128
+ if (string &&
129
+ string =~ /^ (\d+) \s+ # deg lat
130
+ ((\d+) \s+)? # min lat
131
+ (([\d.]+) \s+)? # sec lat
132
+ (N|S) \s+ # hem lat
133
+ (\d+) \s+ # deg lon
134
+ ((\d+) \s+)? # min lon
135
+ (([\d.]+) \s+)? # sec lon
136
+ (E|W) \s+ # hem lon
137
+ (-?[\d.]+) m? # altitude
138
+ (\s+ ([\d.]+) m?)? # size
139
+ (\s+ ([\d.]+) m?)? # horiz precision
140
+ (\s+ ([\d.]+) m?)? # vert precision
141
+ /ix) #
142
+
143
+ size = DEFAULT_SIZE
144
+
145
+ # What to do for other versions?
146
+ version = 0;
147
+
148
+ horiz_pre = DEFAULT_HORIZ_PRE
149
+ vert_pre = DEFAULT_VERT_PRE
150
+ latdeg, latmin, latsec, lathem = $1.to_i, $3.to_i, $5.to_f, $6;
151
+ londeg, lonmin, lonsec, lonhem = $7.to_i, $9.to_i, $11.to_f, $12
152
+ alt = $13.to_i
153
+ if ($15)
154
+ size = $15.to_f
155
+ end
156
+ if ($17)
157
+ horiz_pre = $17.to_f
158
+ end
159
+ if ($19)
160
+ vert_pre = $19.to_f
161
+ end
162
+
163
+ latmin = DEFAULT_MIN unless latmin;
164
+ latsec = DEFAULT_SEC unless latsec;
165
+ lathem = lathem.upcase;
166
+
167
+ lonmin = DEFAULT_MIN unless lonmin;
168
+ lonsec = DEFAULT_SEC unless lonsec;
169
+ lonhem = lonhem.upcase
170
+
171
+ @version = version;
172
+ @size = size * 100;
173
+ @horiz_pre = horiz_pre * 100;
174
+ @vert_pre = vert_pre * 100;
175
+ @latitude = dms2latlon(latdeg, latmin, latsec, lathem);
176
+ @longitude = dms2latlon(londeg, lonmin, lonsec, lonhem);
177
+ @altitude = alt * 100 + REFERENCE_ALT;
178
+ end
179
+ end
180
+
181
+ def from_hash(hash) #:nodoc: all
182
+ super(hash)
183
+ if (@size == nil)
184
+ @size = DEFAULT_SIZE * 100
185
+ end
186
+ if @horiz_pre == nil
187
+ @horiz_pre = DEFAULT_HORIZ_PRE * 100
188
+ end
189
+ if @vert_pre == nil
190
+ @vert_pre = DEFAULT_VERT_PRE * 100
191
+ end
192
+ end
193
+
194
+ def rdata_to_string #:nodoc: all
195
+ rdatastr=""
196
+
197
+ if (defined?@version)
198
+ if (@version == 0)
199
+ lat = @latitude;
200
+ lon = @longitude;
201
+ altitude = @altitude;
202
+ size = @size;
203
+ horiz_pre = @horiz_pre;
204
+ vert_pre = @vert_pre;
205
+
206
+ altitude = (altitude - REFERENCE_ALT) / 100;
207
+ size /= 100;
208
+ horiz_pre /= 100;
209
+ vert_pre /= 100;
210
+
211
+ rdatastr = latlon2dms(lat, "NS") + " " +
212
+ latlon2dms(lon, "EW") + " " +
213
+ sprintf("%.2fm", altitude) + " " +
214
+ sprintf("%.2fm", size) + " " +
215
+ sprintf("%.2fm", horiz_pre) + " " +
216
+ sprintf("%.2fm", vert_pre);
217
+ else
218
+ rdatastr = "; version " + @version + " not supported";
219
+ end
220
+ else
221
+ rdatastr = '';
222
+ end
223
+
224
+ return rdatastr;
225
+ end
226
+
227
+ def self.decode_rdata(msg) #:nodoc: all
228
+ version, = msg.get_unpack("C")
229
+ if (version == 0)
230
+ size, horiz_pre, vert_pre, latitude, longitude, altitude = msg.get_unpack('CCCNNN')
231
+ size = precsize_ntoval(size)
232
+ horiz_pre = precsize_ntoval(horiz_pre)
233
+ vert_pre = precsize_ntoval(vert_pre)
234
+ return self.new([version, size, horiz_pre, vert_pre, latitude, longitude, altitude])
235
+ end
236
+ end
237
+
238
+ def encode_rdata(msg, canonical=false) #:nodoc: all
239
+ msg.put_pack('C', @version)
240
+ if (@version == 0)
241
+ msg.put_pack('CCCNNN', precsize_valton(@size),
242
+ precsize_valton(@horiz_pre), precsize_valton(@vert_pre),
243
+ @latitude, @longitude, @altitude)
244
+ end
245
+ end
246
+
247
+ def self.precsize_ntoval(prec)
248
+ mantissa = ((prec >> 4) & 0x0f) % 10;
249
+ exponent = (prec & 0x0f) % 10;
250
+ return mantissa * POWEROFTEN[exponent];
251
+ end
252
+
253
+ def precsize_valton(val)
254
+ exponent = 0;
255
+ while (val >= 10)
256
+ val /= 10;
257
+ exponent+=1
258
+ end
259
+ return (val.round << 4) | (exponent & 0x0f);
260
+ end
261
+
262
+ end
263
+ end
264
264
  end