agnoxy Kellene rendes rendszerfrissítés funkció is.
De nem abba.
Megcsináltam, de az nem a systemback.sh része.
Íme, maga a szkript:
#!/bin/bash
notify_users()
{
typeset title="$1"
typeset message="$2"
who | grep "(:" | while IFS=" " read -r name tty date ltime cons
do
uid=$(id -u $name)
sudo -u $name env XDG_RUNTIME_DIR=/run/user/$(id -u $name) notify-send -a Updater -i dialog-warning "$title" "$message"
done
}
notifyneedrestart()
{
who | grep "(:" | while IFS=" " read -r name tty date ltime cons
do
uid=$(id -u $name)
kernelupd=$(grep "Running kernel seems to be up-to-date" < /tmp/nr.txt)
deferred=$(grep "Service restarts being deferred" < /tmp/nr.txt )
oldrunning=$(grep "$name.*user manager" < /tmp/nr.txt | sed 's/.*: //')
oldrunning2=$(grep "$name.*session" < /tmp/nr.txt | sed 's/.*: //')
message=""
title="Updater"
##user manager: systemd - akkor reboot kell
if [ -n "$oldrunning" ] || [ -n "$oldrunning2" ]; then
title="Ki- / bejelentkezés szükséges lehet!"
message="<b>A munkamenetedben bizonyos frissített programok régebbi példánya(i) futnak:</b>\nUser manager: $oldrunning\nSession: $oldrunning2\n<i>Kérlek, ha tudsz, gondoskodj a folyamatok újraindításáról, esetleg fontold meg a ki- és bejelentkezést egy erre kényelmes időben, hogy azok a folyamatok is újraindulhassanak, amik a munkameneted lezárása nélkül nem tudnak!</i>\nA rendszer teljes újraindítása is megfelelő, de nem szükséges."
fi
if [ -n "$deferred" ]; then
title="Újraindítás szükséges!"
message="<b>Néhány rendszerszolgáltatás programja frissítve lett, és most a régebbi példánya(i) fut(nak).</b>\nHogy a frissebb változatok működjenek, a teljes rendszert újra kell indítani!\n<i>Kérlek, fontold meg a rendszer újraindítását egy erre kényelmes időben!</i>"
fi
if [ ! -n "$kernelupd" ]; then
title="Újraindítás szükséges!"
message="<b>Újabb kernel került a rendszerre, a használatbavételéhez a teljes rendszert újra kell indítani!</b>\n<i>Kérlek, fontold meg a rendszer újraindítását egy erre kényelmes időben!</i>"
fi
if [ -n "$message" ]; then
sudo -u $name env XDG_RUNTIME_DIR=/run/user/$(id -u $name) notify-send -a Updater -i dialog-warning -t 14000 --urgency=critical "$title" "$message"
fi
done
}
echo "Updater script started" | logger
if [ ! -f "/tmp/updating" ]; then
touch /tmp/updating
cnt=0
while [ $cnt -lt 5 ]
do
status=$(ping -c 1 -q debian.org >&/dev/null; echo $?)
if [ ! "$status" == "0" ];
then
echo "No internet for updating, retry in 20 sec." | logger
sleep 20
((cnt++))
else
cnt=6
fi
done
if [ "$status" == "0" ];
then
apt update
updates=$(apt list --upgradeable |& grep -Ev '^(Felsorolás|Listing|WARNING)')
echo $updates
if [ -n "$updates" ]; then
notify_users "Rendszerfrissítés" "Frissítés elindult (visszaállítási pont készül...)"
echo "Systemback snapshot" | logger
/opt/systemback.sh -n
echo "Doing update:" | logger
notify_users "Rendszerfrissítés" "A visszaállítási pont elkészült, a tényleges frissítés most indul...)"
apt upgrade -y | logger
apt autoremove --purge -y
notify_users "Rendszerfrissítés" "Frissítés készen van."
fi
fi
needrestart -r a -u NeedRestart::UI::stdio >/tmp/nr.txt
cat /tmp/nr.txt | logger
notifyneedrestart
rm /tmp/nr.txt
rm /tmp/updating
fi
echo "Updater script finished" | logger
Kell hozzá notify-send, meg a needrestart.
Ja, meg maga a systemback.sh, mert a tényleges frissítés előtt ez csináltat egy visszaállítási pontot.
Az automatizálást meg a systemd-re bíztam, a /etc/systemd/system/updater.timer tartalma:
[Unit]
Description=Execute task every day
[Timer]
OnCalendar=*-*-* 19:10:00
RandomizedDelaySec=5m
Persistent=true
Unit=updater.service
[Install]
WantedBy=timers.target
Ettől az updater.service minden este 7-kor (vagy később, amikor tud), elindul.
A /etc/systemd/system/updater.service tartalma (ez hivatkozik a fenti szkriptre):
[Unit]
Description=updater service
[Service]
Type=simple
ExecStart=/opt/updater.sh
[Install]
WantedBy=multi-user.target
Vagy az egész hóbelevancot felteheted deb csomagból
Elég modern? 😃