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 & 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> </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> </td>\ |
al@363 | 385 <td>"$3"</td><td>"$4"</td><td> </td><td> </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> </td><td> </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 |