iface 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
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: {}