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

Reply via email to