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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b9f55a82dd8b59575552ff6ec51ce460d3960edc9802ae7b0ad7b34acf9ecdb2
4
- data.tar.gz: f5fafc615a8bcd14b230f29ca719dd43bebd48a4e91bbabd449936ad1ef20df2
3
+ metadata.gz: 327221d555480cece10786485fe2dcdda611e1808b95a4cc4e350a666ac20fa9
4
+ data.tar.gz: 4132dc893b13642955b4cd830d73e98fadf4779ee03fd909abbf17ab83db3dc2
5
5
  SHA512:
6
- metadata.gz: 4f9c2a07724a2f6ee9cb15b396360bd47e5a33ca7b17eb3be151cbc93d1c2111a91c60dbe362a7277af0cc646a556279ccfca08e7e3328cade8acb453bcdd273
7
- data.tar.gz: 3663e91a31ac98e0d638be5bc182b66c776322fe7aeb0d6ad92d6cfea6a4d6b4d7a0ea885935cf797534d24f9c69eb1d622127765fecc088d86b842209e95de7
6
+ metadata.gz: 1bea793a0d39ffd71be4335e6fe67ae87531720ed95761134b016c87b09271de5f0231f181827fc4e3503b208b06154f84f3a700b01ac91492aa2047526588cb
7
+ data.tar.gz: c902c61d252da40c0467a32a2457ed7976617e78a7de0ac1c47ef76f493c6ae8fdb3cfa87fafad3259c5e302a2475d751385b2a4ed2e28f79a931314e3e946b3
@@ -13,7 +13,7 @@ jobs:
13
13
  runs-on: ubuntu-latest
14
14
  strategy:
15
15
  matrix:
16
- ruby-version: ['2.6.x', '2.7.x']
16
+ ruby-version: ['2.7.x', '3.0.x', '3.1.x']
17
17
  steps:
18
18
  - name: Set up Ruby
19
19
  uses: actions/setup-ruby@v1
data/.rubocop.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.6
2
+ TargetRubyVersion: 2.7
3
3
 
4
4
  Style/Documentation:
5
5
  Enabled: false
data/Gemfile CHANGED
@@ -5,6 +5,7 @@ source 'https://rubygems.org'
5
5
  gem 'caa_rr_patch'
6
6
  gem 'openssl'
7
7
  gem 'rake'
8
+ gem 'svcb_rr_patch'
8
9
 
9
10
  group :test do
10
11
  gem 'byebug'
data/README.md CHANGED
@@ -4,21 +4,21 @@
4
4
  [![CI](https://github.com/thekuwayama/nslookupot/workflows/CI/badge.svg)](https://github.com/thekuwayama/nslookupot/actions?workflow=CI)
5
5
  [![Maintainability](https://api.codeclimate.com/v1/badges/5df9157757f5a0bf1623/maintainability)](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
- ```bash
14
+ ```sh-session
15
15
  $ gem install nslookupot
16
16
  ```
17
17
 
18
18
 
19
19
  ## Usage
20
20
 
21
- ```bash
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
- ```bash
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
- ```bash
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
- ```bash
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
- ```bash
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
  --
@@ -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 "error: #{e.message}"
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 "error: unknown query type #{type}"
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 'error: number of arguments is not 1'
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 = Nslookupot::Resolver.new(**opts)
97
- puts 'Address:'.ljust(16) + opts[:server] + '#' + opts[:port].to_s
98
- puts '--'
99
- resolver.resolve_resources(name, type).each do |rr|
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 = (var[1..].capitalize + ':').ljust(16)
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
@@ -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
- sock = gen_sock
41
- send_msg(sock, name, typeclass)
42
- msg = recv_msg(sock)
43
- sock.close
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
- msg.answer.map(&:last)
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('TLSv1_2')
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Nslookupot
4
- VERSION = '0.0.6'
4
+ VERSION = '0.0.10'
5
5
  end
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.6.0'
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.6
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: 2020-09-22 00:00:00.000000000 Z
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.6.0
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.1.2
113
+ rubygems_version: 3.2.22
99
114
  signing_key:
100
115
  specification_version: 4
101
116
  summary: nslookup over TLS