tazpanel annotate hardware.cgi @ rev 456

boot.cgi: ISO mine: "table"izing input form.
author Aleksej Bobylev <al.bobylev@gmail.com>
date Mon Apr 13 01:44:08 2015 +0300 (2015-04-13)
parents b0146d791379
children aa42490e9679
rev   line source
pankso@46 1 #!/bin/sh
pankso@46 2 #
pankso@46 3 # Hardware part of TazPanel - Devices, drivers, printing
pankso@46 4 #
al@419 5 # Copyright (C) 2011-2015 SliTaz GNU/Linux - BSD License
pankso@46 6 #
pankso@46 7
pankso@46 8 # Common functions from libtazpanel
pankso@46 9 . lib/libtazpanel
pankso@46 10 get_config
pascal@81 11 header
pankso@46 12
al@443 13 TITLE=$(_ 'TazPanel - Hardware')
pankso@46 14
paul@385 15 # Call an optional module
al@426 16 lib() {
pascal@373 17 module=lib/$1
pascal@373 18 shift
pascal@373 19 [ -s $module ] && . $module "$@"
pascal@373 20 }
pascal@373 21
pascal@431 22 disk_info() {
pascal@431 23 fdisk -l | fgrep Disk | while read a b c; do
pascal@431 24 d=${b#/dev/}
pascal@431 25 d="/sys/block/${d%:}/device"
pascal@431 26 [ -d $d ] && echo "$a $b $c, $(cat $d/vendor) $(cat $d/model)"
pascal@431 27 done 2> /dev/null | sed 's/ */ /g'
pascal@431 28 }
al@419 29
al@426 30 lsusb_table() {
al@419 31 cat <<EOT
al@419 32 <table class="wide zebra">
al@426 33 <thead>
al@426 34 <tr>
al@443 35 <td>$(_ 'Bus')</td>
al@443 36 <td>$(_ 'Device')</td>
al@443 37 <td>$(_ 'ID')</td>
al@443 38 <td>$(_ 'Name')</td>
al@426 39 </tr>
al@426 40 </thead>
al@363 41 <tbody>
al@363 42 EOT
al@363 43 lsusb | sed 's|^Bus \([0-9]*\)|<tr><td>\1</td>|;
al@363 44 s|</td> Device \([0-9]*\):|</td><td>\1</td>|;
al@363 45 s|</td> ID \([^:]*:[^ ]*\)|</td><td><a href="?lsusb=\1">\1</a></td>|;
al@363 46 s| |<td>|2;
al@363 47 s|.*$|\0</td></tr>|'
al@363 48 echo "</tbody></table>"
al@363 49 }
al@363 50
al@419 51
al@426 52 lspci_table() {
al@419 53 cat <<EOT
al@419 54 <table class="wide zebra">
al@363 55 <thead><tr><td>Slot</td><td>Device</td><td>Name</td></thead>
al@363 56 <tbody>
al@363 57 EOT
al@363 58 lspci | sed 's| |</td><td>|;
al@363 59 s|: |</td><td>|;
al@363 60 s|^\([^<]*\)|<a href="?lspci=\1">\1</a>|;
al@363 61 s|^.*$|<tr><td>\0</td></tr>|'
al@363 62 echo "</tbody></table>"
al@363 63 }
al@363 64
al@426 65
pankso@46 66 #
pankso@46 67 # Commands
pankso@46 68 #
pankso@46 69
pascal@81 70 case " $(GET) " in
pascal@81 71 *\ print\ *)
al@303 72 xhtml_header
al@419 73 echo "<h2>TODO</h2>"
al@419 74 ;;
al@419 75
al@419 76
psychomaniak@407 77 *\ tazx\ *)
psychomaniak@407 78 xhtml_header
al@419 79 cat <<EOT
psychomaniak@407 80 <pre>$(tazx auto)</pre>
psychomaniak@407 81 EOT
psychomaniak@407 82 ;;
al@419 83
al@419 84
pankso@242 85 *\ detect\ *)
pankso@242 86 # Front end for Tazhw
pankso@242 87 # TODO: Add button to detect webcam, etc. Like in tazhw box.
pankso@242 88 xhtml_header
al@419 89 cat <<EOT
al@443 90 <h2>$(_ 'Detect hardware')</h2>
al@443 91 <p>$(_ 'Detect PCI and USB hardware')</p>
al@303 92
al@419 93 <section>
al@426 94 <pre>$(tazhw detect-pci | sed 's|^>|\&gt;|g')</pre>
al@426 95 <pre>$(tazhw detect-usb | sed 's|^>|\&gt;|g')</pre>
al@419 96 </section>
pankso@242 97 EOT
al@303 98 ;;
al@419 99
al@419 100
pascal@81 101 *\ modules\ *|*\ modinfo\ *)
pankso@46 102 xhtml_header
al@419 103 cat <<EOT
al@443 104 <h2>$(_ 'Kernel modules')</h2>
al@443 105 <p>$(_ 'Manage, search or get information about the Linux kernel modules')</p>
al@419 106
al@443 107 <form>
al@419 108 <input type="hidden" name="modules"/>
al@443 109 <input type="search" name="search" class="float-right" placeholder="$(_ 'Modules search')" results="5" autosave="modsearch" autocomplete="on"/>
al@419 110 </form>
pankso@46 111 EOT
pankso@66 112 # Request may be modinfo output that we want in the page itself
al@303 113 get_modinfo="$(GET modinfo)"
al@303 114 if [ -n "$get_modinfo" ]; then
al@419 115 cat <<EOT
al@419 116 <section>
al@443 117 <header>$(_ 'Detailed information for module: %s' $get_modinfo)</header>
al@303 118
al@303 119 EOT
al@419 120 modinfo $get_modinfo | awk 'BEGIN{print "<table class=\"wide zebra\">"}
al@419 121 {
al@419 122 printf("<tr><td><b>%s</b></td>", $1)
al@419 123 $1=""; printf("<td>%s</td></tr>", $0)
al@419 124 }
al@419 125 END{print "</table></section>"}'
pascal@81 126 fi
al@419 127
pascal@81 128 if [ -n "$(GET modprobe)" ]; then
al@303 129 echo "<pre>$(modprobe -v $(GET modprobe))</pre>"
pascal@81 130 fi
pascal@81 131 if [ -n "$(GET rmmod)" ]; then
pascal@81 132 echo "Removing"
pascal@81 133 rmmod -w $(GET rmmod)
pascal@81 134 fi
al@303 135 get_search="$(GET search)"
al@303 136 if [ -n "$get_search" ]; then
al@443 137 _ 'Matching result(s) for: %s' $get_search
pascal@81 138 echo '<pre>'
pascal@81 139 modprobe -l | grep "$(GET search)" | while read line
pascal@81 140 do
pascal@81 141 name=$(basename $line)
pascal@81 142 mod=${name%.ko.gz}
al@443 143 echo "$(_ 'Module:') <a href='?modinfo=$mod'>$mod</a>"
pascal@81 144 done
pascal@81 145 echo '</pre>'
pascal@81 146 fi
al@419 147 cat <<EOT
al@419 148 <section>
al@426 149 <table class="zebra">
al@419 150 <thead>
al@419 151 <tr>
al@443 152 <td>$(_ 'Module')</td>
al@443 153 <td>$(_ 'Description')</td>
al@443 154 <td>$(_ 'Size')</td>
al@443 155 <td>$(_ 'Used')</td>
al@443 156 <td>$(_ 'by')</td>
al@419 157 </tr>
al@419 158 <thead>
al@419 159 <tbody>
pankso@46 160 EOT
pankso@46 161 # Get the list of modules and link to modinfo
al@419 162 lsmod | tail -n+2 | awk '{
al@419 163 gsub(",", " ", $4);
al@419 164 printf("<tr><td><a href=\"?modinfo=%s\">%s</a></td><td>", $1, $1);
al@419 165 system("modinfo -d " $1);
al@419 166 printf("</td><td>%s</td><td>%s</td><td>%s</td></tr>", $2, $3, $4);
al@419 167 }'
al@419 168 cat <<EOT
al@419 169 </thead>
al@419 170 </table>
al@419 171 </section>
pankso@46 172 EOT
al@419 173 ;;
al@419 174
al@419 175
al@363 176 *\ lsusb\ *)
al@363 177 xhtml_header
al@363 178 vidpid="$(GET lsusb)"
al@419 179 cat <<EOT
al@443 180 <h2>$(_ 'Information for USB Device %s' $vidpid)</h2>
al@419 181
al@443 182 <p>$(_ 'Detailed information about specified device.')</p>
al@419 183
al@419 184 <section>$(lsusb_table)</section>
al@426 185 EOT
al@426 186 [ "$vidpid" != 'lsusb' ] && cat <<EOT
al@419 187 <section>
al@426 188 <pre style="white-space: pre-wrap">$(lsusb -vd $vidpid | syntax_highlighter lsusb)</pre>
al@419 189 </section>
al@363 190 EOT
al@363 191 ;;
al@419 192
al@419 193
al@363 194 *\ lspci\ *)
al@363 195 xhtml_header
al@363 196 slot="$(GET lspci)"
al@419 197 cat <<EOT
al@443 198 <h2>$(_ 'Information for PCI Device %s' $slot)</h2>
al@419 199
al@443 200 <p>$(_ 'Detailed information about specified device.')</p>
al@419 201
al@419 202 <section>$(lspci_table)</section>
al@426 203 EOT
al@426 204 [ "$slot" != 'lspci' ] && cat <<EOT
al@419 205 <section>
al@426 206 <pre style="white-space: pre-wrap">$(lspci -vs $slot | syntax_highlighter lspci)</pre>
al@419 207 </section>
al@363 208 EOT
al@363 209 ;;
al@419 210
al@419 211
pankso@66 212 *)
pascal@217 213 [ -n "$(GET brightness)" ] &&
al@426 214 echo -n $(GET brightness) > /sys/devices/virtual/backlight/$(GET dev)/brightness
al@292 215
pankso@66 216 #
pankso@66 217 # Default to summary with mounted filesystem, loaded modules
pankso@66 218 #
pankso@66 219 xhtml_header
al@419 220 cat <<EOT
al@443 221 <h2>$(_ 'Drivers &amp; Devices')</h2>
al@443 222 <p>$(_ 'Manage your computer hardware')</p>
al@419 223
al@419 224 <form><!--
al@443 225 --><button name="modules" data-icon="modules">$(_ 'Kernel modules')</button><!--
al@443 226 --><button name="detect" data-icon="detect" data-root>$(_ 'Detect PCI/USB')</button><!--
al@443 227 --><button name="tazx" data-icon="tazx" data-root>$(_ 'Auto-install Xorg video driver')</button><!--
al@437 228 --></form>
pascal@219 229
pascal@217 230 EOT
al@419 231
al@419 232
al@419 233 # Battery state
al@419 234 if [ -n "$(ls /proc/acpi/battery/*/info 2>/dev/null)" ]; then
al@419 235 cat <<EOT
al@419 236 <section>
al@443 237 <header>$(_ 'Battery')</header>
al@419 238 <div>
al@419 239 <table class="wide">
al@419 240 EOT
pascal@219 241 for dev in /proc/acpi/battery/*; do
pascal@219 242 grep ^present $dev/info | grep -q yes || continue
al@419 243 design=$(sed '/design capacity:/!d; s/[^0-9]*\([0-9]*\).*/\1/' < $dev/info)
al@419 244 remain=$(sed '/remaining capacity/!d; s/[^0-9]*\([0-9]*\).*/\1/' < $dev/state)
al@419 245 rate=$(sed '/present rate/!d; s/[^0-9]*\([0-9]*\).*/\1/' < $dev/state)
al@419 246 full=$(sed '/last full capacity/!d; s/[^0-9]*\([0-9]*\).*/\1/' < $dev/info)
al@303 247 warning=$(sed '/design capacity warning/!d;s/[^0-9]*\([0-9]*\).*/\1/' < $dev/info)
al@419 248 low=$(sed '/design capacity low/!d; s/[^0-9]*\([0-9]*\).*/\1/' < $dev/info)
al@419 249 state=$(sed '/charging state/!d; s/\([^:]*:[ ]\+\)\([a-z]\+\)/\2/' < $dev/state)
al@303 250
al@303 251 rempct=$(( $remain * 100 / $full ))
al@419 252 cat <<EOT
al@419 253 <tr>
al@443 254 <td><span data-icon="battery">$(_ 'Battery')</span>
al@419 255 $(grep "^battery type" $dev/info | sed 's/.*: *//')
al@419 256 $(grep "^design capacity:" $dev/info | sed 's/.*: *//') </td>
al@443 257 <td>$(_ 'health') $(( (100*$full)/$design))%</td>
al@419 258 <td class="meter"><meter min="0" max="$full" value="$remain" low="$low"
al@419 259 high="$warning" optimum="$full"></meter>
al@419 260 <span>
pascal@219 261 EOT
al@303 262 case "$state" in
al@303 263 "discharging")
al@303 264 remtime=$(( $remain * 60 / $rate ))
al@303 265 remtimef=$(printf "%d:%02d" $(($remtime/60)) $(($remtime%60)))
al@443 266 _ 'Discharging %d%% - %s' $rempct $remtimef ;;
al@303 267 "charging")
al@303 268 remtime=$(( ($full - $remain) * 60 / $rate ))
al@303 269 remtimef=$(printf "%d:%02d" $(($remtime/60)) $(($remtime%60)))
al@443 270 eval_gettext 'Charging %d%% - %s' $rempct $remtimef ;;
al@303 271 "charged")
al@443 272 _ 'Charged 100%' ;;
al@303 273 esac
al@419 274 cat <<EOT
al@419 275
al@419 276 </span>
al@419 277 </td>
al@419 278 </tr>
al@419 279 EOT
pascal@219 280 done
al@419 281 cat <<EOT
al@419 282 </table>
al@419 283 </div>
al@419 284 </section>
al@419 285 EOT
pascal@219 286 fi
al@303 287
al@419 288
al@419 289 # Thermal sensors
al@419 290 if [ -n "$(ls /sys/devices/virtual/thermal/*/temp 2>/dev/null)" ]; then
al@443 291 echo "<p><span data-icon=\"temperature\">$(_ 'Temperature:')</span>"
pascal@262 292 for temp in /sys/devices/virtual/thermal/*/temp; do
al@419 293 awk '{ print $1/1000 "℃" }' < $temp
pascal@219 294 done
al@303 295 echo '</p>'
pascal@219 296 fi
al@303 297
al@419 298
al@419 299 # Brightness
al@419 300 if [ -n "$(ls /sys/devices/virtual/backlight/*/brightness 2>/dev/null)" ]; then
al@419 301 echo '<form>'
al@419 302 for dev in /sys/devices/virtual/backlight/*/brightness; do
pascal@262 303 name=$(echo $dev | sed 's|.*/backlight/\([^/]*\).*|\1|')
pascal@217 304 cat <<EOT
al@419 305 <input type="hidden" name="dev" value="$name"/>
al@443 306 <span data-icon="brightness">$(_ 'Brightness')</span> \
pascal@263 307 $(sed 's/.*\.//;s/_*$//' < /sys/devices/virtual/backlight/$name/device/path):
al@419 308 <select name="brightness" onchange="submit();">
pascal@217 309 EOT
pascal@262 310 max=$(cat /sys/devices/virtual/backlight/$name/max_brightness)
pascal@262 311 for i in $(seq 0 $max); do
pascal@262 312 echo -n "<option value=\"$i\""
pascal@262 313 [ $i -eq $(cat /sys/devices/virtual/backlight/$name/actual_brightness) ] &&
pascal@262 314 echo -n " selected=\"selected\""
pascal@262 315 echo "> $(( (($i + 1) * 100) / ($max + 1) ))% </option>"
pascal@262 316 done
al@419 317 echo '</select>'
pascal@217 318 done
al@419 319 echo '</form>'
pascal@217 320 fi
pankso@152 321
al@363 322
al@419 323 cat <<EOT
al@419 324 <section>
al@419 325 <form action="#mount" class="wide">
al@443 326 <header id="disk">$(_ 'Filesystem usage statistics')</header>
al@419 327 <div>
pascal@431 328 <pre>$(disk_info)</pre>
al@419 329 </div>
pankso@66 330 EOT
al@303 331
al@303 332
pankso@153 333 #
pascal@376 334 # Loop device management actions
pascal@376 335 #
pascal@376 336 device=$(GET loopdev)
pascal@376 337 lib crypto $device
pascal@376 338 case "$device" in
pascal@425 339 /dev/*loop*)
pascal@376 340 set -- $(losetup | grep ^$device:)
pascal@376 341 [ -n "$3" ] && losetup -d $device
pascal@376 342 ro=""
pascal@376 343 [ -n "$(GET readonly)" ] && ro="-r"
pascal@376 344 file="$(GET backingfile)"
pascal@376 345 [ -n "$file" ] && losetup -o $(GET offset) $ro $device $file
pascal@376 346 esac
al@419 347
al@419 348
pascal@376 349 #
al@303 350 # Disk stats and management (mount, umount, check)
pankso@153 351 #
pascal@344 352 device=$(GET device)
pascal@373 353 lib crypto $device
pascal@344 354 case "$device" in
pascal@344 355 *[\;\`\&\|\$]*) ;;
pascal@344 356 mount\ *)
pascal@375 357 ro=""
pascal@375 358 [ -n "$(GET readonly)" ] && ro="-r"
pascal@389 359 mntdir="$(GET mountpoint)"
pascal@389 360 [ -d "$mntdir" ] || mkdir -p "$mntdir"
pascal@389 361 $device $ro "$mntdir";;
pascal@344 362 umount\ *|swapon\ *|swapoff\ *)
pascal@344 363 $device ;;
pascal@344 364 esac
al@419 365 cat <<EOT
al@419 366 <table id="mount" class="zebra wide center">
al@303 367 EOT
pankso@153 368 df_thead
al@303 369 echo '<tbody>'
al@426 370 for fs in $(blkid | sort | sed 's/:.*//'); do
pascal@373 371 set -- $(df -h | grep "^$fs ")
pascal@343 372 size=$2
pascal@343 373 used=$3
pascal@343 374 av=$4
pascal@375 375 grep "^$fs " /proc/mounts | grep -q "[, ]ro[, ]" &&
pascal@375 376 av="<del>$av</del>"
pascal@343 377 pct=$5
pascal@343 378 mp=$6
al@419 379
al@419 380 # action
pascal@344 381 action="mount"
pascal@344 382 [ -n "$mp" ] && action="umount"
pascal@431 383 type=$(blkid $fs | sed '/TYPE=/!d;s/.* TYPE="\([^"]*\).*/\1/')
pascal@344 384 [ "$type" == "swap" ] && action="swapon"
pascal@344 385 if grep -q "^$fs " /proc/swaps; then
pascal@344 386 action="swapoff"
pascal@344 387 set -- $(grep "^$fs " /proc/swaps)
pascal@364 388 size=$(blk2h $(($3*2)))
pascal@364 389 used=$(blk2h $(($4*2)))
pascal@364 390 av=$(blk2h $((2*($3-$4))))
pascal@344 391 pct=$(((100*$4)/$3))%
pascal@344 392 mp=swap
pascal@344 393 fi
al@419 394
al@419 395 # size
pascal@364 396 [ -z "$size" ] &&
pascal@364 397 size="$(blk2h $(cat /sys/block/${fs#/dev/}/size /sys/block/*/${fs#/dev/}/size))"
al@419 398
al@419 399 # image
al@419 400 disktype="hdd"
al@419 401 case "$(cat /sys/block/${fs#/dev/}/removable 2>/dev/null ||
al@419 402 cat /sys/block/${fs:5:3}/removable 2>/dev/null)" in
al@419 403 1) disktype="removable" ;;
pascal@373 404 esac
al@419 405 case "$(cat /sys/block/${fs#/dev/}/ro 2>/dev/null ||
al@419 406 cat /sys/block/${fs:5:3}/ro 2>/dev/null)" in
al@419 407 1) disktype="cd" ;;
pascal@373 408 esac
al@419 409
al@419 410 cat <<EOT
al@419 411 <tr>
al@419 412 <td><input type="radio" name="device" value="$action $fs" id="${fs#/dev/}"/><!--
al@419 413 --><label for="${fs#/dev/}" data-icon="$disktype">&thinsp;${fs#/dev/}</label></td>
al@419 414 <td>$(blkid $fs | sed '/LABEL=/!d;s/.*LABEL="\([^"]*\).*/\1/')</td>
al@419 415 <td>$type</td>
al@419 416 <td>$size</td>
al@419 417 <td>$av</td>
pascal@343 418 EOT
pascal@343 419 if [ -n "$pct" ]; then
al@419 420 cat <<EOT
al@419 421 <td class="meter"><meter min="0" max="100" value="${pct%%%}" low="70"
al@419 422 high="90" optimum="10"></meter>
al@419 423 <span>$used - $pct</span>
al@419 424 </td>
pascal@343 425 EOT
pascal@343 426 else
al@419 427 cat <<EOT
al@419 428 <td> </td>
pascal@343 429 EOT
pascal@343 430 fi
al@419 431 cat <<EOT
al@419 432 <td>$mp</td>
al@419 433 <td>$(blkid $fs | sed '/UUID=/!d;s/.*UUID="\([^"]*\).*/\1/')</td>
al@419 434 </tr>
pankso@153 435 EOT
pankso@153 436 done
al@419 437 cat <<EOT
al@419 438 </tbody>
al@419 439 </table>
pascal@433 440 EOT
pascal@433 441 [ "$REMOTE_USER" == "root" ] && cat <<EOT
al@419 442 $(lib crypto input)
al@363 443
al@419 444 <footer>
al@419 445 <button type="submit">mount / umount</button> -
al@443 446 $(_ 'new mount point:') <input type="text" name="mountpoint" value="/media/usbdisk"/> -
al@443 447 <input type="checkbox" name="readonly" id="ro"><label for="ro">&thinsp;$(_ 'read-only')</label>
al@419 448 </footer>
pascal@433 449 EOT
pascal@433 450 cat <<EOT
al@419 451 </form>
al@419 452 </section>
al@363 453 EOT
al@363 454
al@419 455
al@419 456 #
al@419 457 # /etc/fstab
al@419 458 #
al@419 459 cat <<EOT
al@419 460 <section>
al@426 461 <header>
al@443 462 $(_ 'Filesystems table')
pascal@436 463 EOT
pascal@436 464 [ -w /etc/fstab ] && cat <<EOT
al@426 465 <form action="index.cgi">
al@426 466 <input type="hidden" name="file" value="/etc/fstab"/>
al@443 467 <button name="action" value="edit" data-icon="edit">$(_ 'Edit')</button>
al@426 468 </form>
pascal@436 469 EOT
pascal@436 470 cat <<EOT
al@426 471 </header>
al@419 472 <table class="wide zebra center">
al@419 473 <thead>
al@419 474 <tr>
al@443 475 <td>$(_ 'Disk')</td>
al@443 476 <td>$(_ 'Mount point')</td>
al@443 477 <td>$(_ 'Type')</td>
al@443 478 <td>$(_ 'Options')</td>
al@443 479 <td>$(_ 'Freq')</td>
al@443 480 <td>$(_ 'Pass')</td>
al@419 481 </tr>
al@419 482 </thead>
al@419 483 <tbody>
al@419 484 EOT
al@419 485
al@419 486 grep -v '^#' /etc/fstab | awk '{
al@419 487 print "<tr><td>" $1 "</td><td>" $2 "</td><td>" $3 "</td><td>" $4
al@419 488 print "</td><td>" $5 "</td><td>" $6 "</td></tr>"
al@419 489 }
al@363 490 END{print "</tbody></table>"}'
al@363 491
al@419 492 cat <<EOT
al@419 493 </section>
al@419 494 EOT
al@363 495
al@363 496
al@419 497 #
al@419 498 # Loop device management GUI
al@419 499 #
al@419 500 cat <<EOT
al@419 501 <section>
al@443 502 <header>$(_ 'Loop devices')</header>
al@419 503
al@419 504 <form action="#loop" class="wide">
pascal@429 505 <div class="scroll">
pascal@429 506 <table id="loop" class="wide zebra scroll">
al@419 507 <thead>
al@419 508 <tr>
al@443 509 <td>$(_ 'Device')</td>
al@443 510 <td>$(_ 'Backing file')</td>
al@443 511 <td>$(_ 'Access')</td>
al@443 512 <td>$(_ 'Offset')</td>
al@419 513 </tr>
al@419 514 </thead>
al@419 515 <tbody>
pascal@373 516 EOT
pascal@425 517 for devloop in $(ls /dev/*loop[0-9]*); do
al@419 518 loop="${devloop#/dev/}"
al@419 519 case "$(cat /sys/block/$loop/ro 2>/dev/null)" in
al@443 520 0) ro="$(_ "read/write")" ;;
al@443 521 1) ro="$(_ "read only")" ;;
pascal@373 522 *) ro="" ;;
pascal@373 523 esac
al@419 524 set -- $(losetup | grep ^$devloop:) ${ro// /&nbsp;}
al@419 525 cat <<EOT
al@419 526 <tr><td><input type="radio" name="loopdev" value="$devloop" id="$loop"/><!--
al@419 527 --><label for="$loop" data-icon="loopback">$loop</label></td>
al@419 528 <td>$3</td><td align="center">$4</td><td align="right">$2</td>
al@419 529 </tr>
pascal@373 530 EOT
pascal@373 531 done
al@419 532 cat <<EOT
al@419 533 </tbody>
al@419 534 </table>
pascal@429 535 </div>
al@419 536
pascal@373 537 $(lib crypto input)
al@419 538
al@419 539 <footer>
al@443 540 <button type="submit" data-icon="ok">$(_ 'Setup')</button> -
al@443 541 $(_ 'new backing file:') <input type="text" name="backingfile"/> -
al@443 542 $(_ 'offset in bytes:') <input type="text" name="offset" value="0" size="8"/> -
al@443 543 <input type="checkbox" name="readonly" id="ro"/><label for="ro">$(_ 'read only')</label>
al@419 544 </footer>
al@419 545 </form>
al@419 546 </section>
pascal@373 547 EOT
pascal@373 548
al@419 549
al@419 550 #
al@419 551 # System memory
al@419 552 #
al@419 553 mem_total=$(free -m | awk '$1 ~ "M" {print $2}')
al@419 554 mem_used=$((100 * $(free -m | awk '$1 ~ "+" {print $3}') / mem_total))
al@419 555 mem_buff=$((100 * $(free -m | awk '$1 ~ "M" {print $6}') / mem_total))
al@419 556 mem_free=$((100 - mem_used - mem_buff))
al@419 557
al@419 558 cat <<EOT
al@419 559 <section>
al@443 560 <header>$(_ 'System memory')</header>
al@419 561
al@419 562 <div class="sysmem"><!--
al@443 563 --><span class="sysmem_used" style="width: ${mem_used}%" title="$(_ 'Used')" ><span>${mem_used}%</span></span><!--
al@419 564 EOT
al@419 565 [ $mem_buff != 0 ] && cat <<EOT
al@443 566 --><span class="sysmem_buff" style="width: ${mem_buff}%" title="$(_ 'Buffers')"><span>${mem_buff}%</span></span><!--
al@419 567 EOT
al@419 568 cat <<EOT
al@443 569 --><span class="sysmem_free" style="width: ${mem_free}%" title="$(_ 'Free')" ><span>${mem_free}%</span></span><!--
al@419 570 --></div>
al@419 571
al@419 572 <table class="wide zebra center">
al@419 573 <thead>
al@419 574 <tr>
al@419 575 <td>&nbsp;</td>
al@419 576 <td>total</td>
al@419 577 <td>used</td>
al@419 578 <td>free</td>
al@419 579 <td>shared</td>
al@419 580 <td>buffers</td>
al@419 581 </tr>
al@419 582 </thead>
al@419 583 <tbody>
al@303 584 EOT
al@303 585
al@419 586 free -m | awk '
al@419 587 $1 ~ "M" {print "<tr><td>"$1"</td><td>"$2"</td><td>"$3"</td><td>"$4"</td><td>"$5"</td><td>"$6"</td></tr>"}
al@419 588 $1 ~ "+" {print "<tr><td>"$1 $2"</td><td></td><td>"$3"</td><td>"$4"</td><td></td><td></td></tr>"}
al@419 589 $1 ~ "S" {print "<tr><td>"$1"</td><td>"$2"</td><td>"$3"</td><td>"$4"</td><td></td><td></td></tr>"}'
al@303 590
al@419 591 cat <<EOT
al@419 592 </tbody>
al@419 593 </table>
al@419 594 </section>
al@419 595 EOT
al@303 596
al@419 597
al@419 598 #
al@419 599 # lspci and lsusb summary tables
al@419 600 #
al@419 601 cat <<EOT
al@419 602 <section>
al@419 603 <header>lspci</header>
al@419 604 $(lspci_table)
al@419 605 </section>
al@419 606
al@419 607
al@419 608 <section>
al@419 609 <header>lsusb</header>
al@419 610 $(lsusb_table)
al@419 611 </section>
al@303 612 EOT
al@419 613 ;;
pankso@46 614 esac
pankso@46 615
pankso@46 616 xhtml_footer
pankso@46 617 exit 0