module Mac

Constants

RE
VERSION

Attributes

mac_address[RW]

Accessor for the system's first MAC address, requires a call to address first

Public Class Methods

dependencies() click to toggle source
# File lib/macaddr.rb, line 33
def Mac.dependencies
  {
    'systemu' => [ 'systemu' , '~> 2.6.2' ]
  }
end
description() click to toggle source
# File lib/macaddr.rb, line 39
def Mac.description
  'cross platform mac address determination for ruby'
end
version() click to toggle source
# File lib/macaddr.rb, line 29
def Mac.version
  ::Mac::VERSION
end

Public Instance Methods

address() click to toggle source

Discovers and returns the system's MAC addresses. Returns the first MAC address, and includes an accessor list for the remaining addresses:

Mac.addr # => first address
Mac.addr.list # => all addresses
# File lib/macaddr.rb, line 59
def address
  return @mac_address if defined? @mac_address and @mac_address

  @mac_address = from_getifaddrs
  return @mac_address if @mac_address

  cmds = '/sbin/ifconfig', '/bin/ifconfig', 'ifconfig', 'ipconfig /all', 'cat /sys/class/net/*/address'

  output = nil
  cmds.each do |cmd|
    _, stdout, _ = systemu(cmd) rescue next
    next unless stdout and stdout.size > 0
    output = stdout and break
  end
  raise "all of #{ cmds.join ' ' } failed" unless output

  @mac_address = parse(output)
end
from_getifaddrs() click to toggle source
# File lib/macaddr.rb, line 82
def from_getifaddrs
  return unless Socket.respond_to? :getifaddrs

  interfaces = Socket.getifaddrs.select do |addr|
    addr.addr.pfamily == INTERFACE_PACKET_FAMILY
  end

  mac, =
    if Socket.const_defined? :PF_LINK then
      interfaces.map do |addr|
        addr.addr.getnameinfo
      end.find do |m,|
        !m.empty?
      end
    elsif Socket.const_defined? :PF_PACKET then
      interfaces.map do |addr|
        addr.addr.inspect_sockaddr[/hwaddr=([\h:]+)/, 1]
      end.find do |mac_addr|
        mac_addr != '00:00:00:00:00:00'
      end
    end

  @mac_address = mac if mac
end
list() click to toggle source
# File lib/macaddr.rb, line 118
def list() @list end
parse(output) click to toggle source
# File lib/macaddr.rb, line 107
def parse(output)
  lines = output.split(/\n/)

  candidates = lines.select{|line| line =~ RE}
  raise 'no mac address candidates' unless candidates.first
  candidates.map!{|c| c[RE].strip}

  maddr = candidates.first
  raise 'no mac address found' unless maddr

  maddr.strip!
  maddr.instance_eval{ @list = candidates; def list() @list end }
  maddr
end