interfacez 1.0.0 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8cd4cdba45bdc3c9ee5f65a733afdab9736e0a99b9f5f6cc56e2bff6e3f22392
4
- data.tar.gz: ab510eaabb3e5cada57f4f10a827eb131386acd1335dafff22024bf575a565f9
3
+ metadata.gz: e3933043ffa46a19f9a456fe1c499a6d484a7a25ff5d08f31831f9badb10668a
4
+ data.tar.gz: f955df2c381771688e12a2cb013fc8c1af7cf1a0c598167b7e5cfe707b48edaf
5
5
  SHA512:
6
- metadata.gz: dfb4a1c0c8ead706d0ada9427d695fd18c647a0b181699de62b3964a15a0407dfe1b41cddd7d96147e9986bf6e86a63ed7295c13ccccbb405057dc2983f8e0d9
7
- data.tar.gz: 321405b666b65a6c4b377fb8783b73be700ab260307dd9ff217871e1beab4cf029216472b2d46c44ea1944a0e061241bd735787072b181894ee27eafd22692b7
6
+ metadata.gz: c18edcdf348bc9c38977cf7fbcaa001278094cbbe2e77bf4b7c610299f9343cee41dde69c54dc753c555d72b25b0317b392f4b90b0eb75d97e60e4e6f02626a2
7
+ data.tar.gz: 74eb55b9b86dad34452a5912179a3cc63bc7d8a4714605f3bda1cb42ce8d1e75b2764a93383f7653643bca70b21be885220b36165fc7389f56d2762ccc18af3b
@@ -0,0 +1,26 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ branches: [ master ]
8
+ schedule:
9
+ - cron: "0 9 * * *"
10
+
11
+ jobs:
12
+ build:
13
+
14
+ runs-on: ubuntu-latest
15
+
16
+ steps:
17
+ - uses: actions/checkout@v2
18
+ - name: Set up Ruby 2.6
19
+ uses: actions/setup-ruby@v1
20
+ with:
21
+ ruby-version: 2.6.x
22
+ - name: Build and test with Rake
23
+ run: |
24
+ gem install bundler
25
+ bundle install --jobs 4 --retry 3
26
+ bundle exec rake
data/Gemfile.lock CHANGED
@@ -1,13 +1,13 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- interfacez (1.0.0)
4
+ interfacez (1.0.4)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
9
  diff-lcs (1.3)
10
- rake (10.5.0)
10
+ rake (13.0.1)
11
11
  rspec (3.7.0)
12
12
  rspec-core (~> 3.7.0)
13
13
  rspec-expectations (~> 3.7.0)
@@ -28,8 +28,8 @@ PLATFORMS
28
28
  DEPENDENCIES
29
29
  bundler (~> 1.16)
30
30
  interfacez!
31
- rake (~> 10.0)
31
+ rake (~> 13.0)
32
32
  rspec (~> 3.0)
33
33
 
34
34
  BUNDLED WITH
35
- 1.16.1
35
+ 1.17.3
data/README.md CHANGED
@@ -11,15 +11,18 @@
11
11
  require 'interfacez'
12
12
 
13
13
  Interfacez.default
14
- # => en0
14
+ # => "en0"
15
15
 
16
16
  Interfacez.loopback
17
- # => lo0
17
+ # => "lo0"
18
18
 
19
19
  Interfacez.all do |interface|
20
20
  # do something with interface name
21
21
  puts interface
22
22
  end
23
+
24
+ Interfacez.ipv4_address_of("en0")
25
+ # => "192.168.1.2"
23
26
  ```
24
27
 
25
28
  ## License
data/interfacez.gemspec CHANGED
@@ -22,6 +22,6 @@ Gem::Specification.new do |spec|
22
22
  spec.require_paths = ["lib"]
23
23
 
24
24
  spec.add_development_dependency "bundler", "~> 1.16"
25
- spec.add_development_dependency "rake", "~> 10.0"
25
+ spec.add_development_dependency "rake", "~> 13.0"
26
26
  spec.add_development_dependency "rspec", "~> 3.0"
27
27
  end
@@ -1,3 +1,3 @@
1
1
  module Interfacez
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.4"
3
3
  end
data/lib/interfacez.rb CHANGED
@@ -19,6 +19,25 @@ module Interfacez
19
19
  Interfacez.ipv6_loopbacks { |iface| return iface }
20
20
  end
21
21
 
22
+ # Check for any (ipv4 or ipv6) loopback interface.
23
+ def self.loopback?
24
+ Interfacez.ipv4_loopbacks { |iface| return true }
25
+ Interfacez.ipv6_loopbacks { |iface| return true }
26
+ return false
27
+ end
28
+
29
+ # Get all (ipv4 or ipv6) loopback interfaces.
30
+ def self.loopbacks
31
+ if block_given?
32
+ Interfacez.ipv4_loopbacks { |iface| yield iface }
33
+ Interfacez.ipv6_loopbacks { |iface| yield iface }
34
+ else
35
+ loopbacks = []
36
+ Interfacez.loopbacks { |l| loopbacks << l unless loopbacks.any?(l) }
37
+ return loopbacks
38
+ end
39
+ end
40
+
22
41
  # First available ipv4 loopback interface.
23
42
  def self.ipv4_loopback
24
43
  Interfacez.ipv4_loopbacks { |iface| return iface }
@@ -26,13 +45,17 @@ module Interfacez
26
45
 
27
46
  # All ipv4 loopback interfaces.
28
47
  def self.ipv4_loopbacks
29
- results = []
30
- raw_interface_addresses.each do |iface|
31
- next unless iface.addr.ipv4_loopback?
32
- yield iface.name if block_given?
33
- results << iface.name
48
+ if block_given?
49
+ raw_interface_addresses.each do |iface|
50
+ next unless iface.addr
51
+ next unless iface.addr.ipv4_loopback?
52
+ yield iface.name if block_given?
53
+ end
54
+ else
55
+ results = []
56
+ Interfacez.ipv4_loopbacks { |l| results << l }
57
+ return results
34
58
  end
35
- return results
36
59
  end
37
60
 
38
61
  # First available ipv6 loopback interface.
@@ -42,13 +65,17 @@ module Interfacez
42
65
 
43
66
  # All ipv6 loopback interfaces.
44
67
  def self.ipv6_loopbacks
45
- results = []
46
- raw_interface_addresses.each do |iface|
47
- next unless iface.addr.ipv6_loopback?
48
- yield iface.name if block_given?
49
- results << iface.name
68
+ if block_given?
69
+ raw_interface_addresses.each do |iface|
70
+ next unless iface.addr
71
+ next unless iface.addr.ipv6_loopback?
72
+ yield iface.name if block_given?
73
+ end
74
+ else
75
+ results = []
76
+ Interfacez.ipv4_loopbacks { |l| results << l }
77
+ return results
50
78
  end
51
- return results
52
79
  end
53
80
 
54
81
  # All network interface names available on system.
@@ -64,9 +91,11 @@ module Interfacez
64
91
 
65
92
  # Network interfaces with their ipv4 addresses, if they have
66
93
  # any asscoited with it.
67
- def self.ipv4_addresses
94
+ def self.ipv4_addresses(interface = nil)
95
+ return ipv4_addresses_of(interface) unless interface.nil?
68
96
  results = Hash.new()
69
97
  raw_interface_addresses.each do |iface|
98
+ next unless iface.addr
70
99
  if iface.addr.ipv4?
71
100
  results[iface.name] = [] unless results[iface.name]
72
101
  results[iface.name] << iface.addr.ip_address
@@ -80,11 +109,25 @@ module Interfacez
80
109
  return results
81
110
  end
82
111
 
112
+ # Return all ipv4 addresses of a given interface.
113
+ def self.ipv4_address_of(interface)
114
+ addresses = Interfacez.ipv4_addresses[interface]
115
+ return nil if addresses.nil?
116
+ return addresses[0]
117
+ end
118
+
119
+ # Return the first ipv4 address of a given interface.
120
+ def self.ipv4_addresses_of(interface)
121
+ return Interfacez.ipv4_addresses[interface] || []
122
+ end
123
+
83
124
  # Network interfaces with their ipv6 addresses, if they have
84
125
  # any asscoited with it.
85
- def self.ipv6_addresses
126
+ def self.ipv6_addresses(interface = nil)
127
+ return ipv6_addresses_of(interface) unless interface.nil?
86
128
  results = Hash.new()
87
129
  raw_interface_addresses.each do |iface|
130
+ next unless iface.addr
88
131
  if iface.addr.ipv6?
89
132
  results[iface.name] = [] unless results[iface.name]
90
133
  results[iface.name] << iface.addr.ip_address
@@ -98,6 +141,58 @@ module Interfacez
98
141
  return results
99
142
  end
100
143
 
144
+ # Return all available ipv6 addreses of a given interface.
145
+ def self.ipv6_addresses_of(interface)
146
+ return Interfacez.ipv6_addresses[interface] || []
147
+ end
148
+
149
+ # Return the first ipv6 address of a given interface.
150
+ def self.ipv6_address_of(interface)
151
+ addresses = Interfacez.ipv6_addresses_of(interface)
152
+ return nil if addresses.nil?
153
+ return addresses[0]
154
+ end
155
+
156
+ # Return first available mac addresses of a given interface.
157
+ def self.mac_address_of(interface)
158
+ list = Interfacez.mac_addresses_of(interface)
159
+ return nil if list.size.zero?
160
+ return list[0]
161
+ end
162
+
163
+ # Return all available mac addresses of a given interface.
164
+ def self.mac_addresses_of(interface)
165
+ # BSD support
166
+ if Socket.const_defined? :PF_LINK
167
+ list = raw_interface_addresses.map! do |iface|
168
+ next unless iface.name == interface
169
+ next unless iface.addr
170
+ nameinfo = iface.addr.getnameinfo
171
+ if nameinfo.first != "" && nameinfo.last == ""
172
+ nameinfo[0]
173
+ end
174
+ end.compact
175
+ # Linux support
176
+ elsif Socket.const_defined? :PF_PACKET
177
+ list = raw_interface_addresses.map! do |iface|
178
+ next unless iface.name == interface
179
+ next unless iface.addr
180
+ iface.addr.inspect_sockaddr[/hwaddr=([\h:]+)/, 1]
181
+ end.compact
182
+ else
183
+ warn "This platform may not be fully supported!"
184
+ return []
185
+ end
186
+ end
187
+
188
+ # Get index of network interface.
189
+ def self.index_of(interface)
190
+ raw_interface_addresses.each do |iface|
191
+ return iface.ifindex if iface.name == interface
192
+ end
193
+ return nil
194
+ end
195
+
101
196
  # :nodoc:
102
197
  def self.raw_interface_addresses
103
198
  Socket.getifaddrs
@@ -105,4 +200,5 @@ module Interfacez
105
200
  warn "Unable to get raw interface address list from Socket class"
106
201
  return []
107
202
  end
203
+
108
204
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: interfacez
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kent 'picat' Gruber
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-04-03 00:00:00.000000000 Z
11
+ date: 2021-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '13.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '13.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -52,13 +52,14 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
- description:
55
+ description:
56
56
  email:
57
57
  - kgruber1@emich.edu
58
58
  executables: []
59
59
  extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
+ - ".github/workflows/CI.yml"
62
63
  - ".gitignore"
63
64
  - ".rspec"
64
65
  - ".travis.yml"
@@ -78,7 +79,7 @@ homepage: https://github.com/picatz/interfacez
78
79
  licenses:
79
80
  - MIT
80
81
  metadata: {}
81
- post_install_message:
82
+ post_install_message:
82
83
  rdoc_options: []
83
84
  require_paths:
84
85
  - lib
@@ -93,9 +94,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
93
94
  - !ruby/object:Gem::Version
94
95
  version: '0'
95
96
  requirements: []
96
- rubyforge_project:
97
- rubygems_version: 2.7.3
98
- signing_key:
97
+ rubygems_version: 3.0.6
98
+ signing_key:
99
99
  specification_version: 4
100
100
  summary: Simplified network interface API
101
101
  test_files: []