diff options
Diffstat (limited to 'main/kernel-hooks/kernel-hooks.trigger')
-rw-r--r-- | main/kernel-hooks/kernel-hooks.trigger | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/main/kernel-hooks/kernel-hooks.trigger b/main/kernel-hooks/kernel-hooks.trigger new file mode 100644 index 00000000000..5d05d3f54e4 --- /dev/null +++ b/main/kernel-hooks/kernel-hooks.trigger @@ -0,0 +1,50 @@ +#!/bin/sh + +PROGNAME='kernel-hooks' +HOOKS_DIR='/etc/kernel-hooks.d' + +[ -d $HOOKS_DIR ] || exit 0 + +flavors_vers= +for path in "$@"; do + name="${path##*/}" + + case "$name" in + [0-9]*-[0-9]*-*) ;; # go on + *) echo "$PROGNAME: ERROR: invalid kernel version: $name!" >&2; exit 1;; + esac + + flavor=${name#*-}; flavor=${flavor#*-} + ver=${name%-$flavor} + flavors_vers="$flavors_vers $flavor:$ver" +done + +for flavor in $(printf '%s\n' $flavors_vers | sort | cut -d: -f1 | uniq); do + relfile=/usr/share/kernel/$flavor/kernel.release + + new_ver= + old_ver= + for fv in $flavors_vers; do + [ "${fv%:*}" = "$flavor" ] || continue + ver=${fv#*:} + + [ "$(cat "$relfile" 2>/dev/null)" = "$ver-$flavor" ] \ + && new_ver=$ver \ + || old_ver=$ver + done + + for hook in $HOOKS_DIR/*; do + [ -x "$hook" ] || continue + name=${hook##*/} + + echo "$PROGNAME: executing hook $name ($flavor, $new_ver, $old_ver)" >&2 + + $hook "$flavor" "$new_ver" "$old_ver" \ + || echo "$PROGNAME: ERROR: hook $name failed" >&2 + done +done + +# Triggers exiting with a non-zero status cause headaches. APK marks the +# corresponding package and the world as broken. Consequently, it exists with +# status 1 even after e.g. successful installation of a new package. +exit 0 |