#!/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 "
Alle verfügbaren und installierbaren Kernel
sind weiter unten aufgelistet.

Kernel-Majorversion "$KERNEL_MAJOR_VERS"

\n\n

Laufender Kernel $(uname -r|cut -d"-" -f1-2)


Bereits lokal installierte Kernel der Versionsreihe $KERNEL_MAJOR_VERS
werden nicht angezeigt. Bitte wählen Sie ihre
gewünschte Kernelversion zur Installation aus.
" $(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 "
Alle verfügbaren und installierbaren Kernel
sind weiter unten aufgelistet.

Majorversion(en) $KERNEL_MAJOR_VERS_ALL

\n\n

Laufender Kernel $(uname -r|cut -d"-" -f1-2)


Bereits lokal installierte Kernel aller oben genannten
Versionsreihen werden nicht angezeigt. Bitte wählen
Sie ihre gewünschte Kernelversion zur Installation aus.
" $(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