]> git.ipfire.org Git - thirdparty/dracut.git/blob - modules.d/10i18n/module-setup.sh
fc0c5b3ab441ea92024f68fe1665f03df07e756e
[thirdparty/dracut.git] / modules.d / 10i18n / module-setup.sh
1 #!/bin/bash
2
3 # called by dracut
4 check() {
5 [[ "$mount_needs" ]] && return 1
6
7 require_binaries setfont loadkeys kbd_mode || return 1
8
9 return 0
10 }
11
12 # called by dracut
13 depends() {
14 return 0
15 }
16
17 # called by dracut
18 install() {
19 if dracut_module_included "systemd"; then
20 unset FONT
21 unset KEYMAP
22 [[ -f /etc/vconsole.conf ]] && . /etc/vconsole.conf
23 fi
24
25 KBDSUBDIRS=consolefonts,consoletrans,keymaps,unimaps
26 DEFAULT_FONT="${i18n_default_font:-eurlatgr}"
27 I18N_CONF="/etc/locale.conf"
28 VCONFIG_CONF="/etc/vconsole.conf"
29
30 # This is from 10redhat-i18n.
31 findkeymap () {
32 local MAPS=$1
33 local MAPNAME=${1%.map*}
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
39 KEYMAPS="$KEYMAPS $map "
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
48 strstr "$KEYMAPS" " $FN " || findkeymap $FN
49 done
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
86 item=(${item/:/ })
87 for map in ${item[1]//,/ }
88 do
89 map=(${map//-/ })
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
95 done
96 done
97 }
98
99 install_base() {
100 inst_multiple setfont loadkeys kbd_mode stty
101
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
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
114 }
115
116 install_all_kbd() {
117 local rel f
118
119 for _src in $(eval echo ${kbddir}/{${KBDSUBDIRS}}); do
120 inst_dir "$_src"
121 $DRACUT_CP -L -t "${initdir}/${_src}" "$_src"/*
122 done
123
124 # remove unnecessary files
125 rm -f -- "${initdir}${kbddir}/consoletrans/utflist"
126 find "${initdir}${kbddir}/" -name README\* -delete
127 find "${initdir}${kbddir}/" -name '*.gz' -print -quit \
128 | while read line || [ -n "$line" ]; do
129 inst_multiple gzip
130 done
131
132 find "${initdir}${kbddir}/" -name '*.bz2' -print -quit \
133 | while read line || [ -n "$line" ]; do
134 inst_multiple bzip2
135 done
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
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
164 # Gentoo user may have KEYMAP set to something like "-u pl2",
165 KEYMAP=${KEYMAP#-* }
166
167 # openSUSE user may have KEYMAP set to something like ".gz"
168 KEYMAP=${KEYMAP/.gz/}
169
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
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
184 [[ ${KEYMAP} ]] || {
185 dinfo 'No KEYMAP configured.'
186 return 1
187 }
188
189 findkeymap ${KEYMAP}
190
191 for map in ${EXT_KEYMAPS}
192 do
193 ddebug "Adding extra map: ${map}"
194 findkeymap ${map}
195 done
196
197 for keymap in ${KEYMAPS}; do
198 inst_opt_decompress ${keymap}
199 done
200
201 inst_opt_decompress ${kbddir}/consolefonts/${DEFAULT_FONT}.*
202
203 if [[ ${FONT} ]] && [[ ${FONT} != ${DEFAULT_FONT} ]]
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}
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}!"
217 fi
218
219 if [[ ${FONT_UNIMAP} ]]
220 then
221 FONT_UNIMAP=${FONT_UNIMAP%.uni}
222 inst_simple ${kbddir}/unimaps/${FONT_UNIMAP}.uni
223 fi
224
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
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}" ]] && \
246 for dir in ${KBDSUBDIRS//,/ }
247 do
248 [[ -d "${kbddir}/${dir}" ]] && continue
249 false
250 done && break
251 kbddir=''
252 done
253
254 [[ -f $I18N_CONF && -f $VCONFIG_CONF ]] || \
255 [[ ! ${hostonly} || ${i18n_vars} ]] || {
256 derror 'i18n_vars not set! Please set up i18n_vars in ' \
257 'configuration file.'
258 }
259 return 0
260 }
261
262 if checks; then
263 install_base
264
265 if [[ ${hostonly} ]] && ! [[ ${i18n_install_all} == "yes" ]]; then
266 install_local_i18n || install_all_kbd
267 else
268 install_all_kbd
269 fi
270 fi
271 }