rev |
line source |
pankso@42
|
1 #!/bin/sh
|
pankso@42
|
2 #
|
pankso@42
|
3 # System settings CGI interface: user, locale, keyboard, date. Since we
|
paul@205
|
4 # don't have multiple pages here there is only one case used to get command
|
paul@205
|
5 # values and the full content is followed directly.
|
pankso@42
|
6 #
|
al@419
|
7 # Copyright (C) 2011-2015 SliTaz GNU/Linux - BSD License
|
pankso@42
|
8 #
|
pankso@42
|
9
|
al@419
|
10
|
pankso@42
|
11 # Common functions from libtazpanel
|
al@419
|
12
|
pankso@42
|
13 . lib/libtazpanel
|
pankso@42
|
14 get_config
|
pascal@81
|
15 header
|
pankso@42
|
16
|
al@292
|
17 TITLE=$(gettext 'TazPanel - Settings')
|
pankso@42
|
18
|
al@419
|
19
|
pascal@336
|
20 # Get system database. LDAP compatible.
|
al@419
|
21
|
pascal@336
|
22 getdb()
|
pascal@336
|
23 {
|
pascal@336
|
24 getent $1 2>/dev/null || cat /etc/$1
|
pascal@336
|
25 }
|
pascal@336
|
26
|
pascal@336
|
27 listdb()
|
pascal@336
|
28 {
|
pascal@336
|
29 for item in $(getdb $1 | cut -d ":" -f 1); do
|
pascal@336
|
30 echo "<option>$item</option>\n"
|
pascal@336
|
31 done
|
pascal@336
|
32 }
|
pascal@336
|
33
|
al@419
|
34
|
al@419
|
35 #############################
|
al@419
|
36 # Get info from locale file #
|
al@419
|
37 #############################
|
al@419
|
38
|
al@419
|
39 get_locale_info()
|
al@419
|
40 {
|
al@419
|
41 # Commands like `LC_ALL=fr_FR locale -k LC_MEASUREMENT` will do the job
|
al@419
|
42 # only when your locale is generated and exists in the /usr/lib/locale.
|
al@419
|
43 # Here we manually parse locale definition files from /usr/share/i18n/locales/.
|
al@419
|
44 # Strange, bloated and not script-friendly format :(
|
al@419
|
45
|
al@419
|
46 [ ! -e /usr/share/i18n/locales/$1 ] && return
|
al@419
|
47
|
al@419
|
48 # Prepare file
|
al@419
|
49 if [ ! -e /tmp/tazpanel-$1 ]; then
|
al@419
|
50 sed 's|^[ \t]*||;/^%/d;/^comment_char/d;/^escape_char/d' /usr/share/i18n/locales/$1 | tr '\n' '&' | sed 's|/&||g' | tr '&' '\n' | sed 's|<U\([0-9a-fA-F]*\)>|\&#x\1;|g' | sed 's|�|\&#x|g' > /tmp/tazpanel-$1
|
al@419
|
51 fi
|
al@419
|
52
|
al@419
|
53 local ANS=$(grep -e "^$2[ ]" /tmp/tazpanel-$1 | sed 's|^[^ \t][^ \t]* *||')
|
al@419
|
54 if [ -z "$ANS" ]; then
|
al@419
|
55 # Not found, then section is copied from other locale definition file...
|
al@419
|
56 case $2 in
|
al@419
|
57 measurement)
|
al@419
|
58 section='LC_MEASUREMENT';;
|
al@419
|
59 width|height)
|
al@419
|
60 section='LC_PAPER';;
|
al@419
|
61 currency_symbol|int_curr_symbol)
|
al@419
|
62 section='LC_MONETARY';;
|
al@419
|
63 day|abday|mon|abmon|d_t_fmt|d_fmt|t_fmt|am_pm|t_fmt_ampm|date_fmt)
|
al@419
|
64 section='LC_TIME';;
|
al@419
|
65 esac
|
al@419
|
66 # Recursive call
|
al@419
|
67 get_locale_info $(sed -n '/^'$section'/,/^END '$section'/p' /tmp/tazpanel-$1 | grep 'copy' | cut -d'"' -f2) $2
|
al@419
|
68 else
|
al@419
|
69 case $2 in
|
al@419
|
70 day|abday|mon|abmon|am_pm) # semicolon-separated list in double quotes
|
al@419
|
71 echo "$ANS";;
|
al@419
|
72 *) # single value in double qoutes
|
al@419
|
73 echo "$ANS" | cut -d'"' -f2;;
|
al@419
|
74 esac
|
al@419
|
75 fi
|
al@419
|
76 }
|
al@419
|
77
|
al@419
|
78
|
al@419
|
79 # Get info from locale file about measurement system
|
al@419
|
80
|
al@419
|
81 get_locale_info_measurement()
|
al@419
|
82 {
|
al@419
|
83 # faster to use pre-processed values
|
al@419
|
84 case $1 in
|
al@419
|
85 en_AG|en_US|es_PR|es_US|nl_AW|yi_US) gettext 'US' ;;
|
al@419
|
86 POSIX) ;;
|
al@419
|
87 *) gettext 'metric' ;;
|
al@419
|
88 esac
|
al@419
|
89 }
|
al@419
|
90
|
al@419
|
91
|
al@419
|
92 # Get info from locale file about paper size
|
al@419
|
93
|
al@419
|
94 get_locale_info_paper()
|
al@419
|
95 {
|
al@419
|
96 # faster to use pre-processed values
|
al@419
|
97 case $1 in
|
al@419
|
98 en_AG|en_US|es_PR|es_US|nl_AW|yi_US) echo '8½×11 (US Letter)';;
|
al@419
|
99 en_CA|en_PH|es_CL|es_CO|es_CR|es_GT|es_MX|es_NI|es_PA|es_SV|es_VE|fil_PH|fr_CA|ik_CA|iu_CA|shs_CA|tl_PH) echo '216×279 (US Letter)';;
|
al@419
|
100 POSIX) ;;
|
al@419
|
101 *) echo '210×297 (A4)';;
|
al@419
|
102 esac
|
al@419
|
103 }
|
al@419
|
104
|
al@419
|
105
|
al@419
|
106 # Get info from locale file about date and time format
|
al@419
|
107
|
al@419
|
108 get_locale_info_date_time()
|
al@419
|
109 {
|
al@419
|
110 case $2 in
|
al@419
|
111 c) get_locale_info $1 d_t_fmt ;;
|
al@419
|
112 x) get_locale_info $1 d_fmt ;;
|
al@419
|
113 X) get_locale_info $1 t_fmt ;;
|
al@419
|
114 r) get_locale_info $1 t_fmt_ampm ;;
|
al@419
|
115 *) get_locale_info $1 date_fmt ;;
|
al@419
|
116 esac | sed 's| | |g; s|%|%|g; s|,|,|g; s|-|-|g; s|.|.|g; s|/|/|g; s|:|:|g; s|A|A|g; s|B|B|g; s|C|C|g; s|F|F|g; s|H|H|g; s|I|I|g; s|M|M|g; s|O|O|g; s|R|R|g; s|S|S|g; s|T|T|g; s|X|X|g; s|Y|Y|g; s|Z|Z|g; s|a|a|g; s|b|b|g; s|e|e|g; s|d|d|g; s|k|k|g; s|m|m|g; s|n|n|g; s|o|o|g; s|p|p|g; s|r|r|g; s|t|t|g; s|x|x|g; s|y|y|g; s|z|z|g;'
|
al@419
|
117
|
al@419
|
118 }
|
al@419
|
119
|
al@419
|
120
|
al@419
|
121 parse_date()
|
al@419
|
122 {
|
al@419
|
123 local weekday month day abday mon abmon rtime d_fmt t_fmt am_pm
|
al@419
|
124 weekday=$(( $(date +%w) + 1 )) # 1=Sunday ...
|
al@419
|
125 month=$(date +%-m) # 1=January ...
|
al@419
|
126 day=$(get_locale_info $1 day | cut -d'"' -f$(( 2 * $weekday )) | sed 's|&|\\\&|g') # translated day of week
|
al@419
|
127 abday=$(get_locale_info $1 abday | cut -d'"' -f$(( 2 * $weekday )) | sed 's|&|\\\&|g') # same, abbreviated
|
al@419
|
128 mon=$(get_locale_info $1 mon | cut -d'"' -f$(( 2 * $month )) | sed 's|&|\\\&|g') # translated month
|
al@419
|
129 abmon=$(get_locale_info $1 abmon | cut -d'"' -f$(( 2 * $month )) | sed 's|&|\\\&|g') # same, abbreviated
|
al@419
|
130 # next %-codes expanded into other %-codes
|
al@419
|
131 rtime=$(get_locale_info_date_time $1 r | sed 's|&|\\\&|g') # %r: 12-hour time
|
al@419
|
132 d_fmt=$(get_locale_info_date_time $1 x | sed 's|&|\\\&|g') # %x: date
|
al@419
|
133 t_fmt=$(get_locale_info_date_time $1 X | sed 's|&|\\\&|g') # %X: time
|
al@419
|
134
|
al@419
|
135 case $(LC_ALL=POSIX date +%P) in # translated am/pm
|
al@419
|
136 am) am_pm=$(get_locale_info $1 am_pm | cut -d'"' -f2 | sed 's|&|\\\&|g');;
|
al@419
|
137 pm) am_pm=$(get_locale_info $1 am_pm | cut -d'"' -f4 | sed 's|&|\\\&|g');;
|
al@419
|
138 esac
|
al@419
|
139
|
al@419
|
140 # r x X | OC | Y y Oy Ey | m -m Om | d -d Od | e -e Oe | F | H OH k | I OI l | M OM | S OS | R T | Z z | t | P p Op A a B b
|
al@419
|
141 # Note: %P=am/pm; %p=AM/PM. But here they the same because it is not a simple job to convert letters.
|
al@419
|
142 echo "$2" | sed "s|%r|$rtime|; s|%x|$d_fmt|; s|%X|$t_fmt|; \
|
al@419
|
143 s|%OC|S(date +%OC)|; \
|
al@419
|
144 s|%Y|$(date +%Y)|; s|%y|$(date +%y )|; s|%Oy|$(date +%Oy)|; s|%Ey|$(date +%Ey)|; \
|
al@419
|
145 s|%m|$(date +%m)|; s|%-m|$(date +%-m)|; s|%Om|$(date +%Om)|; \
|
al@419
|
146 s|%d|$(date +%d)|; s|%-d|$(date +%-d)|; s|%Od|$(date +%Od)|; \
|
al@419
|
147 s|%e|$(date +%e)|; s|%-e|$(date +%-e)|; s|%Oe|$(date +%Oe)|; \
|
al@419
|
148 s|%F|$(date +%F)|; \
|
al@419
|
149 s|%H|$(date +%H)|; s|%OH|$(date +%OH)|; s|%k|$(date +%k)|; \
|
al@419
|
150 s|%I|$(date +%I)|; s|%OI|$(date +%OI)|; s|%l|$(date +%l)|; \
|
al@419
|
151 s|%M|$(date +%M)|; s|%OM|$(date +%OM)|; \
|
al@419
|
152 s|%S|$(date +%S)|; s|%OS|$(date +%OS)|; \
|
al@419
|
153 s|%R|$(date +%R)|; s|%T|$(date +%T )|; \
|
al@419
|
154 s|%Z|$(date +%Z)|; s|%z|$(date +%z )|; \
|
al@419
|
155 s|%t|\t|; \
|
al@419
|
156 s|%P|$am_pm|; s|%p|$am_pm|; s|%Op|$am_pm|; s|%A|$day|; s|%a|$abday|; s|%B|$mon|; s|%b|$abmon|;"
|
al@419
|
157
|
al@419
|
158 }
|
al@419
|
159
|
al@419
|
160 list_of()
|
al@419
|
161 {
|
al@419
|
162 cd /usr/share/i18n/locales
|
al@419
|
163 #mon=$(date +%-m); monn=$(( $mon * 2 ))
|
al@419
|
164 #echo "mon=\"$mon\" monn=\"$monn\""
|
al@419
|
165
|
al@419
|
166 echo '<pre>'
|
al@419
|
167 for LOC in be_BY ca_IT el_CY fr_CH ru_RU ru_UA; do
|
al@419
|
168 case $LOC in
|
al@419
|
169 iso*|translit*) ;;
|
al@419
|
170 *)
|
al@419
|
171 #echo -e "$LOC:\t$(parse_date $LOC $(get_locale_info_date_time $LOC c | sed 's|&|\\\&|g'))";;
|
al@419
|
172 FMT="$(get_locale_info_date_time $LOC c)"
|
al@419
|
173 echo -e "$LOC:\t$FMT"
|
al@419
|
174 parse_date $LOC "$FMT"
|
al@419
|
175 echo;;
|
al@419
|
176 esac
|
al@419
|
177 done
|
al@419
|
178 echo '</pre>'
|
al@419
|
179 }
|
al@419
|
180
|
al@419
|
181
|
al@419
|
182
|
al@419
|
183
|
al@419
|
184
|
pankso@42
|
185 #
|
pankso@42
|
186 # Commands executed before page loading.
|
pankso@42
|
187 #
|
pankso@42
|
188
|
pascal@81
|
189 case " $(GET) " in
|
pascal@115
|
190 *\ do\ *)
|
al@419
|
191 users=$(echo $QUERY_STRING | awk 'BEGIN{RS="&";FS="="}{if($1=="user") print $2}')
|
al@419
|
192 groups=$(echo $QUERY_STRING | awk 'BEGIN{RS="&";FS="="}{if($1=="group")print $2}')
|
al@419
|
193
|
al@419
|
194 case $(GET do) in
|
al@419
|
195
|
al@419
|
196 # Groups page
|
al@419
|
197 delgroups)
|
al@419
|
198 for i in $groups; do delgroup $i; done ;;
|
al@419
|
199 addgroup)
|
al@419
|
200 addgroup $groups ;;
|
al@419
|
201 addmember)
|
al@419
|
202 addgroup $(GET member) $groups ;;
|
al@419
|
203 delmember)
|
al@419
|
204 delgroup $(GET member) $groups ;;
|
al@419
|
205
|
al@419
|
206 # Users page
|
al@419
|
207 delusers)
|
al@419
|
208 for i in $users; do deluser $i; done ;;
|
al@419
|
209 lockusers)
|
al@419
|
210 for i in $users; do passwd -l $i | log; done ;;
|
al@419
|
211 unlockusers)
|
al@419
|
212 for i in $users; do passwd -u $i | log; done ;;
|
al@419
|
213 chpasswd)
|
al@419
|
214 echo "$users:$(GET password)" | chpasswd -m | log ;;
|
al@419
|
215 adduser)
|
al@419
|
216 if [ -n "$users" ]; then
|
al@419
|
217 name=$(GET name); name=${name:-SliTaz User}
|
al@419
|
218 adduser -D -s /bin/sh -g "$name" -G users -h /home/$users $users
|
al@419
|
219 echo "$user:$(GET passwd)" | chpasswd -m | log
|
al@419
|
220 for i in audio cdrom floppy video tty; do addgroup $users $i; done
|
al@419
|
221 fi ;;
|
al@419
|
222
|
al@419
|
223 # System time
|
al@419
|
224 settz)
|
al@419
|
225 GET tz > /etc/TZ;;
|
al@419
|
226 date) # normalize to two digits
|
al@419
|
227 date $(printf '%02d%02d%02d%02d%d.%02d' "$(GET month)" "$(GET day)" "$(GET hour)" "$(GET min)" "$(GET year)" "$(GET sec)") >/dev/null;;
|
al@419
|
228 rdate)
|
al@419
|
229 rdate -s tick.greyware.com ;;
|
al@419
|
230 hwclock)
|
al@419
|
231 hwclock -w -u ;;
|
al@419
|
232
|
al@419
|
233 esac
|
al@419
|
234 ;;
|
al@419
|
235
|
al@419
|
236
|
pascal@81
|
237 *\ gen_locale\ *)
|
pascal@81
|
238 new_locale=$(GET gen_locale) ;;
|
pascal@141
|
239 *\ gen_keymap\ *)
|
pascal@141
|
240 new_keymap=$(GET gen_keymap) ;;
|
pascal@142
|
241 *\ apply_xorg_kbd\ *)
|
pascal@142
|
242 sed -i "s/XkbLayout.*/XkbLayout \" \"$(GET apply_xorg_kbd)\"/" \
|
pascal@142
|
243 /etc/X11/xorg.conf.d/40-Keyboard.conf ;;
|
pankso@110
|
244 *\ panel_pass*)
|
pankso@110
|
245 sed -i s@/:root:.*@/:root:$(GET panel_pass)@ $HTTPD_CONF ;;
|
pankso@110
|
246 *\ style*)
|
pankso@110
|
247 sed -i s/'^STYLE.*'/"STYLE=\"$(GET style)\""/ $CONFIG
|
al@292
|
248 . $CONFIG ;;
|
pankso@42
|
249 esac
|
pankso@42
|
250
|
al@419
|
251
|
al@419
|
252
|
al@419
|
253
|
al@419
|
254
|
pankso@42
|
255 #
|
pankso@42
|
256 # Default xHTML content
|
pankso@42
|
257 #
|
al@419
|
258
|
pankso@42
|
259 xhtml_header
|
pankso@67
|
260
|
pankso@110
|
261 case " $(GET) " in
|
pascal@336
|
262 *\ group*)
|
pascal@336
|
263 #
|
pascal@336
|
264 # Groups management
|
pascal@336
|
265 #
|
pascal@336
|
266 cat <<EOT
|
al@419
|
267 <h2 id="groups">$(gettext 'Manage groups')</h2>
|
pascal@336
|
268
|
pascal@336
|
269
|
al@419
|
270 <section>
|
al@419
|
271 <form class="wide">
|
al@419
|
272 <header>
|
al@419
|
273 <input type="hidden" name="groups"/>
|
al@419
|
274 <!-- $(gettext 'Selection:') -->
|
al@419
|
275 <button name="do" value="delgroups" data-icon="delete">$(gettext 'Delete group')</button>
|
al@419
|
276 </header>
|
al@419
|
277
|
al@419
|
278 <div class="scroll">
|
al@419
|
279 <table class="wide zebra scroll">
|
al@419
|
280 <thead>
|
al@419
|
281 <tr class="thead">
|
al@419
|
282 <td>$(gettext 'Group')</td>
|
al@419
|
283 <td>$(gettext 'Group ID')</td>
|
al@419
|
284 <td>$(gettext 'Members')</td>
|
al@419
|
285 </tr>
|
al@419
|
286 </thead>
|
al@419
|
287 <tbody>
|
pascal@336
|
288 EOT
|
al@419
|
289 for group in $(getdb group | cut -d ":" -f 1); do
|
pascal@336
|
290 IFS=':'
|
pascal@336
|
291 set -- $(getdb group | grep "^$group:")
|
pascal@336
|
292 unset IFS
|
pascal@336
|
293 gid=$3
|
pascal@336
|
294 members=$4
|
pascal@336
|
295 cat <<EOT
|
al@419
|
296 <tr>
|
al@419
|
297 <td><input type="checkbox" name="group" value="$group" id="$group"/>
|
al@419
|
298 <label for="$group" data-icon="group">$group</label></td>
|
al@419
|
299 <td>$gid</td>
|
al@419
|
300 <td>${members//,/, }</td>
|
al@419
|
301 </tr>
|
pascal@336
|
302 EOT
|
pascal@336
|
303 done
|
al@419
|
304 cat <<EOT
|
al@419
|
305 </tbody>
|
al@419
|
306 </table>
|
al@419
|
307 </div>
|
al@419
|
308 </form>
|
al@419
|
309 </section>
|
al@419
|
310
|
pascal@336
|
311
|
pascal@336
|
312 <section>
|
al@419
|
313 <header>$(gettext 'Add a new group')</header>
|
al@419
|
314 <form>
|
al@419
|
315 <input type="hidden" name="groups"/>
|
al@419
|
316 <table>
|
al@419
|
317 <tr><td>$(gettext 'Group name:')</td>
|
al@419
|
318 <td><input type="text" name="group"/></td>
|
al@419
|
319 </tr>
|
al@419
|
320 <tr><td colspan="2">
|
al@419
|
321 <button type="submit" name="do" value="addgroup" data-icon="add">$(gettext 'Create group')</button>
|
al@419
|
322 </td></tr>
|
al@419
|
323 </table>
|
al@419
|
324 </form>
|
pascal@336
|
325 </section>
|
pascal@336
|
326
|
al@419
|
327
|
pascal@336
|
328 <section>
|
al@419
|
329 <header>$(gettext 'Manage group membership')</header>
|
al@419
|
330 <form>
|
al@419
|
331 <input type="hidden" name="groups"/>
|
al@419
|
332 <table>
|
al@419
|
333 <tr>
|
al@419
|
334 <td>$(gettext 'Group name:')</td>
|
al@419
|
335 <td><select name="group">$(listdb group)</select></td>
|
al@419
|
336 <td>$(gettext 'User name:')</td>
|
al@419
|
337 <td><select name="member">$(listdb passwd)</select></td>
|
al@419
|
338 </tr>
|
al@419
|
339 <tr>
|
al@419
|
340 <td colspan="2">
|
al@419
|
341 <button name="do" value="addmember" data-icon="add">$(gettext 'Add user')</button>
|
al@419
|
342 </td>
|
al@419
|
343 <td colspan="2">
|
al@419
|
344 <button name="do" value="delmember" data-icon="delete">$(gettext 'Remove user')</button>
|
al@419
|
345 </td>
|
al@419
|
346 </tr>
|
al@419
|
347 </table>
|
al@419
|
348 </form>
|
pascal@336
|
349 </section>
|
pascal@336
|
350
|
pascal@336
|
351 EOT
|
pascal@336
|
352 ;;
|
pascal@336
|
353
|
al@419
|
354
|
pankso@110
|
355 *\ user*)
|
pankso@110
|
356 #
|
pankso@110
|
357 # Users management
|
pankso@110
|
358 #
|
pankso@110
|
359 cat <<EOT
|
al@419
|
360 <h2 id="users">$(gettext 'Manage users')</h2>
|
al@303
|
361
|
al@419
|
362 <section>
|
al@419
|
363 <form class="wide">
|
al@419
|
364 <header>
|
al@419
|
365 <!--$(gettext 'Selection:')-->
|
al@419
|
366 <button name="do" value="delusers" data-icon="delete">$(gettext 'Delete user')</button>
|
al@419
|
367 <button name="do" value="lockusers" data-icon="lock" >$(gettext 'Lock user' )</button>
|
al@419
|
368 <button name="do" value="unlockusers" data-icon="unlock">$(gettext 'Unlock user')</button>
|
al@419
|
369 </header>
|
al@303
|
370
|
al@419
|
371 <table class="wide zebra center">
|
al@419
|
372 <thead>
|
al@419
|
373 <tr>
|
al@419
|
374 <td>$(gettext 'Login')</td>
|
al@419
|
375 <td>$(gettext 'User ID')</td>
|
al@419
|
376 <td>$(gettext 'Name')</td>
|
al@419
|
377 <td>$(gettext 'Home')</td>
|
al@419
|
378 <td>$(gettext 'Shell')</td>
|
al@419
|
379 </tr>
|
al@419
|
380 </thead>
|
al@419
|
381 </tbody>
|
pascal@115
|
382 EOT
|
al@419
|
383 for login in $(getdb passwd | cut -d ":" -f 1); do
|
pascal@115
|
384 if [ -d /home/$login ]; then
|
pascal@115
|
385 colorlogin=$login
|
pascal@115
|
386 grep -qs "^$login:!" /etc/shadow &&
|
pascal@115
|
387 colorlogin="<span style='color: red;'>$login</span>"
|
pascal@115
|
388 IFS=':'
|
pascal@336
|
389 set -- $(getdb passwd | grep "^$login:")
|
pascal@115
|
390 unset IFS
|
pascal@115
|
391 cat <<EOT
|
pascal@115
|
392 <tr>
|
al@419
|
393 <td style="white-space: nowrap">
|
al@419
|
394 <input type="checkbox" name="user" value="$login" id="$login"/>
|
al@419
|
395 <label for="$login" data-icon="user">$colorlogin</label></td>
|
al@419
|
396 <td>$3:$4</td>
|
al@419
|
397 <td>$(echo $5 | sed s/,.*//)</td>
|
al@419
|
398 <td>$6</td>
|
al@419
|
399 <td>$7</td>
|
pascal@115
|
400 </tr>
|
pascal@115
|
401 EOT
|
pankso@110
|
402 fi
|
pankso@110
|
403 done
|
al@419
|
404 cat <<EOT
|
al@419
|
405 </tbody>
|
al@419
|
406 </table>
|
al@303
|
407 EOT
|
al@419
|
408 cat <<EOT
|
al@419
|
409 <footer>
|
al@419
|
410 <div>
|
al@419
|
411 $(gettext 'Password:')
|
al@419
|
412 <input type="password" name="password"/>
|
al@419
|
413 <button type="submit" name="do" value="chpasswd" data-icon="ok">$(gettext 'Change password')</button>
|
al@419
|
414 </div>
|
al@419
|
415 </footer>
|
al@419
|
416 </form>
|
al@419
|
417 </section>
|
al@419
|
418
|
pankso@42
|
419
|
al@312
|
420 <section>
|
al@419
|
421 <header>$(gettext 'Add a new user')</header>
|
al@303
|
422
|
al@419
|
423 <form>
|
al@419
|
424 <input type="hidden" name="users"/>
|
al@419
|
425 <table class="summary">
|
al@419
|
426 <tr><td>$(gettext 'User login:')</td>
|
al@419
|
427 <td><input type="text" name="user" size="30" pattern="[a-z]*"/></td></tr>
|
al@419
|
428 <tr><td>$(gettext 'User name:')</td>
|
al@419
|
429 <td><input type="text" name="name" size="30"/></td></tr>
|
al@419
|
430 <tr><td>$(gettext 'User password:')</td>
|
al@419
|
431 <td><input type="password" name="passwd" size="30"/></td></tr>
|
al@419
|
432 </table>
|
al@419
|
433
|
al@419
|
434 <footer>
|
al@419
|
435 <button type="submit" name="do" value="adduser" data-icon="add">$(gettext 'Create user')</button>
|
al@419
|
436 </footer>
|
al@419
|
437 </form>
|
al@312
|
438 </section>
|
pascal@147
|
439
|
al@419
|
440
|
al@312
|
441 <section>
|
al@419
|
442 <header>$(gettext 'Current user sessions')</header>
|
al@419
|
443 <pre>$(who)</pre>
|
al@312
|
444 </section>
|
al@303
|
445
|
al@419
|
446
|
al@312
|
447 <section>
|
al@419
|
448 <header>$(gettext 'Last user sessions')</header>
|
al@419
|
449 <div class="scroll"><pre>$(last)</pre></div>
|
al@312
|
450 </section>
|
pankso@42
|
451 EOT
|
pankso@110
|
452 ;;
|
al@313
|
453
|
al@313
|
454
|
al@313
|
455 *\ locale*)
|
al@313
|
456 #
|
al@313
|
457 # Choose locale
|
al@313
|
458 #
|
al@419
|
459 LOADING_MSG="$(gettext 'Please wait...')"; loading_msg
|
al@419
|
460
|
al@313
|
461 cur_loc=$(locale | grep LANG | cut -d= -f2)
|
al@419
|
462 cat <<EOT
|
al@419
|
463 <h2 id="locale">$(gettext 'Choose locale')</h2>
|
al@313
|
464
|
al@419
|
465 <section>
|
al@419
|
466 <header>$(gettext 'Current locale settings:')</header>
|
al@419
|
467 <div>
|
al@419
|
468 <pre>$(locale)</pre>
|
al@419
|
469 </div>
|
al@419
|
470 </section>
|
al@313
|
471
|
al@419
|
472 <section>
|
al@419
|
473 <header>$(gettext 'Locales that are currently installed on the machine:')</header>
|
al@419
|
474 <div>
|
al@419
|
475 <pre>$(locale -a)</pre>
|
al@419
|
476 </div>
|
al@419
|
477 </section>
|
al@318
|
478 EOT
|
al@313
|
479
|
al@318
|
480 is_installed "glibc-locale"
|
al@318
|
481 [ $? = 1 ] &&
|
al@318
|
482 msg tip $(gettext \
|
paul@319
|
483 "Can't see your language?<br/>You can \
|
al@406
|
484 <a href='/pkgs.cgi?do=Install&glibc-locale'>install glibc-locale</a> \
|
paul@319
|
485 to see a larger list of available locales.")
|
al@318
|
486
|
al@313
|
487
|
al@419
|
488 cat <<EOT
|
al@419
|
489 <section>
|
al@419
|
490 <header>$(gettext 'Available locales:')</header>
|
al@419
|
491 <form class="wide">
|
al@419
|
492 <table class="wide zebra">
|
al@419
|
493 <thead>
|
al@419
|
494 <tr><td>$(gettext 'Code')</td>
|
al@419
|
495 <td>$(gettext 'Language')</td>
|
al@419
|
496 <td>$(gettext 'Territory')</td>
|
al@419
|
497 <td>$(gettext 'Description')</td>
|
al@419
|
498 </tr>
|
al@419
|
499 </thead>
|
al@419
|
500 <tbody>
|
al@313
|
501 EOT
|
al@419
|
502 for locale in $(find /usr/share/i18n/locales -type f | sort); do
|
al@313
|
503 locale_name=$(basename $locale)
|
al@313
|
504 locale_title=$(grep -m 1 -e '^ *title' $locale | cut -d'"' -f2)
|
al@313
|
505 if [ -n "$locale_title" ]; then
|
al@419
|
506 sel=''; [ "$locale_name" == "$cur_loc" ] && sel='checked="checked"'
|
al@419
|
507 cat <<EOT
|
al@419
|
508 <tr>
|
al@419
|
509 <td>
|
al@419
|
510 <input type="radio" name="gen_locale" value="$locale_name" $sel id="$locale_name"/>
|
al@419
|
511 <label for="$locale_name">$locale_name</label>
|
al@419
|
512 </td>
|
al@419
|
513 <td>$(gettext -d iso_639 "$(grep -m 1 -e '^ *language' $locale | cut -d '"' -f2)")</td>
|
al@419
|
514 <td>$(gettext -d iso_3166 "$(grep -m 1 -e '^ *territory' $locale | cut -d '"' -f2)")</td>
|
al@419
|
515 <td>$locale_title</td>
|
al@419
|
516 </tr>
|
al@313
|
517 EOT
|
al@313
|
518 fi
|
al@313
|
519 done
|
al@419
|
520 cat <<EOT
|
al@419
|
521 </tbody>
|
al@419
|
522 </table>
|
al@419
|
523
|
al@419
|
524 <footer>
|
al@419
|
525 <button type="submit" data-icon="ok">$(gettext 'Activate')</button>
|
al@419
|
526 </footer>
|
al@419
|
527 </form>
|
al@419
|
528 </section>
|
al@313
|
529 EOT
|
al@313
|
530 ;;
|
al@313
|
531
|
al@313
|
532
|
pankso@110
|
533 *)
|
pankso@110
|
534 #
|
paul@385
|
535 # Default system settings page
|
pankso@110
|
536 #
|
al@419
|
537 list_of
|
al@419
|
538 cat <<EOT
|
al@419
|
539 <h2>$(gettext 'System settings')</h2>
|
al@419
|
540
|
al@419
|
541 <p>$(gettext 'Manage system time, users or language settings')<p>
|
al@419
|
542
|
al@419
|
543 <form><!--
|
al@419
|
544 --><button name="users" data-icon="user" >$(gettext 'Manage users' )</button><!--
|
al@419
|
545 --><button name="groups" data-icon="group">$(gettext 'Manage groups')</button>
|
al@419
|
546 </form>
|
pankso@42
|
547
|
al@312
|
548 <section>
|
al@419
|
549 <header>$(gettext 'System time')</header>
|
al@419
|
550 <div>
|
al@419
|
551 <form class="wide">
|
al@419
|
552 <fieldset><legend>$(gettext 'Time zone:')</legend>
|
al@419
|
553 <select name="tz">
|
al@419
|
554 $(cd /usr/share/zoneinfo; find * -type f ! -name '*.tab' | sort | \
|
al@419
|
555 awk -vtz="$(cat /etc/TZ)" \
|
al@419
|
556 '{printf("<option%s>%s</option>", ($1 == tz)?" selected":"", $1)}')
|
al@419
|
557 </select>
|
al@419
|
558 <button name="do" value="settz" data-icon="ok">$(gettext 'Change')</button>
|
al@419
|
559 </fieldset>
|
al@419
|
560 <fieldset><legend>$(gettext 'System time:')</legend>
|
al@419
|
561 $(date | sed 's|[0-9][0-9]:[0-9:]*|<span id="time">&</span>|')
|
al@419
|
562 <button name="do" value="rdate" data-icon="sync">$(gettext 'Sync online')</button>
|
al@419
|
563 </fieldset>
|
al@419
|
564 <fieldset><legend>$(gettext 'Hardware clock:')</legend>
|
al@419
|
565 $(hwclock -ur | sed 's|0.000000 seconds||')
|
al@419
|
566 <button name="do" value="hwclock" data-icon="clock">$(gettext 'Set hardware clock')</button>
|
al@419
|
567 </fieldset>
|
al@419
|
568 <fieldset><legend>$(gettext 'Set date')</legend>
|
al@419
|
569 <input type="number" name="day" value="$(date +%d)" min="1" max="31" size="4" required/>
|
al@419
|
570 <select name="month" value="$(date +%m)">
|
al@419
|
571 $(for i in $(seq 12); do
|
al@419
|
572 printf '<option value="%s">%s</option>' $(date -d $i.01-01:01 '+%m %B')
|
al@419
|
573 done)
|
al@419
|
574 </select>
|
al@419
|
575 <input type="number" name="year" value="$(date +%Y)" min="2015" max="2030" size="6" required/>
|
al@419
|
576 - <input type="number" name="hour" value="$(date +%H)" min="0" max="23" size="4" required/><!--
|
al@419
|
577 -->:<input type="number" name="min" value="$(date +%M)" min="0" max="59" size="4" required/><!--
|
al@419
|
578 -->:<input type="number" name="sec" value="00" min="0" max="59" size="4" required/>
|
al@419
|
579 <button name="do" value="date" data-icon="ok">$(gettext 'Set date')</button>
|
al@419
|
580 </fieldset>
|
al@419
|
581 </form>
|
al@419
|
582 </div>
|
al@303
|
583
|
al@419
|
584 <script type="text/javascript">
|
al@419
|
585 // Live time on page
|
al@419
|
586 Date.prototype.timeNow = function() {
|
al@419
|
587 return ((this.getHours() < 10)?"0":"") + this.getHours() + ":" + ((this.getMinutes() < 10)?"0":"") + this.getMinutes() + ":" + ((this.getSeconds() < 10)?"0":"") + this.getSeconds();
|
al@419
|
588 }
|
al@419
|
589 setInterval(function(){document.getElementById('time').innerText = new Date().timeNow()}, 1000);
|
al@419
|
590 </script>
|
al@312
|
591 </section>
|
pankso@110
|
592 EOT
|
al@419
|
593
|
al@419
|
594
|
pankso@110
|
595 #
|
pankso@110
|
596 # Locale settings
|
pankso@110
|
597 #
|
al@419
|
598 cat <<EOT
|
al@312
|
599 <section>
|
al@419
|
600 <header id="locale">$(gettext 'System language')</header>
|
al@419
|
601 <div>
|
al@419
|
602 <form>
|
pankso@42
|
603 EOT
|
pankso@42
|
604 # Check if a new locale was requested
|
pankso@42
|
605 if [ -n "$new_locale" ]; then
|
pankso@42
|
606 rm -rf /usr/lib/locale/$new_locale
|
pankso@42
|
607 localedef -i $new_locale -c -f UTF-8 \
|
pankso@42
|
608 /usr/lib/locale/$new_locale
|
pankso@42
|
609 # System configuration
|
pankso@42
|
610 echo "LANG=$new_locale" > /etc/locale.conf
|
pankso@42
|
611 echo "LC_ALL=$new_locale" >> /etc/locale.conf
|
al@318
|
612 msg warn "$(eval_gettext \
|
al@318
|
613 'You must logout and login again to your current session to use $new_locale locale.')"
|
pankso@42
|
614 else
|
al@419
|
615 cat <<EOT
|
al@419
|
616 $(gettext 'Current system locale:')
|
al@419
|
617 <strong>$(locale | grep LANG | cut -d= -f2)</strong>
|
al@419
|
618 <button name="locale" data-icon="locale">$(gettext 'Change')</button>
|
al@419
|
619 EOT
|
pankso@42
|
620 fi
|
al@419
|
621 cat <<EOT
|
al@419
|
622 </div>
|
al@419
|
623 </form>
|
al@312
|
624 </section>
|
pankso@110
|
625
|
al@419
|
626
|
al@312
|
627 <section>
|
al@419
|
628 <header id="keymap">$(gettext 'Keyboard layout')</header>
|
al@419
|
629 <div>
|
pascal@141
|
630 EOT
|
pascal@141
|
631 # Check if a new keymap was requested
|
pascal@141
|
632 if [ -n "$new_keymap" ]; then
|
pascal@141
|
633 echo "$new_keymap" > /etc/keymap.conf
|
pascal@141
|
634 if [ -x /bin/loadkeys ]; then
|
pascal@141
|
635 loadkeys $new_keymap
|
pascal@141
|
636 else
|
pascal@141
|
637 loadkmap < /usr/share/kmap/$new_keymap.kmap
|
pascal@141
|
638 fi
|
pascal@141
|
639 fi
|
al@419
|
640
|
pascal@142
|
641 keymap=$(cat /etc/keymap.conf)
|
al@303
|
642 eval_gettext 'Current console keymap: $keymap'
|
pascal@142
|
643 if [ -n "$keymap" ]; then
|
pascal@142
|
644 case "$keymap" in
|
pascal@142
|
645 fr_CH*)
|
pascal@142
|
646 keymap="ch" ;;
|
pascal@142
|
647 ru)
|
al@419
|
648 keymap="us,ru" ;;
|
pascal@142
|
649 slovene)
|
pascal@142
|
650 keymap=si ;;
|
pascal@142
|
651 *)
|
pascal@142
|
652 keymap=${keymap%-lat*}
|
pascal@142
|
653 keymap=${keymap%-abnt2} ;;
|
pascal@142
|
654 esac
|
pascal@142
|
655 keyboard_config=/etc/X11/xorg.conf.d/40-Keyboard.conf
|
al@419
|
656 cat <<EOT
|
al@419
|
657 <form id="settings"></form>
|
al@419
|
658 <form id="index" action="index.cgi"></form>
|
al@419
|
659 <br/>
|
al@419
|
660 $(gettext 'Suggested keymap for Xorg:') $keymap
|
al@419
|
661 <button form="settings" name="apply_xorg_kbd" value="$keymap" data-icon="ok">$(gettext 'Activate')</button>
|
al@419
|
662 <button form="index" name="file" value="$keyboard_config" data-icon="edit">$(gettext 'Edit')</button>
|
al@419
|
663 <br/>
|
pascal@142
|
664 EOT
|
pascal@142
|
665 fi
|
al@419
|
666 cat <<EOT
|
al@419
|
667 <form>
|
al@419
|
668 $(gettext 'Available keymaps:')
|
al@419
|
669 <select name="gen_keymap">
|
al@419
|
670 $(list_keymaps)
|
al@419
|
671 </select>
|
al@419
|
672 <button type="submit" data-icon="ok">$(gettext 'Activate')</button>
|
al@419
|
673 </form>
|
al@419
|
674 </div>
|
al@312
|
675 </section>
|
pascal@141
|
676
|
al@419
|
677
|
al@312
|
678 <section>
|
al@419
|
679 <header>$(gettext 'Panel configuration')</header>
|
al@419
|
680 <div>
|
al@419
|
681 <form class="wide">
|
al@419
|
682 <fieldset><legend>$(gettext 'Style:')</legend>
|
al@419
|
683 <select name="style">$(list_styles)</select>
|
al@419
|
684 <button data-icon="ok">$(gettext 'Activate')</button>
|
al@419
|
685 </fieldset>
|
al@303
|
686
|
al@419
|
687 <fieldset><legend>$(gettext 'Panel password:')</legend>
|
al@419
|
688 <input type="password" name="panel_pass"/>
|
al@419
|
689 <button data-icon="ok">$(gettext 'Change')</button>
|
al@419
|
690 </fieldset>
|
al@419
|
691 </form>
|
al@419
|
692
|
al@419
|
693 <fieldset><legend>$(gettext 'Configuration files:')</legend>
|
al@419
|
694 <button form="index" name="file" value="$CONFIG" data-icon="edit">$(gettext 'Panel')</button>
|
al@419
|
695 <button form="index" name="file" value="$HTTPD_CONF" data-icon="edit">$(gettext 'Server')</button>
|
al@419
|
696 </fieldset>
|
al@419
|
697
|
al@419
|
698 <p>$(gettext 'TazPanel provides a debugging mode and page:')
|
al@419
|
699 <a href="/index.cgi?debug">debug</a>
|
pankso@110
|
700 </p>
|
al@419
|
701 </div>
|
al@312
|
702 </section>
|
pankso@42
|
703 EOT
|
pankso@110
|
704 ;;
|
pankso@110
|
705 esac
|
pankso@42
|
706
|
pankso@42
|
707 xhtml_footer
|
pankso@42
|
708 exit 0
|