grml_chroot: fix broken mount argument handling
[grml-scripts.git] / usr_sbin / grml-setlang
1 #!/bin/sh
2 # Filename:      grml-setlang
3 # Purpose:       set language system-wide on grml system
4 # Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
5 # Bug-Reports:   see http://grml.org/bugs/
6 # License:       This file is licensed under the GPL v2.
7 ################################################################################
8
9 PN="$(basename "$0")"
10 DIALOG=dialog
11 LANGFUNC=/etc/grml/language-functions
12
13 # notice: Debian's locales.postinst has been modified to write
14 # locale variables into /etc/default/locale instead of
15 # /etc/environment; the latter file is a PAM configuration file,
16 # so modifying it was a policy violation.
17 CONFFILE=/etc/default/locale
18
19 # shellcheck disable=SC1091
20 {
21 . /etc/grml/script-functions
22 . /etc/grml/lsb-functions
23 }
24
25 check4root || exit 100
26
27 eindent # as we are running inside grml boot sequence as well make sure we integrate fine
28
29 # allow writing $CONFFILE non-interactive via "grml-setlang $LANGUAGE"
30 if [ -n "$1" ] ; then
31    NONINTERACTIVE=1
32 else
33    NONINTERACTIVE=''
34 fi
35
36 if ! [ -r "$LANGFUNC" ] ; then
37    echo "$LANGFUNC could not be read. Make sure you have package grml-autoconfig installed." >&2
38    exit 1
39 fi
40
41 setvalue(){
42   [ -n "$2" ] || return 1
43   # already present in conffile?
44   if grep -q "^${1}" "$CONFFILE" ; then
45      sed -i "s#^${1}.*#${1}${2}#"  $CONFFILE
46   # is the new Debian style /etc/default/locale present?
47   elif grep -q "^# ${1}$" "$CONFFILE" ; then
48      # shellcheck disable=SC1117
49      sed -i "s#^\# ${1}#${1}${2}#" $CONFFILE
50   else
51      echo "$1${2}" >> $CONFFILE
52   fi
53 }
54
55 # grml-small does not provide any further locales
56 if grep -q small /etc/grml_version 2>/dev/null ; then
57    if [ -z "$NONINTERACTIVE" ] ; then
58       LANG=C $DIALOG --stdout --msgbox "Notice: grml-small does not provide a full language setup.
59
60 You have to make sure the appropriate packages are installed." 0 0
61       exit 1
62    else
63       esyslog user.notice "$PN" 'grml-small does not provide a full language setup.'
64    fi
65 fi
66
67 # shellcheck disable=SC1091
68 {
69 [ -r /etc/environment ]    && . /etc/environment
70 [ -r /etc/default/locale ] && . /etc/default/locale
71 }
72 [ -n "$LANGUAGE" ] && DEFAULT_LANGUAGE="$LANGUAGE"
73
74 if [ -z "$DEFAULT_LANGUAGE" ] ; then
75    DEFAULT_LANGUAGE=en
76 fi
77
78 if [ -z "$NONINTERACTIVE" ] ; then
79 # shellcheck disable=SC1010
80 {
81    LANGUAGE=$(LANG=C $DIALOG --stdout --title "$PN" --default-item $DEFAULT_LANGUAGE --radiolist \
82 "Which language do you want to use?
83
84 This will affect \$LANG, \$LANGUAGE and \$LC_MESSAGES.
85
86 Notice: if you want to adjust /etc/locale.gen (defines
87 which locales should be generated by locale-gen)
88 please run 'dpkg-reconfigure locales' manually.
89
90 Configuration will be written to $CONFFILE" 0 0 0 \
91  at 'austria (unicode version)' off \
92  at-iso 'austrian (iso version)' off \
93  au 'austrial (unicode version)' off \
94  au-iso 'australian (iso version)' off \
95  be 'belgian (unicode version)' off \
96  be-iso 'belgian (iso version)' off \
97  bg 'bulgarian (unicode version)' off \
98  bg-iso 'bulgarian (iso version)' off \
99  br 'brazilian (unicode version)' off \
100  br-iso 'brazilian (iso version)' off \
101  ch 'swiss (unicode version)' off \
102  ch-iso 'swiss (iso version)' off \
103  cf 'french canadian' off \
104  cn 'chinese (unicode version)' off \
105  cn-iso 'chinese (iso version)' off \
106  cs 'czech (unicode version)' off \
107  cs-iso 'czech (iso version)' off \
108  cz 'czech (unicode version)' off \
109  cz-iso 'czech (iso version)' off \
110  de 'german (unicode version)' off \
111  de-iso 'german (iso version)' off \
112  dk 'dansk (unicode version)' off \
113  dk-iso 'dansk (iso version)' off \
114  da 'dansk (unicode version)' off \
115  da-iso 'dansk (iso version)' off \
116  el 'greek (unicode version)' off \
117  el-iso 'greek (iso version)' off \
118  en 'english [us] (unicode version, grml default)' on \
119  en-iso 'english [us] (iso version)' off \
120  es 'spanish (unicode version)' off \
121  es-iso 'spanish (iso version)' off \
122  fi 'finnish (unicode version)' off \
123  fi-iso 'finnish (iso version)' off \
124  fr 'frensh (unicode version)' off \
125  fr-iso 'frensh (iso version)' off \
126  ga 'irish gaeilge (unicode version)' off \
127  ga-iso 'irish gaeilge (iso version)' off \
128  he 'hebrew (unicode version)' off \
129  he-iso 'hebrew (iso version)' off \
130  il 'hebrew (unicode version)' off \
131  il-iso 'hebrew (iso version)' off \
132  ie 'irish (unicode version)' off \
133  ie-iso 'irish (iso version)' off \
134  it 'italian (unicode version)' off \
135  it-iso 'italian (iso version)' off \
136  ja 'japanese (unicode version)' off \
137  ja-iso 'japanese (iso version)' off \
138  nl 'dutch (unicode version)' off \
139  nl-iso 'dutch (iso version)' off \
140  pl 'polish (unicode version)' off \
141  pl-iso 'polisch (iso version)' off \
142  pt 'portuguese (unicode version)' off \
143  pt-iso 'portuguese (iso version)' off \
144  ru 'russian (unicode version)' off \
145  ru-iso 'russian (iso version)' off \
146  sk 'slovak (unicode version)' off \
147  sk-iso 'slovak (iso version)' off \
148  sl 'slovenian (unicode version)' off \
149  sl-iso 'slovenian (iso version)' off \
150  tr 'turkish (unicode version)' off \
151  tr-iso 'turkish (iso version)' off \
152  tw 'chinese (traditional) (unicode version)' off \
153  tw-iso 'chinese (traditional) (iso version)' off \
154  uk 'british (unicode version)' off \
155  uk-iso 'british (iso version)' off \
156  us 'american (unicode version)' off \
157  us-iso 'american (iso version)' off \
158 )
159 }
160
161   retval=$?
162   case $retval in
163       (0)   # everything ok
164             ;;
165       (1)   echo "Cancel pressed." ; exit 1 ;;
166       (255) echo "ESC pressed."    ; exit 1 ;;
167   esac
168
169 else # non-interactive
170   LANGUAGE="$1"
171 fi
172
173 if ! grep -qe "${LANGUAGE})" -qe "${LANGUAGE}|" $LANGFUNC ; then
174    ewarn "Language ${LANGUAGE} not supported, using default." ; eend 0
175 fi
176
177 # fallback to C if using an ISO system (which is latin1 for LC_CTYPE);
178 # this should prevent users from broken ctype settings if the set
179 # locale isn't available on a remote system
180 if echo "$LANGUAGE" | grep -q -- '-iso' ; then
181    LC_CTYPE=C
182 fi
183
184 # read in the file where all the $LANGUAGE stuff is defined
185 # shellcheck disable=SC1090
186 . $LANGFUNC
187
188 # make sure the file exists
189 if ! [ -r $CONFFILE ] ; then
190 cat > $CONFFILE <<EOF
191 # File generated by $PN on $(date)
192 LANG=$LANG
193 # LC_CTYPE=$LC_CTYPE
194 # LANGUAGE=$LANGUAGE
195 # TZ=$TZ
196 # other environment variables you might want to set:
197 # LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY
198 # LC_MESSAGES LC_PAPER LC_NAME LC_ADDRESS
199 # LC_TELEPHONE LC_MEASUREMENT LC_IDENTIFICATION
200 #
201 # Note: set LC_ALL to overwrite all LC_* variables
202 #       LC_ALL > LC_* > LANG
203 #       LANGUAGE is glibc only and binds stronger than LC_ALL
204 EOF
205 fi
206
207 setvalue 'LANG='     "$LANG"
208
209 retval=$?
210 case $retval in
211     (0)
212           if [ -z "$NONINTERACTIVE" ] ; then
213              LANG=C $DIALOG --stdout --msgbox "Writing language settings ($LANGUAGE) to $CONFFILE was successful." 0 0
214           else
215              einfo "Writing language settings ($LANGUAGE) to $CONFFILE was successful."
216              esyslog user.notice "$PN" "Writing language settings ($LANGUAGE) to $CONFFILE was successful." ; eend 0
217           fi
218           ;;
219     *)
220           if [ -z "$NONINTERACTIVE" ] ; then
221              LANG=C $DIALOG --stdout --msgbox "Error writing settings for $LANGUAGE to $CONFFILE." 0 0
222           else
223              eerror "Error writing settings for $LANGUAGE to $CONFFILE." ; eend 1
224              esyslog user.notice "$PN" "Error writing settings for $LANGUAGE to $CONFFILE."
225           fi
226           ;;
227 esac
228
229 eoutdent
230
231 ## END OF FILE #################################################################