99 lines
4.1 KiB
Bash
Executable File
99 lines
4.1 KiB
Bash
Executable File
#!/bin/bash
|
|
# delete_starface_chat.sh — loescht den kompletten Chat-Verlauf eines Starface-Users
|
|
# aus der Openfire-Chat-DB (Postgres, Datenbank "asterisk").
|
|
#
|
|
# Aufruf:
|
|
# ./delete_starface_chat.sh <user_id>
|
|
#
|
|
# <user_id> ist die Starface-Benutzer-ID wie sie im JID-Format verwendet wird,
|
|
# z.B. "0001" (JID dann 0001@<starface-ip>). Einfach die Nummer/den Login-Namen
|
|
# des Users angeben, wie er in Starface als Benutzer-ID gefuehrt wird.
|
|
#
|
|
# Was das Script macht:
|
|
# 1. Findet alle Konversationen (ofconversation) in denen der User als
|
|
# Absender oder Empfaenger vorkommt (fromjid/tojid LIKE '<user_id>@%').
|
|
# 2. Sichert ALLE betroffenen Zeilen aus ofmessagearchive + ofconversation
|
|
# als CSV-Backup nach /var/backups/starface_chat_backups/ BEVOR irgendwas
|
|
# geloescht wird.
|
|
# 3. Loescht die Nachrichten aus ofmessagearchive.
|
|
# 4. Loescht die zugehoerigen ofconversation-Eintraege, aber NUR wenn nach
|
|
# dem Loeschen keine Nachricht mehr auf diese conversationid verweist
|
|
# (falls doch noch andere Nutzer/Nachrichten dranhaengen, bleibt der
|
|
# Konversations-Header stehen, nur ohne die geloeschten Nachrichten).
|
|
#
|
|
# Muss LOKAL auf dem Starface-Server laufen (braucht sudo-Zugriff auf den
|
|
# postgres-User, psql muss installiert sein — ist bei Starface Standard).
|
|
#
|
|
# WICHTIG: Loescht die GEMEINSAME Konversation. Openfire speichert eine
|
|
# Konversation zwischen zwei Usern als EINE gemeinsame History (keine
|
|
# getrennten Kopien pro Teilnehmer). D.h. loescht man z.B. User 0022, dann
|
|
# verschwindet auch bei dessen Chatpartnern (z.B. 0005) genau dieser eine
|
|
# Chat mit 0022 — alle anderen Chats von 0005 mit anderen Usern bleiben
|
|
# unberuehrt. Das ist technisch bedingt und so gewollt (siehe README).
|
|
|
|
set -euo pipefail
|
|
|
|
USER_ID="${1:-}"
|
|
|
|
if [[ -z "$USER_ID" ]]; then
|
|
echo "Usage: $0 <user_id>" >&2
|
|
echo "Beispiel: $0 0001" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Nur alphanumerisch + . _ - erlauben (keine SQL-Injection ueber das Argument)
|
|
if [[ ! "$USER_ID" =~ ^[A-Za-z0-9._-]+$ ]]; then
|
|
echo "Fehler: user_id enthaelt ungueltige Zeichen: '$USER_ID'" >&2
|
|
exit 1
|
|
fi
|
|
|
|
JID_PATTERN="${USER_ID}@%"
|
|
TS="$(date +%Y%m%d_%H%M%S)"
|
|
BACKUP_DIR="/var/backups/starface_chat_backups"
|
|
MSG_BACKUP="${BACKUP_DIR}/chat_backup_${USER_ID}_${TS}_messages.csv"
|
|
CONV_BACKUP="${BACKUP_DIR}/chat_backup_${USER_ID}_${TS}_conversations.csv"
|
|
|
|
mkdir -p "$BACKUP_DIR"
|
|
chmod 777 "$BACKUP_DIR" # postgres-OS-User braucht Schreibzugriff fuer \copy
|
|
|
|
PSQL="sudo -u postgres psql -d asterisk -v ON_ERROR_STOP=1"
|
|
|
|
echo "== Starface Chat-Loeschung fuer User '${USER_ID}' =="
|
|
|
|
MSG_COUNT=$($PSQL -t -A -c "SELECT count(*) FROM ofmessagearchive WHERE fromjid LIKE '${JID_PATTERN}' OR tojid LIKE '${JID_PATTERN}';")
|
|
echo "Gefundene Nachrichten: ${MSG_COUNT}"
|
|
|
|
if [[ "$MSG_COUNT" -eq 0 ]]; then
|
|
echo "Keine Nachrichten fuer diesen User gefunden — nichts zu tun."
|
|
exit 0
|
|
fi
|
|
|
|
echo "Erstelle Backup..."
|
|
$PSQL -c "\copy (SELECT * FROM ofmessagearchive WHERE fromjid LIKE '${JID_PATTERN}' OR tojid LIKE '${JID_PATTERN}') TO '${MSG_BACKUP}' WITH CSV HEADER"
|
|
$PSQL -c "\copy (SELECT * FROM ofconversation WHERE conversationid IN (SELECT DISTINCT conversationid FROM ofmessagearchive WHERE fromjid LIKE '${JID_PATTERN}' OR tojid LIKE '${JID_PATTERN}')) TO '${CONV_BACKUP}' WITH CSV HEADER"
|
|
echo "Backup gespeichert:"
|
|
echo " ${MSG_BACKUP}"
|
|
echo " ${CONV_BACKUP}"
|
|
|
|
echo "Loesche Nachrichten + verwaiste Konversationen..."
|
|
$PSQL <<SQL
|
|
BEGIN;
|
|
|
|
CREATE TEMP TABLE affected_conv AS
|
|
SELECT DISTINCT conversationid FROM ofmessagearchive
|
|
WHERE fromjid LIKE '${JID_PATTERN}' OR tojid LIKE '${JID_PATTERN}';
|
|
|
|
DELETE FROM ofmessagearchive
|
|
WHERE fromjid LIKE '${JID_PATTERN}' OR tojid LIKE '${JID_PATTERN}';
|
|
|
|
-- Konversationen nur loeschen wenn wirklich keine Nachricht mehr uebrig ist
|
|
DELETE FROM ofconversation
|
|
WHERE conversationid IN (SELECT conversationid FROM affected_conv)
|
|
AND conversationid NOT IN (SELECT DISTINCT conversationid FROM ofmessagearchive);
|
|
|
|
COMMIT;
|
|
SQL
|
|
|
|
REMAINING=$($PSQL -t -A -c "SELECT count(*) FROM ofmessagearchive WHERE fromjid LIKE '${JID_PATTERN}' OR tojid LIKE '${JID_PATTERN}';")
|
|
echo "Fertig. Verbleibende Nachrichten fuer '${USER_ID}': ${REMAINING}"
|