iface 0.1.4 → 0.1.5
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/value_set/pair.rb +123 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c783abed5551ead82ea28d277fc2fe93e9bdb1c
|
4
|
+
data.tar.gz: 96cb40129dba548ad3ac3c437e3fa1ce45e67396
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5164725bb68a9c16dffc5619ebc8b140252cc529543c7f0128744b911e0933220109e84f735c2b26703cce47c35cfcb5d186d5cd5d083a54e9b5c2b9055d0ebb
|
7
|
+
data.tar.gz: 8bea4dded2138511956dfb680185642c368ce425c6fe95473b2f5e10e22b72ac43c3d939725a138f7a6aa73c7eef584529f72fa830f4ccf6a9188c0ace68a191
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Iface
|
4
|
+
class ValueSet
|
5
|
+
# Represents a NAME=value pair
|
6
|
+
#
|
7
|
+
# This serves as the default class for a NAME key. Use `::create` to
|
8
|
+
# instantiate a specialization of this class, if available.
|
9
|
+
class Pair
|
10
|
+
attr_reader :name
|
11
|
+
attr_accessor :value
|
12
|
+
|
13
|
+
def self.create(name_or_line, value = nil, value_set:)
|
14
|
+
# get name and value
|
15
|
+
if value
|
16
|
+
name = name_or_line.to_s.upcase
|
17
|
+
else
|
18
|
+
match = name_or_line.match(/(^[A-Z0-9_]+?)="?(.*?)"?$/)
|
19
|
+
raise ArgumentError, "Expected pattern NAME=value; got #{name_or_line.inspect}" unless match
|
20
|
+
name = match[1]
|
21
|
+
value = match[2]&.sub(/^"/, '')&.sub(/"$/, '')
|
22
|
+
end
|
23
|
+
|
24
|
+
# find matching class and instantiate
|
25
|
+
VAR_HANDLERS.fetch(name, self).new(name, value, value_set)
|
26
|
+
end
|
27
|
+
|
28
|
+
def initialize(name, value, value_set) # :nodoc:
|
29
|
+
@name = name.to_s.upcase
|
30
|
+
@value = value
|
31
|
+
@value_set = value_set
|
32
|
+
end
|
33
|
+
|
34
|
+
def raw_value
|
35
|
+
@value
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_s
|
39
|
+
"#{name}=\"#{value}\""
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Represents a pair for IPADDR
|
44
|
+
class IpV4Primary < Pair
|
45
|
+
def initialize(_name, value, value_set)
|
46
|
+
super('IPADDR', value, value_set)
|
47
|
+
self.value = value
|
48
|
+
end
|
49
|
+
|
50
|
+
def value
|
51
|
+
IpV4Address.from_numeric(@value).to_s
|
52
|
+
end
|
53
|
+
|
54
|
+
def value=(new_value)
|
55
|
+
@value = IpV4Address.new(new_value).to_i
|
56
|
+
self
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Represents a pair for IPV6ADDR, which is output in the form
|
61
|
+
# IPV6ADDR="ipv6-address/prefix-length"
|
62
|
+
class IpV6Primary < Pair
|
63
|
+
def initialize(_name, value, value_set)
|
64
|
+
super('IPV6ADDR', value, value_set)
|
65
|
+
self.value = value
|
66
|
+
end
|
67
|
+
|
68
|
+
def value
|
69
|
+
"#{IpV6Address.from_numeric(@value)}/#{@mask}"
|
70
|
+
end
|
71
|
+
|
72
|
+
def value=(new_value)
|
73
|
+
ip, mask = new_value.split(%r{/})
|
74
|
+
ipaddr = IpV6Address.new(ip)
|
75
|
+
@value = ipaddr.to_i
|
76
|
+
@mask = mask || 64
|
77
|
+
@value_set['ipv6_secondaries']&.filter_primary!(@value)
|
78
|
+
self
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# Represents a pair for IPV6ADDR_SECONDARIES
|
83
|
+
class IpV6Secondaries < Pair
|
84
|
+
def initialize(_name, value, value_set)
|
85
|
+
super('IPV6ADDR_SECONDARIES', value, value_set)
|
86
|
+
case value
|
87
|
+
when String
|
88
|
+
self.value = value.split(/ +/)
|
89
|
+
when Array
|
90
|
+
self.value = value
|
91
|
+
else
|
92
|
+
raise ArgumentError, "Expected String or Array; got #{value.class.name}: #{value.inspect}"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def value=(new_value)
|
97
|
+
ips = new_value.map do |ip_with_mask|
|
98
|
+
ip, mask = ip_with_mask.split(%r{/})
|
99
|
+
[IpV6Address.new(ip).to_i, mask || 128]
|
100
|
+
end.uniq.sort
|
101
|
+
@value = ips
|
102
|
+
ipv6_primary = @value_set.fetch_raw('ipv6addr')
|
103
|
+
filter_primary!(ipv6_primary) if ipv6_primary
|
104
|
+
self
|
105
|
+
end
|
106
|
+
|
107
|
+
def value
|
108
|
+
@value.map { |ip_num, mask| "#{IpV6Address.from_numeric(ip_num)}/#{mask}" }.join(' ')
|
109
|
+
end
|
110
|
+
|
111
|
+
def filter_primary!(primary_num)
|
112
|
+
@value = @value.reject { |ip_num, _mask| ip_num == primary_num }
|
113
|
+
self
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
VAR_HANDLERS = { # rubocop:disable Style/MutableConstant
|
118
|
+
'IPADDR' => IpV4Primary,
|
119
|
+
'IPV6ADDR' => IpV6Primary,
|
120
|
+
'IPV6ADDR_SECONDARIES' => IpV6Secondaries
|
121
|
+
}
|
122
|
+
end
|
123
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jim Cain
|
@@ -22,6 +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
|
+
- lib/iface/value_set/pair.rb
|
25
26
|
homepage: http://rubygems.org/gems/iface
|
26
27
|
licenses:
|
27
28
|
- BSD-3-Clause
|