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 +4 -4
- data/.github/workflows/CI.yml +26 -0
- data/Gemfile.lock +4 -4
- data/README.md +5 -2
- data/interfacez.gemspec +1 -1
- data/lib/interfacez/version.rb +1 -1
- data/lib/interfacez.rb +110 -14
- metadata +10 -10
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e3933043ffa46a19f9a456fe1c499a6d484a7a25ff5d08f31831f9badb10668a
|
|
4
|
+
data.tar.gz: f955df2c381771688e12a2cb013fc8c1af7cf1a0c598167b7e5cfe707b48edaf
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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.
|
|
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
|
+
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 (~>
|
|
31
|
+
rake (~> 13.0)
|
|
32
32
|
rspec (~> 3.0)
|
|
33
33
|
|
|
34
34
|
BUNDLED WITH
|
|
35
|
-
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", "~>
|
|
25
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
|
26
26
|
spec.add_development_dependency "rspec", "~> 3.0"
|
|
27
27
|
end
|
data/lib/interfacez/version.rb
CHANGED
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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.
|
|
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:
|
|
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: '
|
|
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: '
|
|
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
|
-
|
|
97
|
-
|
|
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: []
|