tazpanel view hardware.cgi @ rev 389

hardware.cgi: ensure that the mount point exists
author Pascal Bellard <pascal.bellard@slitaz.org>
date Wed Mar 26 20:12:07 2014 +0000 (2014-03-26)
parents 32170f52a71c
children 6adca10ef270
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 *\ 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 mntdir="$(GET mountpoint)"
299 [ -d "$mntdir" ] || mkdir -p "$mntdir"
300 $device $ro "$mntdir";;
301 umount\ *|swapon\ *|swapoff\ *)
302 $device ;;
303 esac
304 cat << EOT
305 <form method="get" action="$SCRIPT_NAME#mount">
306 <table id="mount" class="zebra outbox nowrap">
307 EOT
308 df_thead
309 echo '<tbody>'
310 for fs in $(blkid | sed 's/:.*//')
311 do
312 set -- $(df -h | grep "^$fs ")
313 size=$2
314 used=$3
315 av=$4
316 grep "^$fs " /proc/mounts | grep -q "[, ]ro[, ]" &&
317 av="<del>$av</del>"
318 pct=$5
319 mp=$6
320 action="mount"
321 [ -n "$mp" ] && action="umount"
322 type=$(blkid $fs | sed '/TYPE=/!d;s/.*TYPE="\([^"]*\).*/\1/')
323 [ "$type" == "swap" ] && action="swapon"
324 if grep -q "^$fs " /proc/swaps; then
325 action="swapoff"
326 set -- $(grep "^$fs " /proc/swaps)
327 size=$(blk2h $(($3*2)))
328 used=$(blk2h $(($4*2)))
329 av=$(blk2h $((2*($3-$4))))
330 pct=$(((100*$4)/$3))%
331 mp=swap
332 fi
333 [ -z "$size" ] &&
334 size="$(blk2h $(cat /sys/block/${fs#/dev/}/size /sys/block/*/${fs#/dev/}/size))"
335 img="harddisk.png"
336 case "$(cat /sys/block/${fs#/dev/}/removable 2> /dev/null ||
337 cat /sys/block/${fs:5:3}/removable 2> /dev/null)" in
338 1) img="floppy.png" ;;
339 esac
340 case "$(cat /sys/block/${fs#/dev/}/ro 2> /dev/null ||
341 cat /sys/block/${fs:5:3}/ro 2> /dev/null)" in
342 1) img="tazlito.png" ;;
343 esac
344 [ -s ".$IMAGES/$img" ] || img="harddisk.png"
345 cat << EOT
346 <tr>
347 <td><input type="radio" name="device" value="$action $fs" />
348 <img src="$IMAGES/$img" />${fs#/dev/}</td>
349 <td>$(blkid $fs | sed '/LABEL=/!d;s/.*LABEL="\([^"]*\).*/\1/')</td>
350 <td>$type</td>
351 <td>$size</td>
352 <td>$av</td>
353 EOT
354 if [ -n "$pct" ]; then
355 cat << EOT
356 <td class="meter"><meter min="0" max="100" value="${pct%%%}" low="70"
357 high="90" optimum="10"></meter>
358 <span>$used - $pct</span>
359 </td>
360 EOT
361 else
362 cat << EOT
363 <td> </td>
364 EOT
365 fi
366 cat << EOT
367 <td>$mp</td>
368 <td>$(blkid $fs | sed '/UUID=/!d;s/.*UUID="\([^"]*\).*/\1/')</td>
369 </tr>
370 EOT
371 done
372 cat << EOT
373 </tbody>
374 </table>
375 $(lib crypto input)
376 <input type="submit" value="mount / umount" /> -
377 new mount point <input type=text" name="mountpoint" value="/media/usbdisk" /> -
378 <input type="checkbox" name="readonly"> read-only
379 </form>
382 <h3>$(gettext 'Filesystems table')</h3>
383 EOT
385 grep -v '^#' /etc/fstab | awk 'BEGIN{print "<table class=\"zebra outbox\">\
386 <thead><tr><td>$(gettext 'Disk')</td><td>$(gettext 'Mount point')</td><td>\
387 $(gettext 'Type')</td><td>$(gettext 'Options')</td><td>\
388 $(gettext 'Freq')</td><td>$(gettext 'Pass')</td></thead><tbody>"}\
389 {print "<tr><td>"$1"</td><td>"$2\
390 "</td><td>"$3"</td><td>"$4"</td><td>"$5"</td><td>"$6"</td></tr>"}
391 END{print "</tbody></table>"}'
393 cat << EOT
394 <a class="button" href="index.cgi?file=/etc/fstab&action=edit">
395 <img src="$IMAGES/edit.png" />$(gettext 'Manual Edit')</a>
398 <h3>$(gettext 'Loop devices')</h3>
399 EOT
400 #
401 # Loop device management gui
402 #
403 cat << EOT
404 <form method="get" action="$SCRIPT_NAME#loop">
405 <table id="loop" class="zebra outbox nowrap">
406 <thead>
407 <tr><td>Device</td><td>Backing file</td><td>Access</td><td>Offset</td></tr>
408 </thead>
409 <tbody>
410 EOT
411 for loop in $(ls /dev/loop[0-9]*); do
412 case "$(cat /sys/block/${loop#/dev/}/ro 2> /dev/null)" in
413 0) ro="read/write" ;;
414 1) ro="read&nbsp;only" ;;
415 *) ro="" ;;
416 esac
417 set -- $(losetup | grep ^$loop:) $ro
418 cat << EOT
419 <tr>
420 <td><input type="radio" name="loopdev" value="$loop" />
421 <img src="$IMAGES/harddisk.png" />${loop#/dev/}</td>
422 <td>$3</td><td align="center">$4</td><td align="right">$2</td>
423 </tr>
424 EOT
425 done
426 cat << EOT
427 </tbody>
428 </table>
429 $(lib crypto input)
430 <input type="submit" value="Setup" /> -
431 new backing file <input type="text" name="backingfile" /> -
432 offset in bytes <input type="text" name="offset" size="8" value="0" /> -
433 <input type="checkbox" name="readonly"> read-only
434 </form>
435 EOT
437 cat << EOT
438 <h3>$(gettext 'System memory')</h3>
439 EOT
441 echo "<table class=\"zebra outbox\"><thead><tr><td>&nbsp;</td><td>total</td>\
442 <td>used</td><td>free</td><td>shared</td><td>buffers</td></tr></thead><tbody>"
443 freem=$(free -m)
444 echo "$freem" | grep Mem: | awk '{print "<tr><td>"$1"</td><td>"$2"</td><td>"$3\
445 "</td><td>"$4"</td><td>"$5"</td><td>"$6"</td></tr>"}'
446 echo "$freem" | grep buffers: | awk '{print "<tr><td>"$1 $2"</td><td>&nbsp;</td>\
447 <td>"$3"</td><td>"$4"</td><td>&nbsp;</td><td>&nbsp;</td></tr>"}'
448 echo "$freem" | grep Swap: | awk '{print "<tr><td>"$1"</td><td>"$2"</td><td>"$3\
449 "</td><td>"$4"</td><td>&nbsp;</td><td>&nbsp;</td></tr></tbody></table>"}'
451 cat << EOT
452 <h3>lspci</h3>
453 $(lspci_table)
455 <h3>lsusb</h3>
456 $(lsusb_table)
457 EOT
458 ;;
459 esac
461 xhtml_footer
462 exit 0