home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / live / usr / sbin / kbdconfig < prev    next >
Text File  |  1999-01-06  |  8KB  |  365 lines

  1. #! /bin/sh
  2.  
  3. PACKAGE=kbd
  4.  
  5. # kbdconfig - Configuration script for the `kbd' and `console-tools' packages
  6. # Copyright (c) 1997, 1998  Yann Dirson
  7. # Copyright (c) 1996  Dominik Kubla
  8.  
  9. KBDCONF_VERSION=1998.11.09
  10.  
  11. #set -e
  12.  
  13.  
  14. CONFDIR=/etc/${PACKAGE}
  15. LOCALLIBDIR=/usr/local/share
  16.  
  17. LIBDIR=/usr/share
  18. #LIBDIR=.
  19. KEYMAPSDIR=keymaps
  20. #KEYMAPSDIR=keytables
  21.  
  22. if [ $# -gt 0 ]
  23. then
  24.     case $1 in
  25.     --help)
  26.     echo
  27.     echo "Usage: kbdconfig [ --help | --version ]"
  28.     echo
  29.     echo "  --help      show this information and exit"
  30.     echo "  --version   show version information and exit"
  31.     echo
  32.     exit 0
  33.     ;;        
  34.     --version)    
  35.     echo "This is \`kbdconfig' for Linux Console Tools version ${KBDCONF_VERSION%-*}, Debian release ${KBDCONF_VERSION##*-}"
  36.     exit 0
  37.     ;;
  38.     *)
  39.     echo "kbdconfig: Unknown option or parameter $1."
  40.     echo "Use \`kbdconfig --help' for further information."
  41.     exit 1
  42.     ;;
  43.     esac
  44. fi
  45.  
  46. if [ -z "$ALLOWNOROOT" -a ! $(id -u) = 0 ]
  47. then
  48.     echo "You must be root to run \`$(basename $0)'."
  49.     exit 1
  50. fi
  51.  
  52. case ${PACKAGE} in
  53. kbd)
  54.     KMAPEXT=map
  55.     ;;
  56. console-tools)
  57.     KMAPEXT=kmap
  58. ;;
  59. esac
  60.  
  61. KERNEL_KEYMAP=/var/lib/${PACKAGE}/kernel.${EXT}
  62.  
  63. yesno() # message [default choice] [secure]
  64. {
  65.     local REPLY=x
  66.     local DEFAULT=''
  67.     local SECURE=''
  68.   
  69.     # default choice
  70.     if [ $# -ge 2 ]
  71.     then
  72.     DEFAULT=$2
  73.     else
  74.     DEFAULT=y
  75.     fi
  76.   
  77.     # default font fallback ?
  78.     if [ $# -ge 3 ]
  79.     then
  80.     SECURE=$3
  81.     else
  82.     SECURE=n
  83.     fi
  84.   
  85.     # get answer
  86.     until [ $REPLY = y -o $REPLY = n ]
  87.     do
  88.     if [ $SECURE = y ]
  89.     then
  90.         echo "  NOTE: Answering anything else than 'y', 'n', or RETURN"
  91.         echo "        will reload the kernel's default keymap."
  92.     fi
  93.     echo -n $1 " [${DEFAULT}] "
  94.     read
  95.     if [ x$REPLY = x ]
  96.     then
  97.         REPLY=$DEFAULT
  98.     fi
  99.     if [ $SECURE = y -a ! x$REPLY = xy -a ! x$REPLY = xn ]
  100.     then
  101.         if [ -r ${KERNEL_KEYMAP} ]
  102.         then
  103.         /bin/loadkeys ${KERNEL_KEYMAP}
  104.         else
  105.         /bin/loadkeys -d
  106.         fi
  107.     fi
  108.     done
  109.     test x$REPLY = xy
  110. }
  111.  
  112. do_preserving_keymap()
  113. # execute shell command-line preserving the keymap
  114. {
  115.     # save keymap
  116.     TMP=$(tempfile)
  117.     echo "Saving keymap to ${TMP}"
  118.     /usr/bin/dumpkeys >${TMP}
  119.  
  120.     eval "$*"
  121.  
  122.     # restore keymap
  123.     /bin/loadkeys ${TMP}
  124.     rm ${TMP}
  125. }
  126.  
  127. test_and_install()
  128. {
  129.     if [ $keymap = NONE ]
  130.     then
  131.     # create an empty keymap so that no question is re-asked on upgrade
  132.     touch ${CONFDIR}/default.${KMAPEXT}
  133.     else
  134.     echo "You selected keymap $keymap"
  135.     # Maybe test the keymap before installing
  136.     #
  137.     if /usr/bin/showkey --keymap --timeout=1 >/dev/null 2>&1
  138.     then
  139.         if yesno "Do you want to test the new keymap right now ?" y
  140.         then
  141.         do_preserving_keymap "/bin/loadkeys ${keymap} ; /usr/bin/showkey --keymap"
  142.         else
  143.         echo "WARNING: keymap was not tested... use it at your own risk !"
  144.         fi
  145.     else
  146.         echo "Sorry, I can't make you test this keymap now (showkey does not accept --keymap)."
  147.     fi
  148.     fi
  149.   
  150.     # Maybe install the new keymap
  151.     #
  152.     if yesno "Do you accept the chosen map for installation ?" y y
  153.     then
  154.     MAP_ACCEPTED=1
  155.       
  156.     echo Removing $(rm -fv ${CONFDIR}/default.${KMAPEXT} ${CONFDIR}/default.${KMAPEXT}.gz)
  157.       
  158.     if [ "${keymap}" != "NONE" ] 
  159.     then
  160.         echo -n "Generating include-less $keymap"
  161.         do_preserving_keymap "loadkeys $keymap ; dumpkeys > ${CONFDIR}/default.${KMAPEXT}"
  162.         echo -n "Compressing "
  163.         gzip -9fv ${CONFDIR}/default.${KMAPEXT}
  164.     fi
  165.     fi
  166. }
  167.  
  168.  
  169. BIGITEM=''
  170. maxlength_old()
  171. {
  172.     for item in $*
  173.     do
  174.     if [ ${#item} -gt ${#BIGITEM} ]
  175.     then
  176.         BIGITEM=$item
  177.     fi
  178.     done
  179. }
  180.  
  181. maxlength()
  182. {
  183.     local BIG=''
  184.     while read REPLY
  185.     do
  186.     if [ ${#REPLY} -gt ${#BIG} ]
  187.     then
  188.         BIG=$REPLY
  189.     fi
  190.     done
  191.  
  192.     echo $BIG
  193. }
  194.  
  195. # list all maps, compressed or not
  196. listfiles()
  197. {
  198.     local DIR=$1
  199.     local flist=$(tempfile)
  200.  
  201.     # NOTE: bash doesn't want to assign spaces to variable, so we first use 'ú'
  202.     #  (or I can't figure out how :)
  203.     {
  204.     { # the dirs
  205.     if [ ! -e $LIBDIR/${DIR}/.top-level ]
  206.     then
  207.         echo ".."
  208.     fi
  209.     find $LIBDIR/${DIR}/ $LOCALLIBDIR/${DIR}/ -mindepth 1 -maxdepth 1 -type d \
  210.         -printf "%f/\n" 2>/dev/null |
  211.         sort
  212.     } ; { # the files
  213.     find  $LIBDIR/${DIR}/ $LOCALLIBDIR/${DIR}/ -maxdepth 1 -type f \
  214.         \( -name *.${KMAPEXT} -o -name *.${KMAPEXT}.gz \) \
  215.         -printf "%f\n" 2>/dev/null |
  216.         # keep basename only and remove .gz extension
  217.         sed -e 's+.*/++' -e 's/\.gz//g' -e "s/\.${KMAPEXT}//g" | 
  218.         sort 
  219.     }
  220.     # write to a file so that $SPACES is computed before the remaining of the pipeline
  221.     } > $flist
  222.  
  223.     # compute column width - add 3 chars as column sep
  224.     BIGITEM="$(maxlength < $flist)"
  225.     BIGITEM=${BIGITEM%.gz}
  226.     BIGITEM=${BIGITEM%.${KMAPEXT}}
  227.  
  228.     # a string of as many ú (for spaces) as an item, plus 3 more as column-separator
  229.     SPACES="$(echo -n úúú${BIGITEM} | tr -c ú ú)"
  230.  
  231.     cat $flist |
  232.     # pad with enough spaces
  233.     sed -e "s/$/${SPACES}/g" -e 's/ú/ /g' |    
  234.      # strip spaces to needed length
  235.     fold -w ${#SPACES} | sed -e '/^ *$/d' |
  236.     # remove newlines
  237.     awk -v ORS='' '{print}' |
  238.     # make columns
  239.     fmt -w ${COLUMNS}
  240.  
  241.     rm $flist
  242. }
  243.  
  244.  
  245. # try to guess COLUMNS if not set
  246. #
  247. if [ "${COLUMNS}" = "" -a -x /usr/bin/X11/resize ]
  248. then
  249.     eval $(/usr/bin/X11/resize -u)
  250. fi
  251.  
  252. # fallback to decent defaults if it failed
  253. if [ "${COLUMNS}" = "" ]
  254. then
  255.     COLUMNS=80
  256. fi
  257.  
  258. MAP_ACCEPTED=0
  259. until [ $MAP_ACCEPTED = 1 ]
  260. do
  261.     # Security
  262.     #
  263.     echo -e "\nDo you want the kernel's default keymap to be reloaded ?"
  264.     echo "If you can't press 'n' and hit RETURN, I will assume you need that."
  265.     echo -n "Your choice: "
  266.     read
  267.     if [ x$REPLY != xn ]
  268.     then
  269.     /bin/loadkeys -d
  270.     fi
  271.  
  272.     ITEM=${KEYMAPSDIR}
  273.     while [ $MAP_ACCEPTED = 0 -a \( -d ${LIBDIR}/$ITEM -o -d ${LOCALLIBDIR}/$ITEM \) ]
  274.     do
  275.     if [ -r ${LIBDIR}/${ITEM}/.desc ]
  276.     then
  277.         echo
  278.         cat ${LIBDIR}/${ITEM}/.desc
  279.         echo
  280.     else
  281.         cat << EOT
  282.  
  283. Please choose one of the following keyboard tables,
  284. or \`..' to return to parent directory:
  285.  
  286. EOT
  287.     fi
  288.     listfiles ${ITEM}
  289.   
  290.     cat <<EOF | fold -s -w ${COLUMNS}
  291.  
  292. Or answer NONE to skip the loading of a keytable.
  293. Just pressing RETURN will abort the procedure.
  294. EOF
  295.  
  296.     echo -n "What keytable to load? "; read keymap
  297.     if [ -z "$keymap" ] 
  298.     then
  299.         echo "Leaving configuration unchanged."
  300.         exit 0
  301.     fi
  302.  
  303.     # if there is such a dir, do not look for a keymap
  304.     if [ -d ${LIBDIR}/$ITEM/$keymap -o -d ${LOCALLIBDIR}/$ITEM/$keymap ]
  305.     then
  306.         if [ $keymap = .. ]
  307.         then
  308.         if [ -r ${ITEM}/.top-level ]
  309.         then
  310.             echo -e "\n Already at top-level !"
  311.         else
  312.             ITEM=${ITEM%/*}
  313.         fi
  314.         else
  315.         ITEM=${ITEM}/$keymap
  316.         fi
  317.         continue
  318.     fi
  319.  
  320.     # Canonify name and check that wanted keymap exists
  321.     #
  322.     if [ $keymap = NONE ]
  323.     then
  324.         test_and_install
  325.     else
  326.         keymap=${keymap%.gz}
  327.         keymap=${keymap%.${KMAPEXT}}.${KMAPEXT}
  328.         if [ ! -z $(find ${LIBDIR}/${ITEM}/ -name ${keymap} 2>/dev/null) ]
  329.         then
  330.         keymap=$(find ${LIBDIR}/${ITEM}/ -name ${keymap})
  331.         test_and_install
  332.         elif [ ! -z $(find ${LIBDIR}/${ITEM}/ -name ${keymap}.gz 2>/dev/null) ]
  333.         then
  334.         keymap=$(find ${LIBDIR}/${ITEM}/ -name ${keymap}.gz)
  335.         test_and_install
  336.         elif [ ! -z $(find ${LOCALLIBDIR}/${ITEM}/ -name ${keymap} 2>/dev/null) ]
  337.         then
  338.         keymap=$(find ${LOCALLIBDIR}/${ITEM}/ -name ${keymap})
  339.         test_and_install
  340.         elif [ ! -z $(find ${LOCALLIBDIR}/${ITEM}/ -name ${keymap}.gz 2>/dev/null) ]
  341.         then
  342.         keymap=$(find ${LOCALLIBDIR}/${ITEM}/ -name ${keymap}.gz)
  343.         test_and_install
  344.         else
  345.         echo "Sorry, cannot find directory or keymap \`${keymap%.${KMAPEXT}}'."
  346.         fi
  347.     fi
  348.     done
  349.  
  350. done
  351.  
  352. # Maybe load the last installed keymap
  353. #
  354. if yesno "Do you want changes to take effect right now ?" y
  355. then
  356.     if [ "$keymap" != NONE ]
  357.     then
  358.     /bin/loadkeys ${CONFDIR}/default.${KMAPEXT}
  359.     else
  360.     /bin/loadkeys -d
  361.     fi
  362. else
  363.   echo "Any changes you made will take effect after the next boot."
  364. fi
  365.