passivedns-client 2.0.4 → 2.0.6

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
  SHA1:
3
- metadata.gz: f25402e0bd61bb74820cfc984490a96565f33ac5
4
- data.tar.gz: dbf4ea9dfe2a501c878bb4c127a4d5bb92e970dd
3
+ metadata.gz: 9fc3d708ad9c1dd55d73acf19b347589c8142292
4
+ data.tar.gz: f48765e8140f0f84dd26a8912728190458ab3dbb
5
5
  SHA512:
6
- metadata.gz: 5ee3a733b4e4518ca18004245a9fc457b8bcc56fde1618545befc534f33d885cb34ef6097784e9e1fe03830df5b96ce9e91cde7b0aeb08f02b0722786fb64b2f
7
- data.tar.gz: dcb2ff2f4429fc88dadba5fb269a8a9a72f5df0b6bfb12e53207dff65e2b2e15f61d77f829dd21114a4da2b46389d2f83835185481f4ee1542e327df803094d0
6
+ metadata.gz: 6c6d15bd3b5e0c556b515512be6645b626139f9c0c2c42c8e48bb7347599edb2bcbb6ca0b011dd8c981a2fdd2d13f50e98f1d34935f81223a60039c237531052
7
+ data.tar.gz: d14cf8d3a6e50d8e1708d4fa32d11655efec83403ca9ba62fd10c3246dac1b7930d59ace1245a1cd5079270d22fbe7eba3124897b0b6bd95c8518f6346c13e12
data/README.md CHANGED
@@ -94,7 +94,7 @@ Or use the included tool...
94
94
 
95
95
  Output Formatting
96
96
  -g link-nodal GDF visualization definition
97
- -v link-nodal graphviz visualization definition
97
+ -z link-nodal graphviz visualization definition
98
98
  -m link-nodal graphml visualization definition
99
99
  -c CSV
100
100
  -x XML
@@ -2,17 +2,30 @@ require 'getoptlong'
2
2
  require 'structformatter'
3
3
  require 'getoptlong'
4
4
  require 'yaml'
5
+ require 'pp'
5
6
 
6
7
  module PassiveDNS
7
8
  class CLInterface
9
+ def self.get_letter_map
10
+ letter_map = {}
11
+ PassiveDNS.constants.each do |const|
12
+ if PassiveDNS.const_get(const).is_a?(Class) and PassiveDNS.const_get(const).superclass == PassiveDNS::PassiveDB
13
+ letter_map[PassiveDNS.const_get(const).option_letter] = [PassiveDNS.const_get(const).name, PassiveDNS.const_get(const).config_section_name]
14
+ end
15
+ end
16
+ letter_map
17
+ end
18
+
8
19
  def self.parse_command_line(args)
20
+ origARGV = ARGV.dup
21
+ ARGV.replace(args)
9
22
  opts = GetoptLong.new(
10
23
  [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
11
- [ '--debug', '-z', GetoptLong::NO_ARGUMENT ],
24
+ [ '--debug', '-v', GetoptLong::NO_ARGUMENT ],
12
25
  [ '--database', '-d', GetoptLong::REQUIRED_ARGUMENT ],
13
26
 
14
27
  [ '--gdf', '-g', GetoptLong::NO_ARGUMENT ],
15
- [ '--graphviz', '-v', GetoptLong::NO_ARGUMENT ],
28
+ [ '--graphviz', '-z', GetoptLong::NO_ARGUMENT ],
16
29
  [ '--graphml', '-m', GetoptLong::NO_ARGUMENT ],
17
30
  [ '--csv', '-c', GetoptLong::NO_ARGUMENT ],
18
31
  [ '--xml', '-x', GetoptLong::NO_ARGUMENT ],
@@ -27,12 +40,7 @@ module PassiveDNS
27
40
  [ '--limit', '-l', GetoptLong::REQUIRED_ARGUMENT ]
28
41
  )
29
42
 
30
- letter_map = {}
31
- PassiveDNS.constants.each do |const|
32
- if PassiveDNS.const_get(const).is_a?(Class) and PassiveDNS.const_get(const).superclass == PassiveDNS::PassiveDB
33
- letter_map[PassiveDNS.const_get(const).option_letter] = [PassiveDNS.const_get(const).name, PassiveDNS.const_get(const).config_section_name]
34
- end
35
- end
43
+ letter_map = get_letter_map
36
44
 
37
45
  # sets the default search methods
38
46
  options = {
@@ -44,14 +52,14 @@ module PassiveDNS
44
52
  :res => nil,
45
53
  :debug => false,
46
54
  :sqlitedb => nil,
47
- :limit => nil
55
+ :limit => nil,
56
+ :help => false
48
57
  }
49
58
 
50
59
  opts.each do |opt, arg|
51
60
  case opt
52
61
  when '--help'
53
- puts usage(letter_map)
54
- exit
62
+ options[:help] = true
55
63
  when '--debug'
56
64
  options[:debug] = true
57
65
  when '--database'
@@ -86,10 +94,6 @@ module PassiveDNS
86
94
  options[:sep] = arg
87
95
  when '--recurse'
88
96
  options[:recursedepth] = arg.to_i
89
- if options[:recursedepth] > 3
90
- $stderr.puts "WARNING: a recursedepth of > 3 can be abusive, please reconsider: sleeping 60 seconds for sense to come to you (hint: hit CTRL-C)"
91
- sleep 60
92
- end
93
97
  when '--wait'
94
98
  options[:wait] = arg.to_i
95
99
  when '--sqlite3'
@@ -97,10 +101,11 @@ module PassiveDNS
97
101
  when '--limit'
98
102
  options[:limit] = arg.to_i
99
103
  else
100
- puts usage(letter_map)
101
- exit
104
+ options[:help] = true
102
105
  end
103
106
  end
107
+ args = ARGV.dup
108
+ ARGV.replace(origARGV)
104
109
 
105
110
  if options[:pdnsdbs].length == 0
106
111
  options[:pdnsdbs] << "bfk"
@@ -129,9 +134,9 @@ module PassiveDNS
129
134
 
130
135
  def self.usage(letter_map)
131
136
  databases = letter_map.keys.sort.join("")
132
- help_text = "\n"
137
+ help_text = ""
133
138
  help_text << "Usage: #{$0} [-d [#{databases}]] [-g|-v|-m|-c|-x|-y|-j|-t] [-os <sep>] [-f <file>] [-r#|-w#|-v] [-l <count>] <ip|domain|cidr>\n"
134
- help_text << "Passive DNS Providers"
139
+ help_text << "Passive DNS Providers\n"
135
140
  help_text << " -d#{databases} uses all of the available passive dns database\n"
136
141
  letter_map.keys.sort.each do |l|
137
142
  help_text << " -d#{l} use #{letter_map[l][0]}\n"
@@ -140,7 +145,7 @@ module PassiveDNS
140
145
  help_text << "\n"
141
146
  help_text << "Output Formatting\n"
142
147
  help_text << " -g link-nodal GDF visualization definition\n"
143
- help_text << " -v link-nodal graphviz visualization definition\n"
148
+ help_text << " -z link-nodal graphviz visualization definition\n"
144
149
  help_text << " -m link-nodal graphml visualization definition\n"
145
150
  help_text << " -c CSV\n"
146
151
  help_text << " -x XML\n"
@@ -149,7 +154,7 @@ module PassiveDNS
149
154
  help_text << " -t ASCII text (default)\n"
150
155
  help_text << " -s <sep> specifies a field separator for text output, default is tab\n"
151
156
  help_text << "\n"
152
- help_text << "State and Recusion\n"
157
+ help_text << "State and Recursion\n"
153
158
  help_text << " -f[file] specifies a sqlite3 database used to read the current state - useful for large result sets and generating graphs of previous runs.\n"
154
159
  help_text << " -r# specifies the levels of recursion to pull. **WARNING** This is quite taxing on the pDNS servers, so use judiciously (never more than 3 or so) or find yourself blocked!\n"
155
160
  help_text << " -w# specifies the amount of time to wait, in seconds, between queries (Default: 0)\n"
@@ -222,6 +227,13 @@ module PassiveDNS
222
227
 
223
228
  def self.run(args)
224
229
  options, items = parse_command_line(args)
230
+ if options[:help]
231
+ return usage(get_letter_map)
232
+ end
233
+ if options[:recursedepth] > 3
234
+ $stderr.puts "WARNING: a recursedepth of > 3 can be abusive, please reconsider: sleeping 60 seconds for sense to come to you (hint: hit CTRL-C)"
235
+ sleep 60
236
+ end
225
237
  state = create_state(options[:sqlitedb])
226
238
  state.debug = options[:debug]
227
239
 
@@ -1,5 +1,5 @@
1
1
  module PassiveDNS
2
2
  class Client
3
- VERSION = "2.0.4"
3
+ VERSION = "2.0.6"
4
4
  end
5
5
  end
data/test/test_cli.rb ADDED
@@ -0,0 +1,204 @@
1
+ unless Kernel.respond_to?(:require_relative)
2
+ module Kernel
3
+ def require_relative(path)
4
+ require File.join(File.dirname(caller[0]), path.to_str)
5
+ end
6
+ end
7
+ end
8
+
9
+ require_relative 'helper'
10
+ require 'configparser'
11
+ require_relative '../lib/passivedns/client/cli.rb'
12
+
13
+ class TestCLI < Minitest::Test
14
+ def test_letter_map
15
+ letter_map = PassiveDNS::CLI.get_letter_map
16
+ assert_equal("3bcdmptv", letter_map.keys.sort.join(""))
17
+ end
18
+
19
+ def test_help_text
20
+ helptext = PassiveDNS::CLI.run(["--help"])
21
+ helptext.gsub!(/Usage: .*?\[/, "Usage: [")
22
+ assert_equal(
23
+ "Usage: [-d [3bcdmptv]] [-g|-v|-m|-c|-x|-y|-j|-t] [-os <sep>] [-f <file>] [-r#|-w#|-v] [-l <count>] <ip|domain|cidr>
24
+ Passive DNS Providers
25
+ -d3bcdmptv uses all of the available passive dns database
26
+ -d3 use 360.cn
27
+ -db use BFK.de
28
+ -dc use CIRCL
29
+ -dd use DNSDB
30
+ -dm use Mnemonic
31
+ -dp use PassiveTotal
32
+ -dt use TCPIPUtils
33
+ -dv use VirusTotal
34
+ -dvt uses VirusTotal and TCPIPUtils (for example)
35
+
36
+ Output Formatting
37
+ -g link-nodal GDF visualization definition
38
+ -z link-nodal graphviz visualization definition
39
+ -m link-nodal graphml visualization definition
40
+ -c CSV
41
+ -x XML
42
+ -y YAML
43
+ -j JSON
44
+ -t ASCII text (default)
45
+ -s <sep> specifies a field separator for text output, default is tab
46
+
47
+ State and Recursion
48
+ -f[file] specifies a sqlite3 database used to read the current state - useful for large result sets and generating graphs of previous runs.
49
+ -r# specifies the levels of recursion to pull. **WARNING** This is quite taxing on the pDNS servers, so use judiciously (never more than 3 or so) or find yourself blocked!
50
+ -w# specifies the amount of time to wait, in seconds, between queries (Default: 0)
51
+ -l <count> limits the number of records returned per passive dns database queried.
52
+
53
+ Getting Help
54
+ -h hello there. This option produces this helpful help information on how to access help.
55
+ -v debugging information
56
+ ", helptext)
57
+ end
58
+
59
+ def test_provider_parsing
60
+ options_target = {
61
+ :pdnsdbs => ["bfk"],
62
+ :format => "text",
63
+ :sep => "\t",
64
+ :recursedepth => 1,
65
+ :wait => 0,
66
+ :res => nil,
67
+ :debug => false,
68
+ :sqlitedb => nil,
69
+ :limit => nil,
70
+ :help => false
71
+ }
72
+
73
+ options, items = PassiveDNS::CLI.parse_command_line([])
74
+ assert_equal(options_target, options)
75
+ assert_equal([], items)
76
+
77
+ options_target[:pdnsdbs] = ["cn360"]
78
+ options, items = PassiveDNS::CLI.parse_command_line(["-d3"])
79
+ assert_equal(options_target, options)
80
+ assert_equal([], items)
81
+
82
+ options_target[:pdnsdbs] = ["bfk"]
83
+ options, items = PassiveDNS::CLI.parse_command_line(["-db"])
84
+ assert_equal(options_target, options)
85
+ assert_equal([], items)
86
+
87
+ options_target[:pdnsdbs] = ["circl", "dnsdb", "mnemonic"]
88
+ options, items = PassiveDNS::CLI.parse_command_line(["-dcdm"])
89
+ assert_equal(options_target, options)
90
+ assert_equal([], items)
91
+
92
+ options_target[:pdnsdbs] = ["passivetotal", "tcpiputils", "virustotal"]
93
+ options, items = PassiveDNS::CLI.parse_command_line(["-dptv"])
94
+ assert_equal(options_target, options)
95
+ assert_equal([], items)
96
+
97
+ end
98
+
99
+ def test_output_parsing
100
+ options_target = {
101
+ :pdnsdbs => ["passivetotal", "tcpiputils", "virustotal"],
102
+ :format => "text",
103
+ :sep => "\t",
104
+ :recursedepth => 1,
105
+ :wait => 0,
106
+ :res => nil,
107
+ :debug => false,
108
+ :sqlitedb => nil,
109
+ :limit => nil,
110
+ :help => false
111
+ }
112
+
113
+ options_target[:sep] = ","
114
+ options, items = PassiveDNS::CLI.parse_command_line(["-dptv", "-c", "8.8.8.8"])
115
+ assert_equal(options_target, options)
116
+ assert_equal(["8.8.8.8"], items)
117
+
118
+ options_target[:sep] = "|"
119
+ options, items = PassiveDNS::CLI.parse_command_line(["-dptv", "-s", "|", "8.8.8.8"])
120
+ assert_equal(options_target, options)
121
+ assert_equal(["8.8.8.8"], items)
122
+
123
+ options_target[:sep] = "\t"
124
+
125
+ options, items = PassiveDNS::CLI.parse_command_line(["-dptv", "-t", "8.8.8.8"])
126
+ assert_equal(options_target, options)
127
+ assert_equal(["8.8.8.8"], items)
128
+
129
+ options_target[:format] = "json"
130
+ options, items = PassiveDNS::CLI.parse_command_line(["-dptv", "-j", "8.8.8.8"])
131
+ assert_equal(options_target, options)
132
+ assert_equal(["8.8.8.8"], items)
133
+
134
+ options_target[:format] = "xml"
135
+ options, items = PassiveDNS::CLI.parse_command_line(["-dptv", "-x", "8.8.8.8"])
136
+ assert_equal(options_target, options)
137
+ assert_equal(["8.8.8.8"], items)
138
+
139
+ options_target[:format] = "yaml"
140
+ options, items = PassiveDNS::CLI.parse_command_line(["-dptv", "-y", "8.8.8.8"])
141
+ assert_equal(options_target, options)
142
+ assert_equal(["8.8.8.8"], items)
143
+
144
+ options_target[:format] = "gdf"
145
+ options, items = PassiveDNS::CLI.parse_command_line(["-dptv", "-g", "8.8.8.8"])
146
+ assert_equal(options_target, options)
147
+ assert_equal(["8.8.8.8"], items)
148
+
149
+ options_target[:format] = "graphviz"
150
+ options, items = PassiveDNS::CLI.parse_command_line(["-dptv", "-z", "8.8.8.8"])
151
+ assert_equal(options_target, options)
152
+ assert_equal(["8.8.8.8"], items)
153
+
154
+ options_target[:format] = "graphml"
155
+ options, items = PassiveDNS::CLI.parse_command_line(["-dptv", "-m", "8.8.8.8"])
156
+ assert_equal(options_target, options)
157
+ assert_equal(["8.8.8.8"], items)
158
+
159
+ options_target[:format] = "text"
160
+ end
161
+
162
+ def test_help_debug_parsing
163
+ options_target = {
164
+ :pdnsdbs => ["passivetotal", "tcpiputils", "virustotal"],
165
+ :format => "text",
166
+ :sep => "\t",
167
+ :recursedepth => 1,
168
+ :wait => 0,
169
+ :res => nil,
170
+ :debug => false,
171
+ :sqlitedb => nil,
172
+ :limit => nil,
173
+ :help => true
174
+ }
175
+
176
+ options, items = PassiveDNS::CLI.parse_command_line(["-dptv", "-h", "8.8.8.8"])
177
+ assert_equal(options_target, options)
178
+ assert_equal(["8.8.8.8"], items)
179
+
180
+ options_target[:debug] = true
181
+ options, items = PassiveDNS::CLI.parse_command_line(["-dptv", "-h", "-v", "8.8.8.8"])
182
+ assert_equal(options_target, options)
183
+ assert_equal(["8.8.8.8"], items)
184
+ end
185
+
186
+ def test_state_recursion_parsing
187
+ options_target = {
188
+ :pdnsdbs => ["passivetotal", "tcpiputils", "virustotal"],
189
+ :format => "text",
190
+ :sep => "\t",
191
+ :recursedepth => 5,
192
+ :wait => 30,
193
+ :res => nil,
194
+ :debug => false,
195
+ :sqlitedb => "test.db",
196
+ :limit => 10,
197
+ :help => false
198
+ }
199
+
200
+ options, items = PassiveDNS::CLI.parse_command_line(["-dptv", "-f", "test.db", "-r", "5", "-w", "30", "-l", "10", "8.8.8.8"])
201
+ assert_equal(options_target, options)
202
+ assert_equal(["8.8.8.8"], items)
203
+ end
204
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: passivedns-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.4
4
+ version: 2.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - chrislee35
@@ -139,6 +139,7 @@ files:
139
139
  - lib/passivedns/client/version.rb
140
140
  - passivedns-client.gemspec
141
141
  - test/helper.rb
142
+ - test/test_cli.rb
142
143
  - test/test_passivedns-client.rb
143
144
  homepage: https://github.com/chrislee35/passivedns-client
144
145
  licenses:
@@ -166,4 +167,5 @@ specification_version: 4
166
167
  summary: Query passive DNS databases
167
168
  test_files:
168
169
  - test/helper.rb
170
+ - test/test_cli.rb
169
171
  - test/test_passivedns-client.rb