summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/facter/arp.rb22
-rw-r--r--lib/facter/ec2.rb77
-rw-r--r--lib/facter/id.rb11
-rw-r--r--lib/facter/memory.rb37
-rw-r--r--lib/facter/operatingsystem.rb9
-rw-r--r--lib/facter/operatingsystemrelease.rb12
-rw-r--r--lib/facter/util/ip.rb7
-rw-r--r--lib/facter/util/macaddress.rb2
-rw-r--r--lib/facter/util/memory.rb31
9 files changed, 183 insertions, 25 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/ec2.rb b/lib/facter/ec2.rb
index ef84757..29b2a1c 100644
--- a/lib/facter/ec2.rb
+++ b/lib/facter/ec2.rb
@@ -1,24 +1,46 @@
-# Changelog:
-# Original facts - Tim Dysinger
-# Updated and added can_connect? function - KurtBe
+# Original fact Tim Dysinger
+# Additional work from KurtBe
+# Additional work for Paul Nasrat
+# Additional work modelled on Ohai EC2 fact
require 'open-uri'
-require 'timeout'
+require 'socket'
-def can_connect?(ip,port,wait_sec=2)
- Timeout::timeout(wait_sec) {open(ip, port)}
- return true
-rescue
- return false
-end
+EC2_ADDR = "169.254.169.254"
+EC2_METADATA_URL = "http://#{EC2_ADDR}/2008-02-01/meta-data"
+EC2_USERDATA_URL = "http://#{EC2_ADDR}/2008-02-01/user-data"
+
+def can_metadata_connect?(addr, port, timeout=2)
+ t = Socket.new(Socket::Constants::AF_INET, Socket::Constants::SOCK_STREAM, 0)
+ saddr = Socket.pack_sockaddr_in(port, addr)
+ connected = false
+ begin
+ t.connect_nonblock(saddr)
+ rescue Errno::EINPROGRESS
+ r,w,e = IO::select(nil,[t],nil,timeout)
+ if !w.nil?
+ connected = true
+ else
+ begin
+ t.connect_nonblock(saddr)
+ rescue Errno::EISCONN
+ t.close
+ connected = true
+ rescue SystemCallError
+ end
+ end
+ rescue SystemCallError
+ end
+ connected
+end
def metadata(id = "")
- open("http://169.254.169.254/2008-02-01/meta-data/#{id||=''}").read.
+ open("#{EC2_METADATA_URL}/#{id||=''}").read.
split("\n").each do |o|
key = "#{id}#{o.gsub(/\=.*$/, '/')}"
if key[-1..-1] != '/'
- value = open("http://169.254.169.254/2008-02-01/meta-data/#{key}").read.
+ value = open("#{EC2_METADATA_URL}/#{key}").read.
split("\n")
value = value.size>1 ? value : value.first
symbol = "ec2_#{key.gsub(/\-|\//, '_')}".to_sym
@@ -29,7 +51,34 @@ def metadata(id = "")
end
end
-if can_connect?("169.254.169.254","80")
- metadata
+def userdata()
+ # assumes the only expected error is the 404 if there's no user-data
+ begin
+ value = OpenURI.open_uri("#{EC2_USERDATA_URL}/").read.split
+ Facter.add(:ec2_userdata) { setcode { value } }
+ rescue OpenURI::HTTPError
+ end
end
+def has_euca_mac?
+ if Facter.value(:macaddress) =~ /^[dD]0:0[dD]:/
+ return true
+ else
+ return false
+ end
+end
+
+def has_ec2_arp?
+ if Facter.value(:arp) == 'fe:ff:ff:ff:ff:ff'
+ return true
+ else
+ return false
+ end
+end
+
+if (has_euca_mac? || has_ec2_arp?) && can_metadata_connect?(EC2_ADDR,80)
+ metadata
+ userdata
+else
+ Facter.debug "Not an EC2 host"
+end
diff --git a/lib/facter/id.rb b/lib/facter/id.rb
index c2c3594..1c42284 100644
--- a/lib/facter/id.rb
+++ b/lib/facter/id.rb
@@ -1,15 +1,8 @@
Facter.add(:id) do
- confine :operatingsystem => %w{Linux Fedora RedHat CentOS SuSE SLES Debian Ubuntu Gentoo AIX OEL OVS GNU/kFreeBSD windows}
setcode "whoami"
end
Facter.add(:id) do
- confine :operatingsystem => %w{Solaris}
- setcode do
- if %x{id} =~ /^uid=\d+\((\S+)\)/
- $1
- else
- nil
- end
- end
+ confine :kernel => :SunOS
+ setcode "/usr/xpg4/bin/id -un"
end
diff --git a/lib/facter/memory.rb b/lib/facter/memory.rb
index aa67702..9dd2e29 100644
--- a/lib/facter/memory.rb
+++ b/lib/facter/memory.rb
@@ -110,6 +110,43 @@ if Facter.value(:kernel) == "OpenBSD"
end
end
+if Facter.value(:kernel) == "Darwin"
+ swap = Facter::Util::Resolution.exec('sysctl vm.swapusage')
+ swapfree, swaptotal = 0, 0
+ unless swap.empty?
+ # Parse the line:
+ # vm.swapusage: total = 128.00M used = 0.37M free = 127.63M (encrypted)
+ if swap =~ /total\s=\s(\S+)\s+used\s=\s(\S+)\s+free\s=\s(\S+)\s/
+ swaptotal += $1.to_i
+ swapfree += $3.to_i
+ end
+ end
+
+ Facter.add("SwapSize") do
+ confine :kernel => :Darwin
+ setcode do
+ Facter::Memory.scale_number(swaptotal.to_f,"MB")
+ end
+ end
+
+ Facter.add("SwapFree") do
+ confine :kernel => :Darwin
+ setcode do
+ Facter::Memory.scale_number(swapfree.to_f,"MB")
+ end
+ end
+
+ Facter::Memory.vmstat_darwin_find_free_memory()
+
+ Facter.add("MemoryTotal") do
+ confine :kernel => :Darwin
+ memtotal = Facter::Util::Resolution.exec("sysctl hw.memsize | cut -d':' -f2")
+ setcode do
+ Facter::Memory.scale_number(memtotal.to_f,"")
+ end
+ end
+end
+
if Facter.value(:kernel) == "SunOS"
swap = Facter::Util::Resolution.exec('/usr/sbin/swap -l')
swapfree, swaptotal = 0, 0
diff --git a/lib/facter/operatingsystem.rb b/lib/facter/operatingsystem.rb
index 1675909..25eeb00 100644
--- a/lib/facter/operatingsystem.rb
+++ b/lib/facter/operatingsystem.rb
@@ -32,6 +32,8 @@ Facter.add(:operatingsystem) do
end
elsif FileTest.exists?("/etc/arch-release")
"Arch"
+ elsif FileTest.exists?("/etc/vmware-release")
+ "VMWareESX"
elsif FileTest.exists?("/etc/redhat-release")
txt = File.read("/etc/redhat-release")
if txt =~ /centos/i
@@ -63,6 +65,13 @@ Facter.add(:operatingsystem) do
end
Facter.add(:operatingsystem) do
+ confine :kernel => "VMkernel"
+ setcode do
+ "ESXi"
+ end
+end
+
+Facter.add(:operatingsystem) do
# Default to just returning the kernel as the operating system
setcode do Facter[:kernel].value end
end
diff --git a/lib/facter/operatingsystemrelease.rb b/lib/facter/operatingsystemrelease.rb
index ac9be65..da1b76a 100644
--- a/lib/facter/operatingsystemrelease.rb
+++ b/lib/facter/operatingsystemrelease.rb
@@ -84,6 +84,16 @@ Facter.add(:operatingsystemrelease) do
end
Facter.add(:operatingsystemrelease) do
+ confine :operatingsystem => %w{VMwareESX}
+ setcode do
+ release = Facter::Util::Resolution.exec('vmware -v')
+ if release =~ /VMware ESX .*?(\d.*)/
+ $1
+ end
+ end
+end
+
+Facter.add(:operatingsystemrelease) do
confine :operatingsystem => %w{Slamd64}
setcode do
releasefile = Facter::Util::Resolution.exec('cat /etc/slamd64-version')
@@ -96,5 +106,5 @@ Facter.add(:operatingsystemrelease) do
end
Facter.add(:operatingsystemrelease) do
- setcode do Facter[:kernelrelease].value end
+ setcode do Facter[:kernelrelease].value 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/lib/facter/util/macaddress.rb b/lib/facter/util/macaddress.rb
index fc0a043..f6bae14 100644
--- a/lib/facter/util/macaddress.rb
+++ b/lib/facter/util/macaddress.rb
@@ -12,7 +12,7 @@ module Facter::Util::Macaddress
end
def self.default_interface
- `#{netstat_command} | /usr/bin/awk '/^default/{print $6}'`.chomp
+ `#{netstat_command} | /usr/bin/awk '/^default/{print $6;exit}'`.chomp
end
private
diff --git a/lib/facter/util/memory.rb b/lib/facter/util/memory.rb
index 43abec6..029b117 100644
--- a/lib/facter/util/memory.rb
+++ b/lib/facter/util/memory.rb
@@ -62,5 +62,36 @@ module Facter::Memory
end
end
end
+
+ # Darwin had to be different. It's generally opaque with how much RAM it is
+ # using, and this figure could be improved upon too I fear.
+ # Parses the output of "vm_stat", takes the pages free & pages speculative
+ # and multiples that by the page size (also given in output). Ties in with
+ # what activity monitor outputs for free memory.
+ def self.vmstat_darwin_find_free_memory()
+
+ memfree = 0
+ pagesize = 0
+ memspecfree = 0
+
+ vmstats = Facter::Util::Resolution.exec('vm_stat')
+ vmstats.each do |vmline|
+ case
+ when vmline =~ /page\ssize\sof\s(\d+)\sbytes/
+ pagesize = $1.to_i
+ when vmline =~ /^Pages\sfree:\s+(\d+)\./
+ memfree = $1.to_i
+ when vmline =~ /^Pages\sspeculative:\s+(\d+)\./
+ memspecfree = $1.to_i
+ end
+ end
+
+ freemem = ( memfree + memspecfree ) * pagesize
+ Facter.add("MemoryFree") do
+ setcode do
+ Facter::Memory.scale_number(freemem.to_f, "")
+ end
+ end
+ end
end