covalence 0.7.9.rc1 → 0.8.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 +4 -4
- data/README.md +5 -2
- data/lib/covalence.rb +5 -0
- data/lib/covalence/consul_tasks.rb +27 -0
- data/lib/covalence/core/cli_wrappers/sops_cli.rb +82 -0
- data/lib/covalence/helpers/shell_interpolation.rb +1 -1
- data/lib/covalence/sops_tasks.rb +33 -0
- data/lib/covalence/version.rb +1 -1
- metadata +22 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5182025f5f5eabe3341b2b1b96414d4392abfc57453018fbce9c4a6887d5a6e1
|
4
|
+
data.tar.gz: 4d0850fbd8211d219254dd585af563c6caed2e5e06605dee272f2e4ef91a7bce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 23f0b2e254b8f7bfae871be474a9a309fac6e51903e23d341dd060bf73f708e8d4384c57c865733b63f99ada4f739b78bf72f4934adb2c0565b9e1a34b59b8a3
|
7
|
+
data.tar.gz: cf5a2c8e35821c4b086549eede664ade69d610ad18c8cac19404fb92b13b38088832e542f83257590514b94a184ea7aa6587634d80ca0e43fafcbed63c35e2c8
|
data/README.md
CHANGED
@@ -504,8 +504,11 @@ vpc_id:
|
|
504
504
|
|
505
505
|
Covalence is packaged as a Ruby Gem.
|
506
506
|
|
507
|
+
You will probably need the following packages installed locally
|
508
|
+
- Terraform
|
509
|
+
- Packer
|
510
|
+
- Sops
|
511
|
+
|
507
512
|
Execute the following to build the gem:
|
508
513
|
|
509
514
|
`$ gem build covalence.gemspec`
|
510
|
-
|
511
|
-
Gem artifacts are hosted at https://repo.fury.io/unifio/.
|
data/lib/covalence.rb
CHANGED
@@ -26,6 +26,11 @@ module Covalence
|
|
26
26
|
|
27
27
|
PACKER_CMD = ENV['PACKER_CMD'] || "packer"
|
28
28
|
|
29
|
+
SOPS_CMD = ENV['SOPS_CMD'] || "sops"
|
30
|
+
SOPS_VERSION = ENV['SOPS_VERSION'] || (`#{SOPS_CMD} --version`.gsub(/[^\d\.]/, '') rescue "0.0.0")
|
31
|
+
SOPS_ENCRYPTED_SUFFIX = ENV['SOPS_ENCRYPTED_SUFFIX'] || "-encrypted"
|
32
|
+
SOPS_DECRYPTED_SUFFIX = ENV['SOPS_DECRYPTED_SUFFIX'] || "-decrypted"
|
33
|
+
|
29
34
|
# No-op shell command. Should not need to modify for most unix shells.
|
30
35
|
DRY_RUN_CMD = (ENV['COVALENCE_DRY_RUN_CMD'] || ":")
|
31
36
|
DEBUG_CLI = (ENV['COVALENCE_DEBUG'] || 'false') =~ (/(true|t|yes|y|1)$/i)
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'consul_loader'
|
3
|
+
require_relative '../covalence'
|
4
|
+
|
5
|
+
module Covalence
|
6
|
+
class ConsulTasks
|
7
|
+
extend Rake::DSL
|
8
|
+
|
9
|
+
def self.run
|
10
|
+
desc 'Load K/V data into Consul service'
|
11
|
+
task 'consul_load' do
|
12
|
+
load_yaml("#{ENV['CONSUL_KV_FILE']}")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class << self
|
17
|
+
private
|
18
|
+
def load_yaml(filename)
|
19
|
+
consul_loader = ConsulLoader::Loader.new(ConsulLoader::ConfigParser.new)
|
20
|
+
consul_server = "http://#{ENV['CONSUL_HTTP_ADDR']}"
|
21
|
+
consul_loader.load_config(filename, consul_server)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
Covalence::ConsulTasks.run
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'semantic'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'yaml'
|
4
|
+
require 'active_support/core_ext/object/blank'
|
5
|
+
|
6
|
+
module Covalence
|
7
|
+
class SopsCli
|
8
|
+
|
9
|
+
DIRECTION = {
|
10
|
+
encrypt: {
|
11
|
+
sops_option: "--encrypt",
|
12
|
+
file_search_suffix: "-decrypted",
|
13
|
+
file_replace_suffix: "-encrypted"
|
14
|
+
},
|
15
|
+
decrypt: {
|
16
|
+
sops_option: "--decrypt",
|
17
|
+
file_search_suffix: "-encrypted",
|
18
|
+
file_replace_suffix: "-decrypted"
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
def self.encrypt_path(path=default_data_dir, extension=".yaml")
|
23
|
+
modify_files(DIRECTION[:encrypt], path, extension)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.decrypt_path(path=default_data_dir, extension=".yaml")
|
27
|
+
modify_files(DIRECTION[:decrypt], path, extension)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Clean targets all extensions by default, sounds like a more secure way to avoid commiting something accidentally
|
31
|
+
def self.clean_decrypt_path(path, extension="*", dry_run: false, verbose: true)
|
32
|
+
file_path = File.expand_path(path)
|
33
|
+
|
34
|
+
if File.file?(file_path)
|
35
|
+
files = [file_path]
|
36
|
+
else
|
37
|
+
files = Dir.glob(File.join(file_path, "**" , "*#{DIRECTION[:decrypt][:file_replace_suffix]}#{extension}"))
|
38
|
+
end
|
39
|
+
|
40
|
+
unless files.blank?
|
41
|
+
FileUtils.rm_f(files, {
|
42
|
+
noop: dry_run,
|
43
|
+
verbose: verbose
|
44
|
+
})
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.default_data_dir
|
49
|
+
@default_data_dir ||= File.join(WORKSPACE, YAML.load_file(CONFIG).fetch(:yaml, {}).fetch(:datadir, ""))
|
50
|
+
end
|
51
|
+
|
52
|
+
class << self
|
53
|
+
private
|
54
|
+
|
55
|
+
# Intentionally unified the logic so that encryption and decryption would follow the
|
56
|
+
# same path and avoid logic forking
|
57
|
+
def modify_files(direction_hash, path, extension=".yaml")
|
58
|
+
if Semantic::Version.new(Covalence::SOPS_VERSION) < Semantic::Version.new("3.0.0")
|
59
|
+
raise "Sops v3.0.0 or newer required"
|
60
|
+
end
|
61
|
+
|
62
|
+
files = []
|
63
|
+
file_path = File.expand_path(path)
|
64
|
+
cmd = [Covalence::SOPS_CMD, direction_hash[:sops_option]]
|
65
|
+
|
66
|
+
if File.file?(file_path)
|
67
|
+
files = [file_path]
|
68
|
+
else
|
69
|
+
files = Dir.glob(File.join(file_path, "**" , "*#{direction_hash[:file_search_suffix]}#{extension}"))
|
70
|
+
end
|
71
|
+
|
72
|
+
files.map do |file|
|
73
|
+
dirname, basename = File.split(file)
|
74
|
+
new_file = File.join(dirname, basename.gsub(direction_hash[:file_search_suffix],direction_hash[:file_replace_suffix]))
|
75
|
+
|
76
|
+
break unless (PopenWrapper.run(cmd, file, "> #{new_file}") == 0)
|
77
|
+
new_file
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -6,7 +6,7 @@ module Covalence
|
|
6
6
|
|
7
7
|
def self.parse_shell(input)
|
8
8
|
Covalence::LOGGER.info "Evaluating requested interpolation: \"#{input}\""
|
9
|
-
matches = input.scan(/.?\$\([^)]*\)
|
9
|
+
matches = input.scan(/.?\$\([^)]*\)+/)
|
10
10
|
|
11
11
|
Covalence::LOGGER.debug "matches: #{matches}"
|
12
12
|
matches.each do |cmd|
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'consul_loader'
|
3
|
+
require_relative '../covalence'
|
4
|
+
require_relative 'core/cli_wrappers/sops_cli'
|
5
|
+
|
6
|
+
module Covalence
|
7
|
+
class SopsTasks
|
8
|
+
extend Rake::DSL
|
9
|
+
|
10
|
+
def self.run
|
11
|
+
desc 'Decrypt files in [:path, :extension]'
|
12
|
+
task 'sops:decrypt_path', [:path, :extension] do |t, args|
|
13
|
+
# should have defaults in just one place but rake isn't a terribly great entrypoint to centralize on
|
14
|
+
SopsCli.decrypt_path(args[:path] || SopsCli.default_data_dir,
|
15
|
+
args[:extension] || ".yaml")
|
16
|
+
end
|
17
|
+
|
18
|
+
desc 'Encrypt files in [:path, :extension]'
|
19
|
+
task 'sops:encrypt_path', [:path, :extension] do |t, args|
|
20
|
+
SopsCli.encrypt_path(args[:path] || SopsCli.default_data_dir,
|
21
|
+
args[:extension] || ".yaml")
|
22
|
+
end
|
23
|
+
|
24
|
+
desc 'Clean decrypt files in [:path, :extension]'
|
25
|
+
task 'sops:clean_decrypt_path', [:path, :extension] do |t, args|
|
26
|
+
SopsCli.clean_decrypt_path(args[:path] || SopsCli.default_data_dir,
|
27
|
+
args[:extension] || "*")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
Covalence::SopsTasks.run
|
data/lib/covalence/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: covalence
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Unif.io
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-05-
|
11
|
+
date: 2018-05-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: deep_merge
|
@@ -178,6 +178,20 @@ dependencies:
|
|
178
178
|
- - "~>"
|
179
179
|
- !ruby/object:Gem::Version
|
180
180
|
version: 1.7.10
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: consul_loader
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: 1.0.0
|
188
|
+
type: :runtime
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - "~>"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: 1.0.0
|
181
195
|
- !ruby/object:Gem::Dependency
|
182
196
|
name: ci_reporter_rspec
|
183
197
|
requirement: !ruby/object:Gem::Requirement
|
@@ -262,20 +276,6 @@ dependencies:
|
|
262
276
|
- - "~>"
|
263
277
|
- !ruby/object:Gem::Version
|
264
278
|
version: 10.0.2
|
265
|
-
- !ruby/object:Gem::Dependency
|
266
|
-
name: serverspec
|
267
|
-
requirement: !ruby/object:Gem::Requirement
|
268
|
-
requirements:
|
269
|
-
- - "~>"
|
270
|
-
- !ruby/object:Gem::Version
|
271
|
-
version: 2.41.3
|
272
|
-
type: :development
|
273
|
-
prerelease: false
|
274
|
-
version_requirements: !ruby/object:Gem::Requirement
|
275
|
-
requirements:
|
276
|
-
- - "~>"
|
277
|
-
- !ruby/object:Gem::Version
|
278
|
-
version: 2.41.3
|
279
279
|
- !ruby/object:Gem::Dependency
|
280
280
|
name: webmock
|
281
281
|
requirement: !ruby/object:Gem::Requirement
|
@@ -290,20 +290,6 @@ dependencies:
|
|
290
290
|
- - "~>"
|
291
291
|
- !ruby/object:Gem::Version
|
292
292
|
version: 3.4.1
|
293
|
-
- !ruby/object:Gem::Dependency
|
294
|
-
name: gemfury
|
295
|
-
requirement: !ruby/object:Gem::Requirement
|
296
|
-
requirements:
|
297
|
-
- - "~>"
|
298
|
-
- !ruby/object:Gem::Version
|
299
|
-
version: 0.7.0
|
300
|
-
type: :development
|
301
|
-
prerelease: false
|
302
|
-
version_requirements: !ruby/object:Gem::Requirement
|
303
|
-
requirements:
|
304
|
-
- - "~>"
|
305
|
-
- !ruby/object:Gem::Version
|
306
|
-
version: 0.7.0
|
307
293
|
- !ruby/object:Gem::Dependency
|
308
294
|
name: fabrication
|
309
295
|
requirement: !ruby/object:Gem::Requirement
|
@@ -344,10 +330,12 @@ files:
|
|
344
330
|
- README.md
|
345
331
|
- TODO.md
|
346
332
|
- lib/covalence.rb
|
333
|
+
- lib/covalence/consul_tasks.rb
|
347
334
|
- lib/covalence/core/bootstrap.rb
|
348
335
|
- lib/covalence/core/cli_wrappers/packer.yml
|
349
336
|
- lib/covalence/core/cli_wrappers/packer_cli.rb
|
350
337
|
- lib/covalence/core/cli_wrappers/popen_wrapper.rb
|
338
|
+
- lib/covalence/core/cli_wrappers/sops_cli.rb
|
351
339
|
- lib/covalence/core/cli_wrappers/terraform.yml
|
352
340
|
- lib/covalence/core/cli_wrappers/terraform_cli.rb
|
353
341
|
- lib/covalence/core/data_stores/hiera.rb
|
@@ -372,6 +360,7 @@ files:
|
|
372
360
|
- lib/covalence/helpers/spec_dependencies.rb
|
373
361
|
- lib/covalence/rake/rspec/envs_spec.rb
|
374
362
|
- lib/covalence/rake/rspec/yaml_spec.rb
|
363
|
+
- lib/covalence/sops_tasks.rb
|
375
364
|
- lib/covalence/spec_tasks.rb
|
376
365
|
- lib/covalence/version.rb
|
377
366
|
homepage: https://unif.io
|
@@ -389,12 +378,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
389
378
|
version: 2.0.0
|
390
379
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
391
380
|
requirements:
|
392
|
-
- - "
|
381
|
+
- - ">="
|
393
382
|
- !ruby/object:Gem::Version
|
394
|
-
version:
|
383
|
+
version: '0'
|
395
384
|
requirements: []
|
396
385
|
rubyforge_project:
|
397
|
-
rubygems_version: 2.7.
|
386
|
+
rubygems_version: 2.7.7
|
398
387
|
signing_key:
|
399
388
|
specification_version: 4
|
400
389
|
summary: A tool for the management and orchestration of data used by HashiCorp infrastructure
|