Update der KDE Dialogscripte für die vorgestellten grafischen Kerneltools
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