140 lines
3.8 KiB
Bash
140 lines
3.8 KiB
Bash
|
#!/bin/bash
|
||
|
|
||
|
kernel_cmdline ()
|
||
|
{
|
||
|
for param in $(/bin/cat /proc/cmdline); do
|
||
|
case "${param}" in
|
||
|
$1=*) echo "${param##*=}"; return 0 ;;
|
||
|
$1) return 0 ;;
|
||
|
*) continue ;;
|
||
|
esac
|
||
|
done
|
||
|
[ -n "${2}" ] && echo "${2}"
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
get_country() {
|
||
|
local COUNTRY=$(kernel_cmdline lang)
|
||
|
echo $COUNTRY
|
||
|
}
|
||
|
|
||
|
get_keyboard() {
|
||
|
local KEYBOARD=$(kernel_cmdline keytable)
|
||
|
echo $KEYBOARD
|
||
|
}
|
||
|
|
||
|
get_layout() {
|
||
|
local LAYOUT=$(kernel_cmdline layout)
|
||
|
echo $LAYOUT
|
||
|
}
|
||
|
|
||
|
_find_legacy_keymap() {
|
||
|
file="/opt/livecd/kbd-model-map"
|
||
|
while read -r line || [[ -n $line ]]; do
|
||
|
if [[ -z $line ]] || [[ $line == \#* ]]; then
|
||
|
continue
|
||
|
fi
|
||
|
|
||
|
mapping=( $line ); # parses columns
|
||
|
if [[ ${#mapping[@]} != 5 ]]; then
|
||
|
continue
|
||
|
fi
|
||
|
|
||
|
if [[ "$KEYMAP" != "${mapping[0]}" ]]; then
|
||
|
continue
|
||
|
fi
|
||
|
|
||
|
if [[ "${mapping[3]}" = "-" ]]; then
|
||
|
mapping[3]=""
|
||
|
fi
|
||
|
|
||
|
X11_LAYOUT=${mapping[1]}
|
||
|
X11_MODEL=${mapping[2]}
|
||
|
X11_VARIANT=${mapping[3]}
|
||
|
x11_OPTIONS=${mapping[4]}
|
||
|
done < $file
|
||
|
}
|
||
|
|
||
|
_write_x11_config_file() {
|
||
|
# find a x11 layout that matches the keymap
|
||
|
# in isolinux if you select a keyboard layout and a language that doesnt match this layout,
|
||
|
# it will provide the correct keymap, but not kblayout value
|
||
|
local X11_LAYOUT=
|
||
|
local X11_MODEL="pc105"
|
||
|
local X11_VARIANT=""
|
||
|
local X11_OPTIONS="terminate:ctrl_alt_bksp"
|
||
|
_find_legacy_keymap
|
||
|
|
||
|
# layout not found, use KBLAYOUT
|
||
|
if [[ -z "$X11_LAYOUT" ]]; then
|
||
|
X11_LAYOUT="$KBLAYOUT"
|
||
|
fi
|
||
|
|
||
|
# create X11 keyboard layout config
|
||
|
mkdir -p "${DESTDIR}/etc/X11/xorg.conf.d"
|
||
|
if [ -e /run/openrc ]; then
|
||
|
local XORGKBLAYOUT="${DESTDIR}/etc/X11/xorg.conf.d/20-keyboard.conf"
|
||
|
else
|
||
|
local XORGKBLAYOUT="${DESTDIR}/etc/X11/xorg.conf.d/00-keyboard.conf"
|
||
|
fi
|
||
|
|
||
|
echo "" >> "$XORGKBLAYOUT"
|
||
|
echo "Section \"InputClass\"" > "$XORGKBLAYOUT"
|
||
|
echo " Identifier \"system-keyboard\"" >> "$XORGKBLAYOUT"
|
||
|
echo " MatchIsKeyboard \"on\"" >> "$XORGKBLAYOUT"
|
||
|
echo " Option \"XkbLayout\" \"$X11_LAYOUT\"" >> "$XORGKBLAYOUT"
|
||
|
echo " Option \"XkbModel\" \"$X11_MODEL\"" >> "$XORGKBLAYOUT"
|
||
|
echo " Option \"XkbVariant\" \"$X11_VARIANT\"" >> "$XORGKBLAYOUT"
|
||
|
echo " Option \"XkbOptions\" \"$X11_OPTIONS\"" >> "$XORGKBLAYOUT"
|
||
|
echo "EndSection" >> "$XORGKBLAYOUT"
|
||
|
|
||
|
# fix por keyboardctl
|
||
|
if [ -f "${DESTDIR}/etc/keyboard.conf" ]; then
|
||
|
sed -i -e "s/^XKBLAYOUT=.*/XKBLAYOUT=\"${X11_LAYOUT}\"/g" ${DESTDIR}/etc/keyboard.conf
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
set_locale() {
|
||
|
# hack to be able to set the locale on bootup
|
||
|
local LOCALE=$(get_country)
|
||
|
local KEYMAP=$(get_keyboard)
|
||
|
local KBLAYOUT=$(get_layout)
|
||
|
|
||
|
# set a default value, in case something goes wrong, or a language doesn't have
|
||
|
# good defult settings
|
||
|
[ -n "$LOCALE" ] || LOCALE="en_US"
|
||
|
[ -n "$KEYMAP" ] || KEYMAP="us"
|
||
|
[ -n "$KBLAYOUT" ] || KBLAYOUT="us"
|
||
|
|
||
|
# set keymap
|
||
|
if [ -e /run/openrc ]; then
|
||
|
sed -i "s/keymap=.*/keymap=\"${KEYMAP}\"/" ${DESTDIR}/etc/conf.d/keymaps
|
||
|
else
|
||
|
echo "KEYMAP=us" > ${DESTDIR}/etc/vconsole.conf
|
||
|
sed -i "s/^KEYMAP=.*/KEYMAP=\"${KEYMAP}\"/" ${DESTDIR}/etc/vconsole.conf
|
||
|
fi
|
||
|
|
||
|
# load keymaps
|
||
|
loadkeys "$KEYMAP"
|
||
|
|
||
|
_write_x11_config_file
|
||
|
|
||
|
# set systemwide language
|
||
|
echo "LANG=${LOCALE}.UTF-8" > ${DESTDIR}/etc/locale.conf
|
||
|
echo "LC_MESSAGES=${LOCALE}.UTF-8" >> ${DESTDIR}/etc/locale.conf
|
||
|
echo "LANG=${LOCALE}.UTF-8" >> ${DESTDIR}/etc/environment
|
||
|
|
||
|
# generate LOCALE
|
||
|
local TLANG=${LOCALE%.*} # remove everything after the ., including the dot from LOCALE
|
||
|
sed -i -r "s/#(${TLANG}.*UTF-8)/\1/g" ${DESTDIR}/etc/locale.gen
|
||
|
# add also American English as safe default
|
||
|
sed -i -r "s/#(en_US.*UTF-8)/\1/g" ${DESTDIR}/etc/locale.gen
|
||
|
}
|
||
|
|
||
|
printk()
|
||
|
{
|
||
|
case ${1} in
|
||
|
"on") echo 4 >/proc/sys/kernel/printk ;;
|
||
|
"off") echo 0 >/proc/sys/kernel/printk ;;
|
||
|
esac
|
||
|
}
|