| 1 | #!/bin/bash |
|---|
| 2 | # |
|---|
| 3 | # nc-secrets-sheet.sh -- erzeugt eine Safe-Kopie der unersetzlichen |
|---|
| 4 | # Nextcloud-Schlüssel (instanceid, passwordsalt, secret) als RST-Blatt |
|---|
| 5 | # mit eingebettetem QR-Code, auf Wunsch gleich als druckfertiges PDF. |
|---|
| 6 | # |
|---|
| 7 | # Aufruf: nc-secrets-sheet.sh <pfad/zu/config.php> [Instanz-Label] |
|---|
| 8 | # Ausgabe: $OUTDIR (Default: aktuelles Verzeichnis) |
|---|
| 9 | # nc-secrets-<datum>.png QR-Code |
|---|
| 10 | # nc-secrets-<datum>.rst Blatt, zugleich Klarkopie |
|---|
| 11 | # nc-secrets-<datum>.pdf nur wenn rst2pdf vorhanden |
|---|
| 12 | # |
|---|
| 13 | # Umgebung: OUTDIR Zielverzeichnis |
|---|
| 14 | # NOPDF=1 PDF-Erzeugung ueberspringen |
|---|
| 15 | # |
|---|
| 16 | set -euo pipefail |
|---|
| 17 | umask 077 |
|---|
| 18 | |
|---|
| 19 | CONFIG=${1:?Aufruf: $0 <pfad/zu/config.php> [Instanz-Label]} |
|---|
| 20 | LABEL=${2:-$(hostname -f 2>/dev/null || hostname)} |
|---|
| 21 | OUTDIR=${OUTDIR:-.} |
|---|
| 22 | STAMP=$(date +%Y-%m-%d) |
|---|
| 23 | BASE="$OUTDIR/nc-secrets-$STAMP" |
|---|
| 24 | PNG="nc-secrets-$STAMP.png" # im RST relativ referenziert |
|---|
| 25 | |
|---|
| 26 | [ -r "$CONFIG" ] || { echo "config.php nicht lesbar: $CONFIG" >&2; exit 1; } |
|---|
| 27 | [ -d "$OUTDIR" ] || { echo "Zielverzeichnis fehlt: $OUTDIR" >&2; exit 1; } |
|---|
| 28 | command -v qrencode >/dev/null || { echo "qrencode nicht gefunden" >&2; exit 1; } |
|---|
| 29 | |
|---|
| 30 | # Wert eines config.php-Eintrags holen; vertraegt ' und " sowie fehlendes Komma. |
|---|
| 31 | value_of() { |
|---|
| 32 | sed -n "s/^[[:space:]]*['\"]$1['\"][[:space:]]*=>[[:space:]]*['\"]\(.*\)['\"][[:space:]]*,\{0,1\}[[:space:]]*$/\1/p" "$CONFIG" | head -n1 |
|---|
| 33 | } |
|---|
| 34 | |
|---|
| 35 | PAYLOAD="" |
|---|
| 36 | for key in instanceid passwordsalt secret; do |
|---|
| 37 | val=$(value_of "$key") |
|---|
| 38 | [ -n "$val" ] || { echo "Eintrag nicht gefunden: $key" >&2; exit 1; } |
|---|
| 39 | PAYLOAD+="$key=$val"$'\n' |
|---|
| 40 | done |
|---|
| 41 | |
|---|
| 42 | printf '%s' "$PAYLOAD" | qrencode -l H -s 10 -m 4 -o "$BASE.png" |
|---|
| 43 | |
|---|
| 44 | # --- Grid-Tabelle mit berechneten Spaltenbreiten ------------------------------ |
|---|
| 45 | W1=7 # "Instanz", "Quelle", "Stand" |
|---|
| 46 | W2=0 |
|---|
| 47 | for v in "$LABEL" "$CONFIG" "$STAMP"; do |
|---|
| 48 | [ ${#v} -gt $W2 ] && W2=${#v} |
|---|
| 49 | done |
|---|
| 50 | |
|---|
| 51 | rule() { printf '+%*s+%*s+\n' $((W1 + 2)) '' $((W2 + 2)) '' | tr ' ' '-'; } |
|---|
| 52 | row() { printf '| %-*s | %-*s |\n' "$W1" "$1" "$W2" "$2"; } |
|---|
| 53 | |
|---|
| 54 | { |
|---|
| 55 | echo "======================================" |
|---|
| 56 | echo "Nextcloud -- unersetzliche Schlüssel" |
|---|
| 57 | echo "======================================" |
|---|
| 58 | echo |
|---|
| 59 | rule; row Instanz "$LABEL"; rule; row Quelle "$CONFIG"; rule; row Stand "$STAMP"; rule |
|---|
| 60 | echo |
|---|
| 61 | echo "Schlüssel" |
|---|
| 62 | echo "==========" |
|---|
| 63 | echo |
|---|
| 64 | echo "::" |
|---|
| 65 | echo |
|---|
| 66 | printf '%s' "$PAYLOAD" | sed 's/^/ /' |
|---|
| 67 | echo |
|---|
| 68 | echo "QR-Code" |
|---|
| 69 | echo "=======" |
|---|
| 70 | echo |
|---|
| 71 | echo "Inhalt identisch mit dem Abschnitt oben, Fehlerkorrektur Stufe H." |
|---|
| 72 | echo |
|---|
| 73 | echo ".. image:: $PNG" |
|---|
| 74 | echo " :width: 7cm" |
|---|
| 75 | echo " :align: center" |
|---|
| 76 | echo |
|---|
| 77 | echo ".. warning::" |
|---|
| 78 | echo |
|---|
| 79 | echo " Ohne diese Werte sind Passman-Daten und App-Passwoerter auch aus" |
|---|
| 80 | echo " einem vollstaendigen Datenbank-Backup nicht wiederherstellbar." |
|---|
| 81 | echo " Dieses Blatt gehoert in den Safe -- nicht in das Passman-Vault," |
|---|
| 82 | echo " im Wiki und im Dirvish-Baum hilft sie ggf. auch nicht." |
|---|
| 83 | } > "$BASE.rst" |
|---|
| 84 | |
|---|
| 85 | echo "geschrieben: $BASE.png" |
|---|
| 86 | echo "geschrieben: $BASE.rst" |
|---|
| 87 | |
|---|
| 88 | if [ -z "${NOPDF:-}" ] && command -v rst2pdf >/dev/null; then |
|---|
| 89 | ( cd "$OUTDIR" && rst2pdf "nc-secrets-$STAMP.rst" -o "nc-secrets-$STAMP.pdf" ) |
|---|
| 90 | echo "geschrieben: $BASE.pdf" |
|---|
| 91 | else |
|---|
| 92 | echo "PDF uebersprungen -- von Hand: cd $OUTDIR && rst2pdf nc-secrets-$STAMP.rst" |
|---|
| 93 | fi |
|---|