Open kurmann opened 1 month ago
Ich entscheide mich für TOML mit Python. Ich verwende Typer für die Erstellung eines CLIs.
Ich möchte gerne, dass Config-Werte bei jeder CLI-Methode aus der TOML-Datei gelesen werden (sofern der Parameter oder das Argument vorhanden sind), ausser sie werden direkt in der CLI mitgegeben (diese haben Vorrang).
In seltenen Fällen müssen sensitive Daten wie SFTP-Zugänge aus den Configs gelesen werden. Diese können natürlich nicht in der CLI mitgegeben werden als Parameter, aus Sicherheitsgründen. Hier würde die CLI GitHub Secrets verwenden und melden wenn keine Config-Daten über GitHub Secrets gefunden wurden.
Beachte, dass meine Anwendung selbst lokal auf MacOS läuft und die GitHub-Secrets dann Remote bezogen werden müssten.
Lieber Nutzer,
gerne helfe ich Ihnen bei der Umsetzung Ihrer Anforderungen.
Übersicht Ihrer Anforderungen:
Erstellen Sie eine config.toml
-Datei in Ihrem Projektverzeichnis mit Ihren Konfigurationswerten.
Beispiel config.toml
:
[general]
setting1 = "wert1"
setting2 = "wert2"
[sftp]
host = "example.com"
username = "benutzername"
# Passwort wird hier nicht gespeichert
Hinweis: Speichern Sie keine sensiblen Daten wie Passwörter in Klartext in der Konfigurationsdatei.
Installieren Sie die benötigten Python-Pakete:
pip install typer toml requests
main.py
:
import typer
import toml
import os
import requests
app = typer.Typer()
config_file = 'config.toml'
def load_config():
if os.path.exists(config_file):
return toml.load(config_file)
else:
return {}
def fetch_github_secret(secret_name, github_token, repo_owner, repo_name):
url = f"https://api.github.com/repos/{repo_owner}/{repo_name}/actions/secrets/{secret_name}"
headers = {
'Authorization': f'token {github_token}',
'Accept': 'application/vnd.github.v3+json',
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
# GitHub gibt den Secret-Wert nicht direkt zurück aus Sicherheitsgründen
typer.echo(f"Secret {secret_name} gefunden, aber der Wert kann nicht abgerufen werden.")
else:
typer.echo(f"Secret {secret_name} nicht gefunden.")
return None
@app.command()
def main(
param1: str = typer.Option(None, help="Beschreibung von param1"),
param2: str = typer.Option(None, help="Beschreibung von param2"),
):
# Laden der Konfiguration
config = load_config()
# Werte aus der Config laden, falls nicht über CLI angegeben
param1 = param1 or config.get('general', {}).get('setting1')
param2 = param2 or config.get('general', {}).get('setting2')
# Verarbeitung der sensiblen Daten
sftp_config = config.get('sftp', {})
sftp_host = sftp_config.get('host')
sftp_username = sftp_config.get('username')
sftp_password = None # Passwort wird nicht aus der Config geladen
# Versuch, das Passwort aus Umgebungsvariablen zu laden
sftp_password = os.getenv('SFTP_PASSWORD')
if not sftp_password:
typer.echo("SFTP-Passwort nicht gefunden. Versuche, GitHub Secrets abzurufen...")
# GitHub Token und Repository-Informationen aus Umgebungsvariablen
github_token = os.getenv('GITHUB_TOKEN')
repo_owner = os.getenv('GITHUB_REPO_OWNER')
repo_name = os.getenv('GITHUB_REPO_NAME')
if github_token and repo_owner and repo_name:
fetch_github_secret('SFTP_PASSWORD', github_token, repo_owner, repo_name)
typer.echo("Hinweis: GitHub erlaubt es nicht, Secret-Werte direkt abzurufen.")
typer.echo("Bitte speichern Sie das SFTP-Passwort sicher auf Ihrem lokalen System.")
else:
typer.echo("GitHub-Token oder Repository-Informationen nicht gefunden.")
typer.echo("Bitte setzen Sie die Umgebungsvariablen GITHUB_TOKEN, GITHUB_REPO_OWNER und GITHUB_REPO_NAME.")
raise typer.Exit(code=1)
# Rest Ihrer Anwendung
typer.echo(f"Parameter 1: {param1}")
typer.echo(f"Parameter 2: {param2}")
typer.echo(f"SFTP Host: {sftp_host}")
typer.echo(f"SFTP Benutzername: {sftp_username}")
# Verwenden Sie sftp_password hier sicher weiter
if __name__ == "__main__":
app()
Im obigen Code werden die CLI-Parameter param1
und param2
bevorzugt. Falls sie nicht gesetzt sind, werden die Werte aus der config.toml
geladen.
Umgebungsvariablen verwenden:
Speichern Sie Ihre sensiblen Daten als Umgebungsvariablen auf Ihrem macOS-System.
So setzen Sie eine Umgebungsvariable in macOS:
Fügen Sie folgende Zeilen zu Ihrer ~/.bash_profile
oder ~/.zshrc
hinzu:
export SFTP_PASSWORD='IhrSicheresPasswort'
export GITHUB_TOKEN='IhrGitHubTokenFallsBenötigt'
export GITHUB_REPO_OWNER='IhrGitHubBenutzername'
export GITHUB_REPO_NAME='IhrRepositoryName'
Laden Sie die Änderungen:
source ~/.bash_profile
# oder
source ~/.zshrc
python-dotenv verwenden:
Alternativ können Sie das Paket python-dotenv
verwenden, um eine .env
-Datei zu laden.
pip install python-dotenv
Erstellen Sie eine .env
-Datei:
SFTP_PASSWORD='IhrSicheresPasswort'
Anpassung des Codes:
from dotenv import load_dotenv
load_dotenv()
Konfigurationsverwaltung:
Sensitive Daten:
Sicherheitsaspekte:
Verwendung eines Secret-Management-Tools:
Wenn Sie eine robustere Lösung benötigen, könnten Sie ein Secret-Management-Tool implementieren.
Beispiel mit HashiCorp Vault:
hvac
Python-Paket, um Secrets aus Vault abzurufen.pip install hvac
Code-Beispiel:
import hvac
client = hvac.Client(url='http://127.0.0.1:8200', token='IhrVaultToken')
secret = client.secrets.kv.v2.read_secret_version(path='sftp')
sftp_password = secret['data']['data']['password']
Ihre Anwendung kann mit Typer und der Verwendung von TOML-Dateien sowie Umgebungsvariablen effizient und sicher konfiguriert werden. Das Abrufen von GitHub Secrets ist für lokale Anwendungen nicht geeignet, daher sollten Sie eine alternative Methode zur Verwaltung sensibler Daten wählen.
Bei weiteren Fragen oder wenn Sie Unterstützung bei der Implementierung benötigen, stehe ich Ihnen gerne zur Verfügung.
Lieber ChatGPT. Ich suche für Kurmann Videoschnitt eine Möglichkeit Config-Werte zu speichern, vorzugsweise in ein TOML-File. Ich möchte sie von Hand anpassen als auch über die CLI, also ähnlich wie dotnet user-secrets in der .NET-Welt
Lieber Nutzer,
um Konfigurationswerte für Kurmann Videoschnitt in einer TOML-Datei zu speichern und sowohl manuell als auch über die CLI anzupassen – ähnlich wie bei
dotnet user-secrets
in der .NET-Welt – können Sie folgende Ansätze verfolgen:Verwendung einer Konfigurationsbibliothek:
Je nach verwendeter Programmiersprache gibt es Bibliotheken, die das Parsen und Schreiben von TOML-Dateien unterstützen:
toml
odertomli
BurntSushi/toml
toml
@iarna/toml
Diese Bibliotheken ermöglichen es, TOML-Dateien zu lesen und zu schreiben, sodass Ihre Anwendung die Konfiguration laden und Änderungen speichern kann.
CLI-Tool implementieren:
Entwickeln Sie ein CLI-Tool, das mit der TOML-Konfigurationsdatei interagiert. Das Tool kann Befehle zum Abrufen, Setzen und Löschen von Konfigurationswerten bereitstellen.
Beispielbefehle:
Dadurch können Sie die Konfiguration direkt über die Kommandozeile anpassen.
Vorhandene Tools nutzen:
Falls Sie kein eigenes CLI-Tool entwickeln möchten, können Sie bestehende Werkzeuge verwenden, die TOML-Dateien über die CLI manipulieren können. Ein Beispiel ist
toml-cli
, mit dem Sie TOML-Dateien abfragen und aktualisieren können.Integration von Secrets Management:
Wenn Sie sensible Daten (wie API-Schlüssel oder Passwörter) speichern müssen, sollten Sie ein Secrets-Management-Tool in Betracht ziehen:
Diese Tools helfen dabei, sensible Informationen sicher zu speichern und zu verwalten.
Verwendung von Umgebungsvariablen:
Eine weitere gängige Praxis ist die Nutzung von Umgebungsvariablen für Konfigurationswerte. Ihre Anwendung kann diese Variablen lesen, und Sie können sie über die CLI oder in Ihren Systemeinstellungen setzen.
Beispielimplementierung in Python:
Konfigurationsdatei (
config.toml
):CLI-Skript (
config-cli.py
):Verwendung:
Wichtige Überlegungen:
Alternative Formate in Betracht ziehen:
Falls TOML nicht Ihren Anforderungen entspricht, könnten Sie auch YAML oder JSON als Konfigurationsformat verwenden, je nach Präferenz und vorhandenen Tools.
Zusammenfassung:
Durch die Kombination aus einer TOML-Konfigurationsdatei und einem CLI-Tool können Sie flexibel Konfigurationswerte für Kurmann Videoschnitt verwalten, ähnlich wie mit
dotnet user-secrets
. Dies ermöglicht sowohl die manuelle Bearbeitung als auch die Anpassung über die Kommandozeile.Bei weiteren Fragen oder wenn Sie Unterstützung bei der Implementierung benötigen, stehe ich Ihnen gerne zur Verfügung.