]>
Commit | Line | Data |
---|---|---|
95d2dabc | 1 | #!/bin/bash |
95d2dabc | 2 | |
8bcfd683 | 3 | # called by dracut |
95d2dabc | 4 | check() { |
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 |
13 | depends() { |
14 | return 0 | |
15 | } | |
16 | ||
8bcfd683 | 17 | # called by dracut |
95d2dabc | 18 | install() { |
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 AŻ |
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 AŻ |
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 | } |