Prosody: Inaktive Accounts ermitteln und löschen

Mit der Zeit häufen sich auf XMPP-Servern unzählige ungenutzte XMPP-Accounts an. Es schadet nicht, diese nach einem festgelegten Zeitraum zu löschen und die Benutzernamen wieder freizugeben. Nicht zuletzt kann so eine Reinigungsaktion auch für die Datenbank-Performance hilfreich sein. Standardmäßig enthält Prosody leider keinen Mechnismus zum Löschen inaktiver Accounts, doch mit zwei Modulen und ein paar Kommandozeilen-Tricks kann man den Server von Altlasten befreien.

Um zu erkennen, welcher Account wann zuletzt genutzt wurde, muss der Zeitpunkt der letzten Aktivität (dazu zählen Registrierung, Login, Logout) für jeden Account ermittelt werden. Dazu gibt es das prosody-Modul “mod_lastlog”. Darauf kann das zweite Modul “mod_list_inactive” aufbauen: Es nutzt die von mod_lastlog bereitgestellten Aktivitäts-Timestamps und gibt auf Wunsch eine Liste der Nutzer-IDs aus, welche in dem vorgegebenen Zeitraum nicht aktiv waren.

Die beiden Module findet ihr im Modul-Repository

Aktiviert die beiden Module wie üblich und startet den Prosody-Server neu.

Inaktive Nutzer ermitteln

Mit der ersten Aufräumaktion solltet ihr erst beginnen, wenn der von euch mindesten geforderte Nutzungszeitraum 1x durchlaufen wurde. Ich habe vor etwa einem Jahr die beiden Module installiert. Seitdem wurde mitprotokolliert, wann Nutzer (wie oben definiert) aktiv waren. Weil ich in den Nutzungsbedingungen festgelegt habe, dass Accounts nach einem Jahr Nichtnutzung gelöscht werden, habe ich die Löschaktion heute zum ersten Mal ausgeführt.

In der einfachsten Variante kann man sich eine Liste der Nutzer ausgeben lassen, die sich seit einem Jahr (oder länger) nicht mehr ein- oder ausgeloggt haben:

prosodyctl mod_list_inactive trashserver.net 1year default

(die Syntax des Befehls könnt ihr via prosodyctl mod_list_inactive nachschlagen)

Wer einfach nur gerne die Anzahl der betroffenen Nutzer ermitteln will, kann dem Kommendo ein | wc -l anhängen:

prosodyctl mod_list_inactive trashserver.net 1year default | wc -l

In meinem Fall waren das 408 Benutzer, die sich zum Teil noch nicht ein einziges Mal eingeloggt haben.

Betroffene Accounts löschen

( … und an dieser Stelle solltet ihr vorsichtshalber ein Backup anlegen …)

Mit der Ausgabe des list_inactive Module können leider nicht direkt etwas anfangen. Es gibt zwar noch zwei andere Ausgabearten, doch die “delete” Ausgabe hilft uns nur, wenn wir zum Löschen ein kleines Lua-Script basteln wollen. Da ich und viele andere Lua nicht beherrschen, habe ich mir etwas anderes überlegt: Mithilfe der Ausgabe wird einfach ein Bash-Script generiert, das zum Löschen der Accounts ausgeführt wird.

prosodyctl mod_list_inactive trashserver.net 1year default | sed -e 's/^/prosodyctl deluser /' > delusers.sh

mit “delusers.sh” habt ihr jetzt eine Scriptdatei an der Hand, die den passenden prosodyctl-Befehl zum löschen eines jeden Accounts bereits enthält. Sie muss jetzt nur noch ausgeführt werden:

bash delusers.sh

Je nach Anzahl der zu löschenden Accounts kann es einige Momente dauern, bis alle Löschbefehle durchgelaufen sind. Zur Kontrolle können nocheinmal die inaktiven Benutzer gezählt werden:

prosodyctl mod_list_inactive trashserver.net 1year default | wc -l

Wenn der Zähler diesmal auf 0 steht, war die Aktion erfolgreich.