iface 0.1.2 → 0.1.3
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/lib/iface/config.rb +22 -10
- data/lib/iface/config_file.rb +32 -16
- data/lib/iface/ip_address.rb +1 -0
- data/lib/iface/ip_helpers.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d6fa26ea8fbe2745f309e5c2690bca592b2457b
|
4
|
+
data.tar.gz: ec6a7071343fa410811212083862d1fc592e67b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b7697cbb1c54cf9e06ce114d43b42742137428bdeac500e4962e6625951a430d194498a709fe96f222ab8a94d7ad79bd821094d296a68537e201344f3f5773a9
|
7
|
+
data.tar.gz: 0d304fd04fb52aa4515a4047578e5d3d61f19a8a9124d7c6d74ebac1761d851d261a43d2f618709be610ac2add9a7cef79e1b348729887a4a8a6d9c0e72191b4
|
data/lib/iface/config.rb
CHANGED
@@ -6,12 +6,11 @@ require 'ipaddr'
|
|
6
6
|
module Iface
|
7
7
|
# Represents a set of ConfigFiles for network interface configuration
|
8
8
|
class Config
|
9
|
-
Reserved_IP_Ranges = %w
|
9
|
+
Reserved_IP_Ranges = %w[10.0.0.0/8 192.168.0.0/16].collect { |i| IPAddr.new(i) }
|
10
10
|
|
11
11
|
def self.discover(pattern)
|
12
12
|
new.tap do |config|
|
13
13
|
Dir.glob(pattern) do |fullname|
|
14
|
-
puts fullname
|
15
14
|
File.open(fullname) { |io| config.add(fullname, io) }
|
16
15
|
end
|
17
16
|
end
|
@@ -19,20 +18,33 @@ module Iface
|
|
19
18
|
|
20
19
|
def initialize
|
21
20
|
@files = {}
|
21
|
+
@devices = {}
|
22
22
|
end
|
23
23
|
|
24
|
+
# Adds the given `filename` and `io` and returns self
|
24
25
|
def add(filename, io)
|
25
26
|
file = ConfigFile.create(filename, io)
|
27
|
+
|
28
|
+
# add to files by type
|
26
29
|
file_type = file.class.file_type_name
|
27
30
|
if @files.key?(file_type)
|
28
31
|
@files[file_type] << file
|
29
32
|
else
|
30
33
|
@files[file_type] = [file]
|
31
34
|
end
|
35
|
+
|
36
|
+
# add PrimaryFile to devices by device name
|
37
|
+
@devices[file.device] = file if file.is_a?(PrimaryFile)
|
38
|
+
|
32
39
|
self
|
33
40
|
end
|
34
41
|
|
35
|
-
# Returns the PrimaryFile
|
42
|
+
# Returns the `PrimaryFile` for `device`
|
43
|
+
def [](device)
|
44
|
+
@devices[device]
|
45
|
+
end
|
46
|
+
|
47
|
+
# Returns the `PrimaryFile` for the primary interface
|
36
48
|
#
|
37
49
|
# There should be 0 or 1 of these; else it's an error.
|
38
50
|
def primary
|
@@ -43,17 +55,17 @@ module Iface
|
|
43
55
|
false
|
44
56
|
else
|
45
57
|
ipaddr = IPAddr.new(file.ip_address)
|
46
|
-
|
58
|
+
Reserved_IP_Ranges.none? { |range| range.include?(ipaddr) }
|
47
59
|
end
|
48
60
|
end
|
49
61
|
|
50
62
|
case result.size
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
63
|
+
when 0
|
64
|
+
nil
|
65
|
+
when 1
|
66
|
+
result.first
|
67
|
+
else
|
68
|
+
raise "Expected 0 or 1 primary files; found #{result.size}"
|
57
69
|
end
|
58
70
|
end
|
59
71
|
end
|
data/lib/iface/config_file.rb
CHANGED
@@ -3,15 +3,22 @@
|
|
3
3
|
require_relative 'ip_helpers'
|
4
4
|
require_relative 'value_set'
|
5
5
|
|
6
|
+
# Monkey-patches `String` to add helper methods
|
6
7
|
class String
|
7
8
|
def decamelize
|
8
|
-
gsub(/[A-Z]/) {|m| $` == '' ? m.downcase : "_#{m.downcase}"}
|
9
|
+
gsub(/[A-Z]/) { |m| $` == '' ? m.downcase : "_#{m.downcase}" }
|
9
10
|
end
|
10
11
|
end
|
11
12
|
|
12
13
|
module Iface
|
13
14
|
# Base class for a network interface config file
|
15
|
+
#
|
16
|
+
# When reading from an existing file, use `.create`. When creating a config
|
17
|
+
# programatically for writing to a file, instantiate one of the subclasses
|
18
|
+
# (e.g. `PrimaryFile.new`).
|
14
19
|
class ConfigFile
|
20
|
+
attr_reader :filename, :device, :vars
|
21
|
+
|
15
22
|
def self.create(filename, io)
|
16
23
|
fname = File.split(filename).last
|
17
24
|
device, range_num, clone_num = parse_filename(fname)
|
@@ -28,10 +35,9 @@ module Iface
|
|
28
35
|
|
29
36
|
def self.parse_filename(filename)
|
30
37
|
match = filename.match(/\Aifcfg-(\w+)((-range(\d+))|(:(\d+)))?\Z/)
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
end
|
38
|
+
return unless match
|
39
|
+
device, _skip0, _skip1, range_num, _skip2, clone_num = match.captures
|
40
|
+
[device, range_num&.to_i, clone_num&.to_i]
|
35
41
|
end
|
36
42
|
|
37
43
|
def self.recognize?(_device, _range_num, _clone_num, _vars)
|
@@ -39,16 +45,13 @@ module Iface
|
|
39
45
|
end
|
40
46
|
|
41
47
|
def self.file_type_name
|
42
|
-
if
|
43
|
-
self.name.split('::').last[0..-5].decamelize.to_sym
|
44
|
-
else
|
45
|
-
nil
|
46
|
-
end
|
48
|
+
name.split('::').last[0..-5].decamelize.to_sym if name.match?(/File\Z/)
|
47
49
|
end
|
48
50
|
|
49
|
-
def initialize(filename, device, _range_num, _clone_num,
|
51
|
+
def initialize(filename, device, _range_num, _clone_num, vars)
|
50
52
|
@filename = filename
|
51
53
|
@device = device
|
54
|
+
@vars = vars
|
52
55
|
end
|
53
56
|
|
54
57
|
def static?
|
@@ -72,11 +75,10 @@ module Iface
|
|
72
75
|
|
73
76
|
def initialize(filename, device, range_num, clone_num, vars)
|
74
77
|
super
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
end
|
78
|
+
return unless %w[static none].include?(vars['bootproto']) # RHEL6 uses "none"
|
79
|
+
@ip_address = vars['ipaddr']
|
80
|
+
@ipv6_address = vars['ipv6addr']
|
81
|
+
@ipv6_secondaries = vars['ipv6addr_secondaries']&.split(/\s+/)
|
80
82
|
end
|
81
83
|
|
82
84
|
def static?
|
@@ -152,10 +154,24 @@ module Iface
|
|
152
154
|
end
|
153
155
|
end
|
154
156
|
|
157
|
+
# Represents a loopback file (device "lo")
|
155
158
|
class LoopbackFile < ConfigFile
|
156
159
|
def self.recognize?(device, _range_num, _clone_num, _vars)
|
157
160
|
device == 'lo'
|
158
161
|
end
|
162
|
+
|
163
|
+
def initialize(filename, device, range_num, _clone_num, vars)
|
164
|
+
super
|
165
|
+
@ip_address = vars['ipaddr']
|
166
|
+
end
|
167
|
+
|
168
|
+
def static?
|
169
|
+
true
|
170
|
+
end
|
171
|
+
|
172
|
+
def include?(ip)
|
173
|
+
@ip_address == ip
|
174
|
+
end
|
159
175
|
end
|
160
176
|
|
161
177
|
FILE_TYPES = [
|
data/lib/iface/ip_address.rb
CHANGED
data/lib/iface/ip_helpers.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iface
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jim Cain
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09-
|
11
|
+
date: 2017-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email: camelotjim@jcain.net
|
@@ -22,7 +22,7 @@ files:
|
|
22
22
|
- lib/iface/ip_address.rb
|
23
23
|
- lib/iface/ip_helpers.rb
|
24
24
|
- lib/iface/value_set.rb
|
25
|
-
homepage: http://rubygems.org/gems/
|
25
|
+
homepage: http://rubygems.org/gems/iface
|
26
26
|
licenses:
|
27
27
|
- BSD-3-Clause
|
28
28
|
metadata: {}
|