]> git.ipfire.org Git - thirdparty/dracut.git/blame - modules.d/10i18n/module-setup.sh
Use eurlatgr as default console font
[thirdparty/dracut.git] / modules.d / 10i18n / module-setup.sh
CommitLineData
95d2dabc 1#!/bin/bash
95d2dabc 2
8bcfd683 3# called by dracut
95d2dabc 4check() {
1b7fd0fa 5 [[ "$mount_needs" ]] && return 1
87bd8907 6
30e6e809 7 require_binaries setfont loadkeys kbd_mode || return 1
87bd8907 8
95d2dabc
HH
9 return 0
10}
11
8bcfd683 12# called by dracut
95d2dabc
HH
13depends() {
14 return 0
15}
16
8bcfd683 17# called by dracut
95d2dabc 18install() {
f734347a 19 if dracut_module_included "systemd"; then
f734347a
HH
20 unset FONT
21 unset KEYMAP
45845cb6 22 [[ -f /etc/vconsole.conf ]] && . /etc/vconsole.conf
f734347a
HH
23 fi
24
95d2dabc 25 KBDSUBDIRS=consolefonts,consoletrans,keymaps,unimaps
42d93d34 26 DEFAULT_FONT="${i18n_default_font:-eurlatgr}"
95d2dabc
HH
27 I18N_CONF="/etc/locale.conf"
28 VCONFIG_CONF="/etc/vconsole.conf"
29
30 # This is from 10redhat-i18n.
31 findkeymap () {
28aea418 32 local MAPS=$1
18729719 33 local MAPNAME=${1%.map*}
28aea418
DM
34 local map
35 [[ ! -f $MAPS ]] && \
36 MAPS=$(find ${kbddir}/keymaps -type f -name ${MAPNAME} -o -name ${MAPNAME}.map -o -name ${MAPNAME}.map.\*)
37
38 for map in $MAPS; do
44f2fe51 39 KEYMAPS="$KEYMAPS $map "
28aea418
DM
40 case $map in
41 *.gz) cmd=zgrep;;
42 *.bz2) cmd=bzgrep;;
43 *) cmd=grep ;;
44 esac
45
46 for INCL in $($cmd "^include " $map | while read a a b || [ -n "$a" ]; do echo ${a//\"/}; done); do
47 for FN in $(find ${kbddir}/keymaps -type f -name $INCL\*); do
44f2fe51 48 strstr "$KEYMAPS" " $FN " || findkeymap $FN
28aea418 49 done
95d2dabc
HH
50 done
51 done
52 }
53
54# Function gathers variables from distributed files among the tree, maps to
55# specified names and prints the result in format "new-name=value".
56#
57# $@ = list in format specified below (BNF notation)
58#
59# <list> ::= <element> | <element> " " <list>
60# <element> ::= <conf-file-name> ":" <map-list>
61# <map-list> ::= <mapping> | <mapping> "," <map-list>
62# <mapping> ::= <src-var> "-" <dst-var> | <src-var>
63#
64# We assume no whitespace are allowed between symbols.
65# <conf-file-name> is a file holding <src-var> in your system.
66# <src-var> is a variable holding value of meaning the same as <dst-var>.
67# <dst-var> is a variable which will be set up inside initramfs.
68# If <dst-var> has the same name as <src-var> we can omit <dst-var>.
69#
70# Example:
71# /etc/conf.d/keymaps:KEYMAP,extended_keymaps-EXT_KEYMAPS
72# <list> = /etc/conf.d/keymaps:KEYMAP,extended_keymaps-EXT_KEYMAPS
73# <element> = /etc/conf.d/keymaps:KEYMAP,extended_keymaps-EXT_KEYMAPS
74# <conf-file-name> = /etc/conf.d/keymaps
75# <map-list> = KEYMAP,extended_keymaps-EXT_KEYMAPS
76# <mapping> = KEYMAP
77# <src-var> = KEYMAP
78# <mapping> = extended_keymaps-EXT_KEYMAPS
79# <src-var> = extended_keymaps
80# <dst-var> = EXT_KEYMAPS
81 gather_vars() {
82 local item map value
83
84 for item in $@
85 do
ebaed7d5 86 item=(${item/:/ })
95d2dabc
HH
87 for map in ${item[1]//,/ }
88 do
ebaed7d5 89 map=(${map//-/ })
394ffc1d
HH
90 if [[ -f "${item[0]}" ]]; then
91 value=$(grep "^${map[0]}=" "${item[0]}")
92 value=${value#*=}
93 echo "${map[1]:-${map[0]}}=${value}"
94 fi
95d2dabc
HH
95 done
96 done
97 }
98
99 install_base() {
af119460 100 inst_multiple setfont loadkeys kbd_mode stty
95d2dabc 101
b5859d63
HH
102 if ! dracut_module_included "systemd"; then
103 inst ${moddir}/console_init.sh /lib/udev/console_init
104 inst_rules ${moddir}/10-console.rules
105 inst_hook cmdline 20 "${moddir}/parse-i18n.sh"
106 fi
5f91ed0b
GT
107
108 if [[ ${kbddir} != "/usr/share" ]]; then
109 inst_dir /usr/share
110 for _src in $(eval echo {${KBDSUBDIRS}}); do
111 [ ! -e "${initdir}/usr/share/${_src}" ] && ln -s "${kbddir}/${_src}" "${initdir}/usr/share/${_src}"
112 done
113 fi
95d2dabc
HH
114 }
115
116 install_all_kbd() {
117 local rel f
118
8c6151bd
HH
119 for _src in $(eval echo ${kbddir}/{${KBDSUBDIRS}}); do
120 inst_dir "$_src"
7e51a94f 121 $DRACUT_CP -L -t "${initdir}/${_src}" "$_src"/*
95d2dabc
HH
122 done
123
124 # remove unnecessary files
32bd2fbb 125 rm -f -- "${initdir}${kbddir}/consoletrans/utflist"
95d2dabc 126 find "${initdir}${kbddir}/" -name README\* -delete
b7ddf6c1 127 find "${initdir}${kbddir}/" -name '*.gz' -print -quit \
6d58fa27 128 | while read line || [ -n "$line" ]; do
af119460 129 inst_multiple gzip
b7ddf6c1 130 done
95d2dabc 131
b7ddf6c1 132 find "${initdir}${kbddir}/" -name '*.bz2' -print -quit \
6d58fa27 133 | while read line || [ -n "$line" ]; do
af119460 134 inst_multiple bzip2
b7ddf6c1 135 done
95d2dabc
HH
136 }
137
138 install_local_i18n() {
139 local map
140
141 eval $(gather_vars ${i18n_vars})
142 [ -f $I18N_CONF ] && . $I18N_CONF
143 [ -f $VCONFIG_CONF ] && . $VCONFIG_CONF
144
95023eb3
CG
145 shopt -q -s nocasematch
146 if [[ ${UNICODE} ]]
147 then
148 if [[ ${UNICODE} = YES || ${UNICODE} = 1 ]]
149 then
150 UNICODE=1
151 elif [[ ${UNICODE} = NO || ${UNICODE} = 0 ]]
152 then
153 UNICODE=0
154 else
155 UNICODE=''
156 fi
157 fi
158 if [[ ! ${UNICODE} && ${LANG} =~ .*\.UTF-?8 ]]
159 then
160 UNICODE=1
161 fi
162 shopt -q -u nocasematch
163
95d2dabc
HH
164 # Gentoo user may have KEYMAP set to something like "-u pl2",
165 KEYMAP=${KEYMAP#-* }
95023eb3 166
1d3496b4
HR
167 # openSUSE user may have KEYMAP set to something like ".gz"
168 KEYMAP=${KEYMAP/.gz/}
169
95023eb3
CG
170 # KEYTABLE is a bit special - it defines base keymap name and UNICODE
171 # determines whether non-UNICODE or UNICODE version is used
172
173 if [[ ${KEYTABLE} ]]; then
174 if [[ ${UNICODE} == 1 ]]; then
175 [[ ${KEYTABLE} =~ .*\.uni.* ]] || KEYTABLE=${KEYTABLE%.map*}.uni
176 fi
177 KEYMAP=${KEYTABLE}
178 fi
179
95d2dabc
HH
180 # I'm not sure of the purpose of UNIKEYMAP and GRP_TOGGLE. They were in
181 # original redhat-i18n module. Anyway it won't hurt.
182 EXT_KEYMAPS+=\ ${UNIKEYMAP}\ ${GRP_TOGGLE}
183
d1ef3951 184 [[ ${KEYMAP} ]] || {
394ffc1d 185 dinfo 'No KEYMAP configured.'
d1ef3951
186 return 1
187 }
394ffc1d 188
95d2dabc
HH
189 findkeymap ${KEYMAP}
190
191 for map in ${EXT_KEYMAPS}
192 do
d1ef3951 193 ddebug "Adding extra map: ${map}"
95d2dabc
HH
194 findkeymap ${map}
195 done
196
28aea418
DM
197 for keymap in ${KEYMAPS}; do
198 inst_opt_decompress ${keymap}
199 done
95d2dabc
HH
200
201 inst_opt_decompress ${kbddir}/consolefonts/${DEFAULT_FONT}.*
202
e5c9bc11 203 if [[ ${FONT} ]] && [[ ${FONT} != ${DEFAULT_FONT} ]]
95d2dabc
HH
204 then
205 FONT=${FONT%.psf*}
206 inst_opt_decompress ${kbddir}/consolefonts/${FONT}.*
207 fi
208
209 if [[ ${FONT_MAP} ]]
210 then
211 FONT_MAP=${FONT_MAP%.trans}
251afd36
FV
212 # There are three different formats that setfont supports
213 inst_simple ${kbddir}/consoletrans/${FONT_MAP} \
214 || inst_simple ${kbddir}/consoletrans/${FONT_MAP}.trans \
215 || inst_simple ${kbddir}/consoletrans/${FONT_MAP}_to_uni.trans \
216 || dwarn "Could not find FONT_MAP ${FONT_MAP}!"
95d2dabc
HH
217 fi
218
219 if [[ ${FONT_UNIMAP} ]]
220 then
221 FONT_UNIMAP=${FONT_UNIMAP%.uni}
e59f58f8 222 inst_simple ${kbddir}/unimaps/${FONT_UNIMAP}.uni
95d2dabc
HH
223 fi
224
45845cb6
HH
225 if dracut_module_included "systemd" && [[ -f ${I18N_CONF} ]]; then
226 inst_simple ${I18N_CONF}
227 else
228 mksubdirs ${initdir}${I18N_CONF}
229 print_vars LC_ALL LANG >> ${initdir}${I18N_CONF}
230 fi
231
232 if dracut_module_included "systemd" && [[ -f ${VCONFIG_CONF} ]]; then
233 inst_simple ${VCONFIG_CONF}
234 else
235 mksubdirs ${initdir}${VCONFIG_CONF}
236 print_vars KEYMAP EXT_KEYMAPS UNICODE FONT FONT_MAP FONT_UNIMAP >> ${initdir}${VCONFIG_CONF}
237 fi
238
95d2dabc
HH
239 return 0
240 }
241
242 checks() {
243 for kbddir in ${kbddir} /usr/lib/kbd /lib/kbd /usr/share /usr/share/kbd
244 do
245 [[ -d "${kbddir}" ]] && \
3b403b32 246 for dir in ${KBDSUBDIRS//,/ }
95d2dabc
HH
247 do
248 [[ -d "${kbddir}/${dir}" ]] && continue
249 false
250 done && break
3b403b32 251 kbddir=''
95d2dabc
HH
252 done
253
95d2dabc
HH
254 [[ -f $I18N_CONF && -f $VCONFIG_CONF ]] || \
255 [[ ! ${hostonly} || ${i18n_vars} ]] || {
d1ef3951
256 derror 'i18n_vars not set! Please set up i18n_vars in ' \
257 'configuration file.'
95d2dabc
HH
258 }
259 return 0
260 }
261
45845cb6 262 if checks; then
95d2dabc
HH
263 install_base
264
ae488efa 265 if [[ ${hostonly} ]] && ! [[ ${i18n_install_all} == "yes" ]]; then
95d2dabc
HH
266 install_local_i18n || install_all_kbd
267 else
268 install_all_kbd
269 fi
270 fi
271}