arp_scan 0.0.4 → 0.0.5

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: 3da5c794b3e060ebcdf1e64e9b4b4e3c2a962168
4
- data.tar.gz: 8cb575fb34d6afed2e5a385fd0a7dc771fe0aedc
3
+ metadata.gz: b7b960cabf68bf289134ad75739ab76573745ed6
4
+ data.tar.gz: 9b5cce94f3350b24e70053d6e0e4aa8045436403
5
5
  SHA512:
6
- metadata.gz: 157feb33e07f5b02ec025a23285165d7a80f42be28302e03ea2080e7c788e5682578ece77efa4ceb22449d29b2bc94f164e9ab5f32bf3f6176919ec6c0867fab
7
- data.tar.gz: de4f4b8e85030c3da59dc48f5b24ea6f59c301ec9630ae5ba563a7516e0a55f70ff59a7a36dd7610417068cfea8be7cca6c4828e0e0f190a6cabf38f6c82a760
6
+ metadata.gz: 42b6b7058c6dd4d2f5fbae4c0a3a3c0dca2f1fbf09bf52151f9c3a11191d0b43a06bbe927794611637a424155cae7924f671b501d51d8e536e7627633d976289
7
+ data.tar.gz: b9a8177864994bb4eef7993f638e1a6772f54ff5e4febe0211e691fb6a366c3b2700719a8a6f277f7a86717987dfd7624bff738e217f9e1f271e7a6ad478f496
data/Gemfile CHANGED
@@ -1,5 +1,9 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ group :test do
4
+ gem 'rspec'
5
+ gem 'rspec-support', '~>3.0.0'
6
+ end
3
7
 
4
8
  # Specify your gem's dependencies in arp_scan.gemspec
5
- gemspec
9
+ #gemspec
data/README.md CHANGED
@@ -24,8 +24,8 @@ should probably go with the `/etc/sudoers` method.
24
24
 
25
25
  ## Notes
26
26
 
27
- This code is partially tested.
28
-
27
+ There are some tests now, but output containing host names instead of IP
28
+ addresses will not be properly parsed. This might be fixed soon.
29
29
 
30
30
  ## Installation
31
31
 
data/arp_scan.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["mikebrodrigues@gmail.com"]
11
11
  spec.summary = %q{A ruby wrapper for the arp-scan utility.}
12
12
  spec.description = %q{Easily use the arp-scan utility from within your ruby programs.}
13
- spec.homepage = ""
13
+ spec.homepage = "https://github.com/mikerodrigues/arp_scan"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
@@ -1,12 +1,15 @@
1
1
  require_relative './scan_result_processor'
2
2
 
3
3
  module ARPScan
4
+ # This module manages finding the arp-scan binary and running the scan. It
5
+ # delegates the parsing of the scan results to the ScanResultProcessor module.
6
+ #
4
7
  module ARPScanner
5
-
6
8
  # I got this method from: http://stackoverflow.com/questions/2108727
7
9
  # Cross-platform way of finding an executable in the $PATH.
8
10
  #
9
11
  # which('ruby') #=> /usr/bin/ruby
12
+ #
10
13
  def self.which(cmd)
11
14
  exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
12
15
  ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
@@ -18,6 +21,10 @@ module ARPScan
18
21
  return nil
19
22
  end
20
23
 
24
+ # This method runs the actual scan by passing the arguments to the arp-scan
25
+ # binary. The results are passed to the ScanResultProcessor and a ScanReport
26
+ # is returned.
27
+ #
21
28
  def self.scan(argument_string = nil)
22
29
  result_string = `#{which 'arp-scan'} #{argument_string}`
23
30
  ScanResultProcessor.process(result_string)
data/lib/arp_scan/host.rb CHANGED
@@ -1,13 +1,20 @@
1
1
  module ARPScan
2
+ # Abstracts replying hosts from the arp-scan output.
3
+ #
2
4
  class Host
3
5
  attr_reader :ip_addr, :mac, :oui
4
6
 
7
+ # Create a new hsot. IP address, MAC address and OUI information are
8
+ # expected.
9
+ #
5
10
  def initialize(ip_addr, mac, oui)
6
11
  @ip_addr = ip_addr
7
12
  @mac = mac
8
13
  @oui = oui
9
14
  end
10
15
 
16
+ # Returns a hash representation of the Host object.
17
+ #
11
18
  def to_hash
12
19
  { :ip_addr => @ip_addr,
13
20
  :mac => @mac,
@@ -15,6 +22,8 @@ module ARPScan
15
22
  }
16
23
  end
17
24
 
25
+ # Returns an array representation of the Host object.
26
+ #
18
27
  def to_array
19
28
  [ @ip_addr,
20
29
  @mac,
@@ -1,8 +1,15 @@
1
1
  module ARPScan
2
+
3
+ # This class abstracts the string output from arp-scan into an Object. A
4
+ # ScanReports are usually created through the ScanResultProcessor module.
5
+ #
2
6
  class ScanReport
3
7
 
4
8
  attr_reader :hosts, :interface, :datalink, :version, :range_size, :scan_time, :scan_rate, :reply_count
5
9
 
10
+ # Create a new scan report, passing in every attribute. The best way to do
11
+ # this is with the ScanResultProcessor module.
12
+ #
6
13
  def initialize(hash)
7
14
  @hosts = hash[:hosts]
8
15
  @interface = hash[:interface]
@@ -14,6 +21,9 @@ module ARPScan
14
21
  @reply_count = Integer(hash[:reply_count])
15
22
  end
16
23
 
24
+ # Returns an array representation of the ScanReport. Metadata about the
25
+ # scan, and an array of Host arrays comprise the array.
26
+ #
17
27
  def to_array
18
28
  self.instance_variables.map do |var|
19
29
  if var == :@hosts
@@ -24,6 +34,9 @@ module ARPScan
24
34
  end
25
35
  end
26
36
 
37
+ # Returns a hash representation of the ScanReport. Metadata about the scan,
38
+ # and array of Host hashes comprise the hash.
39
+ #
27
40
  def to_hash
28
41
  { :hosts => @hosts.map {|host| host.to_hash},
29
42
  :interface => @interface,
@@ -2,12 +2,21 @@ require_relative './host'
2
2
  require_relative './scan_report'
3
3
 
4
4
  module ARPScan
5
+ # This module is an interface for creating ScanReport objects from arp-scan
6
+ # output.
7
+ #
5
8
  module ScanResultProcessor
6
9
 
10
+ # Regexes for parsing the arp-scan output.
11
+ #
7
12
  Host_Entry_Regex = /(\d+.\d+.\d+.\d+)\s(\w\w:\w\w:\w\w:\w\w:\w\w:\w\w)\s(.*)/
8
13
  Interface_Summary_Regex = /Interface: (?<interface>.+), datalink type: (?<datalink>.*$)/
9
14
  Scan_Summary_Regex = /Ending arp-scan (?<version>.*): (?<range_size>.*) hosts scanned in (?<scan_time>.*) seconds \((?<scan_rate>.*) hosts\/sec\). (?<reply_count>.*) responded/
10
15
 
16
+ # This method does the actual processing of the arp-scan result string. It
17
+ # uses the Regexes to capture data then passes the results to ScanRepor.new
18
+ # to return a ScanReport object.
19
+ #
11
20
  def self.process(string)
12
21
  results = {}
13
22
  results[:hosts] = string.scan(Host_Entry_Regex).map {|entry| Host.new(*entry)}
@@ -1,3 +1,3 @@
1
1
  module ARPScan
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
data/lib/arp_scan.rb CHANGED
@@ -4,10 +4,14 @@ require_relative "./arp_scan/scan_report"
4
4
  require_relative "./arp_scan/scan_result_processor"
5
5
  require_relative "./arp_scan/host"
6
6
 
7
- module ARPScan
8
-
9
- end
7
+ # This module just acts as a namespace for the gem.
8
+ #
9
+ module ARPScan; end
10
10
 
11
+ # The main interface for the gem. This method accepts arp-scan arguments in the
12
+ # form of a single string. Currently only IP addresses (no hostnames) are
13
+ # supported.
14
+ #
11
15
  def ARPScan(argument_string = nil)
12
16
  ARPScan::ARPScanner.scan argument_string
13
17
  end
@@ -1,18 +1,8 @@
1
- require '../lib/arp_scan'
2
1
  require_relative './spec_helper.rb'
3
2
 
4
3
  RSpec.describe ARPScan do
5
4
  report = ARPScan('-l')
6
-
7
- it "is a method you can pass arp-scan arguments to as a string" do
8
- expect(ARPScan('-l').class).to eq(ARPScan::ScanReport)
9
- end
10
-
11
- it "returns a nested hash of attributes" do
12
- expect(report.to_hash.class).to eq(Hash)
13
- end
14
-
15
- it "returns a nested array of attributes" do
16
- expect(report.to_array.class).to eq(Array)
5
+ it "is a method" do
6
+ expect(ARPScan.respond_to?('__send__')).to eq(true)
17
7
  end
18
8
  end
@@ -1,11 +1,11 @@
1
- require '../lib/arp_scan'
2
1
  require_relative './spec_helper'
3
2
 
4
- RSpec.describe ARPScan::ARPScanner do
5
-
6
- it "has a #scan method to pass arp-scan arguments to as a string" do
7
- expect(ARPScan::ARPScanner.scan('-l').class).to eq(ARPScan::ScanReport)
3
+ module ARPScan
4
+ describe ARPScanner do
5
+ describe "#scan" do
6
+ it "accepts arp-scan arguments as a string" do
7
+ expect(ARPScanner.scan('-l').class).to eq(ScanReport)
8
+ end
9
+ end
8
10
  end
9
-
10
11
  end
11
-
data/spec/host_spec.rb CHANGED
@@ -1,20 +1,27 @@
1
- require '../lib/arp_scan'
2
1
  require_relative './spec_helper'
3
2
 
4
- RSpec.describe ARPScan::Host do
3
+ module ARPScan
4
+ describe Host do
5
5
 
6
- host = ARPScan::Host.new('10.0.0.1', '00:11:22:33:44:55', "NIC Manufacturer")
6
+ host = Host.new('10.0.0.1', '00:11:22:33:44:55', "NIC Manufacturer")
7
7
 
8
- it "contains the host's IP address" do
9
- expect(host.ip_addr).to eq('10.0.0.1')
10
- end
8
+ describe "#ip_addr" do
9
+ it "returns the host's IP address" do
10
+ expect(host.ip_addr).to eq('10.0.0.1')
11
+ end
12
+ end
11
13
 
12
- it "contains the host's MAC address" do
13
- expect(host.mac).to eq('00:11:22:33:44:55')
14
- end
14
+ describe "#mac" do
15
+ it "returns the host's MAC address" do
16
+ expect(host.mac).to eq('00:11:22:33:44:55')
17
+ end
18
+ end
15
19
 
16
- it "contians the host's OUI information" do
17
- expect(host.oui).to eq('NIC Manufacturer')
18
- end
20
+ describe "#oui" do
21
+ it "returns the host's OUI information" do
22
+ expect(host.oui).to eq('NIC Manufacturer')
23
+ end
24
+ end
19
25
 
26
+ end
20
27
  end
@@ -1,52 +1,68 @@
1
- require '../lib/arp_scan'
2
1
  require_relative './spec_helper'
3
2
 
4
- RSpec.describe ARPScan::ScanReport do
3
+ module ARPScan
4
+ describe ScanReport do
5
5
 
6
- report_hash = {
7
- :hosts => [ARPScan::Host.new(*['10.0.0.1', '00:11:22:33:44:55', 'NIC Manufacturer'])],
8
- :interface => "eth0",
9
- :datalink => "EN10MB (Ethernet)",
10
- :version => "1.8.1",
11
- :range_size => 256,
12
- :scan_time => 1.503,
13
- :scan_rate => 170.33,
14
- :reply_count => 1
15
- }
6
+ report_hash = {
7
+ :hosts => [Host.new(*['10.0.0.1', '00:11:22:33:44:55', 'NIC Manufacturer'])],
8
+ :interface => "eth0",
9
+ :datalink => "EN10MB (Ethernet)",
10
+ :version => "1.8.1",
11
+ :range_size => 256,
12
+ :scan_time => 1.503,
13
+ :scan_rate => 170.33,
14
+ :reply_count => 1
15
+ }
16
16
 
17
- scan_report = ARPScan::ScanReport.new(report_hash)
17
+ scan_report = ScanReport.new(report_hash)
18
18
 
19
- it "has a list of zero or more responding hosts" do
20
- expect(scan_report.hosts.first.class).to eq(ARPScan::Host)
21
- end
19
+ describe "#hosts" do
20
+ it "returns an Array of Host objects" do
21
+ expect(scan_report.hosts.class).to eq(Array)
22
+ expect(scan_report.hosts.first.class).to eq(Host)
23
+ end
24
+ end
22
25
 
23
- it "reports the network interface used to scan" do
24
- expect(scan_report.interface).to eq("eth0")
25
- end
26
+ describe "#interface" do
27
+ it "returns the network interface used to scan" do
28
+ expect(scan_report.interface).to eq("eth0")
29
+ end
30
+ end
26
31
 
27
- it "reports the datalink type of the network interface used to scan" do
28
- expect(scan_report.datalink).to eq('EN10MB (Ethernet)')
29
- end
32
+ describe "#datalink" do
33
+ it "returns the datalink type of the network interface used to scan" do
34
+ expect(scan_report.datalink).to eq('EN10MB (Ethernet)')
35
+ end
36
+ end
30
37
 
31
- it "reports the version of `arp-scan` used for the scan" do
32
- expect(scan_report.version).to eq('1.8.1')
33
- end
38
+ describe "#version" do
39
+ it "returns the version of `arp-scan` used for the scan" do
40
+ expect(scan_report.version).to eq('1.8.1')
41
+ end
42
+ end
34
43
 
35
- it "reports the size of the range of scanned IPs" do
36
- expect(scan_report.range_size).to eq(256)
37
- end
44
+ describe "#range_size" do
45
+ it "returns the size of the range of scanned IPs" do
46
+ expect(scan_report.range_size).to eq(256)
47
+ end
48
+ end
38
49
 
39
- it "reports the duration of the scan in seconds" do
40
- expect(scan_report.scan_time).to eq(1.503)
41
- end
50
+ describe "#scan_time" do
51
+ it "returns the duration of the scan in seconds" do
52
+ expect(scan_report.scan_time).to eq(1.503)
53
+ end
54
+ end
42
55
 
43
- it "reports the scan rate in hosts per second" do
44
- expect(scan_report.scan_rate).to eq(170.33)
45
- end
56
+ describe "#scan_rate" do
57
+ it "returns the scan rate in hosts per second" do
58
+ expect(scan_report.scan_rate).to eq(170.33)
59
+ end
60
+ end
46
61
 
47
- it "reports the number of hosts that responded" do
48
- expect(scan_report.reply_count).to eq(1)
62
+ describe "#reply_count" do
63
+ it "returns the number of hosts that responded" do
64
+ expect(scan_report.reply_count).to eq(1)
65
+ end
66
+ end
49
67
  end
50
-
51
-
52
68
  end
@@ -1,45 +1,48 @@
1
- require '../lib/arp_scan'
2
1
  require_relative './spec_helper'
3
2
 
4
- RSpec.describe ARPScan::ScanResultProcessor do
3
+ module ARPScan
4
+ describe ScanResultProcessor do
5
5
 
6
- report_string = File.read './test_output.txt'
7
- report = ARPScan::ScanResultProcessor.process(report_string)
8
-
9
- it "processes arp-scan output to create a ScanReport object" do
10
- expect(report.class).to eq(ARPScan::ScanReport)
11
- end
6
+ report_string = File.read './test_output.txt'
7
+ report = ARPScan::ScanResultProcessor.process(report_string)
12
8
 
13
- it "builds an array of Host objects" do
14
- expect(report.hosts[0].class).to eq(ARPScan::Host)
15
- end
9
+ describe "#process" do
10
+ it "processes arp-scan output to create a ScanReport object" do
11
+ expect(report.class).to eq(ARPScan::ScanReport)
12
+ end
16
13
 
17
- it "parses the scan interface name" do
18
- expect(report.interface).to eq("eth0")
19
- end
20
14
 
21
- it "parses the datalink type information" do
22
- expect(report.datalink).to eq("EN10MB (Ethernet)")
23
- end
15
+ it "builds an array of Host objects" do
16
+ expect(report.hosts[0].class).to eq(ARPScan::Host)
17
+ end
24
18
 
25
- it "parses the version of arp-scan that ran the scan" do
26
- expect(report.version).to eq('1.8.1')
27
- end
19
+ it "parses the scan interface name" do
20
+ expect(report.interface).to eq("eth0")
21
+ end
28
22
 
29
- it "parses the number of hosts scanned" do
30
- expect(report.range_size).to eq(256)
31
- end
23
+ it "parses the datalink type information" do
24
+ expect(report.datalink).to eq("EN10MB (Ethernet)")
25
+ end
32
26
 
33
- it "parses the duration of the scan in seconds" do
34
- expect(report.scan_time).to eq(1.494)
35
- end
27
+ it "parses the version of arp-scan that ran the scan" do
28
+ expect(report.version).to eq('1.8.1')
29
+ end
36
30
 
37
- it "parses the rate of the scan in hosts per second" do
38
- expect(report.scan_rate).to eq(171.35)
39
- end
31
+ it "parses the number of hosts scanned" do
32
+ expect(report.range_size).to eq(256)
33
+ end
34
+
35
+ it "parses the duration of the scan in seconds" do
36
+ expect(report.scan_time).to eq(1.494)
37
+ end
40
38
 
41
- it "parses the number of hosts that responded to the scan" do
42
- expect(report.reply_count).to eq(1)
39
+ it "parses the rate of the scan in hosts per second" do
40
+ expect(report.scan_rate).to eq(171.35)
41
+ end
42
+
43
+ it "parses the number of hosts that responded to the scan" do
44
+ expect(report.reply_count).to eq(1)
45
+ end
46
+ end
43
47
  end
44
48
  end
45
-
data/spec/spec_helper.rb CHANGED
@@ -0,0 +1 @@
1
+ require '../lib/arp_scan'
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.4
4
+ version: 0.0.5
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-10 00:00:00.000000000 Z
11
+ date: 2014-09-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -62,7 +62,7 @@ files:
62
62
  - spec/scan_result_processor_spec.rb
63
63
  - spec/spec_helper.rb
64
64
  - spec/test_output.txt
65
- homepage: ''
65
+ homepage: https://github.com/mikerodrigues/arp_scan
66
66
  licenses:
67
67
  - MIT
68
68
  metadata: {}
@@ -82,7 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
82
82
  version: '0'
83
83
  requirements: []
84
84
  rubyforge_project:
85
- rubygems_version: 2.2.2
85
+ rubygems_version: 2.4.1
86
86
  signing_key:
87
87
  specification_version: 4
88
88
  summary: A ruby wrapper for the arp-scan utility.