kurmann / videoschnitt

Teilautomatisierung und Verwaltung für privaten Videoschnitt – das Kraftwerk für Familienfilme
Apache License 2.0
0 stars 0 forks source link

Config management with CLI #676

Open kurmann opened 2 months ago

kurmann commented 2 months ago

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:

  1. Verwendung einer Konfigurationsbibliothek:

    Je nach verwendeter Programmiersprache gibt es Bibliotheken, die das Parsen und Schreiben von TOML-Dateien unterstützen:

    Diese Bibliotheken ermöglichen es, TOML-Dateien zu lesen und zu schreiben, sodass Ihre Anwendung die Konfiguration laden und Änderungen speichern kann.

  2. 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:

    config-cli get setting_name
    config-cli set setting_name value
    config-cli delete setting_name

    Dadurch können Sie die Konfiguration direkt über die Kommandozeile anpassen.

  3. 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.

  4. 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:

    • Git Secret: Verschlüsselt Geheimnisse in Ihrem Git-Repository.
    • HashiCorp Vault: Zentrales Management von Geheimnissen und deren Zugriff.
    • doppler: Einheitliche Verwaltung von Umgebungsvariablen und Geheimnissen.

    Diese Tools helfen dabei, sensible Informationen sicher zu speichern und zu verwalten.

  5. 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.

  6. Beispielimplementierung in Python:

    Konfigurationsdatei (config.toml):

    [settings]
    api_key = "Ihr_API_Schlüssel"
    timeout = 30

    CLI-Skript (config-cli.py):

    import toml
    import sys
    
    config_file = 'config.toml'
    config = toml.load(config_file)
    
    command = sys.argv[1]
    
    if command == 'get':
       key = sys.argv[2]
       print(config['settings'].get(key, 'Schlüssel nicht gefunden'))
    elif command == 'set':
       key = sys.argv[2]
       value = sys.argv[3]
       config['settings'][key] = value
       with open(config_file, 'w') as f:
           toml.dump(config, f)
       print(f"{key} wurde auf {value} gesetzt.")
    elif command == 'delete':
       key = sys.argv[2]
       if key in config['settings']:
           del config['settings'][key]
           with open(config_file, 'w') as f:
               toml.dump(config, f)
           print(f"{key} wurde gelöscht.")
       else:
           print('Schlüssel nicht gefunden')
    else:
       print('Unbekannter Befehl')

    Verwendung:

    python config-cli.py get api_key
    python config-cli.py set timeout 60
    python config-cli.py delete api_key
  7. Wichtige Überlegungen:

    • Dateiberechtigungen: Stellen Sie sicher, dass die TOML-Datei über die richtigen Berechtigungen verfügt, besonders wenn sie sensible Daten enthält.
    • Fehlerbehandlung: Implementieren Sie eine robuste Fehlerbehandlung in Ihrem CLI-Tool.
    • Datentypen: Achten Sie darauf, die richtigen Datentypen zu verwenden (z. B. Zahlen, Strings, Booleans).
  8. 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.

kurmann commented 2 months 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:

  1. Verwendung von Python mit Typer zur Erstellung eines CLI-Tools.
  2. Konfigurationswerte sollen aus einer TOML-Datei gelesen werden, sofern sie nicht direkt über die CLI angegeben werden (CLI-Parameter haben Vorrang).
  3. Sensible Daten wie SFTP-Zugänge sollen aus den Konfigurationen gelesen werden und nicht über die CLI-Parameter übergeben werden. Falls diese nicht vorhanden sind, sollen sie über GitHub Secrets bezogen werden, und es soll eine Meldung ausgegeben werden, wenn keine Daten gefunden wurden.
  4. Die Anwendung läuft lokal auf macOS, und die GitHub Secrets müssen remote abgerufen werden.

Schritt 1: Einrichtung der TOML-Konfigurationsdatei

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.


Schritt 2: Implementierung des CLI-Tools mit Typer

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()

Schritt 3: Überladen der Konfigurationswerte mit CLI-Parametern

Im obigen Code werden die CLI-Parameter param1 und param2 bevorzugt. Falls sie nicht gesetzt sind, werden die Werte aus der config.toml geladen.


Schritt 4: Umgang mit sensiblen Daten und GitHub Secrets

Wichtige Hinweise zu GitHub Secrets:

Empfohlene Vorgehensweise:


Schritt 5: Sicherheitsüberlegungen


Zusammenfassung und Empfehlungen


Optionale Erweiterungen


Fazit

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.