arp_scan 0.0.3 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/Gemfile +8 -1
- data/Gemfile.lock +26 -0
- data/README.md +6 -2
- data/arp_scan.gemspec +11 -12
- data/lib/arp_scan.rb +13 -7
- data/lib/arp_scan/arp_scanner.rb +14 -6
- data/lib/arp_scan/host.rb +28 -9
- data/lib/arp_scan/scan_report.rb +59 -14
- data/lib/arp_scan/scan_result_processor.rb +25 -7
- data/lib/arp_scan/version.rb +3 -1
- data/spec/arp_scan_spec.rb +6 -13
- data/spec/arp_scanner_spec.rb +9 -6
- data/spec/host_spec.rb +20 -12
- data/spec/scan_report_spec.rb +63 -38
- data/spec/scan_result_processor_spec.rb +41 -32
- data/spec/spec_helper.rb +3 -0
- metadata +11 -37
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 768a6997ecf0acffce32b3d52a16994e892b8f6fd93ec887613aebd478a6a86b
|
4
|
+
data.tar.gz: d8c053296aae885d75e79b70a71d4e7264fdc3f5cf61c84d65b3019b89e56262
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 62d6e68337f32a52808e63dae880d09191b3b353c4338e4b05ee4349ed23572c594badb21af97a1336bba20dbad6b1d5aec23889acc16de63aa3e9e1ce8abbed
|
7
|
+
data.tar.gz: af52cd4506b2a847041e296fbf9d2483a0fb23a2c5e520b45168850ef986105736be7e0512832a88b39390c218a7eb5df5e10d233566af9107f9a8c1b745ebf6
|
data/Gemfile
CHANGED
data/Gemfile.lock
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
diff-lcs (1.4.4)
|
5
|
+
rspec (3.0.0)
|
6
|
+
rspec-core (~> 3.0.0)
|
7
|
+
rspec-expectations (~> 3.0.0)
|
8
|
+
rspec-mocks (~> 3.0.0)
|
9
|
+
rspec-core (3.0.4)
|
10
|
+
rspec-support (~> 3.0.0)
|
11
|
+
rspec-expectations (3.0.4)
|
12
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
13
|
+
rspec-support (~> 3.0.0)
|
14
|
+
rspec-mocks (3.0.4)
|
15
|
+
rspec-support (~> 3.0.0)
|
16
|
+
rspec-support (3.0.4)
|
17
|
+
|
18
|
+
PLATFORMS
|
19
|
+
x86_64-linux
|
20
|
+
|
21
|
+
DEPENDENCIES
|
22
|
+
rspec
|
23
|
+
rspec-support (~> 3.0.0)
|
24
|
+
|
25
|
+
BUNDLED WITH
|
26
|
+
2.2.15
|
data/README.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# ARPScan
|
2
2
|
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/arp_scan.svg)](http://badge.fury.io/rb/arp_scan)
|
4
|
+
<a href="https://codeclimate.com/github/mikerodrigues/arp_scan"><img src="https://codeclimate.com/github/mikerodrigues/arp_scan/badges/gpa.svg" /></a>
|
5
|
+
|
3
6
|
Very simple wrapper for using and parsing output from `arp-scan`.
|
4
7
|
|
5
8
|
You will need to make sure `arp-scan` is installed. See the arp-scan homepage at http://www.nta-monitor.com/tools/arp-scan/
|
@@ -24,8 +27,8 @@ should probably go with the `/etc/sudoers` method.
|
|
24
27
|
|
25
28
|
## Notes
|
26
29
|
|
27
|
-
|
28
|
-
|
30
|
+
There are some tests now, but output containing host names instead of IP
|
31
|
+
addresses will not be properly parsed. This might be fixed soon.
|
29
32
|
|
30
33
|
## Installation
|
31
34
|
|
@@ -70,6 +73,7 @@ report.reply_count => 2
|
|
70
73
|
report.scan_rate => 169.99 # hosts/sec
|
71
74
|
report.scan_time => 1.586 # seconds
|
72
75
|
report.version => "1.8.1" # arp-scan version
|
76
|
+
report.arguments => "--localnet"
|
73
77
|
```
|
74
78
|
|
75
79
|
Each `ScanReport` also holds zero or more `Host` objects representing founds
|
data/arp_scan.gemspec
CHANGED
@@ -1,23 +1,22 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'arp_scan/version'
|
5
6
|
|
6
7
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
8
|
+
spec.name = 'arp_scan'
|
8
9
|
spec.version = ARPScan::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
11
|
-
spec.summary =
|
12
|
-
spec.description =
|
13
|
-
spec.homepage =
|
14
|
-
spec.license =
|
10
|
+
spec.authors = ['Michael Rodrigues']
|
11
|
+
spec.email = ['mikebrodrigues@gmail.com']
|
12
|
+
spec.summary = 'A ruby wrapper for the arp-scan utility.'
|
13
|
+
spec.description = 'Use the arp-scan utility from your ruby programs.'
|
14
|
+
spec.homepage = 'https://github.com/mikerodrigues/arp_scan'
|
15
|
+
spec.license = 'MIT'
|
15
16
|
|
16
17
|
spec.files = `git ls-files -z`.split("\x0")
|
17
18
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
-
spec.require_paths = [
|
20
|
+
spec.require_paths = ['lib']
|
20
21
|
|
21
|
-
spec.add_development_dependency "bundler", "~> 1.7"
|
22
|
-
spec.add_development_dependency "rake", "~> 10.0"
|
23
22
|
end
|
data/lib/arp_scan.rb
CHANGED
@@ -1,13 +1,19 @@
|
|
1
|
-
|
2
|
-
require_relative "./arp_scan/arp_scanner"
|
3
|
-
require_relative "./arp_scan/scan_report"
|
4
|
-
require_relative "./arp_scan/scan_result_processor"
|
5
|
-
require_relative "./arp_scan/host"
|
1
|
+
# frozen_string_literal: true
|
6
2
|
|
7
|
-
|
3
|
+
require_relative './arp_scan/version'
|
4
|
+
require_relative './arp_scan/arp_scanner'
|
5
|
+
require_relative './arp_scan/scan_report'
|
6
|
+
require_relative './arp_scan/scan_result_processor'
|
7
|
+
require_relative './arp_scan/host'
|
8
8
|
|
9
|
-
|
9
|
+
# This module just acts as a namespace for the gem.
|
10
|
+
#
|
11
|
+
module ARPScan; end
|
10
12
|
|
13
|
+
# The main interface for the gem. This method accepts arp-scan arguments in the
|
14
|
+
# form of a single string. Currently only IP addresses (no hostnames) are
|
15
|
+
# supported.
|
16
|
+
#
|
11
17
|
def ARPScan(argument_string = nil)
|
12
18
|
ARPScan::ARPScanner.scan argument_string
|
13
19
|
end
|
data/lib/arp_scan/arp_scanner.rb
CHANGED
@@ -1,29 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative './scan_result_processor'
|
2
4
|
|
3
5
|
module ARPScan
|
6
|
+
# This module manages finding the arp-scan binary and running the scan. It
|
7
|
+
# delegates the parsing of the scan results to the ScanResultProcessor module.
|
8
|
+
#
|
4
9
|
module ARPScanner
|
5
|
-
|
6
10
|
# I got this method from: http://stackoverflow.com/questions/2108727
|
7
11
|
# Cross-platform way of finding an executable in the $PATH.
|
8
12
|
#
|
9
13
|
# which('ruby') #=> /usr/bin/ruby
|
14
|
+
#
|
10
15
|
def self.which(cmd)
|
11
16
|
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
12
17
|
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
13
|
-
exts.each
|
18
|
+
exts.each do |ext|
|
14
19
|
exe = File.join(path, "#{cmd}#{ext}")
|
15
20
|
return exe if File.executable?(exe) && !File.directory?(exe)
|
16
|
-
|
21
|
+
end
|
17
22
|
end
|
18
|
-
|
23
|
+
raise 'arp-scan binary not found, make sure it is installed'
|
19
24
|
end
|
20
25
|
|
26
|
+
# This method runs the actual scan by passing the arguments to the arp-scan
|
27
|
+
# binary. The results are passed to the ScanResultProcessor and a ScanReport
|
28
|
+
# is returned.
|
29
|
+
#
|
21
30
|
def self.scan(argument_string = nil)
|
22
31
|
result_string = `#{which 'arp-scan'} #{argument_string}`
|
23
|
-
ScanResultProcessor.process(result_string)
|
32
|
+
ScanResultProcessor.process(result_string, argument_string)
|
24
33
|
end
|
25
34
|
|
26
35
|
private_class_method :which
|
27
36
|
end
|
28
37
|
end
|
29
|
-
|
data/lib/arp_scan/host.rb
CHANGED
@@ -1,25 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ARPScan
|
4
|
+
# Abstracts replying hosts from the arp-scan output.
|
5
|
+
#
|
2
6
|
class Host
|
3
|
-
|
7
|
+
# The IP address of the host.
|
8
|
+
#
|
9
|
+
attr_reader :ip_addr
|
10
|
+
|
11
|
+
# The MAC address of the host.
|
12
|
+
#
|
13
|
+
attr_reader :mac
|
14
|
+
|
15
|
+
# OUI information about the host.
|
16
|
+
#
|
17
|
+
attr_reader :oui
|
4
18
|
|
19
|
+
# Create a new hsot. IP address, MAC address and OUI information are
|
20
|
+
# expected.
|
21
|
+
#
|
5
22
|
def initialize(ip_addr, mac, oui)
|
6
23
|
@ip_addr = ip_addr
|
7
24
|
@mac = mac
|
8
25
|
@oui = oui
|
9
26
|
end
|
10
27
|
|
28
|
+
# Returns a hash representation of the Host object.
|
29
|
+
#
|
11
30
|
def to_hash
|
12
|
-
{ :
|
13
|
-
:
|
14
|
-
:
|
15
|
-
}
|
31
|
+
{ ip_addr: @ip_addr,
|
32
|
+
mac: @mac,
|
33
|
+
oui: @oui }
|
16
34
|
end
|
17
35
|
|
36
|
+
# Returns an array representation of the Host object.
|
37
|
+
#
|
18
38
|
def to_array
|
19
|
-
[
|
20
|
-
|
21
|
-
|
22
|
-
]
|
39
|
+
[@ip_addr,
|
40
|
+
@mac,
|
41
|
+
@oui]
|
23
42
|
end
|
24
43
|
end
|
25
44
|
end
|
data/lib/arp_scan/scan_report.rb
CHANGED
@@ -1,8 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ARPScan
|
4
|
+
# This class abstracts the string output from arp-scan into an Object. A
|
5
|
+
# ScanReports are usually created through the ScanResultProcessor module.
|
6
|
+
#
|
2
7
|
class ScanReport
|
8
|
+
# Array of Host objects.
|
9
|
+
#
|
10
|
+
attr_reader :hosts
|
11
|
+
|
12
|
+
# Name of the interface used for the scan.
|
13
|
+
#
|
14
|
+
attr_reader :interface
|
15
|
+
|
16
|
+
# Information about the interface type.
|
17
|
+
#
|
18
|
+
attr_reader :datalink
|
19
|
+
|
20
|
+
# `arp-scan` version number.
|
21
|
+
#
|
22
|
+
attr_reader :version
|
23
|
+
|
24
|
+
# Size of the scan range ( # of hosts scanned ).
|
25
|
+
#
|
26
|
+
attr_reader :range_size
|
3
27
|
|
4
|
-
|
28
|
+
# Duration of the scan in seconds, returns a Float.
|
29
|
+
#
|
30
|
+
attr_reader :scan_time
|
5
31
|
|
32
|
+
# The rate of the scan in hosts per second, returns a Float.
|
33
|
+
#
|
34
|
+
attr_reader :scan_rate
|
35
|
+
|
36
|
+
# The number of hosts that replied to the scan, returns a Fixnum
|
37
|
+
attr_reader :reply_count
|
38
|
+
|
39
|
+
# The argument string passed to ARPScan
|
40
|
+
attr_reader :arguments
|
41
|
+
|
42
|
+
# Create a new scan report, passing in every attribute. The best way to do
|
43
|
+
# this is with the ScanResultProcessor module.
|
44
|
+
#
|
6
45
|
def initialize(hash)
|
7
46
|
@hosts = hash[:hosts]
|
8
47
|
@interface = hash[:interface]
|
@@ -12,29 +51,35 @@ module ARPScan
|
|
12
51
|
@scan_time = Float(hash[:scan_time])
|
13
52
|
@scan_rate = Float(hash[:scan_rate])
|
14
53
|
@reply_count = Integer(hash[:reply_count])
|
54
|
+
@arguments = hash[:arguments]
|
15
55
|
end
|
16
56
|
|
57
|
+
# Returns an array representation of the ScanReport. Metadata about the
|
58
|
+
# scan, and an array of Host arrays comprise the array.
|
59
|
+
#
|
17
60
|
def to_array
|
18
|
-
|
61
|
+
instance_variables.map do |var|
|
19
62
|
if var == :@hosts
|
20
|
-
|
63
|
+
instance_variable_get(var).map(&:to_array)
|
21
64
|
else
|
22
|
-
|
65
|
+
instance_variable_get(var)
|
23
66
|
end
|
24
67
|
end
|
25
68
|
end
|
26
69
|
|
70
|
+
# Returns a hash representation of the ScanReport. Metadata about the scan,
|
71
|
+
# and array of Host hashes comprise the hash.
|
72
|
+
#
|
27
73
|
def to_hash
|
28
|
-
{ :
|
29
|
-
:
|
30
|
-
:
|
31
|
-
:
|
32
|
-
:
|
33
|
-
:
|
34
|
-
:
|
35
|
-
:
|
36
|
-
|
74
|
+
{ hosts: @hosts.map(&:to_hash),
|
75
|
+
interface: @interface,
|
76
|
+
datalink: @datalink,
|
77
|
+
version: @version,
|
78
|
+
range_size: @range_size,
|
79
|
+
scan_time: @scan_time,
|
80
|
+
scan_rate: @scan_rate,
|
81
|
+
reply_count: @reply_count,
|
82
|
+
arguments: @arguments }
|
37
83
|
end
|
38
|
-
|
39
84
|
end
|
40
85
|
end
|
@@ -1,23 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative './host'
|
2
4
|
require_relative './scan_report'
|
3
5
|
|
4
6
|
module ARPScan
|
7
|
+
# This module is an interface for creating ScanReport objects from arp-scan
|
8
|
+
# output.
|
9
|
+
#
|
5
10
|
module ScanResultProcessor
|
11
|
+
# Regex to capture IP address, MAC address, and OUI information
|
12
|
+
#
|
13
|
+
HOST_ENTRY_REGEX = /(\d+.\d+.\d+.\d+)\s(\w\w:\w\w:\w\w:\w\w:\w\w:\w\w)\s(.*)/.freeze
|
14
|
+
|
15
|
+
# Regex to capture interface and datalink
|
16
|
+
#
|
17
|
+
INTERFACE_SUMMARY_REGEX = /Interface: (?<interface>.+), datalink type: (?<datalink>.*$)/.freeze
|
6
18
|
|
7
|
-
|
8
|
-
|
9
|
-
|
19
|
+
# Regex to capture arp-scan version, scan range size, scan time, scan rate,
|
20
|
+
# and the number of responding hosts.
|
21
|
+
#
|
22
|
+
SCAN_SUMMARY_REGEX = %r{Ending arp-scan (?<version>.*): (?<range_size>.*) hosts scanned in (?<scan_time>.*) seconds \((?<scan_rate>.*) hosts/sec\). (?<reply_count>.*) responded}.freeze
|
10
23
|
|
11
|
-
|
24
|
+
# This method does the actual processing of the arp-scan result string. It
|
25
|
+
# uses the Regexes to capture data then passes the results to ScanRepor.new
|
26
|
+
# to return a ScanReport object.
|
27
|
+
#
|
28
|
+
def self.process(string, arguments)
|
12
29
|
results = {}
|
13
|
-
results[:hosts] = string.scan(
|
30
|
+
results[:hosts] = string.scan(HOST_ENTRY_REGEX).map { |entry| Host.new(*entry) }
|
14
31
|
results[:interface],
|
15
|
-
results[:datalink] = string.scan(
|
32
|
+
results[:datalink] = string.scan(INTERFACE_SUMMARY_REGEX)[0]
|
16
33
|
results[:version],
|
17
34
|
results[:range_size],
|
18
35
|
results[:scan_time],
|
19
36
|
results[:scan_rate],
|
20
|
-
results[:reply_count] = string.scan(
|
37
|
+
results[:reply_count] = string.scan(SCAN_SUMMARY_REGEX)[0]
|
38
|
+
results[:arguments] = arguments
|
21
39
|
ScanReport.new(results)
|
22
40
|
end
|
23
41
|
end
|
data/lib/arp_scan/version.rb
CHANGED
data/spec/arp_scan_spec.rb
CHANGED
@@ -1,17 +1,10 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
report = ARPScan('-l')
|
5
|
-
|
6
|
-
it "is a method you can pass arp-scan arguments to as a string" do
|
7
|
-
expect(ARPScan('-l').class).to eq(ARPScan::ScanReport)
|
8
|
-
end
|
3
|
+
require_relative './spec_helper.rb'
|
9
4
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
it "returns a nested array of attributes" do
|
15
|
-
expect(report.to_array.class).to eq(Array)
|
5
|
+
RSpec.describe ARPScan do
|
6
|
+
ARPScan('-l')
|
7
|
+
it 'is a method' do
|
8
|
+
expect(ARPScan.respond_to?('__send__')).to eq(true)
|
16
9
|
end
|
17
10
|
end
|
data/spec/arp_scanner_spec.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require_relative './spec_helper'
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
module ARPScan
|
6
|
+
describe ARPScanner do
|
7
|
+
describe '#scan' do
|
8
|
+
it 'accepts arp-scan arguments as a string' do
|
9
|
+
expect(ARPScanner.scan('-l').class).to eq(ScanReport)
|
10
|
+
end
|
11
|
+
end
|
7
12
|
end
|
8
|
-
|
9
13
|
end
|
10
|
-
|
data/spec/host_spec.rb
CHANGED
@@ -1,19 +1,27 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require_relative './spec_helper'
|
4
4
|
|
5
|
-
|
5
|
+
module ARPScan
|
6
|
+
describe Host do
|
7
|
+
host = Host.new('10.0.0.1', '00:11:22:33:44:55', 'NIC Manufacturer')
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
-
|
9
|
+
describe '#ip_addr' do
|
10
|
+
it "returns the host's IP address" do
|
11
|
+
expect(host.ip_addr).to eq('10.0.0.1')
|
12
|
+
end
|
13
|
+
end
|
10
14
|
|
11
|
-
|
12
|
-
|
13
|
-
|
15
|
+
describe '#mac' do
|
16
|
+
it "returns the host's MAC address" do
|
17
|
+
expect(host.mac).to eq('00:11:22:33:44:55')
|
18
|
+
end
|
19
|
+
end
|
14
20
|
|
15
|
-
|
16
|
-
|
21
|
+
describe '#oui' do
|
22
|
+
it "returns the host's OUI information" do
|
23
|
+
expect(host.oui).to eq('NIC Manufacturer')
|
24
|
+
end
|
25
|
+
end
|
17
26
|
end
|
18
|
-
|
19
27
|
end
|
data/spec/scan_report_spec.rb
CHANGED
@@ -1,51 +1,76 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require_relative './spec_helper'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
5
|
+
module ARPScan
|
6
|
+
describe ScanReport do
|
7
|
+
report_hash = {
|
8
|
+
hosts: [Host.new('10.0.0.1', '00:11:22:33:44:55', 'NIC Manufacturer')],
|
9
|
+
interface: 'eth0',
|
10
|
+
datalink: 'EN10MB (Ethernet)',
|
11
|
+
version: '1.8.1',
|
12
|
+
range_size: 256,
|
13
|
+
scan_time: 1.503,
|
14
|
+
scan_rate: 170.33,
|
15
|
+
reply_count: 1,
|
16
|
+
arguments: '-l'
|
17
|
+
}
|
15
18
|
|
16
|
-
|
19
|
+
scan_report = ScanReport.new(report_hash)
|
17
20
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
+
describe '#hosts' do
|
22
|
+
it 'returns an Array of Host objects' do
|
23
|
+
expect(scan_report.hosts.class).to eq(Array)
|
24
|
+
expect(scan_report.hosts.first.class).to eq(Host)
|
25
|
+
end
|
26
|
+
end
|
21
27
|
|
22
|
-
|
23
|
-
|
24
|
-
|
28
|
+
describe '#interface' do
|
29
|
+
it 'returns the network interface used to scan' do
|
30
|
+
expect(scan_report.interface).to eq('eth0')
|
31
|
+
end
|
32
|
+
end
|
25
33
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
expect(scan_report.version).to eq('1.8.1')
|
32
|
-
end
|
34
|
+
describe '#datalink' do
|
35
|
+
it 'returns the datalink type of the network interface used to scan' do
|
36
|
+
expect(scan_report.datalink).to eq('EN10MB (Ethernet)')
|
37
|
+
end
|
38
|
+
end
|
33
39
|
|
34
|
-
|
35
|
-
|
36
|
-
|
40
|
+
describe '#version' do
|
41
|
+
it 'returns the version of `arp-scan` used for the scan' do
|
42
|
+
expect(scan_report.version).to eq('1.8.1')
|
43
|
+
end
|
44
|
+
end
|
37
45
|
|
38
|
-
|
39
|
-
|
40
|
-
|
46
|
+
describe '#range_size' do
|
47
|
+
it 'returns the size of the range of scanned IPs' do
|
48
|
+
expect(scan_report.range_size).to eq(256)
|
49
|
+
end
|
50
|
+
end
|
41
51
|
|
42
|
-
|
43
|
-
|
44
|
-
|
52
|
+
describe '#scan_time' do
|
53
|
+
it 'returns the duration of the scan in seconds' do
|
54
|
+
expect(scan_report.scan_time).to eq(1.503)
|
55
|
+
end
|
56
|
+
end
|
45
57
|
|
46
|
-
|
47
|
-
|
48
|
-
|
58
|
+
describe '#scan_rate' do
|
59
|
+
it 'returns the scan rate in hosts per second' do
|
60
|
+
expect(scan_report.scan_rate).to eq(170.33)
|
61
|
+
end
|
62
|
+
end
|
49
63
|
|
64
|
+
describe '#reply_count' do
|
65
|
+
it 'returns the number of hosts that responded' do
|
66
|
+
expect(scan_report.reply_count).to eq(1)
|
67
|
+
end
|
68
|
+
end
|
50
69
|
|
70
|
+
describe '#arguments' do
|
71
|
+
it 'returns the argument string used to scan' do
|
72
|
+
expect(scan_report.arguments).to eq('-l')
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
51
76
|
end
|
@@ -1,44 +1,53 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require_relative './spec_helper'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
end
|
5
|
+
module ARPScan
|
6
|
+
describe ScanResultProcessor do
|
7
|
+
argument_string = '-l'
|
8
|
+
report_string = File.read './test_output.txt'
|
9
|
+
report = ARPScan::ScanResultProcessor.process(report_string, argument_string)
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
describe '#process' do
|
12
|
+
it 'processes arp-scan output to create a ScanReport object' do
|
13
|
+
expect(report.class).to eq(ARPScan::ScanReport)
|
14
|
+
end
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
it 'builds an array of Host objects' do
|
17
|
+
expect(report.hosts[0].class).to eq(ARPScan::Host)
|
18
|
+
end
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
it 'parses the scan interface name' do
|
21
|
+
expect(report.interface).to eq('eth0')
|
22
|
+
end
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
it 'parses the datalink type information' do
|
25
|
+
expect(report.datalink).to eq('EN10MB (Ethernet)')
|
26
|
+
end
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
28
|
+
it 'parses the version of arp-scan that ran the scan' do
|
29
|
+
expect(report.version).to eq('1.8.1')
|
30
|
+
end
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
it 'parses the number of hosts scanned' do
|
33
|
+
expect(report.range_size).to eq(256)
|
34
|
+
end
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
36
|
+
it 'parses the duration of the scan in seconds' do
|
37
|
+
expect(report.scan_time).to eq(1.494)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'parses the rate of the scan in hosts per second' do
|
41
|
+
expect(report.scan_rate).to eq(171.35)
|
42
|
+
end
|
39
43
|
|
40
|
-
|
41
|
-
|
44
|
+
it 'parses the number of hosts that responded to the scan' do
|
45
|
+
expect(report.reply_count).to eq(1)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'includes the argument string in the report' do
|
49
|
+
expect(report.arguments).to eq('-l')
|
50
|
+
end
|
51
|
+
end
|
42
52
|
end
|
43
53
|
end
|
44
|
-
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,44 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arp_scan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Rodrigues
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
-
|
14
|
-
name: bundler
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ~>
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.7'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ~>
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '1.7'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rake
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ~>
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '10.0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ~>
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '10.0'
|
41
|
-
description: Easily use the arp_scan utility from within your ruby programs.
|
11
|
+
date: 2021-07-11 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Use the arp-scan utility from your ruby programs.
|
42
14
|
email:
|
43
15
|
- mikebrodrigues@gmail.com
|
44
16
|
executables: []
|
@@ -46,6 +18,7 @@ extensions: []
|
|
46
18
|
extra_rdoc_files: []
|
47
19
|
files:
|
48
20
|
- Gemfile
|
21
|
+
- Gemfile.lock
|
49
22
|
- LICENSE.txt
|
50
23
|
- README.md
|
51
24
|
- arp_scan.gemspec
|
@@ -60,8 +33,9 @@ files:
|
|
60
33
|
- spec/host_spec.rb
|
61
34
|
- spec/scan_report_spec.rb
|
62
35
|
- spec/scan_result_processor_spec.rb
|
36
|
+
- spec/spec_helper.rb
|
63
37
|
- spec/test_output.txt
|
64
|
-
homepage:
|
38
|
+
homepage: https://github.com/mikerodrigues/arp_scan
|
65
39
|
licenses:
|
66
40
|
- MIT
|
67
41
|
metadata: {}
|
@@ -71,17 +45,16 @@ require_paths:
|
|
71
45
|
- lib
|
72
46
|
required_ruby_version: !ruby/object:Gem::Requirement
|
73
47
|
requirements:
|
74
|
-
- -
|
48
|
+
- - ">="
|
75
49
|
- !ruby/object:Gem::Version
|
76
50
|
version: '0'
|
77
51
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
52
|
requirements:
|
79
|
-
- -
|
53
|
+
- - ">="
|
80
54
|
- !ruby/object:Gem::Version
|
81
55
|
version: '0'
|
82
56
|
requirements: []
|
83
|
-
|
84
|
-
rubygems_version: 2.2.2
|
57
|
+
rubygems_version: 3.2.3
|
85
58
|
signing_key:
|
86
59
|
specification_version: 4
|
87
60
|
summary: A ruby wrapper for the arp-scan utility.
|
@@ -91,4 +64,5 @@ test_files:
|
|
91
64
|
- spec/host_spec.rb
|
92
65
|
- spec/scan_report_spec.rb
|
93
66
|
- spec/scan_result_processor_spec.rb
|
67
|
+
- spec/spec_helper.rb
|
94
68
|
- spec/test_output.txt
|