Edit file File name : setupcon Content :#!/bin/sh # setupcon -- setup the font and keyboard on the Linux console # Copyright (C) 2011 Anton Zinoviev <anton@lml.bas.bg> # Permission is hereby granted, free of charge, to any person # obtaining a copy of this file (the "Program"), to deal in the # Program without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, # sublicense, and/or sell copies of the Program, and to permit # persons to whom the Program 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 Program. # THE PROGRAM 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 AUTHORS OR COPYRIGHT # HOLDERS 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 PROGRAM OR THE USE OR # OTHER DEALINGS IN THE PROGRAM. ########################################################################### do_font='' # configure font do_kbd='' # configure the keyboard do_term='' # configure the terminal do_check=yes # test whether we are on the console do_verbose='' # explain what is being doing do_save='' # save the required files in /etc/console-setup do_saveonly='' # save the required files, do not configure anything do_currenttty='' # configure only current tty savekbdfile='' # save the keyboard map in $savekbdfile do_printonly='' # only print the configuration commands setupdir='' # directory for --setup-dir SETUP='' # The same as /usr/bin/which - in order to make "which" available before # /usr is mounted which () { local IFS IFS=: for i in $PATH; do if [ -f "$i/$1" -a -x "$i/$1" ]; then echo "$i/$1" return 0 fi done return 1 } # Create a temporary file name and set TMPFILE to its name. Early in # the boot process /tmp is mounted read-only, so lets have some other # options... I am not sure all non-GNU versions of mktemp understand # the -q option so redirections of stderr are used instead. tempfiles='' trap 'rm -f $tempfiles >/dev/null 2>&1' 0 trap "exit 2" 1 2 3 13 15 tempfile () { if \ TMPFILE=`mktemp /run/tmpkbd.XXXXXX 2>/dev/null` \ || TMPFILE=`mktemp /tmp/tmpkbd.XXXXXX 2>/dev/null` then tempfiles="$tempfiles $TMPFILE" return 0 else TMPFILE='' return 1 fi } # Print the arguments to stderr if $do_verbose is yes report () { local nl case "$1" in -n) shift nl='' ;; *) nl=' ' ;; esac if [ "$do_verbose" ]; then echo -n "$@" "$nl" >&2 fi } # Execute a command on every console terminal screen specified in # $ACTIVE_CONSOLES. # # 1st argument: plain=execute only once with no tty change, # out=execute with standard output redirected to the tty, in=the same # but the standard input is being redirected, 'other argument'=do not # redirect the standard input or output but use this as a tty option. # # 2nd argument: option(s) for verbose output. NONE=no output, # FORK=run the command in background, 'other argument'=give this # option to the executed command. # # 3rd argument: command to run; other arguments: other options # # Example 1: run '-C ' -v setfont font.psf # If ACTIVE_CONSOLES='/dev/tty1 /dev/tty2 /dev/tty3', then this results in # # setfont -C /dev/tty1 font.psf -v # setfont -C /dev/tty2 font.psf -v # setfont -C /dev/tty3 font.psf -v # # or # # setfont -C /dev/tty1 font.psf >/dev/null 2>&1 # setfont -C /dev/tty2 font.psf >/dev/null 2>&1 # setfont -C /dev/tty3 font.psf >/dev/null 2>&1 # # depending on the value of $do_verbose # # Example 2: `run plain FORK echo hello` results in `echo hello` # regardless of the value of $do_verbose. # # Example 3: `run plain NONE echo hello` results in `echo hello` or # `echo hello >/dev/null 2>&1` depending on the value of $do_verbose. run () { local ttyarg cmd verbose tty x ttyarg="$1" verbose="$2" cmd="$3" shift; shift; shift if [ -z "$ACTIVE_CONSOLES" -o -n "$do_currenttty" ]; then ttyarg=plain fi case "$ttyarg" in plain) if [ "$setupdir$do_printonly" ]; then if [ "$verbose" = NONE ]; then # keep the space after > SETUP="$SETUP$cmd $@ > /dev/null " else SETUP="$SETUP$cmd $@ " fi elif [ "$do_verbose" ]; then case "$verbose" in NONE) report executing $cmd "$@". $cmd "$@" ;; FORK) # no arguments to suppress '\033%%@' and '\033%%G' report executing $cmd. $cmd "$@" & ;; *) report executing $cmd "$@". $cmd "$@" $verbose ;; esac else case "$verbose" in NONE) report executing $cmd "$@". $cmd "$@" >/dev/null 2>&1 ;; FORK) # no arguments to suppress '\033%%@' and '\033%%G' report executing $cmd. $cmd "$@" & ;; *) report executing $cmd "$@". $cmd "$@" ;; esac fi ;; in) for tty in $ACTIVE_CONSOLES; do if [ "$setupdir$do_printonly" ]; then # keep the space around > and < if [ "$verbose" = NONE ]; then SETUP="$SETUP$cmd $@ < $tty > /dev/null " else SETUP="$SETUP$cmd $@ < $tty " fi elif [ -r $tty ]; then report -n on $tty '' run plain "$verbose" "$cmd" "$@" <$tty else report No read access from $tty. Can not execute $cmd. fi done ;; out) for tty in $ACTIVE_CONSOLES; do if [ "$setupdir$do_printonly" ]; then # keep the space between > and $tty SETUP="$SETUP$cmd $@ > $tty " elif [ -w $tty ]; then report -n on $tty '' run plain "$verbose" "$cmd" "$@" >$tty else report No write access to $tty. Can not execute $cmd. fi done ;; *) for tty in $ACTIVE_CONSOLES; do x="${ttyarg}$tty" run plain "$verbose" "$cmd" $x "$@" done ;; esac } # Search a file and return the full file name if found. # The filename may include wildcards and may not include space. # Example: findfile share/consolefonts Uni3-*.psf.gz # Result: /usr/share/consolefonts/Uni3-Fixed13.psf.gz findfile () { local f case "$2" in /*) if [ -f "$2" ]; then echo "$2" return 0 fi ;; esac for f in "$installdir"/$1/$2 \ /usr/local/$1/$2 \ /usr/$1/$2 \ /etc/console-setup/cached_$2 \ /etc/console-setup/$2 \ "$installdir"/etc/console-setup/cached_$2 \ "$installdir"/etc/console-setup/$2 do if [ -f "$f" ]; then echo "$f" return 0 fi done report Unable to find "$2". } # Return code 0: we are on the console; 1: we are not on the console test_console () { local ok ok=0 if which tty >/dev/null; then case "`tty`" in /dev/tty[1-9]*|/dev/vc/[0-9]*|/dev/console|/dev/ttyv[0-9]*) return 0 ;; esac ok=1 fi if which kbd_mode >/dev/null; then mode="`(LC_ALL=C; export LC_ALL; kbd_mode) 2>&1`" mode=${mode#The keyboard is in } case "$mode" in Unicode*|default*|xlate*) return 0 ;; esac ok=1 fi if which vidcontrol >/dev/null; then if vidcontrol -i adapter >&- 2>&-; then return 0 fi ok=1 fi return $ok } ########################################################################### ### PROCESS THE COMMAND LINE ARGUMENTS ########################################################################### while [ "$1" ]; do case "$1" in -k|--keyboard-only) do_kbd=yes ;; -f|--font-only) do_font=yes ;; -t|--terminal-only) do_term=yes ;; --current-tty) do_currenttty=yes ;; -v|--verbose) do_verbose=yes ;; --force) do_check='' ;; --save) do_save=yes ;; --save-only) do_save=yes do_saveonly=yes do_check='' ;; --save-keyboard) shift savekbdfile="$1" do_saveonly=yes do_check='' ;; --print-commands-only) do_printonly=yes do_check='' ;; --setup-dir) shift do_kbd=yes do_currenttty=yes setupdir="$1" do_check='' ;; -h|--help) cat >&2 <<EOF Usage: setupcon [OPTION] [VARIANT] Sets up the font and the keyboard on Linux console. -k, --keyboard-only setup the keyboard only, do not setup the font -f, --font-only setup the font only, do not setup the keyboard -t, --terminal-only setup the terminal only --current-tty setup only the current virtual terminal --force do not check whether we are on the console -v, --verbose explain what is being doing, try it if s.t. goes wrong --save copy the font and the console map in /etc/console-setup, update /etc/console-setup/cached.* --save-only only save; don't setup keyboard/font immediately (implies --force) --print-commands-only print the configuration commands, do not configure --save-keyboard FILE, --setup-dir DIR options for initrd builders -h, --help display this help and exit If VARIANT is not specified setupcon looks for the configuration files (in this order) ~/.console-setup and if this doesn't exist then the combination /etc/default/keyboard + /etc/default/console-setup. When a VARIANT is specified then setupcon looks for the configuration files ~/.console-setup.VARIANT and /etc/default/console-setup.VARIANT. EOF exit 0 ;; -*) echo "setupcon: Unrecognised option $1" >&2 exit 1 ;; *) if [ -z "$VARIANT" ]; then VARIANT="$1" else echo "setupcon: Two variants specified: $VARIANT and $1" >&2 exit 1 fi ;; esac shift done if [ -z "$do_saveonly$do_kbd$do_font$do_term" ]; then do_kbd=yes do_font=yes do_term=yes fi # installdir installdir=${0%/*} case "$installdir" in */bin) installdir=${installdir%/bin} ;; *) installdir=$installdir/.. ;; esac [ -n "$installdir" -a -d "$installdir"/bin ] || installdir=/usr case "$installdir" in /*) ;; *) installdir="`pwd`\$installdir" ;; esac ########################################################################### ### READ THE CONFIGURATION FILES ########################################################################### if [ "$VARIANT" ]; then VARIANT=".$VARIANT" fi USER_CONFIG=${HOME}/.console-setup"$VARIANT" USER_CONFIG2=${HOME}/.keyboard"$VARIANT" MAIN_CONFIG=/etc/default/keyboard"$VARIANT" [ -f "$MAIN_CONFIG" ] \ || [ ! -f "$installdir"/etc/default/keyboard"$VARIANT" ] \ || MAIN_CONFIG="$installdir"/etc/default/keyboard"$VARIANT" MAIN_CONFIG2=/etc/default/console-setup"$VARIANT" [ -f "$MAIN_CONFIG2" ] \ || [ ! -f "$installdir"/etc/default/console-setup"$VARIANT" ] \ || MAIN_CONFIG2="$installdir"/etc/default/console-setup"$VARIANT" if [ -f "$USER_CONFIG" -o -f "$USER_CONFIG2" ]; then CONFIG="$USER_CONFIG" CONFIG2="$USER_CONFIG2" elif [ -f "$MAIN_CONFIG" -o -f "$MAIN_CONFIG2" ]; then CONFIG="$MAIN_CONFIG" CONFIG2="$MAIN_CONFIG2" else echo "setupcon: None of $MAIN_CONFIG, $MAIN_CONFIG2, $USER_CONFIG, $USER_CONFIG2 exists." >&2 exit 1 fi if [ -f "$CONFIG2" ]; then . "$CONFIG2" else # in order to permit "if [ cached.kmap.gz -ot $CONFIG2 ]; then ... fi" CONFIG2="$CONFIG" fi if [ -f "$CONFIG" ]; then . "$CONFIG" fi ########################################################################### ### INITIALIZATION AND DEFAULT VALUES ########################################################################### # do_verbose # The variable VERBOSE_OUTPUT is obsoleted in favour of the option --verbose if [ "$VERBOSE_OUTPUT" = yes ]; then do_verbose=yes fi # kernel kernel=unknown if which uname >/dev/null; then case "`uname`" in *Linux*) kernel=linux ;; *FreeBSD*) kernel=freebsd ;; *) echo 'setupcon: Unknown kernel (only Linux and FreeBSD are supported).' >&2 exit 1 ;; esac fi # do_save if [ -n "$do_save" ]; then if [ ! -d /usr/share ]; then echo setupcon: It seems /usr is not mounted. Will not save files in /etc. >&2 do_save='' fi fi # ACTIVE_CONSOLES # When ACTIVE_CONSOLES=guess the following will result in ACTIVE_CONSOLES='' ACTIVE_CONSOLES=$( for tty in $ACTIVE_CONSOLES; do if [ -e $tty ]; then echo $tty fi done ) if [ -z "$ACTIVE_CONSOLES" ]; then # Some crude guess # Conf. files: # BSD: /etc/ttys # Sys V init: /etc/inittab # Upstart: /etc/init/* # Devices: # Linux: /dev/tty[1-9][0-9]* # FreeBSD: /dev/ttyv[0-9a-f] for tty in \ $(cat /etc/inittab /etc/init/* /etc/ttys 2>/dev/null \ | grep getty \ | egrep '([[:blank:]]|^)tty([1-9][0-9]*|v[0-9a-f])([[:blank:]]|$)' \ | sed -e '/^ *#/d' \ -e 's/.*[[:blank:]]\(tty[1-9][0-9]*\).*/\1/' \ -e 's/.*[[:blank:]]\(ttyv[0-9a-f]\).*/\1/') do if [ -e /dev/$tty ]; then ACTIVE_CONSOLES="$ACTIVE_CONSOLES /dev/$tty" fi done fi if [ -z "$ACTIVE_CONSOLES" ]; then case "$kernel" in linux) ACTIVE_CONSOLES=$(ls /dev/tty[1-6] 2>/dev/null) ;; freebsd) ACTIVE_CONSOLES=$(ls /dev/ttyv[0-3] 2>/dev/null) ;; esac report Can not find the active virtual consoles, \ assuming ACTIVE_CONSOLES=\"$ACTIVE_CONSOLES\" >&2 else report Configuring $ACTIVE_CONSOLES fi # CHARMAP if [ "$CHARMAP" = guess -o -z "$CHARMAP" ]; then CHARMAP='' if which locale >/dev/null; then CHARMAP=`locale charmap` fi fi CHARMAP=${CHARMAP:-UTF-8} # FreeBSD uses ISO8859-1, GNU uses ISO-8859-1, we use the GNU names case "$CHARMAP" in ISO8859-*) CHARMAP="ISO-8859-${CHARMAP#ISO8859-}" ;; US-ASCII|ANSI*) CHARMAP=ISO-8859-1 ;; esac report The charmap is $CHARMAP # unicode if \ [ "$CHARMAP" = UTF-8 ] then unicode=yes else unicode='' fi # do_font if [ "$do_font" ]; then case "$kernel" in linux) if which consolechars >/dev/null ; then do_font=linuxct elif which setfont >/dev/null ; then do_font=linuxkbd else echo "setupcon: Neither setfont nor consolechars is accessible. No font will be configured." >&2 do_font='' fi ;; freebsd) if which vidcontrol >/dev/null ; then do_font=freebsd else echo "setupcon: vidcontrol is not accessible. No font will be configured." >&2 do_font='' fi ;; esac fi # Due to bug in splashy and usplash: do not load fonts (#540314) if which pidof >/dev/null; then if pidof splashy > /dev/null || pidof usplash > /dev/null; then do_font='' fi fi # CODESET [ "$CODESET" != guess ] || CODESET='' if [ -z "$CODESET" ]; then case "$CHARMAP" in UTF-8) CODESET=Uni2;; ARMSCII-8) CODESET=Armenian ;; CP1251) CODESET=CyrSlav ;; CP1255) CODESET=Hebrew ;; CP1256) CODESET=Arabic ;; GEORGIAN-ACADEMY) CODESET=Georgian ;; GEORGIAN-PS) CODESET=Georgian ;; IBM1133) CODESET=Lao ;; ISIRI-3342) CODESET=Arabic ;; ISO-8859-1) CODESET=Lat15 ;; ISO-8859-2) CODESET=Lat2 ;; ISO-8859-3) CODESET=Lat38 ;; ISO-8859-4) CODESET=Lat7 ;; # sometimes Lat15 ISO-8859-5) CODESET=CyrSlav ;; ISO-8859-6) CODESET=Arabic ;; ISO-8859-7) CODESET=Greek ;; ISO-8859-8) CODESET=Hebrew ;; ISO-8859-9) CODESET=Lat15 ;; ISO-8859-10) CODESET=Lat15 ;; ISO-8859-11) CODESET=Thai ;; ISO-8859-13) CODESET=Lat7 ;; ISO-8859-14) CODESET=Lat38 ;; ISO-8859-15) CODESET=Lat15 ;; ISO-8859-16) CODESET=Lat2 ;; KOI8-R) CODESET=CyrKoi ;; KOI8-U) CODESET=CyrKoi ;; TIS-620) CODESET=Thai ;; VISCII) CODESET=Vietnamese ;; *) if [ "$do_font" ]; then echo Unsupported charmap $CHARMAP >&2 exit 1 fi ;; esac if [ "$kernel" = freebsd ]; then # 512 character fonts are not supported on FreeBSD case "$CODESET" in Uni*|Vietnamese|Arabic|Ethiopian) CODESET=Lat15 ;; esac fi fi if [ "$CHARMAP" != UTF-8 -a "$kernel" = freebsd ]; then if \ [ -z "`findfile share/syscons/scrnmaps ${CHARMAP}_${CODESET}.scm`" ] then report "Ignoring the CODESET specification ($CODESET)." CODESET=`findfile share/syscons/scrnmaps ${CHARMAP}_*.scm` if [ -n "$do_font" -a -z "$CODESET" ]; then echo setupcon: Unsupported charmap $CHARMAP >&2 exit 1 fi CODESET=${CODESET%%*/} CODESET=${CODESET#.scm*} CODESET=${CODESET%*_} report Using $CODESET instead. fi fi # FONTSIZE if [ -z "$FONTSIZE" -o "$FONTSIZE" = guess ]; then FONTSIZE=16 fi case "$FONTSIZE" in 8x*) FONTSIZE=${FONTSIZE#*x} ;; *x8) FONTSIZE=${FONTSIZE%x*} ;; *x*) a=${FONTSIZE%x*} b=${FONTSIZE#*x} if [ "$a" -lt "$b" ]; then FONTSIZE=${b}x${a} fi ;; esac # mapdir, fontdir, stdfont, stdfontfallback case "$kernel" in linux) mapdir=share/consoletrans stdmap=$CHARMAP.acm.gz fontdir=share/consolefonts stdfont=$CODESET-$FONTFACE$FONTSIZE.psf.gz # [A-WXYZa-wyz] is a funny way to say [A-Za-wyz]. In some locales # [A-Z] includes x and we don't want this. stdfontfallback=$CODESET-*[A-WXYZa-wyz]$FONTSIZE.psf.gz ;; freebsd) mapdir=share/syscons/scrnmaps stdmap=${CHARMAP}_${CODESET}.scm fontdir=share/syscons/fonts stdfont16=$CODESET-${FONTFACE}16.fnt stdfont14=$CODESET-${FONTFACE}14.fnt stdfont8=$CODESET-${FONTFACE}8.fnt stdfontfallback16=$CODESET-*[A-WXYZa-wyz]16.fnt stdfontfallback14=$CODESET-*[A-WXYZa-wyz]14.fnt stdfontfallback8=$CODESET-*[A-WXYZa-wyz]8.fnt ;; esac # CONSOLE_MAP CONSOLE_MAP=${CONSOLE_MAP:-$ACM} [ -z "$CONSOLE_MAP" ] || CONSOLE_MAP=`findfile $mapdir "$CONSOLE_MAP"` [ -n "$CONSOLE_MAP" -o "$CHARMAP" = UTF-8 ] || CONSOLE_MAP=`findfile $mapdir $stdmap` [ -n "$CONSOLE_MAP" -o "$CHARMAP" = UTF-8 ] || CONSOLE_MAP=`findfile $mapdir ${stdmap%.gz}` # FONTFILES FONTFILES='' if [ "$FONT" ]; then for f in $FONT; do FONTFILES="$FONTFILES `findfile $fontdir $f`" RES=`findfile $fontdir $f` if [ -z "$RES" ]; then fdec="${f%.gz}" RES=`findfile $fontdir $fdec` fi FONTFILES="$FONTFILES $RES" done fi FONTFILES=`echo $FONTFILES` # remove extra spaces if [ -n "$FONTFACE" -a -z "$FONTFILES" ]; then case "$kernel" in linux) # the following will fail if FONTFACE=guess ($stdfont will # match nothing) FONTFILES=`findfile $fontdir $stdfont` [ "$FONTFILES" ] || FONTFILES=`findfile $fontdir $stdfontfallback` case "$FONTFILES" in *[0-9]x[1-9]*.psf.gz) if which consolechars >/dev/null; then echo "\ The consolechars utility from the \"console-tools\" package can load only fonts with 8 pixel width matrix. Please install the setfont utility from the package \"kbd\" or reconfigure the font size." >&2 fi ;; esac ;; freebsd) FONTFILES=`findfile $fontdir $stdfont16` [ "$FONTFILES" ] || FONTFILES=`findfile $fontdir $stdfontfallback16` font=`findfile $fontdir $stdfont14` [ "$font" ] || font=`findfile $fontdir $stdfontfallback14` [ -z "$font" ] || FONTFILES="$FONTFILES $font" font=`findfile $fontdir $stdfont8` [ "$font" ] || font=`findfile $fontdir $stdfontfallback8` [ -z "$font" ] || FONTFILES="$FONTFILES $font" ;; esac if [ -n "$do_font" -a -z "$FONTFILES" ]; then echo setupcon: Unable to find the required font. No font will be configured. >&2 do_font='' fi fi # FONTMAPFILE FONTMAPFILE='' if [ "$kernel" = linux -a -n "$FONT_MAP" ]; then FONTMAPFILE=`findfile share/consoletrans "$FONT_MAP"` fi # XKBMODEL if \ [ -n "$do_kbd$do_save$savekbdfile$setupdir$do_printonly" \ -a -z "$XKBMODEL" ] then echo setupcon: The keyboard model is unknown, assuming \'pc105\'. Keyboard may be configured incorrectly. >&2 XKBMODEL='pc105' fi [ -n "$XKBMODEL" -o -z "$savekbdfile" ] || exit 1 # Backwards-compatibility with Ubuntu-specific preseeding if [ "$XKBMODEL" = SKIP ]; then XKBMODEL= fi # do_kbd [ "$XKBMODEL$KMAP" ] || do_kbd='' if [ "$do_kbd" ]; then case "$kernel" in linux) if which loadkeys >/dev/null; then do_kbd=linux else echo setupcon: loadkeys is not accessible. Keyboard will not be configured.>&2 do_kbd='' fi ;; freebsd) if which kbdcontrol >/dev/null; then do_kbd=freebsd else echo setupcon: kbdcontrol is not accessible. Keyboard will not be configured.>&2 do_kbd='' fi ;; esac fi # acm_option if [ "$CHARMAP" != UTF-8 ]; then acm_option="-charmap $CHARMAP" elif [ "$kernel" = freebsd ]; then acm_option='-charmap ISO-8859-1' else acm_option='' fi # rules_option if [ "$XKBRULES" ]; then rules_option="-rules $XKBRULES" else rules_option='' fi # backspace case "$kernel" in linux) backspace='del' ;; freebsd) backspace='bs' ;; esac case \ "`(stty -a \ | egrep '(^| )erase *=' \ | sed -e 's/.* erase *= *//' -e 's/^erase *= *//' -e 's/[; ].*//') \ 2>/dev/null`" in ^\?) backspace='del' ;; ^h|^H) backspace='bs' ;; esac case "$BACKSPACE" in del) backspace='del' ;; bs) backspace='bs' ;; esac case "$backspace" in del) report BackSpace is ^? ;; bs) report BackSpace is ^h ;; *) echo setupcon: Wrong BackSpace option >&2 ;; esac # do_term if [ "$do_term" ]; then case "$kernel" in linux) do_term=linux ;; freebsd) do_term=freebsd ;; esac fi # cached case "$kernel" in linux) cached=/etc/console-setup/cached_${CHARMAP}_$backspace$VARIANT.kmap.gz ;; freebsd) cached=/etc/console-setup/cached_${CHARMAP}_$backspace$VARIANT.kbd ;; esac # savekbdfile if \ [ -z "$savekbdfile" -a -n "$do_save" ] \ && [ ! -f "$cached" \ -o ! "$CONFIG" -ot "$cached" \ -o ! "$CONFIG2" -ot "$cached" ] then savekbdfile="$cached" fi [ "$XKBMODEL" ] || savekbdfile='' if [ "$kernel" = linux ] && ! which gzip >/dev/null; then savekbdfile='' echo setupcon: gzip is not accessible. Will not save cached keyboard map. >&2 fi # KMAP if [ -n "$KMAP" -a ! -f "$KMAP" ]; then echo setupcon: $KMAP does not exist. >&2 KMAP='' fi ########################################################################### ### SAVE THE FILES IN /etc ########################################################################### for i in /etc/console-setup $CONSOLE_MAP $FONTFILES $FONTMAPFILE $savekbdfile; do if [ "$i" = "${i#/etc/console-setup}" -a -n "$do_save" ]; then if \ ! touch /etc/console-setup/cached_rwtest 2>/dev/null \ || ! rm /etc/console-setup/cached_rwtest 2>/dev/null then echo setupcon: /etc/console-setup is not writable. No files will be saved there. >&2 do_save='' fi break fi done if [ -n "$do_save" ]; then case "$CONSOLE_MAP" in /etc/console-setup/*) ;; ?*) console_map_dec="${CONSOLE_MAP%.gz}" if [ "$console_map_dec" = "$CONSOLE_MAP" ]; then cp "$CONSOLE_MAP" /etc/console-setup/ else gunzip -c "$CONSOLE_MAP" >"/etc/console-setup/${console_map_dec##*/}" fi rm -f "/etc/console-setup/${console_map_dec##*/}.gz" ;; esac for font in $FONTFILES; do case "$font" in /etc/console-setup/*) ;; ?*) cp "$font" /etc/console-setup/ ;; esac done case "$FONTMAPFILE" in /etc/console-setup/*) ;; ?*) cp "$FONTMAPFILE" /etc/console-setup/ ;; esac fi if [ "$savekbdfile" ]; then case "$kernel" in linux) tempfile || { echo setupcon: Can not create temporary file >&2; exit 1; } { $installdir/bin/ckbcomp -backspace "$backspace" $acm_option \ $rules_option -model "$XKBMODEL" \ "$XKBLAYOUT" "$XKBVARIANT" "$XKBOPTIONS" >$TMPFILE \ && gzip -9n <$TMPFILE >"$savekbdfile" } || exit 1 ;; freebsd) $installdir/bin/ckbcomp -freebsd -backspace "$backspace" \ $acm_option $rules_option -model "$XKBMODEL" \ "$XKBLAYOUT" "$XKBVARIANT" "$XKBOPTIONS" >"$savekbdfile" \ || exit 1 ;; esac fi if [ -n "$do_save" ]; then case "$CONSOLE_MAP" in /etc/console-setup/*) ;; ?*) cp "$CONSOLE_MAP" /etc/console-setup/cached_"${CONSOLE_MAP##*/}" ;; esac for font in $FONTFILES; do case "$font" in /etc/console-setup/*) ;; ?*) cp "$font" /etc/console-setup/cached_"${font##*/}" ;; esac done case "$FONTMAPFILE" in /etc/console-setup/*) ;; ?*) cp "$FONTMAPFILE" /etc/console-setup/cached_"${FONTMAPFILE##*/}" ;; esac if [ "$kernel" = linux ]; then commands_k=$($0 -k --print-commands-only) commands_f=$($0 -f --current-tty --print-commands-only) commands_t=$($0 -t --current-tty --print-commands-only) cat >/etc/console-setup/cached_setup_keyboard.sh <<EOF #!/bin/sh if [ -f /run/console-setup/keymap_loaded ]; then rm /run/console-setup/keymap_loaded exit 0 fi $commands_k EOF cat >/etc/console-setup/cached_setup_font.sh <<EOF #!/bin/sh $commands_f if ls /dev/fb* >/dev/null 2>/dev/null; then for i in /dev/vcs[0-9]*; do { : $commands_f } < /dev/tty\${i#/dev/vcs} > /dev/tty\${i#/dev/vcs} done fi mkdir -p /run/console-setup > /run/console-setup/font-loaded for i in /dev/vcs[0-9]*; do { : $commands_t } < /dev/tty\${i#/dev/vcs} > /dev/tty\${i#/dev/vcs} done EOF cat >/etc/console-setup/cached_setup_terminal.sh <<EOF #!/bin/sh { : $commands_t } < /dev/tty\${1#vcs} > /dev/tty\${1#vcs} EOF chmod +x /etc/console-setup/cached_setup_keyboard.sh \ /etc/console-setup/cached_setup_font.sh \ /etc/console-setup/cached_setup_terminal.sh fi fi ########################################################################### ### ARE WE ON THE CONSOLE? ########################################################################### if [ "$do_check" ]; then if ! test_console; then echo setupcon: We are not on the console, the console is left unconfigured. >&2 exit 0 fi fi ########################################################################### ### OUTPUT ########################################################################### # Video mode if [ "$VIDEOMODE" ]; then case "$do_font" in freebsd) run in '' vidcontrol "$VIDEOMODE" ;; linux*) # this is a bit pointless as vesafb doesn't support changing mode if which fbset >/dev/null; then run plain '' fbset -a "$VIDEOMODE" else report fbset is not installed fi ;; esac fi # Load the font(s) if [ "$FONTFILES" ]; then case "$do_font" in freebsd) if [ -z "$unicode" ]; then for font in $FONTFILES; do run plain '' vidcontrol -f $font done if [ "$CONSOLE_MAP" ]; then run plain '' vidcontrol -l "$CONSOLE_MAP" fi fi ;; linuxkbd) if [ "$FONTMAPFILE" ]; then if [ "$CONSOLE_MAP" ]; then run '-C ' -v setfont $FONTFILES -u "$FONTMAPFILE" -m "$CONSOLE_MAP" else run '-C ' -v setfont $FONTFILES -u "$FONTMAPFILE" fi else if [ "$CONSOLE_MAP" ]; then run '-C ' -v setfont $FONTFILES -m "$CONSOLE_MAP" else run '-C ' -v setfont $FONTFILES fi fi ;; linuxct) if [ "$FONTMAPFILE" ]; then if [ "$CONSOLE_MAP" ]; then run --tty= -v consolechars -f ${FONTFILES%% *} \ -u "$FONTMAPFILE" --acm "$CONSOLE_MAP" else run --tty= -v consolechars -f ${FONTFILES%% *} -u "$FONTMAPFILE" fi else if [ "$CONSOLE_MAP" ]; then run --tty= -v consolechars -f ${FONTFILES%% *} --acm "$CONSOLE_MAP" else run --tty= -v consolechars -f ${FONTFILES%% *} fi fi ;; esac fi # Setup unicode/non-unicode mode case "$do_term" in # So far the FreeBSD kernel doesn't support changes of the mode from # utf to 8-bit and vice versa (its a compile time option). linux*) # FORK because of #678897 if [ "$unicode" ]; then run out FORK printf '\033%%G' else run out FORK printf '\033%%@' fi ;; esac # Setup the terminal width and height if [ "$do_term" ]; then STTY='' [ -z "$SCREEN_WIDTH" ] || STTY="$STTY cols $SCREEN_WIDTH" [ -z "$SCREEN_HEIGHT" ] || STTY="$STTY rows $SCREEN_HEIGHT" if [ "$STTY" ]; then run in '' stty $STTY fi fi # Setup the system beep case "$do_term" in linux*) SETTERM='' if [ -n "$BEEP" ]; then # we use hardcoded ESC sequences instead of setterm # because we TERM is unset in scripts run by udev case "$BEEP" in default) ;; standard) # --bfreq 750 --blength 100 SETTERM='\033[11;100]\033[10;750]' ;; short) # --bfreq 750 --blength 40 SETTERM='\033[11;40]\033[10;750]' ;; shortest) # --bfreq 750 --blength 9 SETTERM='\033[11;9]\033[10;750]' ;; polite) # --bfreq 130 --blength 9 SETTERM='\033[11;9]\033[10;130]' ;; attention) # --bfreq 130 --blength 600 SETTERM='\033[11;600]\033[10;130]' ;; annoying) # --bfreq 550 --blength 1000 SETTERM='\033[11;1000]\033[10;550]' ;; off) # --blength 0 SETTERM='\033[11;0]' ;; *) echo setupcon: Unrecognised setting BEEP="$BEEP" >&2 ;; esac if [ "$SETTERM" ]; then run out FORK printf "$SETTERM" fi fi ;; esac ########################################################################### ### INPUT ########################################################################### # On Mac PPC machines, we may need to set kernel vars first. We need # to mount /proc to do that, but we need it set up before sulogin may # be run in checkroot, which will need the keyboard to log in... # This code was borrowed from the keymap.sh script of console-common # Copyright © 2001 Yann Dirson # Copyright © 2001 Alcove http://www.alcove.fr/ if [ "$do_kbd" = linux ]; then if [ -x /sbin/sysctl -a -r /etc/sysctl.conf ]; then if grep -v '^\#' /etc/sysctl.conf | grep -q keycodes ; then grep keycodes /etc/sysctl.conf | grep -v "^#" \ | while read -r d ; do /sbin/sysctl -w $d 2> /dev/null || true done fi fi fi # Setup unicode/non-unicode mode # The following had to be [ "$do_kbd" = linux -o "$do_term" = linux ]. # Unfortunately, that way the X keyboard will be damaged when # console-setup modifies the keyboard mode of X. if [ "$do_kbd" = linux ]; then if which kbd_mode >/dev/null; then if [ "$unicode" ]; then run in '' kbd_mode -u else run in '' kbd_mode -a fi else report kbd_mode is not accessible. Unable to setup unicode/non-unicode keyboard mode. fi fi if \ [ -z "$KMAP" -a -f "$cached" ] \ && [ "$CONFIG" -ot "$cached" -a "$CONFIG2" -ot "$cached" ] then KMAP="$cached" fi if [ "$KMAP" ]; then case "$do_kbd" in linux) run plain NONE loadkeys "$KMAP" ;; freebsd) run in '' kbdcontrol -l "$KMAP" ;; esac else tempfile || { echo setupcon: Can not create temporary file >&2; exit 1; } case "$do_kbd" in linux) $installdir/bin/ckbcomp -backspace "$backspace" $acm_option \ $rules_option -model "$XKBMODEL" \ "$XKBLAYOUT" "$XKBVARIANT" "$XKBOPTIONS" >$TMPFILE run plain NONE loadkeys $TMPFILE ;; freebsd) $installdir/bin/ckbcomp -freebsd -backspace "$backspace" \ $acm_option $rules_option -model "$XKBMODEL" \ "$XKBLAYOUT" "$XKBVARIANT" "$XKBOPTIONS" >$TMPFILE run in '' kbdcontrol -l $TMPFILE run in '' kbdcontrol -f 70 "`printf '\033[3~'`" ;; esac fi ########################################################################### ### PRINTONLY ########################################################################### if [ "$do_printonly" ]; then fileargs () { local arg args f if [ "$1" ]; then printf "%s" "$1" | { read -r arg args case "$arg" in \>|\<) echo -n "$arg" ;; *) echo -n "'" # printf instead of echo because different versions of # echo process backslashes differently. printf "%s" "$arg" \ | sed "s/'/\'\\\\\'\'/g" echo -n "'" ;; esac echo -n ' ' fileargs "$args" } fi } printf "%s" "$SETUP" | while read -r cmd args; do printf "%s " "$cmd" fileargs "$args" echo done fi ########################################################################### ### SETUPDIR ########################################################################### if [ "$setupdir" ]; then fileargs () { local arg args f if [ "$1" ]; then printf "%s" "$1" | { read -r arg args case "$arg" in \>|\<) echo -n "$arg" ;; /*) echo -n "'" if [ -e "$arg" ]; then f="${arg##*/}" f="${f%.gz}" case "$arg" in *.gz) zcat "$arg" >"$setupdir/etc/console-setup/$f" ;; *) cp -a "$arg" "$setupdir/etc/console-setup/$f" ;; esac printf "%s" "/etc/console-setup/$f" \ | sed "s/'/\'\\\\\'\'/g" else printf "%s" "$arg" \ | sed "s/'/\'\\\\\'\'/g" fi echo -n "'" ;; *) echo -n "'" # printf instead of echo because different versions of # echo process backslashes differently. printf "%s" "$arg" \ | sed "s/'/\'\\\\\'\'/g" echo -n "'" ;; esac echo -n ' ' fileargs "$args" } fi } mkdir -p "$setupdir"/bin mkdir -p "$setupdir"/etc/console-setup echo '#!/bin/sh' >"$setupdir"/bin/setupcon echo '# A micro-version of setupcon with static configuration.' >>"$setupdir"/bin/setupcon chmod +x "$setupdir"/bin/setupcon tempfile || { echo setupcon: Can not create temporary file >&2; exit 1; } printf "%s" "$SETUP" | while read -r cmd args; do which "$cmd" >>$TMPFILE || true printf "%s " "$cmd" fileargs "$args" echo done >>"$setupdir"/bin/setupcon echo 'mkdir /run/console-setup' >>"$setupdir"/bin/setupcon echo '>/run/console-setup/keymap_loaded' >>"$setupdir"/bin/setupcon echo exit 0 >>"$setupdir"/bin/setupcon sort $TMPFILE | uniq | grep -v 'printf$' >"$setupdir"/morefiles fi exit 0 Save