#!/bin/bash
#
# diskused - komunikat o przekroczeniu ustalonej zajętość dysku
# źródło: http://www.cyberciti.biz/faq/mac-osx-unix-get-an-alert-when-my-disk-is-full/
# rozbudowany by borzole.one.pl
#
# wymaga paczek: sed, zenity, notify-send
#
# PRZYKŁAD:
# - uruchomienie z domyślnym progiem zajętości
# diskused
# - uruchomienie z progiem 22%
# diskused 22
# ------------------------------------------------------------------------------
export DISPLAY=:0.0
export LANG=pl_PL.UTF-8
export PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
# ------------------------------------------------------------------------------
# pełne ścieżki do programów
ZENITY="/usr/bin/zenity"
NOTIFY="/usr/bin/notify-send"
# próg zajętości w % (musi być poniżej 100)
# domyślnie jest 80%, ale można też przekazać jako parametr do skryptu
THRESHOLD=${1:-80}
# ------------------------------------------------------------------------------
lock_script(){
# gdy chcemy mieć uruchomioną tylko jedną jego kopie
LOCK_SCRIPT="/tmp/lock_script_${0##*/}.pid"
if [ -f $LOCK_SCRIPT ] ; then
# jeśli spróbujemy uruchomić drugą kopię skryptu:
echo -e "[ wychodzę ] plik blokujący skryptu istnieje: $LOCK_SCRIPT"
exit 0
else
echo -e "[ uruchamiam ] tworzę plik blokujący skryptu: $LOCK_SCRIPT"
# zawartość pliku blokującego jest mało istotna, ważne by istniał
echo $$ > $LOCK_SCRIPT
fi
}
# ------------------------------------------------------------------------------
unlock_script(){
# mimo, że jest to jedno polecenie to zróbmy funkcję
# nieszczęściem by było usunąć niewłaściwy plik
# a tak minimalizujemy prawdomodobieństwo błędu
rm -f $LOCK_SCRIPT
echo -e "[ zakonczono ] usuwam plik blokujący skryptu: $LOCK_SCRIPT"
}
# ------------------------------------------------------------------------------
_msg(){
# wyskakujące okienko z powiadomieniem
$NOTIFY --urgency critical --expire-time 4000 --icon messagebox_critical "$TITLE" "$INFO"
# ikona zenity w zasobniku
$ZENITY --notification --window-icon "warning" --text "$INFO"
# DEBUG - parametr $? określa kod wyjścia programu
# echo $? | $ZENITY --text-info
# po kliknięciu na ikonę (kod wyjścia 0) dostaniemy pełne okienko z informacją
if [ $? == 0 ] ; then
$ZENITY --warning --title "$TITLE" --text "$INFOLONG"
fi
}
# ------------------------------------------------------------------------------
_add_msg(){
SHOWMSG=TRUE
# treść powiadomienia
INFO+="
partycja [ $FS ] zajęta w $CURRENT% "
}
# ------------------------------------------------------------------------------
_check_disk(){
# punkt montowania partycji
FS="$1"
OUTPUT=($(LC_ALL=C df -P ${FS}))
# stan naszej partycji
CURRENT=$(echo ${OUTPUT[11]} | sed 's/%//')
# warunek decydujący o powiadomieniu
[ $CURRENT -gt $THRESHOLD ] && _add_msg
}
# ------------------------------------------------------------------------------
# zapewnij pojedyńcze uruchomienie
lock_script
# usuń plik blokujący nawet przy nieprzewidzianym wyjściu
trap unlock_script EXIT
# załaduj do tablicy listę zamontowanych partycji
MOUNTED=( $(df -l | awk -F"% " '{print $2}' | grep -v '/dev/shm') )
# sprawdź każdą partycję
for p in "${MOUNTED[@]}" ; do
_check_disk $p
done
# jeśli próg został przekroczony to wyświetl powiadomienie
if [ "$SHOWMSG" == "TRUE" ] ; then
TITLE="Mało miejsca na dysku!"
INFOLONG="Przekroczono ustalony próg $THRESHOLD% zajętości partycji !
usuń kilka plików zanim zrobi się za ciasno!\n$INFO"
_msg
fi