From f5dac1161b522cdf205218cf86155b3f4d9b455a Mon Sep 17 00:00:00 2001 From: Joe Haig Date: Fri, 3 Jun 2016 11:06:06 +0100 Subject: [PATCH 1/2] Replace Mac.addr.list by Mac.addresses --- README | 17 +++++++-- lib/macaddr.rb | 91 ++++++++++++++++++++++--------------------------- macaddr.gemspec | 3 +- 3 files changed, 57 insertions(+), 54 deletions(-) diff --git a/README b/README index e2a9ec7..b5a24c3 100644 --- a/README +++ b/README @@ -16,7 +16,11 @@ INSTALL gem install macaddr HISTORY - New: + 2.0.0: + - Add Mac.addresses to list all MAC addresses + - Remove Mac.address.list method + - Set minimum Ruby version as 2.1.0 + 1.7.x: - added a Gemfile for easier testing/dev with Bundler - added an example .rvmrc file that will setup for ruby 1.9.3 - updated systemu gem to ~>2.4.0 to work with ruby 1.9.3 @@ -34,5 +38,12 @@ SYNOPSIS require 'macaddr' - Mac.addr #=> first mac addr on your system - Mac.addr.list #=> all mac addrs on your system + # First mac addr on your system + Mac.addr + # or + Mac.address + + # All mac addrs on your system + Mac.addrs + # or + Mac.addresses diff --git a/lib/macaddr.rb b/lib/macaddr.rb index 06810de..63d7af4 100644 --- a/lib/macaddr.rb +++ b/lib/macaddr.rb @@ -11,7 +11,7 @@ # # To return an array of all MAC addresses: # -# Mac.address.list +# Mac.addresses # begin @@ -24,7 +24,7 @@ require 'socket' module Mac - VERSION = '1.7.1' + VERSION = '2.0.0' def Mac.version ::Mac::VERSION @@ -54,75 +54,66 @@ class << self # MAC address, and includes an accessor #list for the remaining addresses: # # Mac.addr # => first address - # Mac.addr.list # => all addresses + # Mac.addrs # => all addresses def address - return @mac_address if defined? @mac_address and @mac_address - - @mac_address = from_getifaddrs - return @mac_address if @mac_address + @mac_address ||= addresses.first + end - cmds = '/sbin/ifconfig', '/bin/ifconfig', 'ifconfig', 'ipconfig /all', 'cat /sys/class/net/*/address' + def addresses + @mac_addresses ||= from_getifaddrs || from_system + end - 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 + ## + # Shorter alias for #address - @mac_address = parse(output) - end + alias_method "addr", "address" + alias_method "addrs", "addresses" - link = Socket::PF_LINK if Socket.const_defined? :PF_LINK - packet = Socket::PF_PACKET if Socket.const_defined? :PF_PACKET - INTERFACE_PACKET_FAMILY = link || packet # :nodoc: + private def from_getifaddrs return unless Socket.respond_to? :getifaddrs interfaces = Socket.getifaddrs.select do |addr| - addr.addr.pfamily == INTERFACE_PACKET_FAMILY + addr.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 + if Socket.const_defined? :PF_LINK then + interfaces.map do |addr| + addr.addr.getnameinfo + end.flatten.select do |m| + !m.empty? end - - @mac_address = mac if mac + elsif Socket.const_defined? :PF_PACKET then + interfaces.map do |addr| + addr.addr.inspect_sockaddr[/hwaddr=([\h:]+)/, 1] + end.select do |mac_addr| + mac_addr != '00:00:00:00:00:00' + end + end end - def parse(output) - lines = output.split(/\n/) + def from_system + cmds = '/sbin/ifconfig', '/bin/ifconfig', 'ifconfig', 'ipconfig /all', 'cat /sys/class/net/*/address' - candidates = lines.select{|line| line =~ RE} - raise 'no mac address candidates' unless candidates.first - candidates.map!{|c| c[RE].strip} + 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 - maddr = candidates.first - raise 'no mac address found' unless maddr + lines = output.split(/\n/) - maddr.strip! - maddr.instance_eval{ @list = candidates; def list() @list end } - maddr + macs = lines.select{|line| line =~ RE} + macs.map!{|c| c[RE].strip} end - ## - # Shorter alias for #address - - alias_method "addr", "address" + link = Socket::PF_LINK if Socket.const_defined? :PF_LINK + packet = Socket::PF_PACKET if Socket.const_defined? :PF_PACKET + INTERFACE_PACKET_FAMILY = link || packet # :nodoc: end RE = %r/(?:[^:\-]|\A)(?:[0-9A-F][0-9A-F][:\-]){5}[0-9A-F][0-9A-F](?:[^:\-]|\Z)/io diff --git a/macaddr.gemspec b/macaddr.gemspec index 3aa230e..25c037e 100644 --- a/macaddr.gemspec +++ b/macaddr.gemspec @@ -3,11 +3,12 @@ Gem::Specification::new do |spec| spec.name = "macaddr" - spec.version = "1.7.0" + spec.version = "2.0.0" spec.platform = Gem::Platform::RUBY spec.summary = "macaddr" spec.description = "cross platform mac address determination for ruby" spec.license = "Ruby" + spec.required_ruby_version = ">= 2.1.0" spec.files = ["Gemfile", From 96c98fc958e8143b031e410badc6a27bf9e4bbec Mon Sep 17 00:00:00 2001 From: Joe Haig Date: Fri, 3 Jun 2016 11:18:22 +0100 Subject: [PATCH 2/2] Move lines out of private section --- lib/macaddr.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/macaddr.rb b/lib/macaddr.rb index 63d7af4..a7ccde5 100644 --- a/lib/macaddr.rb +++ b/lib/macaddr.rb @@ -64,6 +64,10 @@ def addresses @mac_addresses ||= from_getifaddrs || from_system end + link = Socket::PF_LINK if Socket.const_defined? :PF_LINK + packet = Socket::PF_PACKET if Socket.const_defined? :PF_PACKET + INTERFACE_PACKET_FAMILY = link || packet # :nodoc: + ## # Shorter alias for #address @@ -110,10 +114,6 @@ def from_system macs = lines.select{|line| line =~ RE} macs.map!{|c| c[RE].strip} end - - link = Socket::PF_LINK if Socket.const_defined? :PF_LINK - packet = Socket::PF_PACKET if Socket.const_defined? :PF_PACKET - INTERFACE_PACKET_FAMILY = link || packet # :nodoc: end RE = %r/(?:[^:\-]|\A)(?:[0-9A-F][0-9A-F][:\-]){5}[0-9A-F][0-9A-F](?:[^:\-]|\Z)/io