Own-/Nextcloud Userpflege: automatisch funktioniert nicht -> selfmade

Hallo Max und Tobias,

tausend Dank für euer Script.
Ich will jetzt nämlich auch endlich mal Nutzer löschen: und das sind in
meiner Nextcloud wohl 787 Stück ( von ca. 1550).

Sehe ich das richtig (ich habe NC 16), dass folgende Zeilen reichen würden?

sudo -u www-data php occ ldap:show-remnants | cut -d "|" -f 2 | grep -v ^+ | grep -v ownCloud | cut -b 2- >> /tmp/zuloeschendeuser

cat /tmp/zuloeschendeuser

for i in cat /tmp/zuloeschendeuser; do sudo -u www-data php occ
user:delete “$i”; done

Ich muß ja nciht vorher noch die Nutzer aus dem dataverzeichnis
auslesen: die findet ja schon ldap:show-remnants

Ich hab mir auch die /tmp/zuloeschendeuser angesehen: es sind 787 und
ich hab mit Stichproben jetzt keine gefunden, die noch im LDAP sind.

LG

Holger

Hi Holger,
ich hatte die aus dem data Verzeichnis genommen, da ich es wohl geschafft hatte, dort Leichen zu vergraben. Aber du kannst ja erstmal die 700 so löschen und gucken, ob in data was übrig bleibt…
Viel Erfolg, Max

aber zu Deiner Frage: ja, das sollte reichen…

Hi. Ich schiebe dieses Thema nochmal nach oben, da es bei uns in Sachen „NextCloud für alle“ demnächst auch damit losgehen wird, dass alte Accounts, die es im LDAP/AD gar nicht mehr gibt, auch unter NextCloud gelöscht werden müssen. Hat das jemand unter NC 18 ausprobiert und funktioniert das weiterhin so wie hier gezeigt?
Problematisch scheinen ja weiterhin die Files zu sein, die von Leuten geteilt wurden, die dann gelöscht werden sollen – oder?

Schöne Grüße,
Michael

Hallo Michael,
wie das mit Dateien ist, die geteilt wurden, weiß ich nicht, das müsste man mal ausprobieren.
Ich lösche meine Schüler jedenfalls immer noch so (war im Sommer aber noch NC15).
Eigentlich sollte es ja eine eingebaute LDAP-cleanup-funktion geben, in der config.php die Zeile

  'ldapUserCleanupInterval' => 5,

aber das hat bei mir keine Auswirkung. Ich habe allerdings auch von Version 6 ab hochgedatet, vielleicht ist da auch etwas einer älteren Version hängengeblieben…
Was jedoch mittlerweile geht, ist

 'activity_expire_days' => 14,

welches die Datenbankgröße der Aktivitäten schön klein hält, bis Version 14 oder so hatte ich noch ALLE jemals gespeicherten Aktivitäten drinnen.

LG
Max

Hallo Max.
OK, gut zu wissen.
Die Option zum Aufräumen der Aktivitäten habe ich zufällig gestern auch gesetzt. Es fiel auf, dass das bei Kalendereinträgen durchaus sinnvoll sein kann, da nicht alles zu loggen…
Die andere Option hatte ich auch schon gesehen - weiß aber auch nicht, ob es funktioniert. Wir denken über eine Cloud für Schüler nach… Da müssen solche Aufräumarbeiten jedenfalls regelmäßig laufen, damit das nicht unnötig voll läuft…
Schönen Gruß
Michael

Wenn man aber sein Portfolio in der Cloud liegen hat und nach zwei Jahren feststellen will, wer die Datei XY zum letzten Mal editiert hat, ist expiry in 14 Tagen auch nicht gut.
Ich hab eine riesige activity-Datenbank.
VG, Tobias

Hallo Tobias. Ja, mag sein … aber muss man das unbedingt wissen? Da gelten doch sicher auch irgendwelche Zeiten, die man in Sachen Datenschutz einhalten muss :slight_smile:?

Wenn ein User eine Datei bearbeitet hat, die in einem shared-ordner liegt, kann man doch davon ausgehen, dass sein Editieren nicht ein schützenswertes Datum ist, oder?
Datenschutz hin oder her: wenn die Datei verändert wurde, würde ich gerne die Historie sehen: zumindest wer hat sie wann bearbeitet…

wer sein portfolio im OSP pflegt hat das auch - über Jahre, oder?

Ein Kollege hatte zu Testzwecken in einen öffentlichen Kalender seine (Privat-)Termine per .ics importiert und wieder gelöscht. Das war kein Problem. Aber in den Aktivitäten stand dann sehr detailliert, um welche Termine es sich handelte – und das zurück bis ins Jahr 2014. Das waren schon schützenswerte Daten, so dass wir die Aktivitätenliste einfach gelöscht haben…

aber gut, es ist schwierig, seine eigenen Taten nachzuvollziehen…

:slight_smile: meine Idee war das nicht

Hallo,

nachdem meine Nextcloud mehr remnants als aktuelle user hatte, habe ich die Befehle von Max (und google) in ein script gepackt:

#!/bin/bash

IFS="
"
sudo -u www-data php occ ldap:show-remnants | cut -d "|" -f 2 | grep -v ^+ | grep -v ownCloud | cut -b 2- >> /var/www/owncloud/deluser

for i in `cat /var/www/owncloud/deluser`
do
  sudo -u www-data php occ user:delete "$i"
done

Erläuterung: Der Pfad zur cloud muss angepasst werden. Bei mir ist es das Verzeichnis ‚owncloud‘, obwohl dort eine nextcloud werkelt. Auch das script liegt in diesem Verzeichnis und muss ausführbar sein. Einmal gestartet gibt es für jeden gelöschten user eine Bestätigung. Da ganz oben in der Datei deluser ‚Nextcloud name‘ steht, startet die Ausgabe mit user ‚does not exist‘. Danach kann man gemütlich beim Löschen zuschauen. Das dauerte bei mir ein Weilchen und zwischendurch bekam ich es mit der Angst zu tun, dass alle user sterben :weary:

Viele Grüße

Wilfried

Nachtrag: Die user sind weg, viele leere Verzeichnisse leider nicht.

Push – auch diesen Beitrag schiebe ich nochmal nach oben. Nutzt das von Euch noch jemand auf diese Art und Weise mit einer aktuellen Nextcloud?

Wir haben nun die Situation, dass viele Schüler die Nextcloud für ihre Backups nutzen und der Speicher dort langsam aber sicher voll laufen wird. Da ist ein jährliches Aufräumen und Löschen alter Accounts mitsamt belegtem Speicher auf jeden Fall notwendig.

Ja, am jahresende.
Ich habe mir folgendes Skript gebastelt, s.u.
seit diesem Jahr habe ich die Nextcloud in docker, d.h. ich muss schauen, wie ich den Befehl abändere, z.B.
occcmd="docker exec -it -u 33 nextcloud-devel-fpm /var/www/html/occ"
und der phpcmd entfällt dann wohl…

Das Skript kopiert sich zuerst auf den Cloudserver (scp), dort führt es sich dann aus (ssh $0 $1).

#!/bin/bash
# Copyright 2019-2023 Tobias Küchel <devel@zukuul.de>
# This piece of software is licensed under:
# SPDX-License-Identifier: GPL-3.0-or-later
# ideas and pieces of this script from Max Führinger from the wiki

## your cloudserver should be configured here:
cloudserver="cloud-ext"
## path to the occ command on the cloudserver
occcmd="/opt/nextcloud/occ"
phpcmd="sudo -u www-data php --define apc.enable_cli=1"
## path to the data directory on the cloud server
data="/srv/nextcloud/data"
## list of directories on $data/ which should not be considered for deletion
excludelist="(appdata|files_external|rainloop|__groupfolders|updater-|vplan|plan)"

## kopiere dieses Script auf den Cloudserver
if [ `hostname -s` = "server" ]; then
    echo "Kopiere dieses Script  $0 auf den Cloudserver: $cloudserver und führe es dort wieder aus"
    scp $0 $cloudserver:$0
    ssh -t $cloudserver $0 $1
    exit 0
fi  

##############################################################################################

homelist=`mktemp`
pv --version > /dev/null
if [ $? -ne 0 ] ; then
    apt install pv bc
fi  

simulate=""
if [ "$1" = "--simulate" -o "$1" = "-s" ]; then
    echo "Simulation! Es wird nichts gelöscht!"
    simulate="echo Kommando wäre: "
fi  
### Zeige, frage und lösche alle User, die nicht mehr im LDAP sind:
echo -n "Users scheinbar nicht mehr im LDAP: "
$phpcmd $occcmd ldap:show-remnants  | awk '{print $2}' | sed "2d;/^\s*$/d" > /tmp/zuloeschendeuser
if [ -s /tmp/zuloeschendeuser ]; then
    cat /tmp/zuloeschendeuser | paste -s -d " "

    lines=$(cat /tmp/zuloeschendeuser | wc -l)
    lines=$(echo "$lines * 2" | bc -l)

    for i in `cat /tmp/zuloeschendeuser`; do
        $phpcmd $occcmd ldap:check-user "$i";
    done | pv -l -s $lines > /dev/null
    $phpcmd $occcmd ldap:show-remnants  | awk '{print $2}' | sed "2d;/^\s*$/d" > /tmp/zuloeschendeuser2
    if ! diff /tmp/zuloeschendeuser2 /tmp/zuloeschendeuser ; then
        echo "HUCH. Bitte starte das Programm nochmal. Es schienen beim ersten Durchlauf LDAP-User nicht zu existieren, die nach einen Check doch existieren!"
        exit 0
    fi


    [[ -n $simulate ]] && echo "SIMULATION: würde in keinem Fall etwas löschen!"
    echo -n "Sollen diese User gelöscht werden? yes/NO "
    read
    if [ "x$REPLY" = "xyes" ] ; then
        for i in `cat /tmp/zuloeschendeuser`; do
            echo -n "$i: " 
            $simulate $phpcmd $occcmd user:delete "$i";
        done
    fi
else
    echo "keine"
fi

### Erstelle eine Liste an Usern mit Dateien in der Cloud
echo -n "Erstelle Liste aller User mit Dateien in der Cloud: "
ls $data | grep -v "\." | grep -vE $excludelist > /tmp/userlist
echo `cat /tmp/userlist | wc -l` "user"

### Erstelle die Liste aller User mit Dateien, die nicht mehr im LDAP sind
echo "Checke, ob User noch in LDAP sind:"
for i in `cat /tmp/userlist` ; do
    ## not an LDAP user?   
    if  $phpcmd $occcmd ldap:check-user "$i" | grep "not" 2>/dev/null >/dev/null ; then
        # not a local user?
        if ! $phpcmd $occcmd user:info "$i" 2>/dev/null >/dev/null ; then
            ## then add him to the list
            echo "$i" >> $homelist
        fi
        ## echo one byte   
        echo -n "x"
    else
        ## echo one byte   
        echo -n "."
    fi
done | pv -s `cat /tmp/userlist | wc -l` > /dev/null

### Zeige, frage und lösche alle User, die scheinbar noch Dateien in der Nextcloud haben
echo -n "Users in $homelist, deren Home gelöscht werden könnte $data: "
if [ -s $homelist ]; then  
    cat $homelist | paste -s -d " "
    [[ -n $simulate ]] && echo "SIMULATION: würde in keinem Fall etwas löschen!"
    echo "Sollen diese User per rm -rf $data/<user> gelöscht werden? yes/NO"
    read
    if [ "x$REPLY" = "xyes" ] ; then
        for i in `cat $homelist`; do
            $simulate rm -rf $data/$i
        done
    fi
else
    echo "keine"
fi

exit 0
rm /tmp/zuloeschendeuser   
rm /tmp/userlist
rm $homelist

1 „Gefällt mir“

Hallo Tobias,
ich habe Dein Script gerade ausprobiert … zunächst sieht alles gut aus:

Users scheinbar nicht mehr im LDAP:
<Liste aller Logins, die bereits unter attic gelistet sind>

aber dann erscheint:

00  0:00:09 [0,00 /s] [>>>              ]  0% ETA 0:30:0

Welcher Prozess ist das? Und warum sollte das eine halbe Stunde dauern? :thinking:
Ich hab’s vorerst abgebrochen …
Viele Grüße,
Michael

[… etwas später…]
Ich habe die Zahlen nochmal geprüft: bei uns sind > 600 User im attic und könnten nun auch von der Nextcloud gelöscht werden. Vom v7-Server wurden sie bereits entfernt. Es ist offenbar so, dass der Prozess ldap:check-user in dem Script etwas länger dauert und es in der Summe bei so vielen Usern daher schon mal etwas dauern kann.

Es ist aber noch eine andere Frage aufgetaucht:
Wenn man nur den Befehl occ ldap:show-remnants verwendet, erhält man ja eine sehr detaillierte Tabelle, von der die letzte Spalte Sharer lautet.

Bei den meisten Usern steht da ein N (No) aber wie geht ihr vor, wenn da ein Y (Yes) auftaucht? Es könnte ja sein, dass der Login dann z.B. einem Kollegen gehörte, der in den Ruhestand gegangen ist, doch der kurz vorher noch ein paar Dateien mit den Kollegen geteilt hat. Ich weiß nicht, was in diesen Fällen mit den geteilten Ordnern/Dateien geschieht und erst recht nicht, wie das bei den Usern aussieht, mit denen die Dateien/Ordner geteilt wurden?
Habt ihr diesen Fall einmal durchgespielt?

Ich zögere aus diesem Grund noch, das Script einfach laufen zu lassen…

Viele Grüße,
Michael

Ja, das haben wir immer vorher bedacht - und die Daten umgezogen - oder hinnehmen, dass sie weg sind.
Ordner, der „Old Surehand“ gehört und mit Winnetou und Hatschi geteilt wurde, verschwindet halt aus der Sicht und Greifbarkeit von Winnetou und Hatschi, wenn Old Surehand in Rente geht und rausgekickt wird.

Ist halt so. Es ging bisher immer insofern gut, als dass die Kollegen wussten, dass es relevante Daten von Kollege X gibt, der demnächst nicht mehr da ist.

Hallo @Tobias,
ok – Dein Script läuft jetzt:

...
: The specified user was deleted
: The specified user was deleted
...

:+1:

Ok – sehr gut, wenn es so einfach ist … es hätte ja auch in einem dead-Link enden können. :thinking:

[… und noch etwas später …]
Ok – es ist sauber durchgelaufen. Die Dateileichen sind jetzt entfernt und es ist kein User mehr da, den es nicht auch im LDAP gibt. Super!
Dazu noch ein
sudo -u www-data php occ trashbin:cleanup --all-users
und die Mülleimer aller User sind auch gleich entleert.
Hat Platz gebracht :+1:

Viele Grüße,
Michael

1 „Gefällt mir“