1
1
mirror of https://gitlab.archlinux.org/archlinux/infrastructure.git synced 2025-01-18 08:06:16 +01:00
infrastructure/misc/get_key.py
2020-06-03 10:07:31 +00:00

88 lines
1.9 KiB
Python
Executable File

#!/usr/bin/python3
import json
import os
import sys
from contextlib import contextmanager
from enum import Enum
from pathlib import Path
from typing import List
import typer
import yaml
app = typer.Typer()
@contextmanager
def chdir(path):
oldcwd = os.getcwd()
os.chdir(path)
try:
yield
finally:
os.chdir(oldcwd)
root = Path(__file__).resolve().parents[1]
with chdir(root):
from ansible.cli import CLI
from ansible.constants import DEFAULT_VAULT_IDENTITY_LIST
from ansible.parsing.dataloader import DataLoader
from ansible.parsing.vault import VaultLib
data_loader = DataLoader()
data_loader.set_basedir(root)
vault_lib = VaultLib(
CLI.setup_vault_secrets(
data_loader, DEFAULT_VAULT_IDENTITY_LIST, auto_prompt=False
)
)
def load_vault(path):
with chdir(root):
return yaml.load(
vault_lib.decrypt(Path(path).read_text()), Loader=yaml.SafeLoader
)
class OutputFormat(str, Enum):
BARE = "bare"
ENV = "env"
JSON = "json"
def __str__(self):
return self.value
def main(
vault: Path = typer.Argument(...),
keys: List[str] = typer.Argument(...),
format: OutputFormat = typer.Option(
OutputFormat.BARE, show_default=True, help="Output format"
),
):
"""
Get a bunch of entries from the vault located at VAULT.
Use KEYS to choose which keys in the vault you want to output.
"""
vault = load_vault(vault)
filtered = {vault_key: vault[vault_key] for vault_key in keys}
if format == OutputFormat.BARE:
for secret in filtered.values():
print(secret)
elif format == OutputFormat.ENV:
for key, secret in filtered.items():
print(f"{key}={secret}")
elif format == OutputFormat.JSON:
json.dump(filtered, sys.stdout)
print()
if __name__ == "__main__":
typer.run(main)