roro 0.3.21 → 0.3.22
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/.gitignore +5 -3
- data/Guardfile +9 -7
- data/lib/roro.rb +9 -0
- data/lib/roro/cli.rb +8 -5
- data/lib/roro/cli/generate/generate_exposed.rb +18 -0
- data/lib/roro/cli/generate/generate_keys.rb +14 -0
- data/lib/roro/cli/generate/generate_obfuscated.rb +34 -0
- data/lib/roro/cli/generate/{story.rb → generate_story.rb} +0 -0
- data/lib/roro/crypto.rb +72 -32
- data/lib/roro/templates/base/roro/roro/keys/.keep +0 -0
- data/lib/roro/templates/rails/Dockerfile.greenfield.tt +1 -1
- data/lib/roro/templates/rails/roro/keys/.keep +0 -0
- data/lib/roro/version.rb +1 -1
- data/roro.gemspec +1 -0
- data/roro/containers/app/dotenv +1 -0
- metadata +23 -7
- data/lib/roro/cli/generate/exposed.rb +0 -14
- data/lib/roro/cli/generate/keys.rb +0 -69
- data/lib/roro/cli/generate/obfuscated.rb +0 -17
- data/roro/containers/ruby_image/ci.env.enc +0 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: d21bacda1161bc7f1cb8b57ebbca68cbe4f9647c2d02b33464c6a162f3661d31
         | 
| 4 | 
            +
              data.tar.gz: d40e7d418705dd50e38e8d5a6f337d313f8cae3fadb1a37a7114c504cd8bbb46
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: af1f1072843ad1d6919afd41398c31ae7357a9d492bb8e811a3d9da825bef9eb1def20a5577f059655b22eceac1bc387b0760f710a257412202a61f6497d8818
         | 
| 7 | 
            +
              data.tar.gz: ed48d94a0902e9123e4790b44d77249ddee40e4d122524fcfe5afe92a661ebc3903ff96cc75210e85e200eb66388033d824934b6675b976ca543aa39981ac2f5
         | 
    
        data/.gitignore
    CHANGED
    
    
    
        data/Guardfile
    CHANGED
    
    | @@ -1,15 +1,17 @@ | |
| 1 1 | 
             
            options = {
         | 
| 2 | 
            -
              all_on_start:  | 
| 3 | 
            -
              all_after_pass: false, | 
| 2 | 
            +
              all_on_start: true,
         | 
| 3 | 
            +
              all_after_pass: false,
         | 
| 4 4 | 
             
            }
         | 
| 5 5 |  | 
| 6 6 | 
             
            guard :minitest, options do
         | 
| 7 7 |  | 
| 8 8 | 
             
              watch(%r{^test/(.*)\/?(.*)_test\.rb$})
         | 
| 9 | 
            -
              watch(%r{^test/helpers/(.*)\.rb$})          { 'test' }
         | 
| 10 | 
            -
              watch(%r{^test/test_helper\.rb$})           { 'test' }
         | 
| 9 | 
            +
              # watch(%r{^test/helpers/(.*)\.rb$})          { 'test' }
         | 
| 10 | 
            +
              # watch(%r{^test/test_helper\.rb$})           { 'test' }
         | 
| 11 11 | 
             
              watch(%r{^lib/roro/(.+)\.rb$})              { |m| "test/#{m[1]}_test.rb" }
         | 
| 12 | 
            -
              watch(%r{^lib/roro/ | 
| 13 | 
            -
              watch(%r{^lib/ | 
| 14 | 
            -
              watch(%r{^lib/roro/cli/(.+)\. | 
| 12 | 
            +
              # watch(%r{^lib/roro/(.+)\.rb$})              { "test/crypto_test.rb" }
         | 
| 13 | 
            +
              # watch(%r{^lib/(.+)\.rb$})              { |m| "test/#{m[1]}_test.rb" }
         | 
| 14 | 
            +
              # watch(%r{^lib/roro/cli/(.+)\.rb$})          { |m| "test/cli/#{m[1]}_test.rb" }
         | 
| 15 | 
            +
              # watch(%r{^lib/roro/cli/(.+)\.yml$})         { |m| "test/cli" }
         | 
| 16 | 
            +
              # watch(%r{^lib/roro/cli/(.+)\.tt$})          { |m| "test/cli" }
         | 
| 15 17 | 
             
            end
         | 
    
        data/lib/roro.rb
    CHANGED
    
    | @@ -5,5 +5,14 @@ require "roro/configurator" | |
| 5 5 | 
             
            require "roro/crypto"
         | 
| 6 6 |  | 
| 7 7 | 
             
            module Roro
         | 
| 8 | 
            +
              module Crypto 
         | 
| 9 | 
            +
                class KeyError < StandardError; end
         | 
| 10 | 
            +
                class EnvironmentError < StandardError; end
         | 
| 11 | 
            +
                class DataDestructionError < StandardError; end
         | 
| 12 | 
            +
                class EncryptableError < StandardError; end
         | 
| 13 | 
            +
                class DecryptableError < StandardError; end
         | 
| 14 | 
            +
              end 
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              
         | 
| 8 17 | 
             
              class Error < StandardError; end
         | 
| 9 18 | 
             
            end
         | 
    
        data/lib/roro/cli.rb
    CHANGED
    
    | @@ -1,14 +1,13 @@ | |
| 1 1 |  | 
| 2 | 
            -
            require 'roro/cli/generate/ | 
| 3 | 
            -
            require 'roro/cli/generate/ | 
| 4 | 
            -
            require 'roro/cli/generate/ | 
| 5 | 
            -
            require 'roro/cli/generate/ | 
| 2 | 
            +
            require 'roro/cli/generate/generate_exposed'
         | 
| 3 | 
            +
            require 'roro/cli/generate/generate_keys'
         | 
| 4 | 
            +
            require 'roro/cli/generate/generate_obfuscated'
         | 
| 5 | 
            +
            require 'roro/cli/generate/generate_story'
         | 
| 6 6 | 
             
            require 'roro/cli/greenfield/rails'
         | 
| 7 7 | 
             
            require 'roro/cli/rollon'
         | 
| 8 8 | 
             
            require 'roro/cli/rollon/rails/base/base'
         | 
| 9 9 | 
             
            require 'roro/cli/rollon/rails/database/with_mysql'
         | 
| 10 10 | 
             
            require 'roro/cli/rollon/rails/database/with_postgresql'
         | 
| 11 | 
            -
             | 
| 12 11 | 
             
            require 'roro/cli/rollon/ruby_gem'
         | 
| 13 12 |  | 
| 14 13 | 
             
            module Roro
         | 
| @@ -24,6 +23,10 @@ module Roro | |
| 24 23 | 
             
                  File.dirname(__FILE__) + '/stories'
         | 
| 25 24 | 
             
                end
         | 
| 26 25 |  | 
| 26 | 
            +
                def self.test_fixture_root 
         | 
| 27 | 
            +
                  File.dirname(__FILE__) + '/test/fixtures'
         | 
| 28 | 
            +
                end 
         | 
| 29 | 
            +
                
         | 
| 27 30 | 
             
                def self.roro_environments 
         | 
| 28 31 | 
             
                  %w(development production test staging ci)
         | 
| 29 32 | 
             
                end
         | 
| @@ -0,0 +1,18 @@ | |
| 1 | 
            +
            module Roro
         | 
| 2 | 
            +
              class CLI < Thor
         | 
| 3 | 
            +
                
         | 
| 4 | 
            +
                desc "generate::exposed", "Decrypts .env.enc files for all environments or those specified."
         | 
| 5 | 
            +
                map "generate::exposed" => "generate_exposed"
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                
         | 
| 8 | 
            +
                def generate_exposed(*environments)
         | 
| 9 | 
            +
                  Roro::Crypto.expose(environments, './roro', '.env.enc')
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
                # def generate_exposed(*args) 
         | 
| 12 | 
            +
                #   environments = args.first ? [args.first] : gather_environments
         | 
| 13 | 
            +
                #   environments.each do |environment|
         | 
| 14 | 
            +
                #     Roro::Crypto.expose(environment, 'roro')
         | 
| 15 | 
            +
                #   end
         | 
| 16 | 
            +
                # end
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
            end
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            module Roro
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              class CLI < Thor
         | 
| 4 | 
            +
                map "generate::key" => "generate_keys"
         | 
| 5 | 
            +
                method_option :environment, type: :hash, default: {}, desc: "Generates a key for each argument.", banner: "development, staging"
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                desc "generate::keys", "Generates a key for each <environment>.env file."
         | 
| 8 | 
            +
                map "generate::keys" => "generate_keys"
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def generate_keys(*environments)
         | 
| 11 | 
            +
                  Roro::Crypto.generate_keys(environments, './roro', '.env')
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
            end
         | 
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            require 'roro/crypto'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Roro
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              class CLI < Thor
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                desc "generate::obfuscated", "Encrypts .env files for safe storage."
         | 
| 8 | 
            +
                map "generate::obfuscated" => "generate_obfuscated"
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def generate_obfuscated(*environments)
         | 
| 11 | 
            +
                  Roro::Crypto.obfuscate(environments, './roro', '.env')
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                no_commands do
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  def check_for_obfuscatable(environments)
         | 
| 17 | 
            +
                    if environments.empty?
         | 
| 18 | 
            +
                      msg = "No .env files matching the
         | 
| 19 | 
            +
                      pattern roro/**/*.env'. Please create one."
         | 
| 20 | 
            +
                      raise Roro::Error.new(msg)
         | 
| 21 | 
            +
                    end
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  def check_for_keys(environments)
         | 
| 25 | 
            +
                    environments.each do |e|
         | 
| 26 | 
            +
                      unless File.exist?("roro/keys/#{e}.key")
         | 
| 27 | 
            +
                        msg = "No #{e} key file at roro/keys/{e}.key. Please generate one."
         | 
| 28 | 
            +
                        raise Roro::Error.new(msg)
         | 
| 29 | 
            +
                      end
         | 
| 30 | 
            +
                    end
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
| 
            File without changes
         | 
    
        data/lib/roro/crypto.rb
    CHANGED
    
    | @@ -11,63 +11,103 @@ module Roro::Crypto | |
| 11 11 | 
             
                  Base64.encode64(@new_key)
         | 
| 12 12 | 
             
                end
         | 
| 13 13 |  | 
| 14 | 
            -
                def  | 
| 15 | 
            -
                   | 
| 14 | 
            +
                def source_files(dir, pattern)
         | 
| 15 | 
            +
                  Dir.glob(dir + "/**/*#{pattern}")
         | 
| 16 16 | 
             
                end
         | 
| 17 17 |  | 
| 18 | 
            -
                def  | 
| 19 | 
            -
                   | 
| 18 | 
            +
                def gather_environments(dir, ext)
         | 
| 19 | 
            +
                  environments = []
         | 
| 20 | 
            +
                  source_files(dir, ext).each do |source_file|
         | 
| 21 | 
            +
                    environments << source_file.split('/').last.split('.').first
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
                  if environments.empty? 
         | 
| 24 | 
            +
                    raise EnvironmentError, "No files in the #{dir} directory matching #{ext}"
         | 
| 25 | 
            +
                  else 
         | 
| 26 | 
            +
                    environments.uniq
         | 
| 27 | 
            +
                  end
         | 
| 20 28 | 
             
                end
         | 
| 21 29 |  | 
| 22 | 
            -
                def  | 
| 23 | 
            -
                   | 
| 30 | 
            +
                def generate_keys(keys, dir, ext)
         | 
| 31 | 
            +
                  (keys.empty? ? gather_environments(dir, ext) : keys).each do |key|
         | 
| 32 | 
            +
                    write_to_file generate_key, "#{dir}/keys/#{key}.key"
         | 
| 33 | 
            +
                  end
         | 
| 24 34 | 
             
                end
         | 
| 25 35 |  | 
| 26 | 
            -
                def  | 
| 27 | 
            -
                   | 
| 28 | 
            -
             | 
| 29 | 
            -
                   | 
| 30 | 
            -
                   | 
| 36 | 
            +
                def expose(environments, dir, ext)
         | 
| 37 | 
            +
                  if environments.empty? 
         | 
| 38 | 
            +
                    environments = gather_environments('./roro/keys', '.key')
         | 
| 39 | 
            +
                  end 
         | 
| 40 | 
            +
                  environments.each do |environment| 
         | 
| 41 | 
            +
                    pattern = "#{environment}*#{ext}" 
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                    exposable = source_files(dir, pattern)
         | 
| 44 | 
            +
                    if exposable.empty?
         | 
| 45 | 
            +
                      puts "No #{environment} files in ./roro matching #{pattern}"
         | 
| 46 | 
            +
                    end
         | 
| 47 | 
            +
                    source_files(dir, pattern).each do |file|
         | 
| 48 | 
            +
                      decrypt(file, environment)
         | 
| 49 | 
            +
                    end
         | 
| 50 | 
            +
                  end
         | 
| 31 51 | 
             
                end
         | 
| 32 52 |  | 
| 33 | 
            -
                def  | 
| 34 | 
            -
                   | 
| 35 | 
            -
                   | 
| 53 | 
            +
                def obfuscate(envs, dir, ext)
         | 
| 54 | 
            +
                  environments = envs.empty? ? gather_environments(dir, ext) : envs
         | 
| 55 | 
            +
                  environments.each do |environment|
         | 
| 56 | 
            +
                    pattern = "#{environment}*#{ext}" 
         | 
| 57 | 
            +
                    get_key(environment)
         | 
| 58 | 
            +
                    encryptable_files = source_files(dir, pattern)
         | 
| 59 | 
            +
                    if encryptable_files.empty?
         | 
| 60 | 
            +
                      puts "No #{environment} files in ./roro matching #{pattern}"
         | 
| 61 | 
            +
                    end 
         | 
| 62 | 
            +
                    encryptable_files.each do |file|
         | 
| 63 | 
            +
                      encrypt(file, environment)
         | 
| 64 | 
            +
                    end
         | 
| 65 | 
            +
                  end 
         | 
| 66 | 
            +
                end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                def write_to_file(data, filename)
         | 
| 69 | 
            +
                  if File.exist?(filename)
         | 
| 70 | 
            +
                    raise DataDestructionError, "Existing file at #{filename}. Please remove it and try again."
         | 
| 71 | 
            +
                  else
         | 
| 72 | 
            +
                    File.open(filename, "w") { |io| io.write data }
         | 
| 73 | 
            +
                  end
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                
         | 
| 77 | 
            +
                def encrypt(file, key)
         | 
| 78 | 
            +
                  build_cipher(key)
         | 
| 36 79 | 
             
                  encrypted = @cipher.update(File.read file) + @cipher.final
         | 
| 37 80 | 
             
                  write_to_file(Base64.encode64(encrypted), file + '.enc')
         | 
| 38 81 | 
             
                end
         | 
| 39 | 
            -
             | 
| 40 | 
            -
                def decrypt(file,  | 
| 41 | 
            -
                   | 
| 42 | 
            -
                  build_cipher(environment)
         | 
| 82 | 
            +
                
         | 
| 83 | 
            +
                def decrypt(file, key)
         | 
| 84 | 
            +
                  build_cipher(key)
         | 
| 43 85 | 
             
                  encrypted = Base64.decode64 File.read(file)
         | 
| 44 86 | 
             
                  @cipher.decrypt.pkcs5_keyivgen @pass_phrase, @salt
         | 
| 45 87 | 
             
                  decrypted = @cipher.update(encrypted) + @cipher.final
         | 
| 46 88 | 
             
                  decrypted_file = file.split('.enc').first
         | 
| 47 89 | 
             
                  write_to_file decrypted, decrypted_file
         | 
| 48 90 | 
             
                end
         | 
| 49 | 
            -
             | 
| 50 | 
            -
                def  | 
| 51 | 
            -
                  ext = ext || "#{env}.env"
         | 
| 52 | 
            -
                  source_files(dir, ext).each { |file| encrypt(file, env) }
         | 
| 53 | 
            -
                end
         | 
| 54 | 
            -
             | 
| 55 | 
            -
                def expose(env=nil, dir=nil, ext=nil)
         | 
| 56 | 
            -
                  ext = ext || "#{env}.env.enc"
         | 
| 57 | 
            -
                  source_files(dir, ext).each { |file| decrypt(file, env) }
         | 
| 58 | 
            -
                end
         | 
| 59 | 
            -
             | 
| 60 | 
            -
                def get_key(environment, directory=nil)
         | 
| 91 | 
            +
                
         | 
| 92 | 
            +
                def get_key(environment, dir='roro')
         | 
| 61 93 | 
             
                  env_key = environment.upcase + '_KEY'
         | 
| 62 | 
            -
                  key_file =  | 
| 94 | 
            +
                  key_file = Dir.glob("roro/keys/#{environment}.key").first
         | 
| 63 95 | 
             
                  case
         | 
| 64 96 | 
             
                  when ENV[env_key].nil? && key_file.nil?
         | 
| 65 | 
            -
                    raise  | 
| 97 | 
            +
                    raise KeyError, "No #{env_key} set. Please set one as a variable or in a file."
         | 
| 66 98 | 
             
                  when ENV[env_key]
         | 
| 67 99 | 
             
                    ENV[env_key]
         | 
| 68 100 | 
             
                  when File.exist?(key_file)
         | 
| 69 101 | 
             
                    File.read(key_file).strip
         | 
| 70 102 | 
             
                  end
         | 
| 71 103 | 
             
                end
         | 
| 104 | 
            +
                
         | 
| 105 | 
            +
                private 
         | 
| 106 | 
            +
                def build_cipher(environment)
         | 
| 107 | 
            +
                  @cipher = OpenSSL::Cipher.new 'AES-128-CBC'
         | 
| 108 | 
            +
                  @salt = '8 octets'
         | 
| 109 | 
            +
                  @pass_phrase = get_key(environment)
         | 
| 110 | 
            +
                  @cipher.encrypt.pkcs5_keyivgen @pass_phrase, @salt
         | 
| 111 | 
            +
                end
         | 
| 72 112 | 
             
              end
         | 
| 73 113 | 
             
            end
         | 
| 
            File without changes
         | 
| @@ -28,7 +28,7 @@ RUN gem install bundler:2.1.4 | |
| 28 28 | 
             
            WORKDIR ${APP_HOME}
         | 
| 29 29 |  | 
| 30 30 | 
             
            ## Create a Gemfile with just the Rails gem inside:
         | 
| 31 | 
            -
            RUN echo -e "source 'https://rubygems.org'\ngem 'rails'" > Gemfile
         | 
| 31 | 
            +
            RUN echo -e "source 'https://rubygems.org'\ngem 'rails', '6.1.3.1'" > Gemfile
         | 
| 32 32 |  | 
| 33 33 | 
             
            ## Bundle to install rails:
         | 
| 34 34 | 
             
            RUN bundle install
         | 
| 
            File without changes
         | 
    
        data/lib/roro/version.rb
    CHANGED
    
    
    
        data/roro.gemspec
    CHANGED
    
    | @@ -35,6 +35,7 @@ Gem::Specification.new do |spec| | |
| 35 35 | 
             
              spec.add_development_dependency 'bundler', '~> 2.1', '>= 2.1.4'
         | 
| 36 36 | 
             
              spec.add_development_dependency 'byebug', '~> 11.1', '>= 11.1.3'
         | 
| 37 37 | 
             
              spec.add_development_dependency 'handsome_fencer-test', '~> 0.2.2'
         | 
| 38 | 
            +
              spec.add_development_dependency 'minitest-focus'
         | 
| 38 39 | 
             
              spec.add_development_dependency 'readline'
         | 
| 39 40 | 
             
              spec.add_development_dependency 'mocha', '~> 1.11', '>= 1.11.2'
         | 
| 40 41 |  | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            RORO_ENV=development
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: roro
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.3. | 
| 4 | 
            +
              version: 0.3.22
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - schadenfred
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2021- | 
| 11 | 
            +
            date: 2021-05-05 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: gem-release
         | 
| @@ -132,6 +132,20 @@ dependencies: | |
| 132 132 | 
             
                - - "~>"
         | 
| 133 133 | 
             
                  - !ruby/object:Gem::Version
         | 
| 134 134 | 
             
                    version: 0.2.2
         | 
| 135 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 136 | 
            +
              name: minitest-focus
         | 
| 137 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 138 | 
            +
                requirements:
         | 
| 139 | 
            +
                - - ">="
         | 
| 140 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 141 | 
            +
                    version: '0'
         | 
| 142 | 
            +
              type: :development
         | 
| 143 | 
            +
              prerelease: false
         | 
| 144 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 145 | 
            +
                requirements:
         | 
| 146 | 
            +
                - - ">="
         | 
| 147 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 148 | 
            +
                    version: '0'
         | 
| 135 149 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 136 150 | 
             
              name: readline
         | 
| 137 151 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -194,11 +208,11 @@ files: | |
| 194 208 | 
             
            - docker-compose.yml
         | 
| 195 209 | 
             
            - lib/roro.rb
         | 
| 196 210 | 
             
            - lib/roro/cli.rb
         | 
| 197 | 
            -
            - lib/roro/cli/generate/exposed.rb
         | 
| 198 211 | 
             
            - lib/roro/cli/generate/generate.rb
         | 
| 199 | 
            -
            - lib/roro/cli/generate/ | 
| 200 | 
            -
            - lib/roro/cli/generate/ | 
| 201 | 
            -
            - lib/roro/cli/generate/ | 
| 212 | 
            +
            - lib/roro/cli/generate/generate_exposed.rb
         | 
| 213 | 
            +
            - lib/roro/cli/generate/generate_keys.rb
         | 
| 214 | 
            +
            - lib/roro/cli/generate/generate_obfuscated.rb
         | 
| 215 | 
            +
            - lib/roro/cli/generate/generate_story.rb
         | 
| 202 216 | 
             
            - lib/roro/cli/greenfield/rails.rb
         | 
| 203 217 | 
             
            - lib/roro/cli/rollon.rb
         | 
| 204 218 | 
             
            - lib/roro/cli/rollon/rails/base/base.rb
         | 
| @@ -253,6 +267,7 @@ files: | |
| 253 267 | 
             
            - lib/roro/templates/base/roro/roro/containers/app/.keep
         | 
| 254 268 | 
             
            - lib/roro/templates/base/roro/roro/containers/frontend/.keep
         | 
| 255 269 | 
             
            - lib/roro/templates/base/roro/roro/docker-entrypoint.sh.tt
         | 
| 270 | 
            +
            - lib/roro/templates/base/roro/roro/keys/.keep
         | 
| 256 271 | 
             
            - lib/roro/templates/rails/.circleci/.keep
         | 
| 257 272 | 
             
            - lib/roro/templates/rails/.circleci/config.yml.tt
         | 
| 258 273 | 
             
            - lib/roro/templates/rails/.circleci/jobs/_build.yml
         | 
| @@ -279,6 +294,7 @@ files: | |
| 279 294 | 
             
            - lib/roro/templates/rails/roro/containers/app/Dockerfile.tt
         | 
| 280 295 | 
             
            - lib/roro/templates/rails/roro/containers/frontend/.keep
         | 
| 281 296 | 
             
            - lib/roro/templates/rails/roro/docker-entrypoint.sh
         | 
| 297 | 
            +
            - lib/roro/templates/rails/roro/keys/.keep
         | 
| 282 298 | 
             
            - lib/roro/templates/rails/roro/kube/.keep
         | 
| 283 299 | 
             
            - lib/roro/templates/rails/roro/kube/certificate.yml.tt
         | 
| 284 300 | 
             
            - lib/roro/templates/rails/roro/kube/cluster-issuer.yml.tt
         | 
| @@ -310,8 +326,8 @@ files: | |
| 310 326 | 
             
            - roro.gemspec
         | 
| 311 327 | 
             
            - roro/containers/.keep
         | 
| 312 328 | 
             
            - roro/containers/app/Dockerfile
         | 
| 329 | 
            +
            - roro/containers/app/dotenv
         | 
| 313 330 | 
             
            - roro/containers/ruby_image/Dockerfile
         | 
| 314 | 
            -
            - roro/containers/ruby_image/ci.env.enc
         | 
| 315 331 | 
             
            - roro/keys/.keep
         | 
| 316 332 | 
             
            - sandbox/.keep
         | 
| 317 333 | 
             
            - tmp/.keep
         | 
| @@ -1,14 +0,0 @@ | |
| 1 | 
            -
            module Roro
         | 
| 2 | 
            -
              class CLI < Thor
         | 
| 3 | 
            -
                
         | 
| 4 | 
            -
                desc "generate::exposed", "Generate private .env files from encrypted .env.enc files inside the roro directory."
         | 
| 5 | 
            -
                map "generate::exposed" => "generate_exposed"
         | 
| 6 | 
            -
                
         | 
| 7 | 
            -
                def generate_exposed(*args) 
         | 
| 8 | 
            -
                  environments = args.first ? [args.first] : gather_environments
         | 
| 9 | 
            -
                  environments.each do |environment|
         | 
| 10 | 
            -
                    Roro::Crypto.expose(environment, 'roro')
         | 
| 11 | 
            -
                  end
         | 
| 12 | 
            -
                end
         | 
| 13 | 
            -
              end
         | 
| 14 | 
            -
            end
         | 
| @@ -1,69 +0,0 @@ | |
| 1 | 
            -
            module Roro
         | 
| 2 | 
            -
             | 
| 3 | 
            -
              class CLI < Thor
         | 
| 4 | 
            -
                
         | 
| 5 | 
            -
                desc "generate::key", "Generate a key inside roro/keys. Takes the name of 
         | 
| 6 | 
            -
                  an environment as an argument to private .env files from 
         | 
| 7 | 
            -
                encrypted .env.enc files inside the roro directory.
         | 
| 8 | 
            -
                Expose encrypted files"
         | 
| 9 | 
            -
                
         | 
| 10 | 
            -
                map "generate::key" => "generate_key"
         | 
| 11 | 
            -
                method_option :environment, type: :hash, default: {}, desc: "Pass a list of environment variables like so: env:var", banner: "development, staging"
         | 
| 12 | 
            -
                
         | 
| 13 | 
            -
                def generate_key(*args)
         | 
| 14 | 
            -
                  generate_key_or_keys(*args)
         | 
| 15 | 
            -
                end
         | 
| 16 | 
            -
             | 
| 17 | 
            -
                desc "generate::keys", "Generate keys for each environment inside roro/keys.
         | 
| 18 | 
            -
                  If you have .env files like 'roro/containers/app/[staging_env].env' and 
         | 
| 19 | 
            -
                  'roro/[circle_ci_env].env' it will generate '/roro/keys/[staging_env].key'
         | 
| 20 | 
            -
                  and '/roro/keys/[circle_ci_env].key'."
         | 
| 21 | 
            -
                map "generate::keys" => "generate_keys"
         | 
| 22 | 
            -
             | 
| 23 | 
            -
                def generate_keys(*args)
         | 
| 24 | 
            -
                  generate_key(*args)
         | 
| 25 | 
            -
                end
         | 
| 26 | 
            -
                
         | 
| 27 | 
            -
                no_commands do
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                  def generate_key_or_keys(*args)
         | 
| 30 | 
            -
                    environments = args.first ? [args.first] : gather_environments
         | 
| 31 | 
            -
                    environments.each do |environment|
         | 
| 32 | 
            -
                      
         | 
| 33 | 
            -
                      confirm_files_decrypted?(environment)
         | 
| 34 | 
            -
                      create_file "roro/keys/#{environment}.key", encoded_key
         | 
| 35 | 
            -
                    end
         | 
| 36 | 
            -
                  end
         | 
| 37 | 
            -
             | 
| 38 | 
            -
                  def encoded_key
         | 
| 39 | 
            -
                    @cipher = OpenSSL::Cipher.new 'AES-128-CBC'
         | 
| 40 | 
            -
                    @salt = '8 octets'
         | 
| 41 | 
            -
                    @new_key = @cipher.random_key
         | 
| 42 | 
            -
                    Base64.encode64(@new_key)
         | 
| 43 | 
            -
                  end
         | 
| 44 | 
            -
             | 
| 45 | 
            -
                  def gather_environments
         | 
| 46 | 
            -
                    environments = []
         | 
| 47 | 
            -
                    ['.env', '.env.enc'].each do |extension|
         | 
| 48 | 
            -
                      Roro::Crypto.source_files('roro', extension).each do |env_file|
         | 
| 49 | 
            -
                        environments << env_file.split('/').last.split(extension).last
         | 
| 50 | 
            -
                      end
         | 
| 51 | 
            -
                    end
         | 
| 52 | 
            -
                    environments.uniq
         | 
| 53 | 
            -
                  end
         | 
| 54 | 
            -
             | 
| 55 | 
            -
                  def confirm_files_decrypted?(environment)
         | 
| 56 | 
            -
                    orphan_encrypted = []
         | 
| 57 | 
            -
                    Roro::Crypto.source_files('.', '.env.enc').each do |file|
         | 
| 58 | 
            -
                      unless File.exist? file.split('.enc').first
         | 
| 59 | 
            -
                        orphan_encrypted << file 
         | 
| 60 | 
            -
                      end
         | 
| 61 | 
            -
                    end
         | 
| 62 | 
            -
                    if !orphan_encrypted.empty?
         | 
| 63 | 
            -
                      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}.")
         | 
| 64 | 
            -
                    end
         | 
| 65 | 
            -
                    true
         | 
| 66 | 
            -
                  end
         | 
| 67 | 
            -
                end
         | 
| 68 | 
            -
              end
         | 
| 69 | 
            -
            end
         | 
| @@ -1,17 +0,0 @@ | |
| 1 | 
            -
            require 'roro/crypto'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module Roro
         | 
| 4 | 
            -
             | 
| 5 | 
            -
              class CLI < Thor
         | 
| 6 | 
            -
             | 
| 7 | 
            -
                desc "generate::obfuscated", "obfuscates any files matching the pattern ./roro/**/*.env"
         | 
| 8 | 
            -
                map "generate::obfuscated" => "generate_obfuscated"
         | 
| 9 | 
            -
             | 
| 10 | 
            -
                def generate_obfuscated(*args)
         | 
| 11 | 
            -
                  environments = args.first ? [args.first] : gather_environments
         | 
| 12 | 
            -
                  environments.each do |environment|
         | 
| 13 | 
            -
                    Roro::Crypto.obfuscate(environment, 'roro')
         | 
| 14 | 
            -
                  end
         | 
| 15 | 
            -
                end
         | 
| 16 | 
            -
              end
         | 
| 17 | 
            -
            end
         |