tazpanel view hardware.cgi @ rev 407

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