Current Path : /sbin/ |
Current File : //sbin/discover-modprobe |
#! /bin/sh # $Progeny$ # Copyright 2002 Hewlett-Packard Company # Copyright 2004 Progeny Linux Systems, Inc. # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. # Too bad we don't have something like sysexits.h for POSIX sh... EX_USAGE=64 # These defaults are only used if discover-config can not be found. # This is the case if /usr isn't mounted yet. sysconfdir=/etc localstatedir=/lib discover=discover if [ -x /usr/bin/discover-config ]; then sysconfdir="$(discover-config --sysconfdir)" localstatedir="$(discover-config --localstatedir)" fi if [ -x /sbin/discover ]; then discover=/sbin/discover elif [ -x /usr/bin/discover ]; then discover=/usr/bin/discover elif [ -x /bin/discover-static ]; then discover=/bin/discover-static fi conf="${sysconfdir}/discover-modprobe.conf" crashdir="${localstatedir}/discover" crashfile="${crashdir}/crash" . "${conf}" if [ -f /lib/lsb/init-functions ]; then . /lib/lsb/init-functions else log_begin_msg() { echo "$@"; } log_success_msg() { echo "$@"; } log_warning_msg() { echo "$@"; } fi . /etc/default/rcS [ -d "${crashdir}" ] || mkdir -p "${crashdir}" skip () { echo ${skip} | grep -q $1 return $? } usage () { cat <<EOF usage: $0 [-nv] EOF } # Determine if the module is already loaded is_loaded() { module="$(echo "$1" | sed 's/-/_/g')" if sed 's/^\([^ ]\+\).*/\1/;s/-/_/g' /proc/modules | grep -q "^${module}\$" ; then true else false fi } ############################################################################### nop= verbose=false while getopts nv ch; do case $ch in n) nop=echo ;; v) verbose=true ;; ?) usage exit ${EX_USAGE} esac done shift $((${OPTIND} - 1)) ############################################################################### module_details=$(${discover} --data-path=linux/module/name --data-path=linux/module/options --format="%s %s" --data-version=`uname -r` ${types} | grep -E -v '^ *$') # Poor man's uniq. module_details_uniq="" for module_info in ${module_details}; do echo ${module_details_uniq} | grep -Fw "$module_info" > /dev/null 2>&1 if [ $? -eq 1 ]; then module_details_uniq="${module_details_uniq} ${module_info}" fi done module_details=${module_details_uniq} ${verbose} && log_begin_msg "Discovering hardware: ${module_details}" if [ -f "${crashfile}" ]; then # The system crashed trying to load a module during the last boot # cycle, so add an appropriate "skip" line to # ${sysconfdir}/discover.conf. crashmodule=$(cat "${crashfile}") printf 'skip="${skip} %s"\n' ${crashmodule} >> "${conf}" rm -f "${crashfile}" sync fi # Load the modules. for module_info in ${module_details}; do module_name=$(echo ${module_info} | sed 's/^\([^ ]\+\).*/\1/') if [ ${module_name} = "ignore" ] || [ ${module_name} = "unknown" ]; then continue fi if skip ${module_name}; then ${verbose} && log_warning_msg "Skipping ${module_name}; edit ${conf} to re-enable it." continue fi if ! (modprobe -l "${module_name}*" | grep -q -E "${module_name}\.o|${module_name}\.ko"); then ${verbose} && log_warning_msg "Skipping ${module_name}; assuming it is compiled into the kernel." continue fi if is_loaded ${module_name} ; then log_warning_msg "Skipping Module ${module_name}. It's already loaded." >&2 continue fi ${verbose} && log_begin_msg "Loading ${module_info}:" # Note the module being loaded in "${crashfile}". If loading the # module crashes the machine, this file will exist at the next # boot, and we'll add an appropriate "skip" line to # discover-modprobe.conf so we don't try to load it again. echo ${module_name} > "${crashfile}" sync ${nop} modprobe ${module_info} # The module loaded without incident, so we can safely remove the crash # file. rm -f "${crashfile}" sync done exit 0