openvpn_configurator 1.0.1 → 1.1.0

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
  SHA256:
3
- metadata.gz: cc04ba2c2c6003731f8e2448e266453c692bb27a3f1209f99a52936efdac4cd9
4
- data.tar.gz: ff1237be67eed51281813f450fbeb446fdaaa39c17bba733c6468ceef7f41c3a
3
+ metadata.gz: e5c1f39eb5fb9575fbd0cf3f65c293b2c85ba65773c840f6cf19a0c3a54c9f79
4
+ data.tar.gz: 88f0572ff291a1b5ec27d8bb66654a6671b4d54b2974ffdfc9d5d8f6265bf0cf
5
5
  SHA512:
6
- metadata.gz: '08c9aa447ef05a530f7252e3163ec3f865457c96209d01fbebe3d7e94b4edc8ae6259e38956f1e1cdcf4e88b5e55065a9084f0e245998b2c9c488f0e9108740a'
7
- data.tar.gz: a274b18a5561fb3ce7b7c2fd2167ce05da247df1f97d4d190edf051a5a67c78350cd42cfef14e58f42719f44833a9cb922f4cd36c4124f16087fc6c810f47f08
6
+ metadata.gz: 14e4908a7f2b7f5d497e341fb429267cc5d33363514cf89c4ffde4411871864c37b4895006d514fb375a76f0c07352476b4d0f8284c05b92d1971c946bb72724
7
+ data.tar.gz: fc5de4cd52c552cdf919f0804d832004a0ff9d291efcacc1fa3a1c497e3be92388d84d5dd33dbd2f62c98648e271b7f5f4e3656767f0f32877691f532b6bf633
@@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [1.1.0] - 2020-10-12
8
+ ### Added
9
+ - Support for `--client` option
10
+ - Automatic pruning of overlapping/duplicate routes
11
+
7
12
  ## [1.0.0] - 2020-04-28
8
13
 
9
14
  ### Added
@@ -41,6 +41,7 @@ module OpenVPNConfigurator
41
41
  banner self.synopsis
42
42
  banner "Usage: #{$0} [options] <input-path> <output-path>"
43
43
  banner 'Dynamic route collection options'
44
+ opt :client, "Run in client mode (directly assign routes instead of pushing them)", type: :boolean, default: false
44
45
  opt :route_v4_aws_region, "Add IPv4 routes for an AWS region (like 'us-west-2')", type: :string, multi: true
45
46
  opt :route_v4_dns, 'Add IPv4 routes for A record(s) returned by the specified DNS query', type: :string, multi: true
46
47
  banner 'Actions'
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+ module OpenVPNConfigurator
3
+ # Represents a comment to be inserted into the configuration file
4
+ class Comment
5
+ def initialize(message)
6
+ @message = message
7
+ end
8
+
9
+
10
+ def to_s
11
+ "#{@message.gsub("\n", ' ')}"
12
+ end
13
+ end
14
+ end
15
+
@@ -5,6 +5,10 @@ require 'optimist'
5
5
  require 'resolv'
6
6
  require 'rest_client'
7
7
  require 'semantic_logger'
8
+ require 'time'
9
+
10
+ require_relative 'comment'
11
+
8
12
 
9
13
  module OpenVPNConfigurator
10
14
  class RouteGatherer
@@ -18,9 +22,10 @@ module OpenVPNConfigurator
18
22
  old_output = read_file options[:output_path], nonexistent_behavior: :empty_string
19
23
 
20
24
  routes = gather_routes options
21
- rendered = render_routes routes
25
+ reduced = reduce_routes routes
26
+ rendered = render_routes reduced, client: !!options[:client]
22
27
 
23
- result = format "%s\n\n\n# Added by OpenVPN Configurator v%s\n%s", template, VERSION, rendered
28
+ result = format "%s\n\n\n# Added by OpenVPN Configurator v%s at %s\n%s", template, VERSION, Time.now.iso8601(6), rendered
24
29
  if result != old_output
25
30
  logger.info "Output content changed, rewriting file #{options[:output_path].inspect}"
26
31
  write_file options[:output_path], result
@@ -86,6 +91,51 @@ module OpenVPNConfigurator
86
91
  end
87
92
 
88
93
 
94
+ # rel determines the relationship to another IPv4Net. Returns:
95
+ # * 1 if this IPv4Net is the supernet of other
96
+ # * 0 if the two are equal
97
+ # * -1 if this IPv4Net is a subnet of other
98
+ # * nil if the networks are unrelated
99
+
100
+ # @return [Hash<String, Array<NetAddr::IPv4Net, NetAddr::IPv6Net>]
101
+ def reduce_routes(routes)
102
+ seen_v4 = []
103
+ seen_v6 = []
104
+ reduction = false
105
+ result = {}
106
+ routes.each_pair do |name, entries|
107
+ result[name] = []
108
+ entries.each do |entry|
109
+ seen = case entry
110
+ when NetAddr::IPv4Net
111
+ seen_v4
112
+ when NetAddr::IPv6Net
113
+ seen_v6
114
+ else
115
+ nil
116
+ end
117
+ if seen
118
+ covered = seen.find { |s| [1, 0].include? s.rel(entry) }
119
+ if covered
120
+ reduction = true
121
+ result[name].push Comment.new("Route #{entry} already covered by route #{covered}")
122
+ else
123
+ seen.push entry
124
+ result[name].push entry
125
+ end
126
+ else
127
+ result[name].push entry
128
+ end
129
+ end
130
+ end
131
+ if reduction
132
+ reduce_routes result
133
+ else
134
+ result
135
+ end
136
+ end
137
+
138
+
89
139
  # For tests, this method is stubbable
90
140
  # @return [Array<NetAddr::IPv4, NetAddr::IPv6>]
91
141
  def resolve_v4(name)
@@ -106,20 +156,27 @@ module OpenVPNConfigurator
106
156
 
107
157
 
108
158
  # @param routes [Hash<String, Array<NetAddr::IPv4Net, NetAddr::IPv6Net>>] { "Configuration Source Name" => [NetAddr::IPv4Net, NetAddr::IPv6Net] }
109
- def render_routes(routes)
159
+ def render_routes(routes, client: false)
160
+ indent = "\t\t\t"
161
+ directive_indent = client ? indent : ' '
162
+ prefix = client ? '' : "push#{indent}\""
163
+ postfix = client ? '' : '"'
164
+
110
165
  result = []
111
166
  routes.keys.sort.each do |source|
112
167
  result << "##{source}"
113
168
  routes[source].sort_by(&:to_s).each do |route|
114
169
  directive = case route
115
170
  when NetAddr::IPv4Net
116
- format 'route %s', route.extended
171
+ format 'route%s%s', directive_indent, route.extended
117
172
  when NetAddr::IPv6Net
118
- format 'route-ipv6 %s', route.to_s
173
+ format 'route-ipv6%s%s', directive_indent, route.to_s
174
+ when Comment
175
+ format '# %s', route.to_s
119
176
  else
120
177
  raise "Only supporting IPv4 and IPv6 networks presently, got #{route.inspect} instead"
121
178
  end
122
- result << format("push\t\t\t\"%s\"", directive)
179
+ result << format("%s%s%s", prefix, directive, postfix)
123
180
  end
124
181
  result << ''
125
182
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OpenVPNConfigurator
4
- VERSION = '1.0.1'
4
+ VERSION = '1.1.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openvpn_configurator
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Ten Clay
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-05-12 00:00:00.000000000 Z
11
+ date: 2020-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gelf
@@ -214,6 +214,7 @@ files:
214
214
  - exe/openvpn_configurator
215
215
  - lib/openvpn_configurator.rb
216
216
  - lib/openvpn_configurator/cli.rb
217
+ - lib/openvpn_configurator/comment.rb
217
218
  - lib/openvpn_configurator/route_gatherer.rb
218
219
  - lib/openvpn_configurator/version.rb
219
220
  - openvpn_configurator.gemspec
@@ -239,8 +240,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
239
240
  - !ruby/object:Gem::Version
240
241
  version: '0'
241
242
  requirements: []
242
- rubyforge_project:
243
- rubygems_version: 2.7.6
243
+ rubygems_version: 3.1.3
244
244
  signing_key:
245
245
  specification_version: 4
246
246
  summary: Assists in generating OpenVPN configurations.