iface 0.1.4 → 0.1.5

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