ddig 0.2.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
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