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...