summaryrefslogtreecommitdiffstats
path: root/core/modules/kexec-reboot
diff options
context:
space:
mode:
authorSimon Rettberg2020-08-05 17:55:14 +0200
committerYour Name2020-08-05 17:55:14 +0200
commit4222344e4788616de37e65b99483940e6d60bab6 (patch)
treec889918cc5291d6fef5238de82489b84d8265a44 /core/modules/kexec-reboot
parent[run-virt] Update README with missing TMPCONFIG (diff)
downloadmltk-4222344e4788616de37e65b99483940e6d60bab6.tar.gz
mltk-4222344e4788616de37e65b99483940e6d60bab6.tar.xz
mltk-4222344e4788616de37e65b99483940e6d60bab6.zip
[kexec-reboot] Add splash screen
Diffstat (limited to 'core/modules/kexec-reboot')
-rw-r--r--core/modules/kexec-reboot/data/etc/systemd/system/systemd-kexec.service.d/00-splash.conf2
-rw-r--r--core/modules/kexec-reboot/data/opt/openslx/images/kexec-reboot.ppmbin0 -> 85064 bytes
-rwxr-xr-xcore/modules/kexec-reboot/data/opt/openslx/scripts/systemd-kexec_load6
-rwxr-xr-xcore/modules/kexec-reboot/data/opt/openslx/scripts/systemd-kexec_pre36
4 files changed, 43 insertions, 1 deletions
diff --git a/core/modules/kexec-reboot/data/etc/systemd/system/systemd-kexec.service.d/00-splash.conf b/core/modules/kexec-reboot/data/etc/systemd/system/systemd-kexec.service.d/00-splash.conf
new file mode 100644
index 00000000..8d545b1b
--- /dev/null
+++ b/core/modules/kexec-reboot/data/etc/systemd/system/systemd-kexec.service.d/00-splash.conf
@@ -0,0 +1,2 @@
+[Service]
+ExecStartPre=-/opt/openslx/scripts/systemd-kexec_pre
diff --git a/core/modules/kexec-reboot/data/opt/openslx/images/kexec-reboot.ppm b/core/modules/kexec-reboot/data/opt/openslx/images/kexec-reboot.ppm
new file mode 100644
index 00000000..6e3e96cb
--- /dev/null
+++ b/core/modules/kexec-reboot/data/opt/openslx/images/kexec-reboot.ppm
Binary files differ
diff --git a/core/modules/kexec-reboot/data/opt/openslx/scripts/systemd-kexec_load b/core/modules/kexec-reboot/data/opt/openslx/scripts/systemd-kexec_load
index 4a78e83e..c7dae7bc 100755
--- a/core/modules/kexec-reboot/data/opt/openslx/scripts/systemd-kexec_load
+++ b/core/modules/kexec-reboot/data/opt/openslx/scripts/systemd-kexec_load
@@ -96,7 +96,11 @@ kexec_load() {
newKcl="$( cat /proc/cmdline )"
# TODO patch all the ipv4.* vars if they exist
fi
- newKcl="$(printf "%s" "${newKcl}" | sed -r 's/\bvga=\S*//g') vga=current"
+ if grep -q '\bsplash\b' /proc/cmdline; then
+ newKcl="$(printf "%s" "${newKcl}" | sed -r 's/\bvga=\S*//g') vga=current"
+ else
+ newKcl="$(printf "%s" "${newKcl}" | sed -r 's/\bvga=\S*//g')"
+ fi
if ! kexec -l "${newKernel}" --initrd "${newInitRd}" --command-line="${newKcl}"; then
echo "Failed to load kernel/initrd from ${tempdir}"
diff --git a/core/modules/kexec-reboot/data/opt/openslx/scripts/systemd-kexec_pre b/core/modules/kexec-reboot/data/opt/openslx/scripts/systemd-kexec_pre
new file mode 100755
index 00000000..816a73ef
--- /dev/null
+++ b/core/modules/kexec-reboot/data/opt/openslx/scripts/systemd-kexec_pre
@@ -0,0 +1,36 @@
+#!/bin/ash
+
+grep -q '\bsplash\b' /proc/cmdline || exit 0
+
+screen_size="$(fbset | awk '$1 = /geometry/ {print $2" "$3}')"
+screen_width="${screen_size%% *}"
+screen_height="${screen_size#* }"
+[ "$screen_width" -gt 0 ] || exit 0
+[ "$screen_height" -gt 0 ] || exit 0
+fbsplash_cfg="/tmp/fbsplash.cfg"
+fbsplash_ppm="/opt/openslx/images/kexec-reboot.ppm"
+if [ -s "$fbsplash_ppm" ]; then
+ ppm_size="$(sed -n 2p "$fbsplash_ppm")"
+else
+ exit 0
+fi
+ppm_width="${ppm_size%% *}"
+ppm_height="${ppm_size#* }"
+ppm_height="${ppm_height%% *}" # make sure nothing weird is trailing
+img_top="$(( ( screen_width - ppm_width ) / 2 ))"
+img_left="$(( ( screen_height - ppm_height ) / 2 ))"
+# just checking if nothing too weird is set
+if [ -n "$img_left" ] && [ -n "$img_top" ] \
+ && [ "$img_left" -ge 0 ] && [ "$img_left" -lt 8096 ] \
+ && [ "$img_top" -ge 0 ] && [ "$img_top" -lt 8096 ]; then
+ printf "IMG_TOP=%d\nIMG_LEFT=%d\n" \
+ "$img_top" "$img_left" \
+ > "$fbsplash_cfg"
+ kill -SIGRTMIN+21 1
+ echo -e "\033[?25l" > /dev/console
+ clear > /dev/console
+ fbsplash -b -i "$fbsplash_cfg" -s "$fbsplash_ppm"
+ rm -f -- "$fbsplash_cfg"
+fi
+exit 0
+