Benutzer-Werkzeuge

Webseiten-Werkzeuge


run_kernel_remover.sh

Inhaltsverzeichnis

Grafisches Dialogscript für den KDE Desktop (kdialog) zum löschen alter Kernelversionen. Aktuell kann nur ein Kernel pro Aufruf gelöscht werden.

Im Script werden die installierten Kernelversionen in einer Auswahlbox zur Löschung aufgelistet. Der aktuell laufende Kernel wird angezeigt, kann aber nicht gelöscht werden (siehe dazu auch Screenshot 1).

Im zweiten Schritt wird das Passwort des Benutzers abgefragt, der natürlich die entsprechenden Systemverwalterrechte besitzen muss (siehe Screenshot 2). Ab hier wird eine Fortschrittsanzeige angezeigt um den weiteren Scriptablauf optisch aufzuwerten.

Wurde das Passwort korrekt eingegeben erscheint eine Dialogbox (Screenshot 3) der nochmals eine Sicherheitsabfrage stellt mit einer Abbruchmöglichkeit. Bestätigt man die Löschung der ausgewählten Kernelversion it dem Button Ja, dann wird im Hintergrund die Kernelversion gelöscht.

Das Ergebnis (positiv oder negativ) der Deinstalltion der ausgewählten Kernelversion wird in einem Passiv-Popup dem Anwender angezeigt. Der Scriptlauf wird in einem Logfile protokolliert unter /tmp/run_kernel_remover.log und /tmp/run_kernel_remover.log.<JJJJMMTT-SSMMss>.


Screenshots

Kernelremover 01

Kernelremover 02

Kernelremover 03


Scriptlisting

run_kernel_remover.sh
#!/bin/bash
#
# Version: 20210520
#
#######################
#  Variablenbelegung
#######################
#
TIME_STAMP=$(date '+%Y%m%d-%H%M%S')
USER_TMP_DIR="/home/$USER/tmp"
LOGFILE_PURGE="$USER_TMP_DIR/run_kernel_remover.log"
LOGFILE_KERNEL_LIST="$USER_TMP_DIR/kernel_list.txt"
KERNEL_ACTUAL=$(uname -r|awk -F"-" '{print $1"-"$2}')
KERNEL_MAJOR_VERSION=$(uname -r|awk -F"." '{print $1"."$2}')
#
#
################
#  Funktionen
################
#
#
show_passive_popup_button_push()
{
	if [ "$1" = "0" ]
		then
		echo "[$(date '+%H:%M:%S')] DEL_DIALOG YES=$1" >> $LOGFILE_PURGE
	elif [ "$1" = "1" ]
		then
		echo "[$(date '+%H:%M:%S')] DEL_DIALOG NO=$1" >> $LOGFILE_PURGE
		kdialog --passivepopup "[Kernel Remover]\nKernel $KERNEL_SELECTION konnte nicht gelöscht werden, da Button NEIN gedrückt wurde!" 5
		close_progressbar
		del_log
		exit 3
	elif [ "$1" = "2" ]
		then
		echo "[$(date '+%H:%M:%S')] DEL_DIALOG CANCEL=$1" >> $LOGFILE_PURGE
		kdialog --passivepopup "[Kernel Remover]\nKernel $KERNEL_SELECTION konnte nicht gelöscht werden, da Button ABBRECHEN gedrückt wurde!" 5
		close_progressbar
		del_log
		exit 4
	fi
}
 
 
show_passive_popup_kernel_del()
{
	if [ "$1" = "0" ]
		then
		echo "[$(date '+%H:%M:%S')] PURGE RC="$1 >> $LOGFILE_PURGE
		kdialog --passivepopup "[Kernel Remover]\nKernel $KERNEL_SELECTION konnte erfolgreich gelöscht werden" 5
	elif [ "$1" != "0" ]
		then
		echo "[$(date '+%H:%M:%S')] PURGE RC="$1 >> $LOGFILE_PURGE
		kdialog --passivepopup "[Kernel Remover]\nAchtung, Kernel $KERNEL_SELECTION konnte nicht gelöscht werden!" 5
	fi
}
 
 
show_passive_popup_pwd()
{
	if [ "$PASSWD_DIALOG_CHECK" = "1" ]
		then
		kdialog --passivepopup "[Kernel Remover]\nAchtung, Abbruch da im Passwortdialog der Button ABBRECHEN gedrückt wurde!" 5
	elif [ "$PWD_CHECK" = "1" ]
		then
		kdialog --passivepopup "[Kernel Remover]\nAchtung, Abbruch da das Passwort (sudo) falsch eingegeben wurde!" 5
	fi
}
 
 
init_progressbar()
{
	# initieren der Fortschrittsanzeige
	progress=$(kdialog --title "Kernel-Remover" --progressbar "Ausgewählte alte Kernelpakete löschen" 4)
	qdbus $progress showCancelButton false
}
 
 
run_progressbar()
{
	# Fortschrittsanzeige aktualisieren bei jedem Schritt
	VALUE="$1"
	TEXT="$2"
	qdbus $progress Set "" value $VALUE > /dev/null
	qdbus $progress setLabelText "$VALUE. Schritt:   $TEXT" > /dev/null
}
 
 
close_progressbar()
{
	# Fortschrittsanzeige am Scriptende schließen
	qdbus $progress close > /dev/null
}
 
 
print_timestamp()
{
	# Timestamp (Start und Ende) ins Logfile schreiben
	TS_VALUE=$1
	if [ "$TS_VALUE" = "start" ]
		then
		echo "[$(date '+%H:%M:%S')] ----------------------------------------------- Start -----------------------------------------------" >> $LOGFILE_PURGE
	elif [ "$TS_VALUE" = "end" ]
		then
		echo "[$(date '+%H:%M:%S')] ----------------------------------------------- Ende ------------------------------------------------" >> $LOGFILE_PURGE
	fi
}
 
 
del_log()
{
 # Löschen des Logfiles mit der Kernelliste
 if [ -e "$LOGFILE_KERNEL_LIST" ]
	then
		echo "[$(date '+%H:%M:%S')] DELETE $LOGFILE_KERNEL_LIST" >> $LOGFILE_PURGE
		rm "$LOGFILE_KERNEL_LIST"
	fi
	echo "[$(date '+%H:%M:%S')] cp $LOGFILE_PURGE $LOGFILE_PURGE.$TIME_STAMP" >> $LOGFILE_PURGE
	print_timestamp end
	cp $LOGFILE_PURGE $LOGFILE_PURGE"."$TIME_STAMP
}
 
 
create_log()
{
	# ggf. temporäres tmp Verzeichnis im $HOME erstellen 
	if [ ! -d "$USER_TMP_DIR" ]
		then
		mkdir "$USER_TMP_DIR"
	fi
 
	# Altes Logfile löschen und neues erstellen
	if [ -e "$LOGFILE_PURGE" ]
		then
		rm $LOGFILE_PURGE
		touch $LOGFILE_PURGE
		touch $LOGFILE_KERNEL_LIST
		print_timestamp start
		echo "[$(date '+%H:%M:%S')] Logfile $LOGFILE_INSTALL von User $USER am $(date '+%d.%m.%Y') angelegt (1)" >> $LOGFILE_PURGE
	else
		touch $LOGFILE_PURGE
		touch $LOGFILE_KERNEL_LIST
		print_timestamp start
		echo "[$(date '+%H:%M:%S')] Logfile $LOGFILE_INSTALL von User $USER am $(date '+%d.%m.%Y') angelegt (2)" >> $LOGFILE_PURGE
	fi
 
}
 
##################
#  Hauptprogramm
##################
#
#
# Logile erstellen
create_log
 
# Aktuelle Kernel-Majorversion und Kernelversion ins Logfile schreiben
echo "[$(date '+%H:%M:%S')] KERNEL_MAJOR_VERSION="$KERNEL_MAJOR_VERSION >> $LOGFILE_PURGE
echo "[$(date '+%H:%M:%S')] KERNEL_ACTUAL="$KERNEL_ACTUAL >> $LOGFILE_PURGE
 
# Alle installierten Kernel ermitteln und in Datei schreiben (LOGFILE_KERNEL_LIST)
dpkg -l | egrep linux-image-[0-9] | awk -F'-' '{printf("%s%s%s\n", $3,"-",$4)}' >> $LOGFILE_KERNEL_LIST
 
# Aktuell laufenden Kernel aus oben erzeugter Datei wieder entfernen
sed -i '/'$KERNEL_ACTUAL'/d' $LOGFILE_KERNEL_LIST
 
# löschbare Kernel ins Logfile schreiben
echo "[$(date '+%H:%M:%S')] BEGIN DELETABLE KERNEL" >> $LOGFILE_PURGE
cat $LOGFILE_KERNEL_LIST >> $LOGFILE_PURGE
echo "[$(date '+%H:%M:%S')] END DELETABLE KERNEL" >> $LOGFILE_PURGE
 
# Dialogbox anzeigen mit allen installierten Kernel außer dem aktuell laufenden
KERNEL_SELECTION=$(kdialog --geometry 400x300 --title "Kernel-Remover" --menu "\nAktuell laufende und damit nicht entfernbare Kernelversion:<h3>$KERNEL_ACTUAL</h3>Bitte die Kernelversion für die Deinstallation auswählen:<br>" $(while read ROW; do MP=$ROW; echo $ROW; echo $MP; done < $LOGFILE_KERNEL_LIST) "9999")
KERNEL_SELECTION_CHECK=$?
 
if [ "$KERNEL_SELECTION_CHECK" -eq 0 ]
	then
	echo "[$(date '+%H:%M:%S')] KERNEL_SELECTION_CHECK="$KERNEL_SELECTION >> $LOGFILE_PURGE
elif [ "$KERNEL_SELECTION_CHECK" -eq 1 ]
	then
	echo "[$(date '+%H:%M:%S')] KERNEL_SELECTION_CHECK="$KERNEL_SELECTION >> $LOGFILE_PURGE
	del_log
	exit 1
fi
 
# Dialogbox zur Passwortabfrage, da sudo Rechte benötigt werden
PASSWD_DIALOG=$(kdialog --title "Kernel-Remover (Passwort)" --password "Bitte das Passwort (sudo) eingeben")
PASSWD_DIALOG_CHECK=$?
 
init_progressbar
run_progressbar "1" "Vorbereitungen zum Löschen des Kernels"
sleep 1
 
# Test ob Passwort korrekt ist via simulierten "apt purge"
echo "$PASSWD_DIALOG" | sudo -S apt purge --simulate `apt-cache search 'linux-(image(-extra)?|hwe-'$KERNEL_MAJOR_VERSION'-headers|headers|modules|modules-extra)-'$KERNEL_SELECTION'(-generic){0,1}' | cut -d" " -f1 | awk '{printf("%s ",$0)}END {print "\n"}'`
PWD_CHECK=$?
 
# Auswertung der Tastendrücke des Passwortdialogs und des Passwortchecks
if [ "$PASSWD_DIALOG_CHECK" = "0" -a "$PWD_CHECK" = "0" ]
	then
	echo "[$(date '+%H:%M:%S')] PASSWD_DIALOG RC="$PASSWD_DIALOG_CHECK >> $LOGFILE_PURGE	
	echo "[$(date '+%H:%M:%S')] PWD_CHECK="$PWD_CHECK >> $LOGFILE_PURGE
elif [ "$PASSWD_DIALOG_CHECK" = "1" -o "$PWD_CHECK" = "1" ]
	then
	echo "[$(date '+%H:%M:%S')] PASSWD_DIALOG RC="$RC >> $LOGFILE_PURGE
	echo "[$(date '+%H:%M:%S')] PWD_CHECK="$PWD_CHECK >> $LOGFILE_PURGE
	close_progressbar
	show_passive_popup_pwd
	del_log
	exit 2
fi
 
# Zu löschende Kernelpakete errmitteln für Bestätigungsdialog
KERNEL_PACKAGES=$(dpkg -l | egrep 'linux-(image(-extra)?|hwe-'$KERNEL_MAJOR_VERSION'-headers|headers|modules|modules-extra)-'$KERNEL_SELECTION'(-generic){0,1}'| awk '{print $2}')
 
# Dialogbox mit Bestätigungsdialog ob Kernel wirklich gelöscht werden soll
DEL_DIALOG=$(kdialog --title "Kernel-Remover (Bestätigung)" --warningyesnocancel "Kernelversion $KERNEL_SELECTION mit den angegebenen Paketen wirklich löschen?\n\n$KERNEL_PACKAGES\n\nLogdatei unter $LOGFILE_PURGE\n\n")
DEL_DIALOG_CHECK=$?
show_passive_popup_button_push $DEL_DIALOG_CHECK
 
run_progressbar "2" "Ausgewählter Kernel wird jetzt gelöscht"
 
# Löschen der Kernelpakete
#
# Zum testen den Optionsparameter "--yes" (Pakete löschen ohne Nachfrage) von "apt purge" durch "--simulate" (Ausführung des Kommandos nur simulieren) ersetzen
echo "$PASSWD_DIALOG" | sudo -S apt purge --yes `apt-cache search 'linux-(image(-extra)?|hwe-'$KERNEL_MAJOR_VERSION'-headers|headers|modules|modules-extra)-'$KERNEL_SELECTION'(-generic){0,1}' | cut -d" " -f1 | awk '{printf("%s ",$0)}END {print "\n"}'` >> $LOGFILE_PURGE
PURGE=$?
 
# Testsimmulation (ggf. aktivieren)
#echo "$PASSWD_DIALOG" | sudo -S apt purge --simulate `apt-cache search 'linux-(image(-extra)?|hwe-'$KERNEL_MAJOR_VERSION'-headers|headers|modules|modules-extra)-'$KERNEL_SELECTION'(-generic){0,1}' | cut -d" " -f1 | awk '{printf("%s ",$0)}END {print "\n"}'` >> $LOGFILE_PURGE
#PURGE=$?
 
run_progressbar "3" "Temporäre Log-Dateien löschen"
sleep 1
 
 
show_passive_popup_kernel_del $PURGE
 
# zum testen auf der Kommandozeile nachfolgende Zeile entkommentieren (#-Zeichen entfernen), damit das Logfile sofort angezeigt wird
#cat $LOGFILE_PURGE
 
# Aufruf Funktion
del_log
close_progressbar
#EOF


Logfile

Typisches Logfile nach erfolgreichen Löschung eines Kernels.

[11:47:58] ----------------------------------------------- Start -----------------------------------------------
[11:47:58] Logfile  von User michael am 21.05.2021 angelegt (1)
[11:47:58] KERNEL_MAJOR_VERSION=5.8
[11:47:58] KERNEL_ACTUAL=5.8.0-53
[11:47:59] BEGIN DELETABLE KERNEL
5.8.0-48
5.8.0-50
[11:47:59] END DELETABLE KERNEL
[11:48:01] KERNEL_SELECTION_CHECK=5.8.0-48
[11:48:09] PASSWD_DIALOG RC=0
[11:48:09] PWD_CHECK=0
[11:48:25] DEL_DIALOG YES=0
Paketlisten werden gelesen...
Abhängigkeitsbaum wird aufgebaut....
Statusinformationen werden eingelesen....
Paket »linux-headers-5.8.0-48-lowlatency« ist nicht installiert, wird also auch nicht entfernt.
Paket »linux-image-5.8.0-48-lowlatency« ist nicht installiert, wird also auch nicht entfernt.
Paket »linux-modules-5.8.0-48-lowlatency« ist nicht installiert, wird also auch nicht entfernt.
Die folgenden Pakete wurden automatisch installiert und werden nicht mehr benötigt:
  amd64-microcode cracklib-runtime gconf2 gtk3-engines-breeze haveged
  intel-microcode iucode-tool kde-style-breeze-qt4 kde-style-qtcurve-qt4
  kde-style-qtcurve-qt5 kf5-kdepim-apps-libs-data libccid libcrack2
  libgeoclue-2-0 libgrantlee-textdocument5 libhavege1 libkdecorations2private7
  libkf5emoticons-bin libkf5emoticons-data libkf5emoticons5 libkf5jsembed-data
  libkf5jsembed5 libkf5kaddressbookgrantlee5 libkf5kaddressbookimportexport5
  libkf5kdegamesprivate1 libkf5libkdepimakonadi5 libkf5parts-plugins
  libkf5syndication5 libkf5xmlrpcclient-data libkf5xmlrpcclient5
  libkimageannotator0.4.0 libllvm10 libpipewire-0.2-1 libpoppler87
  libpwquality-common libpwquality1 libqrencode3 libqt4-dbus
  libqt4-declarative libqt4-network libqt4-script libqt4-sql libqt4-svg
  libqt4-xml libqt4-xmlpatterns libqtcore4 libqtcurve-utils2 libqtdbus4
  libqtgui4 libvpx5 libzip4 phonon-backend-gstreamer phonon-backend-vlc qdbus
  qml-module-qtwebkit qtcore4-l10n thermald xserver-xorg-video-intel-arbiter
  xserver-xorg-video-intel-native-modesetting
Verwenden Sie »sudo apt autoremove«, um sie zu entfernen.
Die folgenden Pakete werden ENTFERNT:
  linux-headers-5.8.0-48-generic* linux-hwe-5.8-headers-5.8.0-48*
  linux-image-5.8.0-48-generic* linux-modules-5.8.0-48-generic*
  linux-modules-extra-5.8.0-48-generic*
0 aktualisiert, 0 neu installiert, 5 zu entfernen und 0 nicht aktualisiert.
Purg linux-headers-5.8.0-48-generic [5.8.0-48.54~20.04.1]
Purg linux-hwe-5.8-headers-5.8.0-48 [5.8.0-48.54~20.04.1]
Purg linux-modules-extra-5.8.0-48-generic [5.8.0-48.54~20.04.1]
Purg linux-image-5.8.0-48-generic [5.8.0-48.54~20.04.1]
Purg linux-modules-5.8.0-48-generic [5.8.0-48.54~20.04.1]
[11:48:46] PURGE RC=0
[11:48:46] DELETE /home/michael/tmp/kernel_list.txt
[11:48:46] cp /home/michael/tmp/run_kernel_remover.log /home/michael/tmp/run_kernel_remover.log.20210521-114758
[11:48:46] ----------------------------------------------- Ende ------------------------------------------------
run_kernel_remover.sh.txt · Zuletzt geändert: 2021/05/27 07:36 von dwadmin