aboutsummaryrefslogtreecommitdiffstats
path: root/main/kernel-hooks/kernel-hooks.trigger
diff options
context:
space:
mode:
Diffstat (limited to 'main/kernel-hooks/kernel-hooks.trigger')
-rw-r--r--main/kernel-hooks/kernel-hooks.trigger50
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