From a9fc8de2d0231bc82e0a790f7d71cdfd8a50ef1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= Date: Wed, 13 Mar 2024 10:06:10 +0100 Subject: [PATCH] allow multi-line interactive secrets --- pkgs/clan-cli/clan_cli/secrets/generate.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pkgs/clan-cli/clan_cli/secrets/generate.py b/pkgs/clan-cli/clan_cli/secrets/generate.py index d87f8d99b..13721559e 100644 --- a/pkgs/clan-cli/clan_cli/secrets/generate.py +++ b/pkgs/clan-cli/clan_cli/secrets/generate.py @@ -2,6 +2,7 @@ import argparse import importlib import logging import os +import subprocess from collections.abc import Callable from pathlib import Path from tempfile import TemporaryDirectory @@ -19,6 +20,15 @@ from .modules import SecretStoreBase log = logging.getLogger(__name__) +def read_multiline_input(prompt: str = "Finish with Ctrl-D") -> str: + """ + Read multi-line input from stdin. + """ + print(prompt, flush=True) + proc = subprocess.run(["cat"], stdout=subprocess.PIPE, text=True) + return proc.stdout + + def generate_service_secrets( machine: Machine, service: str, @@ -128,7 +138,12 @@ def generate_secrets( fact_store = facts_module.FactStore(machine=machine) if prompt is None: - prompt = lambda text: input(f"{text}: ") + + def prompt_func(text: str) -> str: + print(f"{text}: ") + return read_multiline_input() + + prompt = prompt_func with TemporaryDirectory() as tmp: tmpdir = Path(tmp)