diff options
-rw-r--r-- | lib/facter/arp.rb | 22 | ||||
-rw-r--r-- | lib/facter/util/ip.rb | 7 | ||||
-rwxr-xr-x | spec/unit/util/ip_spec.rb | 7 |
3 files changed, 36 insertions, 0 deletions
diff --git a/lib/facter/arp.rb b/lib/facter/arp.rb new file mode 100644 index 0000000..f4b7709 --- /dev/null +++ b/lib/facter/arp.rb @@ -0,0 +1,22 @@ +require 'facter/util/ip' + +Facter.add(:arp) do + confine :kernel => :linux + setcode do + arp = [] + output = %x{/usr/sbin/arp -a} + output.each_line do |s| + arp.push($1) if s =~ /^\S+\s\S+\s\S+\s(\S+)\s\S+\s\S+\s\S+$/ + end + arp[0] + end +end + +Facter::Util::IP.get_interfaces.each do |interface| + Facter.add("arp_" + Facter::Util::IP.alphafy(interface)) do + confine :kernel => :linux + setcode do + Facter::Util::IP.get_arp_value(interface) + end + end +end diff --git a/lib/facter/util/ip.rb b/lib/facter/util/ip.rb index e4370dc..8b6dbf4 100644 --- a/lib/facter/util/ip.rb +++ b/lib/facter/util/ip.rb @@ -169,4 +169,11 @@ module Facter::Util::IP network = ip.mask(subnet.to_s).to_s end end + + def self.get_arp_value(interface) + arp = Facter::Util::Resolution.exec("arp -en -i #{interface} | sed -e 1d") + if arp =~ /^\S+\s+\w+\s+(\S+)\s+\w\s+\S+$/ + return $1 + end + end end diff --git a/spec/unit/util/ip_spec.rb b/spec/unit/util/ip_spec.rb index 1a545b8..0374e75 100755 --- a/spec/unit/util/ip_spec.rb +++ b/spec/unit/util/ip_spec.rb @@ -227,4 +227,11 @@ describe Facter::Util::IP do Facter::Util::IP.convert_from_hex?(platform).should == true end end + + it "should return an arp address on Linux" do + Facter.stubs(:value).with(:kernel).returns("Linux") + + Facter::Util::IP.expects(:get_arp_value).with("eth0").returns("00:00:0c:9f:f0:04") + Facter::Util::IP.get_arp_value("eth0").should == "00:00:0c:9f:f0:04" + end end |