Compare commits

...

2 Commits

Author SHA1 Message Date
Luke Murphy 9520868cc3
Add first stab at decrypt command
continuous-integration/drone/push Build is passing Details
2020-04-13 17:40:07 +02:00
Luke Murphy 3aebb211cf
Fix typo
continuous-integration/drone/push Build is passing Details
2020-04-12 15:52:05 +02:00
2 changed files with 76 additions and 19 deletions

View File

@ -1,3 +1,12 @@
Autonomic 0.0.5 (2020-04-13)
============================
Features
--------
- Add CoopHost decrypt command. (#5)
Autonomic 0.0.4 (2020-04-12) Autonomic 0.0.4 (2020-04-12)
============================ ============================

View File

@ -3,6 +3,7 @@
from os import chdir, mkdir from os import chdir, mkdir
from os.path import basename, exists from os.path import basename, exists
from pathlib import Path from pathlib import Path
from socket import gethostname
import click import click
@ -12,6 +13,7 @@ from autonomic.settings import add, get
from autonomic.utils import ( from autonomic.utils import (
ensure_config_dir, ensure_config_dir,
ensure_deploy_d_dir, ensure_deploy_d_dir,
exit,
input_ask, input_ask,
pass_ask, pass_ask,
question_ask, question_ask,
@ -20,40 +22,86 @@ from autonomic.utils import (
yaml_load, yaml_load,
) )
hostname = gethostname()
@click.command() @click.command()
@click.pass_context @click.pass_context
def coophost(ctx): def coophost(ctx):
"""Manage CoopHost resources.""" """Manage CoopHost resources."""
ensure_config_dir() ensure_config_dir()
choices = ["encrypt"]
operation = question_ask("operation", "Which operation?", choices)
if operation == "encrypt":
encrypt()
def encrypt():
"""Encrypt a secret for a CoopHost package."""
ensure_deploy_d_dir() ensure_deploy_d_dir()
app_dir = Path(".").absolute() app_dir = Path(".").absolute()
app = basename(app_dir)
app = basename(Path(".").absolute())
log.info("Auto-detected the {} application".format(app)) log.info("Auto-detected the {} application".format(app))
choices = ["encrypt", "decrypt"]
operation = question_ask("operation", "Which operation?", choices)
if operation == "encrypt":
encrypt(app, app_dir)
elif operation == "decrypt":
decrypt(app, app_dir)
def get_vault_pass(app):
"""Retrieve or set the app vault password."""
app_settings = get(app) app_settings = get(app)
if app_settings is not None and "vault-password" in app_settings: if app_settings is not None and "vault-password" in app_settings:
log.info("Using app vault password stored in {}".format(CONFIG_YAML)) log.info("Using app vault password stored in {}".format(CONFIG_YAML))
vault_password = app_settings["vault-password"] return app_settings["vault-password"]
else:
log.info("No app vault password configured")
vault_password = pass_ask("Vault password?")
log.info("App vault password stored in {}".format(CONFIG_YAML)) log.info("No app vault password configured")
add({app: {"vault-password": vault_password}}) vault_password = pass_ask("Vault password?")
log.info("App vault password stored in {}".format(CONFIG_YAML))
add({app: {"vault-password": vault_password}})
return vault_password
def decrypt(app, app_dir):
"""Decrypt a secret."""
vault_password = get_vault_pass(app)
name = input_ask("Which variable do you want to decrypt?")
vault_path = (Path(".") / "deploy.d" / "vault").absolute()
var_path = (vault_path / "{}.yml".format(name)).absolute()
if not exists(var_path):
exit("{}.yml is missing?".format(name))
cmd = [
".venv/bin/ansible",
hostname,
"--inventory",
"{},".format(hostname),
"-m",
"debug",
"-a",
"var='{}'".format(name),
"-e @{}".format(var_path),
"--ask-vault-pass",
"-e",
"ansible_user={}".format(get("username")),
]
decrypted = run(
cmd,
cwd=INFRA_DIR,
output=True,
pexpect=True,
pexpected={"(?i)vault password:": vault_password},
)
log.info(decrypted)
def encrypt(app, app_dir):
"""Encrypt a secret for a CoopHost package."""
vault_password = get_vault_pass(app)
name = input_ask("Which variable do you want to encrypt?") name = input_ask("Which variable do you want to encrypt?")
value = pass_ask("Variable value to encrypt?") value = pass_ask("Variable value to encrypt?")
@ -74,7 +122,7 @@ def encrypt():
) )
chdir(app_dir) chdir(app_dir)
log.info("Changed directory back to to {}".format(app_dir)) log.info("Changed directory back to {}".format(app_dir))
vault_path = (Path(".") / "deploy.d" / "vault").absolute() vault_path = (Path(".") / "deploy.d" / "vault").absolute()
if not exists(vault_path): if not exists(vault_path):