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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/iface/value_set/pair.rb +123 -0
  3. metadata +2 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fc2fdecabc038ea8a83b38920c8dff34d60a7f4d
4
- data.tar.gz: afa9611dacfb1807fe1415d9ce3233a143a934db
3
+ metadata.gz: 6c783abed5551ead82ea28d277fc2fe93e9bdb1c
4
+ data.tar.gz: 96cb40129dba548ad3ac3c437e3fa1ce45e67396
5
5
  SHA512:
6
- metadata.gz: 7dab1b175a9bd0e556529562aa060daabd8e56c3e830bfbade0c858ef99d9f0605650ba3879556b03b6c9240df4b8f9fb5a9cdeab502b1bb8e34c7b4cf8de2d8
7
- data.tar.gz: 5bc90e93bfe86c604d6aadd650bed52a774056788ff5f94ba66a69403f1a9545beab65bc4b9128968b46a7b186a0abd4a5676ce244af7a80a138cd03a26ec50f
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
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