roro 0.3.6 → 0.3.13

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 (72) hide show
  1. checksums.yaml +5 -5
  2. data/{lib/roro/cli/templates/dockerize/.env → .circleci}/.keep +0 -0
  3. data/.circleci/config.yml +55 -0
  4. data/{lib/roro/cli/templates/ruby_gem → .circleci}/setup-gem-credentials.sh +1 -1
  5. data/.gitignore +13 -3
  6. data/Guardfile +2 -12
  7. data/docker-compose.yml +15 -0
  8. data/lib/roro.rb +0 -1
  9. data/lib/roro/cli.rb +70 -4
  10. data/lib/roro/cli/cli.rb +99 -0
  11. data/lib/roro/cli/configuration.rb +1 -0
  12. data/lib/roro/cli/expose.rb +8 -7
  13. data/lib/roro/cli/generate/config.rb +5 -5
  14. data/lib/roro/cli/generate/generate_keys.rb +47 -79
  15. data/lib/roro/cli/greenfield.rb +11 -21
  16. data/lib/roro/cli/obfuscate.rb +10 -11
  17. data/lib/roro/cli/rollon.rb +2 -2
  18. data/lib/roro/cli/rollon/stories.rb +2 -3
  19. data/lib/roro/cli/{templates/dockerize/.env/development/.keep → rollon/stories/database.rb} +0 -0
  20. data/lib/roro/cli/rollon/stories/rails.rb +1 -0
  21. data/lib/roro/cli/{templates/dockerize → rollon/stories/rails}/.keep +0 -0
  22. data/lib/roro/cli/rollon/{database → stories/rails}/database.rb +2 -0
  23. data/lib/roro/cli/rollon/{database → stories/rails/database}/with_mysql.rb +0 -0
  24. data/lib/roro/cli/rollon/{database/with_postgres.rb → stories/rails/database/with_postgresql.rb} +0 -0
  25. data/lib/roro/cli/rollon/stories/ruby_gem.rb +77 -0
  26. data/lib/roro/cli/rollon/stories/ruby_gem/with_ci_cd.rb +45 -0
  27. data/lib/roro/cli/rollon/stories/stories.rb +3 -0
  28. data/lib/roro/cli/ruby_gem.rb +60 -47
  29. data/lib/roro/cli/templates/base/.dockerignore +2 -2
  30. data/lib/roro/cli/templates/base/.env/database.mysql.env.tt +0 -1
  31. data/lib/roro/cli/templates/base/.env/database.pg.env.tt +0 -1
  32. data/lib/roro/cli/templates/base/.env/web.env.tt +1 -0
  33. data/lib/roro/cli/templates/base/Dockerfile.tt +53 -15
  34. data/lib/roro/cli/templates/greenfield/Dockerfile.tt +1 -1
  35. data/lib/roro/cli/templates/ruby_gem/{docker/env_files → .circleci}/.keep +0 -0
  36. data/lib/roro/cli/templates/ruby_gem/.circleci/config.yml.tt +40 -0
  37. data/lib/roro/cli/templates/ruby_gem/.circleci/setup-gem-credentials.sh +3 -0
  38. data/lib/roro/cli/templates/ruby_gem/docker-compose.yml +10 -4
  39. data/lib/roro/cli/templates/ruby_gem/{docker/keys → roro/containers}/.keep +0 -0
  40. data/lib/roro/cli/templates/ruby_gem/roro/containers/ruby_image/Dockerfile.tt +16 -0
  41. data/lib/roro/cli/templates/ruby_gem/roro/containers/ruby_image/ci.env.tt +1 -0
  42. data/lib/roro/cli/templates/ruby_gem/roro/keys/.keep +0 -0
  43. data/lib/roro/cli/templates/stories/rails/database/with_mysql/_service.yml +10 -0
  44. data/lib/roro/cli/templates/stories/rails/database/with_postgresql/.keep +0 -0
  45. data/lib/roro/cli/templates/stories/rails/database/with_postgresql/_service.yml +7 -0
  46. data/lib/roro/cli/templates/stories/ruby_gem/with_ci_cd/_build.yml +11 -0
  47. data/lib/roro/version.rb +1 -1
  48. data/roro.gemspec +3 -3
  49. data/roro/containers/.keep +0 -0
  50. data/roro/containers/ruby_image/Dockerfile +16 -0
  51. data/roro/containers/ruby_image/ci.env.enc +2 -0
  52. data/roro/keys/.keep +0 -0
  53. data/sandbox/.keep +0 -0
  54. data/tmp/.keep +0 -0
  55. data/vendor/cache/concurrent-ruby-1.1.7.gem +0 -0
  56. data/vendor/cache/gem-release-2.1.1.gem +0 -0
  57. metadata +59 -35
  58. data/lib/roro/cli/generate_keys.rb +0 -79
  59. data/lib/roro/cli/templates/circleci/config.yml.tt +0 -70
  60. data/lib/roro/cli/templates/dockerize/.env/development/database +0 -3
  61. data/lib/roro/cli/templates/dockerize/.env/development/web +0 -1
  62. data/lib/roro/cli/templates/dockerize/Dockerfile.tt +0 -23
  63. data/lib/roro/cli/templates/dockerize/docker-compose.yml.tt +0 -60
  64. data/lib/roro/cli/templates/dockerize/docker-entrypoint.sh +0 -9
  65. data/lib/roro/cli/templates/quickstart/Dockerfile.tt +0 -20
  66. data/lib/roro/cli/templates/quickstart/database.yml +0 -85
  67. data/lib/roro/cli/templates/quickstart/docker-compose.yml +0 -17
  68. data/lib/roro/cli/templates/quickstart/entrypoint.sh +0 -8
  69. data/lib/roro/cli/templates/ruby_gem/.gitignore +0 -8
  70. data/lib/roro/cli/templates/ruby_gem/config.yml +0 -122
  71. data/lib/roro/cli/templates/ruby_gem/docker/containers/app/Dockerfile.tt +0 -10
  72. data/vendor/cache/concurrent-ruby-1.1.6.gem +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: c448ed5c19cb319a371d294aac99449fbddadf605d0b46e1e694066b0807d7c9
4
- data.tar.gz: f668e36a0fd1e5866a9165fea9a6459a45197d0f2188aa84800001541d0cd089
2
+ SHA1:
3
+ metadata.gz: 6b8dac88c95d43a7e4531d2b44849f30e1e37c9e
4
+ data.tar.gz: 20af42166d1cc70f7b20d327d8cbc8027255cc6c
5
5
  SHA512:
6
- metadata.gz: b3727071acdd794946a8ca8bbd67644f589896d5bddd6675c7c1dfa61ba80dfe91f0c642553c9df09115e1fadc76bd01e8d7064c0808a9f1b08f61b8716800ff
7
- data.tar.gz: cccd90560e9664c9f38b6b56ac0d6f2f1266f6a4a7f93f7f7638e95593b26232480c1673c5e70b2950b41618daba87c27fac5a21d7a59fad69f91779c4d42226
6
+ metadata.gz: c05e7ff871bcfb14a52602ef71b3a331113ff87da423cca594fb07b41fb5463a432809e0526b8ca77987fb6838829c5ccacfc6e85e1823bf92d6d66a5c1bc3f9
7
+ data.tar.gz: db4039537980f16d922c0f08add246f66d1229b3055e0cfc0880f5bbdd968eca374d142639fb09d1b4d3d6246efac5dbe381239f516170e065ef3e72ab400366
@@ -0,0 +1,55 @@
1
+ version: 2.1
2
+
3
+ jobs:
4
+
5
+ build:
6
+ machine: true
7
+ steps:
8
+ - checkout
9
+
10
+ test:
11
+ machine: true
12
+ steps:
13
+ - checkout
14
+ - run: RUBY_VERSION=2.5 docker-compose build ruby_gem
15
+ - run: RUBY_VERSION=2.5 docker-compose up -d --force-recreate ruby_gem
16
+ - run: RUBY_VERSION=2.5 docker-compose run ruby_gem bundle exec rake test
17
+ - run: RUBY_VERSION=2.6 docker-compose build ruby_gem
18
+ - run: RUBY_VERSION=2.6 docker-compose up -d --force-recreate ruby_gem
19
+ - run: RUBY_VERSION=2.6 docker-compose run ruby_gem bundle exec rake test
20
+ - run: RUBY_VERSION=2.7 docker-compose build ruby_gem
21
+ - run: RUBY_VERSION=2.7 docker-compose up -d --force-recreate ruby_gem
22
+ - run: RUBY_VERSION=2.7 docker-compose run ruby_gem bundle exec rake test
23
+
24
+ release:
25
+ machine: true
26
+ steps:
27
+ - checkout
28
+ - run: gem install roro
29
+ - run: roro generate::exposed ci
30
+ - run: |
31
+ echo $(cat ./roro/containers/ruby_image/ci.env) >> $BASH_ENV
32
+ source $BASH_ENV
33
+ - run: chmod +x ./.circleci/setup-gem-credentials.sh
34
+ - run: ./.circleci/setup-gem-credentials.sh
35
+ - run: chmod 0600 ~/.gem/credentials
36
+ - run: git checkout .
37
+ - run: gem release
38
+
39
+ workflows:
40
+ version: 2
41
+
42
+ build-release:
43
+ jobs:
44
+ - build
45
+ - test:
46
+ filters:
47
+ branches:
48
+ only: master
49
+
50
+ - release:
51
+ requires:
52
+ - build
53
+ filters:
54
+ branches:
55
+ only: release
@@ -1,3 +1,3 @@
1
1
  mkdir ~/.gem
2
2
  echo -e "---\r\n:rubygems_api_key: $RUBYGEMS_API_KEY" > ~/.gem/credentials
3
- chmod 0600 /home/circleci/.gem/credentials
3
+ chmod 0600 /home/circleci/.gem/credentials
data/.gitignore CHANGED
@@ -5,10 +5,20 @@
5
5
  /doc/
6
6
  /pkg/
7
7
  /spec/reports/
8
- tmp/*
9
8
  Gemfile.lock
10
9
  .byebug_history
11
- /sandbox/**/*
12
10
 
13
11
  roro/**/*.env
14
- roro/**/*.key
12
+ roro/**/*.key
13
+
14
+ *.key
15
+ *.env
16
+ !/.gitignore
17
+
18
+ tmp/*
19
+ !tmp/.keep
20
+ sandbox/*
21
+ !sandbox/.keep
22
+ !sandbox/greenfield
23
+ sandbox/greenfield/*
24
+ !sandbox/greenfield/.keep
data/Guardfile CHANGED
@@ -4,24 +4,14 @@
4
4
  options = {
5
5
  cli: '-f',
6
6
  all_on_start: true,
7
- all_after_pass: false
7
+ all_after_pass: true
8
8
  }
9
9
 
10
10
  guard :minitest, options do
11
11
 
12
12
  watch(%r{^test/(.*)\/?test_(.*)\.rb$})
13
13
  watch(%r{^test/(.*)\/?(.*)_test\.rb$})
14
- watch(%r{^lib/roro/cli/(.+)\.rb$}) { |m| "test/cli/#{m[1]}_test.rb" }
15
- watch(%r{^lib/roro/cli/rollon/*.rb$}) { 'test/generators' }
16
- watch(%r{^lib/roro/cli/roro_configurator.yml$}) { 'test/cli/configuration_test.rb' }
17
- # watch(%r{^lib/roro/cli/(.+).rb$}) { 'test' }
18
- # watch(%r{^lib/roro/cli/templates/roro(.+).rb$}) do
19
- # 'test/generators/rollon/rollon_as_roro_test.rb'
20
- # end
21
-
22
-
14
+ watch(%r{^lib/roro/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" }
23
15
  watch(%r{^test/thor_helper\.rb$}) { 'test' }
24
-
25
16
  watch(%r{^test/fixtures/files/(.*/)?([^/]+)\.yml$}) { 'test' }
26
-
27
17
  end
@@ -0,0 +1,15 @@
1
+ version: '3.2'
2
+
3
+ services:
4
+
5
+ ruby_gem:
6
+ build:
7
+ context: .
8
+ dockerfile: roro/containers/ruby_image/Dockerfile
9
+ environment:
10
+ - RUBY_VERSION=${RUBY_VERSION}
11
+ volumes:
12
+ - gem_cache:/gems
13
+
14
+ volumes:
15
+ gem_cache:
@@ -1,4 +1,3 @@
1
-
2
1
  require "roro/version"
3
2
  require "thor"
4
3
  require "roro/cli"
@@ -1,15 +1,13 @@
1
- require 'thor'
2
1
  require 'roro/cli/base/base'
3
- require 'roro/cli/rollon'
4
2
  require 'roro/cli/greenfield'
5
- require 'roro/cli/generate_keys'
6
3
  require 'roro/cli/obfuscate'
7
4
  require 'roro/cli/expose'
8
- require 'roro/cli/ruby_gem'
9
5
  require 'roro/cli/generate/config/rails'
10
6
  require 'roro/cli/generate/config'
7
+ require 'roro/cli/generate/generate_keys'
11
8
  require 'roro/cli/configuration'
12
9
 
10
+ require 'roro/cli/rollon'
13
11
  module Roro
14
12
 
15
13
  class CLI < Thor
@@ -19,5 +17,73 @@ module Roro
19
17
  def self.source_root
20
18
  File.dirname(__FILE__) + '/cli/templates'
21
19
  end
20
+
21
+
22
+ desc "rollon::rails", "Generates files for and makes changes to your app
23
+ so it can run using Docker containers."
24
+ method_option :interactive, desc: "Set up your environment variables as
25
+ you go."
26
+ map "rollon::rails" => "rollon_rails"
27
+
28
+ def rollon_rails
29
+ rollon
30
+ end
31
+
32
+
33
+ desc "greenfield::rails", "Greenfield a new, dockerized rails app with
34
+ either MySQL or PostgreSQL in a separate container."
35
+
36
+ method_option :env_vars, type: :hash, default: {}, desc: "Pass a list of environment variables like so: env:var", banner: "key1:value1 key2:value2"
37
+ method_option :interactive, desc: "Set up your environment variables as you go."
38
+ method_option :force, desc: "force over-write of existing files"
39
+
40
+ map "greenfield::rails" => "greenfield_rails"
41
+
42
+ def greenfield_rails(*args)
43
+ greenfield(*args)
44
+ end
45
+ desc "generate::exposed", "Generate private .env files from
46
+ encrypted .env.enc files inside the roro directory."
47
+ map "generate::exposed" => "generate_exposed"
48
+
49
+ def generate_exposed(*args)
50
+ expose(*args)
51
+ end
52
+
53
+ desc "generate::key", "Generate a key inside roro/keys. Takes the name of
54
+ an environment as an argument to private .env files from
55
+ encrypted .env.enc files inside the roro directory.
56
+ Expose encrypted files"
57
+
58
+ map "generate::key" => "generate_key"
59
+ method_option :environment, type: :hash, default: {}, desc: "Pass a list of environment variables like so: env:var", banner: "development, staging"
60
+
61
+ def generate_key(*args)
62
+ generate_key_or_keys(*args)
63
+ end
64
+
65
+ desc "generate::keys", "Generate keys for each environment inside roro/keys.
66
+ If you have .env files like 'roro/containers/app/[staging_env].env' and
67
+ 'roro/[circle_ci_env].env' it will generate '/roro/keys/[staging_env].key'
68
+ and '/roro/keys/[circle_ci_env].key'."
69
+ map "generate::keys" => "generate_keys"
70
+
71
+ def generate_keys(*args)
72
+ generate_key(*args)
73
+ end
74
+
75
+ desc "generate::config", "Generate a config file at .roro_config.yml"
76
+ map "generate::config" => "generate_config"
77
+
78
+ def generate_config
79
+ create_file ".roro_config.yml", @config.app.to_yaml
80
+ end
81
+
82
+ desc "generate::obfuscated", "obfuscates any files matching the pattern ./roro/**/*.env"
83
+ map "generate::obfuscated" => "generate_obfuscated"
84
+
85
+ def generate_obfuscated(*args)
86
+ obfuscate(*args)
87
+ end
22
88
  end
23
89
  end
@@ -0,0 +1,99 @@
1
+ require 'thor'
2
+ require 'roro/cli/base/base'
3
+ require 'roro/cli/rollon/stories'
4
+ require 'roro/cli/rollon'
5
+ require 'roro/cli/greenfield'
6
+ require 'roro/cli/obfuscate'
7
+ require 'roro/cli/expose'
8
+ require 'roro/cli/ruby_gem'
9
+ require 'roro/cli/generate/config/rails'
10
+ require 'roro/cli/generate/config'
11
+ require 'roro/cli/generate/generate_keys'
12
+ require 'roro/cli/configuration'
13
+
14
+ module Roro
15
+
16
+ class CLI < Thor
17
+
18
+ include Thor::Actions
19
+
20
+ def self.source_root
21
+ File.dirname(__FILE__) + '/cli/templates'
22
+ end
23
+
24
+ desc "rollon::ruby_gem", "Generate files for containerized gem testing, CircleCI, and releasing to RubyGems."
25
+ method_option :rubies, type: :array, banner: "2.5.3 2.4.2"
26
+ map "rollon::ruby_gem" => "rollon_ruby_gem"
27
+
28
+ def rollon_ruby_gem(*args)
29
+ ruby_gem(*args)
30
+ end
31
+
32
+ desc "rollon::rails", "Generates files for and makes changes to your app
33
+ so it can run using Docker containers."
34
+ method_option :interactive, desc: "Set up your environment variables as
35
+ you go."
36
+ map "rollon::rails" => "rollon_rails"
37
+
38
+ def rollon_rails
39
+ rollon
40
+ end
41
+
42
+
43
+ desc "greenfield::rails", "Greenfield a new, dockerized rails app with
44
+ either MySQL or PostgreSQL in a separate container."
45
+
46
+ method_option :env_vars, type: :hash, default: {}, desc: "Pass a list of environment variables like so: env:var", banner: "key1:value1 key2:value2"
47
+ method_option :interactive, desc: "Set up your environment variables as you go."
48
+ method_option :force, desc: "force over-write of existing files"
49
+
50
+ map "greenfield::rails" => "greenfield_rails"
51
+
52
+ def greenfield_rails(*args)
53
+ greenfield(*args)
54
+ end
55
+ desc "generate::exposed", "Generate private .env files from
56
+ encrypted .env.enc files inside the roro directory."
57
+ map "generate::exposed" => "generate_exposed"
58
+
59
+ def generate_exposed(*args)
60
+ expose(*args)
61
+ end
62
+
63
+ desc "generate::key", "Generate a key inside roro/keys. Takes the name of
64
+ an environment as an argument to private .env files from
65
+ encrypted .env.enc files inside the roro directory.
66
+ Expose encrypted files"
67
+
68
+ map "generate::key" => "generate_key"
69
+ method_option :environment, type: :hash, default: {}, desc: "Pass a list of environment variables like so: env:var", banner: "development, staging"
70
+
71
+ def generate_key(*args)
72
+ generate_key_or_keys(*args)
73
+ end
74
+
75
+ desc "generate::keys", "Generate keys for each environment inside roro/keys.
76
+ If you have .env files like 'roro/containers/app/[staging_env].env' and
77
+ 'roro/[circle_ci_env].env' it will generate '/roro/keys/[staging_env].key'
78
+ and '/roro/keys/[circle_ci_env].key'."
79
+ map "generate::keys" => "generate_keys"
80
+
81
+ def generate_keys(*args)
82
+ generate_key(*args)
83
+ end
84
+
85
+ desc "generate::config", "Generate a config file at .roro_config.yml"
86
+ map "generate::config" => "generate_config"
87
+
88
+ def generate_config
89
+ create_file ".roro_config.yml", @config.app.to_yaml
90
+ end
91
+
92
+ desc "generate::obfuscated", "obfuscates any files matching the pattern ./roro/**/*.env"
93
+ map "generate::obfuscated" => "generate_obfuscated"
94
+
95
+ def generate_obfuscated(*args)
96
+ obfuscate(*args)
97
+ end
98
+ end
99
+ end
@@ -1,3 +1,4 @@
1
+ require 'yaml'
1
2
  module Roro
2
3
  class Configuration < Thor
3
4
 
@@ -1,13 +1,14 @@
1
1
  module Roro
2
2
  class CLI < Thor
3
+
4
+ no_commands do
3
5
 
4
- desc "expose", "Expose encrypted files"
5
-
6
- def expose(*args)
7
- environments = args.first ? [args.first] : gather_environments
8
- environments.each do |environment|
9
- HandsomeFencer::Crypto.expose(environment, 'docker')
6
+ def expose(*args)
7
+ environments = args.first ? [args.first] : gather_environments
8
+ environments.each do |environment|
9
+ HandsomeFencer::Crypto.expose(environment, 'roro')
10
+ end
10
11
  end
11
12
  end
12
13
  end
13
- end
14
+ end
@@ -2,12 +2,12 @@ module Roro
2
2
  class CLI < Thor
3
3
  include Thor::Actions
4
4
 
5
- desc "generate::config::roro", "Generates a config file at .roro_config.yml"
6
- map "generate::config::roro" => "generate_roro_config"
5
+ # desc "generate::config::roro", "Generate a config file at .roro_config.yml"
6
+ # map "generate::config::roro" => "generate_roro_config"
7
7
 
8
8
 
9
- def generate_roro_config
10
- create_file ".roro_config.yml", @config.app.to_yaml
11
- end
9
+ # def generate_roro_config
10
+ # create_file ".roro_config.yml", @config.app.to_yaml
11
+ # end
12
12
  end
13
13
  end
@@ -1,79 +1,47 @@
1
- # require 'openssl'
2
- # require 'base64'
3
- # require 'handsome_fencer/crypto'
4
-
5
- # module Roro
6
-
7
- # class CLI < Thor
8
-
9
- # include Thor::Actions
10
- # include HandsomeFencer::Crypto
11
-
12
- # desc "generate_keys", "Generates keys for all environments. If you have .env files like './**/production.env' and './**/staging.env' this command assumes you need keys for the production and staging environments, and will generate them for you."
13
-
14
- # def generate_keys
15
- # generate_key
16
- # end
17
-
18
- # desc "generate_key", "Generate a key for each environment"
19
- # method_option :environment, type: :hash, default: {}, desc: "Pass a list of environment variables like so: env:var", banner: "development, staging"
20
-
21
- # def generate_key(*args)
22
- # environments = args.first ? [args.first] : gather_environments
23
- # environments.each do |environment|
24
- # confirm_files_decrypted?(environment)
25
- # create_file "docker/keys/#{environment}.key", encoded_key
26
- # end
27
- # end
28
-
29
- # no_commands do
30
-
31
- # def encoded_key
32
- # @cipher = OpenSSL::Cipher.new 'AES-128-CBC'
33
- # @salt = '8 octets'
34
- # @new_key = @cipher.random_key
35
- # Base64.encode64(@new_key)
36
- # end
37
-
38
- # def gather_environments
39
- # environments = []
40
- # ['.env', '.env.enc'].each do |extension|
41
-
42
- # HandsomeFencer::Crypto.source_files('.', extension).each do |env_file|
43
- # environments << env_file.split('/').last.split(extension).last
44
- # end
45
- # end
46
- # environments.uniq
47
- # end
48
-
49
- # def confirm_files_decrypted?(environment)
50
- # orphan_encrypted = []
51
- # HandsomeFencer::Crypto.source_files('.', '.env.enc').each do |file|
52
- # orphan_encrypted << file unless File.exist? file.split('.enc').first
53
- # end
54
-
55
- # if !orphan_encrypted.empty?
56
- # raise Roro::Error.new("You have an encrypted files (.env.enc) #{orphan_encrypted} that do not have corresponding decrypted files (.env). Please decrypt or remove these encrypted files before generating a new key for #{environment}.")
57
- # end
58
- # true
59
- # end
60
- # end
61
- # end
62
-
63
- # # desc "generate keys", "Generate keys on a per-environment basis"
64
- # #
65
- # # method_option :environment, type: :string, default: {}, desc: "Pass a list of environment variables like so: env:var", banner: "development, staging"
66
- # #
67
-
68
- # # def generate_keys
69
- # # default_environments = %w[circleci development production]
70
- # # environments = args.first ? [args.first] : default_environments
71
- # # environments.each do |environment|
72
- # # @cipher = OpenSSL::Cipher.new 'AES-128-CBC'
73
- # # @salt = '8 octets'
74
- # # @new_key = @cipher.random_key
75
- # #
76
- # # create_file "docker/keys/#{environment}.key", Base64.encode64(@new_key)
77
- # # end
78
- # # end
79
- # end
1
+ module Roro
2
+
3
+ class CLI < Thor
4
+
5
+ no_commands do
6
+
7
+ def generate_key_or_keys(*args)
8
+ environments = args.first ? [args.first] : gather_environments
9
+ environments.each do |environment|
10
+
11
+ confirm_files_decrypted?(environment)
12
+ create_file "roro/keys/#{environment}.key", encoded_key
13
+ end
14
+ end
15
+
16
+ def encoded_key
17
+ @cipher = OpenSSL::Cipher.new 'AES-128-CBC'
18
+ @salt = '8 octets'
19
+ @new_key = @cipher.random_key
20
+ Base64.encode64(@new_key)
21
+ end
22
+
23
+ def gather_environments
24
+ environments = []
25
+ ['.env', '.env.enc'].each do |extension|
26
+ HandsomeFencer::Crypto.source_files('roro', extension).each do |env_file|
27
+ environments << env_file.split('/').last.split(extension).last
28
+ end
29
+ end
30
+ environments.uniq
31
+ end
32
+
33
+ def confirm_files_decrypted?(environment)
34
+ orphan_encrypted = []
35
+ HandsomeFencer::Crypto.source_files('.', '.env.enc').each do |file|
36
+ unless File.exist? file.split('.enc').first
37
+ orphan_encrypted << file
38
+ end
39
+ end
40
+ if !orphan_encrypted.empty?
41
+ raise Roro::Error.new("You have an encrypted files (.env.enc) #{orphan_encrypted} that do not have corresponding decrypted files (.env). Please decrypt or remove these encrypted files before generating a new key for #{environment}.")
42
+ end
43
+ true
44
+ end
45
+ end
46
+ end
47
+ end