tornados 0.1.0 → 0.1.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: 13eb9528e80a18cb172286e4749182fd19663212d2ec526f05ff2154e1ddd28e
4
- data.tar.gz: 482688eb7fb599ab85e3f3ac90052dafc40c8a7529bf8febbfc89629a70c58e2
3
+ metadata.gz: db771b465f7959bd5544df4738b70261ee53ac2424924495ca32f99ab0f3c844
4
+ data.tar.gz: 350485c2fc597319c63fb8b3f815310e82f31aa41a4b5e44585ee67dea29ca7c
5
5
  SHA512:
6
- metadata.gz: 143bfa20ed022819bc2eb70deb4f3f31814bc8b4a1c5cee31f2fa3549d85da82cb7e23e0817a45ac04655646a46a8c010fafa5077e8c2e6c04ae84f8c85160d2
7
- data.tar.gz: 1c01490c41ede9f8a7b1bf11c23283025fd54c6265c3fb4198c534d1eb7086585006d2451f96cf8bd0079ce098162437f770a5977669caeb843aaff8bd2a1caa
6
+ metadata.gz: 9b8f5f3b8f0ef2ccfd67cccc49eab4af0651e51d4724245b8bc3f0db7cdc727186a4ae10401be7ecce1a50ae66d8728cc0cef93abbf37727b51cc1ab1b937ae1
7
+ data.tar.gz: e70bb40a3d8c955807188c47ea6877232cc2d6c8fea710175f479b847b76cf7405a6fe39100cccb5ee54d2c7d87fab14d6ed1ed0a7a8f169618284bbd67605e8
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tornados (0.1.0)
4
+ tornados (0.1.1)
5
5
  faraday (~> 2.2.0)
6
6
  maxmind-geoip2 (~> 1.1.0)
7
7
 
data/README.md CHANGED
@@ -14,14 +14,21 @@ To install
14
14
  ```bash
15
15
  gem install tornados
16
16
  ```
17
-
18
- To use
17
+ To use (-k - is a MaxMind secret key):
18
+ ```bash
19
+ tornados -k key
20
+ ```
21
+ or (MaxMind keys as environmet variable and -i key define what country nodes to include into result):
19
22
  ```bash
20
- tornados
23
+ GEO_API_DATABASE_LICENSE_KEY=key tornados -i RU
21
24
  ```
22
25
  After this, tor_exit_nodes_list.csv will be created in current directory.
23
26
 
24
27
  You can use this file in SIEM, for example, to detection malicious network traffic.
28
+ To display help info:
29
+ ```ruby
30
+ tornados -h
31
+ ```
25
32
 
26
33
  ## Library
27
34
 
@@ -47,7 +54,7 @@ returns array of arrays whith next format
47
54
  ### Tornados::MaxDbFetcher
48
55
 
49
56
  ```ruby
50
- Tornados::MaxDbFetcher.call
57
+ Tornados::MaxDbFetcher.call(key)
51
58
  ```
52
59
  download to disk max db file and return path to it
53
60
 
@@ -1,37 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "optparse"
4
+
3
5
  module Tornados
4
6
  class CliClient
7
+ private
8
+
9
+ attr_reader :options
10
+
11
+ public
12
+
5
13
  def start
6
- user_args = args
7
- if user_args.empty?
8
- print_prompt
9
- else
10
- print_prompt_with_input
11
- end
12
- prepare_result(user_args)
14
+ prepare_options
15
+ print_prompt
16
+ prepare_result
13
17
  print_finish_message
14
18
  end
15
19
 
16
20
  private
17
21
 
18
- def print_prompt
19
- puts <<~TEXT
20
- Example of usage:
21
- GEO_API_KEY=key tornado <uri>, <result file>
22
- Runs with default args:
23
- tor nodes URI = #{Tornados::NodesFetcher.default_url}
24
- result_file = #{Tornados::FileWriter.default_result_file}
25
- TEXT
26
- end
27
-
28
- def print_prompt_with_input
22
+ def print_prompt()
29
23
  puts <<~TEXT
30
- Example of usage:
31
- GEO_API_KEY=key tornado <uri>, <result file>
32
24
  Runs with args:
33
- tor nodes URI = #{args[:uri]}
34
- result_file = #{args[:file]}
25
+ tor nodes URI = #{options[:nodes_list] || Tornados::NodesFetcher.default_url}
26
+ result_file = #{options[:result_file] || Tornados::FileWriter.default_result_file}
35
27
  TEXT
36
28
  end
37
29
 
@@ -39,18 +31,55 @@ module Tornados
39
31
  puts "Work done. See result in #{Tornados::FileWriter.default_result_file}. Bye!"
40
32
  end
41
33
 
42
- def args
43
- result = ARGV
44
- return {} if result.empty?
45
- {uri: result.first, file: result.last}
34
+ def prepare_result
35
+ tor_exit_nodes = Tornados::NodesFetcher.call(options[:exit_nodes_uri])
36
+ geobase_file_path = Tornados::MaxDbFetcher.call(options[:max_mind_key] || ENV["GEO_API_DATABASE_LICENSE_KEY"])
37
+ enriched_tor_exit_nodes = Tornados::GeoEnrich.call(tor_exit_nodes, geobase_file_path, filter)
38
+ csv_enriched_tor_exit_nodes = Tornados::CsvFormater.call(enriched_tor_exit_nodes)
39
+ Tornados::FileWriter.call(csv_enriched_tor_exit_nodes, options[:result_file])
46
40
  end
41
+
42
+ def filter
43
+ return nil unless options[:included_iso_codes]
47
44
 
48
- def prepare_result(args)
49
- tor_exit_nodes = Tornados::NodesFetcher.call(args[:uri])
50
- geobase_file_path = Tornados::MaxDbFetcher.call
51
- enriched_tor_exit_nodes = Tornados::GeoEnrich.call(tor_exit_nodes, geobase_file_path)
52
- csv_enriched_tor_exit_nodes = Tornados::CsvFormater.call(enriched_tor_exit_nodes)
53
- Tornados::FileWriter.call(csv_enriched_tor_exit_nodes, args[:file])
45
+ l = -> (checked_value) { options[:included_iso_codes].include?(checked_value) }
46
+ Tornados::Filter.new(l)
47
+ end
48
+
49
+ def prepare_options
50
+ @options = {}
51
+ optparse = OptionParser.new do |opts|
52
+ opts.banner = usage_example_message
53
+
54
+ opts.on( '-h', '--help', 'Display this screen' ) do
55
+ puts opts
56
+ exit
57
+ end
58
+
59
+ opts.on("-u", "--uri <URI>", "Uri with tor exit nodes list") do |v|
60
+ @options[:exit_nodes_uri] = v
61
+ end
62
+
63
+ opts.on("-f", "--file <file>", "Result file with path") do |v|
64
+ @options[:result_file] = v
65
+ end
66
+
67
+ opts.on("-k", "--key <file>", "MaxMind API key") do |v|
68
+ puts 111
69
+ puts ENV["GEO_API_DATABASE_LICENSE_KEY"]
70
+ @options[:max_mind_key] = v
71
+ end
72
+
73
+ opts.on("-i", "--include <ISO code1, ISO codeN>", "Include only ip with this iso codes") do |v|
74
+ @options[:included_iso_codes] = v.split(",").map(&:strip)
75
+ end
76
+ end
77
+
78
+ optparse.parse!
79
+ end
80
+
81
+ def usage_example_message
82
+ "GEO_API_KEY=key tornado -u <exit nodes uri> -f <result file> -i <ip country iso codes>"
54
83
  end
55
84
  end
56
85
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tornados
4
+ class Filter
5
+ private
6
+
7
+ attr_reader :condition
8
+
9
+ public
10
+
11
+ def initialize(lambda)
12
+ @condition = lambda
13
+ end
14
+
15
+ def accept?(checked_value)
16
+ condition.call(checked_value)
17
+ end
18
+ end
19
+ end
@@ -6,26 +6,33 @@ module Tornados
6
6
  class GeoEnrich < Service
7
7
  private
8
8
 
9
- attr_reader :ip_list, :reader
9
+ attr_reader :ip_list, :filter, :reader
10
10
 
11
11
  public
12
12
 
13
- def initialize(ip_list, max_db_file_path)
14
- @ip_list = ip_list
15
- @reader = MaxMind::GeoIP2::Reader.new(database: max_db_file_path)
13
+ def initialize(ip_list, max_db_file_path, filter = nil)
14
+ @filter = filter
15
+ @ip_list = ip_list
16
+ @reader = MaxMind::GeoIP2::Reader.new(database: max_db_file_path)
16
17
  end
17
18
 
18
19
  private
19
20
 
20
21
  def execute
21
- ip_list.map do |arr|
22
- [arr.first, *country_code_by_ip(arr.first)]
22
+ ip_list.each_with_object([]) do |arr, result|
23
+ ip = arr.first
24
+ iso_code, name = *country_code_by_ip(ip)
25
+ if filter
26
+ result << [ip, iso_code, name] if filter.accept?(iso_code)
27
+ else
28
+ result << [ip, iso_code, name]
23
29
  end
30
+ end
24
31
  end
25
32
 
26
33
  def country_code_by_ip(ip)
27
- record = reader.country(ip)
28
- [record.country.iso_code, record.country.name]
34
+ record = reader.country(ip)
35
+ [record.country.iso_code, record.country.name]
29
36
  end
30
37
  end
31
38
  end
@@ -21,11 +21,12 @@ module Tornados
21
21
 
22
22
  private
23
23
 
24
- attr_accessor :max_db_file_path
24
+ attr_accessor :key, :max_db_file_path
25
25
 
26
26
  public
27
27
 
28
- def initialize(max_db_storage = nil)
28
+ def initialize(key, max_db_storage = nil)
29
+ @key = key
29
30
  max_db_storage = max_db_storage || MAX_DB_STORAGE
30
31
  @max_db_file_path = File.join(max_db_storage, MAX_DB_FILE_NAME)
31
32
  end
@@ -47,9 +48,9 @@ module Tornados
47
48
  end
48
49
 
49
50
  def license_key_option
50
- raise MaxDbKeyNotFoundError unless ENV["GEO_API_DATABASE_LICENSE_KEY"]
51
+ raise MaxDbKeyNotFoundError unless key
51
52
 
52
- {license_key: ENV["GEO_API_DATABASE_LICENSE_KEY"]}
53
+ {license_key: key}
53
54
  end
54
55
 
55
56
  def extract_tar_gz_file(file)
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Tornados
4
4
  TOR_NODES_LIST_URI = "https://raw.githubusercontent.com"
5
- TOR_NODES_LIST_PATH ="SecOps-Institute/Tor-IP-Addresses/master/tor-nodes.lst"
5
+ TOR_NODES_LIST_PATH = "SecOps-Institute/Tor-IP-Addresses/master/tor-exit-nodes.lst"
6
6
 
7
7
  # Service for download exit tor nodes IP list.
8
8
  # Result is array of arrays:
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Tornados
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.1"
5
5
  end
data/lib/tornados.rb CHANGED
@@ -13,6 +13,7 @@ require_relative "tornados/file_writer"
13
13
  require_relative "tornados/http_client"
14
14
  require_relative "tornados/nodes_fetcher"
15
15
  require_relative "tornados/max_db_fetcher"
16
+ require_relative "tornados/filter"
16
17
  require_relative "tornados/geo_enrich"
17
18
  require_relative "tornados/cli_client"
18
19
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tornados
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexey Slivka
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-04-03 00:00:00.000000000 Z
11
+ date: 2022-04-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -116,6 +116,7 @@ files:
116
116
  - lib/tornados/csv_formater.rb
117
117
  - lib/tornados/errors.rb
118
118
  - lib/tornados/file_writer.rb
119
+ - lib/tornados/filter.rb
119
120
  - lib/tornados/formater.rb
120
121
  - lib/tornados/geo_enrich.rb
121
122
  - lib/tornados/http_client.rb