aboutsummaryrefslogtreecommitdiffsponsor
diff options
context:
space:
mode:
-rw-r--r--efi-sync67
1 files changed, 41 insertions, 26 deletions
diff --git a/efi-sync b/efi-sync
index 1129a16..02ab587 100644
--- a/efi-sync
+++ b/efi-sync
@@ -1,6 +1,6 @@
#!/bin/bash
-trap graceful_exit QUIT TERM
+trap graceful_exit INT TERM
# Inofity events which signal something changed.
MODIFICATION_EVENTS="CREATE,CLOSE_WRITE,MOVED_TO,MOVED_FROM,MOVE"
@@ -12,10 +12,10 @@ graceful_exit () {
STOP=true
if [[ ! -z "$KPID" ]]; then
- kill -TERM $KPID
+ kill -TERM $KPID >/dev/null 2>/dev/null
fi
if [[ ! -z "$MPID" ]]; then
- kill -TERM $MPID
+ kill -TERM $MPID >/dev/null 2>/dev/null
fi
}
@@ -56,12 +56,12 @@ efi_install () {
KERNEL_VERSION="$(basename $(realpath "$KERNEL") | sed -E 's/vmlinuz-(.*)-(.*)/\2/')"
- log "Installing $(realpath "$KERNEL")."
cp -H "$KERNEL" "${EFI_KERNEL}"|| log "Failed to copy '${KERNEL}' into your EFI at '${EFI_KERNEL}'."
+ log "Installed $(realpath "$KERNEL")."
if [[ -f /etc/mkinitrd.conf ]]; then
- log "Installing the initial RAM disk for kernel version '${KERNEL_VERSION}'."
mkinitrd -F -c -k "${KERNEL_VERSION}" >/dev/null 2>&1 || log "mkinitrd failed to build and install your initial ramdisk."
+ log "Installed the initial RAM disk for kernel version '${KERNEL_VERSION}'."
fi
}
@@ -73,43 +73,58 @@ efi_watch () {
while ! $STOP; do
log "Watching ${KERNEL} for updates."
- inotifywait "$(dirname "$KERNEL")" --include "./$(basename $KERNEL)$" \
+ >/dev/null inotifywait "$(dirname "$KERNEL")" --include "./$(basename $KERNEL)$" \
--event "$MODIFICATION_EVENTS" \
- --quiet \
- >/dev/null &
+ --quiet &
KPID="$!"
# Watching for directory updates is enough and helps avoid the system's watch limit.
- find /lib/firmware /lib/modules -type d \
- | xargs inotifywait \
+ readarray -d '' INITRD_FILES < <(find /lib/firmware /lib/modules -type d -print0)
+ >/dev/null inotifywait \
--event "$MODIFICATION_EVENTS" \
--quiet \
--recursive \
- >/dev/null &
+ "${INITRD_FILES[@]}" &
MPID="$!"
- if ! wait -n "$KPID" "$MPID"; then
- kill -QUIT $KPID $MPID >/dev/null 2>&1
+ if ! wait -n "$KPID" "$MPID" || $STOP; then
+ kill -TERM $KPID $MPID >/dev/null 2>/dev/null
continue
fi
- kill -QUIT $KPID $MPID >/dev/null 2>&1
- unset KPID
- unset MPID
+ kill -TERM $KPID $MPID >/dev/null 2>/dev/null
+ unset KPID MPID
+
+ # Be safe and consider changes to the kernel system which happen during
+ # installation.
+ #
+ # Use file creation time to check if re-installation is needed.
+ TIMESTAMP_FILE="$(mktemp -t "efi-sync.XXXXXXX")"
+
+ while true; do
+ touch "$TIMESTAMP_FILE"
+
+ if [[ -f /etc/mkinitrd.conf ]]; then
+ local count=0
- if [[ -f /etc/mkinitrd.conf ]]; then
- local count=0
+ while [[ $count -lt ${WAIT_TIME} ]]; do
+ while ps -C "${INSTALL_PROGRAMS}" >/dev/null; do
+ let "count = 0"
+ sleep 1
+ done
- while [[ $count -lt ${WAIT_TIME} ]]; do
- while ps -C "${INSTALL_PROGRAMS}" >/dev/null; do
- let "count = 0"
- sleep 1
+ let "count = $count + 1"
done
+ fi
- let "count = $count + 1"
- done
- fi
+ efi_install
- efi_install
+ NEW_FILES="$(find "$KERNEL" /lib/firmware /lib/modules -newer "$TIMESTAMP_FILE")"
+ if [[ -z "$NEW_FILES" ]]; then
+ break
+ fi
+ done
+
+ rm "$TIMESTAMP_FILE"
done
log "Stopped watching ${KERNEL} for updates."