tazpanel annotate settings.cgi @ rev 470

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