tazpanel annotate settings.cgi @ rev 458

boot.cgi/ISO mine: install in Linux partition
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Apr 13 11:11:51 2015 +0200 (2015-04-13)
parents 169f1ccfb613
children dd26a42bd40b
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@443 17 TITLE=$(_ 'TazPanel - Settings')
pankso@42 18
al@419 19
pascal@336 20 # Get system database. LDAP compatible.
al@419 21
al@437 22 getdb() {
pascal@336 23 getent $1 2>/dev/null || cat /etc/$1
pascal@336 24 }
pascal@336 25
al@437 26 listdb() {
pascal@336 27 for item in $(getdb $1 | cut -d ":" -f 1); do
pascal@336 28 echo "<option>$item</option>\n"
pascal@336 29 done
pascal@336 30 }
pascal@336 31
al@419 32
al@419 33
al@419 34
al@419 35
pankso@42 36 #
pankso@42 37 # Commands executed before page loading.
pankso@42 38 #
pankso@42 39
pascal@81 40 case " $(GET) " in
pascal@115 41 *\ do\ *)
al@419 42 users=$(echo $QUERY_STRING | awk 'BEGIN{RS="&";FS="="}{if($1=="user") print $2}')
al@419 43 groups=$(echo $QUERY_STRING | awk 'BEGIN{RS="&";FS="="}{if($1=="group")print $2}')
al@419 44
al@419 45 case $(GET do) in
al@419 46
al@419 47 # Groups page
al@419 48 delgroups)
al@419 49 for i in $groups; do delgroup $i; done ;;
al@419 50 addgroup)
al@419 51 addgroup $groups ;;
al@419 52 addmember)
al@419 53 addgroup $(GET member) $groups ;;
al@419 54 delmember)
al@419 55 delgroup $(GET member) $groups ;;
al@419 56
al@419 57 # Users page
al@419 58 delusers)
al@419 59 for i in $users; do deluser $i; done ;;
al@419 60 lockusers)
al@419 61 for i in $users; do passwd -l $i | log; done ;;
al@419 62 unlockusers)
al@419 63 for i in $users; do passwd -u $i | log; done ;;
al@419 64 chpasswd)
al@419 65 echo "$users:$(GET password)" | chpasswd -m | log ;;
al@419 66 adduser)
al@419 67 if [ -n "$users" ]; then
al@419 68 name=$(GET name); name=${name:-SliTaz User}
al@419 69 adduser -D -s /bin/sh -g "$name" -G users -h /home/$users $users
al@419 70 echo "$user:$(GET passwd)" | chpasswd -m | log
al@419 71 for i in audio cdrom floppy video tty; do addgroup $users $i; done
al@419 72 fi ;;
al@419 73
al@419 74 # System time
al@419 75 settz)
al@419 76 GET tz > /etc/TZ;;
al@419 77 date) # normalize to two digits
al@419 78 date $(printf '%02d%02d%02d%02d%d.%02d' "$(GET month)" "$(GET day)" "$(GET hour)" "$(GET min)" "$(GET year)" "$(GET sec)") >/dev/null;;
al@419 79 rdate)
al@419 80 rdate -s tick.greyware.com ;;
al@419 81 hwclock)
al@419 82 hwclock -w -u ;;
al@419 83
al@419 84 esac
al@419 85 ;;
al@419 86
al@419 87
pascal@81 88 *\ gen_locale\ *)
pascal@81 89 new_locale=$(GET gen_locale) ;;
pascal@141 90 *\ gen_keymap\ *)
pascal@141 91 new_keymap=$(GET gen_keymap) ;;
pascal@142 92 *\ apply_xorg_kbd\ *)
pascal@142 93 sed -i "s/XkbLayout.*/XkbLayout \" \"$(GET apply_xorg_kbd)\"/" \
pascal@142 94 /etc/X11/xorg.conf.d/40-Keyboard.conf ;;
pankso@110 95 *\ panel_pass*)
pankso@110 96 sed -i s@/:root:.*@/:root:$(GET panel_pass)@ $HTTPD_CONF ;;
pankso@110 97 *\ style*)
pankso@110 98 sed -i s/'^STYLE.*'/"STYLE=\"$(GET style)\""/ $CONFIG
al@292 99 . $CONFIG ;;
pankso@42 100 esac
pankso@42 101
al@419 102
al@419 103
al@419 104
al@419 105
pankso@42 106 #
pankso@42 107 # Default xHTML content
pankso@42 108 #
al@419 109
pankso@42 110 xhtml_header
al@437 111 check_root_tazpanel
pankso@67 112
pankso@110 113 case " $(GET) " in
pascal@336 114 *\ group*)
pascal@336 115 #
pascal@336 116 # Groups management
pascal@336 117 #
pascal@336 118 cat <<EOT
al@443 119 <h2 id="groups">$(_ 'Manage groups')</h2>
pascal@336 120
pascal@336 121
al@419 122 <section>
al@419 123 <form class="wide">
al@419 124 <header>
al@419 125 <input type="hidden" name="groups"/>
al@443 126 <!-- $(_ 'Selection:') -->
al@443 127 <button name="do" value="delgroups" data-icon="delete">$(_ 'Delete group')</button>
al@419 128 </header>
al@419 129
al@419 130 <div class="scroll">
al@419 131 <table class="wide zebra scroll">
al@419 132 <thead>
al@419 133 <tr class="thead">
al@443 134 <td>$(_ 'Group')</td>
al@443 135 <td>$(_ 'Group ID')</td>
al@443 136 <td>$(_ 'Members')</td>
al@419 137 </tr>
al@419 138 </thead>
al@419 139 <tbody>
pascal@336 140 EOT
al@419 141 for group in $(getdb group | cut -d ":" -f 1); do
pascal@336 142 IFS=':'
pascal@336 143 set -- $(getdb group | grep "^$group:")
pascal@336 144 unset IFS
pascal@336 145 gid=$3
pascal@336 146 members=$4
pascal@336 147 cat <<EOT
al@419 148 <tr>
al@419 149 <td><input type="checkbox" name="group" value="$group" id="$group"/>
al@419 150 <label for="$group" data-icon="group">$group</label></td>
al@419 151 <td>$gid</td>
al@419 152 <td>${members//,/, }</td>
al@419 153 </tr>
pascal@336 154 EOT
pascal@336 155 done
al@419 156 cat <<EOT
al@419 157 </tbody>
al@419 158 </table>
al@419 159 </div>
al@419 160 </form>
al@419 161 </section>
al@419 162
pascal@336 163
pascal@336 164 <section>
al@443 165 <header>$(_ 'Add a new group')</header>
al@419 166 <form>
al@419 167 <input type="hidden" name="groups"/>
al@419 168 <table>
al@443 169 <tr><td>$(_ 'Group name:')</td>
al@419 170 <td><input type="text" name="group"/></td>
al@419 171 </tr>
al@419 172 <tr><td colspan="2">
al@443 173 <button type="submit" name="do" value="addgroup" data-icon="add">$(_ 'Create group')</button>
al@419 174 </td></tr>
al@419 175 </table>
al@419 176 </form>
pascal@336 177 </section>
pascal@336 178
al@419 179
pascal@336 180 <section>
al@443 181 <header>$(_ 'Manage group membership')</header>
al@419 182 <form>
al@419 183 <input type="hidden" name="groups"/>
al@419 184 <table>
al@419 185 <tr>
al@443 186 <td>$(_ 'Group name:')</td>
al@419 187 <td><select name="group">$(listdb group)</select></td>
al@443 188 <td>$(_ 'User name:')</td>
al@419 189 <td><select name="member">$(listdb passwd)</select></td>
al@419 190 </tr>
al@419 191 <tr>
al@419 192 <td colspan="2">
al@443 193 <button name="do" value="addmember" data-icon="add">$(_ 'Add user')</button>
al@419 194 </td>
al@419 195 <td colspan="2">
al@443 196 <button name="do" value="delmember" data-icon="delete">$(_ 'Remove user')</button>
al@419 197 </td>
al@419 198 </tr>
al@419 199 </table>
al@419 200 </form>
pascal@336 201 </section>
pascal@336 202
pascal@336 203 EOT
pascal@336 204 ;;
pascal@336 205
al@419 206
pankso@110 207 *\ user*)
pankso@110 208 #
pankso@110 209 # Users management
pankso@110 210 #
pankso@110 211 cat <<EOT
al@443 212 <h2 id="users">$(_ 'Manage users')</h2>
al@303 213
al@419 214 <section>
al@419 215 <form class="wide">
al@419 216 <header>
al@443 217 <!--$(_ 'Selection:')-->
al@443 218 <button name="do" value="delusers" data-icon="delete">$(_ 'Delete user')</button>
al@443 219 <button name="do" value="lockusers" data-icon="lock" >$(_ 'Lock user' )</button>
al@443 220 <button name="do" value="unlockusers" data-icon="unlock">$(_ 'Unlock user')</button>
al@419 221 </header>
al@303 222
al@419 223 <table class="wide zebra center">
al@419 224 <thead>
al@419 225 <tr>
al@443 226 <td>$(_ 'Login')</td>
al@443 227 <td>$(_ 'User ID')</td>
al@443 228 <td>$(_ 'Name')</td>
al@443 229 <td>$(_ 'Home')</td>
al@443 230 <td>$(_ 'Shell')</td>
al@419 231 </tr>
al@419 232 </thead>
al@419 233 </tbody>
pascal@115 234 EOT
al@419 235 for login in $(getdb passwd | cut -d ":" -f 1); do
pascal@115 236 if [ -d /home/$login ]; then
pascal@115 237 colorlogin=$login
pascal@115 238 grep -qs "^$login:!" /etc/shadow &&
pascal@115 239 colorlogin="<span style='color: red;'>$login</span>"
pascal@115 240 IFS=':'
pascal@336 241 set -- $(getdb passwd | grep "^$login:")
pascal@115 242 unset IFS
pascal@115 243 cat <<EOT
pascal@115 244 <tr>
al@419 245 <td style="white-space: nowrap">
al@419 246 <input type="checkbox" name="user" value="$login" id="$login"/>
al@419 247 <label for="$login" data-icon="user">$colorlogin</label></td>
al@419 248 <td>$3:$4</td>
al@419 249 <td>$(echo $5 | sed s/,.*//)</td>
al@419 250 <td>$6</td>
al@419 251 <td>$7</td>
pascal@115 252 </tr>
pascal@115 253 EOT
pankso@110 254 fi
pankso@110 255 done
al@419 256 cat <<EOT
al@419 257 </tbody>
al@419 258 </table>
al@303 259 EOT
al@419 260 cat <<EOT
al@419 261 <footer>
al@419 262 <div>
al@443 263 $(_ 'Password:')
al@419 264 <input type="password" name="password"/>
al@443 265 <button type="submit" name="do" value="chpasswd" data-icon="ok">$(_ 'Change password')</button>
al@419 266 </div>
al@419 267 </footer>
al@419 268 </form>
al@419 269 </section>
al@419 270
pankso@42 271
al@312 272 <section>
al@443 273 <header>$(_ 'Add a new user')</header>
al@303 274
al@419 275 <form>
al@419 276 <input type="hidden" name="users"/>
al@419 277 <table class="summary">
al@443 278 <tr><td>$(_ 'User login:')</td>
al@419 279 <td><input type="text" name="user" size="30" pattern="[a-z]*"/></td></tr>
al@443 280 <tr><td>$(_ 'User name:')</td>
al@419 281 <td><input type="text" name="name" size="30"/></td></tr>
al@443 282 <tr><td>$(_ 'User password:')</td>
al@419 283 <td><input type="password" name="passwd" size="30"/></td></tr>
al@419 284 </table>
al@419 285
al@419 286 <footer>
al@443 287 <button type="submit" name="do" value="adduser" data-icon="add">$(_ 'Create user')</button>
al@419 288 </footer>
al@419 289 </form>
al@312 290 </section>
pascal@147 291
al@419 292
al@312 293 <section>
al@443 294 <header>$(_ 'Current user sessions')</header>
al@419 295 <pre>$(who)</pre>
al@312 296 </section>
al@303 297
al@419 298
al@312 299 <section>
al@443 300 <header>$(_ 'Last user sessions')</header>
al@419 301 <div class="scroll"><pre>$(last)</pre></div>
al@312 302 </section>
pankso@42 303 EOT
pankso@110 304 ;;
al@313 305
al@313 306
al@313 307 *\ locale*)
al@313 308 #
al@313 309 # Choose locale
al@313 310 #
al@443 311 LOADING_MSG="$(_ 'Please wait...')"; loading_msg
al@419 312
al@313 313 cur_loc=$(locale | grep LANG | cut -d= -f2)
al@419 314 cat <<EOT
al@443 315 <h2 id="locale">$(_ 'Choose locale')</h2>
al@313 316
al@419 317 <section>
al@443 318 <header>$(_ 'Current locale settings:')</header>
al@419 319 <div>
al@419 320 <pre>$(locale)</pre>
al@419 321 </div>
al@419 322 </section>
al@313 323
al@419 324 <section>
al@443 325 <header>$(_ 'Locales that are currently installed on the machine:')</header>
al@419 326 <div>
al@419 327 <pre>$(locale -a)</pre>
al@419 328 </div>
al@419 329 </section>
al@318 330 EOT
al@313 331
al@318 332 is_installed "glibc-locale"
al@318 333 [ $? = 1 ] &&
al@443 334 msg tip $(_ \
paul@319 335 "Can't see your language?<br/>You can \
pascal@441 336 <a href='pkgs.cgi?do=Install&amp;glibc-locale'>install glibc-locale</a> \
paul@319 337 to see a larger list of available locales.")
al@318 338
al@313 339
al@419 340 cat <<EOT
al@419 341 <section>
al@443 342 <header>$(_ 'Available locales:')</header>
al@419 343 <form class="wide">
al@419 344 <table class="wide zebra">
al@419 345 <thead>
al@443 346 <tr><td>$(_ 'Code')</td>
al@443 347 <td>$(_ 'Language')</td>
al@443 348 <td>$(_ 'Territory')</td>
al@443 349 <td>$(_ 'Description')</td>
al@419 350 </tr>
al@419 351 </thead>
al@419 352 <tbody>
al@313 353 EOT
al@419 354 for locale in $(find /usr/share/i18n/locales -type f | sort); do
al@313 355 locale_name=$(basename $locale)
al@313 356 locale_title=$(grep -m 1 -e '^ *title' $locale | cut -d'"' -f2)
al@313 357 if [ -n "$locale_title" ]; then
al@419 358 sel=''; [ "$locale_name" == "$cur_loc" ] && sel='checked="checked"'
al@419 359 cat <<EOT
al@419 360 <tr>
al@419 361 <td>
al@419 362 <input type="radio" name="gen_locale" value="$locale_name" $sel id="$locale_name"/>
al@419 363 <label for="$locale_name">$locale_name</label>
al@419 364 </td>
al@419 365 <td>$(gettext -d iso_639 "$(grep -m 1 -e '^ *language' $locale | cut -d '"' -f2)")</td>
al@419 366 <td>$(gettext -d iso_3166 "$(grep -m 1 -e '^ *territory' $locale | cut -d '"' -f2)")</td>
al@419 367 <td>$locale_title</td>
al@419 368 </tr>
al@313 369 EOT
al@313 370 fi
al@313 371 done
al@419 372 cat <<EOT
al@419 373 </tbody>
al@419 374 </table>
al@419 375
al@419 376 <footer>
al@443 377 <button type="submit" data-icon="ok">$(_ 'Activate')</button>
al@419 378 </footer>
al@419 379 </form>
al@419 380 </section>
al@313 381 EOT
al@313 382 ;;
al@313 383
al@313 384
pankso@110 385 *)
pankso@110 386 #
paul@385 387 # Default system settings page
pankso@110 388 #
al@422 389
al@419 390 cat <<EOT
al@443 391 <h2>$(_ 'System settings')</h2>
al@419 392
al@443 393 <p>$(_ 'Manage system time, users or language settings')<p>
al@419 394
al@419 395 <form><!--
al@443 396 --><button name="users" data-icon="user" >$(_ 'Manage users' )</button><!--
al@443 397 --><button name="groups" data-icon="group">$(_ 'Manage groups')</button>
al@419 398 </form>
pankso@42 399
al@312 400 <section>
al@443 401 <header>$(_ 'System time')</header>
al@419 402 <div>
al@419 403 <form class="wide">
al@443 404 <fieldset><legend>$(_ 'Time zone:')</legend>
al@419 405 <select name="tz">
al@419 406 $(cd /usr/share/zoneinfo; find * -type f ! -name '*.tab' | sort | \
al@419 407 awk -vtz="$(cat /etc/TZ)" \
al@419 408 '{printf("<option%s>%s</option>", ($1 == tz)?" selected":"", $1)}')
al@419 409 </select>
al@443 410 <button name="do" value="settz" data-icon="ok">$(_ 'Change')</button>
al@419 411 </fieldset>
al@437 412
al@443 413 <fieldset><legend>$(_ 'System time:')</legend>
al@419 414 $(date | sed 's|[0-9][0-9]:[0-9:]*|<span id="time">&</span>|')
al@443 415 <button name="do" value="rdate" data-icon="sync">$(_ 'Sync online')</button>
al@419 416 </fieldset>
al@437 417
al@443 418 <fieldset id="hwclock1"><legend>$(_ 'Hardware clock:')</legend>
al@419 419 $(hwclock -ur | sed 's|0.000000 seconds||')
al@443 420 <button name="do" value="hwclock" id="hwclock" data-icon="clock">$(_ 'Set hardware clock')</button>
al@419 421 </fieldset>
al@437 422
al@443 423 <fieldset><legend>$(_ 'Set date')</legend>
al@419 424 <input type="number" name="day" value="$(date +%d)" min="1" max="31" size="4" required/>
al@419 425 <select name="month" value="$(date +%m)">
al@419 426 $(for i in $(seq 12); do
al@437 427 sel=''; [ "$i" == "$(date +%-m)" ] && sel=' selected'
al@437 428 printf "<option value=\"%s\"$sel>%s</option>" $(date -d $i.01-01:01 '+%m %B')
al@419 429 done)
al@419 430 </select>
al@419 431 <input type="number" name="year" value="$(date +%Y)" min="2015" max="2030" size="6" required/>
al@419 432 - <input type="number" name="hour" value="$(date +%H)" min="0" max="23" size="4" required/><!--
al@419 433 -->:<input type="number" name="min" value="$(date +%M)" min="0" max="59" size="4" required/><!--
al@419 434 -->:<input type="number" name="sec" value="00" min="0" max="59" size="4" required/>
al@443 435 <button name="do" value="date" data-icon="ok">$(_ 'Set date')</button>
al@419 436 </fieldset>
al@419 437 </form>
al@419 438 </div>
al@303 439
al@419 440 <script type="text/javascript">
al@419 441 // Live time on page
al@419 442 Date.prototype.timeNow = function() {
al@419 443 return ((this.getHours() < 10)?"0":"") + this.getHours() + ":" + ((this.getMinutes() < 10)?"0":"") + this.getMinutes() + ":" + ((this.getSeconds() < 10)?"0":"") + this.getSeconds();
al@419 444 }
al@419 445 setInterval(function(){document.getElementById('time').innerText = new Date().timeNow()}, 1000);
al@437 446
al@437 447 //document.getElementById('hwclock').disabled = 'disabled';
al@419 448 </script>
al@312 449 </section>
pankso@110 450 EOT
al@419 451
al@419 452
pankso@110 453 #
pankso@110 454 # Locale settings
pankso@110 455 #
al@419 456 cat <<EOT
al@312 457 <section>
al@443 458 <header id="locale">$(_ 'System language')</header>
al@419 459 <div>
al@419 460 <form>
pankso@42 461 EOT
pankso@42 462 # Check if a new locale was requested
pankso@42 463 if [ -n "$new_locale" ]; then
pankso@42 464 rm -rf /usr/lib/locale/$new_locale
pankso@42 465 localedef -i $new_locale -c -f UTF-8 \
pankso@42 466 /usr/lib/locale/$new_locale
pankso@42 467 # System configuration
pankso@42 468 echo "LANG=$new_locale" > /etc/locale.conf
pankso@42 469 echo "LC_ALL=$new_locale" >> /etc/locale.conf
al@443 470 msg warn "$(_ \
al@443 471 'You must logout and login again to your current session to use %s locale.' $new_locale)"
pankso@42 472 else
al@419 473 cat <<EOT
al@443 474 $(_ 'Current system locale:')
al@419 475 <strong>$(locale | grep LANG | cut -d= -f2)</strong>
al@443 476 <button name="locale" data-icon="locale">$(_ 'Change')</button>
al@419 477 EOT
pankso@42 478 fi
al@419 479 cat <<EOT
al@419 480 </div>
al@419 481 </form>
al@312 482 </section>
pankso@110 483
al@419 484
al@312 485 <section>
al@443 486 <header id="keymap">$(_ 'Keyboard layout')</header>
al@419 487 <div>
pascal@141 488 EOT
pascal@141 489 # Check if a new keymap was requested
pascal@141 490 if [ -n "$new_keymap" ]; then
pascal@141 491 echo "$new_keymap" > /etc/keymap.conf
pascal@141 492 if [ -x /bin/loadkeys ]; then
pascal@141 493 loadkeys $new_keymap
pascal@141 494 else
pascal@141 495 loadkmap < /usr/share/kmap/$new_keymap.kmap
pascal@141 496 fi
pascal@141 497 fi
al@419 498
pascal@142 499 keymap=$(cat /etc/keymap.conf)
al@443 500 _ 'Current console keymap: %s' $keymap
pascal@142 501 if [ -n "$keymap" ]; then
pascal@142 502 case "$keymap" in
pascal@142 503 fr_CH*)
pascal@142 504 keymap="ch" ;;
pascal@142 505 ru)
al@419 506 keymap="us,ru" ;;
pascal@142 507 slovene)
pascal@142 508 keymap=si ;;
pascal@142 509 *)
pascal@142 510 keymap=${keymap%-lat*}
pascal@142 511 keymap=${keymap%-abnt2} ;;
pascal@142 512 esac
pascal@142 513 keyboard_config=/etc/X11/xorg.conf.d/40-Keyboard.conf
al@419 514 cat <<EOT
al@419 515 <form id="settings"></form>
al@419 516 <form id="index" action="index.cgi"></form>
al@419 517 <br/>
al@443 518 $(_ 'Suggested keymap for Xorg:') $keymap
al@443 519 <button form="settings" name="apply_xorg_kbd" value="$keymap" data-icon="ok">$(_ 'Activate')</button>
al@443 520 <button form="index" name="file" value="$keyboard_config" data-icon="edit">$(_ 'Edit')</button>
al@419 521 <br/>
pascal@142 522 EOT
pascal@142 523 fi
al@419 524 cat <<EOT
al@419 525 <form>
al@443 526 $(_ 'Available keymaps:')
al@419 527 <select name="gen_keymap">
al@419 528 $(list_keymaps)
al@419 529 </select>
al@443 530 <button type="submit" data-icon="ok">$(_ 'Activate')</button>
al@419 531 </form>
al@419 532 </div>
al@312 533 </section>
pascal@141 534
al@419 535
al@312 536 <section>
al@443 537 <header>$(_ 'Panel configuration')</header>
al@419 538 <div>
al@419 539 <form class="wide">
al@443 540 <fieldset><legend>$(_ 'Style:')</legend>
al@419 541 <select name="style">$(list_styles)</select>
al@443 542 <button data-icon="ok">$(_ 'Activate')</button>
al@419 543 </fieldset>
al@303 544
al@443 545 <fieldset><legend>$(_ 'Panel password:')</legend>
al@419 546 <input type="password" name="panel_pass"/>
al@443 547 <button data-icon="ok">$(_ 'Change')</button>
al@419 548 </fieldset>
al@419 549 </form>
al@419 550
al@443 551 <fieldset><legend>$(_ 'Configuration files:')</legend>
al@443 552 <button form="index" name="file" value="$CONFIG" data-icon="edit">$(_ 'Panel')</button>
al@443 553 <button form="index" name="file" value="$HTTPD_CONF" data-icon="edit">$(_ 'Server')</button>
al@419 554 </fieldset>
al@419 555
al@443 556 <p>$(_ 'TazPanel provides a debugging mode and page:')
pascal@441 557 <a href="index.cgi?debug">debug</a>
pankso@110 558 </p>
al@419 559 </div>
al@312 560 </section>
pankso@42 561 EOT
pankso@110 562 ;;
pankso@110 563 esac
pankso@42 564
pankso@42 565 xhtml_footer
pankso@42 566 exit 0