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