tazpanel annotate hardware.cgi @ rev 473

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