~ubuntu-branches/ubuntu/raring/dkms/raring

« back to all changes in this revision

Viewing changes to .pc/improved-error-messages.patch/dkms_autoinstaller

  • Committer: Bazaar Package Importer
  • Author(s): Giuseppe Iuculano, Michael Gilbert, Giuseppe Iuculano
  • Date: 2010-06-04 13:53:23 UTC
  • mto: This revision was merged to the branch mainline in revision 38.
  • Revision ID: james.westby@ubuntu.com-20100604135323-gq71k8zml0ateckx
Tags: 2.1.1.2-3
[ Michael Gilbert ]
* Update to source format 3 (quilt) for better patch management/handling.
* Improve the status info displayed during the kernel postinst, and
  provide informative/useful messages when things go awry.
* Fix bashism in dkms_common.postinst (closes: #581079).
* Document odd behavior of MAKE[#] (closes: #553625).
* Document package naming convention (closes: #571753).
* Use system TMPDIR setting in all scripts (closes: #581568).

[ Giuseppe Iuculano ]
* [208b229] Added a lintian override for python-script-but-no-python-
  dep, dkms.py is an apport hook

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/bin/sh
 
2
#
 
3
# dkms_autoinstaller        A service to automatically install DKMS modules
 
4
#                           for new kernels.
 
5
# chkconfig: 345 04 04
 
6
# description: An autoinstaller bootup service for DKMS
 
7
#
 
8
### BEGIN INIT INFO
 
9
# Provides: dkms_autoinstaller dkms
 
10
# Default-Start: 2 3 4 5
 
11
# Default-Stop:
 
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.
 
16
### END INIT INFO
 
17
 
 
18
test -f /usr/sbin/dkms || exit 0
 
19
 
 
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
 
29
    fi
 
30
fi
 
31
 
 
32
invoke_command ()
 
33
{
 
34
    local exitval=0
 
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
 
39
            sleep 3
 
40
        done
 
41
        . "$exitval_file"
 
42
    else
 
43
        eval $1; exitval=$?
 
44
    fi
 
45
    [ $exitval -gt 0 ] && logger -t dkms_autoinstaller "(bad exit status: $exitval)"
 
46
    rm -f "$exitval_file"
 
47
    return $exitval
 
48
}
 
49
 
 
50
# Set Variables
 
51
uname=`uname -mr`
 
52
[ -n "$2" ] && kernel=$2
 
53
arch=${uname#* }
 
54
kernel_preparation_done=""
 
55
dkms_tree="/var/lib/dkms"
 
56
. /etc/dkms/framework.conf 2>/dev/null
 
57
 
 
58
# See how we were called.
 
59
case "$1" in
 
60
  start)
 
61
    log_daemon_msg "Running DKMS auto installation service for kernel $kernel"
 
62
 
 
63
    if [ -z "$kernel" ]; then
 
64
        if [ -L /vmlinuz -a -e /vmlinuz ]; then
 
65
            linktarget="$(basename "$(readlink /vmlinuz)")"
 
66
            kernel="${linktarget##vmlinuz-}"
 
67
        else
 
68
            kernel=${uname% *}
 
69
        fi
 
70
    fi
 
71
 
 
72
    # Iterate over the modules
 
73
    for modulepath in $(find "$dkms_tree" -maxdepth 1 -mindepth 1 -type d); do
 
74
 
 
75
        module_in_tree=${modulepath##*/}
 
76
        # Determine which versions to show status for
 
77
        do_autoinstall=""
 
78
        version_count=0
 
79
        already_installed=""
 
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##*/}"
 
84
 
 
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)
 
87
            else
 
88
                current_state="broken"
 
89
                continue
 
90
            fi
 
91
 
 
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
 
97
        done
 
98
 
 
99
        log_action_begin_msg " $module_in_tree ($version_in_tree)"
 
100
 
 
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"
 
105
            log_action_end_msg 1
 
106
            continue
 
107
        elif [ -n "$already_installed" ]; then
 
108
            log_action_end_msg 0
 
109
        elif [ -z "$do_autoinstall" ]; then
 
110
            logger -t dkms_autoinstaller "$module_in_tree ($version_in_tree): AUTOINSTALL not set in its dkms.conf."
 
111
            log_action_end_msg 0
 
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."
 
114
            log_action_end_msg 1
 
115
        else
 
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."
 
120
                log_action_end_msg 1
 
121
            elif [ "$current_state" != "built" ] && [ -e /lib/modules/$kernel/build/include ]; then
 
122
                return_status=""
 
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
 
125
                    return_status="$?"
 
126
                    kernel_preparation_done="true"
 
127
                else
 
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
 
129
                    return_status="$?"
 
130
                fi
 
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
 
133
                    log_action_end_msg 0
 
134
                else
 
135
                    logger -t dkms_autoinstaller "  Build failed.  Installation skipped."
 
136
                    log_action_end_msg 1
 
137
                fi
 
138
            else
 
139
                invoke_command "dkms install -m $module_in_tree -v $version_in_tree -k $kernel -a $arch -q" "." background
 
140
                return_status=$?
 
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!"
 
146
                fi
 
147
            fi
 
148
        fi
 
149
    done
 
150
    if [ -z "$modules_needing_status" ]; then
 
151
        log_end_msg 0
 
152
    fi
 
153
    ;;
 
154
  stop|restart|force-reload|status|reload)
 
155
    # ignore
 
156
    ;;
 
157
  *)
 
158
    echo "Usage: $0 {start}"
 
159
esac
 
160
 
 
161
exit 0