]> git.ipfire.org Git - thirdparty/dracut.git/blame - modules.d/10i18n/module-setup.sh
dracut-functions: only dinfo() about missing firmware files
[thirdparty/dracut.git] / modules.d / 10i18n / module-setup.sh
CommitLineData
95d2dabc
HH
1#!/bin/bash
2# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
3# ex: ts=8 sw=4 sts=4 et filetype=sh
4
5check() {
6 return 0
7}
8
9depends() {
10 return 0
11}
12
13install() {
aad6898f 14 [ -x /lib/systemd/systemd-vconsole-setup ] && dracut_install /lib/systemd/systemd-vconsole-setup
95d2dabc
HH
15 KBDSUBDIRS=consolefonts,consoletrans,keymaps,unimaps
16 DEFAULT_FONT=LatArCyrHeb-16
17 I18N_CONF="/etc/locale.conf"
18 VCONFIG_CONF="/etc/vconsole.conf"
19
20 # This is from 10redhat-i18n.
21 findkeymap () {
22 local MAP=$1
23 [[ ! -f $MAP ]] && \
24 MAP=$(find ${kbddir}/keymaps -type f -name $MAP -o -name $MAP.\* | head -n1)
25 [[ " $KEYMAPS " = *" $MAP "* ]] && return
26 KEYMAPS="$KEYMAPS $MAP"
27 case $MAP in
28 *.gz) cmd=zgrep;;
29 *.bz2) cmd=bzgrep;;
30 *) cmd=grep ;;
31 esac
32
33 for INCL in $($cmd "^include " $MAP | cut -d' ' -f2 | tr -d '"'); do
34 for FN in $(find ${kbddir}/keymaps -type f -name $INCL\*); do
35 findkeymap $FN
36 done
37 done
38 }
39
40# Function gathers variables from distributed files among the tree, maps to
41# specified names and prints the result in format "new-name=value".
42#
43# $@ = list in format specified below (BNF notation)
44#
45# <list> ::= <element> | <element> " " <list>
46# <element> ::= <conf-file-name> ":" <map-list>
47# <map-list> ::= <mapping> | <mapping> "," <map-list>
48# <mapping> ::= <src-var> "-" <dst-var> | <src-var>
49#
50# We assume no whitespace are allowed between symbols.
51# <conf-file-name> is a file holding <src-var> in your system.
52# <src-var> is a variable holding value of meaning the same as <dst-var>.
53# <dst-var> is a variable which will be set up inside initramfs.
54# If <dst-var> has the same name as <src-var> we can omit <dst-var>.
55#
56# Example:
57# /etc/conf.d/keymaps:KEYMAP,extended_keymaps-EXT_KEYMAPS
58# <list> = /etc/conf.d/keymaps:KEYMAP,extended_keymaps-EXT_KEYMAPS
59# <element> = /etc/conf.d/keymaps:KEYMAP,extended_keymaps-EXT_KEYMAPS
60# <conf-file-name> = /etc/conf.d/keymaps
61# <map-list> = KEYMAP,extended_keymaps-EXT_KEYMAPS
62# <mapping> = KEYMAP
63# <src-var> = KEYMAP
64# <mapping> = extended_keymaps-EXT_KEYMAPS
65# <src-var> = extended_keymaps
66# <dst-var> = EXT_KEYMAPS
67 gather_vars() {
68 local item map value
69
70 for item in $@
71 do
ebaed7d5 72 item=(${item/:/ })
95d2dabc
HH
73 for map in ${item[1]//,/ }
74 do
ebaed7d5 75 map=(${map//-/ })
95d2dabc
HH
76 value=$(grep "^${map[0]}=" "${item[0]}")
77 value=${value#*=}
78 echo "${map[1]:-${map[0]}}=${value}"
79 done
80 done
81 }
82
83 install_base() {
84 dracut_install setfont loadkeys kbd_mode stty
85
86 inst ${moddir}/console_init /lib/udev/console_init
87 inst_rules ${moddir}/10-console.rules
88 inst_hook cmdline 20 "${moddir}/parse-i18n.sh"
89 }
90
91 install_all_kbd() {
92 local rel f
93
94 for f in $(eval find ${kbddir}/{${KBDSUBDIRS}} -type f -print)
95 do
96 inst $f
97 done
98
99 # remove unnecessary files
100 rm -f "${initdir}${kbddir}/consoletrans/utflist"
101 find "${initdir}${kbddir}/" -name README\* -delete
102
103 dracut_install gzip bzip2
104 }
105
106 install_local_i18n() {
107 local map
108
109 eval $(gather_vars ${i18n_vars})
110 [ -f $I18N_CONF ] && . $I18N_CONF
111 [ -f $VCONFIG_CONF ] && . $VCONFIG_CONF
112
113 # Gentoo user may have KEYMAP set to something like "-u pl2",
114 KEYMAP=${KEYMAP#-* }
115 # I'm not sure of the purpose of UNIKEYMAP and GRP_TOGGLE. They were in
116 # original redhat-i18n module. Anyway it won't hurt.
117 EXT_KEYMAPS+=\ ${UNIKEYMAP}\ ${GRP_TOGGLE}
118
d1ef3951
119 [[ ${KEYMAP} ]] || {
120 derror 'No KEYMAP.'
121 return 1
122 }
95d2dabc
HH
123 findkeymap ${KEYMAP}
124
125 for map in ${EXT_KEYMAPS}
126 do
d1ef3951 127 ddebug "Adding extra map: ${map}"
95d2dabc
HH
128 findkeymap ${map}
129 done
130
131 inst_opt_decompress ${KEYMAPS}
132
133 inst_opt_decompress ${kbddir}/consolefonts/${DEFAULT_FONT}.*
134
135 if [[ ${FONT} ]]
136 then
137 FONT=${FONT%.psf*}
138 inst_opt_decompress ${kbddir}/consolefonts/${FONT}.*
139 fi
140
141 if [[ ${FONT_MAP} ]]
142 then
143 FONT_MAP=${FONT_MAP%.trans}
144 inst ${kbddir}/consoletrans/${FONT_MAP}.trans
145 fi
146
147 if [[ ${FONT_UNIMAP} ]]
148 then
149 FONT_UNIMAP=${FONT_UNIMAP%.uni}
150 inst ${kbddir}/unimaps/${FONT_UNIMAP}.uni
151 fi
152
153 if [[ ${UNICODE} ]]
154 then
155 if [[ ${UNICODE^^} = YES || ${UNICODE} = 1 ]]
156 then
157 UNICODE=1
158 elif [[ ${UNICODE^^} = NO || ${UNICODE} = 0 ]]
159 then
160 UNICODE=0
161 else
162 UNICODE=''
163 fi
164 fi
165 if [[ ! ${UNICODE} && ${LANG^^} =~ .*\.UTF-?8 ]]
166 then
167 UNICODE=1
168 fi
169
170 mksubdirs ${initdir}${I18N_CONF}
171 mksubdirs ${initdir}${VCONFIG_CONF}
172 print_vars LC_ALL LANG >> ${initdir}${I18N_CONF}
173 print_vars KEYMAP EXT_KEYMAPS UNICODE FONT FONT_MAP FONT_UNIMAP >> ${initdir}${VCONFIG_CONF}
174 return 0
175 }
176
177 checks() {
178 for kbddir in ${kbddir} /usr/lib/kbd /lib/kbd /usr/share /usr/share/kbd
179 do
180 [[ -d "${kbddir}" ]] && \
181 for dir in ${KBDSUBDIRS//,/ }
182 do
183 [[ -d "${kbddir}/${dir}" ]] && continue
184 false
185 done && break
186 kbddir=''
187 done
188
189 [[ ${kbddir} ]] || {
d1ef3951
190 derror "Directories ${KBDSUBDIRS//,/, } not found. Please" \
191 "inform us about the issue including your OS name and version."
95d2dabc
HH
192 return 1
193 }
194
195 [[ -f $I18N_CONF && -f $VCONFIG_CONF ]] || \
196 [[ ! ${hostonly} || ${i18n_vars} ]] || {
d1ef3951
197 derror 'i18n_vars not set! Please set up i18n_vars in ' \
198 'configuration file.'
95d2dabc
HH
199 }
200 return 0
201 }
202
203 if checks
204 then
205 install_base
206
207 if [[ ${hostonly} ]]
208 then
209 install_local_i18n || install_all_kbd
210 else
211 install_all_kbd
212 fi
213 fi
214}
215