nslookupot 0.0.6 → 0.0.10
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 +4 -4
- data/.github/workflows/ci.yml +1 -1
- data/.rubocop.yml +1 -1
- data/Gemfile +1 -0
- data/README.md +7 -7
- data/lib/nslookupot/cli.rb +27 -9
- data/lib/nslookupot/error.rb +12 -0
- data/lib/nslookupot/resolver.rb +22 -6
- data/lib/nslookupot/version.rb +1 -1
- data/lib/nslookupot.rb +3 -1
- data/nslookupot.gemspec +2 -1
- metadata +19 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 327221d555480cece10786485fe2dcdda611e1808b95a4cc4e350a666ac20fa9
|
4
|
+
data.tar.gz: 4132dc893b13642955b4cd830d73e98fadf4779ee03fd909abbf17ab83db3dc2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1bea793a0d39ffd71be4335e6fe67ae87531720ed95761134b016c87b09271de5f0231f181827fc4e3503b208b06154f84f3a700b01ac91492aa2047526588cb
|
7
|
+
data.tar.gz: c902c61d252da40c0467a32a2457ed7976617e78a7de0ac1c47ef76f493c6ae8fdb3cfa87fafad3259c5e302a2475d751385b2a4ed2e28f79a931314e3e946b3
|
data/.github/workflows/ci.yml
CHANGED
data/.rubocop.yml
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -4,21 +4,21 @@
|
|
4
4
|
[](https://github.com/thekuwayama/nslookupot/actions?workflow=CI)
|
5
5
|
[](https://codeclimate.com/github/thekuwayama/nslookupot/maintainability)
|
6
6
|
|
7
|
-
nslookupot is CLI that is `nslookup` over TLS (version 1.2).
|
7
|
+
nslookupot is CLI that is `nslookup` over TLS (version 1.3 or 1.2).
|
8
8
|
|
9
9
|
|
10
10
|
## Installation
|
11
11
|
|
12
12
|
The gem is available at [rubygems.org](https://rubygems.org/gems/nslookupot). You can install with:
|
13
13
|
|
14
|
-
```
|
14
|
+
```sh-session
|
15
15
|
$ gem install nslookupot
|
16
16
|
```
|
17
17
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
-
```
|
21
|
+
```sh-session
|
22
22
|
$ nslookupot --help
|
23
23
|
Usage: nslookupot [options] name
|
24
24
|
-s, --server VALUE the name server IP address (default 1.1.1.1)
|
@@ -30,7 +30,7 @@ Usage: nslookupot [options] name
|
|
30
30
|
|
31
31
|
You can run it the following:
|
32
32
|
|
33
|
-
```
|
33
|
+
```sh-session
|
34
34
|
$ nslookupot example.com
|
35
35
|
Address: 1.1.1.1#853
|
36
36
|
--
|
@@ -42,7 +42,7 @@ Ttl: 2860
|
|
42
42
|
|
43
43
|
If you need to resolve other than A type, you can run it the following:
|
44
44
|
|
45
|
-
```
|
45
|
+
```sh-session
|
46
46
|
$ nslookupot --type=cname www.youtube.com
|
47
47
|
Address: 1.1.1.1#853
|
48
48
|
--
|
@@ -54,7 +54,7 @@ Ttl: 1358
|
|
54
54
|
|
55
55
|
If you need to query to `8.8.8.8`, you can run it the following:
|
56
56
|
|
57
|
-
```
|
57
|
+
```sh-session
|
58
58
|
$ nslookupot --server=8.8.8.8 --port=853 --hostname=dns.google www.google.com
|
59
59
|
Address: 8.8.8.8#853
|
60
60
|
--
|
@@ -66,7 +66,7 @@ Ttl: 223
|
|
66
66
|
|
67
67
|
If you need to query to `9.9.9.9`, you can run it the following:
|
68
68
|
|
69
|
-
```
|
69
|
+
```sh-session
|
70
70
|
$ nslookupot --server=9.9.9.9 --port=853 --hostname=quad9.net www.quad9.net
|
71
71
|
Address: 9.9.9.9#853
|
72
72
|
--
|
data/lib/nslookupot/cli.rb
CHANGED
@@ -4,6 +4,7 @@ require 'optparse'
|
|
4
4
|
|
5
5
|
module Nslookupot
|
6
6
|
class CLI
|
7
|
+
# rubocop: disable Metrics/AbcSize
|
7
8
|
# rubocop: disable Metrics/MethodLength
|
8
9
|
def parse_options(argv = ARGV)
|
9
10
|
op = OptionParser.new
|
@@ -62,25 +63,26 @@ module Nslookupot
|
|
62
63
|
args = op.parse(argv)
|
63
64
|
rescue OptionParser::InvalidOption => e
|
64
65
|
warn op.to_s
|
65
|
-
warn "
|
66
|
+
warn "** #{e.message}"
|
66
67
|
exit 1
|
67
68
|
end
|
68
69
|
|
69
70
|
begin
|
70
71
|
type = s2typeclass(type)
|
71
72
|
rescue NameError
|
72
|
-
warn "
|
73
|
+
warn "** unknown query type: #{type.upcase}"
|
73
74
|
exit 1
|
74
75
|
end
|
75
76
|
|
76
77
|
if args.size != 1
|
77
78
|
warn op.to_s
|
78
|
-
warn '
|
79
|
+
warn '** `name` argument is not specified'
|
79
80
|
exit 1
|
80
81
|
end
|
81
82
|
|
82
83
|
[opts, args[0], type]
|
83
84
|
end
|
85
|
+
# rubocop: enable Metrics/AbcSize
|
84
86
|
# rubocop: enable Metrics/MethodLength
|
85
87
|
|
86
88
|
def s2typeclass(s)
|
@@ -90,21 +92,37 @@ module Nslookupot
|
|
90
92
|
rr
|
91
93
|
end
|
92
94
|
|
95
|
+
# rubocop: disable Metrics/AbcSize
|
93
96
|
def run
|
94
97
|
opts, name, type = parse_options
|
95
98
|
|
96
|
-
resolver =
|
97
|
-
puts '
|
98
|
-
puts '
|
99
|
-
|
99
|
+
resolver = Resolver.new(**opts)
|
100
|
+
puts 'Server:'.ljust(16) + opts[:server]
|
101
|
+
puts 'Address:'.ljust(16) + "#{opts[:server]}\##{opts[:port]}"
|
102
|
+
puts
|
103
|
+
|
104
|
+
result = nil
|
105
|
+
begin
|
106
|
+
result = resolver.resolve_resources(name, type)
|
107
|
+
rescue Error::DNNotFound
|
108
|
+
t = type.name.split('::').last
|
109
|
+
warn "** Not Found: (domain, type) = (#{name}, #{t})"
|
110
|
+
exit 1
|
111
|
+
rescue Error::DoTServerUnavailable => e
|
112
|
+
warn "** DoT Server Unavailable: #{e.message}"
|
113
|
+
exit 1
|
114
|
+
end
|
115
|
+
|
116
|
+
result.each do |rr|
|
100
117
|
puts 'Name:'.ljust(16) + name
|
101
118
|
rr.instance_variables.each do |var|
|
102
|
-
k =
|
119
|
+
k = "#{var[1..].capitalize}:".ljust(16)
|
103
120
|
v = rr.instance_variable_get(var).to_s
|
104
121
|
puts k + v
|
105
122
|
end
|
106
|
-
puts
|
123
|
+
puts
|
107
124
|
end
|
108
125
|
end
|
126
|
+
# rubocop: enable Metrics/AbcSize
|
109
127
|
end
|
110
128
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Nslookupot
|
4
|
+
module Error
|
5
|
+
# Generic error, common for all classes under Nslookupot::Error module.
|
6
|
+
class Error < StandardError; end
|
7
|
+
|
8
|
+
class DNNotFound < Error; end
|
9
|
+
|
10
|
+
class DoTServerUnavailable < Error; end
|
11
|
+
end
|
12
|
+
end
|
data/lib/nslookupot/resolver.rb
CHANGED
@@ -35,14 +35,26 @@ module Nslookupot
|
|
35
35
|
# @param name [String]
|
36
36
|
# @param typeclass [Resolv::DNS::Resource::IN constant]
|
37
37
|
#
|
38
|
+
# @raise [Nslookupot::Error]
|
39
|
+
#
|
38
40
|
# @return [Array of Resolv::DNS::Resource]
|
39
41
|
def resolve_resources(name, typeclass)
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
42
|
+
begin
|
43
|
+
sock = gen_sock
|
44
|
+
send_msg(sock, name, typeclass)
|
45
|
+
msg = recv_msg(sock)
|
46
|
+
sock.close
|
47
|
+
rescue SocketError, Errno::ECONNREFUSED
|
48
|
+
err_msg = "#{@server}\##{@port} connection refused"
|
49
|
+
raise Error::DoTServerUnavailable.new, err_msg
|
50
|
+
rescue OpenSSL::SSL::SSLError => e
|
51
|
+
raise Error::DoTServerUnavailable.new, e.message
|
52
|
+
end
|
53
|
+
|
54
|
+
result = msg.answer.map(&:last)
|
55
|
+
raise Error::DNNotFound if result.empty?
|
44
56
|
|
45
|
-
|
57
|
+
result
|
46
58
|
end
|
47
59
|
|
48
60
|
private
|
@@ -75,7 +87,11 @@ module Nslookupot
|
|
75
87
|
# @return [OpenSSL::SSL::SSLSocket]
|
76
88
|
def gen_sock
|
77
89
|
ts = TCPSocket.new(@server, @port)
|
78
|
-
ctx = OpenSSL::SSL::SSLContext.new
|
90
|
+
ctx = OpenSSL::SSL::SSLContext.new
|
91
|
+
ctx.min_version = OpenSSL::SSL::TLS1_2_VERSION
|
92
|
+
ctx.max_version = OpenSSL::SSL::TLS1_2_VERSION
|
93
|
+
ctx.max_version = OpenSSL::SSL::TLS1_3_VERSION \
|
94
|
+
if defined? OpenSSL::SSL::TLS1_3_VERSION
|
79
95
|
ctx.alpn_protocols = ['dot']
|
80
96
|
sock = OpenSSL::SSL::SSLSocket.new(ts, ctx)
|
81
97
|
sock.sync_close = true
|
data/lib/nslookupot/version.rb
CHANGED
data/lib/nslookupot.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'caa_rr_patch'
|
4
3
|
require 'resolv'
|
4
|
+
require 'caa_rr_patch'
|
5
|
+
require 'svcb_rr_patch'
|
5
6
|
require 'socket'
|
6
7
|
require 'openssl'
|
7
8
|
require 'optparse'
|
8
9
|
|
9
10
|
require 'nslookupot/version'
|
11
|
+
require 'nslookupot/error'
|
10
12
|
require 'nslookupot/resolver'
|
11
13
|
require 'nslookupot/cli'
|
data/nslookupot.gemspec
CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.description = spec.summary
|
14
14
|
spec.homepage = 'https://github.com/thekuwayama/nslookupot'
|
15
15
|
spec.license = 'MIT'
|
16
|
-
spec.required_ruby_version = '>=2.
|
16
|
+
spec.required_ruby_version = '>=2.7.0'
|
17
17
|
|
18
18
|
spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
19
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
@@ -24,4 +24,5 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_development_dependency 'bundler'
|
25
25
|
spec.add_dependency 'caa_rr_patch'
|
26
26
|
spec.add_dependency 'openssl'
|
27
|
+
spec.add_dependency 'svcb_rr_patch'
|
27
28
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nslookupot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- thekuwayama
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: svcb_rr_patch
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
description: nslookup over TLS
|
56
70
|
email:
|
57
71
|
- thekuwayama@gmail.com
|
@@ -70,6 +84,7 @@ files:
|
|
70
84
|
- exe/nslookupot
|
71
85
|
- lib/nslookupot.rb
|
72
86
|
- lib/nslookupot/cli.rb
|
87
|
+
- lib/nslookupot/error.rb
|
73
88
|
- lib/nslookupot/resolver.rb
|
74
89
|
- lib/nslookupot/version.rb
|
75
90
|
- nslookupot.gemspec
|
@@ -88,14 +103,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
88
103
|
requirements:
|
89
104
|
- - ">="
|
90
105
|
- !ruby/object:Gem::Version
|
91
|
-
version: 2.
|
106
|
+
version: 2.7.0
|
92
107
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
108
|
requirements:
|
94
109
|
- - ">="
|
95
110
|
- !ruby/object:Gem::Version
|
96
111
|
version: '0'
|
97
112
|
requirements: []
|
98
|
-
rubygems_version: 3.
|
113
|
+
rubygems_version: 3.2.22
|
99
114
|
signing_key:
|
100
115
|
specification_version: 4
|
101
116
|
summary: nslookup over TLS
|