#!/bin/bash # ===================================================================== # paypal-einrichten.sh — trägt die PayPal-Werte in die .env ein # # WARUM ES DIESES SKRIPT GIBT # # Claudian hat keinen Zugriff auf /home/dogiintern und darf per sudo nur # apt, systemctl und docker ausführen. Die .env kann also nur Filipe # selbst beschreiben — und das ist richtig so: Ein Zugangsschlüssel, mit # dem sich Geld bewegen lässt, sollte nicht durch einen Chatverlauf # wandern. # # Dieses Skript nimmt ihm alles ab, was NICHT das Eintippen der Werte # ist: Sicherung anlegen, richtige Zeilen finden, Sonderzeichen # schützen, Rechte setzen, Dienst neu starten, Ergebnis prüfen. # # Es zeigt zu keinem Zeitpunkt einen Schlüssel an — auch nicht in der # Ausgabe am Ende, auch nicht in der Bash-History. # # AUFRUF (als dogiintern, weil ihm die Datei gehört): # sudo -u dogiintern bash /home/dogiintern/dogfather-universe/server-internal/paypal-einrichten.sh # ===================================================================== set -u ENV_DATEI="/home/dogiintern/dogfather-universe/server-internal/.env" if [ ! -f "$ENV_DATEI" ]; then echo "FEHLER: $ENV_DATEI gibt es nicht." echo "Läuft das Skript als dogiintern? Aufruf siehe Kopf der Datei." exit 1 fi if [ ! -w "$ENV_DATEI" ]; then echo "FEHLER: keine Schreibrechte auf $ENV_DATEI." echo "Bitte mit sudo -u dogiintern bash starten." exit 1 fi echo echo "===================================================================" echo " PayPal für den Webdesign-Bereich einrichten" echo "===================================================================" echo echo "Zu jedem Wert siehst du, ob schon etwas hinterlegt ist." echo "ENTER ohne Eingabe = bisherigen Wert behalten." echo echo "Werte werden NICHT angezeigt und NICHT protokolliert." echo # ---- Sicherung ------------------------------------------------------ # Vor jeder Änderung. Wenn etwas schiefgeht, ist der alte Stand einen # Kopierbefehl entfernt -- das ist die billigste Versicherung überhaupt. SICHERUNG="${ENV_DATEI}.vor-paypal-$(date +%Y%m%d-%H%M%S)" cp -p "$ENV_DATEI" "$SICHERUNG" chmod 600 "$SICHERUNG" echo "Sicherung angelegt: $SICHERUNG" echo # ---- Hilfsfunktionen ------------------------------------------------ # Ist der Schlüssel schon gefüllt? Gibt nur ja/nein zurück, nie den Wert. schon_da() { grep -qE "^$1=.+" "$ENV_DATEI" && echo "ja" || echo "nein" } # Schreibt einen Wert. Ersetzt eine vorhandene Zeile, hängt sonst an. # # Bewusst OHNE sed -i mit dem Wert im Muster: Ein Secret kann Zeichen # enthalten, die sed als Befehl liest (& / \). Stattdessen wird die Datei # zeilenweise mit awk umgeschrieben und der Wert über eine Variable # übergeben -- so kann er nichts auslösen. setze() { local schluessel="$1" local wert="$2" local tmp tmp="$(mktemp)" chmod 600 "$tmp" if grep -qE "^${schluessel}=" "$ENV_DATEI"; then awk -v k="$schluessel" -v v="$wert" ' $0 ~ "^" k "=" { print k "=" v; getroffen=1; next } { print } END { if (!getroffen) print k "=" v } ' "$ENV_DATEI" > "$tmp" else cat "$ENV_DATEI" > "$tmp" printf '%s=%s\n' "$schluessel" "$wert" >> "$tmp" fi cat "$tmp" > "$ENV_DATEI" # Inhalt ersetzen, Eigentümer/Rechte bleiben rm -f "$tmp" } # Fragt einen Wert ab. -s = Eingabe wird nicht angezeigt. frage() { local schluessel="$1" local beschreibung="$2" local geheim="$3" local stand stand="$(schon_da "$schluessel")" echo "-------------------------------------------------------------------" echo "$beschreibung" if [ "$stand" = "ja" ]; then echo " -> ist bereits hinterlegt. ENTER = so lassen." else echo " -> noch leer." fi local eingabe="" if [ "$geheim" = "geheim" ]; then read -r -s -p " Wert (wird nicht angezeigt): " eingabe echo else read -r -p " Wert: " eingabe fi if [ -z "$eingabe" ]; then echo " übersprungen." else setze "$schluessel" "$eingabe" echo " gespeichert (${#eingabe} Zeichen)." fi # Variable sofort leeren, damit der Wert nicht länger im Speicher steht # als nötig. eingabe="" echo } # ---- Die Werte ------------------------------------------------------ echo "1) Betriebsart" echo "-------------------------------------------------------------------" AKTUELL_ENV="$(grep -E '^PAYPAL_ENV=' "$ENV_DATEI" | head -1 | cut -d= -f2-)" echo " aktuell: ${AKTUELL_ENV:-nicht gesetzt}" echo " live = echtes Geld" echo " sandbox = Testbetrieb ohne echtes Geld" read -r -p " live oder sandbox? (ENTER = so lassen): " NEU_ENV if [ -n "${NEU_ENV:-}" ]; then case "$NEU_ENV" in live|sandbox) setze "PAYPAL_ENV" "$NEU_ENV"; echo " gesetzt auf $NEU_ENV." ;; *) echo " FEHLER: nur 'live' oder 'sandbox' erlaubt. Nicht geändert." ;; esac fi echo frage "PAYPAL_CLIENT_ID" \ "2) Client ID (developer.paypal.com -> Apps & Credentials)" "offen" frage "PAYPAL_CLIENT_SECRET" \ "3) Secret (dort auf 'Show' klicken)" "geheim" frage "PAYPAL_WD_WEBHOOK_ID" \ "4) Webhook ID (beginnt mit WH-, aus dem Webhook aus Phase 5)" "offen" echo "-------------------------------------------------------------------" echo "5) Abo-Plan für die monatliche Betreuung" echo " Nur nötig, wenn Betreuungs-Abos über die Seite laufen sollen." echo " Anzahlung und Restbetrag funktionieren auch ohne." frage "PAYPAL_WD_PLAN_BASIS" " Plan ID (beginnt mit P-) oder ENTER zum Überspringen" "offen" # ---- Ergebnis ------------------------------------------------------- chmod 600 "$ENV_DATEI" echo "===================================================================" echo " Stand danach" echo "===================================================================" for k in PAYPAL_ENV PAYPAL_CLIENT_ID PAYPAL_CLIENT_SECRET PAYPAL_WD_WEBHOOK_ID PAYPAL_WD_PLAN_BASIS; do if [ "$k" = "PAYPAL_ENV" ]; then printf " %-24s %s\n" "$k" "$(grep -E "^$k=" "$ENV_DATEI" | head -1 | cut -d= -f2-)" else # Nur Länge zeigen, nie den Wert. laenge="$(grep -E "^$k=" "$ENV_DATEI" | head -1 | cut -d= -f2- | wc -c)" if [ "$laenge" -gt 1 ]; then printf " %-24s gesetzt (%s Zeichen)\n" "$k" "$((laenge - 1))" else printf " %-24s LEER\n" "$k" fi fi done echo echo "Dienst wird neu gestartet ..." if sudo systemctl restart dogiintern.service 2>/dev/null; then sleep 2 ZUSTAND="$(systemctl is-active dogiintern.service 2>/dev/null || echo unbekannt)" echo " dogiintern.service: $ZUSTAND" if [ "$ZUSTAND" != "active" ]; then echo echo " ACHTUNG: Der Dienst läuft nicht. Die Sicherung liegt hier:" echo " $SICHERUNG" echo " Zurückholen mit:" echo " cp $SICHERUNG $ENV_DATEI && sudo systemctl restart dogiintern.service" fi else echo " Neustart nicht möglich (fehlende Rechte?). Bitte selbst ausführen:" echo " sudo systemctl restart dogiintern.service" fi echo echo "Fertig. Prüf jetzt in der Verwaltung unter 'Zahlungen', ob dort" echo "'PayPal ist eingerichtet' steht — und mach dann den 1-Euro-Test." echo echo "Die Sicherung kannst du löschen, wenn alles läuft:" echo " rm $SICHERUNG" echo