network_scanner 0.0.2 → 0.1.0
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 +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
|