3
# dkms_autoinstaller A service to automatically install DKMS modules
6
# description: An autoinstaller bootup service for DKMS
9
# Provides: dkms_autoinstaller dkms
10
# Default-Start: 2 3 4 5
12
# Required-Start: $local_fs
13
# Required-Stop: $null
14
# Short-Description: Automatically install DKMS modules for new kernels
15
# Description: A service to automatically install DKMS modules for new kernels.
18
test -f /usr/sbin/dkms || exit 0
20
#We only have these functions on debian/ubuntu
21
# so on other distros just stub them out
22
if [ -f /lib/lsb/init-functions ]; then
23
. /lib/lsb/init-functions
24
if [ ! -f /etc/debian_version ]; then
25
alias log_daemon_msg=echo
26
log_end_msg() { if [ "$1" = "0" ]; then echo " Done. "; else echo " Failed. "; fi }
27
alias log_action_begin_msg=log_daemon_msg
28
alias log_action_end_msg=log_end_msg
35
local exitval_file=`mktemp /tmp/dkms.XXXXXX`
36
if [ "$3" = background ] && [ -z "$verbose" ]; then
37
(eval $1 >/dev/null 2>&1; echo "exitval=$?" >> "$exitval_file") &
38
while [ -e "$exitval_file" ] && ! [ -s "$exitval_file" ]; do
45
[ $exitval -gt 0 ] && logger -t dkms_autoinstaller "(bad exit status: $exitval)"
52
[ -n "$2" ] && kernel=$2
54
kernel_preparation_done=""
55
dkms_tree="/var/lib/dkms"
56
. /etc/dkms/framework.conf 2>/dev/null
58
# See how we were called.
61
log_daemon_msg "Running DKMS auto installation service for kernel $kernel"
63
if [ -z "$kernel" ]; then
64
if [ -L /vmlinuz -a -e /vmlinuz ]; then
65
linktarget="$(basename "$(readlink /vmlinuz)")"
66
kernel="${linktarget##vmlinuz-}"
72
# Iterate over the modules
73
for modulepath in $(find "$dkms_tree" -maxdepth 1 -mindepth 1 -type d); do
75
module_in_tree=${modulepath##*/}
76
# Determine which versions to show status for
80
already_installed_version=""
81
for versioned_path in $(find "$modulepath" -maxdepth 1 -mindepth 1 -type d -a -not -name original_module); do
82
version_count=$(($version_count + 1))
83
version_in_tree="${versioned_path##*/}"
85
if [ -f $versioned_path/source/dkms.conf ]; then
86
do_autoinstall=$(sed -n -e 's/^\(str *\)\?AUTOINSTALL=\(.*\)$/\2/gp;' $versioned_path/source/dkms.conf)
88
current_state="broken"
92
# Get the current state
93
# a mod can be both built and installed-weak (stupid, but could be)
94
# but installed-weak comes last, so use tail
95
current_state=`dkms status -m $module_in_tree -v $version_in_tree -k $kernel -a $arch 2>/dev/null | awk {'print $5'} | tail -n 1`
96
[ "$current_state" = "installed" -o "$current_state" = "installed-weak" ] && already_installed="true" && already_installed_version=$version_in_tree
99
log_action_begin_msg " $module_in_tree ($version_in_tree)"
101
# Based on what we know, either do it or not
102
if [ "$current_state" = "broken" ]; then
103
logger -t dkms_autoinstaller "$module_in_tree ($version_in_tree): Unable to locate $versioned_path/source/dkms.conf"
104
logger -t dkms_autoinstaller " DKMS tree must be manually fixed"
107
elif [ -n "$already_installed" ]; then
109
elif [ -z "$do_autoinstall" ]; then
110
logger -t dkms_autoinstaller "$module_in_tree ($version_in_tree): AUTOINSTALL not set in its dkms.conf."
112
elif [ -n "$do_autoinstall" ] && [ "$version_count" -gt 1 ]; then
113
logger -t dkms_autoinstaller "$module_in_tree: Multiple versions in DKMS. Unsure what to do. Resolve manually."
116
logger -t dkms_autoinstaller "$module_in_tree ($version_in_tree): Installing module on kernel $kernel."
117
if [ "$current_state" != "built" ] && ! [ -e /lib/modules/$kernel/build/include ]; then
118
logger -t dkms_autoinstaller " Kernel headers for $kernel are not installed. Cannot install this module."
119
logger -t dkms_autoinstaller " Try installing linux-headers-$kernel or equivalent."
121
elif [ "$current_state" != "built" ] && [ -e /lib/modules/$kernel/build/include ]; then
123
if [ -z "$kernel_preparation_done" ]; then
124
invoke_command "dkms build -m $module_in_tree -v $version_in_tree -k $kernel -a $arch -q --no-clean-kernel" "." background
126
kernel_preparation_done="true"
128
invoke_command "dkms build -m $module_in_tree -v $version_in_tree -k $kernel -a $arch --no-prepare-kernel --no-clean-kernel -q" "." background
131
if [ "$return_status" -eq 0 ]; then
132
invoke_command "dkms install -m $module_in_tree -v $version_in_tree -k $kernel -a $arch" "." background
135
logger -t dkms_autoinstaller " Build failed. Installation skipped."
139
invoke_command "dkms install -m $module_in_tree -v $version_in_tree -k $kernel -a $arch -q" "." background
141
if [ "$return_status" -eq 101 ]; then
142
logger -t dkms_autoinstaller " A newer module version than this already exists in kernel."
143
logger -t dkms_autoinstaller " Skipping install... (you can manually install later with --force)"
144
elif [ "$return_status" -ne 0 ]; then
145
logger -t dkms_autoinstaller " Installation failed!"
150
if [ -z "$modules_needing_status" ]; then
154
stop|restart|force-reload|status|reload)
158
echo "Usage: $0 {start}"