Użytkownik:Borzole/yum-zupdate

Z Fedora Wiki

#!/bin/bash
#
# by borzole.one.pl
# VERSION = 2010.01.01 22:29
# ------------------------------------------------------------------------------
# yum-zupdate - instalator aktualizacji
#
# Skrypt udaje "demona" więc wystarczy go uruchomić raz przy starcie.
# Uruchomienia z usera daje połowiczny efekt: raz że nie zrobi updatu bazy, dwa wyświetli lecz nie zaktualizuje niczego
# Aby był w pełni funkcjonalny należy go uruchomić jako root. 
# Na końcu pliku  "/etc/rc.d/rc.local" dodać wpis tej postaci
#
# 		/usr/local/sbin/yum-zupdate &
#
# UWAGA! koniecznie umieść znak "&", by skrypt przeszedł "w tło", inaczej nie uruchomisz systemu
#
# można skorygować czas sprawdzania aktualizacji podając go jako parametr w sekundach
# PRZYKŁAD: 20min (1200 sekund)
# 		
#		/usr/local/sbin/yum-zupdate 1200 &
#
# ------------------------------------------------------------------------------
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
# ------------------------------------------------------------------------------
# czas w sekundach co ile ma być uruchamiany demon (1800 = 30 minut)
CHECKTIME=${1:-1800}
# ikona
ICON="/usr/local/share/icons/yum-zupdate.svg"
# powiadomienia
TITLE="Dostępne są aktualizacje !"
# powiadomienie (to samo, tylko formatowanie nawala)
MESSAGE="Aktualizacja systemu w toku!
Nie wyłączaj komputera!"
# ------------------------------------------------------------------------------
# czcionka: (N)ORMAL, (X)BOLD, (R)ED, (G)REEN, (B)LUE
N="\e[0m" 
X="\e[1;38m" 
r="\e[0;31m"
R="\e[1;31m"
g="\e[0;32m"
G="\e[1;32m"
b="\e[0;34m"
B="\e[1;34m"
# ------------------------------------------------------------------------------
wymaga(){
	# sprawdza zależności skryptu 
	# np.
	# 		wymaga wget zenity notify-send
	for apps in "$@" ; do
		which ${apps} >/dev/null 2>&1
		if [ $? != 0 ] ; then
			echo -e "${R}[ ERROR ] Nie znaleziono programu \"$apps\""
			echo -e "${G}Spróbuj zainstalować:"
			echo -e "\tsu -c'yum install $apps'"
			echo -e "a jeśli zawiedzie, to spróbuj odnaleźć paczkę dostarczającą wymaganą zależność:"
			echo -e "\tsu -c'yum provides \\*bin/$apps'"
			exit 1;
		fi
	done
}
# ------------------------------------------------------------------------------
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 "${R}[ wychodzę ]${N} plik blokujący skryptu istnieje: $LOCK_SCRIPT"
		exit 0 
	else
		echo -e "${B}[ uruchamiam ]${N} 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 "${B}[ zakonczono ]${N} usuwam plik blokujący skryptu: $LOCK_SCRIPT" 
}
# ------------------------------------------------------------------------------
menu_update(){
	# wyświetla menu do zaznaczeniem, które pakiety zaktualizować
	zenity --title "$TITLE" --text "$INFO" --window-icon $ICON \
		--width=600 --height=500 \
		--list  --checklist \
		--column="zaznacz" --column "rpm" --column "wersja" --column "repo" \
		$(echo "$CURRENT" | xargs -i echo TRUE '{}' ) \
		--separator " "  --multiple \
		--print-column=2
}
# ------------------------------------------------------------------------------
run_update(){
	# wyskakujące powiadomienie
	notify-send --urgency critical --expire-time 4000 --icon $ICON "$TITLE" "$INFO" &
	# ikona w schowku
	zenity --notification --window-icon $ICON --text "$INFO"
	# jeśli kliknięto ikonę
	if [ $? == 0 ] ; then
		# wynikiem jest lista progrmów do aktualizacji
		YUMUPDATE=$(menu_update)
		if [ $? == 0 ] ;then
			# nieklikalna ikona w schowku z informacją, że update trwa
			exec 4> >(zenity --notification --listen --window-icon $ICON )
			echo "tooltip:$MESSAGE" >&4
			echo "message:$MESSAGE" >&4
			# wykonuje aktualizację
			yum update -y $YUMUPDATE
			# powiadomienie o wyniku
			if [ $? == 0 ] ;then
				YUMUPDATE_N=$( echo $YUMUPDATE | sed -e 's/\ \ */\n/g' )
				echo -e "$YUMUPDATE_N" | zenity --text-info --title="Zakończono aktualizacje!"
			else
				zenity --warning --title="$TITLE" --text="<b>Wystąpiły pewne problemy!</b>"
			fi
			# zamknięcie ikony w schowku
			exec 4>&-
		fi
	fi
	# KONIEC
}
# ------------------------------------------------------------------------------
main(){
	# sprawdza aktualizacje
	CURRENT=$(yum check-update -q 2>/dev/null | grep -iv error)
	if [ "$CURRENT" != '' ] ; then
		ILE=$( echo -n "$CURRENT" | wc -l )
		INFO="Ilość aktualizacji: $ILE"
		echo -e $INFO
		run_update
	fi
}
# ------------------------------------------------------------------------------
demon(){
	# dzięki temu będzie chodził w kółko
	echo -e  " -- uruchamiam demona: '${0##*/}' [ $(date +%Y.%m.%d\ %H:%M) ] --"
	main
	echo -e  " -- demon uśpiony na $CHECKTIME sekund -- "
	sleep $CHECKTIME
	demon
}
# ------------------------------------------------------------------------------
wymaga yum zenity notify-send
lock_script
trap unlock_script EXIT
demon