Benutzer-Werkzeuge

Webseiten-Werkzeuge


 [[anwenderwiki:owncloud:schuljahreswechsel]] 

Schuljahreswechsel nextcloud: Alte Benutzer löschen

Wer seine Owncloud/Nextcloud an das LDAP angeschlossen hat, der verliert z.B. nach einem Schuljahreswechsel Schüler und auch Lehrer. Wer diese „Karteileichen“ vermeiden will, der kann folgende Prozedur durchlaufen:

  1. Backup machen
  2. Nicht verwendete Accounts anzeigen und durchgehen
  3. vorsichtig folgendes Skript laufen lassen oder Benutzer manuell löschen

Backup machen

Hier gibt es eine gute Beschreibung, was man machen kann. Wer einen Cloud-server virtualisiert hat, kann auch diesen backupen.

Alle Accounts löschen, die nicht mehr in LDAP sind

  1. Der Pfad zur Owncloud/Nextcloud-installation (hier: /opt/nextcloud) muss angepasst werden.
  2. Der Pfad zu Owncloud/Nextcloud-Daten (hier: /owncloud-data) muss angepasst werden.

(danke @max, der https://ask.linuxmuster.net/t/own-nextcloud-userpflege-automatisch-funktioniert-nicht-selfmade/754 das Verfahren dokumentiert hat, inkl. der Problematik irgendwo zw. Nextcloud 11 und 12, ab Nextcloud 13 funktioniert es wieder):

Alle User überprüfen

Nun habe ich das owncloud-datenverzeichnis (bei mir /owncloud-data) in eine liste gepackt, meines Erachtens die einzige Möglichkeit, alle Nutzernamen zu bekommen:

ls /owncloud-data/ | grep -v "\." > /tmp/userlist

und dann den check-user-Befehl drauf losgelassen:

for i in `cat /tmp/userlist` ; do sudo -u www-data php /opt/nextcloud/occ ldap:check-user "$i"; done

Das findet nochmal alle die User, die bisher noch als vorhanden geglaubt wurden.

Noch nicht gelöschte Accounts anzeigen

Auf dem Cloudserver folgender Befehl zeigt alle nicht (mehr) in LDAP gefunden User an:

sudo -u www-data php /opt/nextcloud/occ ldap:show-remnants

Bei mir erscheinen hier auch viele Computerkonten, wenn es die Computer nicht mehr bei linuxmuster.net gibt. z.B:

root@cleese:~# sudo -u www-data php /opt/nextcloud/occ ldap:show-remnants
+---------------+--------------------+---------------+---------+---------------+-----+--------+
| ownCloud name | Display Name       | LDAP UID      | LDAP DN | Last Login    | Dir | Sharer |
+---------------+--------------------+---------------+---------+---------------+-----+--------+
| lzdisplay01   |                    |               |         | -             |     | N      |
| lzdisplay02   |                    |               |         | -             |     | N      |
| lzlaptop01    |                    |               |         | -             |     | N      |
| test          |                    |               |         | -             |     | N      |
| zztop         |                    |               |         | -             |     | N      |
+---------------+--------------------+---------------+---------+---------------+-----+--------+

Zudem: Achtung, manchmal findet `ldap:show-remnants` auch zu viele Nutzer, also auch Nutzer, die noch in LDAP sind. Das kann passieren, wenn man zuvor z.B. alle Nutzer aus LDAP ausgeblendet hat, oder zu einem Abfragezeitpunkt LDAP nicht kontaktiert werden konnte. Dann denkt ein Cache, dass der LDAP-User nicht drin ist. Ein check-user (siehe oben) überprüft aber tatsächlich, ob der User in LDAP ist.

Accounts manuell löschen

Die mit ldap:show-remnants angezeigten Accounts kann man nun händisch löschen.

Achtung

Natürlich werden alle Daten der Karteileichen entfernt. Wenn also dem ehemaligen Benutzer Daten gehören, die er/sie geteilt hat und die andere noch sehen konnten, so sind diese nach dieser Löschung spätestens verschwunden.

sudo -u www-data php /opt/nextcloud/occ user:delete zztop

Accounts per Skript löschen

Mit folgendem Skript landen alle zu loeschenden User in einer Zwischendatei in /tmp/zuloeschendeuser, die man sich anschauen kann und sollte:

sudo -u www-data php /opt/nextcloud/occ ldap:show-remnants  | awk '{print $2}' | sed "2d;/^\s*$/d" > /tmp/zuloeschendeuser

bevor man mit dem zweiten Befehl die User tatsächlich löscht.

for i in `cat /tmp/zuloeschendeuser`; do echo sudo -u www-data php /opt/nextcloud/occ user:delete "$i"; done
Achtung, dieser Befehl zeigt nur an was getan wird. Für das richtige Löschen, entferne man das „echo“ aus der Zeile.

Komplettes Skript vom Server aus

Achtung, folgendes Skript testet, ob der der server auch „server“ heißt. Ebenso heißt der Server auf dem nextcloud läuft „cleese“. Ebenso müssen die Lage der installation und der Daten angepasst werden. Das Skript löscht zudem (nach Entfernen von echo im Befehl echo rm -rf) auch noch User, die nicht mehr in der Datenbank sind, aber noch auf der Platte ein Verzeichnis haben (passierte bei mir vermutlich während Nextcloud 12-13).
update_clouddata.sh
#!/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                                                                                            
 
## no command line arguments: 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
 [[anwenderwiki:owncloud:schuljahreswechsel]] anwenderwiki/owncloud/schuljahreswechsel.txt · Zuletzt geändert: 2023/09/10 16:24 von tobias