diff --git a/modules.d/10i18n/.shchkdir b/modules.d/10i18n/.shchkdir new file mode 100644 index 00000000..e69de29b diff --git a/modules.d/10i18n/console_init.sh b/modules.d/10i18n/console_init.sh index 2cbfb60c..3fe3b673 100755 --- a/modules.d/10i18n/console_init.sh +++ b/modules.d/10i18n/console_init.sh @@ -2,8 +2,8 @@ [ -n "$DRACUT_SYSTEMD" ] && exit 0 -if [ -x $systemdutildir/systemd-vconsole-setup ]; then - $systemdutildir/systemd-vconsole-setup "$@" +if [ -x "$systemdutildir"/systemd-vconsole-setup ]; then + "$systemdutildir"/systemd-vconsole-setup "$@" fi [ -e /etc/vconsole.conf ] && . /etc/vconsole.conf @@ -23,10 +23,10 @@ set_terminal() { if [ "${UNICODE}" = 1 ]; then printf '\033%%G' >&7 - stty -F ${dev} iutf8 + stty -F "${dev}" iutf8 else printf '\033%%@' >&7 - stty -F ${dev} -iutf8 + stty -F "${dev}" -iutf8 fi } @@ -41,19 +41,15 @@ set_keymap() { [ "${UNICODE}" = 1 ] && utf_switch=-u + # shellcheck disable=SC2086 loadkeys -q ${utf_switch} ${KEYMAP} ${EXT_KEYMAPS} } set_font() { - local dev=$1 - local trans='' - local uni='' - - [ -z "${FONT}" ] && FONT=${DEFAULT_FONT} - [ -n "${FONT_MAP}" ] && trans="-m ${FONT_MAP}" - [ -n "${FONT_UNIMAP}" ] && uni="-u ${FONT_UNIMAP}" - - setfont ${FONT} -C ${dev} ${trans} ${uni} + setfont "${FONT-${DEFAULT_FONT}}" \ + -C "${1}" \ + ${FONT_MAP:+-m "${FONT_MAP}"} \ + ${FONT_UNIMAP:+-u "${FONT_UNIMAP}"} } dev_close() { @@ -64,19 +60,18 @@ dev_close() { dev_open() { local dev=$1 - exec 6< ${dev} \ - && exec 7>> ${dev} + exec 6< "${dev}" \ + && exec 7>> "${dev}" } dev=/dev/${1#/dev/} -devname=${dev#/dev/} [ -c "${dev}" ] || { echo "Usage: $0 device" >&2 exit 1 } -dev_open ${dev} +dev_open "${dev}" for fd in 6 7; do if ! [ -t ${fd} ]; then @@ -87,8 +82,8 @@ for fd in 6 7; do done set_keyboard -set_terminal ${dev} -set_font ${dev} +set_terminal "${dev}" +set_font "${dev}" set_keymap dev_close diff --git a/modules.d/10i18n/module-setup.sh b/modules.d/10i18n/module-setup.sh index 22ee54e7..c0768b50 100755 --- a/modules.d/10i18n/module-setup.sh +++ b/modules.d/10i18n/module-setup.sh @@ -16,9 +16,12 @@ depends() { # called by dracut install() { + declare -A KEYMAPS + if dracut_module_included "systemd"; then unset FONT unset KEYMAP + # shellcheck disable=SC1090 [[ -f "$dracutsysrootdir"/etc/vconsole.conf ]] && . "$dracutsysrootdir"/etc/vconsole.conf fi @@ -27,26 +30,43 @@ install() { I18N_CONF="/etc/locale.conf" VCONFIG_CONF="/etc/vconsole.conf" - # This is from 10redhat-i18n. findkeymap() { - local MAPS=$1 - local MAPNAME=${1%.map*} - local map - [[ ! -f $dracutsysrootdir$MAPS ]] \ - && MAPS=$(find $dracutsysrootdir${kbddir}/keymaps -type f -name ${MAPNAME} -o -name ${MAPNAME}.map -o -name ${MAPNAME}.map.\*) + # shellcheck disable=SC2064 + trap "$(shopt -p nullglob globstar)" RETURN + shopt -q -s nullglob globstar - for map in $MAPS; do - KEYMAPS="$KEYMAPS $map " - case $map in - *.gz) cmd="zgrep" ;; - *.bz2) cmd="bzgrep" ;; - *) cmd="grep" ;; + local -a MAPS + local MAPNAME + local INCLUDES + local MAP + local CMD + local FN + + if [[ -f $dracutsysrootdir$1 ]]; then + MAPS=("$1") + else + MAPNAME=${1%.map*} + MAPS=("$dracutsysrootdir""${kbddir}"/keymaps/**/"${MAPNAME}"{,.map{,.*}}) + fi + + for MAP in "${MAPS[@]}"; do + [[ -f $MAP ]] || continue + [[ -v KEYMAPS["$MAP"] ]] && continue + + KEYMAPS["$MAP"]=1 + + case "$MAP" in + *.gz) CMD="zgrep" ;; + *.bz2) CMD="bzgrep" ;; + *) CMD="grep" ;; esac - for INCL in $($cmd "^include " $map | while read _ a _ || [ -n "$a" ]; do echo ${a//\"/}; done); do - for FN in $(find $dracutsysrootdir${kbddir}/keymaps -type f -name $INCL\*); do + readarray -t INCLUDES < <("$CMD" '^include ' "$MAP" | while read -r _ a _ || [ -n "$a" ]; do echo "${a//\"/}"; done) + + for INCL in "${INCLUDES[@]}"; do + for FN in "$dracutsysrootdir""${kbddir}"/keymaps/**/"$INCL"*; do [[ -f $FN ]] || continue - strstr "$KEYMAPS" " $FN " || findkeymap $FN + [[ -v KEYMAPS["$FN"] ]] || findkeymap "$FN" done done done @@ -84,15 +104,16 @@ install() { # FIXME: double check # shellcheck disable=SC2068 - for item in $@; do - item=(${item/:/ }) + for item in "$@"; do + read -r -a item <<< "${item/:/ }" for map in ${item[1]//,/ }; do - map=(${map//-/ }) + read -r -a map <<< "${map//-/ }" if [[ -f "$dracutsysrootdir${item[0]}" ]]; then value=$(grep "^${map[0]}=" "$dracutsysrootdir${item[0]}") value=${value#*=} echo "${map[1]:-${map[0]}}=${value}" fi + unset map done done } @@ -101,8 +122,8 @@ install() { inst_multiple setfont loadkeys kbd_mode stty if ! dracut_module_included "systemd"; then - inst ${moddir}/console_init.sh /lib/udev/console_init - inst_rules ${moddir}/10-console.rules + inst "${moddir}"/console_init.sh /lib/udev/console_init + inst_rules "${moddir}"/10-console.rules inst_hook cmdline 20 "${moddir}/parse-i18n.sh" fi @@ -115,7 +136,7 @@ install() { } install_all_kbd() { - local rel f + local _src _line for _src in "${KBDSUBDIRS[@]}"; do inst_dir "${kbddir}/$_src" @@ -126,12 +147,12 @@ install() { rm -f -- "${initdir}${kbddir}/consoletrans/utflist" find "${initdir}${kbddir}/" -name README\* -delete find "${initdir}${kbddir}/" -name '*.gz' -print -quit \ - | while read line || [ -n "$line" ]; do + | while read -r _line || [ -n "$_line" ]; do inst_multiple gzip done find "${initdir}${kbddir}/" -name '*.bz2' -print -quit \ - | while read line || [ -n "$line" ]; do + | while read -r _line || [ -n "$_line" ]; do inst_multiple bzip2 done } @@ -139,9 +160,12 @@ install() { install_local_i18n() { local map - eval $(gather_vars ${i18n_vars}) - [ -f $dracutsysrootdir$I18N_CONF ] && . $dracutsysrootdir$I18N_CONF - [ -f $dracutsysrootdir$VCONFIG_CONF ] && . $dracutsysrootdir$VCONFIG_CONF + # shellcheck disable=SC2086 + eval "$(gather_vars ${i18n_vars})" + # shellcheck disable=SC1090 + [ -f "$dracutsysrootdir"$I18N_CONF ] && . "$dracutsysrootdir"$I18N_CONF + # shellcheck disable=SC1090 + [ -f "$dracutsysrootdir"$VCONFIG_CONF ] && . "$dracutsysrootdir"$VCONFIG_CONF shopt -q -s nocasematch if [[ ${UNICODE} ]]; then @@ -183,48 +207,48 @@ install() { return 1 } - findkeymap ${KEYMAP} + findkeymap "${KEYMAP}" for map in ${EXT_KEYMAPS}; do ddebug "Adding extra map: ${map}" - findkeymap ${map} + findkeymap "${map}" done - for keymap in ${KEYMAPS}; do - inst_opt_decompress ${keymap} + for keymap in "${!KEYMAPS[@]}"; do + inst_opt_decompress "${keymap}" done - inst_opt_decompress ${kbddir}/consolefonts/${DEFAULT_FONT}.* + inst_opt_decompress "${kbddir}"/consolefonts/"${DEFAULT_FONT}".* - if [[ ${FONT} ]] && [[ ${FONT} != ${DEFAULT_FONT} ]]; then + if [[ ${FONT} ]] && [[ ${FONT} != "${DEFAULT_FONT}" ]]; then FONT=${FONT%.psf*} - inst_opt_decompress ${kbddir}/consolefonts/${FONT}.* + inst_opt_decompress "${kbddir}"/consolefonts/"${FONT}".* fi if [[ ${FONT_MAP} ]]; then FONT_MAP=${FONT_MAP%.trans} # There are three different formats that setfont supports - inst_simple ${kbddir}/consoletrans/${FONT_MAP} \ - || inst_simple ${kbddir}/consoletrans/${FONT_MAP}.trans \ - || inst_simple ${kbddir}/consoletrans/${FONT_MAP}_to_uni.trans \ + inst_simple "${kbddir}"/consoletrans/"${FONT_MAP}" \ + || inst_simple "${kbddir}"/consoletrans/"${FONT_MAP}".trans \ + || inst_simple "${kbddir}"/consoletrans/"${FONT_MAP}"_to_uni.trans \ || dwarn "Could not find FONT_MAP ${FONT_MAP}!" fi if [[ ${FONT_UNIMAP} ]]; then FONT_UNIMAP=${FONT_UNIMAP%.uni} - inst_simple ${kbddir}/unimaps/${FONT_UNIMAP}.uni + inst_simple "${kbddir}"/unimaps/"${FONT_UNIMAP}".uni fi if dracut_module_included "systemd" && [[ -f $dracutsysrootdir${I18N_CONF} ]]; then inst_simple ${I18N_CONF} else - mksubdirs ${initdir}${I18N_CONF} - print_vars LC_ALL LANG >> ${initdir}${I18N_CONF} + mksubdirs "${initdir}"${I18N_CONF} + print_vars LC_ALL LANG >> "${initdir}"${I18N_CONF} fi if ! dracut_module_included "systemd"; then - mksubdirs ${initdir}${VCONFIG_CONF} - print_vars KEYMAP EXT_KEYMAPS UNICODE FONT FONT_MAP FONT_UNIMAP >> ${initdir}${VCONFIG_CONF} + mksubdirs "${initdir}"${VCONFIG_CONF} + print_vars KEYMAP EXT_KEYMAPS UNICODE FONT FONT_MAP FONT_UNIMAP >> "${initdir}"${VCONFIG_CONF} fi return 0