Wrapper for Mozilla's sops tool to work with encrypted configs and render them into a classic `.env` format
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

83 lines
2.3 KiB

import click
import logging
from pprint import pprint
from . import __version__
from .config import Config
from .transform import Transforms
from .vault import Vaults
from .vault import Stack as VaultStack
@click.group()
def cli():
"""
Tool for working with YAML-formatted config generation. Or something.
"""
pass
@cli.command()
@click.argument('input', type=click.File('rb'))
@click.argument('format')
@click.argument('output', type=click.File('wb'))
@click.option('-v', '--vault', 'vault', default=['sops'], required=False, multiple=True)
def transform(input, format, output, vault):
"""Transform INPUT into FORMAT format and output to OUTPUT
"""
logger = logging.getLogger("configs")
logger.info('Reading input config')
cfg = Config()
cfg.read(input)
logger.info('Initializing vaults')
vaults = []
for vault_name in vault:
logger.debug(vault_name)
vault_config = cfg.get_vault_config(vault_name)
vault_obj = Vaults[vault_name](vault_config)
vaults.append(vault_obj)
vault_stack = VaultStack(vaults)
logger.info('Initializing transform')
transform_config = cfg.get_transform_config(format)
transform = Transforms[format](transform_config)
logger.info('Transforming')
result = transform.transform(cfg, vault_stack)
print(result)
@cli.command()
@click.argument('input', type=click.File('rb'))
@click.argument('source_vault')
@click.argument('target_vault')
def provision(input, source_vault, target_vault):
"""Read INPUT and store in the vault service
"""
logger = logging.getLogger("configs")
logger.info('Reading config')
cfg = Config()
cfg.read(input)
logger.info('Initializing source vault')
source_vault_config = cfg.get_vault_config(source_vault)
source_vault = Vaults[source_vault](source_vault_config)
logger.info('Initializing target valut')
target_vault_config = cfg.get_vault_config(target_vault)
target_vault = Vaults[target_vault](target_vault_config)
logger.info('Fetching config data')
secrets = cfg.get_merged(source_vault)
logger.info('Provisioning in target vault')
target_vault.provision(secrets)
@cli.command()
def version():
"""Display the program version
"""
print(__version__)