Update der KDE Dialogscripte für die vorgestellten grafischen Kerneltools

Teilen:

Die in der Artikelserie Grafische Kerneltools (siehe rechts im Navigationsteil der Webseite unter “Serien”) vorgestellten grafischen Kerneltools habe ich zwischenzeitlich weiter entwickelt und kleine Verbesserungen im Scriptcode und der Bildschirmausgabe implementiert. Auf die Unterschiede bzw. Updates möchte ich in diesen Artikel kurz eingehen.

KDialogscript zur Anzeige von Infos rund um die installierten und verfügbaren Kernel

Dateiname des Scriptes: run_kernel_info.sh

Es werden jetzt alle Majorversionen der Kernel im verfügbaren Standardrepository angezeigt (siehe 1). Dadurch verändert sich auch die Anzeige der aktuellsten verfügbaren Kerneln auf die Anzahl der Majorversionen (siehe 2). Desweiteren habe ich das Datumsformat in den Detailinfos abgeändert in das Format TT.MM.JJJJ (siehe 3). Kleinere Verbesserung wurden im Scriptcode eingebaut.



KDialogscript zur Installation von zusätzlichen Kerneln

Dateiname des Scriptes: run_kernel_installer.sh

Alle verfügbaren Majorversionen und der aktuell laufende Kernel werden jetzt angezeigt (siehe 1). Eine Installation eines zusätzlichen Kernel aus jeder verfügbaren Majorversion ist jetzt möglich, nicht nur aus der aktuellsten Reihe (siehe 2). Der Scriptcode wurde optimiert bzw. überarbeitet.

KDialogscript zum Entfernen von installierten Kerneln

Dateiname des Scriptes: run_kernel_remover.sh

Am Aussehen der Dialogbox in diesem Script wurde nichts verändert, aber der Scriptcode wurde verbessert bzgl. des Logging.



Listing der aktualsierten Scriptcodes

KDialogscript run_kernel_info.sh zur Anzeige der Kernelinformationen.

  1#!/bin/bash
  2#
  3# Version: 20210707
  4#
  5#######################
  6#  Variablenbelegung
  7#######################
  8#
  9DPKG_INFODIR="/var/lib/dpkg/info"
 10SEARCHSTR="Modifiziert:"
 11BOOTDIR="/boot"
 12FILE_DETAIL="/home/$USER/tmp/kernel_info_detail.txt"
 13
 14################
 15#  Funktionen
 16################
 17#
 18get_all_major_kernelversion()
 19{
 20	# Alle Majorversionen im Standard-Repository ermitteln
 21	KERNEL_MAJOR_VERS_ALL=$(apt-cache search linux-image-'[0-9]'\.*\.0-.*-generic | awk -F"-" '{printf("%s\n",$3)}' | sort -V | uniq | cut -d "." -f1-2 | awk -F"." '{printf("%s   ",$1"."$2)}')
 22}
 23
 24get_installed_kernel()
 25{
 26	# Alle lokal installierten Kernel ermitteln
 27	KERNEL_INSTALLED=$(dpkg -l | egrep linux-image-[0-9] | awk -F'-' '{printf("%s%s%s ", $3,"-",$4)}')
 28}
 29
 30get_latest_kernel()
 31{
 32	# Neuesten installierbaren Kernel ermitteln
 33	#KERNEL_LATEST=$(apt-cache search linux-image-[0-9].*-generic.* | awk -F"-" '{print $3"-"$4}' | sort -V | tail -1)
 34	KERNEL_LATEST=$(for I in $(apt-cache search linux-image-'[0-9]'\.*\.0-.*-generic | awk -F"-" '{printf("%s\n",$3)}' | sort -V | uniq); do apt-cache search linux-image-$I-.*-generic | awk -F"-" '{print $3"-"$4}' | sort -V | tail -1  | awk '{printf("%s   ",$0)}'; done)
 35}
 36
 37get_running_kernel()
 38{
 39	# Version des laufenden Kernel ermitteln
 40	KERNEL_RUNNING=$(uname -r | awk -F"-" '{print $1"-"$2}')
 41}
 42
 43create_all_installed_kernel()
 44{
 45	# Installationsdatum der Kernel ermitteln (und Array erstellen)
 46	for ROW in $(ls -1 $DPKG_INFODIR/linux-image-[0-9]*-generic.list)
 47		do
 48		INSTALL_TIME_ORIG=$(stat $ROW | egrep ^$SEARCHSTR | cut -d" " -f2)
 49		INSTALL_TIME_NEW=$(date -d "$INSTALL_TIME_ORIG" '+%Y%m%d')
 50		INSTALL_TIME_DE=$(date -d "$INSTALL_TIME_ORIG" '+%d.%m.%Y')
 51		BASENAME=$(basename $ROW)
 52		TMP1=$(echo ${BASENAME:12})
 53		SHORTNAME_INSTKERNEL=$(echo ${TMP1/.list/})
 54		ARRAY_INSTKERNEL[$INDEX_INSTKERNEL]=$SHORTNAME_INSTKERNEL"#"$INSTALL_TIME_ORIG"#"$INSTALL_TIME_DE"#"$INSTALL_TIME_NEW
 55		INDEX_INSTKERNEL=$[INDEX_INSTKERNEL+1]
 56	done 
 57
 58	# Verfügbarkeitsdatum der Kernel ermitteln (an Array als weitere Spalte hinzufügen)
 59	ROW=0
 60	INDEX_INSTKERNEL=0
 61	for ROW in $(ls -1 $BOOTDIR/vmlinuz-*-*)
 62		do
 63		AVALIABLE_TIME_ORIG=$(stat $ROW | egrep ^$SEARCHSTR | cut -d" " -f2)
 64		AVALIABLE_TIME_DE=$(date -d "$AVALIABLE_TIME_ORIG" '+%d.%m.%Y')
 65		ARRAY_INSTKERNEL[$INDEX_INSTKERNEL]=${ARRAY_INSTKERNEL[$INDEX_INSTKERNEL]}"#"$AVALIABLE_TIME_DE
 66		INDEX_INSTKERNEL=$[INDEX_INSTKERNEL+1]
 67	done 
 68}
 69
 70get_all_installed_kernel()
 71{
 72	# Ausgabe des Arrays mit Detailinfos zu den installierten Kerneln in Datei schreiben
 73	for ROW in ${ARRAY_INSTKERNEL[@]}
 74		do
 75      echo $ROW
 76	done | sort -t"#" -n -k4 | awk -F"#" '{printf("%s%-25s %-20s %-20s\n", "linux-image-",$1,$3,$5)}' > $FILE_DETAIL
 77}
 78
 79del_log()
 80{
 81	# Aufräumen
 82	if [ -e "$FILE_DETAIL" ]
 83		then
 84		rm $FILE_DETAIL
 85	fi
 86}
 87
 88get_available_size()
 89{
 90	# Freien Speicherplatz im Root-FS ermitteln
 91	FREE_SIZE_ROOT=$(df --output=size,avail --block-size=MB  / | tail -1 | awk '{print "Freier Speicherplatz im Root Dateisystem "$2" von "$1}')
 92	
 93	# Überprüfen ob /boot ein eigenes Dateisystem ist und ggf. freien Speicherplatz ermitteln
 94	AVAILABLE_BOOT_FS=$(df --output=target| egrep ^/boot)
 95	
 96	if [ "$AVAILABLE_BOOT_FS" ]
 97		then
 98		FREE_SIZE_BOOT=$(df --output=target,size,avail --block-size=MB /boot | tail -1 | awk '{print "Freier Speicherplatz im /boot Dateisystem "$3" von "$2}')
 99	fi
100}
101
102##################
103#  Hauptprogramm
104##################
105#
106get_all_major_kernelversion
107create_all_installed_kernel
108get_all_installed_kernel
109get_installed_kernel
110get_latest_kernel
111get_running_kernel
112get_available_size
113
114# Dialogbox anzeigen
115kdialog --title "Kernel Info" --msgbox "$(echo "\n")Informationen zu den Kernelversionen im System und Repository$(echo "\n\n")Aktuell verfügbare Major-Kernelversionen im Repo$(echo "\n")$KERNEL_MAJOR_VERS_ALL$(echo "\n\n")Neuester verfügbarer Kernel je Majorversion$(echo "\n")$KERNEL_LATEST $(echo "\n\n")Aktuell laufende Kernelversion$(echo "\n")$KERNEL_RUNNING $(echo "\n\n")$(echo "Alle installierten Kernelversionen"; for ROW in $(echo $KERNEL_INSTALLED); do echo $ROW; done) $(echo "\n\n")Installationsdetails zu den Kernelversionen$(echo "\n")$(echo "Kernelpaketname                             Installiert am        Verfügbar seit")$(echo "\n")$(cat $FILE_DETAIL)$(echo "\n\n")$FREE_SIZE_ROOT$(echo "\n")$FREE_SIZE_BOOT$(echo "\n")"
116
117del_log
118#EOF

KDialogscript run_kernel_installer.sh zur Installation eines Kernels.

  1#!/bin/bash
  2#
  3# Version: 20210714
  4#
  5#######################
  6#  Variablenbelegung
  7#######################
  8#
  9USER_TMP_DIR="/home/$USER/tmp"
 10LOGFILE_INSTALL=/home/$USER/tmp/$(basename $0).log
 11TIME_STAMP=$(date '+%Y%m%d-%H%M%S')
 12KERNEL_MAJOR_VERS=$(uname -r|awk -F"-" '{print $1}')
 13KERNEL_MAJOR_SHORT=$(uname -r|cut -d"." -f1-2)
 14KERNEL_MAJOR_VERS_ALL=$(apt-cache search linux-image-'[0-9]'\.*\.0-.*-generic |awk -F"-" '{print $3}'|sort -V | uniq)
 15
 16################
 17#  Funktionen
 18################
 19#
 20
 21get_all_available_kernel()
 22{
 23	# Verfügbare kernel ermitteln
 24	echo "[$(date '+%H:%M:%S')] All available Kernel" >> $LOGFILE_INSTALL
 25	#for ROW in $(apt-cache search linux-image-$KERNEL_MAJOR_VERS-.*-generic|awk -F"-" '{print $3"-"$4}')
 26	for ROW in $(apt-cache search linux-image-'[0-9]'\.*\.0-.*-generic|awk -F"-" '{print $3"-"$4}'|sort -V)
 27		do
 28		ARRAY_AVAILABLE_KERNEL[$INDEX_AVAILABLE_KERNEL]=$ROW
 29		echo ${ARRAY_AVAILABLE_KERNEL[$INDEX_AVAILABLE_KERNEL]} >> $LOGFILE_INSTALL
 30		INDEX_AVAILABLE_KERNEL=$[INDEX_AVAILABLE_KERNEL+1]
 31	done
 32}
 33
 34get_mark_kernel()
 35{
 36	# Kernelversionen kennzeichnen ob installiert oder nicht
 37	echo "[$(date '+%H:%M:%S')] All installed Kernel" >> $LOGFILE_INSTALL
 38	ROW=0
 39	INDEX_AVAILABLE_KERNEL=0
 40	for ROW in ${ARRAY_AVAILABLE_KERNEL[@]}
 41		do
 42      #IS_INSTALLED=$(dpkg -l | egrep $ROW | awk '{print $1}')
 43      IS_INSTALLED=$(dpkg -l | egrep linux-image-$ROW | awk '{print $1}')
 44      if [ "$IS_INSTALLED" ]
 45			then
 46			ARRAY_AVAILABLE_KERNEL[$INDEX_AVAILABLE_KERNEL]=$ROW"#yes_installed"
 47			echo ${ARRAY_AVAILABLE_KERNEL[$INDEX_AVAILABLE_KERNEL]} >> $LOGFILE_INSTALL
 48			INDEX_AVAILABLE_KERNEL=$[INDEX_AVAILABLE_KERNEL+1]
 49		else
 50			ARRAY_AVAILABLE_KERNEL[$INDEX_AVAILABLE_KERNEL]=$ROW"#not_installed"
 51			INDEX_AVAILABLE_KERNEL=$[INDEX_AVAILABLE_KERNEL+1]
 52		fi
 53	done
 54}
 55
 56get_installable_kernel()
 57{
 58	# Installierbare Kernel ermitteln
 59	echo "[$(date '+%H:%M:%S')] All installable Kernel" >> $LOGFILE_INSTALL
 60	ROW=0
 61	INDEX_AVAILABLE_KERNEL=0
 62	for ROW in ${ARRAY_AVAILABLE_KERNEL[@]}
 63		do
 64      INSTALLABLE_KERNEL=$(echo $ROW | egrep "not_installed")
 65      if [ "$INSTALLABLE_KERNEL" ]
 66			then
 67			ARRAY_INSTALLABLE_KERNEL[$INDEX_INSTALLABLE_KERNEL]=$ROW
 68			echo ${ARRAY_INSTALLABLE_KERNEL[$INDEX_INSTALLABLE_KERNEL]} >> $LOGFILE_INSTALL
 69			INDEX_INSTALLABLE_KERNEL=$[INDEX_INSTALLABLE_KERNEL+1]
 70		fi
 71	done
 72}
 73
 74debug_print_array1()
 75{
 76	# Funktion für die Fehlersuche (nicht genutzt)
 77	echo ""
 78	echo "---------- Start Debug ARRAY_AVAILABLE_KERNEL ----------"
 79	for ROW in ${ARRAY_AVAILABLE_KERNEL[@]}
 80		do
 81      echo $ROW
 82	done
 83	echo "---------- Ende Debug ARRAY_AVAILABLE_KERNEL  ----------"
 84	echo ""
 85}
 86
 87debug_print_array2()
 88{
 89	# Funktion für die Fehlersuche (nicht genutzt)
 90	echo ""
 91	echo "---------- Start Debug ARRAY_INSTALLABLE_KERNEL ----------"
 92	for ROW in ${ARRAY_INSTALLABLE_KERNEL[@]}
 93		do
 94      echo $ROW
 95	done
 96	echo "---------- Ende Debug ARRAY_INSTALLABLE_KERNEL  ----------"
 97	echo ""
 98}
 99
100debug_var()
101{
102	# Funktion für die Fehlersuche (nicht genutzt)
103	echo ""
104	echo "---------- Start Debug Variablen ----------"
105	echo "TIME_STAMP="$TIME_STAMP
106	echo "USER_TMP_DIR="$USER_TMP_DIR
107	echo "LOGFILE_INSTALL="$LOGFILE_INSTALL
108	echo "KERNEL_MAJOR_SHORT="$KERNEL_MAJOR_SHORT
109	echo "KERNEL_MAJOR_VERS="$KERNEL_MAJOR_VERS
110	echo "KERNEL_MAJOR_VERS_ALL="$KERNEL_MAJOR_VERS_ALL
111	echo "---------- Ende Debug Variablen  ----------"
112	echo ""
113}
114
115print_timestamp()
116{
117	# Timestamp (Start und Ende) ins Logfile schreiben
118	TS_VALUE=$1
119	if [ "$TS_VALUE" = "start" ]
120		then
121		echo "[$(date '+%H:%M:%S')] ------------------------------------------- Start -------------------------------------------" >> $LOGFILE_INSTALL
122	elif [ "$TS_VALUE" = "end" ]
123		then
124		echo "[$(date '+%H:%M:%S')] ------------------------------------------- Ende --------------------------------------------" >> $LOGFILE_INSTALL
125	fi
126}
127
128create_log()
129{
130	# ggf. temporäres tmp Verzeichnis im $HOME erstellen 
131	if [ ! -d "$USER_TMP_DIR" ]
132		then
133		mkdir "$USER_TMP_DIR"
134	fi
135	
136	# Altes Logfile löschen und neues erstellen
137	if [ -e "$LOGFILE_INSTALL" ]
138		then
139		rm $LOGFILE_INSTALL
140		touch $LOGFILE_INSTALL
141		print_timestamp start
142		echo "[$(date '+%H:%M:%S')] Logfile $LOGFILE_INSTALL von $USER am $(date '+%d.%m.%Y') angelegt (1)" >> $LOGFILE_INSTALL
143	else
144		touch $LOGFILE_INSTALL
145		print_timestamp start
146		echo "[$(date '+%H:%M:%S')] Logfile $LOGFILE_INSTALL von $USER am $(date '+%d.%m.%Y') angelegt (2)" >> $LOGFILE_INSTALL
147	fi
148}
149
150copy_log()
151{
152	# altes Logfile sichern
153	echo "[$(date '+%H:%M:%S')] cp $LOGFILE_INSTALL $LOGFILE_INSTALL.$TIME_STAMP" >> $LOGFILE_INSTALL
154	print_timestamp end
155	cp $LOGFILE_INSTALL $LOGFILE_INSTALL"."$TIME_STAMP
156}
157
158show_passive_popup()
159{
160	# Popup anzeigen bei (nicht)erfolgreicher Kernelinstallation
161	POP_TEXT=$1
162	echo "[$(date '+%H:%M:%S')] $POP_TEXT" >> $LOGFILE_INSTALL
163	kdialog --passivepopup "$POP_TEXT" 5
164}
165
166init_progressbar()
167{
168	# initieren der Fortschrittsanzeige
169	progress=$(kdialog --title "Kernel-Installer" --progressbar "XXXX" 4)
170	qdbus $progress showCancelButton false
171}
172
173run_progressbar()
174{
175	# Fortschrittsanzeige aktualisieren bei jedem Schritt
176	VALUE="$1"
177	TEXT="$2"
178	qdbus $progress Set "" value $VALUE > /dev/null
179	qdbus $progress setLabelText "$VALUE. Schritt:   $TEXT" > /dev/null
180}
181
182close_progressbar()
183{
184	# Fortschrittsanzeige am Scriptende schließen
185	qdbus $progress close > /dev/null
186}
187
188
189##################
190#  Hauptprogramm
191##################
192#
193create_log
194get_all_available_kernel
195get_mark_kernel
196get_installable_kernel
197
198# Dialogbox zur Auswahl des Kernels der installiert werden soll
199ANZ=${#ARRAY_INSTALLABLE_KERNEL[@]}
200#KERNEL_SELECTION=$(kdialog --geometry 350x600 --title "Kernel-Installer" --menu "<br>Alle verfügbaren und installierbaren Kernel<br>sind weiter unten aufgelistet.<h3>Kernel-Majorversion "$KERNEL_MAJOR_VERS"</h3>\n\n<h3>Laufender Kernel $(uname -r|cut -d"-" -f1-2)</h3><br>Bereits lokal installierte Kernel der Versionsreihe  $KERNEL_MAJOR_VERS <br>werden nicht angezeigt. Bitte wählen Sie ihre <br>gewünschte Kernelversion zur Installation aus.<br>" $(for ((I=0;I<=$ANZ;I++)); do echo $I; echo ${ARRAY_INSTALLABLE_KERNEL[I]} | awk -F"#" '{print $1}'; done))
201
202KERNEL_SELECTION=$(kdialog --geometry 350x600 --title "Kernel-Installer" --menu "<br>Alle verfügbaren und installierbaren Kernel<br>sind weiter unten aufgelistet.<h3>Majorversion(en) $KERNEL_MAJOR_VERS_ALL</h3>\n\n<h3>Laufender Kernel $(uname -r|cut -d"-" -f1-2)</h3><br>Bereits lokal installierte Kernel aller oben genannten<br>Versionsreihen werden nicht angezeigt. Bitte wählen<br>Sie ihre gewünschte Kernelversion zur Installation aus.<br>" $(for ((I=0;I<=$ANZ;I++)); do echo $I; echo ${ARRAY_INSTALLABLE_KERNEL[I]} | awk -F"#" '{print $1}'; done))
203KERNEL_SELECTION_CHECK=$?
204
205# Logmeldung schreiben
206if [ "$KERNEL_SELECTION_CHECK" = "0" ]
207	then
208	echo "[$(date '+%H:%M:%S')] KERNEL_SELECTION_CHECK=$KERNEL_SELECTION_CHECK" >> $LOGFILE_INSTALL
209elif [ "$KERNEL_SELECTION_CHECK" = "1" ]
210	then
211	echo "[$(date '+%H:%M:%S')] KERNEL_SELECTION_CHECK=$KERNEL_SELECTION_CHECK" >> $LOGFILE_INSTALL
212	print_timestamp end
213	exit 1
214fi
215
216# Progress initieren und starten
217init_progressbar
218run_progressbar "1" "Vorbereitungen zur Installation des Kernels"
219sleep 1
220
221# zweite Spalte des Arrays entfernen, so dass nur noch die Version bleibt
222KERNEL_SELECTION_SHORT=${ARRAY_INSTALLABLE_KERNEL[$KERNEL_SELECTION]%#not_installed}
223echo "[$(date '+%H:%M:%S')] KERNEL_SELECTION_SHORT=$KERNEL_SELECTION_SHORT" >> $LOGFILE_INSTALL
224
225# Dialogbox zur Passwortabfrage, da sudo Rechte benötigt werden
226PASSWD_DIALOG=$(kdialog --title "Kernel-Installer (Passwort)" --password "Bitte das Passwort (sudo) eingeben")
227PASSWD_DIALOG_CHECK=$?
228
229# Logmeldung schreiben
230if [ "$PASSWD_DIALOG_CHECK" = "0" ]
231	then
232	echo "[$(date '+%H:%M:%S')] PASSWD_DIALOG_CHECK=$PASSWD_DIALOG_CHECK" >> $LOGFILE_INSTALL
233fi
234
235# zu installierende Kernelpakete Variablen zuweisen
236KERNEL_PACKAGES=$(apt-cache search 'linux-(image(-extra)?|hwe-'$KERNEL_MAJOR_SHORT'-headers|headers|modules|modules-extra)-'$KERNEL_SELECTION_SHORT'(-generic)?$' | cut -d" " -f1)
237echo "[$(date '+%H:%M:%S')] KERNEL_PACKAGES="$KERNEL_PACKAGES >> $LOGFILE_INSTALL
238
239# Test ob Passwort korrekt ist via sudo mit "apt-cache search"
240echo "$PASSWD_DIALOG" | sudo -S apt-cache search $KERNEL_PACKAGES
241PWD_CHECK=$?
242
243# Auswertung der Tastendrücke des Passwortdialogs und des Passwortchecks
244if [ "$PASSWD_DIALOG_CHECK" = "0" -a "$PWD_CHECK" = "0" ]
245	then
246	echo "[$(date '+%H:%M:%S')] PASSWD_DIALOG_CHECK=$PASSWD_DIALOG_CHECK" >> $LOGFILE_INSTALL
247	echo "[$(date '+%H:%M:%S')] PWD_CHECK="$PWD_CHECK >> $LOGFILE_INSTALL
248elif [ "$PASSWD_DIALOG_CHECK" = "1" -o "$PWD_CHECK" = "1" ]
249	then
250	echo "[$(date '+%H:%M:%S')] PASSWD_DIALOG_CHECK=$PASSWD_DIALOG_CHECK Abbrechen gedrückt" >> $LOGFILE_INSTALL
251	echo "[$(date '+%H:%M:%S')] PWD_CHECK=$PWD_CHECK Passwort falsch ($PASSWD_DIALOG)" >> $LOGFILE_INSTALL
252	show_passive_popup "Das Passwort wurde falsch eingegeben bzw. der ABBRECHEN-Button wurde gedrückt"
253	print_timestamp end
254	close_progressbar
255	exit 10
256fi
257
258# Fortschrittsanzeige aktualisieren
259run_progressbar "2" "Auf Bestätigung des Benutzers warten"
260sleep 1
261
262# Dialogbox mit Bestätigungsdialog ob Kernel wirklich installiert werden soll
263INSTALL_DIALOG=$(kdialog --title "Kernel-Installer (Bestätigung)" --warningyesnocancel "Kernelversion $KERNEL_SELECTION_SHORT mit den angegebenen Paketen wirklich installieren?\n\n$KERNEL_PACKAGES\n\n\nLogfile unter $LOGFILE_INSTALL\n")
264INSTALL_DIALOG_CHECK=$?
265
266#echo "Auswahl Array="${ARRAY_INSTALLABLE_KERNEL[$KERNEL_SELECTION]}
267#echo "Auswahl gekürzt="${ARRAY_INSTALLABLE_KERNEL[$KERNEL_SELECTION]%#not_installed}
268
269# Logmeldung schreiben
270if [ "$INSTALL_DIALOG_CHECK" = "0" ]
271	then
272	echo "[$(date '+%H:%M:%S')] INSTALL_DIALOG_CHECK=$INSTALL_DIALOG_CHECK" >> $LOGFILE_INSTALL
273	# Fortschrittsanzeige aktualisieren
274	run_progressbar "3" "Ausgewählter Kernel wird jetzt installiert"
275elif [ "$INSTALL_DIALOG_CHECK" = "1" ]
276	then
277	# nein gedrückt
278	echo "[$(date '+%H:%M:%S')] INSTALL_DIALOG_CHECK=$INSTALL_DIALOG_CHECK Nein gedrückt" >> $LOGFILE_INSTALL
279	show_passive_popup "Kernelversion $KERNEL_SELECTION_SHORT wurde nicht installiert, NEIN-Button wurde gedrückt"
280	print_timestamp end
281	close_progressbar
282	exit 2
283elif [ "$INSTALL_DIALOG_CHECK" = "2" ]
284	then
285	# abbrechen gedrückt
286	echo "[$(date '+%H:%M:%S')] INSTALL_DIALOG_CHECK=$INSTALL_DIALOG_CHECK Abbrechen gedrückt" >> $LOGFILE_INSTALL
287	show_passive_popup "Kernelversion $KERNEL_SELECTION_SHORT wurde nicht installiert, ABBRECHEN-Button wurde gedrückt"
288	print_timestamp end
289	close_progressbar
290	exit 3
291fi
292
293# Zum testen den Optionsparameter "--yes" (Pakete installieren ohne Nachfrage) von "apt install" durch "--simulate" (Ausführung des Kommandos nur simulieren) ersetzen
294#echo "$PASSWD_DIALOG" | sudo -S apt install --simulate $KERNEL_PACKAGES 1>> $LOGFILE_INSTALL 2>> $LOGFILE_INSTALL
295echo "$PASSWD_DIALOG" | sudo -S apt install --yes $KERNEL_PACKAGES 1>> $LOGFILE_INSTALL 2>> $LOGFILE_INSTALL
296INSTALLATION_CHECK=$?
297echo "[$(date '+%H:%M:%S')] INSTALLATION_CHECK=$INSTALLATION_CHECK" >> $LOGFILE_INSTALL
298
299# Logmeldung schreiben
300if [ "$INSTALLATION_CHECK" = "0" ]
301	then
302	show_passive_popup "Die Kernelversion $KERNEL_SELECTION_SHORT konnte erfolgreich installiert werden"
303else
304	show_passive_popup "Achtung Fehler! Die Kernelversion $KERNEL_SELECTION_SHORT konnte nicht erfolgreich installiert werden"
305fi
306
307# Fortschrittsanzeige aktualisieren
308run_progressbar "4" "temporäres Logfile sichern"
309sleep 2
310copy_log
311close_progressbar
312#EOF

KDialogscript run_kernel_remover.sh zur Deinstallation eines Kernels.

  1#!/bin/bash
  2#
  3# Version: 20210714
  4#
  5#######################
  6#  Variablenbelegung
  7#######################
  8#
  9TIME_STAMP=$(date '+%Y%m%d-%H%M%S')
 10USER_TMP_DIR="/home/$USER/tmp"
 11LOGFILE_PURGE="$USER_TMP_DIR/run_kernel_remover.log"
 12LOGFILE_KERNEL_LIST="$USER_TMP_DIR/kernel_list.txt"
 13KERNEL_ACTUAL=$(uname -r|awk -F"-" '{print $1"-"$2}')
 14KERNEL_MAJOR_VERSION=$(uname -r|awk -F"." '{print $1"."$2}')
 15#
 16#
 17################
 18#  Funktionen
 19################
 20#
 21#
 22show_passive_popup_button_push()
 23{
 24	if [ "$1" = "0" ]
 25		then
 26		echo "[$(date '+%H:%M:%S')] DEL_DIALOG YES=$1" >> $LOGFILE_PURGE
 27	elif [ "$1" = "1" ]
 28		then
 29		echo "[$(date '+%H:%M:%S')] DEL_DIALOG NO=$1" >> $LOGFILE_PURGE
 30		kdialog --passivepopup "[Kernel Remover]\nKernel $KERNEL_SELECTION konnte nicht gelöscht werden, da NEIN gedrückt wurde!" 5
 31		close_progressbar
 32		del_log
 33		exit 3
 34	elif [ "$1" = "2" ]
 35		then
 36		echo "[$(date '+%H:%M:%S')] DEL_DIALOG CANCEL=$1" >> $LOGFILE_PURGE
 37		kdialog --passivepopup "[Kernel Remover]\nKernel $KERNEL_SELECTION konnte nicht gelöscht werden, da ABBRECHEN gedrückt wurde!" 5
 38		close_progressbar
 39		del_log
 40		exit 4
 41	fi
 42}
 43
 44
 45show_passive_popup_kernel_del()
 46{
 47	if [ "$1" = "0" ]
 48		then
 49		echo "[$(date '+%H:%M:%S')] PURGE RC="$1 >> $LOGFILE_PURGE
 50		kdialog --passivepopup "[Kernel Remover]\nKernel $KERNEL_SELECTION konnte erfolgreich gelöscht werden" 5
 51	elif [ "$1" != "0" ]
 52		then
 53		echo "[$(date '+%H:%M:%S')] PURGE RC="$1 >> $LOGFILE_PURGE
 54		kdialog --passivepopup "[Kernel Remover]\nAchtung, Kernel $KERNEL_SELECTION konnte nicht gelöscht werden!" 5
 55	fi
 56}
 57
 58
 59show_passive_popup_pwd()
 60{
 61	if [ "$PASSWD_DIALOG_CHECK" = "1" ]
 62		then
 63		kdialog --passivepopup "[Kernel Remover]\nAchtung, Abbruch da im Passwortdialog ABBRECHEN gedrückt wurde!" 5
 64	elif [ "$PWD_CHECK" = "1" ]
 65		then
 66		kdialog --passivepopup "[Kernel Remover]\nAchtung, Abbruch da das Passwort (sudo) falsch eingegeben wurde!" 5
 67	fi
 68}
 69
 70
 71init_progressbar()
 72{
 73	# initieren der Fortschrittsanzeige
 74	progress=$(kdialog --title "Kernel-Remover" --progressbar "Ausgewählte alte Kernelpakete löschen" 4)
 75	qdbus $progress showCancelButton false
 76}
 77
 78
 79run_progressbar()
 80{
 81	# Fortschrittsanzeige aktualisieren bei jedem Schritt
 82	VALUE="$1"
 83	TEXT="$2"
 84	qdbus $progress Set "" value $VALUE > /dev/null
 85	qdbus $progress setLabelText "$VALUE. Schritt:   $TEXT" > /dev/null
 86}
 87
 88
 89close_progressbar()
 90{
 91	# Fortschrittsanzeige am Scriptende schließen
 92	qdbus $progress close > /dev/null
 93}
 94
 95
 96print_timestamp()
 97{
 98	# Timestamp (Start und Ende) ins Logfile schreiben
 99	TS_VALUE=$1
100	if [ "$TS_VALUE" = "start" ]
101		then
102		echo "[$(date '+%H:%M:%S')] ----------------------------------------------- Start -----------------------------------------------" >> $LOGFILE_PURGE
103	elif [ "$TS_VALUE" = "end" ]
104		then
105		echo "[$(date '+%H:%M:%S')] ----------------------------------------------- Ende ------------------------------------------------" >> $LOGFILE_PURGE
106	fi
107}
108
109
110del_log()
111{
112 # Löschen des Logfiles mit der Kernelliste
113 if [ -e "$LOGFILE_KERNEL_LIST" ]
114	then
115		echo "[$(date '+%H:%M:%S')] DELETE $LOGFILE_KERNEL_LIST" >> $LOGFILE_PURGE
116		rm "$LOGFILE_KERNEL_LIST"
117	fi
118	echo "[$(date '+%H:%M:%S')] cp $LOGFILE_PURGE $LOGFILE_PURGE.$TIME_STAMP" >> $LOGFILE_PURGE
119	print_timestamp end
120	cp $LOGFILE_PURGE $LOGFILE_PURGE"."$TIME_STAMP
121}
122
123
124create_log()
125{
126	# ggf. temporäres tmp Verzeichnis im $HOME erstellen 
127	if [ ! -d "$USER_TMP_DIR" ]
128		then
129		mkdir "$USER_TMP_DIR"
130	fi
131
132	# Altes Logfile löschen und neues erstellen
133	if [ -e "$LOGFILE_PURGE" ]
134		then
135		rm $LOGFILE_PURGE
136		touch $LOGFILE_PURGE
137		touch $LOGFILE_KERNEL_LIST
138		print_timestamp start
139		echo "[$(date '+%H:%M:%S')] Logfile $LOGFILE_INSTALL von User $USER am $(date '+%d.%m.%Y') angelegt (1)" >> $LOGFILE_PURGE
140	else
141		touch $LOGFILE_PURGE
142		touch $LOGFILE_KERNEL_LIST
143		print_timestamp start
144		echo "[$(date '+%H:%M:%S')] Logfile $LOGFILE_INSTALL von User $USER am $(date '+%d.%m.%Y') angelegt (2)" >> $LOGFILE_PURGE
145	fi
146	
147}
148
149##################
150#  Hauptprogramm
151##################
152#
153#
154# Logile erstellen
155create_log
156
157# Aktuelle Kernel-Majorversion und Kernelversion ins Logfile schreiben
158echo "[$(date '+%H:%M:%S')] KERNEL_MAJOR_VERSION="$KERNEL_MAJOR_VERSION >> $LOGFILE_PURGE
159echo "[$(date '+%H:%M:%S')] KERNEL_ACTUAL="$KERNEL_ACTUAL >> $LOGFILE_PURGE
160
161# Alle installierten Kernel ermitteln und in Datei schreiben (LOGFILE_KERNEL_LIST)
162dpkg -l | egrep linux-image-[0-9] | awk -F'-' '{printf("%s%s%s\n", $3,"-",$4)}' >> $LOGFILE_KERNEL_LIST
163
164# Aktuell laufenden Kernel aus oben erzeugter Datei wieder entfernen
165sed -i '/'$KERNEL_ACTUAL'/d' $LOGFILE_KERNEL_LIST
166
167# löschbare Kernel ins Logfile schreiben
168echo "[$(date '+%H:%M:%S')] BEGIN DELETABLE KERNEL" >> $LOGFILE_PURGE
169cat $LOGFILE_KERNEL_LIST >> $LOGFILE_PURGE
170echo "[$(date '+%H:%M:%S')] END DELETABLE KERNEL" >> $LOGFILE_PURGE
171
172# Dialogbox anzeigen mit allen installierten Kernel außer dem aktuell laufenden
173KERNEL_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")
174KERNEL_SELECTION_CHECK=$?
175
176if [ "$KERNEL_SELECTION_CHECK" -eq 0 ]
177	then
178	echo "[$(date '+%H:%M:%S')] KERNEL_SELECTION_CHECK="$KERNEL_SELECTION >> $LOGFILE_PURGE
179elif [ "$KERNEL_SELECTION_CHECK" -eq 1 ]
180	then
181	echo "[$(date '+%H:%M:%S')] KERNEL_SELECTION_CHECK="$KERNEL_SELECTION >> $LOGFILE_PURGE
182	del_log
183	exit 1
184fi
185
186init_progressbar
187run_progressbar "1" "Vorbereitungen zum Löschen des Kernels"
188sleep 1
189
190# Dialogbox zur Passwortabfrage, da sudo Rechte benötigt werden
191PASSWD_DIALOG=$(kdialog --title "Kernel-Remover (Passwort)" --password "Bitte das Passwort (sudo) eingeben")
192PASSWD_DIALOG_CHECK=$?
193
194# Test ob Passwort korrekt ist via simulierten "apt purge"
195echo "$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"}'`
196PWD_CHECK=$?
197
198# Auswertung der Tastendrücke des Passwortdialogs und des Passwortchecks
199if [ "$PASSWD_DIALOG_CHECK" = "0" -a "$PWD_CHECK" = "0" ]
200	then
201	echo "[$(date '+%H:%M:%S')] PASSWD_DIALOG RC="$PASSWD_DIALOG_CHECK >> $LOGFILE_PURGE	
202	echo "[$(date '+%H:%M:%S')] PWD_CHECK="$PWD_CHECK >> $LOGFILE_PURGE
203elif [ "$PASSWD_DIALOG_CHECK" = "1" -o "$PWD_CHECK" = "1" ]
204	then
205	echo "[$(date '+%H:%M:%S')] PASSWD_DIALOG RC="$RC >> $LOGFILE_PURGE
206	echo "[$(date '+%H:%M:%S')] PWD_CHECK="$PWD_CHECK >> $LOGFILE_PURGE
207	close_progressbar
208	show_passive_popup_pwd
209	del_log
210	exit 2
211fi
212
213# Fortschrittsanzeige aktualisieren
214run_progressbar "2" "Auf Bestätigung des Benutzers warten"
215sleep 1
216
217# Zu löschende Kernelpakete errmitteln für Bestätigungsdialog
218KERNEL_PACKAGES=$(dpkg -l | egrep 'linux-(image(-extra)?|hwe-'$KERNEL_MAJOR_VERSION'-headers|headers|modules|modules-extra)-'$KERNEL_SELECTION'(-generic){0,1}'| awk '{print $2}')
219
220# Dialogbox mit Bestätigungsdialog ob Kernel wirklich gelöscht werden soll
221DEL_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")
222DEL_DIALOG_CHECK=$?
223show_passive_popup_button_push $DEL_DIALOG_CHECK
224
225run_progressbar "3" "Ausgewählter Kernel wird jetzt gelöscht"
226
227# Löschen der Kernelpakete
228#
229# Zum testen den Optionsparameter "--yes" (Pakete löschen ohne Nachfrage) von "apt purge" durch "--simulate" (Ausführung des Kommandos nur simulieren) ersetzen
230echo "$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
231PURGE=$?
232
233# Testsimmulation (ggf. aktivieren)
234#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
235#PURGE=$?
236
237run_progressbar "4" "Temporäre Log-Dateien löschen"
238sleep 1
239
240
241show_passive_popup_kernel_del $PURGE
242
243# zum testen auf der Kommandozeile nachfolgende Zeile entkommentieren (#-Zeichen entfernen), damit das Logfile sofort angezeigt wird
244#cat $LOGFILE_PURGE
245
246# Aufruf Funktion
247del_log
248close_progressbar
249#EOF


Quelle Teaser-Logo: Photo by Shahadat Rahman on Unsplash