Użytkownik:Borzole/diskused

Z Fedora Wiki

#!/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