tansaku 1.1.0 → 1.3.0

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: a117357045f40d3f48c578da338c27d4c4e7c5945fb58f9ed5ee1ea5351d7230
4
- data.tar.gz: c877f44ac8d888c25ed1c272e461bb53976c75bf191acf96dce0cc82493dd11f
3
+ metadata.gz: e7814e8eceaa52875d651e478c0e5fa000248441158ef3f59dda8a851c02d4bc
4
+ data.tar.gz: be7b44389bcf0cf1208336075dd5feaeecc11b88d1d8ffe3efb5f552206baa70
5
5
  SHA512:
6
- metadata.gz: 7f67a140d2437f7431268890024e67f3bba2e10a5dc7519f6888107fef1c564c1dcc694573d42549ba5f8640a9e08c9fa20ba29024ce3fe167bf6e55d877cc54
7
- data.tar.gz: 61785a2947f593c20b8074ad467b1e7326cbea5310fdec0c46a82d1c81139d8f446488766ea3a7f901494ede523c93740a9d67b4eba1b653888edbaf7e7cc2be
6
+ metadata.gz: 36a13143014938b72714acaa0a103ba4eee8c040597297082f44062356ea3e9aa037fa547dd5d60461aaf1017e45b7727ec50eccc16c768ef39cb579c39eaf2a
7
+ data.tar.gz: bb4e92fa7b71ebb6878ae1a6bf4c28401ce0ac05d8a13626459e34f6f5a597c5108079c0141bc15ec759d430abb1e2c403986377d37131ce122fa9cb28a2074d
@@ -0,0 +1,41 @@
1
+ name: Ruby CI
2
+
3
+ on: [pull_request]
4
+
5
+ jobs:
6
+ test:
7
+ runs-on: ubuntu-latest
8
+
9
+ strategy:
10
+ fail-fast: false
11
+ matrix:
12
+ ruby: [2.7, "3.0", 3.1]
13
+
14
+ steps:
15
+ - uses: actions/checkout@v3
16
+ - name: Set up Ruby
17
+ uses: ruby/setup-ruby@v1
18
+ with:
19
+ ruby-version: ${{ matrix.ruby }}
20
+ bundler-cache: true
21
+ - name: Build and test with Rake
22
+ run: |
23
+ bundle exec rake
24
+
25
+ - name: Coveralls Parallel
26
+ uses: coverallsapp/github-action@master
27
+ with:
28
+ github-token: ${{ secrets.github_token }}
29
+ flag-name: run-${{ matrix.ruby-version }}
30
+ parallel: true
31
+
32
+ coverage:
33
+ name: Coverage
34
+ needs: test
35
+ runs-on: ubuntu-latest
36
+ steps:
37
+ - name: Coveralls Finished
38
+ uses: coverallsapp/github-action@master
39
+ with:
40
+ github-token: ${{ secrets.github_token }}
41
+ parallel-finished: true
data/README.md CHANGED
@@ -25,22 +25,21 @@ gem install tansaku
25
25
  ### As a CLI
26
26
 
27
27
  ```sh
28
- $ tansaku
29
- Commands:
30
- tansaku crawl URL # Crawl a given URL
31
- tansaku help [COMMAND] # Describe available commands or one specific command
32
-
33
- $ tansaku help crawl
28
+ $ tansaku help
34
29
  Usage:
35
30
  tansaku crawl URL
36
31
 
37
32
  Options:
38
- [--additional-list=ADDITIONAL_LIST] # Path to the file which includes additonal paths to crawl
39
- [--host=HOST] # Host header to use
40
- [--max-concurrent-requests=N] # Number of concurrent requests to use
41
- [--type=TYPE] # Type of a list to crawl (admin, backup, database, etc, log or all)
42
- # Default: all
43
- [--user-agent=USER_AGENT] # User-Agent header to use
33
+ [--additional-list=ADDITIONAL_LIST] # Path to the file which includes additional paths to crawl
34
+ [--headers=key:value] # HTTP headers to use
35
+ [--method=METHOD] # HTTP method to use
36
+ # Default: HEAD
37
+ [--body=BODY] # HTTP request body to use
38
+ [--timeout=N] # Timeout in seconds
39
+ [--max-concurrent-requests=N] # Max number of concurrent requests to use
40
+ [--ignore-certificate-errors], [--no-ignore-certificate-errors] # Whether to ignore certificate errors or not
41
+ [--type=TYPE] # Type of a list to crawl (admin, backup, database, etc, log or all)
42
+ # Default: all
44
43
 
45
44
  Crawl a given URL
46
45
  ```
data/exe/tansaku CHANGED
@@ -5,5 +5,14 @@ $LOAD_PATH.unshift("#{__dir__}/../lib")
5
5
 
6
6
  require "tansaku"
7
7
 
8
+ def is_help?
9
+ ARGV.length == 1 && ARGV.first.casecmp("help").zero?
10
+ end
11
+
8
12
  ARGV.unshift(Tansaku::CLI.default_task) unless Tansaku::CLI.all_tasks.key?(ARGV[0])
9
- Tansaku::CLI.start(ARGV)
13
+
14
+ if is_help?
15
+ Tansaku::CLI.start(["help", Tansaku::CLI.default_task] )
16
+ else
17
+ Tansaku::CLI.start(ARGV)
18
+ end
data/lib/tansaku/cli.rb CHANGED
@@ -7,14 +7,16 @@ require "json"
7
7
  module Tansaku
8
8
  class CLI < Thor
9
9
  desc "crawl URL", "Crawl a given URL"
10
- method_option :additional_list, desc: "Path to the file which includes additonal paths to crawl"
11
- method_option :headers, type: :hash, default: {}, desc: "Custom headers"
12
- method_option :host, type: :string, desc: "Host header to use"
13
- method_option :max_concurrent_requests, type: :numeric, desc: "Number of concurrent requests to use"
10
+ method_option :additional_list, desc: "Path to the file which includes additional paths to crawl"
11
+ method_option :headers, type: :hash, default: {}, desc: "HTTP headers to use"
12
+ method_option :method, type: :string, default: "HEAD", desc: "HTTP method to use"
13
+ method_option :body, type: :string, required: false, default: nil, desc: "HTTP request body to use"
14
+ method_option :timeout, type: :numeric, required: false, default: nil, desc: "Timeout in seconds"
15
+ method_option :max_concurrent_requests, type: :numeric, desc: "Max number of concurrent requests to use"
16
+ method_option :ignore_certificate_errors, type: :boolean, default: false, desc: "Whether to ignore certificate errors or not"
14
17
  method_option :type, desc: "Type of a list to crawl (admin, backup, database, etc, log or all)", default: "all"
15
- method_option :user_agent, type: :string, desc: "User-Agent header to use"
16
18
  def crawl(url)
17
- params = options.compact.map { |k, v| [k.to_sym, v] }.to_h
19
+ params = options.compact.transform_keys(&:to_sym)
18
20
  begin
19
21
  crawler = Crawler.new(url, **params)
20
22
  results = crawler.crawl
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "async/http/internet"
4
3
  require "async"
5
4
  require "async/barrier"
6
5
  require "async/semaphore"
@@ -14,58 +13,87 @@ module Tansaku
14
13
  class Crawler
15
14
  DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
16
15
 
16
+ # @return [String]
17
17
  attr_reader :base_uri
18
18
 
19
19
  attr_reader :additional_list
20
- attr_reader :headers
21
- attr_reader :host
20
+
21
+ # @return [Integer]
22
22
  attr_reader :max_concurrent_requests
23
+
24
+ # @return [String]
23
25
  attr_reader :type
24
- attr_reader :user_agent
26
+
27
+ # @return [String]
28
+ attr_reader :method
29
+
30
+ # @return [String, nil]
31
+ attr_reader :body
32
+
33
+ # @return [Float, nil]
34
+ attr_reader :timeout
35
+
36
+ # @return [Boolean]
37
+ attr_reader :ignore_certificate_errors
25
38
 
26
39
  def initialize(
27
40
  base_uri,
28
41
  additional_list: nil,
29
42
  headers: {},
30
- host: nil,
43
+ method: "HEAD",
44
+ body: nil,
45
+ timeout: nil,
31
46
  max_concurrent_requests: nil,
32
- type: "all",
33
- user_agent: DEFAULT_USER_AGENT
47
+ ignore_certificate_errors: false,
48
+ type: "all"
34
49
  )
35
- @base_uri = URI.parse(base_uri)
50
+ @base_uri = URI.parse(base_uri.downcase)
36
51
  raise ArgumentError, "Invalid URI" unless valid_uri?
37
52
 
38
53
  @additional_list = additional_list
39
- unless additional_list.nil?
40
- raise ArgumentError, "Invalid path" unless valid_path?
41
- end
54
+ raise ArgumentError, "Invalid path" if !additional_list.nil? && !valid_path?
55
+
56
+ @method = method.upcase
57
+ raise ArgumentError, "Invalid HTTP method" unless valid_method?
42
58
 
43
59
  @headers = headers
44
- @host = host
45
- @max_concurrent_requests = max_concurrent_requests || Etc.nprocessors * 8
60
+ @body = body
61
+
62
+ @timeout = timeout.nil? ? nil : timeout.to_f
63
+
64
+ @max_concurrent_requests = max_concurrent_requests || (Etc.nprocessors * 8)
65
+
66
+ @ignore_certificate_errors = ignore_certificate_errors
67
+
46
68
  @type = type
47
- @user_agent = user_agent
48
69
  end
49
70
 
50
71
  def crawl
51
72
  results = {}
52
- Async do
73
+
74
+ Async do |task|
53
75
  barrier = Async::Barrier.new
54
76
  semaphore = Async::Semaphore.new(max_concurrent_requests, parent: barrier)
55
- internet = Async::HTTP::Internet.new
77
+ internet = Internet.new
56
78
 
57
79
  paths.each do |path|
58
80
  semaphore.async do
59
81
  url = url_for(path)
60
- res = internet.head(url, default_request_headers)
61
82
 
62
- results[url] = res.status if online?(res.status)
83
+ res = dispatch_http_request(task, internet, url)
84
+ next unless online?(res.status)
85
+
86
+ log = [method, url, res.status].join(",")
87
+ Tansaku.logger.info(log)
88
+
89
+ results[url] = res.status
63
90
  rescue Errno::ECONNRESET, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, EOFError, OpenSSL::SSL::SSLError, Async::TimeoutError
64
91
  next
65
92
  end
66
93
  end
67
94
  barrier.wait
68
95
  end
96
+
69
97
  results
70
98
  end
71
99
 
@@ -83,10 +111,14 @@ module Tansaku
83
111
  File.exist?(additional_list)
84
112
  end
85
113
 
114
+ def valid_method?
115
+ Protocol::HTTP::Methods.valid? method
116
+ end
117
+
86
118
  def paths
87
119
  paths = Path.get_by_type(type)
88
120
  paths += File.readlines(File.expand_path(additional_list, __dir__)) if additional_list
89
- paths.map(&:chomp).compact
121
+ paths.filter_map(&:chomp)
90
122
  end
91
123
 
92
124
  def url_for(path)
@@ -97,8 +129,40 @@ module Tansaku
97
129
  paths.map { |path| url_for path }
98
130
  end
99
131
 
100
- def default_request_headers
101
- @default_request_headers ||= headers.merge({ "host" => host, "user-agent" => user_agent }.compact)
132
+ def request_headers
133
+ @request_headers ||= @headers.tap do |headers|
134
+ upcase_keys = headers.keys.map(&:downcase).map(&:to_s)
135
+ headers["user-agent"] = DEFAULT_USER_AGENT unless upcase_keys.include?("user-agent")
136
+ end.compact
137
+ end
138
+
139
+ def ssl_verify_mode
140
+ ignore_certificate_errors ? OpenSSL::SSL::VERIFY_NONE : OpenSSL::SSL::VERIFY_PEER
141
+ end
142
+
143
+ def ssl_context
144
+ @ssl_context ||= OpenSSL::SSL::SSLContext.new.tap do |context|
145
+ context.set_params(verify_mode: ssl_verify_mode)
146
+ end
147
+ end
148
+
149
+ #
150
+ # Dispatch an HTTP request
151
+ #
152
+ # @param [Async::Task] task
153
+ # @param [Tansaku::Internet] internet
154
+ # @param [String] url
155
+ #
156
+ # @return [Async::HTTP::Protocol::Response]
157
+ #
158
+ def dispatch_http_request(task, internet, url)
159
+ endpoint = Async::HTTP::Endpoint.parse(url, ssl_context: ssl_context)
160
+
161
+ return internet.call(method, endpoint, request_headers, body) if timeout.nil?
162
+
163
+ task.with_timeout(timeout) do
164
+ internet.call(method, endpoint, request_headers, body)
165
+ end
102
166
  end
103
167
  end
104
168
  end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "async/http/internet"
4
+
5
+ module Tansaku
6
+ class Internet < Async::HTTP::Internet
7
+ def call(method, url_or_endpoint, headers = nil, body = nil)
8
+ endpoint = if url_or_endpoint.is_a?(Async::HTTP::Endpoint)
9
+ url_or_endpoint
10
+ else
11
+ Async::HTTP::Endpoint.parse(url_or_endpoint)
12
+ end
13
+ key = host_key(endpoint)
14
+
15
+ client = @clients.fetch(key) do
16
+ @clients[key] = client_for(endpoint)
17
+ end
18
+
19
+ body = Async::HTTP::Body::Buffered.wrap(body)
20
+ headers = ::Protocol::HTTP::Headers[headers]
21
+
22
+ request = ::Protocol::HTTP::Request.new(endpoint.scheme, endpoint.authority, method, endpoint.path, nil, headers, body)
23
+
24
+ client.call(request)
25
+ end
26
+
27
+ ::Protocol::HTTP::Methods.each do |_name, verb|
28
+ define_method(verb.downcase) do |url_or_endpoint, headers = nil, body = nil|
29
+ url_or_endpoint = url_or_endpoint.to_str unless url_or_endpoint.is_a?(Async::HTTP::Endpoint)
30
+ call(verb, url_or_endpoint, headers, body)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Tansaku
4
- VERSION = "1.1.0"
4
+ VERSION = "1.3.0"
5
5
  end
data/lib/tansaku.rb CHANGED
@@ -1,8 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "tansaku/version"
4
+
5
+ require "tansaku/internet"
4
6
  require "tansaku/path"
7
+
5
8
  require "tansaku/crawler"
9
+
6
10
  require "tansaku/cli"
7
11
 
8
- module Tansaku; end
12
+ require "memist"
13
+ require "semantic_logger"
14
+
15
+ module Tansaku
16
+ class << self
17
+ include Memist::Memoizable
18
+
19
+ def logger
20
+ SemanticLogger.default_level = :info
21
+ SemanticLogger.add_appender(io: $stderr, formatter: :color)
22
+ SemanticLogger["Tansaku"]
23
+ end
24
+ memoize :logger
25
+ end
26
+ end
data/tansaku.gemspec CHANGED
@@ -15,23 +15,29 @@ Gem::Specification.new do |spec|
15
15
  spec.homepage = "https://github.com/ninoseki/tansaku"
16
16
  spec.license = "MIT"
17
17
 
18
+ spec.metadata['rubygems_mfa_required'] = 'true'
19
+
18
20
  # Specify which files should be added to the gem when it is released.
19
21
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
20
- spec.files = Dir.chdir(File.expand_path(__dir__)) do
22
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
21
23
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
22
24
  end
23
25
  spec.bindir = "exe"
24
26
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
27
  spec.require_paths = ["lib"]
26
28
 
27
- spec.add_development_dependency "bundler", "~> 2.1"
28
- spec.add_development_dependency "coveralls", "~> 0.8"
29
+ spec.add_development_dependency "bundler", "~> 2.3"
30
+ spec.add_development_dependency "coveralls_reborn", "~> 0.24"
29
31
  spec.add_development_dependency "glint", "~> 0.1"
30
32
  spec.add_development_dependency "rake", "~> 13.0"
31
- spec.add_development_dependency "rspec", "~> 3.9"
32
- spec.add_development_dependency "webmock", "~> 3.8"
33
+ spec.add_development_dependency "rspec", "~> 3.11"
34
+ spec.add_development_dependency "simplecov-lcov", "~> 0.8.0"
35
+ spec.add_development_dependency "webmock", "~> 3.14"
36
+ spec.add_development_dependency "webrick", "~> 1.7"
33
37
 
34
- spec.add_dependency "async", "~> 1.26"
35
- spec.add_dependency "async-http", "~> 0.52"
36
- spec.add_dependency "thor", "~> 1.0"
38
+ spec.add_dependency "async", "~> 1.30"
39
+ spec.add_dependency "async-http", "~> 0.56"
40
+ spec.add_dependency "memist", "~> 2.0"
41
+ spec.add_dependency "semantic_logger", "~> 4.10"
42
+ spec.add_dependency "thor", "~> 1.2"
37
43
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tansaku
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manabu Niseki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-10-17 00:00:00.000000000 Z
11
+ date: 2022-03-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.1'
19
+ version: '2.3'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '2.1'
26
+ version: '2.3'
27
27
  - !ruby/object:Gem::Dependency
28
- name: coveralls
28
+ name: coveralls_reborn
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.8'
33
+ version: '0.24'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.8'
40
+ version: '0.24'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: glint
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -72,70 +72,126 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '3.9'
75
+ version: '3.11'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '3.9'
82
+ version: '3.11'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov-lcov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.8.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.8.0
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: webmock
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: '3.8'
103
+ version: '3.14'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.14'
111
+ - !ruby/object:Gem::Dependency
112
+ name: webrick
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.7'
90
118
  type: :development
91
119
  prerelease: false
92
120
  version_requirements: !ruby/object:Gem::Requirement
93
121
  requirements:
94
122
  - - "~>"
95
123
  - !ruby/object:Gem::Version
96
- version: '3.8'
124
+ version: '1.7'
97
125
  - !ruby/object:Gem::Dependency
98
126
  name: async
99
127
  requirement: !ruby/object:Gem::Requirement
100
128
  requirements:
101
129
  - - "~>"
102
130
  - !ruby/object:Gem::Version
103
- version: '1.26'
131
+ version: '1.30'
104
132
  type: :runtime
105
133
  prerelease: false
106
134
  version_requirements: !ruby/object:Gem::Requirement
107
135
  requirements:
108
136
  - - "~>"
109
137
  - !ruby/object:Gem::Version
110
- version: '1.26'
138
+ version: '1.30'
111
139
  - !ruby/object:Gem::Dependency
112
140
  name: async-http
113
141
  requirement: !ruby/object:Gem::Requirement
114
142
  requirements:
115
143
  - - "~>"
116
144
  - !ruby/object:Gem::Version
117
- version: '0.52'
145
+ version: '0.56'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '0.56'
153
+ - !ruby/object:Gem::Dependency
154
+ name: memist
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '2.0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '2.0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: semantic_logger
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '4.10'
118
174
  type: :runtime
119
175
  prerelease: false
120
176
  version_requirements: !ruby/object:Gem::Requirement
121
177
  requirements:
122
178
  - - "~>"
123
179
  - !ruby/object:Gem::Version
124
- version: '0.52'
180
+ version: '4.10'
125
181
  - !ruby/object:Gem::Dependency
126
182
  name: thor
127
183
  requirement: !ruby/object:Gem::Requirement
128
184
  requirements:
129
185
  - - "~>"
130
186
  - !ruby/object:Gem::Version
131
- version: '1.0'
187
+ version: '1.2'
132
188
  type: :runtime
133
189
  prerelease: false
134
190
  version_requirements: !ruby/object:Gem::Requirement
135
191
  requirements:
136
192
  - - "~>"
137
193
  - !ruby/object:Gem::Version
138
- version: '1.0'
194
+ version: '1.2'
139
195
  description: Yet another dirbuster tool
140
196
  email:
141
197
  - manabu.niseki@gmail.com
@@ -145,9 +201,9 @@ extensions: []
145
201
  extra_rdoc_files: []
146
202
  files:
147
203
  - ".gitattributes"
204
+ - ".github/workflows/test.yml"
148
205
  - ".gitignore"
149
206
  - ".rspec"
150
- - ".travis.yml"
151
207
  - Gemfile
152
208
  - LICENSE
153
209
  - README.md
@@ -158,6 +214,7 @@ files:
158
214
  - lib/tansaku.rb
159
215
  - lib/tansaku/cli.rb
160
216
  - lib/tansaku/crawler.rb
217
+ - lib/tansaku/internet.rb
161
218
  - lib/tansaku/lists/admin.txt
162
219
  - lib/tansaku/lists/backup.txt
163
220
  - lib/tansaku/lists/database.txt
@@ -171,7 +228,8 @@ files:
171
228
  homepage: https://github.com/ninoseki/tansaku
172
229
  licenses:
173
230
  - MIT
174
- metadata: {}
231
+ metadata:
232
+ rubygems_mfa_required: 'true'
175
233
  post_install_message:
176
234
  rdoc_options: []
177
235
  require_paths:
@@ -187,7 +245,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
187
245
  - !ruby/object:Gem::Version
188
246
  version: '0'
189
247
  requirements: []
190
- rubygems_version: 3.1.2
248
+ rubygems_version: 3.3.7
191
249
  signing_key:
192
250
  specification_version: 4
193
251
  summary: Yet another dirbuster tool
data/.travis.yml DELETED
@@ -1,9 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- cache: bundler
4
- rvm:
5
- - 2.6
6
- - 2.7
7
- before_install:
8
- - gem update --system
9
- - gem install bundler