arp_scan 0.0.2 → 0.0.3

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
  SHA1:
3
- metadata.gz: a350836a9cf6579fa714992273f38bce584c7457
4
- data.tar.gz: d118e275d8c1c3e3b3e0f10588752cf96fe90ab8
3
+ metadata.gz: 21449e6fd38960eb78e357a1db2e75022ec3a0cd
4
+ data.tar.gz: 2b23e39343027d0366e1caa578f68c31722f8542
5
5
  SHA512:
6
- metadata.gz: 029d7744afbcb0a3c6bc5474bcf0f868696d33d489f44a01a1e2b4927510959acfb7c8f7ecfca5eef31c216b05422db1d397b622bd0f94b3cd2dac3a499562b5
7
- data.tar.gz: 144b8459b0c4b3b9c5997895a6790b281b1f1be5737ee9371aa2366ee764385b191fedce487b84e23c1f53198f5ed90ebf237eaeccbf55baed091918c9749787
6
+ metadata.gz: 819fbd9535f90d617d3bbe3448aea31e50fe155cafb44e25fd8c03d2b6332e14b5b42a6a5e35a9fbca3a112938eb181e07c3777fd1e02097d47b9bafc74ef10f
7
+ data.tar.gz: cc4ad8109f6426074b01f1dddd5b5affb7bc9439658517594331b731b091534aacba601b7cd4164e2361d83cbb0278a19648788c437178445700b7efe3129f95
data/README.md CHANGED
@@ -14,7 +14,7 @@ options but be sure to understand what you're doing before you do it:
14
14
 
15
15
  * Set the SUID bit on the `arp-scan` bin:
16
16
 
17
- sudo chmod u+s /usr/bin/arp-scan`
17
+ `sudo chmod u+s /usr/bin/arp-scan`
18
18
 
19
19
  * Run your Ruby code as root (I wouldn't do this)
20
20
 
data/lib/arp_scan.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require_relative "./arp_scan/version"
2
2
  require_relative "./arp_scan/arp_scanner"
3
3
  require_relative "./arp_scan/scan_report"
4
- require_relative "./arp_scan/output_processor"
4
+ require_relative "./arp_scan/scan_result_processor"
5
5
  require_relative "./arp_scan/host"
6
6
 
7
7
  module ARPScan
@@ -1,4 +1,4 @@
1
- require_relative './arp_scanner'
1
+ require_relative './scan_result_processor'
2
2
 
3
3
  module ARPScan
4
4
  module ARPScanner
@@ -18,12 +18,12 @@ module ARPScan
18
18
  return nil
19
19
  end
20
20
 
21
-
22
21
  def self.scan(argument_string = nil)
23
- @arp_scan_path = which 'arp-scan'
24
- output_string = `#{@arp_scan_path} #{argument_string}`
25
- OutputProcessor.process(output_string)
22
+ result_string = `#{which 'arp-scan'} #{argument_string}`
23
+ ScanResultProcessor.process(result_string)
26
24
  end
25
+
26
+ private_class_method :which
27
27
  end
28
28
  end
29
29
 
data/lib/arp_scan/host.rb CHANGED
@@ -7,5 +7,19 @@ module ARPScan
7
7
  @mac = mac
8
8
  @oui = oui
9
9
  end
10
+
11
+ def to_hash
12
+ { :ip_addr => @ip_addr,
13
+ :mac => @mac,
14
+ :oui => @oui
15
+ }
16
+ end
17
+
18
+ def to_array
19
+ [ @ip_addr,
20
+ @mac,
21
+ @oui
22
+ ]
23
+ end
10
24
  end
11
25
  end
@@ -1,7 +1,7 @@
1
1
  module ARPScan
2
2
  class ScanReport
3
3
 
4
- attr_reader :interface, :datalink, :version, :range_size, :scan_time, :scan_rate, :reply_count
4
+ attr_reader :hosts, :interface, :datalink, :version, :range_size, :scan_time, :scan_rate, :reply_count
5
5
 
6
6
  def initialize(hash)
7
7
  @hosts = hash[:hosts]
@@ -13,5 +13,28 @@ module ARPScan
13
13
  @scan_rate = Float(hash[:scan_rate])
14
14
  @reply_count = Integer(hash[:reply_count])
15
15
  end
16
+
17
+ def to_array
18
+ self.instance_variables.map do |var|
19
+ if var == :@hosts
20
+ self.instance_variable_get(var).map {|host| host.to_array}
21
+ else
22
+ self.instance_variable_get(var)
23
+ end
24
+ end
25
+ end
26
+
27
+ def to_hash
28
+ { :hosts => @hosts.map {|host| host.to_hash},
29
+ :interface => @interface,
30
+ :datalink => @datalink,
31
+ :version => @version,
32
+ :range_size => @range_size,
33
+ :scan_time => @scan_time,
34
+ :scan_rate => @scan_rate,
35
+ :reply_count => @reply_count
36
+ }
37
+ end
38
+
16
39
  end
17
40
  end
@@ -0,0 +1,24 @@
1
+ require_relative './host'
2
+ require_relative './scan_report'
3
+
4
+ module ARPScan
5
+ module ScanResultProcessor
6
+
7
+ Host_Entry_Regex = /(\d+.\d+.\d+.\d+)\s(\w\w:\w\w:\w\w:\w\w:\w\w:\w\w)\s(.*)/
8
+ Interface_Summary_Regex = /Interface: (?<interface>.+), datalink type: (?<datalink>.*$)/
9
+ Scan_Summary_Regex = /Ending arp-scan (?<version>.*): (?<range_size>.*) hosts scanned in (?<scan_time>.*) seconds \((?<scan_rate>.*) hosts\/sec\). (?<reply_count>.*) responded/
10
+
11
+ def self.process(string)
12
+ results = {}
13
+ results[:hosts] = string.scan(Host_Entry_Regex).map {|entry| Host.new(*entry)}
14
+ results[:interface],
15
+ results[:datalink] = string.scan(Interface_Summary_Regex)[0]
16
+ results[:version],
17
+ results[:range_size],
18
+ results[:scan_time],
19
+ results[:scan_rate],
20
+ results[:reply_count] = string.scan(Scan_Summary_Regex)[0]
21
+ ScanReport.new(results)
22
+ end
23
+ end
24
+ end
@@ -1,3 +1,3 @@
1
1
  module ARPScan
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -1,8 +1,17 @@
1
- require '../lib/arp_scan.rb'
1
+ require '../lib/arp_scan'
2
2
 
3
- describe ARPScan, '#scan' do
4
- it 'returns a ScanReport' do
5
- report = ARPScan.scan('-I eth0.748 128.111.186.1-128.111.186.75')
6
- report.class.should eq(ARPScan::ScanReport)
3
+ RSpec.describe ARPScan do
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
9
+
10
+ it "returns a nested hash of attributes" do
11
+ expect(report.to_hash.class).to eq(Hash)
12
+ end
13
+
14
+ it "returns a nested array of attributes" do
15
+ expect(report.to_array.class).to eq(Array)
7
16
  end
8
17
  end
@@ -0,0 +1,10 @@
1
+ require '../lib/arp_scan'
2
+
3
+ RSpec.describe ARPScan::ARPScanner do
4
+
5
+ it "has a #scan method to pass arp-scan arguments to as a string" do
6
+ expect(ARPScan::ARPScanner.scan('-l').class).to eq(ARPScan::ScanReport)
7
+ end
8
+
9
+ end
10
+
data/spec/host_spec.rb ADDED
@@ -0,0 +1,19 @@
1
+ require '../lib/arp_scan'
2
+
3
+ RSpec.describe ARPScan::Host do
4
+
5
+ host = ARPScan::Host.new('10.0.0.1', '00:11:22:33:44:55', "NIC Manufacturer")
6
+
7
+ it "contains the host's IP address" do
8
+ expect(host.ip_addr).to eq('10.0.0.1')
9
+ end
10
+
11
+ it "contains the host's MAC address" do
12
+ expect(host.mac).to eq('00:11:22:33:44:55')
13
+ end
14
+
15
+ it "contians the host's OUI information" do
16
+ expect(host.oui).to eq('NIC Manufacturer')
17
+ end
18
+
19
+ end
@@ -1,8 +1,51 @@
1
- require '../lib/arp_scan.rb'
1
+ require '../lib/arp_scan'
2
2
 
3
- describe ARPScan, '#scan' do
4
- it 'returns a ScanReport' do
5
- report = ARPScan.scan('-I eth0.748 128.111.186.1-128.111.186.75')
6
- report.class.should eq(ARPScan::ScanReport)
3
+ RSpec.describe ARPScan::ScanReport do
4
+
5
+ report_hash = {
6
+ :hosts => [ARPScan::Host.new(*['10.0.0.1', '00:11:22:33:44:55', 'NIC Manufacturer'])],
7
+ :interface => "eth0",
8
+ :datalink => "EN10MB (Ethernet)",
9
+ :version => "1.8.1",
10
+ :range_size => 256,
11
+ :scan_time => 1.503,
12
+ :scan_rate => 170.33,
13
+ :reply_count => 1
14
+ }
15
+
16
+ scan_report = ARPScan::ScanReport.new(report_hash)
17
+
18
+ it "has a list of zero or more responding hosts" do
19
+ expect(scan_report.hosts.first.class).to eq(ARPScan::Host)
20
+ end
21
+
22
+ it "reports the network interface used to scan" do
23
+ expect(scan_report.interface).to eq("eth0")
7
24
  end
25
+
26
+ it "reports the datalink type of the network interface used to scan" do
27
+ expect(scan_report.datalink).to eq('EN10MB (Ethernet)')
28
+ end
29
+
30
+ it "reports the version of `arp-scan` used for the scan" do
31
+ expect(scan_report.version).to eq('1.8.1')
32
+ end
33
+
34
+ it "reports the size of the range of scanned IPs" do
35
+ expect(scan_report.range_size).to eq(256)
36
+ end
37
+
38
+ it "reports the duration of the scan in seconds" do
39
+ expect(scan_report.scan_time).to eq(1.503)
40
+ end
41
+
42
+ it "reports the scan rate in hosts per second" do
43
+ expect(scan_report.scan_rate).to eq(170.33)
44
+ end
45
+
46
+ it "reports the number of hosts that responded" do
47
+ expect(scan_report.reply_count).to eq(1)
48
+ end
49
+
50
+
8
51
  end
@@ -0,0 +1,44 @@
1
+ require '../lib/arp_scan'
2
+
3
+ RSpec.describe ARPScan::ScanResultProcessor do
4
+
5
+ report_string = File.read './test_output.txt'
6
+ report = ARPScan::ScanResultProcessor.process(report_string)
7
+
8
+ it "processes arp-scan output to create a ScanReport object" do
9
+ expect(report.class).to eq(ARPScan::ScanReport)
10
+ end
11
+
12
+ it "builds an array of Host objects" do
13
+ expect(report.hosts[0].class).to eq(ARPScan::Host)
14
+ end
15
+
16
+ it "parses the scan interface name" do
17
+ expect(report.interface).to eq("eth0")
18
+ end
19
+
20
+ it "parses the datalink type information" do
21
+ expect(report.datalink).to eq("EN10MB (Ethernet)")
22
+ end
23
+
24
+ it "parses the version of arp-scan that ran the scan" do
25
+ expect(report.version).to eq('1.8.1')
26
+ end
27
+
28
+ it "parses the number of hosts scanned" do
29
+ expect(report.range_size).to eq(256)
30
+ end
31
+
32
+ it "parses the duration of the scan in seconds" do
33
+ expect(report.scan_time).to eq(1.494)
34
+ end
35
+
36
+ it "parses the rate of the scan in hosts per second" do
37
+ expect(report.scan_rate).to eq(171.35)
38
+ end
39
+
40
+ it "parses the number of hosts that responded to the scan" do
41
+ expect(report.reply_count).to eq(1)
42
+ end
43
+ end
44
+
@@ -0,0 +1,6 @@
1
+ Interface: eth0, datalink type: EN10MB (Ethernet)
2
+ Starting arp-scan 1.8.1 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
3
+ 10.0.0.1 00:11:22:33:44:55 NIC Manufacturer
4
+
5
+ 1 packets received by filter, 0 packets dropped by kernel
6
+ Ending arp-scan 1.8.1: 256 hosts scanned in 1.494 seconds (171.35 hosts/sec). 1 responded
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arp_scan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Rodrigues
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-06 00:00:00.000000000 Z
11
+ date: 2014-09-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,11 +52,15 @@ files:
52
52
  - lib/arp_scan.rb
53
53
  - lib/arp_scan/arp_scanner.rb
54
54
  - lib/arp_scan/host.rb
55
- - lib/arp_scan/output_processor.rb
56
55
  - lib/arp_scan/scan_report.rb
56
+ - lib/arp_scan/scan_result_processor.rb
57
57
  - lib/arp_scan/version.rb
58
58
  - spec/arp_scan_spec.rb
59
+ - spec/arp_scanner_spec.rb
60
+ - spec/host_spec.rb
59
61
  - spec/scan_report_spec.rb
62
+ - spec/scan_result_processor_spec.rb
63
+ - spec/test_output.txt
60
64
  homepage: ''
61
65
  licenses:
62
66
  - MIT
@@ -83,4 +87,8 @@ specification_version: 4
83
87
  summary: A ruby wrapper for the arp-scan utility.
84
88
  test_files:
85
89
  - spec/arp_scan_spec.rb
90
+ - spec/arp_scanner_spec.rb
91
+ - spec/host_spec.rb
86
92
  - spec/scan_report_spec.rb
93
+ - spec/scan_result_processor_spec.rb
94
+ - spec/test_output.txt
@@ -1,24 +0,0 @@
1
- require_relative './host'
2
- require_relative './scan_report'
3
-
4
- module ARPScan
5
- module OutputProcessor
6
-
7
- Host_Entry_Regex = /(\d+.\d+.\d+.\d+)\s(\w\w:\w\w:\w\w:\w\w:\w\w:\w\w)\s(.*)/
8
- Interface_Summary_Regex = /Interface: (?<interface>.+), datalink type: (?<datalink>.*$)/
9
- Received_Summary_Regex = /Ending arp-scan (?<version>.*): (?<range_size>.*) hosts scanned in (?<scan_time>.*) seconds \((?<scan_rate>.*) hosts\/sec\). (?<reply_count>.*) responded/
10
-
11
- def self.process(string)
12
- report = {}
13
- report[:hosts] = string.scan(Host_Entry_Regex).map {|entry| Host.new(*entry)}
14
- report[:interface],
15
- report[:datalink] = string.scan(Interface_Summary_Regex)[0]
16
- report[:version],
17
- report[:range_size],
18
- report[:scan_time],
19
- report[:scan_rate],
20
- report[:reply_count] = string.scan(Received_Summary_Regex)[0]
21
- ScanReport.new(report)
22
- end
23
- end
24
- end