Files
opencrm/factory-export.sh
T
duffyduck 4407bbfbb8 factory-defaults: CLI-Sync zwischen dev und prod
Zwei kleine Bash-Wrapper im Repo-Root, die den vorhandenen Export- und
Import-Endpoint per curl ansteuern und damit den Hin- und Her-Transfer von
Stammdaten + HTML-Templates zwischen Instanzen ohne Browser ermöglichen.

  ./factory-export.sh                    # ZIP nach factory-exports/
  ./factory-import.sh                    # nimmt jüngste ZIP automatisch
  ./factory-import.sh path/zur.zip       # explizit

Konfigurierbar via OPENCRM_URL / OPENCRM_EMAIL / OPENCRM_PASSWORD;
ohne PASSWORD wird interaktiv abgefragt.

Workflow: prod erweitert Anbieter → ./factory-export.sh → scp → dev
./factory-import.sh – funktioniert in beide Richtungen.

`factory-exports/` ist gitignored (nur .gitkeep getrackt).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 19:51:19 +02:00

65 lines
2.0 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# Factory-Defaults-Export holt eine ZIP vom laufenden OpenCRM und legt sie
# in ./factory-exports/ ab. Dieselbe ZIP, die du auch über die UI bekommst.
#
# Workflow:
# ./factory-export.sh # default: localhost:3010, admin@admin.com
# OPENCRM_URL=https://crm.example.de \
# OPENCRM_EMAIL=admin@example.de \
# ./factory-export.sh # gegen die Prod-Instanz
#
# Optional:
# OPENCRM_PASSWORD=… (sonst wird interaktiv abgefragt)
#
# Die ZIP ist gitignored du kannst sie via scp transferieren und mit
# ./factory-import.sh auf der anderen Seite einspielen.
set -euo pipefail
URL="${OPENCRM_URL:-http://localhost:3010}"
EMAIL="${OPENCRM_EMAIL:-admin@admin.com}"
PASSWORD="${OPENCRM_PASSWORD:-}"
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
EXPORT_DIR="$REPO_ROOT/factory-exports"
mkdir -p "$EXPORT_DIR"
if [ -z "$PASSWORD" ]; then
read -r -s -p "Passwort für $EMAIL @ $URL: " PASSWORD
echo
fi
echo "→ Login als $EMAIL @ $URL"
LOGIN_RESPONSE="$(curl -sS -X POST "$URL/api/auth/login" \
-H 'Content-Type: application/json' \
--data-raw "$(E="$EMAIL" P="$PASSWORD" python3 -c 'import json,os;print(json.dumps({"email":os.environ["E"],"password":os.environ["P"]}))')")"
TOKEN="$(printf '%s' "$LOGIN_RESPONSE" | python3 -c 'import json,sys;d=json.load(sys.stdin);print((d.get("data") or {}).get("token","") or d.get("token",""))')"
if [ -z "$TOKEN" ]; then
echo "✗ Login fehlgeschlagen. Antwort:"
echo "$LOGIN_RESPONSE" | head -c 500
echo
exit 1
fi
TIMESTAMP="$(date +%Y-%m-%d-%H%M)"
DEST="$EXPORT_DIR/factory-defaults-$TIMESTAMP.zip"
echo "→ Lade ZIP nach $DEST"
HTTP_CODE="$(curl -sS -o "$DEST" -w '%{http_code}' \
-H "Authorization: Bearer $TOKEN" \
"$URL/api/factory-defaults/export")"
if [ "$HTTP_CODE" != "200" ]; then
echo "✗ Export-Endpoint antwortete mit HTTP $HTTP_CODE"
rm -f "$DEST"
exit 1
fi
SIZE_KB="$(du -k "$DEST" | cut -f1)"
echo "✓ Export erfolgreich: $DEST (${SIZE_KB} KB)"
echo
echo "Inhalt:"
unzip -l "$DEST" | sed 's/^/ /'