diff --git a/.gitignore b/.gitignore index b48b9ec..cecb15a 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *.TO_BE_DELETED +tmp/ diff --git a/docker-compose.yml b/docker-compose.yml index 5877099..716aa48 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -114,7 +114,8 @@ services: max-file: "5" nextcloud-cron-v1: - image: nextcloud:32.0.1-fpm + # image: nextcloud:32.0.1-fpm + image: nextcloud:32.0.2-fpm container_name: nextcloud-cron-v1 restart: unless-stopped entrypoint: /cron.sh diff --git a/tools/nextcloud_quotacheck.sh b/tools/nextcloud_quotacheck.sh new file mode 100755 index 0000000..b4d4bc1 --- /dev/null +++ b/tools/nextcloud_quotacheck.sh @@ -0,0 +1,78 @@ +#!/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."