Benutzer-Werkzeuge

Webseiten-Werkzeuge


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

Kernel Installer 01 Kernel Installer 02 Kernel Installer 03


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