Module: Interfacez

Defined in:
lib/interfacez.rb,
lib/interfacez/version.rb

Constant Summary collapse

VERSION =
"1.0.3"

Class Method Summary collapse

Class Method Details

.allObject

All network interface names available on system.



80
81
82
83
84
85
86
87
88
# File 'lib/interfacez.rb', line 80

def self.all
  addrs = raw_interface_addresses.collect { |iface| iface.name }.uniq 
  if block_given?
    addrs.each do |addr|
      yield addr
    end
  end
  return addrs
end

.defaultObject

Emulated LibPcap’s pcap_lookupdev function to find the default device on which to capture packets.



8
9
10
11
12
13
14
# File 'lib/interfacez.rb', line 8

def self.default
  raw_interface_addresses.each do |iface| 
    next unless iface.broadaddr
    return iface.name 
  end
  nil
end

.index_of(interface) ⇒ Object

Get index of network interface.



183
184
185
186
187
188
# File 'lib/interfacez.rb', line 183

def self.index_of(interface)
  raw_interface_addresses.each do |iface|
    return iface.ifindex if iface.name == interface
  end
  return nil
end

.ipv4_address_of(interface) ⇒ Object

Return all ipv4 addresses of a given interface.



110
111
112
113
114
# File 'lib/interfacez.rb', line 110

def self.ipv4_address_of(interface)
  addresses = Interfacez.ipv4_addresses[interface]
  return nil if addresses.nil?
  return addresses[0]
end

.ipv4_addresses(interface = nil) ⇒ Object

Network interfaces with their ipv4 addresses, if they have any asscoited with it.



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/interfacez.rb', line 92

def self.ipv4_addresses(interface = nil)
  return ipv4_addresses_of(interface) unless interface.nil?
  results = Hash.new()
  raw_interface_addresses.each do |iface|
    if iface.addr.ipv4?
      results[iface.name] = [] unless results[iface.name]
      results[iface.name] << iface.addr.ip_address
    end
  end
  if block_given?
    results.each do |result|
      yield result
    end
  end
  return results
end

.ipv4_addresses_of(interface) ⇒ Object

Return the first ipv4 address of a given interface.



117
118
119
# File 'lib/interfacez.rb', line 117

def self.ipv4_addresses_of(interface)
  return Interfacez.ipv4_addresses[interface] || []
end

.ipv4_loopbackObject

First available ipv4 loopback interface.



42
43
44
# File 'lib/interfacez.rb', line 42

def self.ipv4_loopback
  Interfacez.ipv4_loopbacks { |iface| return iface }
end

.ipv4_loopbacksObject

All ipv4 loopback interfaces.



47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/interfacez.rb', line 47

def self.ipv4_loopbacks
  if block_given?
    raw_interface_addresses.each do |iface| 
      next unless iface.addr.ipv4_loopback?
      yield iface.name if block_given?
    end
  else
    results = []
    Interfacez.ipv4_loopbacks { |l| results << l }
    return results 
  end
end

.ipv6_address_of(interface) ⇒ Object

Return the first ipv6 address of a given interface.



146
147
148
149
150
# File 'lib/interfacez.rb', line 146

def self.ipv6_address_of(interface)
  addresses = Interfacez.ipv6_addresses_of(interface)
  return nil if addresses.nil? 
  return addresses[0]
end

.ipv6_addresses(interface = nil) ⇒ Object

Network interfaces with their ipv6 addresses, if they have any asscoited with it.



123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/interfacez.rb', line 123

def self.ipv6_addresses(interface = nil)
  return ipv6_addresses_of(interface) unless interface.nil?
  results = Hash.new()
  raw_interface_addresses.each do |iface|
    if iface.addr.ipv6?
      results[iface.name] = [] unless results[iface.name]
      results[iface.name] << iface.addr.ip_address
    end
  end
  if block_given?
    results.each do |result|
      yield result
    end
  end
  return results
end

.ipv6_addresses_of(interface) ⇒ Object

Return all available ipv6 addreses of a given interface.



141
142
143
# File 'lib/interfacez.rb', line 141

def self.ipv6_addresses_of(interface)
  return Interfacez.ipv6_addresses[interface] || []
end

.ipv6_loopbackObject

First available ipv6 loopback interface.



61
62
63
# File 'lib/interfacez.rb', line 61

def self.ipv6_loopback
  Interfacez.ipv6_loopbacks { |iface| return iface }
end

.ipv6_loopbacksObject

All ipv6 loopback interfaces.



66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/interfacez.rb', line 66

def self.ipv6_loopbacks
  if block_given?
    raw_interface_addresses.each do |iface| 
      next unless iface.addr.ipv6_loopback?
      yield iface.name if block_given?
    end
  else
    results = []
    Interfacez.ipv4_loopbacks { |l| results << l }
    return results 
  end
end

.loopbackObject

Get first (ipv4 or ipv6) loopback interface.



17
18
19
20
# File 'lib/interfacez.rb', line 17

def self.loopback
  Interfacez.ipv4_loopbacks { |iface| return iface }
  Interfacez.ipv6_loopbacks { |iface| return iface }
end

.loopback?Boolean

Check for any (ipv4 or ipv6) loopback interface.

Returns:

  • (Boolean)


23
24
25
26
27
# File 'lib/interfacez.rb', line 23

def self.loopback?
  Interfacez.ipv4_loopbacks { |iface| return true }
  Interfacez.ipv6_loopbacks { |iface| return true }
  return false
end

.loopbacksObject

Get all (ipv4 or ipv6) loopback interfaces.



30
31
32
33
34
35
36
37
38
39
# File 'lib/interfacez.rb', line 30

def self.loopbacks
  if block_given?
    Interfacez.ipv4_loopbacks { |iface| yield iface }
    Interfacez.ipv6_loopbacks { |iface| yield iface }
  else
    loopbacks = []
    Interfacez.loopbacks { |l| loopbacks << l unless loopbacks.any?(l) }
    return loopbacks
  end
end

.mac_address_of(interface) ⇒ Object

Return first available mac addresses of a given interface.



153
154
155
156
157
# File 'lib/interfacez.rb', line 153

def self.mac_address_of(interface)
  list = Interfacez.mac_addresses_of(interface)
  return nil if list.size.zero?
  return list[0]
end

.mac_addresses_of(interface) ⇒ Object

Return all available mac addresses of a given interface.



160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/interfacez.rb', line 160

def self.mac_addresses_of(interface)
  # BSD support
  if Socket.const_defined? :PF_LINK
    list = raw_interface_addresses.map! do |iface|
      next unless iface.name == interface
      nameinfo = iface.addr.getnameinfo
      if nameinfo.first != "" && nameinfo.last == ""
        nameinfo[0]
      end
    end.compact
  # Linux support
  elsif Socket.const_defined? :PF_PACKET 
    list = raw_interface_addresses.map! do |iface|
      next unless iface.name == interface
      iface.addr.inspect_sockaddr[/hwaddr=([\h:]+)/, 1]
    end.compact
  else
    warn "This platform may not be fully supported!"
    return []
  end
end

.raw_interface_addressesObject

:nodoc:



191
192
193
194
195
196
# File 'lib/interfacez.rb', line 191

def self.raw_interface_addresses
  Socket.getifaddrs
rescue
  warn "Unable to get raw interface address list from Socket class"
  return []
end