]>
Commit | Line | Data |
---|---|---|
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 | ||
5 | check() { | |
6 | return 0 | |
7 | } | |
8 | ||
9 | depends() { | |
10 | return 0 | |
11 | } | |
12 | ||
13 | install() { | |
c99014d5 | 14 | [ -x /lib/systemd/systemd-vconsole ] && dracut_install /lib/systemd/systemd-vconsole |
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 AŻ |
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 AŻ |
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 AŻ |
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 |