diff --git a/server-internal/paypal-einrichten.sh b/server-internal/paypal-einrichten.sh new file mode 100644 index 00000000..d280fba6 --- /dev/null +++ b/server-internal/paypal-einrichten.sh @@ -0,0 +1,207 @@ +#!/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