* Denis Barbier [2004-07-24 22:51:00+0200] [...] > If termwrap is needed outside of d-i, I suggest to have a minimal > termwrap-di to deal with Asian locales, and nothing more. Eugeniy has once said that only those languages without a declared debian-installer/consoletype needed termwrap. I've prepared proof of concept by using the idea. Attached is the minimal implementation. It doesn't behave according to the ENCODING, instead it first evaluates the CONSOLETYPE from debian-installer/consoletype and only then it does something based on the ENCODING. Following explains this idea: WRAPPER="" WRAPPER_OPTION="" CONSOLETYPE=$(get_db debian-installer/consoletype) ENCODING=$(locale charmap) case $CONSOLETYPE in kbd|cyr) # Nothing to do. ;; *) case $ENCODING in eucJP|EUC-JP) [...] Please note that this is only a draft, far from complete and untested. Now, could it be a base for further discussions? -- roktas
#!/bin/sh # # Termwrap detects the type of terminal that it is run on, and the language # the user is using, and sets up the terminal for that language. This is # useful for languages (e.g., Japanese) where a special program is needed # to display that language at the console. # # Termwrap is used to run programs including base-config on the # second-stage install. # # This is really something of a hack, since once termwrap is done the user # still gets a standard login prompt and is no longer shielded by # termwrap. ###################################################################### ## Display usage if no argument. ###################################################################### if [ -z "$1" ]; then echo "usage: $0 [-nnt] <command> [...]" echo "-nnt: don't run another terminal" exit 0 fi ###################################################################### ## Some functions ###################################################################### # Get a variable from the debconf database of the first stage installer. get_db () { DI_DB=/var/log/debian-installer/cdebconf/questions.dat if [ -e $DI_DB ]; then debconf-copydb d-i stdout -c Name:d-i -c Driver:File \ -c Filename:$DI_DB -c Name:stdout \ -c Driver:Pipe -c InFd:none \ --pattern="^$1$" | \ grep ^Value: | cut -d ' ' -f 2 fi } info() { echo "info: $@" logger -p user.info -t termwrap "info: $@" } warning() { echo "warning: $@" logger -p user.warning -t termwrap "warning: $@" } error() { echo "error: $@" logger -p user.crit -t termwrap "error: $@" } try_load_fb() { # Load framebuffer module (debian-installer/framebuffer value is null(not true!) or false.) if [ "$(get_db debian-installer/framebuffer)" != "false" ]; then case $(dpkg --print-installation-architecture) in i386) case $(uname -r) in 2.6.*) (modprobe -q vesafb >/dev/null 2>&1 && modprobe -q fbcon >/dev/null 2>&1) || (modprobe -q vga16fb >/dev/null 2>&1 && modprobe -q fbcon >/dev/null 2>&1) ;; *) modprobe -q vesafb >/dev/null 2>&1 || modprobe -q vga16fb >/dev/null 2>&1 ;; esac ;; esac fi } ###################################################################### ## Check the locale ###################################################################### # For this to work, the current locale must be valid. The block # generating the locale should have taken care of that. If it isn't # valid, the output is 'ANSI_X3.4-1968' (at least on my test machine # 2002-02-09), and the case test below should unset both LANG and # LOCALE if [ -z "$LANG" ]; then echo "Locale is not set; aborting" exit 1 fi if ! validlocale $LANG > /dev/null 2>&1; then echo "Locale \"$LANG\" is not valid; aborting" exit 1 fi ###################################################################### ## Recognize terminal type. ###################################################################### case `/usr/bin/tty` in /dev/console) # Use fgconsole to detect if it is a serial console. if command -v fgconsole >/dev/null 2>&1 && [ serial = "$(fgconsole)" ] ; then TERMINAL=serial else TERMINAL=console fi # Or try another way, copied from d-i udeb rootskel. #case `readlink /proc/self/fd/0` in # /dev/console) # TERMINAL=serial # ;; # *) # TERMINAL=console # ;; #esac ;; /dev/tty|/dev/tty[1-9]*|/dev/vc/*) TERMINAL=console ;; /dev/tty[p-za-e]*|/dev/pts/*) TERMINAL=pseudo if [ ! -z "$DISPLAY" ]; then TERMINAL=x else case $TERM in rxvt|xterm*|kterm) TERMINAL=x;; esac fi ;; /dev/tty[A-Z]*|/dev/cu*) TERMINAL=serial ;; esac # If the default linux kernel TERM setting is used for serial consoles, change # it to vt100. This assume serial consoles understand vt100. Almost # all terminal programs can handle vt100. if [ serial = "$TERMINAL" ] && [ linux = "$TERM" ] ; then TERM=vt100 fi case $TERM in dumb) TERMINAL=dumb esac export TERMINAL case $(dpkg --print-installation-architecture) in i386) /bin/grep -q 9800 /proc/version && SUBARCH=pc9800 ;; esac ###################################################################### ## Select suitable terminal as wrapper. ###################################################################### WRAPPER="" WRAPPER_OPTION="" CONSOLETYPE=$(get_db debian-installer/consoletype) ENCODING=$(locale charmap) case $CONSOLETYPE in kbd|cyr) # Nothing to do. ;; *) case $ENCODING in eucJP|EUC-JP) # Japanese case $TERMINAL in x) WRAPPER="/usr/X11R6/bin/krxvt" WRAPPER_OPTION="-e" ;; console) if [ "$SUBARCH" != pc9800 ] && [ "$TERMINAL" = console ]; then # Any platform except PC9800 require jfbterm # to display japanese fonts on console. try_load_fb WRAPPER="/usr/bin/jfbterm" WRAPPER_OPTION="-q -c other,EUC-JP,iconv,UTF-8 -e" fi ;; # On pseudo and serial, we can't tell # if the terminal can display japanese fonts... esac ;; *) # Fallback jfbterm # Mainly Korean, Chinese, Greek, Bulgarian case $TERMINAL in console) try_load_fb WRAPPER="/usr/bin/jfbterm" WRAPPER_OPTION="-q -c other,$ENCODING,iconv,UTF-8 -e" ;; esac ;; esac esac if [ "$1" = "-nnt" ]; then WRAPPER="" shift fi ###################################################################### ## Execute Wrapper. ###################################################################### if [ ! -z "$WRAPPER" ] && [ -x "$WRAPPER" ]; then $WRAPPER $WRAPPER_OPTION /bin/true && exec $WRAPPER $WRAPPER_OPTION $@ fi # Run the program. $@
Attachment:
signature.asc
Description: Digital signature