#!/bin/bash

# Skrypt diskhogs do analizy limitów miejsca na dysku w systemie Unix.
# Przyjęte jest założenie, że konta użytkowników mają identyfikatory
# UID >= 100. Skrypt wysyła wiadomości e-mail do wszystkich użytkowników,
# którzy przekroczyli limit, oraz wyświetla podsumowanie.

MAXDISKUSAGE=1
violators="/tmp/diskhogs0.$$"

trap "`which rm` -f $violators" 0

for name in $(cut -d: -f1,3 /etc/passwd | awk -F: '$2 > 99 { print $1 }')
do
  echo -n "$name "
  # Może być konieczna modyfikacja poniższej listy katalogów,
  # odpowiednio do ich struktury na dysku. Najbardziej prawdopodobna
  # jest zamiana /Users na /home.
  find / /usr /var /Users -xdev -user $name -type f -ls | \
      awk '{ sum += $7 } END { print sum / (1024*1024) }'

done | awk "\$2 > $MAXDISKUSAGE { print \$0 }" > $violators

if [ ! -s $violators ] ; then
  echo "Żaden użytkownik nie przekroczył limitu ${MAXDISKUSAGE} MB."
  cat $violators
  exit 0
fi

while read account usage ; do

cat << EOF | fmt | mail -s "Uwaga: przekroczyłeś limit miejsca na dysku." $account
Zajmujesz ${usage}MB miejsca na dysku, a możesz maksymalnie ${MAXDISKUSAGE} MB.
Musisz więc usunąć część swoich plików, skompresować je (użyj doskonałych i
prostych w obsłudze programów 'gzip' or 'bzip2'), albo zwrócić się do nas
z prośbą o zwiększenie limitu.

Administrator
EOF

echo "Użytkownik $account zajmuje $usage MB miejsca na dysku. Upomnienie wysłane."

done < $violators

exit 0
