home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / live / usr / sbin / modconf < prev    next >
Text File  |  1999-02-22  |  14KB  |  766 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. ttydev=/dev/tty
  9.  
  10. if [ -x /usr/bin/tput ]; then
  11.     readonly bold=`tput bold`
  12.     readonly clear=`tput clear`
  13.     readonly norm=`tput sgr0`
  14. else
  15.     readonly bold=''
  16.     readonly clear='H'
  17.     readonly norm=''
  18. fi
  19.  
  20. if [ -x /bin/star ]; then
  21.     readonly extract="star"
  22. else 
  23.     readonly extract="cpio -i -d"
  24. fi
  25.  
  26. if [ -x /target/bin/sed ]; then
  27.     readonly sed="/target/bin/sed"
  28. else 
  29.     readonly sed="sed"
  30. fi
  31.  
  32. source_eval () {
  33.     if [ -z "$LANG" ]; then
  34.         . $ModuleHelp/eval_C
  35.     else
  36.         LINGUA=`echo $LANG | $sed -e 's/_.*//'`
  37.         if [ -f $ModuleHelp/eval_$LINGUA ]; then
  38.             . $ModuleHelp/eval_$LINGUA
  39.         else
  40.             . $ModuleHelp/eval_C
  41.         fi
  42.     fi
  43. }
  44.  
  45. if [ -x /usr/bin/tempfile ]; then
  46.     readonly TempFile=`tempfile`
  47. else 
  48.     readonly TempFile="/tmp/`echo $0|$sed -e 's/^.*\///'`.$$"
  49. fi
  50.  
  51. count_words () {
  52.     echo "$#"
  53. }
  54.  
  55. first () {
  56.     echo "$1"
  57. }
  58.  
  59. second () {
  60.     echo "$2"
  61. }
  62.  
  63. third () {
  64.     echo "$3"
  65. }
  66.  
  67. fourth () {
  68.     echo "$4"
  69. }
  70.  
  71. last () {
  72.     eval echo $"$#"
  73. }
  74.  
  75. mkmodulevarname () {
  76.     echo $1 | $sed 's/[-+,]/_/g'
  77. }
  78.  
  79. write_it_down () {
  80.     local reply
  81.     echo ""
  82.     echo "$1"
  83.     echo ""
  84.     echo $bold"$msg_Something_went_wrong"$norm
  85.     read reply
  86.     return $?
  87. }
  88.  
  89. # Shell interface to "dialog"
  90. # Bruce Perens, November 1995
  91. # This is free software under the GNU General Public License.
  92.  
  93. # Global options
  94. #    The variable $BACKTITLE specifies the back title.
  95. #    The variable $DIALOG_OPTIONS, initialized here to --clear, provides
  96. #    options you want on the command line of each dialog invocation.
  97. #    The variable $DIALOG_TEST can be set to "echo" to see the calls
  98. #    to dialog without executing them.
  99.  
  100. DIALOG_OPTIONS=""
  101.  
  102. # Make any dialogue box, with default settings and backtitle from
  103. # $BACKTITLE in the environment.
  104. #
  105. # dialog --type arg arg ...
  106. #
  107. dialogBox () {
  108.     local type="$1"
  109.     shift
  110.     local title=""
  111.     local backtitle=""
  112.     local result
  113.     local status
  114.  
  115.     local text="$1"
  116.     shift
  117.  
  118.     if [ $# -ge 1 ]; then
  119.         title="$1"
  120.         shift
  121.     fi
  122.  
  123.     if [ -n "$BACKTITLE" ]; then
  124.         backtitle="$BACKTITLE"
  125.     fi
  126.  
  127.     $DIALOG_TEST whiptail $DIALOG_OPTIONS --title "$title" \
  128.      --backtitle "$backtitle" "$type" "$text " 0 0 "$@" 2>&1 1>$ttydev
  129.     
  130.     return $?
  131. }
  132.  
  133. # Display a file.
  134. #
  135. # fileBox filename [title]
  136. #
  137. fileBox () {
  138.     dialogBox --textbox "$1" "$2"
  139. }
  140.  
  141. msgBox () {
  142.     dialogBox --msgbox "$1" "$2"
  143. }
  144.  
  145. infoBox () {
  146.     dialogBox --infobox "$1" "$2"
  147. }
  148.  
  149. yesNoBox () {
  150.     dialogBox --yesno "$1" "$2"
  151.     return $?
  152. }
  153.  
  154. inputBox () {
  155.     dialogBox --inputbox "$1" "$2" "$3"
  156.     return $?
  157. }
  158.  
  159. # menu text title tag1 item1 ...
  160. menu () {
  161.     local text="$1"
  162.     shift
  163.     local title="$1"
  164.     shift
  165.     dialogBox --menu "$text" "$title" 0 "$@"
  166.     return $?
  167. }
  168.  
  169. # menu text title tag1 item1 status1 ...
  170. checklist () {
  171.     local text="$1"
  172.     shift
  173.     local title="$1"
  174.     shift
  175.     dialogBox --checklist "$text" "$title" 0 "$@"
  176.     return $?
  177. }
  178.  
  179. # menu text title tag1 item1 status1 ...
  180. radiolist () {
  181.     local text="$1"
  182.     shift
  183.     local title="$1"
  184.     shift
  185.     dialogBox --radiolist "$text" "$title" 0 "$@"
  186.     return $?
  187. }
  188.  
  189. build_lists () {
  190.     installed_module_list="`$sed -e '/#.*$/d' -e 's/[     ].*$//' \
  191.      < $MODULESFILE`"
  192.     return 0;
  193. }
  194.  
  195. in_list ()
  196. {
  197.     local a=$1
  198.     local i
  199.     shift
  200.  
  201.     for i in $*; do
  202.         if [ $i = $a ]; then
  203.             return 0
  204.         fi
  205.     done
  206.     return 1
  207. }
  208.  
  209. module_is_installed () {
  210.     in_list $1 "$installed_module_list"
  211.     local status=$?
  212.     return $status
  213. }
  214.  
  215. module_args () {
  216.     local module=$1
  217.  
  218.     zcat < $ModuleHelp/descr.gz | $sed -e 's/^#.*//' \
  219.         | (IFS=\n; retcode=0;
  220.             while read line ; do
  221.             case $line in
  222.             "Module: $module")
  223.                 while read line; do
  224.                     case "$line" in
  225.                     " "*)
  226.                         echo "$line"
  227.                         ;;
  228.                     "NoParams:")
  229.                         retcode=3
  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 '"$msg_Exit" "   $msg_Finished_these" \' >> $TempFile.1
  292.         echo '" " " " \' >> $TempFile.1
  293.         
  294.         infoBox "$msg_Please_wait_l" "$msg_Please_wait"
  295.  
  296.         build_module_directory_menu $directory >> $TempFile.1
  297.  
  298.         local result
  299.         result="$(. $TempFile.1)"
  300.         if [ $? -ne 0 ]; then return 1; fi
  301.  
  302.         case "$result" in
  303.         " ")
  304.             ;;
  305.         "$msg_Exit")
  306.             return 0;;
  307.         *)
  308.             if [ $Source = floppy ]; then
  309.                 local list
  310.                 eval "list=$`echo dir_content_$directory`"
  311.                 for i in $list; do
  312.                     case "$i" in
  313.                     $result*)
  314.                         result=$i;
  315.                         break;
  316.                         ;;
  317.                     esac
  318.                 done
  319.             else
  320.                 set `echo $Dir_Prefix/$directory/$result*.o`
  321.                 result=`echo "$1" | \
  322.                     $sed -e 's/^.*\///' \
  323.                         -e 's/\.o//'`
  324.             fi
  325.  
  326.             edit_module "$result"
  327.             ;;
  328.         esac
  329.         ${rm} -f $TempFile.1
  330.     done
  331. }
  332.  
  333. edit_module () {
  334.     local module="$1"
  335.     local help="`module_summary $module`"
  336.     local selected=" -"
  337.     local text="$help
  338. $msg_module_not_installed"
  339.  
  340.     if module_is_installed $module; then
  341.         selected=" +"
  342.         text="$help
  343. $msg_module_installed"
  344.     fi
  345.  
  346.     cat > $TempFile.2 << EOF
  347.     menu "$text" "Module $module $selected" \\
  348.     "$msg_Exit" "$msg_Finished_these" \\
  349. EOF
  350.     
  351.     if [ "$selected" = " +" ]; then
  352.         echo '"$msg_Remove" "$msg_Remove_l" \' >> $TempFile.2
  353.     else
  354.         echo '"$msg_Install" "$msg_Install_l" \' >> $TempFile.2
  355.     fi
  356.  
  357.     echo "" >> $TempFile.2
  358.  
  359.     local result
  360.     result="$(. $TempFile.2)"
  361.     local status=$?
  362.     ${rm} -f $TempFile.2
  363.  
  364.     if [ $status -ne 0 -o -z "$result" ]; then return 1; fi
  365.  
  366.     case "$result" in
  367.     "$msg_Exit")
  368.         return 0
  369.         ;;
  370.     "$msg_Install")
  371.         install_module $module
  372.         return 0
  373.         ;;
  374.     "$msg_Remove")
  375.         remove_module $module
  376.         return 0
  377.         ;;
  378.     esac
  379.     return 1
  380. }
  381.  
  382. parse_arguments ()
  383. {
  384.         local module="$1"
  385.     for i in $MODUTILSDIR/* ; do
  386.         if [ -d $i ]; then
  387.             continue
  388.         fi
  389.         cat $i | \
  390.             ( while read line; do \
  391.                 set -- $line; \
  392.                 if [ "$1" = options -a "$2" = "$module" ]; then \
  393.                     shift; shift; echo $@; break; \
  394.                 fi; \
  395.             done)
  396.     done
  397. }
  398.  
  399.  
  400. update_conf_modules ()
  401. {
  402.     local module="$1"
  403.     local arguments="$2"
  404.     local done=""
  405.     local modd=""
  406.  
  407.     for i in $MODUTILSDIR/* ; do
  408.         if [ -d $i ]; then
  409.             continue
  410.         fi
  411.         cat $i | \
  412.         ( while read line; do \
  413.             set -- $line; \
  414.             if [ "$1" = options -a "$2" = "$module" ]; then \
  415.                 if [ -n "$arguments" ] ; then \
  416.                     shift; shift; modd=true; done=true; \
  417.                     echo options $module "$arguments" ; \
  418.                 fi; \
  419.             else echo $line; \
  420.             fi; \
  421.             done; \
  422.         )   > $TempFile.4
  423.         if [ $modd ]; then
  424.             cat $TempFile.4 > $i
  425.             modd=""
  426.         fi
  427.     done
  428.     ${rm} -f $TempFile.4
  429.     if [ -z "$done" -a -n "$arguments" ]; then
  430.         if [ -f $MODCONFFILE ]; then
  431.             echo options $module "$arguments" >> $MODCONFFILE
  432.         else
  433.             echo options $module "$arguments" > $MODCONFFILE
  434.             chown 0.0 $MODCONFFILE
  435.             chmod 644 $MODCONFFILE
  436.         fi        
  437.     fi;
  438.     sync
  439.     $Target/sbin/update-modules
  440.     sync
  441. }
  442.  
  443. edit_arguments ()
  444. {
  445.     local module="$1"
  446.     local old_arguments="`parse_arguments $module`"
  447.  
  448.     local arguments
  449.     module_args $module >$TempFile.3
  450.     local status=$?
  451.     if [ $status -eq 1 ]; then
  452.         cat > $TempFile.2 << EOF
  453. msgBox "$msg_doc_unavailable" "$msg_Error"
  454. EOF
  455.         arguments="`. $TempFile.2`"
  456. #        return 1
  457.     elif [ $status -eq 2 ]; then
  458.         echo -n "msgBox \"" >$TempFile.2
  459.         cat $TempFile.3 >>$TempFile.2
  460.         echo "\" \"Module info\"">>$TempFile.2
  461.         arguments="`. $TempFile.2`"
  462.         return 0
  463.     fi
  464.     if [ $status -ne 3 ]; then
  465.         echo -n "inputBox \"" >$TempFile.2
  466.         cat $TempFile.3 >>$TempFile.2 
  467.         echo "">>$TempFile.2
  468.         echo "$msg_enter_arguments_l\" \\" >>$TempFile.2
  469.         echo "\"$msg_enter_arguments\"" >>$TempFile.2
  470.  
  471.         arguments="`. $TempFile.2`"
  472.         if [ $? -ne 0 ]; then return 1; fi
  473.     else
  474.         arguments=''
  475.     fi
  476.  
  477.     arguments=`echo $arguments|$sed 's/ *= */=/g'`
  478.     if [ "$old_arguments" != "$arguments" ]; then
  479.         update_conf_modules $module "$arguments"
  480.     fi
  481. }
  482.  
  483. install_module () {
  484.     local module="$1"
  485.     sync
  486.  
  487.     edit_arguments $module
  488.     if [ $? -ne 0 ]; then return 1; fi    
  489.  
  490.     echo $clear$bold"`eval echo \\\"$msg_Installing_module\\\"`"$norm
  491.     echo ""
  492.     sync
  493.  
  494.     get_and_insmod $module
  495.     local status=$?
  496.  
  497.     echo ""
  498.     if [ $status -eq 0 ]; then
  499.         echo "$msg_Installation_succeeded"
  500.         echo "$module" >> $MODULESFILE
  501.     else
  502.         echo "$msg_Installation_failed"
  503.     fi
  504.  
  505.     echo ""
  506.     echo $bold"$msg_Please_press_ENTER"$norm
  507.     local reply
  508.     read reply
  509.  
  510. }
  511.  
  512. get_and_insmod () {
  513.     local module=$1
  514.     local file
  515.     local i
  516.  
  517.     case $Source in
  518.     floppy)
  519.         echo -n $clear "`eval echo \\\"$msg_Extracting_module\\\"`"
  520.         if [ ! -f /floppy/modules.tgz ]; then
  521.             write_it_down "$msg_tgz_does_not_exist"
  522.         fi
  523.         (cd /; zcat < /floppy/modules.tgz | $extract \*/$module.o)
  524.         file="/lib/modules/*/*/$module.o"
  525.         echo "$msg_done"
  526.         depmod -a
  527.         modprobe $module
  528.         local status=$?
  529.         ${rm} -f $file
  530.         ;;
  531.     mounted)
  532.         modprobe $module
  533.         local status=$?
  534.         ;;
  535.     esac
  536.  
  537.     for i in $Run_Shell; do
  538.         local script
  539.         local modulevarname=`mkmodulevarname $1`
  540.         eval "script=$`echo shell_${i}_$modulevarname`"
  541.         if [ -n "$script" ]; then
  542.             echo 
  543.             echo "`eval echo \\\"$msg_Executing_postinst\\\"`"
  544.             echo script: $script
  545.             eval $script
  546.             if [ $? -ne 0 ]; then
  547.                 write_it_down "`eval echo \\\"$msg_postinst_failed\\\"`"
  548.             fi
  549.             echo "`eval echo \\\"$msg_postinst_done\\\"`"
  550.         fi
  551.     done
  552.     return $status
  553. }
  554.  
  555. remove_module () {
  556.     sync
  557.     local module="$1"
  558.  
  559.     echo $clear$bold"`eval echo \\\"$msg_Removing_module\\\"`"$norm
  560.     echo ""
  561.     sync
  562.     modprobe -r $module
  563.     if [ $? -ne 0 ]; then
  564.         write_it_down "`eval echo \\\"$msg_not_removed\\\"`"
  565.         return 1
  566.     fi
  567.     ${rm} -f $MODULESFILE.tmp
  568.     $sed -e /^$module\$/d < $MODULESFILE >$MODULESFILE.tmp
  569.     if [ $? -ne 0 ]; then return 1; fi
  570.     chown 0.0 $MODULESFILE.tmp
  571.     chmod 644 $MODULESFILE.tmp
  572.     sync
  573.     ${rm} -f $MODULESFILE.old
  574.     ln $MODULESFILE $MODULESFILE.old
  575.     mv $MODULESFILE.tmp $MODULESFILE
  576.     sync
  577.  
  578.     return 0
  579. }
  580.  
  581. interactive_main () {
  582.  
  583.     local text="$msg_Select_Category_l"
  584.  
  585.     echo 'menu "$text" "$msg_Select_Category" \' > $TempFile
  586.  
  587.     echo '"$msg_Exit" "$msg_Finished_these" \'  >> $TempFile
  588.     echo '" " " " \' >> $TempFile
  589.  
  590.     local directory
  591.     for directory in $dir_descrs; do
  592.         if [ ! -d $Dir_Prefix/$directory -a \
  593.                 $Source = mounted ]; then 
  594.             continue;
  595.         fi
  596.  
  597.         if [ -n "$Restrict_Section" ]; then
  598.             if in_list $directory $Restrict_Section; then
  599.                 true
  600.             else
  601.                 continue
  602.             fi
  603.         fi
  604.  
  605.         local help=""
  606.         local summary=""
  607.  
  608.         eval "summary=$`echo dir_descr_$directory`"
  609.  
  610.         echo "\"$directory\"" \\ >> $TempFile
  611.         echo "\"$summary."\" \\ >> $TempFile
  612.     done
  613.     echo "" >> $TempFile
  614.  
  615.     while true; do
  616.         local directory status
  617.         if [ -n "$One_Restricted_Section" ]; then
  618.             directory=$One_Restricted_Section
  619.         else
  620.             directory="`. $TempFile`"
  621.             if [ $? -ne 0 ]; then return 1; fi
  622.         fi
  623.  
  624.         case "$directory" in
  625.         " ")
  626.             ;;
  627.         "$msg_Exit")
  628.             return 0;;
  629.         *)
  630.             module_directory_menu "$directory" \
  631.              "$msg_Select_modules_l" "`eval echo \\\"$msg_Select_modules\\\"`"
  632.             if [ -n "$One_Restricted_Section" ]; then
  633.                 return 0;
  634.             fi
  635.             ;;
  636.         esac
  637.     done
  638.     ${rm} -f $TempFile
  639. }
  640.  
  641. check_conf_modules ()
  642. {
  643.     local HEADER="### This file is automatically generated by update-modules"
  644.     if [ -f $CFGFILE ]; then
  645.         if [ ! "`$sed -n 1p $CFGFILE |$sed -n \"/^$HEADER/p\"`" ]; then 
  646.                     echo "Error: the current $CFGFILE is not automatically generated."
  647.                         echo "Use \"update-modules force\" to force (re)generation."
  648.             exit 1
  649.                 fi
  650.         fi
  651. }
  652.  
  653. Source=mounted
  654.  
  655. ModuleHelp=/usr/lib/module_help
  656.  
  657. while [ $# -ne 0 ]; do
  658.     case $1 in
  659.     --source)
  660.         Source=$2
  661.         shift
  662.         ;;
  663.     --target)
  664.         Target=$2
  665.         shift
  666.         ;;
  667.     --libdir)
  668.         ModuleHelp=$2
  669.         shift
  670.         ;;
  671.     --restrict-section)
  672.         Restrict_Section="$Restrict_Section $2"
  673.         shift
  674.         ;;
  675.     --exclude-section)
  676.         Exclude_Section="$Exclude_Section $2"
  677.         shift
  678.         ;;
  679.     --load-after)
  680.         Load_After="$Load_After $2"
  681.         shift
  682.         ;;
  683.     --load-before)
  684.         Load_Before="$Load_Before $2"
  685.         shift
  686.         ;;
  687.     --load-only)
  688.         Load_Only="$Load_Only $2"
  689.         shift
  690.         ;;
  691.     --run-shell)
  692.         Run_Shell="$Run_Shell $2"
  693.         shift
  694.         ;;
  695.     --tty)
  696.         ttydev=$2
  697.         shift
  698.         ;;
  699.     *)
  700.         source_eval
  701.         write_it_down "$msg_Invalid_option"
  702.     esac
  703.     shift
  704. done
  705.  
  706. source_eval
  707.  
  708. KernelVersion=$(third `cat /proc/version`)
  709. if [ $? -ne 0 -o -z "$KernelVersion" ]; then
  710.     msgBox "$msg_kernel_version_problem" "$msg_Problem"
  711.     return 1
  712. fi
  713.  
  714. Dir_Prefix=$Target/lib/modules/$KernelVersion
  715.  
  716. CFGFILE=/etc/conf.modules
  717. MODULESFILE=/etc/modules
  718. MODUTILSDIR=$Target/etc/modutils
  719. MODCONFFILE=$MODUTILSDIR/modconf
  720.  
  721. check_conf_modules
  722.  
  723. if [ $Source = floppy ]; then
  724.     if [ -f $ModuleHelp/modcont ]; then
  725.         . $ModuleHelp/modcont
  726.     else
  727.         echo "$msg_Cannot_open $ModuleHelp/modcont"
  728.         exit 1
  729.     fi
  730. else
  731.     dir_descrs=""
  732.     for i in `cd $Dir_Prefix; echo *`; do
  733.         if [ -d $Dir_Prefix/$i -a \
  734.             -f `first $Dir_Prefix/$i/*.o ` ]; then
  735.             if [ -n "$Exclude_Section" ] && 
  736.                               in_list $i $Exclude_Section ; then
  737.                 true
  738.                     else
  739.                 dir_descrs="$dir_descrs $i"
  740.             fi
  741.         fi
  742.     done
  743. fi
  744.  
  745. s=`second $Restrict_Section`
  746. if [ -n "$Restrict_Section" -a -z "$s" ]; then
  747.     One_Restricted_Section=`first $Restrict_Section`
  748. fi
  749.  
  750. for i in $Load_Before; do
  751.     get_and_insmod $i;
  752. done
  753.  
  754. if [ -z "$Load_Only" ]; then
  755.     interactive_main
  756. else
  757.     Load_After=$Load_Only
  758. fi
  759.  
  760. for i in $Load_After; do
  761.     get_and_insmod $i
  762. done
  763.  
  764. ${rm}  -f $TempFile $TempFile.1 $TempFile.2 $TempFile.3 $TempFile.4
  765. exit 0
  766.