add quota checker
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
*.TO_BE_DELETED
|
*.TO_BE_DELETED
|
||||||
|
tmp/
|
||||||
|
|||||||
@@ -114,7 +114,8 @@ services:
|
|||||||
max-file: "5"
|
max-file: "5"
|
||||||
|
|
||||||
nextcloud-cron-v1:
|
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
|
container_name: nextcloud-cron-v1
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
entrypoint: /cron.sh
|
entrypoint: /cron.sh
|
||||||
|
|||||||
78
tools/nextcloud_quotacheck.sh
Executable file
78
tools/nextcloud_quotacheck.sh
Executable file
@@ -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."
|
||||||
Reference in New Issue
Block a user