tazpanel annotate hardware.cgi @ rev 363

hardware.cgi: display lspci and lsusb as table, with separate page for every item
author Aleksej Bobylev <al.bobylev@gmail.com>
date Sun Jun 23 16:55:26 2013 +0300 (2013-06-23)
parents 4a0422a30ff6
children 4a8f56bb08cb
rev   line source
pankso@46 1 #!/bin/sh
pankso@46 2 #
pankso@46 3 # Hardware part of TazPanel - Devices, drivers, printing
pankso@46 4 #
pankso@112 5 # Copyright (C) 2011 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@292 13 TITLE=$(gettext 'TazPanel - Hardware')
pankso@46 14
pascal@344 15 ktoh()
pascal@344 16 {
pascal@344 17 k=$1
pascal@344 18 if [ $k -lt 1024 ]; then
al@363 19 eval_gettext '${k}K'
pascal@344 20 return
pascal@344 21 fi
pascal@344 22 k=$((($k+512)/1024))
pascal@344 23 if [ $k -lt 1024 ]; then
al@363 24 eval_gettext '${k}M'
pascal@344 25 return
pascal@344 26 fi
pascal@344 27 k=$((($k+512)/1024))
pascal@344 28 if [ $k -lt 1024 ]; then
al@363 29 eval_gettext '${k}G'
pascal@344 30 return
pascal@344 31 fi
pascal@344 32 k=$((($k+512)/1024))
al@363 33 eval_gettext '${k}T'
pascal@344 34 }
al@363 35
al@363 36 lsusb_table()
al@363 37 {
al@363 38 cat << EOT
al@363 39 <table class="zebra outbox">
al@363 40 <thead><tr><td>Bus</td><td>Device</td><td>ID</td><td>Name</td></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@363 51 lspci_table()
al@363 52 {
al@363 53 cat << EOT
al@363 54 <table class="zebra outbox">
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
pankso@46 65 #
pankso@46 66 # Commands
pankso@46 67 #
pankso@46 68
pascal@81 69 case " $(GET) " in
pascal@81 70 *\ print\ *)
al@303 71 xhtml_header
al@303 72 echo "<h2>TODO</h2>" ;;
pankso@242 73 *\ detect\ *)
pankso@242 74 # Front end for Tazhw
pankso@242 75 # TODO: Add button to detect webcam, etc. Like in tazhw box.
pankso@242 76 xhtml_header
al@303 77 cat << EOT
pankso@242 78 <div id="wrapper">
al@303 79 <h2>$(gettext 'Detect hardware')</h2>
al@303 80 <p>$(gettext 'Detect PCI and USB hardware')</p>
pankso@242 81 </div>
al@303 82
al@303 83 <pre>$(tazhw detect-pci | syntax_highlighter sh)</pre>
al@303 84
al@303 85 <pre>$(tazhw detect-usb | syntax_highlighter sh)</pre>
pankso@242 86 EOT
al@303 87 ;;
pascal@81 88 *\ modules\ *|*\ modinfo\ *)
pankso@46 89 xhtml_header
pankso@46 90 cat << EOT
pankso@46 91 <div id="wrapper">
al@303 92 <h2>$(gettext 'Kernel modules')</h2>
al@303 93 <div class="float-right">
al@303 94 <form method="get" action="$SCRIPT_NAME">
al@303 95 <input type="hidden" name="modules" />
al@303 96 <input type="search" placeholder="$(gettext 'Modules search')" name="search" />
al@303 97 </form>
al@303 98 </div>
al@303 99 <p>$(gettext 'Manage, search or get information about the Linux kernel modules')</p>
pankso@46 100 </div>
pankso@46 101 EOT
pankso@66 102 # Request may be modinfo output that we want in the page itself
al@303 103 get_modinfo="$(GET modinfo)"
al@303 104 if [ -n "$get_modinfo" ]; then
al@303 105 cat << EOT
al@303 106 <strong>$(eval_gettext 'Detailed information for module: $get_modinfo')</strong>
al@303 107
al@303 108 <pre>$(modinfo $get_modinfo)</pre>
al@303 109 EOT
pascal@81 110 fi
pascal@81 111 if [ -n "$(GET modprobe)" ]; then
al@303 112 echo "<pre>$(modprobe -v $(GET modprobe))</pre>"
pascal@81 113 fi
pascal@81 114 if [ -n "$(GET rmmod)" ]; then
pascal@81 115 echo "Removing"
pascal@81 116 rmmod -w $(GET rmmod)
pascal@81 117 fi
al@303 118 get_search="$(GET search)"
al@303 119 if [ -n "$get_search" ]; then
al@303 120 eval_gettext 'Matching result(s) for: $get_search'
pascal@81 121 echo '<pre>'
pascal@81 122 modprobe -l | grep "$(GET search)" | while read line
pascal@81 123 do
pascal@81 124 name=$(basename $line)
pascal@81 125 mod=${name%.ko.gz}
al@303 126 echo "$(gettext 'Module:') <a href='$SCRIPT_NAME?modinfo=$mod'>$mod</a>"
pascal@81 127 done
pascal@81 128 echo '</pre>'
pascal@81 129 fi
pankso@46 130 cat << EOT
al@303 131 $(table_start)
pankso@46 132 <tr class="thead">
al@303 133 <td>$(gettext 'Module')</td>
al@303 134 <td>$(gettext 'Size')</td>
al@303 135 <td>$(gettext 'Used')</td>
al@303 136 <td>$(gettext 'by')</td>
pankso@46 137 </tr>
pankso@46 138 EOT
pankso@46 139 # Get the list of modules and link to modinfo
pankso@46 140 lsmod | grep ^[a-z] | while read MOD SIZE USED BY
pankso@46 141 do
pankso@46 142 cat << EOT
pankso@46 143 <tr>
pankso@46 144 <td><a href="$SCRIPT_NAME?modinfo=$MOD">$MOD</a></td>
pankso@46 145 <td>$SIZE</td>
pankso@46 146 <td>$USED</td>
al@303 147 <td>$(echo $BY | sed s/","/" "/g)</td>
pankso@46 148 </tr>
pankso@46 149 EOT
pankso@46 150 done
pankso@66 151 table_end ;;
al@363 152 *\ lsusb\ *)
al@363 153 xhtml_header
al@363 154 vidpid="$(GET lsusb)"
al@363 155 cat << EOT
al@363 156 <div id="wrapper">
al@363 157 <h2>$(eval_gettext 'Information for USB Device $vidpid')</h2>
al@363 158 <p>$(gettext 'Detailed information about specified device.')</p>
al@363 159 EOT
al@363 160 lsusb_table
al@363 161 cat << EOT
al@363 162 </div>
al@363 163 <pre>$(lsusb -vd $vidpid | syntax_highlighter lsusb)</pre>
al@363 164 EOT
al@363 165 ;;
al@363 166 *\ lspci\ *)
al@363 167 xhtml_header
al@363 168 slot="$(GET lspci)"
al@363 169 cat << EOT
al@363 170 <div id="wrapper">
al@363 171 <h2>$(eval_gettext 'Information for PCI Device $slot')</h2>
al@363 172 <p>$(gettext 'Detailed information about specified device.')</p>
al@363 173 EOT
al@363 174 lspci_table
al@363 175 cat << EOT
al@363 176 </div>
al@363 177 <pre>$(lspci -vs $slot | syntax_highlighter lspci)</pre>
al@363 178 EOT
al@363 179 ;;
pankso@66 180 *)
pascal@217 181 [ -n "$(GET brightness)" ] &&
pascal@262 182 echo -n $(GET brightness) > /sys/devices/virtual/backlight/$(GET dev)/brightness
al@292 183
pankso@66 184 #
pankso@66 185 # Default to summary with mounted filesystem, loaded modules
pankso@66 186 #
pankso@66 187 xhtml_header
pankso@66 188 cat << EOT
pankso@66 189 <div id="wrapper">
al@303 190 <h2>$(gettext 'Drivers &amp; Devices')</h2>
al@303 191 <p>$(gettext 'Manage your computer hardware')</p>
pascal@219 192 </div>
pascal@219 193 <div>
pascal@219 194 <a class="button" href="$SCRIPT_NAME?modules">
al@303 195 <img src="$IMAGES/tux.png" />$(gettext 'Kernel modules')</a>
pankso@242 196 <a class="button" href="$SCRIPT_NAME?detect">
al@303 197 <img src="$IMAGES/monitor.png" />$(gettext 'Detect PCI/USB')</a>
pascal@219 198 </div>
pascal@219 199
pascal@217 200 EOT
pascal@219 201 if [ -n "$(ls /proc/acpi/battery/*/info 2> /dev/null)" ]; then
pascal@219 202 echo "<table>"
pascal@219 203 for dev in /proc/acpi/battery/*; do
pascal@219 204 grep ^present $dev/info | grep -q yes || continue
pascal@219 205 design=$(sed '/design capacity:/!d;s/[^0-9]*\([0-9]*\).*/\1/' < $dev/info)
pascal@219 206 remain=$(sed '/remaining capacity/!d;s/[^0-9]*\([0-9]*\).*/\1/' < $dev/state)
pascal@219 207 rate=$(sed '/present rate/!d;s/[^0-9]*\([0-9]*\).*/\1/' < $dev/state)
pascal@219 208 full=$(sed '/last full capacity/!d;s/[^0-9]*\([0-9]*\).*/\1/' < $dev/info)
al@303 209 warning=$(sed '/design capacity warning/!d;s/[^0-9]*\([0-9]*\).*/\1/' < $dev/info)
al@303 210 low=$(sed '/design capacity low/!d;s/[^0-9]*\([0-9]*\).*/\1/' < $dev/info)
al@303 211 state=$(sed '/charging state/!d;s/\([^:]*:[ ]\+\)\([a-z]\+\)/\2/' < $dev/state)
al@303 212
al@303 213 rempct=$(( $remain * 100 / $full ))
pascal@219 214 cat << EOT
pascal@219 215 <tr>
pascal@219 216 <td><img src="$IMAGES/battery.png" />
al@303 217 $(gettext 'Battery') $(grep "^battery type" $dev/info | sed 's/.*: *//')
pascal@219 218 $(grep "^design capacity:" $dev/info | sed 's/.*: *//') </td>
al@303 219 <td>$(gettext 'health') $(( (100*$full)/$design))%</td>
al@303 220 <td class="meter"><meter min="0" max="$full" value="$remain" low="$low"
al@303 221 high="$warning" optimum="$full"></meter>
al@303 222 <span>
pascal@219 223 EOT
al@303 224 case "$state" in
al@303 225 "discharging")
al@303 226 remtime=$(( $remain * 60 / $rate ))
al@303 227 remtimef=$(printf "%d:%02d" $(($remtime/60)) $(($remtime%60)))
al@303 228 eval_gettext 'Discharging $rempct% - $remtimef' ;;
al@303 229 "charging")
al@303 230 remtime=$(( ($full - $remain) * 60 / $rate ))
al@303 231 remtimef=$(printf "%d:%02d" $(($remtime/60)) $(($remtime%60)))
al@303 232 eval_gettext 'Charging $rempct% - $remtimef' ;;
al@303 233 "charged")
al@303 234 gettext 'Charged 100%' ;;
al@303 235 esac
al@303 236 echo '</span></td></tr>'
pascal@219 237 done
pascal@219 238 echo "</table>"
pascal@219 239 fi
al@303 240
pascal@262 241 if [ -n "$(ls /sys/devices/virtual/thermal/*/temp 2> /dev/null)" ]; then
al@303 242 echo -n '<p>'; gettext 'Temperature:'
pascal@262 243 for temp in /sys/devices/virtual/thermal/*/temp; do
pascal@262 244 awk '{ print $1/1000 }' < $temp
pascal@219 245 done
al@303 246 echo '</p>'
pascal@219 247 fi
al@303 248
pascal@262 249 if [ -n "$(ls /sys/devices/virtual/backlight/*/brightness 2> /dev/null)" ]; then
pascal@217 250 cat <<EOT
pascal@217 251 <form method="get" action="$SCRIPT_NAME">
pascal@217 252 EOT
pascal@262 253 for dev in /sys/devices/virtual/backlight/*/brightness ; do
pascal@262 254 name=$(echo $dev | sed 's|.*/backlight/\([^/]*\).*|\1|')
pascal@217 255 cat <<EOT
pascal@217 256 <input type="hidden" name="dev" value="$name" />
al@303 257 $(gettext 'Brightness') \
pascal@263 258 $(sed 's/.*\.//;s/_*$//' < /sys/devices/virtual/backlight/$name/device/path):
pascal@263 259 <select name="brightness" onchange="submit();">
pascal@217 260 EOT
pascal@262 261 max=$(cat /sys/devices/virtual/backlight/$name/max_brightness)
pascal@262 262 for i in $(seq 0 $max); do
pascal@262 263 echo -n "<option value=\"$i\""
pascal@262 264 [ $i -eq $(cat /sys/devices/virtual/backlight/$name/actual_brightness) ] &&
pascal@262 265 echo -n " selected=\"selected\""
pascal@262 266 echo "> $(( (($i + 1) * 100) / ($max + 1) ))% </option>"
pascal@262 267 done
pascal@217 268 cat <<EOT
pascal@217 269 </select>
pascal@217 270 EOT
pascal@217 271 done
pascal@217 272 cat << EOT
pascal@217 273 </form>
pascal@217 274 EOT
pascal@217 275 fi
pascal@217 276 cat << EOT
pankso@152 277
al@363 278
al@363 279 <h3 id="disk">$(gettext 'Filesystem usage statistics')</h3>
al@363 280
pankso@152 281 <pre>
al@363 282 $(fdisk -l | fgrep Disk)
al@363 283 </pre>
pankso@66 284 EOT
al@303 285
al@303 286
pankso@153 287 #
al@303 288 # Disk stats and management (mount, umount, check)
pankso@153 289 #
pascal@344 290 device=$(GET device)
pascal@344 291 case "$device" in
pascal@344 292 *[\;\`\&\|\$]*) ;;
pascal@344 293 mount\ *)
pascal@344 294 $device $(GET mountpoint);;
pascal@344 295 umount\ *|swapon\ *|swapoff\ *)
pascal@344 296 $device ;;
pascal@344 297 esac
al@303 298 cat << EOT
pascal@344 299 <form method="get" action="$SCRIPT_NAME#mount">
al@363 300 <table id="mount" class="zebra outbox nowrap">
al@303 301 EOT
pankso@153 302 df_thead
al@303 303 echo '<tbody>'
pascal@343 304 blkid | sort | while read dev misc
pankso@153 305 do
pascal@343 306 fs=${dev%:}
pascal@343 307 set --
pascal@343 308 df | grep -q "^$fs " && set -- $(df -h | grep "^$fs ")
pascal@343 309 size=$2
pascal@343 310 used=$3
pascal@343 311 av=$4
pascal@343 312 pct=$5
pascal@343 313 mp=$6
pascal@344 314 action="mount"
pascal@344 315 [ -n "$mp" ] && action="umount"
pascal@344 316 type=$(blkid $fs | sed '/TYPE=/!d;s/.*TYPE="\([^"]*\).*/\1/')
pascal@344 317 [ "$type" == "swap" ] && action="swapon"
pascal@344 318 if grep -q "^$fs " /proc/swaps; then
pascal@344 319 action="swapoff"
pascal@344 320 set -- $(grep "^$fs " /proc/swaps)
pascal@344 321 size=$(ktoh $3)
pascal@344 322 used=$(ktoh $4)
pascal@344 323 av=$(ktoh $(($3-$4)))
pascal@344 324 pct=$(((100*$4)/$3))%
pascal@344 325 mp=swap
pascal@344 326 fi
pascal@343 327 cat << EOT
pankso@153 328 <tr>
pascal@344 329 <td><input type="radio" name="device" value="$action $fs" />
pascal@344 330 <img src="$IMAGES/harddisk.png" />${fs#/dev/}</td>
pascal@343 331 <td>$(blkid $fs | sed '/LABEL=/!d;s/.*LABEL="\([^"]*\).*/\1/')</td>
pascal@344 332 <td>$type</td>
pankso@153 333 <td>$size</td>
pankso@153 334 <td>$av</td>
pascal@343 335 EOT
pascal@343 336 if [ -n "$pct" ]; then
pascal@343 337 cat << EOT
al@303 338 <td class="meter"><meter min="0" max="100" value="${pct%%%}" low="70"
al@303 339 high="90" optimum="10"></meter>
al@303 340 <span>$used - $pct</span>
al@303 341 </td>
pascal@343 342 EOT
pascal@343 343 else
pascal@343 344 cat << EOT
al@363 345 <td> </td>
pascal@343 346 EOT
pascal@343 347 fi
pascal@343 348 cat << EOT
pankso@153 349 <td>$mp</td>
pascal@344 350 <td>$(blkid $fs | sed '/UUID=/!d;s/.*UUID="\([^"]*\).*/\1/')</td>
pankso@153 351 </tr>
pankso@153 352 EOT
pankso@153 353 done
al@303 354 cat << EOT
al@303 355 </tbody>
al@303 356 </table>
pascal@344 357 <input type="submit" value="mount / umount" /> -
pascal@344 358 new mount point <input type=text" name="mountpoint" value="/media/usbdisk" />
pascal@344 359 </form>
al@363 360
al@363 361
pascal@345 362 <h3>$(gettext 'Filesystems table')</h3>
al@363 363 EOT
al@363 364
al@363 365 grep -v '^#' /etc/fstab | awk 'BEGIN{print "<table class=\"zebra outbox\">\
al@363 366 <thead><tr><td>spec</td><td>file</td><td>vfstype</td><td>mntops</td><td>\
al@363 367 freq</td><td>passno</td></thead><tbody>"}{print "<tr><td>"$1"</td><td>"$2\
al@363 368 "</td><td>"$3"</td><td>"$4"</td><td>"$5"</td><td>"$6"</td></tr>"}
al@363 369 END{print "</tbody></table>"}'
al@363 370
al@363 371 cat << EOT
pascal@345 372 <a class="button" href="index.cgi?file=/etc/fstab&action=edit">
pascal@345 373 <img src="$IMAGES/edit.png" />$(gettext 'Manual Edit')</a>
al@363 374
al@363 375
al@363 376 <h3>$(gettext 'System memory')</h3>
al@303 377 EOT
al@303 378
al@363 379 echo "<table class=\"zebra outbox\"><thead><tr><td>&nbsp;</td><td>total</td>\
al@363 380 <td>used</td><td>free</td><td>shared</td><td>buffers</td></tr></thead><tbody>"
al@363 381 freem=$(free -m)
al@363 382 echo "$freem" | grep Mem: | awk '{print "<tr><td>"$1"</td><td>"$2"</td><td>"$3\
al@363 383 "</td><td>"$4"</td><td>"$5"</td><td>"$6"</td></tr>"}'
al@363 384 echo "$freem" | grep buffers: | awk '{print "<tr><td>"$1 $2"</td><td>&nbsp;</td>\
al@363 385 <td>"$3"</td><td>"$4"</td><td>&nbsp;</td><td>&nbsp;</td></tr>"}'
al@363 386 echo "$freem" | grep Swap: | awk '{print "<tr><td>"$1"</td><td>"$2"</td><td>"$3\
al@363 387 "</td><td>"$4"</td><td>&nbsp;</td><td>&nbsp;</td></tr></tbody></table>"}'
al@303 388
al@303 389 cat << EOT
al@303 390 <h3>lspci</h3>
al@363 391 $(lspci_table)
al@303 392
al@303 393 <h3>lsusb</h3>
al@363 394 $(lsusb_table)
al@303 395 EOT
al@363 396 ;;
pankso@46 397 esac
pankso@46 398
pankso@46 399 xhtml_footer
pankso@46 400 exit 0