tazpanel annotate settings.cgi @ rev 406

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