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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ea263ec6e38902c82cecbc40cefe2999addbff1a
4
- data.tar.gz: 8d0e59d48c63503602bf6cb5a0a367d4b6d86d09
3
+ metadata.gz: 5d6fa26ea8fbe2745f309e5c2690bca592b2457b
4
+ data.tar.gz: ec6a7071343fa410811212083862d1fc592e67b1
5
5
  SHA512:
6
- metadata.gz: 0624fb20cc6f57dd56636fff9ae64f8e06d129ae49a1cd93eeb1746d24661b29154b6984dd06486fa481529be79b07cf7bc3ddbf1cd57a9aef66f6b8027490bb
7
- data.tar.gz: b831690e28b9eb1a4012d43836d80dd4d2d058a3e1f6382d4252bea1d5917c8aaa4a60fae070b5a5e8fc2c6d707f317e101de91453c5bce39580e2f411933fb0
6
+ metadata.gz: b7697cbb1c54cf9e06ce114d43b42742137428bdeac500e4962e6625951a430d194498a709fe96f222ab8a94d7ad79bd821094d296a68537e201344f3f5773a9
7
+ data.tar.gz: 0d304fd04fb52aa4515a4047578e5d3d61f19a8a9124d7c6d74ebac1761d851d261a43d2f618709be610ac2add9a7cef79e1b348729887a4a8a6d9c0e72191b4
@@ -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{10.0.0.0/8 192.168.0.0/16}.collect { |i| IPAddr.new(i) }
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
- !Reserved_IP_Ranges.any? { |range| range.include?(ipaddr) }
58
+ Reserved_IP_Ranges.none? { |range| range.include?(ipaddr) }
47
59
  end
48
60
  end
49
61
 
50
62
  case result.size
51
- when 0
52
- nil
53
- when 1
54
- result.first
55
- else
56
- raise RuntimeError, "Expected 0 or 1 primary files; found #{result.size}"
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
@@ -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
- if match
32
- device, _skip0, _skip1, range_num, _skip2, clone_num = match.captures
33
- [device, range_num&.to_i, clone_num&.to_i]
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 self.name =~ /File\Z/
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, _vars)
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
- if (vars['bootproto'] == 'static') || (vars['bootproto'] == 'none') # RHEL6 uses "none"
76
- @ip_address = vars['ipaddr']
77
- @ipv6_address = vars['ipv6addr']
78
- @ipv6_secondaries = vars['ipv6addr_secondaries']&.split(/\s+/)
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 = [
@@ -3,6 +3,7 @@
3
3
  require 'ipaddr'
4
4
 
5
5
  module Iface
6
+ # Represents an IP address including subnet mask
6
7
  class IpAddress
7
8
  def initialize(*args)
8
9
  @ipaddr = IPAddr.new(*args)
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Adds IP-related methods to all Integers
4
4
  class Integer
5
- Mask32_ = 0xffffffffffffffff
5
+ Mask32_ = 0xffffffffffffffff # rubocop:disable Style/ConstantName
6
6
 
7
7
  def to_ip(ipver = 4)
8
8
  to_ipaddr(ipver).to_s
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.2
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-19 00:00:00.000000000 Z
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/hola
25
+ homepage: http://rubygems.org/gems/iface
26
26
  licenses:
27
27
  - BSD-3-Clause
28
28
  metadata: {}