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