network_scanner 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/network_scanner +36 -15
- data/lib/network_scanner.rb +67 -18
- data/lib/network_scanner/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9bdf3586d28cb2c6ba41ce2337d054d1ebcb041
|
4
|
+
data.tar.gz: 23164e74226b74b5f02f50dbe5c212778d3db68d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f23d8cb010bd8f316a86aaa50d2f16b07725344a7c55e387c91e3b0678e29e89a977a194cf3d848a42262d3284c74c625587d879f9779f676f068ef906a0c8ee
|
7
|
+
data.tar.gz: d54b2b76b0019752e3a9ef42d4a767d15cd8b6a3b423b3e81f49ce868ab35caf52ac7f0ed45084145c712e12ee177842c28ed65c9fcd28c8224bd36a50d064e8
|
data/bin/network_scanner
CHANGED
@@ -5,42 +5,63 @@ require 'optparse'
|
|
5
5
|
|
6
6
|
options = {}
|
7
7
|
OptionParser.new do |opts|
|
8
|
-
opts.on('--
|
9
|
-
options[:
|
8
|
+
opts.on('-f', '--format FORMAT', String, 'Format to read/write (text/json). Defaults to text') do |format|
|
9
|
+
options[:format] = format
|
10
10
|
end
|
11
11
|
|
12
|
-
opts.on('--
|
12
|
+
opts.on('-s', '--poolsize POOLSIZE', Integer, 'Specify thread pool size (default 100)') do |pool|
|
13
|
+
options[:pool] = pool
|
14
|
+
end
|
15
|
+
|
16
|
+
opts.on('-i', '--interface INTERFACE', String, 'Specifys interface to scan') do |interface|
|
13
17
|
options[:interface] = interface
|
14
18
|
end
|
15
19
|
|
16
|
-
opts.on('--range RANGE', String, 'Specify a range to scan(192.168.1.100-192.168.1.200)') do |range|
|
20
|
+
opts.on('-r', '--range RANGE', String, 'Specify a range to scan(192.168.1.100-192.168.1.200)') do |range|
|
17
21
|
options[:range] = range
|
18
22
|
end
|
19
23
|
|
20
|
-
opts.on('--
|
21
|
-
options[:
|
24
|
+
opts.on('-c', '--cache FILE', String, 'Cache to read ips from') do |file|
|
25
|
+
options[:cache] = file
|
22
26
|
end
|
23
27
|
|
24
|
-
opts.on('
|
25
|
-
options[:
|
28
|
+
opts.on('-P', '--ping', 'Checks for all machines that respond to ping') do
|
29
|
+
options[:ping] = true
|
26
30
|
end
|
27
31
|
|
28
|
-
opts.on('--
|
29
|
-
options[:
|
32
|
+
opts.on('-p', '--portscan PORT', Integer, 'Port to scan for') do |port|
|
33
|
+
options[:port] = port
|
30
34
|
end
|
31
35
|
|
32
|
-
opts.
|
36
|
+
opts.on('-o', '--output OUTPUTFILE', String, 'File to output to') do |file|
|
37
|
+
options[:output] = file
|
38
|
+
end
|
39
|
+
|
40
|
+
opts.on_tail('-h', '--help', 'Show help message') do
|
33
41
|
puts opts
|
34
42
|
exit
|
35
43
|
end
|
36
44
|
end.parse!
|
37
45
|
|
38
|
-
|
39
46
|
network_scanner = NetworkScanner.new
|
40
47
|
if options[:pool]
|
48
|
+
unless options[:pool] > 0
|
49
|
+
raise ArgumentError.new('Specify a pool size greater than 0')
|
50
|
+
end
|
41
51
|
network_scanner.pool_size = options[:pool]
|
42
52
|
end
|
43
53
|
|
54
|
+
if options[:format]
|
55
|
+
unless ['text','json'].include?(options[:format])
|
56
|
+
raise ArgumentError.new('Specify either text or json as a format')
|
57
|
+
end
|
58
|
+
network_scanner.format = options[:format]
|
59
|
+
end
|
60
|
+
|
61
|
+
if options[:output]
|
62
|
+
network_scanner.output_name = options[:output]
|
63
|
+
end
|
64
|
+
|
44
65
|
if options[:interface]
|
45
66
|
network_scanner.get_interface_ips(options[:interface])
|
46
67
|
end
|
@@ -50,11 +71,11 @@ if options[:range]
|
|
50
71
|
end
|
51
72
|
|
52
73
|
if options[:cache]
|
53
|
-
network_scanner.
|
74
|
+
network_scanner.get_cache_ips(options[:cache])
|
54
75
|
end
|
55
76
|
|
56
|
-
if options[:
|
57
|
-
network_scanner.
|
77
|
+
if options[:ping]
|
78
|
+
network_scanner.check_pings
|
58
79
|
end
|
59
80
|
|
60
81
|
if options[:port]
|
data/lib/network_scanner.rb
CHANGED
@@ -24,10 +24,19 @@ module NetworkScanner
|
|
24
24
|
end
|
25
25
|
|
26
26
|
class Scanner
|
27
|
-
attr_accessor :pool_size
|
27
|
+
attr_accessor :pool_size, :format, :output_name
|
28
28
|
|
29
29
|
def initialize(opts = {})
|
30
30
|
@pool_size = 100
|
31
|
+
@format = 'text'
|
32
|
+
end
|
33
|
+
|
34
|
+
def text?
|
35
|
+
@format == 'text'
|
36
|
+
end
|
37
|
+
|
38
|
+
def json?
|
39
|
+
@format == 'json'
|
31
40
|
end
|
32
41
|
|
33
42
|
def get_interface_ips(interface)
|
@@ -59,7 +68,6 @@ module NetworkScanner
|
|
59
68
|
end
|
60
69
|
|
61
70
|
puts "Checking ips in (#{first_range}).(#{second_range}).(#{third_range}).(#{fourth_range})"
|
62
|
-
@ips = @ips_to_check
|
63
71
|
return @ips_to_check
|
64
72
|
end
|
65
73
|
|
@@ -83,26 +91,57 @@ module NetworkScanner
|
|
83
91
|
end
|
84
92
|
|
85
93
|
puts "Checking ips in (#{first_range}).(#{second_range}).(#{third_range}).(#{fourth_range})"
|
86
|
-
@ips = @ips_to_check
|
87
94
|
return @ips_to_check
|
88
95
|
end
|
89
96
|
|
90
|
-
def
|
91
|
-
|
97
|
+
def get_cache_ips(file)
|
98
|
+
@ips_to_check = []
|
99
|
+
|
100
|
+
if text?
|
101
|
+
File.open(file).each_line do |ip|
|
102
|
+
@ips_to_check << ip
|
103
|
+
end
|
104
|
+
elsif json?
|
105
|
+
JSON.parse(File.read(file)).each do |ip|
|
106
|
+
@ips_to_check << ip
|
107
|
+
end
|
108
|
+
end
|
109
|
+
return @ips_to_check
|
110
|
+
end
|
111
|
+
|
112
|
+
def check_pings
|
113
|
+
raise Exception.new("Must specify ips to check(interface/range/cache)") unless @ips_to_check
|
92
114
|
|
93
115
|
@ips = []
|
94
116
|
|
95
117
|
pool = Thread.pool(@pool_size)
|
96
118
|
|
119
|
+
if self.output_name
|
120
|
+
out = File.open(self.output_name, 'w')
|
121
|
+
else
|
122
|
+
out = STDOUT
|
123
|
+
end
|
124
|
+
|
97
125
|
@ips_to_check.each do |ip|
|
98
126
|
pool.process do
|
99
127
|
# For some reason &> isn't working, so pipe stdout and then stderr
|
100
|
-
|
128
|
+
if system("ping -c 1 #{ip} >> /dev/null 2> /dev/null")
|
129
|
+
@ips << ip
|
130
|
+
if text?
|
131
|
+
out.print "#{ip}\n"
|
132
|
+
end
|
133
|
+
end
|
101
134
|
end
|
102
135
|
end
|
103
136
|
|
104
137
|
pool.shutdown
|
105
138
|
|
139
|
+
if json?
|
140
|
+
out.puts(JSON.pretty_generate(@ips))
|
141
|
+
end
|
142
|
+
|
143
|
+
out.close unless out == STDOUT
|
144
|
+
|
106
145
|
return @ips
|
107
146
|
end
|
108
147
|
|
@@ -117,30 +156,40 @@ module NetworkScanner
|
|
117
156
|
end
|
118
157
|
|
119
158
|
def check_ports(port)
|
120
|
-
raise Exception.new("Must scan ips first (Specify an interface or cacheread)") unless @
|
159
|
+
raise Exception.new("Must scan ips first (Specify an interface or cacheread)") unless @ips_to_check
|
121
160
|
|
122
|
-
puts "Checking for ports out of a total of #{@
|
161
|
+
puts "Checking for ports out of a total of #{@ips_to_check.length} ips"
|
162
|
+
|
163
|
+
if self.output_name
|
164
|
+
out = File.open(self.output_name, 'w')
|
165
|
+
else
|
166
|
+
out = STDOUT
|
167
|
+
end
|
123
168
|
|
124
169
|
pool = Thread.pool(@pool_size)
|
125
170
|
|
126
|
-
@ips
|
171
|
+
@ips = []
|
172
|
+
|
173
|
+
@ips_to_check.each do |ip|
|
127
174
|
pool.process do
|
128
|
-
|
175
|
+
if port_open?(ip, port)
|
176
|
+
@ips << ip
|
177
|
+
if text?
|
178
|
+
out.print "#{ip}\n"
|
179
|
+
end
|
180
|
+
end
|
129
181
|
end
|
130
182
|
end
|
131
183
|
|
132
184
|
pool.shutdown
|
133
|
-
end
|
134
185
|
|
135
|
-
|
136
|
-
|
137
|
-
|
186
|
+
if json?
|
187
|
+
out.puts(JSON.pretty_generate(@ips))
|
188
|
+
end
|
138
189
|
|
139
|
-
|
140
|
-
end
|
190
|
+
out.close unless out == STDOUT
|
141
191
|
|
142
|
-
|
143
|
-
@ips = JSON.parse(File.read(file))
|
192
|
+
return @ips
|
144
193
|
end
|
145
194
|
end
|
146
195
|
end
|