Perhaps it should go in system - I'll leave the details to you.
You need to modify system/modules to "use" this service.
dkms.i:
# NAME: dkms_autoinstaller
# DESCRIPTION: A service to automatically install DKMS modules for new kernels
# AUTHOR: Original script author unknown.
# ADAPTED BY: rick_777
# WWW:
service service/dkms {
need = system/mountfs/essential;
script start = {
[ -f /usr/sbin/dkms ] || exit 0
function invoke_command ()
{
local exitval=0
local exitval_file=`/bin/mktemp /tmp/dkms.XXXXXX`
[ -n "$verbose" ] && echo -e "DKMS Autoinstaller: Executing: $1"
if [ "$3" = background ]; then
(eval $1 >/dev/null 2>&1; echo "exitval=$?" >> "$exitval_file") &
wait
. "$exitval_file"
else
eval $1; exitval=$?
fi
rm -f "$exitval_file"
echo -en "\n"
return $exitval
}
function install_dkms_module() {
local module_in_tree="$1"
local version_in_tree="$2"
local kernel="$3"
local arch="$4"
local current_state="$5"
local status_text="DKMS Autoinstaller ($module_in_tree)"
if [ "$current_state" != "built" ] && ! [ -e
/lib/modules/$kernel/build/include ]; then
echo "$status_text: Kernel source for $kernel not
installed. Cannot install this module."
elif [ "$current_state" != "built" ] && [ -e
/lib/modules/$kernel/build/include ]; then
return_status=""
if [ -z "$kernel_preparation_done" ]; then
invoke_command "/usr/sbin/dkms build -m
$module_in_tree -v $version_in_tree -k $kernel -a $arch -q
--no-clean-kernel" "." background
return_status="$?"
kernel_preparation_done="true"
else
invoke_command "/usr/sbin/dkms build -m
$module_in_tree -v $version_in_tree -k $kernel -a $arch
--no-prepare-kernel --no-clean-kernel -q" "." background
return_status="$?"
fi
if [ "$return_status" -eq 0 ]; then
invoke_command "/usr/sbin/dkms install -m
$module_in_tree -v $version_in_tree -k $kernel -a $arch -q" "."
background
else
echo "$status_text: Build failed (error
$return_status), cannot install!"
fi
else
invoke_command "/usr/sbin/dkms install -m
$module_in_tree -v $version_in_tree -k $kernel -a $arch -q" "."
background
return_status=$?
if [ "$return_status" -eq 101 ]; then
# A newer module version than this already
exists in this kernel
echo "$status_text: Newer or same version
installed already. Skipping."
echo "$status_text: To force install, run:
/usr/sbin/dkms install -m $module_in_tree -v $version_in_tree -k
$kernel -a $arch --force"
elif [ "$return_status" -ne 0 ]; then
echo "$status_text: Installation failed
(error $return_status)!"
fi
fi
}
function install_dkms_modules() {
local curmodule=""
local curversion=""
local curkernel=""
local curarch=""
local curstate=""
local displayed_info=""
[ -e "$install_queue" ] || return 0
cat "$install_queue" | while read curmodule curversion
curkernel curarch curstate; do
if [ -n "$curmodule" ]; then
if [ -z "$displayed_info" ]; then
displayed_info="true"
echo "DKMS Autoinstaller: Installing modules..."
fi
if [ -z "$kernel_preparation_done" ]; then
# the first installation is done in the
foreground to allow kernel preparation to take place
install_dkms_module $curmodule $curversion
$curkernel $curarch $curstate && kernel_preparation_done="true"
else
# subsequent installations are done in parallel
install_dkms_module $curmodule $curversion
$curkernel $curarch $curstate &
fi
fi
done
wait
}
function check_dkms_module() {
local module_in_tree="$1"
# Determine which versions to show status for
local do_autoinstall=""
local version_count=0
local already_installed=""
local already_installed_version=""
local filename=""
local status_text=""
local ready_to_install=""
for filename in `ls "$dkms_tree/$module_in_tree"`; do
if [ -d "$dkms_tree/$module_in_tree/$filename" ]
&& ! [ -h "$dkms_tree/$module_in_tree/$filename" ] && [ "$filename" !=
"original_module" ]; then
version_count=$(($version_count + 1))
version_in_tree="$filename"
# Source in its dkms.conf to see if we
should autoinstall
AUTOINSTALL=""
.
$dkms_tree/$module_in_tree/$version_in_tree/source/dkms.conf
[ `echo "$AUTOINSTALL" | grep -ic "^y"` -gt 0
] && do_autoinstall="yes"
# Get the current state
# a mod can be both built and installed-weak
(stupid, but could be)
# but installed-weak comes last, so use tail
current_state=`dkms status -m $module_in_tree
-v $version_in_tree -k $kernel -a $arch 2>/dev/null | /bin/awk {'print
$5'} | tail -n 1`
[ "$current_state" = "installed" -o
"$current_state" = "installed-weak" ] && already_installed="true" &&
already_installed_version=$version_in_tree
fi
done
status_text="DKMS Autoinstaller: $module_in_tree"
# Based on what we know, either do it or not
if [ -n "$already_installed" ]; then
status_text="$status_text: Version
$already_installed_version already installed (OK)."
elif [ -z "$do_autoinstall" ]; then
status_text="$status_text: AUTOINSTALL not set in
its dkms.conf."
elif [ -n "$do_autoinstall" ] && [ "$version_count"
-gt 1 ]; then
status_text="$status_text: Multiple versions in
DKMS. Unsure what to do. Resolve manually."
else
let ready_to_install="true"
status_text="$status_text: Installing version
($version_in_tree). This may take a while..."
fi
echo "$status_text"
if [ -n "$ready_to_install" ]; then
echo "$module_in_tree $version_in_tree $kernel
$arch $current_state" >> "$install_queue"
# install_dkms_module $module_in_tree
$version_in_tree $kernel $arch $current_state
fi
}
function check_dkms_modules() {
# Iterate over the modules
echo "DKMS Autoinstaller: Checking for modules to install..."
for filename in `ls "$dkms_tree"`; do
if [ -d "$dkms_tree/$filename" ] && ! [ -h
"$dkms_tree/$filename" ]; then
# the dkms checking is done in parallel to
save a couple of seconds
check_dkms_module "$filename" &
fi
done
wait
}
# Set Variables
kernel=`uname -r`
install_tree="/lib/modules"
[ `uname -m` = "x86_64" ] && [ `cat /proc/cpuinfo | grep -c
"Intel"` -gt 0 ] && [ `ls $install_tree/$kernel/build/configs
2>/dev/null | grep -c "ia32e"` -gt 0 ] && arch="ia32e" || arch=`uname
-m`
[[ $arch = i?86 ]] && arch=i586
kernel_preparation_done=""
dkms_tree="/var/lib/dkms"
. /etc/dkms/framework.conf 2>/dev/null
install_queue=`/bin/mktemp /tmp/dkms_install_queue.XXXXXX`
echo ""
#check and install the DKMS kernel modules
verbose=""
check_dkms_modules
verbose="true"
install_dkms_modules
echo "DKMS Autoinstaller finished."
rm -f "$install_queue"
exit 0
};
}
Tested in PCLinuxOS with Kernels 2.6.22.15 and 2.6.24.4
--
_______________________________________________
Initng mailing list
[email protected]
http://jw.dyndns.org/mailman/listinfo/initng