add PARTLABEL and PARTUUID
[platform/upstream/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     dracut_install -o $systemdutildir/systemd-vconsole-setup
16     KBDSUBDIRS=consolefonts,consoletrans,keymaps,unimaps
17     DEFAULT_FONT="${i18n_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 | while read a a b; do echo ${a//\"/}; done); 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                 if [[ -f "${item[0]}" ]]; then
78                     value=$(grep "^${map[0]}=" "${item[0]}")
79                     value=${value#*=}
80                     echo "${map[1]:-${map[0]}}=${value}"
81                 fi
82             done
83         done
84     }
85
86     install_base() {
87         dracut_install setfont loadkeys kbd_mode stty
88
89         if ! dracut_module_included "systemd"; then
90             inst ${moddir}/console_init.sh /lib/udev/console_init
91             inst_rules ${moddir}/10-console.rules
92             inst_hook cmdline 20 "${moddir}/parse-i18n.sh"
93         fi
94     }
95
96     install_all_kbd() {
97         local rel f
98
99         for _src in $(eval echo ${kbddir}/{${KBDSUBDIRS}}); do
100             inst_dir "$_src"
101             cp --reflink=auto --sparse=auto -prfL -t "${initdir}/${_src}" "$_src"/*
102         done
103
104         # remove unnecessary files
105         rm -f -- "${initdir}${kbddir}/consoletrans/utflist"
106         find "${initdir}${kbddir}/" -name README\* -delete
107         find "${initdir}${kbddir}/" -name '*.gz' -print -quit \
108             | while read line; do
109             dracut_install gzip
110             done
111
112         find "${initdir}${kbddir}/" -name '*.bz2' -print -quit \
113             | while read line; do
114             dracut_install bzip2
115             done
116     }
117
118     install_local_i18n() {
119         local map
120
121         eval $(gather_vars ${i18n_vars})
122         [ -f $I18N_CONF ] && . $I18N_CONF
123         [ -f $VCONFIG_CONF ] && . $VCONFIG_CONF
124
125         shopt -q -s nocasematch
126         if [[ ${UNICODE} ]]
127         then
128             if [[ ${UNICODE} = YES || ${UNICODE} = 1 ]]
129             then
130                 UNICODE=1
131             elif [[ ${UNICODE} = NO || ${UNICODE} = 0 ]]
132             then
133                 UNICODE=0
134             else
135                 UNICODE=''
136             fi
137         fi
138         if [[ ! ${UNICODE} && ${LANG} =~ .*\.UTF-?8 ]]
139         then
140             UNICODE=1
141         fi
142         shopt -q -u nocasematch
143
144         # Gentoo user may have KEYMAP set to something like "-u pl2",
145         KEYMAP=${KEYMAP#-* }
146
147         # KEYTABLE is a bit special - it defines base keymap name and UNICODE
148         # determines whether non-UNICODE or UNICODE version is used
149
150         if [[ ${KEYTABLE} ]]; then
151            if [[ ${UNICODE} == 1 ]]; then
152                [[ ${KEYTABLE} =~ .*\.uni.* ]] || KEYTABLE=${KEYTABLE%.map*}.uni
153            fi
154            KEYMAP=${KEYTABLE}
155         fi
156
157         # I'm not sure of the purpose of UNIKEYMAP and GRP_TOGGLE.  They were in
158         # original redhat-i18n module.  Anyway it won't hurt.
159         EXT_KEYMAPS+=\ ${UNIKEYMAP}\ ${GRP_TOGGLE}
160
161         [[ ${KEYMAP} ]] || {
162             dinfo 'No KEYMAP configured.'
163             return 1
164         }
165
166         findkeymap ${KEYMAP}
167
168         for map in ${EXT_KEYMAPS}
169         do
170             ddebug "Adding extra map: ${map}"
171             findkeymap ${map}
172         done
173
174         inst_opt_decompress ${KEYMAPS}
175
176         inst_opt_decompress ${kbddir}/consolefonts/${DEFAULT_FONT}.*
177
178         if [[ ${FONT} ]] && [[ ${FONT} != ${DEFAULT_FONT} ]]
179         then
180             FONT=${FONT%.psf*}
181             inst_opt_decompress ${kbddir}/consolefonts/${FONT}.*
182         fi
183
184         if [[ ${FONT_MAP} ]]
185         then
186             FONT_MAP=${FONT_MAP%.trans}
187             inst_simple ${kbddir}/consoletrans/${FONT_MAP}.trans
188         fi
189
190         if [[ ${FONT_UNIMAP} ]]
191         then
192             FONT_UNIMAP=${FONT_UNIMAP%.uni}
193             inst_simple ${kbddir}/unimaps/${FONT_UNIMAP}.uni
194         fi
195
196         mksubdirs ${initdir}${I18N_CONF}
197         mksubdirs ${initdir}${VCONFIG_CONF}
198         print_vars LC_ALL LANG >> ${initdir}${I18N_CONF}
199         print_vars KEYMAP EXT_KEYMAPS UNICODE FONT FONT_MAP FONT_UNIMAP >> ${initdir}${VCONFIG_CONF}
200         return 0
201     }
202
203     checks() {
204         for kbddir in ${kbddir} /usr/lib/kbd /lib/kbd /usr/share /usr/share/kbd
205         do
206             [[ -d "${kbddir}" ]] && \
207                 for dir in ${KBDSUBDIRS//,/ }
208             do
209                 [[ -d "${kbddir}/${dir}" ]] && continue
210                 false
211             done && break
212             kbddir=''
213         done
214
215         [[ ${kbddir} ]] || {
216             derror "Directories ${KBDSUBDIRS//,/, } not found.  Please" \
217                 "inform us about the issue including your OS name and version."
218             return 1
219         }
220
221         [[ -f $I18N_CONF && -f $VCONFIG_CONF ]] || \
222             [[ ! ${hostonly} || ${i18n_vars} ]] || {
223             derror 'i18n_vars not set!  Please set up i18n_vars in ' \
224                 'configuration file.'
225         }
226         return 0
227     }
228
229     if checks
230     then
231         install_base
232
233         if [[ ${hostonly} ]]
234         then
235             install_local_i18n || install_all_kbd
236         else
237             install_all_kbd
238         fi
239     fi
240 }
241