summaryrefslogtreecommitdiff
path: root/libre/dkms-libre/dkms.systemd
diff options
context:
space:
mode:
Diffstat (limited to 'libre/dkms-libre/dkms.systemd')
-rw-r--r--libre/dkms-libre/dkms.systemd61
1 files changed, 61 insertions, 0 deletions
diff --git a/libre/dkms-libre/dkms.systemd b/libre/dkms-libre/dkms.systemd
new file mode 100644
index 000000000..03e6bfe97
--- /dev/null
+++ b/libre/dkms-libre/dkms.systemd
@@ -0,0 +1,61 @@
+#!/bin/bash
+
+. /etc/default/dkms
+
+# list dkms modules for the current running kernel
+list_dkms_modules() {
+ shopt -s nullglob
+ declare -a DKMS_MOULES
+ # dkms status needs uname -r to list correctly intalled version for current kernel
+ local modules_path=($(dkms status -k "$(uname -r)"|sed -rn 's#(.*), (.*), (.*), (.*): installed#\1/\2/\3/\4#p'))
+ for p in "${modules_path[@]}"; do
+ for m in /var/lib/dkms/"$p"/module/*.ko{,gz}; do
+ m=${m##*/}
+ m=${m%.gz}
+ m=${m%.ko}
+ DKMS_MODULES+=("$m")
+ done
+ done
+}
+
+# load installed kernel modules for the current kernel version
+load_dkms_modules() {
+ local ret=0
+ list_dkms_modules
+ for m in "${DKMS_MODULES[@]}"; do
+ modprobe "$m"
+ ret+=$?
+ done
+ return $ret
+}
+
+# unload installed kernel modules for the current kernel version
+unload_dkms_modules() {
+ list_dkms_modules
+ # ask for removal
+ for m in "${DKMS_MODULES[@]}"; do
+ modprobe --remove --quiet "$m"
+ done
+ # check modules are unloaded
+ # sometimes modprobe -r fail but modules are removed
+ for m in "${DKMS_MODULES[@]}"; do
+ [[ -e /sys/modules/$m ]] && return 1
+ done
+ return 0
+}
+
+case "$1" in
+ start)
+ dkms autoinstall -k "$(uname -r)"
+ [[ $LOAD =~ [Yy][Ee][Ss] ]] && load_dkms_modules
+ ;;
+ stop)
+ [[ $UNLOAD =~ [Yy][Ee][Ss] ]] && unload_dkms_modules
+ ;;
+ *)
+ echo "usage: $0 {start|stop}" >&2
+ ;;
+esac
+
+:
+# vim:set ts=2 sw=2 ft=sh et: