#!/bin/bash set -euo pipefail readonly CONTAINER_NAME="nextcloud-fpm-v1" readonly OCC_CMD="docker exec --user www-data $CONTAINER_NAME php occ" readonly THRESHOLD=95 readonly SENDER_EMAIL="knusperkerne@posteo.de" USERS=$($OCC_CMD user:list | awk '{print $2}' | tr -d :) for USER in $USERS; do EMAIL=$($OCC_CMD user:info "$USER" 2>/dev/null | grep -i "email:" \ | head -n 1 | sed -E 's/.*email: (.*)/\1/' | tr -d '[:space:]') # Falls die E-Mail ein "null" String oder leer ist if [[ -z "$EMAIL" ]] || [[ "$EMAIL" == "null" ]]; then echo "Skipping $USER: No valid email found in occ user:info." continue fi if [ -z "$EMAIL" ] || [ "$EMAIL" == "null" ]; then echo "Skipping $USER: No valid email found." continue fi QUOTA_RAW=$($OCC_CMD user:setting "$USER" files quota 2>/dev/null) || true # Falls Quota auf 'none', leer oder Fehlermeldung if [[ -z "$QUOTA_RAW" ]] || [[ "$QUOTA_RAW" == "none" ]] \ || [[ "$QUOTA_RAW" =~ "not exist" ]]; then echo "Skipping $USER: No quota defined (none/default)." continue fi # convert quota into bytes CLEAN_VALUE=$(echo "$QUOTA_RAW" | grep -oP '^[0-9]+') CLEAN_UNIT=$(echo "$QUOTA_RAW" | grep -oP '[a-zA-Z]' | head -n 1 | tr '[:lower:]' '[:upper:]') if [[ -z "$CLEAN_UNIT" ]]; then QUOTA_BYTES=$CLEAN_VALUE else # numfmt versteht "50G", "2M" etc. QUOTA_BYTES=$(numfmt --from=iec "${CLEAN_VALUE}${CLEAN_UNIT}") fi USED_BYTES=$(docker exec $CONTAINER_NAME \ du -sb /var/www/html/data/"$USER"/files 2>/dev/null \ | awk '{print $1}') USED_BYTES=${USED_BYTES:-0} if [ "$QUOTA_BYTES" -gt 0 ]; then PERCENT=$(( 100 * USED_BYTES / QUOTA_BYTES )) if [ "$PERCENT" -ge "$THRESHOLD" ]; then echo "WARNUNG: $USER ist bei $PERCENT% ($EMAIL)" { printf "Hallo %s,\n\n" "$USER" printf "Dein Nextcloud-Speicher ist zu %s%% voll.\n\n" \ "$PERCENT" printf "Belegt: %s von %s.\n\n" \ "$(numfmt --to=iec $USED_BYTES)" "$QUOTA_RAW" printf "Bitte lösche nicht mehr benötigte Dateien." } \ | mailx -s "Nextcloud-Speicherwarnung ($PERCENT%)" -r "$SENDER_EMAIL" "$EMAIL" else echo "Quota usage for $USER is OK" fi fi done echo "Done."