Aktionen

Seafile Server - inaktive LDAP Benutzer finden - inactive LDAPUsers

Aus znilwiki

Bei einem Kunden wurden die Benutzer durch Gruppenzugehörigkeit zu Seafile-Benutzern. Oder eben nicht mehr.
Die ehemaligen sollten automatisch gelöscht werden - was ich über die API realisiert habe.
Blieb das Ausgangsproblem - wie bekomme ich die inaktiven Benutzer heraus? Die API zeigt mir nur die aktiven.

Die Lösung war eine direkte Abfrage der Datenbank auf dem Seafile-Server:

MYSQL_PWD=seafile mysql -useafile ccnet-db -ss -e "select email from LDAPUsers where is_active=0;"

Erklärung:

MYSQL_PWD=seafile       Passwort des Datenbankbenutzers. Diese Methode unterdrückt die Warnmeldungen durch MySQL
mysql                   Aufruf der MySQL Console
-useafile               der Datenbankbenutzer "seafile"
ccnet-db                Datenbank mit den Benutzern
-ss                     Kopfzeilen und Rahmen etc. weglassen
-e "..."                das SQL-Statement



Script

Mit diesem Script lösche ich die Benutzer nach 14 Tagen Inaktivität, das Script läuft lokal auf dem Seafile-Server:

#!/bin/bash
#
# Alte LDAP-Benutzer aus Seafile löschen
#
# 2018 znil.net - Bernhard Linz - Bernhard@znil.de
#

# Zeitraum nachdem ein Account gelöscht werden soll in Sekunden
deleteAfterSeconds=1209600

# Zugangsdaten zur lokalen ccnet-db von Seafile
dbUser="seafile"
dbPassword="seafile"

# URL für API-Aufruf
apiUrl="https://localhost/api2"
# Benutzer für API-Aufruf
apiUser="api@test.com"
# Passwort des Benutzers
apiPassword="SecretPassword"

# Pfad des Ordner Users
UserFolder="/home/seafile/haiwen/scripts/users"
#######################################################
# Funktionen

function displaytime {
  local T=$1
  local D=$((T/60/60/24))
  local H=$((T/60/60%24))
  local M=$((T/60%60))
  local S=$((T%60))
  (( $D > 0 )) && printf '%d days ' $D
  (( $H > 0 )) && printf '%d hours ' $H
  (( $M > 0 )) && printf '%d minutes ' $M
  (( $D > 0 || $H > 0 || $M > 0 )) && printf 'and '
  printf '%d seconds\n' $S
}

#######################################################
# Ggf. Benutzerverzeichnis anlegen
mkdir -p $UserFolder

# Abfrage der inaktiven Benutzer aus der Datenbank
InActiveUser=($(MYSQL_PWD=$dbPassword mysql -u$dbUser ccnet-db -ss -e "select email from LDAPUsers where is_active=0;"))

# $InActiveUser ist nun ein Array welches die Email-Adressen aller inaktiven Benutzer enthält

#Diese arbeiten wir nun nacheinander ab
echo "Schritt 1: Setze Benutzer ggf. auf Merkliste"
echo "--------------------------------------------"
for (( i=0; i < ${#InActiveUser[*]}; i++ )); do
    echo "Prüfe Benutzer ${InActiveUser[$i]//[$'\t\r\n']} ..."
    # Für jeden gefundenen Benutzer legen wir im Unterverzeichnis "users" eine Datei an.
    # Aber nur wenn es diese noch nicht gibt. Über das Änderungsdatum der Datei kriegen wir raus
    # wie alte diese ist. Bei mehr als x Sekunden (14 Tage) wissen wir das wir den Benutzer löschen können
    if [ -e "$UserFolder/${InActiveUser[$i]}" ]; then
        echo "Benutzer schon auf Merkliste!"
    else
        echo "Setze Benutzer auf Merkliste"
        touch "$UserFolder/${InActiveUser[$i]}"
    fi
done
echo " "
echo "Schritt 2: Prüfe wie lange die Benutzer auf der Merkliste sind"
echo "--------------------------------------------------------------"
CurrentTimeUnixtime=$(date +%s)
#echo "CurrentTimeUnixtime = $CurrentTimeUnixtime"
DeleteAfterDisplay=$(displaytime $deleteAfterSeconds)
echo "Referenzwert ist: $DeleteAfterDisplay"
echo " "
for (( i=0; i < ${#InActiveUser[*]}; i++ )); do
    # Teste ob die Zeit abgelaufen ist, dazu errechnen wir aus dem Änderungsdatum und dem aktuellen Datum
    # das Alter der Datei und vergleichen es mit dem Referenzwert $deleteAfterSeconds"
    FileAgeUnixtime=$(stat -c %Y $UserFolder/${InActiveUser[$i]})
    #echo "FileAgeUnixtime =  $FileAgeUnixtime"
    FileAgeSeconds=$((CurrentTimeUnixtime-FileAgeUnixtime))
    FileAgeDisplay=$(displaytime $FileAgeSeconds)
    echo "${InActiveUser[$i]} : $FileAgeDisplay"
    if [ "$FileAgeSeconds" -gt "$deleteAfterSeconds" ]; then
        echo "Zeit ist überschritten, Benutzer wird gelöscht"
        # Anmeldetoken holen
        tempvar=$(curl -k -d "username=$apiUser&password=$apiPassword" $apiUrl/auth-token/)
        MyToken=$(echo $tempvar | jq -r '.token')
        echo "Token ist: $MyToken"
        tempvar=$(curl -k -X DELETE -H "Authorization: Token $MyToken" -H 'Accept: application/json; indent=4' $apiUrl/accounts/${InActiveUser[$i]}/)
        echo $tempvar
        # Merkdatei wieder löschen
        rm -f "$UserFolder/${InActiveUser[$i]}"
    else
        echo "Nichts zu tun"
    fi
done

Kommentare

Loading comments...