home *** CD-ROM | disk | FTP | other *** search
/ Internet News 1999 February / InternetNews_1999_02.iso / pc / Linux / Debian / drv1440.bin / MODCONF < prev    next >
Text File  |  1998-07-21  |  14KB  |  731 lines

  1. #!    /bin/sh
  2. # Please make sure this file can be executed by both "bash" and "ash".
  3.  
  4. x=0
  5. umask 022
  6. readonly rm=rm
  7.  
  8. if [ -x /usr/bin/tput ]; then
  9.     readonly bold=`tput bold`
  10.     readonly clear=`tput clear`
  11.     readonly norm=`tput sgr0`
  12. else
  13.     readonly bold=''
  14.     readonly clear='H'
  15.     readonly norm=''
  16. fi
  17. if [ -x /bin/star ]; then
  18.     readonly extract="star"
  19. else 
  20.     readonly extract="cpio -i -d"
  21. fi
  22. ModuleHelp=/usr/lib/module_help
  23.  
  24. if [ -x /usr/bin/tempfile ]; then
  25.     readonly TempFile=`tempfile`
  26. else 
  27.     readonly TempFile="/tmp/`echo $0|sed -e 's/^.*\///'`.$$"
  28. fi
  29.  
  30. count_words () {
  31.     echo "$#"
  32. }
  33.  
  34. first () {
  35.     echo "$1"
  36. }
  37.  
  38. second () {
  39.     echo "$2"
  40. }
  41.  
  42. third () {
  43.     echo "$3"
  44. }
  45.  
  46. fourth () {
  47.     echo "$4"
  48. }
  49.  
  50. last () {
  51.     eval echo $"$#"
  52. }
  53.  
  54. mkmodulevarname () {
  55.     echo $1 | sed 's/[-+,]/_/g'
  56. }
  57.  
  58. write_it_down () {
  59.     local reply
  60.     echo ""
  61.     echo "$1"
  62.     echo ""
  63.     echo "$bold"\
  64. "Something went wrong. You might want to write down the error messages
  65. before you continue. Please press ENTER when you are ready.$norm"
  66.     read reply
  67.     return $?
  68. }
  69.  
  70. # Shell interface to "dialog"
  71. # Bruce Perens, November 1995
  72. # This is free software under the GNU General Public License.
  73.  
  74. # Global options
  75. #    The variable $BACKTITLE specifies the back title.
  76. #    The variable $DIALOG_OPTIONS, initialized here to --clear, provides
  77. #    options you want on the command line of each dialog invocation.
  78. #    The variable $DIALOG_TEST can be set to "echo" to see the calls
  79. #    to dialog without executing them.
  80.  
  81. DIALOG_OPTIONS=""
  82.  
  83. # Make any dialogue box, with default settings and backtitle from
  84. # $BACKTITLE in the environment.
  85. #
  86. # dialog --type arg arg ...
  87. #
  88. dialogBox () {
  89.     local type="$1"
  90.     shift
  91.     local title=""
  92.     local backtitle=""
  93.     local result
  94.     local status
  95.  
  96.     local text="$1"
  97.     shift
  98.  
  99.     if [ $# -ge 1 ]; then
  100.         title="$1"
  101.         shift
  102.     fi
  103.  
  104.     if [ -n "$BACKTITLE" ]; then
  105.         backtitle="$BACKTITLE"
  106.     fi
  107.  
  108.     $DIALOG_TEST whiptail $DIALOG_OPTIONS --title "$title" \
  109.      --backtitle \ "$backtitle" "$type" "$text" 0 0 "$@" 2>&1 1>/dev/tty
  110.     
  111.     return $?
  112. }
  113.  
  114. # Display a file.
  115. #
  116. # fileBox filename [title]
  117. #
  118. fileBox () {
  119.     dialogBox --textbox "$1" "$2"
  120. }
  121.  
  122. # textBox takes presents its standard input in a dialog box. This
  123. # is useful for "here documents" and pipes.
  124. #
  125. # textBox [title]
  126. #
  127. textBox () {
  128.     cat >$TempFile
  129.  
  130.     if [ $? -ne 0 ]; then
  131.         echo "Can't make temporary file for dialog box." 1>&2
  132.         return -1
  133.     fi
  134.  
  135.     # Note that dialog needs stdin to be the terminal, so I redirect here.
  136.     < /dev/tty dialogBox --textbox $TempFile "$1"
  137.     local result=$?
  138.     ${rm} -f $TempFile
  139.     return $result
  140. }
  141.  
  142. msgBox () {
  143.     dialogBox --msgbox "$1" "$2"
  144. }
  145.  
  146. infoBox () {
  147.     dialogBox --infobox "$1" "$2"
  148. }
  149.  
  150. yesNoBox () {
  151.     dialogBox --yesno "$1" "$2"
  152.     return $?
  153. }
  154.  
  155. inputBox () {
  156.     dialogBox --inputbox "$1" "$2" "$3"
  157.     return $?
  158. }
  159.  
  160. # menu text title tag1 item1 ...
  161. menu () {
  162.     local text="$1"
  163.     shift
  164.     local title="$1"
  165.     shift
  166.     dialogBox --menu "$text" "$title" 0 "$@"
  167.     return $?
  168. }
  169.  
  170. # menu text title tag1 item1 status1 ...
  171. checklist () {
  172.     local text="$1"
  173.     shift
  174.     local title="$1"
  175.     shift
  176.     dialogBox --checklist "$text" "$title" 0 "$@"
  177.     return $?
  178. }
  179.  
  180. # menu text title tag1 item1 status1 ...
  181. radiolist () {
  182.     local text="$1"
  183.     shift
  184.     local title="$1"
  185.     shift
  186.     dialogBox --radiolist "$text" "$title" 0 "$@"
  187.     return $?
  188. }
  189.  
  190. build_lists () {
  191.     installed_module_list="`sed -e '/#.*$/d' -e 's/[     ].*$//' \
  192.      < $Target/etc/modules`"
  193.     return 0;
  194. }
  195.  
  196. in_list ()
  197. {
  198.     local a=$1
  199.     local i
  200.     shift
  201.  
  202.     for i in $*; do
  203.         if [ $i = $a ]; then
  204.             return 0
  205.         fi
  206.     done
  207.     return 1
  208. }
  209.  
  210. module_is_installed () {
  211.     in_list $1 "$installed_module_list"
  212.     local status=$?
  213.     return $status
  214. }
  215.  
  216. module_args () {
  217.     local module=$1
  218.  
  219.     zcat < $ModuleHelp/descr.gz | sed -e 's/^#.*//' \
  220.         | (IFS=\n; retcode=0;
  221.             while read line ; do
  222.             case $line in
  223.             "Module: $module")
  224.                 while read line; do
  225.                     case "$line" in
  226.                     " "*)
  227.                         echo "$line"
  228.                         ;;
  229.                     "NoParams:")
  230. #                        retcode=2
  231.                         ;;
  232.                     *)
  233.                         return $retcode
  234.                         ;;
  235.                     esac
  236.                 done
  237.                 return $retcode
  238.             esac
  239.         done
  240.         return 1)
  241.     return $?;
  242. }
  243.  
  244. module_summary () {
  245.     local summary=""
  246.     local modulevarname=`mkmodulevarname $1`
  247.  
  248.     eval "summary=$`echo summary_$modulevarname`"
  249.     echo -n "$summary".
  250. }
  251.  
  252. build_module_directory_menu () {
  253.     local directory="$1"
  254.     local list
  255.  
  256.     if [ $Source = floppy ]; then
  257.         eval "list=$`echo dir_content_$directory`"
  258.     else
  259.         list="$Dir_Prefix/$directory/*.o"
  260.     fi
  261.  
  262.     for i in $list; do
  263.         local module="`echo $i | sed -e 's:^.*/::' -e 's/\.o$//'`"
  264.         if [ "$module" != '*' ]; then
  265.             local selected=" -"
  266.  
  267.             if module_is_installed $module; then
  268.                 selected=" +"
  269.             fi
  270.  
  271.             echo -n \"
  272.             echo -n $module |sed -e 's/^\(............\).*$/\1/'
  273.             echo -n \" \"$selected" "
  274.             module_summary $module
  275.             echo \" \\
  276.         fi
  277.     done
  278.     echo ""
  279. }
  280.  
  281. module_directory_menu () {
  282.     local directory="$1"
  283.     local text="$2"
  284.     local title="$3"
  285.  
  286.     while true; do
  287.  
  288.         build_lists
  289.  
  290.         echo 'menu "$text" "$title" \' > $TempFile.1
  291.         echo '"Exit" \
  292.          "   Finished with these modules. Return to previous menu." \' \
  293.          >> $TempFile.1
  294.         echo '" " " " \' >> $TempFile.1
  295.         
  296.         infoBox "Please wait while modules are detected." "Please wait"
  297.  
  298.         build_module_directory_menu $directory >> $TempFile.1
  299.  
  300.         local result
  301.         result="$(. $TempFile.1)"
  302.         if [ $? -ne 0 ]; then return 1; fi
  303.  
  304.         case "$result" in
  305.         " ")
  306.             ;;
  307.         Exit)
  308.             return 0;;
  309.         *)
  310.             if [ $Source = floppy ]; then
  311.                 local list
  312.                 eval "list=$`echo dir_content_$directory`"
  313.                 for i in $list; do
  314.                     case "$i" in
  315.                     $result*)
  316.                         result=$i;
  317.                         break;
  318.                         ;;
  319.                     esac
  320.                 done
  321.             else
  322.                 set `echo $Dir_Prefix/$directory/$result*.o`
  323.                 result=`echo "$1" | \
  324.                     sed -e 's/^.*\///' \
  325.                         -e 's/\.o//'`
  326.             fi
  327.  
  328.             edit_module "$result"
  329.             ;;
  330.         esac
  331.         ${rm} -f $TempFile.1
  332.     done
  333. }
  334.  
  335. edit_module () {
  336.     local module="$1"
  337.     local help="`module_summary $module`"
  338.     local selected=" -"
  339.     local text="$help
  340. The $module module is not currently installed."
  341.  
  342.     if module_is_installed $module; then
  343.         selected=" +"
  344.         text="$help
  345. The $module module is currently installed."
  346.     fi
  347.  
  348.     cat > $TempFile.2 << EOF
  349.     menu "$text" "Module $module $selected" \\
  350.     "Exit" "Finished with this module. Return to previous menu" \\
  351. EOF
  352.     
  353.     if [ "$selected" = " +" ]; then
  354.         echo '"Remove" "Remove the module from the kernel." \' >> $TempFile.2
  355.     else
  356.         echo '"Install" "Install the module in the kernel." \' >> $TempFile.2
  357.     fi
  358.  
  359.     echo "" >> $TempFile.2
  360.  
  361.     local result
  362.     result="$(. $TempFile.2)"
  363.     local status=$?
  364.     ${rm} -f $TempFile.2
  365.  
  366.     if [ $status -ne 0 -o -z "$result" ]; then return 1; fi
  367.  
  368.     case "$result" in
  369.     Exit)
  370.         return 0
  371.         ;;
  372.     Install)
  373.         install_module $module
  374.         return 0
  375.         ;;
  376.     Remove)
  377.         remove_module $module
  378.         return 0
  379.         ;;
  380.     esac
  381.     return 1
  382. }
  383.  
  384. edit_arguments ()
  385. {
  386.     local module="$1"
  387.     local old_arguments="`cat /etc/conf.modules | \
  388.         ( while read line; do \
  389.             set -- $line; \
  390.             if [ "$1" = options -a "$2" = "$module" ]; then \
  391.                 shift; shift; echo $@; break; \
  392.             fi; \
  393.         done )`"
  394.  
  395.     local arguments
  396.     module_args $module >$TempFile.3
  397.     local status=$?
  398.     if [ $status -eq 1 ]; then
  399.         cat > $TempFile.2 << EOF
  400. msgBox "Paramter documentation for this module is unavailable" "Error"
  401. EOF
  402.         arguments="`. $TempFile.2`"
  403. #        return 1
  404.     elif [ $status -eq 2 ]; then
  405.         echo -n "msgBox \"" >$TempFile.2
  406.         cat $TempFile.3 >>$TempFile.2
  407.         echo "\" \"Module info\"">>$TempFile.2
  408.         arguments="`. $TempFile.2`"
  409.         return 0
  410.     fi
  411.     echo -n "inputBox \"" >$TempFile.2
  412.     cat $TempFile.3 >>$TempFile.2 
  413.     echo "">>$TempFile.2
  414.     echo "Please enter any command-line arguments for the $module module.\" \\
  415. \"Enter Command-Line Arguments\" $old_arguments" >>$TempFile.2
  416.  
  417.     arguments="`. $TempFile.2`"
  418.     if [ $? -ne 0 ]; then return 1; fi
  419.  
  420.     if [ "$old_arguments" != "$arguments" ]; then
  421.         ${rm} -f $Target/etc/conf.modules.new
  422.         cat /etc/conf.modules | ( while read line; do \
  423.             set -- $line; \
  424.             if [ "$1" = options -a "$2" = "$module" ]; then \
  425.                 if [ -n "$arguments" ] ; then \
  426.                     shift; shift; done=true; \
  427.                     echo options $module "$arguments" ; \
  428.                 fi; \
  429.             else echo $line; \
  430.             fi; \
  431.             done; \
  432.                 if [ -z "$done" -a -n "$arguments" ]; then \
  433.                 echo options $module "$arguments"; \
  434.             fi; \
  435.             )   > $Target/etc/conf.modules.new
  436.  
  437.         chown root.root $Target/etc/conf.modules.new
  438.         chmod 644 $Target/etc/conf.modules.new
  439.         sync
  440.         ${rm} -f $Target/etc/conf.modules.old
  441.         ln $Target/etc/conf.modules $Target/etc/conf.modules.old
  442.         mv -f $Target/etc/conf.modules.new $Target/etc/conf.modules
  443.         sync
  444.         ${rm} -f $Target/etc/conf.modules.old
  445.         sync
  446.     fi
  447. }
  448.  
  449. install_module () {
  450.     local module="$1"
  451.     sync
  452.  
  453.     edit_arguments $module
  454.     if [ $? -ne 0 ]; then return 1; fi    
  455.  
  456.     echo $clear$bold\
  457. "Installing module $module. If the device isn't there, or isn't configured
  458. correctly, this could cause your system to pause for up to a minute."$norm
  459.     echo ""
  460.     sync
  461.  
  462.     get_and_insmod $module
  463.     local status=$?
  464.  
  465.     echo ""
  466.     if [ $status -eq 0 ]; then
  467.         echo "Installation succeeded."
  468.         echo "$module" >> $Target/etc/modules
  469.     else
  470.         echo "Installation failed."
  471.     fi
  472.  
  473.     echo ""
  474.     echo "$bold""Please press ENTER when you are ready to continue.$norm"
  475.     local reply
  476.     read reply
  477.  
  478. }
  479.  
  480. get_and_insmod () {
  481.     local module=$1
  482.     local file
  483.     local i
  484.  
  485.     case $Source in
  486.     floppy)
  487.         echo -n $clear "Extracting $module module from floppy ... "
  488.         if [ ! -f /floppy/modules.tgz ]; then
  489.             write_it_down "/floppy/modules.tgz does not exist"
  490.         fi
  491.         (cd /; zcat < /floppy/modules.tgz | $extract \*/$module.o)
  492.         file="/lib/modules/*/*/$module.o"
  493.         echo "done."
  494.         depmod -a
  495.         modprobe $module
  496.         local status=$?
  497.         rm -f $file
  498.         ;;
  499.     mounted)
  500.         modprobe $module
  501.         local status=$?
  502.         ;;
  503.     esac
  504.  
  505.     for i in $Run_Shell; do
  506.         local script
  507.         local modulevarname=`mkmodulevarname $1`
  508.         eval "script=$`echo shell_${i}_$modulevarname`"
  509.         if [ -n "$script" ]; then
  510.             echo 
  511.             echo "Executing module post-install script \`$i' ..."
  512.             echo script: $script
  513.             eval $script
  514.             if [ $? -ne 0 ]; then
  515.                 write_it_down \
  516.                     "Executing $module's post-install script failed"
  517.             fi
  518.             echo "Post-install \`$i' scripts done."
  519.         fi
  520.     done
  521.     return $status
  522. }
  523.  
  524. remove_module () {
  525.     sync
  526.     local module="$1"
  527.  
  528.     echo $clear$bold\
  529. "Removing module $module..."$norm
  530.     echo ""
  531.     sync
  532.     modprobe -r $module
  533.     if [ $? -ne 0 ]; then
  534.         write_it_down "$module was not removed."
  535.         return 1
  536.     fi
  537.     ${rm} -f $Target/etc/modules.tmp
  538.     sed -e /^$module\$/d < $Target/etc/modules >$Target/etc/modules.tmp
  539.     if [ $? -ne 0 ]; then return 1; fi
  540.     chmod 644 $Target/etc/modules.tmp
  541.     chown root.root $Target/etc/modules.tmp
  542.     sync
  543.     ${rm} -f $Target/etc/modules.old
  544.     ln $Target/etc/modules $Target/etc/modules.old
  545.     mv $Target/etc/modules.tmp $Target/etc/modules
  546.     sync
  547.  
  548.     return 0
  549. }
  550.  
  551. interactive_main () {
  552.  
  553.     local text=\
  554. "Modules are loadable device drivers. Please go through the menus
  555. for each category and look for devices, network protocols, filesystems,
  556. etc. that you would like to have supported by your system. You should
  557. not install modules for devices that aren't installed in your system,
  558. as they will sometimes cause the system to pause for a long time while
  559. it is searching for the device. Also, drivers for devices that you
  560. don't have use memory that you could put to better use.
  561.  
  562. Please select the category of modules."
  563.  
  564.     echo 'menu "$text" "Select Category" \' > $TempFile
  565.  
  566.     echo '"Exit" \
  567.      " Finished with modules. Return to previous menu." \' \
  568.      >> $TempFile
  569.     echo '" " " " \' >> $TempFile
  570.  
  571.     local directory
  572.     for directory in $dir_descrs; do
  573.         if [ ! -d $Target/lib/modules/$KernelVersion/$directory -a \
  574.                 $Source = mounted ]; then 
  575.             continue;
  576.         fi
  577.  
  578.         if [ -n "$Restrict_Section" ]; then
  579.             if in_list $directory $Restrict_Section; then
  580.                 true
  581.             else
  582.                 continue
  583.             fi
  584.         fi
  585.  
  586.         local help=""
  587.         local summary=""
  588.  
  589.         eval "summary=$`echo dir_descr_$directory`"
  590.  
  591.         echo "\"$directory\"" \\ >> $TempFile
  592.         echo "\"$summary."\" \\ >> $TempFile
  593.     done
  594.     echo "" >> $TempFile
  595.  
  596.     while true; do
  597.         local directory status
  598.         if [ -n "$One_Restricted_Section" ]; then
  599.             directory=$One_Restricted_Section
  600.         else
  601.             directory="`. $TempFile`"
  602.             if [ $? -ne 0 ]; then return 1; fi
  603.         fi
  604.  
  605.         case "$directory" in
  606.         " ")
  607.             ;;
  608.         Exit)
  609.             return 0;;
  610.         *)
  611.             module_directory_menu \
  612.              "$directory" \
  613. "The modules that are currently installed on your system have
  614. a \"+\" character to the right of their name. Modules that aren't
  615. installed have a \"-\" to the right of their name. You can read a
  616. page about the purpose of any module and then you can enable
  617. or disable it. To do so, use the up and down arrow keys to move
  618. the cursor to the line for the module, and then press ENTER." \
  619. "Select $directory modules"
  620.             if [ -n "$One_Restricted_Section" ]; then
  621.                 return 0;
  622.             fi
  623.             ;;
  624.         esac
  625.     done
  626.     ${rm} -f $TempFile
  627. }
  628.  
  629.  
  630. Source=mounted
  631.  
  632. KernelVersion=$(third `cat /proc/version`)
  633. if [ $? -ne 0 -o -z "$KernelVersion" ]; then
  634.     msgBox \
  635. "I couldn't find the kernel version.
  636. Please make sure /proc is mounted." "Problem"
  637.     return 1
  638. fi
  639.  
  640. while [ $# -ne 0 ]; do
  641.     case $1 in
  642.     --source)
  643.         Source=$2
  644.         shift
  645.         ;;
  646.     --target)
  647.         Target=$2
  648.         shift
  649.         ;;
  650.     --libdir)
  651.         ModuleHelp=$2
  652.         shift
  653.         ;;
  654.     --restrict-section)
  655.         Restrict_Section="$Restrict_Section $2"
  656.         shift
  657.         ;;
  658.     --exclude-section)
  659.         Exclude_Section="$Exclude_Section $2"
  660.         shift
  661.         ;;
  662.     --load-after)
  663.         Load_After="$Load_After $2"
  664.         shift
  665.         ;;
  666.     --load-before)
  667.         Load_Before="$Load_Before $2"
  668.         shift
  669.         ;;
  670.     --load-only)
  671.         Load_Only="$Load_Only $2"
  672.         shift
  673.         ;;
  674.     --run-shell)
  675.         Run_Shell="$Run_Shell $2"
  676.         shift
  677.         ;;
  678.     *)
  679.         write_it_down "Invalid option"
  680.     esac
  681.     shift
  682. done
  683.  
  684. Dir_Prefix=$Target/lib/modules/$KernelVersion/
  685.  
  686. . $ModuleHelp/eval
  687.  
  688. if [ $Source = floppy ]; then
  689.     if [ -f $ModuleHelp/modcont ]; then
  690.         . $ModuleHelp/modcont
  691.     else
  692.         echo "Cannot open $ModuleHelp/modcont"
  693.         exit 1
  694.     fi
  695. else
  696.     dir_descrs=""
  697.     for i in `cd $Dir_Prefix; echo *`; do
  698.         if [ -d $Dir_Prefix/$i -a \
  699.             -f `first $Dir_Prefix/$i/*.o ` ]; then
  700.             if [ -n "$Exclude_Section" ] && 
  701.                               in_list $i $Exclude_Section ; then
  702.                 true
  703.                     else
  704.                 dir_descrs="$dir_descrs $i"
  705.             fi
  706.         fi
  707.     done
  708. fi
  709.  
  710. s=`second $Restrict_Section`
  711. if [ -n "$Restrict_Section" -a -z "$s" ]; then
  712.     One_Restricted_Section=`first $Restrict_Section`
  713. fi
  714.  
  715. for i in $Load_Before; do
  716.     get_and_insmod $i;
  717. done
  718.  
  719. if [ -z "$Load_Only" ]; then
  720.     interactive_main
  721. else
  722.     Load_After=$Load_Only
  723. fi
  724.  
  725. for i in $Load_After; do
  726.     get_and_insmod $i
  727. done
  728.  
  729. ${rm}  -f $TempFile $TempFile.1 $TempFile.2
  730. exit 0
  731.