run_kernel_installer.sh
Grafisches Dialogscript für den KDE Desktop (kdialog) zum installieren von Kernelversionen. Es können die Kernel der aktuellsten (im nachfolgenden Screenshot die Version 5.8) Kernelversionsreihe installiert werden, die noch nicht auf dem System existieren. Es werden die Standard-Repositories der jeweiligen installierten Version von KDE Neon genutzt, das auf Ubuntu basiert und diese Repos zur Verfügung stellt (aktuell die Version Ubuntu Focal).
Screenshots
Scriptlisting
- run_kernel_installer.sh
#!/bin/bash # # Version: 20210714 # ####################### # Variablenbelegung ####################### # USER_TMP_DIR="/home/$USER/tmp" LOGFILE_INSTALL=/home/$USER/tmp/$(basename $0).log TIME_STAMP=$(date '+%Y%m%d-%H%M%S') KERNEL_MAJOR_VERS=$(uname -r|awk -F"-" '{print $1}') KERNEL_MAJOR_SHORT=$(uname -r|cut -d"." -f1-2) KERNEL_MAJOR_VERS_ALL=$(apt-cache search linux-image-'[0-9]'\.*\.0-.*-generic |awk -F"-" '{print $3}'|sort -V | uniq) ################ # Funktionen ################ # get_all_available_kernel() { # Verfügbare kernel ermitteln echo "[$(date '+%H:%M:%S')] All available Kernel" >> $LOGFILE_INSTALL #for ROW in $(apt-cache search linux-image-$KERNEL_MAJOR_VERS-.*-generic|awk -F"-" '{print $3"-"$4}') for ROW in $(apt-cache search linux-image-'[0-9]'\.*\.0-.*-generic|awk -F"-" '{print $3"-"$4}'|sort -V) do ARRAY_AVAILABLE_KERNEL[$INDEX_AVAILABLE_KERNEL]=$ROW echo ${ARRAY_AVAILABLE_KERNEL[$INDEX_AVAILABLE_KERNEL]} >> $LOGFILE_INSTALL INDEX_AVAILABLE_KERNEL=$[INDEX_AVAILABLE_KERNEL+1] done } get_mark_kernel() { # Kernelversionen kennzeichnen ob installiert oder nicht echo "[$(date '+%H:%M:%S')] All installed Kernel" >> $LOGFILE_INSTALL ROW=0 INDEX_AVAILABLE_KERNEL=0 for ROW in ${ARRAY_AVAILABLE_KERNEL[@]} do #IS_INSTALLED=$(dpkg -l | egrep $ROW | awk '{print $1}') IS_INSTALLED=$(dpkg -l | egrep linux-image-$ROW | awk '{print $1}') if [ "$IS_INSTALLED" ] then ARRAY_AVAILABLE_KERNEL[$INDEX_AVAILABLE_KERNEL]=$ROW"#yes_installed" echo ${ARRAY_AVAILABLE_KERNEL[$INDEX_AVAILABLE_KERNEL]} >> $LOGFILE_INSTALL INDEX_AVAILABLE_KERNEL=$[INDEX_AVAILABLE_KERNEL+1] else ARRAY_AVAILABLE_KERNEL[$INDEX_AVAILABLE_KERNEL]=$ROW"#not_installed" INDEX_AVAILABLE_KERNEL=$[INDEX_AVAILABLE_KERNEL+1] fi done } get_installable_kernel() { # Installierbare Kernel ermitteln echo "[$(date '+%H:%M:%S')] All installable Kernel" >> $LOGFILE_INSTALL ROW=0 INDEX_AVAILABLE_KERNEL=0 for ROW in ${ARRAY_AVAILABLE_KERNEL[@]} do INSTALLABLE_KERNEL=$(echo $ROW | egrep "not_installed") if [ "$INSTALLABLE_KERNEL" ] then ARRAY_INSTALLABLE_KERNEL[$INDEX_INSTALLABLE_KERNEL]=$ROW echo ${ARRAY_INSTALLABLE_KERNEL[$INDEX_INSTALLABLE_KERNEL]} >> $LOGFILE_INSTALL INDEX_INSTALLABLE_KERNEL=$[INDEX_INSTALLABLE_KERNEL+1] fi done } debug_print_array1() { # Funktion für die Fehlersuche (nicht genutzt) echo "" echo "---------- Start Debug ARRAY_AVAILABLE_KERNEL ----------" for ROW in ${ARRAY_AVAILABLE_KERNEL[@]} do echo $ROW done echo "---------- Ende Debug ARRAY_AVAILABLE_KERNEL ----------" echo "" } debug_print_array2() { # Funktion für die Fehlersuche (nicht genutzt) echo "" echo "---------- Start Debug ARRAY_INSTALLABLE_KERNEL ----------" for ROW in ${ARRAY_INSTALLABLE_KERNEL[@]} do echo $ROW done echo "---------- Ende Debug ARRAY_INSTALLABLE_KERNEL ----------" echo "" } debug_var() { # Funktion für die Fehlersuche (nicht genutzt) echo "" echo "---------- Start Debug Variablen ----------" echo "TIME_STAMP="$TIME_STAMP echo "USER_TMP_DIR="$USER_TMP_DIR echo "LOGFILE_INSTALL="$LOGFILE_INSTALL echo "KERNEL_MAJOR_SHORT="$KERNEL_MAJOR_SHORT echo "KERNEL_MAJOR_VERS="$KERNEL_MAJOR_VERS echo "KERNEL_MAJOR_VERS_ALL="$KERNEL_MAJOR_VERS_ALL echo "---------- Ende Debug Variablen ----------" echo "" } print_timestamp() { # Timestamp (Start und Ende) ins Logfile schreiben TS_VALUE=$1 if [ "$TS_VALUE" = "start" ] then echo "[$(date '+%H:%M:%S')] ------------------------------------------- Start -------------------------------------------" >> $LOGFILE_INSTALL elif [ "$TS_VALUE" = "end" ] then echo "[$(date '+%H:%M:%S')] ------------------------------------------- Ende --------------------------------------------" >> $LOGFILE_INSTALL fi } 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_INSTALL" ] then rm $LOGFILE_INSTALL touch $LOGFILE_INSTALL print_timestamp start echo "[$(date '+%H:%M:%S')] Logfile $LOGFILE_INSTALL von $USER am $(date '+%d.%m.%Y') angelegt (1)" >> $LOGFILE_INSTALL else touch $LOGFILE_INSTALL print_timestamp start echo "[$(date '+%H:%M:%S')] Logfile $LOGFILE_INSTALL von $USER am $(date '+%d.%m.%Y') angelegt (2)" >> $LOGFILE_INSTALL fi } copy_log() { # altes Logfile sichern echo "[$(date '+%H:%M:%S')] cp $LOGFILE_INSTALL $LOGFILE_INSTALL.$TIME_STAMP" >> $LOGFILE_INSTALL print_timestamp end cp $LOGFILE_INSTALL $LOGFILE_INSTALL"."$TIME_STAMP } show_passive_popup() { # Popup anzeigen bei (nicht)erfolgreicher Kernelinstallation POP_TEXT=$1 echo "[$(date '+%H:%M:%S')] $POP_TEXT" >> $LOGFILE_INSTALL kdialog --passivepopup "$POP_TEXT" 5 } init_progressbar() { # initieren der Fortschrittsanzeige progress=$(kdialog --title "Kernel-Installer" --progressbar "XXXX" 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 } ################## # Hauptprogramm ################## # create_log get_all_available_kernel get_mark_kernel get_installable_kernel # Dialogbox zur Auswahl des Kernels der installiert werden soll ANZ=${#ARRAY_INSTALLABLE_KERNEL[@]} #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)) KERNEL_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)) KERNEL_SELECTION_CHECK=$? # Logmeldung schreiben if [ "$KERNEL_SELECTION_CHECK" = "0" ] then echo "[$(date '+%H:%M:%S')] KERNEL_SELECTION_CHECK=$KERNEL_SELECTION_CHECK" >> $LOGFILE_INSTALL elif [ "$KERNEL_SELECTION_CHECK" = "1" ] then echo "[$(date '+%H:%M:%S')] KERNEL_SELECTION_CHECK=$KERNEL_SELECTION_CHECK" >> $LOGFILE_INSTALL print_timestamp end exit 1 fi # Progress initieren und starten init_progressbar run_progressbar "1" "Vorbereitungen zur Installation des Kernels" sleep 1 # zweite Spalte des Arrays entfernen, so dass nur noch die Version bleibt KERNEL_SELECTION_SHORT=${ARRAY_INSTALLABLE_KERNEL[$KERNEL_SELECTION]%#not_installed} echo "[$(date '+%H:%M:%S')] KERNEL_SELECTION_SHORT=$KERNEL_SELECTION_SHORT" >> $LOGFILE_INSTALL # Dialogbox zur Passwortabfrage, da sudo Rechte benötigt werden PASSWD_DIALOG=$(kdialog --title "Kernel-Installer (Passwort)" --password "Bitte das Passwort (sudo) eingeben") PASSWD_DIALOG_CHECK=$? # Logmeldung schreiben if [ "$PASSWD_DIALOG_CHECK" = "0" ] then echo "[$(date '+%H:%M:%S')] PASSWD_DIALOG_CHECK=$PASSWD_DIALOG_CHECK" >> $LOGFILE_INSTALL fi # zu installierende Kernelpakete Variablen zuweisen KERNEL_PACKAGES=$(apt-cache search 'linux-(image(-extra)?|hwe-'$KERNEL_MAJOR_SHORT'-headers|headers|modules|modules-extra)-'$KERNEL_SELECTION_SHORT'(-generic)?$' | cut -d" " -f1) echo "[$(date '+%H:%M:%S')] KERNEL_PACKAGES="$KERNEL_PACKAGES >> $LOGFILE_INSTALL # Test ob Passwort korrekt ist via sudo mit "apt-cache search" echo "$PASSWD_DIALOG" | sudo -S apt-cache search $KERNEL_PACKAGES 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_CHECK=$PASSWD_DIALOG_CHECK" >> $LOGFILE_INSTALL echo "[$(date '+%H:%M:%S')] PWD_CHECK="$PWD_CHECK >> $LOGFILE_INSTALL elif [ "$PASSWD_DIALOG_CHECK" = "1" -o "$PWD_CHECK" = "1" ] then echo "[$(date '+%H:%M:%S')] PASSWD_DIALOG_CHECK=$PASSWD_DIALOG_CHECK Abbrechen gedrückt" >> $LOGFILE_INSTALL echo "[$(date '+%H:%M:%S')] PWD_CHECK=$PWD_CHECK Passwort falsch ($PASSWD_DIALOG)" >> $LOGFILE_INSTALL show_passive_popup "Das Passwort wurde falsch eingegeben bzw. der ABBRECHEN-Button wurde gedrückt" print_timestamp end close_progressbar exit 10 fi # Fortschrittsanzeige aktualisieren run_progressbar "2" "Auf Bestätigung des Benutzers warten" sleep 1 # Dialogbox mit Bestätigungsdialog ob Kernel wirklich installiert werden soll INSTALL_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") INSTALL_DIALOG_CHECK=$? #echo "Auswahl Array="${ARRAY_INSTALLABLE_KERNEL[$KERNEL_SELECTION]} #echo "Auswahl gekürzt="${ARRAY_INSTALLABLE_KERNEL[$KERNEL_SELECTION]%#not_installed} # Logmeldung schreiben if [ "$INSTALL_DIALOG_CHECK" = "0" ] then echo "[$(date '+%H:%M:%S')] INSTALL_DIALOG_CHECK=$INSTALL_DIALOG_CHECK" >> $LOGFILE_INSTALL # Fortschrittsanzeige aktualisieren run_progressbar "3" "Ausgewählter Kernel wird jetzt installiert" elif [ "$INSTALL_DIALOG_CHECK" = "1" ] then # nein gedrückt echo "[$(date '+%H:%M:%S')] INSTALL_DIALOG_CHECK=$INSTALL_DIALOG_CHECK Nein gedrückt" >> $LOGFILE_INSTALL show_passive_popup "Kernelversion $KERNEL_SELECTION_SHORT wurde nicht installiert, NEIN-Button wurde gedrückt" print_timestamp end close_progressbar exit 2 elif [ "$INSTALL_DIALOG_CHECK" = "2" ] then # abbrechen gedrückt echo "[$(date '+%H:%M:%S')] INSTALL_DIALOG_CHECK=$INSTALL_DIALOG_CHECK Abbrechen gedrückt" >> $LOGFILE_INSTALL show_passive_popup "Kernelversion $KERNEL_SELECTION_SHORT wurde nicht installiert, ABBRECHEN-Button wurde gedrückt" print_timestamp end close_progressbar exit 3 fi # Zum testen den Optionsparameter "--yes" (Pakete installieren ohne Nachfrage) von "apt install" durch "--simulate" (Ausführung des Kommandos nur simulieren) ersetzen #echo "$PASSWD_DIALOG" | sudo -S apt install --simulate $KERNEL_PACKAGES 1>> $LOGFILE_INSTALL 2>> $LOGFILE_INSTALL echo "$PASSWD_DIALOG" | sudo -S apt install --yes $KERNEL_PACKAGES 1>> $LOGFILE_INSTALL 2>> $LOGFILE_INSTALL INSTALLATION_CHECK=$? echo "[$(date '+%H:%M:%S')] INSTALLATION_CHECK=$INSTALLATION_CHECK" >> $LOGFILE_INSTALL # Logmeldung schreiben if [ "$INSTALLATION_CHECK" = "0" ] then show_passive_popup "Die Kernelversion $KERNEL_SELECTION_SHORT konnte erfolgreich installiert werden" else show_passive_popup "Achtung Fehler! Die Kernelversion $KERNEL_SELECTION_SHORT konnte nicht erfolgreich installiert werden" fi # Fortschrittsanzeige aktualisieren run_progressbar "4" "temporäres Logfile sichern" sleep 2 copy_log close_progressbar #EOF
run_kernel_installer.sh.txt · Zuletzt geändert: 2021/08/31 13:35 von dwadmin