ddig 0.2.0 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e1a65973ea90a0410cf7c2bd8846431d1b46f6bfec521cde944deba86c83effc
4
- data.tar.gz: 4eaf90cdfabfe53095f4a5f4ca5f034b0d79296e0ff64da53a00cd4c71de6d04
3
+ metadata.gz: a776d193cef1eb47509ef1979fe17267088c418c89320e1f6db61da04e8d5f4c
4
+ data.tar.gz: 463dc9f0efa82b6b1bde2e7641fe2fe866b470faae033fbadd8eadca72479a81
5
5
  SHA512:
6
- metadata.gz: 675a844c854c9bb5d63cac33742cc88e7a712356b41dc1fd61c4a646112ee1080a887218b3f8a6c949c0277c2d7f01851d1f30f3258138c2a57c467f4570c448
7
- data.tar.gz: bdf9aa4945b93c190716a5809829cc11e2fd58584d0620b48f0793ae5085b3cb5e77b6f0cac2c28303f2dbb3e1c988e3b5f989f80de49049cb6fe5d3420212a8
6
+ metadata.gz: 175b5193ff75e92e5a5d3a07f9589918a6a943dae64b6002b5ead5f3af205cbbd6d49512d5607c86ed55e5afcbca4d40ee89de5a2095161c1eb3ebe67415c1d8
7
+ data.tar.gz: c633c6733c13cc5363e176bb3d7bb9dac66e14b0fea6072729d6d1692e2517a7d4d1ac68b818b342c4ff24d33958753e701e8916fdd48d00ec169492b16778fc
data/README.md CHANGED
@@ -130,6 +130,7 @@ Usage: ddig [options] hostname
130
130
  --dot use resolve type of dot
131
131
  --doh-h1 use resolve type of doh (http/1.1)
132
132
  --doh-path=doh-path doh service path
133
+ --ddr discover designated resolvers via ddr (discovery of designated resolvers)
133
134
  -4, --ipv4 use IPv4 query transport only
134
135
  -6, --ipv6 use IPv6 query transport only
135
136
  -@ipaddress|doh-hostname, nameserver
@@ -142,6 +143,43 @@ Usage: ddig [options] hostname
142
143
  --version show version.
143
144
  ```
144
145
 
146
+ ```sh
147
+ $ ddig --nameserver 8.8.8.8 dns.google
148
+ # Do53 (IPv4)
149
+ dns.google A 8.8.4.4
150
+ dns.google A 8.8.8.8
151
+ dns.google AAAA 2001:4860:4860::8844
152
+ dns.google AAAA 2001:4860:4860::8888
153
+
154
+ # SERVER: 8.8.8.8
155
+
156
+ # DDR
157
+ ## DDR (#0) - dot: dns.google:853 (8.8.4.4), unencrypted_resolver: 8.8.8.8, verify cert: true
158
+ dns.google A 8.8.4.4
159
+ dns.google A 8.8.8.8
160
+ dns.google AAAA 2001:4860:4860::8844
161
+ dns.google AAAA 2001:4860:4860::8888
162
+
163
+ # SERVER(Address): 8.8.4.4
164
+ # PORT: 853
165
+
166
+ ...
167
+
168
+ # SERVER(Address): 2001:4860:4860::8888
169
+ # PORT: 853
170
+
171
+ ## DDR (#6) - h2: dns.google:443 (2001:4860:4860::8888), path: /dns-query{?dns}, unencrypted_resolver: 8.8.8.8, verify cert: true
172
+ dns.google A 8.8.8.8
173
+ dns.google A 8.8.4.4
174
+ dns.google AAAA 2001:4860:4860::8844
175
+ dns.google AAAA 2001:4860:4860::8888
176
+
177
+ # SERVER(Hostname): 2001:4860:4860::8888
178
+ # SERVER(Path): /dns-query{?dns}
179
+ # PORT: 443
180
+ ...
181
+ ```
182
+
145
183
  - UDP(Do53)
146
184
  ```sh
147
185
  $ ddig --udp --nameserver 8.8.8.8 dns.google
@@ -178,6 +216,25 @@ dns.google AAAA 2001:4860:4860::8844
178
216
  # PORT: 443
179
217
  ```
180
218
 
219
+ - DDR (Discovery of Designated Resolvers)
220
+ ```sh
221
+ $ ddig --ddr --nameserver 8.8.8.8
222
+ dot: dns.google:853 (8.8.8.8), unencrypted_resolver: 8.8.8.8, verify cert: true
223
+ dot: dns.google:853 (8.8.4.4), unencrypted_resolver: 8.8.8.8, verify cert: true
224
+ dot: dns.google:853 (2001:4860:4860::8844), unencrypted_resolver: 8.8.8.8, verify cert: true
225
+ dot: dns.google:853 (2001:4860:4860::8888), unencrypted_resolver: 8.8.8.8, verify cert: true
226
+ h2: dns.google:443 (8.8.8.8), path: /dns-query{?dns}, unencrypted_resolver: 8.8.8.8, verify cert: true
227
+ h2: dns.google:443 (8.8.4.4), path: /dns-query{?dns}, unencrypted_resolver: 8.8.8.8, verify cert: true
228
+ h2: dns.google:443 (2001:4860:4860::8844), path: /dns-query{?dns}, unencrypted_resolver: 8.8.8.8, verify cert: true
229
+ h2: dns.google:443 (2001:4860:4860::8888), path: /dns-query{?dns}, unencrypted_resolver: 8.8.8.8, verify cert: true
230
+ h3: dns.google:443 (8.8.4.4), path: /dns-query{?dns}, unencrypted_resolver: 8.8.8.8, verify cert: true
231
+ h3: dns.google:443 (8.8.8.8), path: /dns-query{?dns}, unencrypted_resolver: 8.8.8.8, verify cert: true
232
+ h3: dns.google:443 (2001:4860:4860::8888), path: /dns-query{?dns}, unencrypted_resolver: 8.8.8.8, verify cert: true
233
+ h3: dns.google:443 (2001:4860:4860::8844), path: /dns-query{?dns}, unencrypted_resolver: 8.8.8.8, verify cert: true
234
+
235
+ # SERVER: 8.8.8.8
236
+ ```
237
+
181
238
  ## Development
182
239
 
183
240
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/lib/ddig/cli.rb CHANGED
@@ -13,7 +13,7 @@ module Ddig
13
13
 
14
14
  parse_options
15
15
 
16
- if @hostname.nil?
16
+ unless valid_options?
17
17
  puts @option_parser
18
18
  exit
19
19
  end
@@ -23,11 +23,12 @@ module Ddig
23
23
  @option_parser = OptionParser.new do |opts|
24
24
  opts.banner = "Usage: ddig [options] hostname"
25
25
 
26
- opts.on("-d", "--dns-type={all|do53|dot}", "resolve type (default: all)") { |v| @options[:dns_type] = v }
26
+ opts.on("-d", "--dns-type={all|do53|dot|doh_h1}", "resolve type (default: all)") { |v| @options[:dns_type] = v }
27
27
  opts.on("--udp", "use resolve type of udp(do53)") { |v| @options[:dns_type] = 'do53' }
28
28
  opts.on("--dot", "use resolve type of dot") { |v| @options[:dns_type] = 'dot' }
29
29
  opts.on("--doh-h1", "use resolve type of doh (http/1.1)") { |v| @options[:dns_type] = 'doh_h1' }
30
30
  opts.on("--doh-path=doh-path", "doh service path") { |v| @options[:doh_path] = v }
31
+ opts.on("--ddr", "discover designated resolvers via ddr (discovery of designated resolvers)") { |v| @options[:ddr] = v }
31
32
  opts.on("-4", "--ipv4", "use IPv4 query transport only") { |v| @options[:ipv4] = v }
32
33
  opts.on("-6", "--ipv6", "use IPv6 query transport only") { |v| @options[:ipv6] = v }
33
34
  opts.on("-@", "--nameserver=ipaddress|doh-hostname", "nameserver") { |v| @options[:nameserver] = v }
@@ -46,12 +47,29 @@ module Ddig
46
47
  @hostname = @args[0]
47
48
  end
48
49
 
50
+ def valid_options?
51
+ if @hostname.nil?
52
+ if @options[:ddr]
53
+ return true
54
+ end
55
+
56
+ return false
57
+ end
58
+
59
+ return true
60
+ end
61
+
49
62
  def exec
50
63
  if @options[:ipv4] || @options[:ipv6]
51
64
  @use_ipv4 = @options[:ipv4] || false
52
65
  @use_ipv6 = @options[:ipv6] || false
53
66
  end
54
67
 
68
+ if @options[:ddr]
69
+ resolve_ddr
70
+ exit
71
+ end
72
+
55
73
  case @options[:dns_type]
56
74
  when "all"
57
75
  resolve_all
@@ -69,9 +87,27 @@ module Ddig
69
87
 
70
88
  if @options[:format] == 'json'
71
89
  # TODO: to_json
72
- puts @ddig
73
90
  else
74
- puts @ddig
91
+ unless @ddig[:do53][:ipv4].nil?
92
+ puts "# Do53 (IPv4)"
93
+ @ddig[:do53][:ipv4].to_cli
94
+ puts
95
+ end
96
+
97
+ unless @ddig[:do53][:ipv6].nil?
98
+ puts "# Do53 (IPv6)"
99
+ @ddig[:do53][:ipv6].to_cli
100
+ puts
101
+ end
102
+
103
+ unless @ddig[:ddr].nil?
104
+ puts "# DDR"
105
+ @ddig[:ddr].each_with_index do |designated_resolver, index|
106
+ puts "## DDR (##{index}) - #{designated_resolver.to_s}"
107
+ designated_resolver.to_cli
108
+ puts
109
+ end
110
+ end
75
111
  end
76
112
  end
77
113
 
@@ -84,35 +120,13 @@ module Ddig
84
120
  exit
85
121
  end
86
122
 
87
- do53.a.each do |address|
88
- rr_type = 'A'
89
- puts "#{@hostname}\t#{rr_type}\t#{address}"
90
- end
91
- do53.aaaa.each do |address|
92
- rr_type = 'AAAA'
93
- puts "#{@hostname}\t#{rr_type}\t#{address}"
94
- end
95
-
96
- puts
97
- puts "# SERVER: #{do53.nameservers.join(', ')}"
123
+ do53.to_cli
98
124
  end
99
125
 
100
126
  def resolve_dot
101
127
  dot = Ddig::Resolver::Dot.new(hostname: @hostname, server: @options[:nameserver], port: @options[:port]).lookup
102
128
 
103
- dot.a.each do |address|
104
- rr_type = 'A'
105
- puts "#{@hostname}\t#{rr_type}\t#{address}"
106
- end
107
- dot.aaaa.each do |address|
108
- rr_type = 'AAAA'
109
- puts "#{@hostname}\t#{rr_type}\t#{address}"
110
- end
111
-
112
- puts
113
- puts "# SERVER(Address): #{dot.server}"
114
- #puts "# SERVER(Hostname): #{dot.server_name}"
115
- puts "# PORT: #{dot.port}"
129
+ dot.to_cli
116
130
  end
117
131
 
118
132
  def resolve_doh_h1
@@ -123,19 +137,14 @@ module Ddig
123
137
 
124
138
  doh = Ddig::Resolver::DohH1.new(hostname: @hostname, server: @options[:nameserver], dohpath: @options[:doh_path], port: @options[:port]).lookup
125
139
 
126
- doh.a.each do |address|
127
- rr_type = 'A'
128
- puts "#{@hostname}\t#{rr_type}\t#{address}"
129
- end
130
- doh.aaaa.each do |address|
131
- rr_type = 'AAAA'
132
- puts "#{@hostname}\t#{rr_type}\t#{address}"
133
- end
140
+ doh.to_cli
141
+ end
142
+
143
+ def resolve_ddr
144
+ ip = Ddig::Ip.new(use_ipv4: @use_ipv4, use_ipv6: @use_ipv6)
145
+ ddr = Ddig::Ddr.new(nameservers: @options[:nameserver], ip: ip.ip_type)
134
146
 
135
- puts
136
- puts "# SERVER(Hostname): #{doh.server}"
137
- puts "# SERVER(Path): #{doh.dohpath}"
138
- puts "# PORT: #{doh.port}"
147
+ ddr.to_cli
139
148
  end
140
149
  end
141
150
  end
@@ -3,6 +3,7 @@ module Ddig
3
3
  class DesignatedResolver
4
4
  attr_reader :unencrypted_resolver, :target, :protocol, :port, :dohpath, :address, :ip
5
5
  attr_reader :verify_cert
6
+ attr_reader :hostname, :a, :aaaa, :resolver, :errors
6
7
 
7
8
  PROTOCOLS = ['http/1.1', 'h2', 'h3', 'dot', 'doq']
8
9
 
@@ -30,13 +31,53 @@ module Ddig
30
31
  @verify_cert.verify
31
32
  end
32
33
 
34
+ def lookup(hostname)
35
+ @hostname = hostname
36
+ @errors = []
37
+
38
+ case @protocol
39
+ when 'dot'
40
+ @resolver = Ddig::Resolver::Dot.new(hostname: @hostname, server: @address, server_name: @target, port: @port).lookup
41
+
42
+ unless @resolver.nil?
43
+ @a = @resolver.a
44
+ @aaaa = @resolver.aaaa
45
+
46
+ return self
47
+ end
48
+
49
+ when 'http/1.1', 'h2', 'h3'
50
+ @resolver = Ddig::Resolver::DohH1.new(hostname: @hostname, server: @address, address: @address, dohpath: @dohpath, port: @port).lookup
51
+
52
+ unless @resolver.nil?
53
+ @a = @resolver.a
54
+ @aaaa = @resolver.aaaa
55
+
56
+ return self
57
+ end
58
+
59
+ when 'doq'
60
+ @errors << "#{@protocol} is not supportted protocol"
61
+ end
62
+ end
63
+
64
+ def to_cli
65
+ @resolver.to_cli
66
+ end
67
+
68
+ def to_s
69
+ if ['http/1.1', 'h2', 'h3'].include?(@protocol)
70
+ "#{@protocol}: #{@target}:#{@port} (#{@address}),\tpath: #{@dohpath},\tunencrypted_resolver: #{@unencrypted_resolver}, \tverify cert: #{@verify_cert.verify}"
71
+ else
72
+ "#{@protocol}: #{@target}:#{@port} (#{@address}),\tunencrypted_resolver: #{@unencrypted_resolver}, \tverify cert: #{@verify_cert.verify}"
73
+ end
74
+ end
75
+
33
76
  # Set default port by protocol
34
77
  # ref: https://www.rfc-editor.org/rfc/rfc9461.html#section-4.2
35
78
  def set_default_port
36
79
  case @protocol
37
- when 'http/1.1'
38
- @port = 80
39
- when 'h2', 'h3'
80
+ when 'http/1.1', 'h2', 'h3'
40
81
  @port = 443
41
82
  when 'dot', 'doq'
42
83
  @port = 853
data/lib/ddig/ddr.rb CHANGED
@@ -129,6 +129,15 @@ module Ddig
129
129
  end
130
130
  end
131
131
 
132
+ def to_cli
133
+ @designated_resolvers.each do |designated_resolver|
134
+ puts designated_resolver.to_s
135
+ end
136
+
137
+ puts
138
+ puts "# SERVER: #{@nameservers.join(', ')}"
139
+ end
140
+
132
141
  def set_nameservers
133
142
  @nameservers = @nameserver.servers
134
143
 
@@ -33,6 +33,20 @@ module Ddig
33
33
  self
34
34
  end
35
35
 
36
+ def to_cli
37
+ @a.each do |address|
38
+ rr_type = 'A'
39
+ puts "#{@hostname}\t#{rr_type}\t#{address}"
40
+ end
41
+ @aaaa.each do |address|
42
+ rr_type = 'AAAA'
43
+ puts "#{@hostname}\t#{rr_type}\t#{address}"
44
+ end
45
+
46
+ puts
47
+ puts "# SERVER: #{@nameservers.join(', ')}"
48
+ end
49
+
36
50
  def set_nameservers
37
51
  @nameservers = @nameserver.servers
38
52
 
@@ -56,6 +56,22 @@ module Ddig
56
56
  return []
57
57
  end
58
58
  end
59
+
60
+ def to_cli
61
+ @a.each do |address|
62
+ rr_type = 'A'
63
+ puts "#{@hostname}\t#{rr_type}\t#{address}"
64
+ end
65
+ @aaaa.each do |address|
66
+ rr_type = 'AAAA'
67
+ puts "#{@hostname}\t#{rr_type}\t#{address}"
68
+ end
69
+
70
+ puts
71
+ puts "# SERVER(Hostname): #{@server}"
72
+ puts "# SERVER(Path): #{@dohpath}"
73
+ puts "# PORT: #{@port}"
74
+ end
59
75
  end
60
76
  end
61
77
  end
@@ -74,6 +74,22 @@ module Ddig
74
74
  ssl_socket
75
75
  end
76
76
  end
77
+
78
+ def to_cli
79
+ @a.each do |address|
80
+ rr_type = 'A'
81
+ puts "#{@hostname}\t#{rr_type}\t#{address}"
82
+ end
83
+ @aaaa.each do |address|
84
+ rr_type = 'AAAA'
85
+ puts "#{@hostname}\t#{rr_type}\t#{address}"
86
+ end
87
+
88
+ puts
89
+ puts "# SERVER(Address): #{@server}"
90
+ #puts "# SERVER(Hostname): #{@server_name}"
91
+ puts "# PORT: #{@port}"
92
+ end
77
93
  end
78
94
  end
79
95
  end
data/lib/ddig/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ddig
4
- VERSION = "0.2.0"
4
+ VERSION = "0.3.1"
5
5
  end
data/lib/ddig.rb CHANGED
@@ -24,6 +24,9 @@ module Ddig
24
24
  @do53_ipv6 = Ddig::Resolver::Do53.new(hostname: @hostname, nameservers: @nameserver.servers, ip: :ipv6).lookup unless @ip.ip_type == :ipv4
25
25
 
26
26
  @ddr = Ddig::Ddr.new(nameservers: @nameservers, ip: @ip.ip_type)
27
+ @ddr.designated_resolvers.each do |designated_resolver|
28
+ designated_resolver.lookup(@hostname)
29
+ end
27
30
 
28
31
  {
29
32
  do53: {
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ddig
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taketo Takashima
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-04-29 00:00:00.000000000 Z
11
+ date: 2024-05-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: resolv
@@ -86,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
86
  - !ruby/object:Gem::Version
87
87
  version: '0'
88
88
  requirements: []
89
- rubygems_version: 3.5.3
89
+ rubygems_version: 3.5.9
90
90
  signing_key:
91
91
  specification_version: 4
92
92
  summary: DNS lookup utility for Ruby