|
| 1 | +require 'json' |
| 2 | + |
1 | 3 | # Chef Vault module
|
2 | 4 | module ChefVault
|
3 | 5 | extend self
|
4 | 6 |
|
5 | 7 | def init
|
| 8 | + options = [ "-itd #{Helpers.environment}", |
| 9 | + "--name #{Helpers.config['chef_vault']['docker_container']}", |
| 10 | + "-v `pwd`/etc_letsencrypt:/etc/letsencrypt", |
| 11 | + "-v #{Helpers.config['chef_vault']['config_dir']}:/root/.chef" |
| 12 | + ] |
| 13 | + |
| 14 | + Helpers.run_command("docker run #{options.join(' ')} #{Helpers.config['chef_vault']['docker_image']}") |
| 15 | + end |
| 16 | + |
| 17 | + def cleanup |
| 18 | + Helpers.run_command("docker rm -f #{Helpers.config['chef_vault']['docker_container']}") |
| 19 | + end |
| 20 | + |
| 21 | + # Upload all certificates to the chef server |
| 22 | + def upload(cert, props = {}) |
| 23 | + Helpers.info_log("Uploading Chef Vault for #{cert}") |
| 24 | + options = [ '--mode client' ] |
| 25 | + options << "--admins #{Helpers.config['chef_vault']['admins'].join(',')}" if Helpers.config['chef_vault'].key?('admins') |
| 26 | + options << "--clients #{props['clients'].join(',')}" if props.key?('clients') |
| 27 | + options << "--search #{props['search']}" if props.key?('search') |
| 28 | + |
| 29 | + current_item = run("vault itemtype #{Helpers.config['chef_vault']['data_bag']} #{cert}") |
| 30 | + if current_item[:return] == 0 && current_item[:stdout].include?('vault') |
| 31 | + run("vault update --clean #{options.join(' ')} #{Helpers.config['chef_vault']['data_bag']} #{cert} '#{vault_json(cert)}'") |
| 32 | + elsif current_item[:return] == 0 && !current_item[:stdout].include?('vault') |
| 33 | + { return: 1, stdout: "The DataBag item #{Helpers.config['chef_vault']['data_bag']}/#{cert} is not of type vault. Please delete the item first.", stderr: ''} |
| 34 | + elsif current_item[:return] == 100 && current_item[:stderr].include?('ERROR: The object you are looking for could not be found') |
| 35 | + run("vault create #{options.join(' ')} #{Helpers.config['chef_vault']['data_bag']} #{cert} '#{vault_json(cert)}'") |
| 36 | + else |
| 37 | + current_item |
| 38 | + end |
| 39 | + end |
| 40 | + |
| 41 | + def run(cmd) |
| 42 | + Helpers.run_command("docker exec -i #{Helpers.config['chef_vault']['docker_container']} knife #{cmd}") |
| 43 | + end |
| 44 | + |
| 45 | + def vault_json(cert) |
| 46 | + vault = {} |
| 47 | + %w(cert chain fullchain privkey).each do |file| |
| 48 | + vault[file] = File.read("etc_letsencrypt/live/#{cert}/#{file}.pem") |
| 49 | + end |
6 | 50 |
|
| 51 | + vault.to_json |
7 | 52 | end
|
8 | 53 | end
|
0 commit comments