tazpanel view hardware.cgi @ rev 379

(c) --> 2014 and update AUTHORS file
author Christophe Lincoln <pankso@slitaz.org>
date Fri Jan 03 18:58:21 2014 +0100 (2014-01-03)
parents c6752ed0e680
children 32170f52a71c
line source
1 #!/bin/sh
2 #
3 # Hardware part of TazPanel - Devices, drivers, printing
4 #
5 # Copyright (C) 2011-2014 SliTaz GNU/Linux - BSD License
6 #
8 # Common functions from libtazpanel
9 . lib/libtazpanel
10 get_config
11 header
13 TITLE=$(gettext 'TazPanel - Hardware')
15 # Call an optionnal module
16 lib()
17 {
18 module=lib/$1
19 shift
20 [ -s $module ] && . $module "$@"
21 }
23 lsusb_table()
24 {
25 cat << EOT
26 <table class="zebra outbox">
27 <thead><tr><td>Bus</td><td>Device</td><td>ID</td><td>Name</td></thead>
28 <tbody>
29 EOT
30 lsusb | sed 's|^Bus \([0-9]*\)|<tr><td>\1</td>|;
31 s|</td> Device \([0-9]*\):|</td><td>\1</td>|;
32 s|</td> ID \([^:]*:[^ ]*\)|</td><td><a href="?lsusb=\1">\1</a></td>|;
33 s| |<td>|2;
34 s|.*$|\0</td></tr>|'
35 echo "</tbody></table>"
36 }
38 lspci_table()
39 {
40 cat << EOT
41 <table class="zebra outbox">
42 <thead><tr><td>Slot</td><td>Device</td><td>Name</td></thead>
43 <tbody>
44 EOT
45 lspci | sed 's| |</td><td>|;
46 s|: |</td><td>|;
47 s|^\([^<]*\)|<a href="?lspci=\1">\1</a>|;
48 s|^.*$|<tr><td>\0</td></tr>|'
49 echo "</tbody></table>"
50 }
52 #
53 # Commands
54 #
56 case " $(GET) " in
57 *\ print\ *)
58 xhtml_header
59 echo "<h2>TODO</h2>" ;;
60 *\ detect\ *)
61 # Front end for Tazhw
62 # TODO: Add button to detect webcam, etc. Like in tazhw box.
63 xhtml_header
64 cat << EOT
65 <div id="wrapper">
66 <h2>$(gettext 'Detect hardware')</h2>
67 <p>$(gettext 'Detect PCI and USB hardware')</p>
68 </div>
70 <pre>$(tazhw detect-pci | syntax_highlighter sh)</pre>
72 <pre>$(tazhw detect-usb | syntax_highlighter sh)</pre>
73 EOT
74 ;;
75 *\ modules\ *|*\ modinfo\ *)
76 xhtml_header
77 cat << EOT
78 <div id="wrapper">
79 <h2>$(gettext 'Kernel modules')</h2>
80 <div class="float-right">
81 <form method="get" action="$SCRIPT_NAME">
82 <input type="hidden" name="modules" />
83 <input type="search" placeholder="$(gettext 'Modules search')" name="search" />
84 </form>
85 </div>
86 <p>$(gettext 'Manage, search or get information about the Linux kernel modules')</p>
87 </div>
88 EOT
89 # Request may be modinfo output that we want in the page itself
90 get_modinfo="$(GET modinfo)"
91 if [ -n "$get_modinfo" ]; then
92 cat << EOT
93 <strong>$(eval_gettext 'Detailed information for module: $get_modinfo')</strong>
95 <pre>$(modinfo $get_modinfo)</pre>
96 EOT
97 fi
98 if [ -n "$(GET modprobe)" ]; then
99 echo "<pre>$(modprobe -v $(GET modprobe))</pre>"
100 fi
101 if [ -n "$(GET rmmod)" ]; then
102 echo "Removing"
103 rmmod -w $(GET rmmod)
104 fi
105 get_search="$(GET search)"
106 if [ -n "$get_search" ]; then
107 eval_gettext 'Matching result(s) for: $get_search'
108 echo '<pre>'
109 modprobe -l | grep "$(GET search)" | while read line
110 do
111 name=$(basename $line)
112 mod=${name%.ko.gz}
113 echo "$(gettext 'Module:') <a href='$SCRIPT_NAME?modinfo=$mod'>$mod</a>"
114 done
115 echo '</pre>'
116 fi
117 cat << EOT
118 $(table_start)
119 <tr class="thead">
120 <td>$(gettext 'Module')</td>
121 <td>$(gettext 'Size')</td>
122 <td>$(gettext 'Used')</td>
123 <td>$(gettext 'by')</td>
124 </tr>
125 EOT
126 # Get the list of modules and link to modinfo
127 lsmod | grep ^[a-z] | while read MOD SIZE USED BY
128 do
129 cat << EOT
130 <tr>
131 <td><a href="$SCRIPT_NAME?modinfo=$MOD">$MOD</a></td>
132 <td>$SIZE</td>
133 <td>$USED</td>
134 <td>$(echo $BY | sed s/","/" "/g)</td>
135 </tr>
136 EOT
137 done
138 table_end ;;
139 *\ lsusb\ *)
140 xhtml_header
141 vidpid="$(GET lsusb)"
142 cat << EOT
143 <div id="wrapper">
144 <h2>$(eval_gettext 'Information for USB Device $vidpid')</h2>
145 <p>$(gettext 'Detailed information about specified device.')</p>
146 EOT
147 lsusb_table
148 cat << EOT
149 </div>
150 <pre>$(lsusb -vd $vidpid | syntax_highlighter lsusb)</pre>
151 EOT
152 ;;
153 *\ lspci\ *)
154 xhtml_header
155 slot="$(GET lspci)"
156 cat << EOT
157 <div id="wrapper">
158 <h2>$(eval_gettext 'Information for PCI Device $slot')</h2>
159 <p>$(gettext 'Detailed information about specified device.')</p>
160 EOT
161 lspci_table
162 cat << EOT
163 </div>
164 <pre>$(lspci -vs $slot | syntax_highlighter lspci)</pre>
165 EOT
166 ;;
167 *)
168 [ -n "$(GET brightness)" ] &&
169 echo -n $(GET brightness) > /sys/devices/virtual/backlight/$(GET dev)/brightness
171 #
172 # Default to summary with mounted filesystem, loaded modules
173 #
174 xhtml_header
175 cat << EOT
176 <div id="wrapper">
177 <h2>$(gettext 'Drivers &amp; Devices')</h2>
178 <p>$(gettext 'Manage your computer hardware')</p>
179 </div>
180 <div>
181 <a class="button" href="$SCRIPT_NAME?modules">
182 <img src="$IMAGES/tux.png" />$(gettext 'Kernel modules')</a>
183 <a class="button" href="$SCRIPT_NAME?detect">
184 <img src="$IMAGES/monitor.png" />$(gettext 'Detect PCI/USB')</a>
185 </div>
187 EOT
188 if [ -n "$(ls /proc/acpi/battery/*/info 2> /dev/null)" ]; then
189 echo "<table>"
190 for dev in /proc/acpi/battery/*; do
191 grep ^present $dev/info | grep -q yes || continue
192 design=$(sed '/design capacity:/!d;s/[^0-9]*\([0-9]*\).*/\1/' < $dev/info)
193 remain=$(sed '/remaining capacity/!d;s/[^0-9]*\([0-9]*\).*/\1/' < $dev/state)
194 rate=$(sed '/present rate/!d;s/[^0-9]*\([0-9]*\).*/\1/' < $dev/state)
195 full=$(sed '/last full capacity/!d;s/[^0-9]*\([0-9]*\).*/\1/' < $dev/info)
196 warning=$(sed '/design capacity warning/!d;s/[^0-9]*\([0-9]*\).*/\1/' < $dev/info)
197 low=$(sed '/design capacity low/!d;s/[^0-9]*\([0-9]*\).*/\1/' < $dev/info)
198 state=$(sed '/charging state/!d;s/\([^:]*:[ ]\+\)\([a-z]\+\)/\2/' < $dev/state)
200 rempct=$(( $remain * 100 / $full ))
201 cat << EOT
202 <tr>
203 <td><img src="$IMAGES/battery.png" />
204 $(gettext 'Battery') $(grep "^battery type" $dev/info | sed 's/.*: *//')
205 $(grep "^design capacity:" $dev/info | sed 's/.*: *//') </td>
206 <td>$(gettext 'health') $(( (100*$full)/$design))%</td>
207 <td class="meter"><meter min="0" max="$full" value="$remain" low="$low"
208 high="$warning" optimum="$full"></meter>
209 <span>
210 EOT
211 case "$state" in
212 "discharging")
213 remtime=$(( $remain * 60 / $rate ))
214 remtimef=$(printf "%d:%02d" $(($remtime/60)) $(($remtime%60)))
215 eval_gettext 'Discharging $rempct% - $remtimef' ;;
216 "charging")
217 remtime=$(( ($full - $remain) * 60 / $rate ))
218 remtimef=$(printf "%d:%02d" $(($remtime/60)) $(($remtime%60)))
219 eval_gettext 'Charging $rempct% - $remtimef' ;;
220 "charged")
221 gettext 'Charged 100%' ;;
222 esac
223 echo '</span></td></tr>'
224 done
225 echo "</table>"
226 fi
228 if [ -n "$(ls /sys/devices/virtual/thermal/*/temp 2> /dev/null)" ]; then
229 echo -n '<p>'; gettext 'Temperature:'
230 for temp in /sys/devices/virtual/thermal/*/temp; do
231 awk '{ print $1/1000 }' < $temp
232 done
233 echo '</p>'
234 fi
236 if [ -n "$(ls /sys/devices/virtual/backlight/*/brightness 2> /dev/null)" ]; then
237 cat <<EOT
238 <form method="get" action="$SCRIPT_NAME">
239 EOT
240 for dev in /sys/devices/virtual/backlight/*/brightness ; do
241 name=$(echo $dev | sed 's|.*/backlight/\([^/]*\).*|\1|')
242 cat <<EOT
243 <input type="hidden" name="dev" value="$name" />
244 $(gettext 'Brightness') \
245 $(sed 's/.*\.//;s/_*$//' < /sys/devices/virtual/backlight/$name/device/path):
246 <select name="brightness" onchange="submit();">
247 EOT
248 max=$(cat /sys/devices/virtual/backlight/$name/max_brightness)
249 for i in $(seq 0 $max); do
250 echo -n "<option value=\"$i\""
251 [ $i -eq $(cat /sys/devices/virtual/backlight/$name/actual_brightness) ] &&
252 echo -n " selected=\"selected\""
253 echo "> $(( (($i + 1) * 100) / ($max + 1) ))% </option>"
254 done
255 cat <<EOT
256 </select>
257 EOT
258 done
259 cat << EOT
260 </form>
261 EOT
262 fi
263 cat << EOT
266 <h3 id="disk">$(gettext 'Filesystem usage statistics')</h3>
268 <pre>
269 $(fdisk -l | fgrep Disk)
270 </pre>
271 EOT
274 #
275 # Loop device management actions
276 #
277 device=$(GET loopdev)
278 lib crypto $device
279 case "$device" in
280 /dev/loop*)
281 set -- $(losetup | grep ^$device:)
282 [ -n "$3" ] && losetup -d $device
283 ro=""
284 [ -n "$(GET readonly)" ] && ro="-r"
285 file="$(GET backingfile)"
286 [ -n "$file" ] && losetup -o $(GET offset) $ro $device $file
287 esac
288 #
289 # Disk stats and management (mount, umount, check)
290 #
291 device=$(GET device)
292 lib crypto $device
293 case "$device" in
294 *[\;\`\&\|\$]*) ;;
295 mount\ *)
296 ro=""
297 [ -n "$(GET readonly)" ] && ro="-r"
298 $device $ro $(GET mountpoint);;
299 umount\ *|swapon\ *|swapoff\ *)
300 $device ;;
301 esac
302 cat << EOT
303 <form method="get" action="$SCRIPT_NAME#mount">
304 <table id="mount" class="zebra outbox nowrap">
305 EOT
306 df_thead
307 echo '<tbody>'
308 for fs in $(blkid | sed 's/:.*//')
309 do
310 set -- $(df -h | grep "^$fs ")
311 size=$2
312 used=$3
313 av=$4
314 grep "^$fs " /proc/mounts | grep -q "[, ]ro[, ]" &&
315 av="<del>$av</del>"
316 pct=$5
317 mp=$6
318 action="mount"
319 [ -n "$mp" ] && action="umount"
320 type=$(blkid $fs | sed '/TYPE=/!d;s/.*TYPE="\([^"]*\).*/\1/')
321 [ "$type" == "swap" ] && action="swapon"
322 if grep -q "^$fs " /proc/swaps; then
323 action="swapoff"
324 set -- $(grep "^$fs " /proc/swaps)
325 size=$(blk2h $(($3*2)))
326 used=$(blk2h $(($4*2)))
327 av=$(blk2h $((2*($3-$4))))
328 pct=$(((100*$4)/$3))%
329 mp=swap
330 fi
331 [ -z "$size" ] &&
332 size="$(blk2h $(cat /sys/block/${fs#/dev/}/size /sys/block/*/${fs#/dev/}/size))"
333 img="harddisk.png"
334 case "$(cat /sys/block/${fs#/dev/}/removable 2> /dev/null ||
335 cat /sys/block/${fs:5:3}/removable 2> /dev/null)" in
336 1) img="floppy.png" ;;
337 esac
338 case "$(cat /sys/block/${fs#/dev/}/ro 2> /dev/null ||
339 cat /sys/block/${fs:5:3}/ro 2> /dev/null)" in
340 1) img="tazlito.png" ;;
341 esac
342 [ -s ".$IMAGES/$img" ] || img="harddisk.png"
343 cat << EOT
344 <tr>
345 <td><input type="radio" name="device" value="$action $fs" />
346 <img src="$IMAGES/$img" />${fs#/dev/}</td>
347 <td>$(blkid $fs | sed '/LABEL=/!d;s/.*LABEL="\([^"]*\).*/\1/')</td>
348 <td>$type</td>
349 <td>$size</td>
350 <td>$av</td>
351 EOT
352 if [ -n "$pct" ]; then
353 cat << EOT
354 <td class="meter"><meter min="0" max="100" value="${pct%%%}" low="70"
355 high="90" optimum="10"></meter>
356 <span>$used - $pct</span>
357 </td>
358 EOT
359 else
360 cat << EOT
361 <td> </td>
362 EOT
363 fi
364 cat << EOT
365 <td>$mp</td>
366 <td>$(blkid $fs | sed '/UUID=/!d;s/.*UUID="\([^"]*\).*/\1/')</td>
367 </tr>
368 EOT
369 done
370 cat << EOT
371 </tbody>
372 </table>
373 $(lib crypto input)
374 <input type="submit" value="mount / umount" /> -
375 new mount point <input type=text" name="mountpoint" value="/media/usbdisk" /> -
376 <input type="checkbox" name="readonly"> read-only
377 </form>
380 <h3>$(gettext 'Filesystems table')</h3>
381 EOT
383 grep -v '^#' /etc/fstab | awk 'BEGIN{print "<table class=\"zebra outbox\">\
384 <thead><tr><td>$(gettext 'Disk')</td><td>$(gettext 'Mount point')</td><td>\
385 $(gettext 'Type')</td><td>$(gettext 'Options')</td><td>\
386 $(gettext 'Freq')</td><td>$(gettext 'Pass')</td></thead><tbody>"}\
387 {print "<tr><td>"$1"</td><td>"$2\
388 "</td><td>"$3"</td><td>"$4"</td><td>"$5"</td><td>"$6"</td></tr>"}
389 END{print "</tbody></table>"}'
391 cat << EOT
392 <a class="button" href="index.cgi?file=/etc/fstab&action=edit">
393 <img src="$IMAGES/edit.png" />$(gettext 'Manual Edit')</a>
396 <h3>$(gettext 'Loop devices')</h3>
397 EOT
398 #
399 # Loop device management gui
400 #
401 cat << EOT
402 <form method="get" action="$SCRIPT_NAME#loop">
403 <table id="loop" class="zebra outbox nowrap">
404 <thead>
405 <tr><td>Device</td><td>Backing file</td><td>Access</td><td>Offset</td></tr>
406 </thead>
407 <tbody>
408 EOT
409 for loop in $(ls /dev/loop[0-9]*); do
410 case "$(cat /sys/block/${loop#/dev/}/ro 2> /dev/null)" in
411 0) ro="read/write" ;;
412 1) ro="read&nbsp;only" ;;
413 *) ro="" ;;
414 esac
415 set -- $(losetup | grep ^$loop:) $ro
416 cat << EOT
417 <tr>
418 <td><input type="radio" name="loopdev" value="$loop" />
419 <img src="$IMAGES/harddisk.png" />${loop#/dev/}</td>
420 <td>$3</td><td align="center">$4</td><td align="right">$2</td>
421 </tr>
422 EOT
423 done
424 cat << EOT
425 </tbody>
426 </table>
427 $(lib crypto input)
428 <input type="submit" value="Setup" /> -
429 new backing file <input type="text" name="backingfile" /> -
430 offset in bytes <input type="text" name="offset" size="8" value="0" /> -
431 <input type="checkbox" name="readonly"> read-only
432 </form>
433 EOT
435 cat << EOT
436 <h3>$(gettext 'System memory')</h3>
437 EOT
439 echo "<table class=\"zebra outbox\"><thead><tr><td>&nbsp;</td><td>total</td>\
440 <td>used</td><td>free</td><td>shared</td><td>buffers</td></tr></thead><tbody>"
441 freem=$(free -m)
442 echo "$freem" | grep Mem: | awk '{print "<tr><td>"$1"</td><td>"$2"</td><td>"$3\
443 "</td><td>"$4"</td><td>"$5"</td><td>"$6"</td></tr>"}'
444 echo "$freem" | grep buffers: | awk '{print "<tr><td>"$1 $2"</td><td>&nbsp;</td>\
445 <td>"$3"</td><td>"$4"</td><td>&nbsp;</td><td>&nbsp;</td></tr>"}'
446 echo "$freem" | grep Swap: | awk '{print "<tr><td>"$1"</td><td>"$2"</td><td>"$3\
447 "</td><td>"$4"</td><td>&nbsp;</td><td>&nbsp;</td></tr></tbody></table>"}'
449 cat << EOT
450 <h3>lspci</h3>
451 $(lspci_table)
453 <h3>lsusb</h3>
454 $(lsusb_table)
455 EOT
456 ;;
457 esac
459 xhtml_footer
460 exit 0