summaryrefslogtreecommitdiffstats
path: root/builder/modules.d/dnbd3-rootfs/hooks/copy-dracut-systemd-files-into-newroot.sh
diff options
context:
space:
mode:
Diffstat (limited to 'builder/modules.d/dnbd3-rootfs/hooks/copy-dracut-systemd-files-into-newroot.sh')
-rwxr-xr-xbuilder/modules.d/dnbd3-rootfs/hooks/copy-dracut-systemd-files-into-newroot.sh66
1 files changed, 66 insertions, 0 deletions
diff --git a/builder/modules.d/dnbd3-rootfs/hooks/copy-dracut-systemd-files-into-newroot.sh b/builder/modules.d/dnbd3-rootfs/hooks/copy-dracut-systemd-files-into-newroot.sh
new file mode 100755
index 00000000..a887d8c9
--- /dev/null
+++ b/builder/modules.d/dnbd3-rootfs/hooks/copy-dracut-systemd-files-into-newroot.sh
@@ -0,0 +1,66 @@
+#!/usr/bin/env bash
+# -*- coding: utf-8 -*-
+# region imports
+source '/usr/lib/rebash/core.sh'
+core.import exceptions
+core.import logging
+type emergency_shell >/dev/null 2>&1 || source /lib/dracut-lib.sh
+# endregion
+exceptions.try
+{
+logging.set_commands_level debug
+logging.set_level debug
+[[ "$SLX_LOG_FILE_PATH" == "" ]] && SLX_LOG_FILE_PATH=/var/log/openslx
+logging.set_log_file "$SLX_LOG_FILE_PATH"
+
+# Needed to be able to go back to dracut at system shutdown.
+temporary_directory_path="$(mktemp --directory)"
+mount --options bind / "$temporary_directory_path"
+cp --recursive --no-target-directory "$temporary_directory_path" /run/initramfs
+umount "$temporary_directory_path"
+rm --dir "$temporary_directory_path"
+}
+exceptions.catch
+{
+ logging.warn "Failed to copy initramfs to /run/initramfs, shutdown hooks" \
+ "will not work."
+}
+
+exceptions.try
+{
+# Dracut may not be installed on the new root. Thus copy all services over.
+systemd_system_unit_path="$(dirname "$(find / -name dracut-mount.service \
+ -type f -print -quit)")"
+new_systemd_system_unit_path="${NEWROOT}/lib/systemd/system"
+
+mkdir --parents "$new_systemd_system_unit_path/initrd.target.wants"
+for file in \
+ dracut-cmdline.service \
+ dracut-initqueue.service \
+ dracut-mount.service \
+ dracut-pre-mount.service \
+ dracut-pre-pivot.service \
+ dracut-pre-trigger.service \
+ dracut-pre-udev.service
+do
+ cp "${systemd_system_unit_path}/${file}" \
+ "${new_systemd_system_unit_path}/${file}"
+ # "ln" returns an error if the link already exists.
+ source_path="../${file}"
+ target_path="${new_systemd_system_unit_path}/initrd.target.wants/${file}"
+ ln --symbolic "$source_path" "$targetPath" &>/dev/null || \
+ logging.warn "Failed to link \"$source_path\" to \"$target_path\"."
+done
+}
+exceptions.catch
+{
+ logging.error "$exceptions_last_traceback"
+ emergency_shell "error in ${BASH_SOURCE[0]}"
+}
+
+# region vim modline
+
+# vim: set tabstop=4 shiftwidth=4 expandtab:
+# vim: foldmethod=marker foldmarker=region,endregion:
+
+# endregion