rev |
line source |
pankso@15
|
1 #!/bin/sh
|
pankso@15
|
2 #
|
pankso@15
|
3 # Common functions for TazPanel CGI and cmdline interface
|
pankso@15
|
4 #
|
al@419
|
5 # Copyright (C) 2011-2015 SliTaz GNU/Linux - BSD License
|
al@419
|
6 #
|
al@419
|
7
|
al@437
|
8 . /lib/libtaz.sh
|
pankso@15
|
9
|
al@463
|
10
|
al@463
|
11 # Redefine gettext functions
|
al@463
|
12
|
al@463
|
13 _() { local T="$1"; shift; printf "$(gettext "$T")" "$@"; echo; }
|
al@463
|
14 _n() { local T="$1"; shift; printf "$(gettext "$T")" "$@"; }
|
al@463
|
15 _p() {
|
al@463
|
16 local S="$1" P="$2" N="$3"; shift 3;
|
al@463
|
17 printf "$(ngettext "$S" "$P" "$N")" "$@"; }
|
al@463
|
18
|
al@463
|
19
|
pascal@511
|
20 GUI_USER=nobody
|
pascal@511
|
21 [ "$HTTP_HOST" == "127.0.0.1:82" ] &&
|
pascal@511
|
22 for i in "$HTTP_COOKIE" "$QUERY_STRING" ; do
|
pascal@511
|
23 v="$(echo "$i" | sed '/guiuser=/!d;s/.*guiuser=\([A-Za-z0-9_]*\).*/\1/')"
|
pascal@511
|
24 [ "$v" ] || continue
|
pascal@511
|
25 ps | sed '/d;/d;/127\.0\.0\.1:82/!d' | grep -q " $v " || continue
|
pascal@511
|
26 GUI_USER="$v"
|
pascal@511
|
27 done
|
pascal@511
|
28 [ "$REMOTE_USER" ] || REMOTE_USER="$GUI_USER"
|
pascal@511
|
29 [ "$(id -un)" == "$REMOTE_USER" ] || exec su -s /bin/sh -c "$(realpath $0) $@" $REMOTE_USER
|
pascal@376
|
30
|
al@419
|
31
|
pascal@511
|
32 # Get parameters with GET, POST, COOKIE and FILE functions
|
al@419
|
33
|
mojo@310
|
34 . /usr/lib/slitaz/httphelper
|
pascal@81
|
35
|
al@419
|
36
|
pankso@109
|
37 # I18n
|
al@419
|
38
|
pankso@286
|
39 . /etc/locale.conf
|
pankso@40
|
40 . /usr/bin/gettext.sh
|
pankso@40
|
41 TEXTDOMAIN='tazpanel'
|
pankso@286
|
42 export TEXTDOMAIN LANG LC_ALL
|
pankso@40
|
43
|
al@419
|
44
|
pankso@15
|
45 # We need a config file first
|
al@419
|
46
|
pankso@15
|
47 get_config() {
|
al@419
|
48 CONFIG='/etc/slitaz/tazpanel.conf'
|
al@419
|
49 if [ -f "$CONFIG" ]; then
|
al@419
|
50 . $CONFIG
|
al@419
|
51 else
|
al@419
|
52 echo "No config file found: $CONFIG"
|
pankso@15
|
53 exit 1
|
al@419
|
54 fi
|
pankso@15
|
55 }
|
pankso@15
|
56
|
al@419
|
57
|
al@303
|
58 # Display < > &
|
al@419
|
59
|
al@303
|
60 htmlize() {
|
al@303
|
61 sed -e 's|\&|\&|g; s|<|\<|g; s|>|\>|g'
|
al@303
|
62 }
|
al@303
|
63
|
al@419
|
64
|
pankso@74
|
65 # Syntax highlighting for config file and SHell scripts
|
al@419
|
66
|
pankso@74
|
67 syntax_highlighter() {
|
pankso@74
|
68 case $1 in
|
pankso@74
|
69 conf)
|
al@303
|
70 htmlize | sed \
|
al@419
|
71 -e 's|^\([ \t]*[A-Za-z0-9_][A-Za-z0-9_]*\)\(="*.*\)|<span class="conf-var">\1</span><span class="conf-val">\2</span>|g' \
|
al@419
|
72 -e 's|^[ \t]*#.*|<span class="conf-comment">\0</span>|g' ;;
|
al@419
|
73 #-e s"#^\#\([^']*\)#<span class='conf-comment'>\0</span>#"g \
|
al@419
|
74 #-e s"#^[A-Z]\([^']*\)=#<span class='conf-var'>\0</span>#"g \
|
al@419
|
75 #-e s"#^[a-z]\([^']*\)#<span class='conf-var'>\0</span>#"g \
|
al@419
|
76 #-e s"#[\"']\([^']*\)[\"']#<span class='conf-val'>\0</span>#"g ;;
|
pankso@75
|
77 sh)
|
al@303
|
78 htmlize | sed \
|
al@419
|
79 -e 's|^\([ \t]*[A-Za-z0-9_][A-Za-z0-9_]*\)\(="*.*\)|<span class="sh-var">\1</span><span class="sh-val">\2</span>|g' \
|
al@419
|
80 -e 's|^#.*|<span class="sh-comment">\0</span>|g' ;;
|
al@419
|
81 #-e s"#^\#\([^']*\)#<span class='sh-comment'>\0</span>#"g \
|
al@419
|
82 #-e s"#\"\([^']*\)\"#<span class='sh-val'>\0</span>#"g ;;
|
pascal@91
|
83 diff)
|
al@303
|
84 htmlize | sed \
|
al@419
|
85 -e 's|^-.*|<span class="diff-rm">\0</span>|g' \
|
al@419
|
86 -e 's|^+.*|<span class="diff-add">\0</span>|g' \
|
al@419
|
87 -e 's|^@.*|<span class="diff-at">\0</span>|g' ;;
|
pankso@120
|
88 activity)
|
al@419
|
89 # realize lazy quantification
|
al@419
|
90 sed -e "s|: |ⓒ|; s|^\(.*\)ⓒ|<span class='activity-log'>\1:</span> |" ;;
|
al@303
|
91 kernel)
|
al@419
|
92 # line with "ⓒ": realize lazy quantification
|
al@303
|
93 htmlize | sed \
|
al@303
|
94 -e "s|\([^0-9]\)\(0x[0-9a-f]\+\)|\1<span class='kernel-hex'>\2</span>|g" \
|
al@419
|
95 -e "s|: |ⓒ|; s|^\(.*\)ⓒ|<span class='kernel-id'>\1:</span> |" \
|
al@419
|
96 -e "s|\(\[[^ ]\+\]\)|<span class='kernel-id2'>\0</span>|g" \
|
al@419
|
97 -e "s|Call Trace:|<span class='kernel-trace'>\0</span>|" ;;
|
al@363
|
98 lsusb)
|
al@363
|
99 htmlize | sed \
|
al@363
|
100 -e 's|^[^:]*:[ x0-9a-f^:]*$|<span class="lsusb-t">\0</span>|g' \
|
al@363
|
101 -e 's|^Bus.*$|<span class="lsusb-h">\0</span>|g' ;;
|
al@363
|
102 lspci)
|
al@363
|
103 htmlize | sed \
|
al@363
|
104 -e 's|^[0-9a-f].*$|<span class="lspci-t">\0</span>|g' \
|
al@363
|
105 -e 's|^ \([^:]*:\)| <span class="lspci-h">\1</span>|g' ;;
|
al@419
|
106 xlog)
|
al@419
|
107 htmlize | sed \
|
al@419
|
108 -e 's|^[^]]*]|<span class="xlog xlog-timestamp">\0</span>|' \
|
al@419
|
109 -e 's|(--)|<span class="xlog xlog-probed" title="probed">\0</span>|' \
|
al@419
|
110 -e 's|(\*\*)|<span class="xlog xlog-config" title="from config file">\0</span>|' \
|
al@419
|
111 -e 's|(==)|<span class="xlog xlog-default" title="default setting">\0</span>|' \
|
al@419
|
112 -e 's|(++)|<span class="xlog xlog-cmdline" title="from command line">\0</span>|' \
|
al@419
|
113 -e 's|(!!)|<span class="xlog xlog-notice" title="notice">\0</span>|' \
|
al@419
|
114 -e 's|(II)|<span class="xlog xlog-info" title="informational">\0</span>|' \
|
al@419
|
115 -e 's|(WW)|<span class="xlog xlog-warn" title="warning">\0</span>|' \
|
al@419
|
116 -e 's|(EE)|<span class="xlog xlog-error" title="error">\0</span>|' \
|
al@419
|
117 -e 's|(NI)|<span class="xlog xlog-ni" title="not implemented">\0</span>|' \
|
al@419
|
118 -e 's|(??)|<span class="xlog xlog-unknown" title="unknown">\0</span>|' \
|
al@419
|
119 ;;
|
pankso@74
|
120 esac
|
pankso@53
|
121 }
|
pankso@53
|
122
|
al@419
|
123
|
pascal@99
|
124 # Remove status and ESC char from tazpkg/tazlito commands output
|
al@419
|
125
|
pascal@99
|
126 filter_taztools_msgs() {
|
al@419
|
127 sed \
|
al@419
|
128 -e 's|\\[0m|</span>|g' \
|
al@419
|
129 -e 's|\\[0;39m|</span>|g' \
|
al@419
|
130 -e 's|\\[0*\([0-7]*\);\([0-7]*\)m|<span class="color\1 color\2">|g' \
|
pascal@412
|
131 -e ':a;s/^\(.\{0,69\}\)\(\\[[0-9]*G\[\)/\1 \2/;ta' \
|
al@419
|
132 -e ':b;s|^\([^\]*\)\\[\([0-9]*\)G|<span style="display:inline-block;width:\2ex">\1</span>|;tb' \
|
al@419
|
133 -e 's/\[^Gm]*.//g'
|
pascal@99
|
134 }
|
pascal@99
|
135
|
al@419
|
136
|
pankso@51
|
137 # LOG activities
|
al@419
|
138
|
pankso@51
|
139 log() {
|
al@419
|
140 date=$(date "+%F %R")
|
al@419
|
141 filter_taztools_msgs | sed "s|[^']*|$date : \0|" >> $LOG_FILE
|
pankso@51
|
142 }
|
pankso@51
|
143
|
al@419
|
144
|
pankso@161
|
145 ok_status() {
|
al@419
|
146 echo '[<span class="diff-add"> OK </span>]'
|
pankso@161
|
147 }
|
pankso@161
|
148
|
al@419
|
149
|
pankso@40
|
150 # Network interface status
|
al@419
|
151
|
pankso@40
|
152 interface_status() {
|
pascal@486
|
153 ip="----"
|
pascal@486
|
154 status="----"
|
pascal@486
|
155 scan=""
|
al@419
|
156 if ifconfig | grep -A1 $1 | grep -q inet; then
|
al@419
|
157 ip=$(ifconfig | grep -A1 $1 | grep inet | awk '{ print $2 }' | cut -d: -f2)
|
pascal@488
|
158 [ "$(cat /sys/class/net/$1/carrier)" == "1" ] &&
|
pascal@488
|
159 scan="<a data-icon=\"scan\" href='network.cgi?scan=$ip&back=network.cgi'>$(_ 'Scan')</a>"
|
pankso@40
|
160 fi
|
pascal@488
|
161 [ "$(cat /sys/class/net/$1/carrier)" == "1" ] &&
|
pascal@500
|
162 status="$(_ 'connected')" &&
|
pascal@500
|
163 speed="$(cat /sys/class/net/$1/speed 2> /dev/null)" &&
|
pascal@500
|
164 [ "$speed" ] && status="$status ${speed}M"
|
pascal@487
|
165 echo "<td>$status</td><td>$ip</td><td>$scan</td>"
|
pankso@40
|
166 }
|
pankso@40
|
167
|
al@419
|
168
|
pankso@40
|
169 # Catch network interface (used in summary and network main page)
|
al@419
|
170
|
pankso@40
|
171 list_network_interfaces() {
|
al@419
|
172 cat <<EOT
|
al@419
|
173 <table class="wide zebra center">
|
al@303
|
174 <thead>
|
al@303
|
175 <tr>
|
al@443
|
176 <td>$(_ 'Interface')</td>
|
al@443
|
177 <td>$(_ 'Name')</td>
|
al@443
|
178 <td>$(_ 'Status')</td>
|
al@443
|
179 <td>$(_ 'IP Address')</td>
|
al@443
|
180 <td>$(_ 'Scan ports')</td>
|
al@303
|
181 </tr>
|
al@303
|
182 </thead>
|
al@303
|
183 <tbody>
|
pankso@40
|
184 EOT
|
al@419
|
185 for i in $(ls /sys/class/net); do
|
pankso@40
|
186 case $i in
|
pankso@40
|
187 eth*)
|
pascal@441
|
188 echo " <tr><td><a data-icon='eth' href='network.cgi?eth'>$i</a></td>
|
al@419
|
189 <td>Ethernet</td> $(interface_status $i)</tr>" ;;
|
pankso@40
|
190 wlan*|ath*|ra*)
|
pascal@441
|
191 echo " <tr><td><a data-icon='wifi' href='network.cgi?wifi'>$i</a></td>
|
al@419
|
192 <td>Wireless</td> $(interface_status $i)</tr>" ;;
|
pascal@482
|
193 ppp*)
|
pascal@483
|
194 echo " <tr><td><a data-icon='removable' href='ppp.cgi'>$i</a></td>
|
pascal@482
|
195 <td>Point to point</td> $(interface_status $i)</tr>" ;;
|
pascal@484
|
196 tap[0-9]*|tun[0-9]*)
|
pascal@484
|
197 echo " <tr><td><span data-icon='removable'>$i</span></td>
|
pascal@484
|
198 <td>User space</td> $(interface_status $i)</tr>" ;;
|
pankso@40
|
199 lo)
|
al@419
|
200 echo " <tr><td><span data-icon='loopback'>$i</span></td>
|
al@419
|
201 <td>Loopback</td> $(interface_status $i)</tr>" ;;
|
pankso@40
|
202 *)
|
pankso@40
|
203 continue ;;
|
pankso@40
|
204 esac
|
pankso@40
|
205 done
|
al@419
|
206 cat <<EOT
|
al@303
|
207 </tbody>
|
al@303
|
208 </table>
|
al@303
|
209 EOT
|
pankso@40
|
210 }
|
pankso@40
|
211
|
al@419
|
212
|
slaxemulator@232
|
213 # Get the list of panel styles
|
al@419
|
214
|
slaxemulator@232
|
215 list_styles() {
|
al@498
|
216 for style in $PANEL/styles/*; do
|
slaxemulator@232
|
217 style=$(basename $style)
|
slaxemulator@232
|
218 echo "<option value='$style'>$style</option>"
|
slaxemulator@232
|
219 done
|
slaxemulator@232
|
220 }
|
slaxemulator@232
|
221
|
al@419
|
222
|
slaxemulator@232
|
223 # Get the list of system locales
|
al@419
|
224
|
slaxemulator@232
|
225 list_locales() {
|
slaxemulator@232
|
226 for locale in $(find /usr/share/i18n/locales -type f -name "[a-z][a-z]_[A-Z][A-Z]")
|
slaxemulator@232
|
227 do
|
slaxemulator@232
|
228 echo "<option value='$locale'>$locale</option>"
|
slaxemulator@232
|
229 done
|
slaxemulator@232
|
230 }
|
slaxemulator@232
|
231
|
al@419
|
232
|
slaxemulator@232
|
233 # Get the list of console keymaps
|
al@419
|
234
|
slaxemulator@232
|
235 list_keymaps() {
|
pascal@440
|
236 if [ -d /usr/share/kbd ]; then # kbd-base
|
pascal@440
|
237 find /usr/share/kbd/keymaps/i386 -type f -name '*.map*' ! -path '*include*' | \
|
pascal@440
|
238 awk -F/ '{gsub(/.map.gz/, ""); printf "<option value=\"%s\">%s (%s)\n", $8, $8, $7}'
|
pascal@440
|
239 else # kbd-busybox
|
pascal@440
|
240 ls /usr/share/kmap/*.kmap | \
|
pascal@440
|
241 sed 's|.*kmap/\(.*\).kmap|<option value="\1">\1|'
|
pascal@440
|
242 fi | sort
|
slaxemulator@232
|
243 }
|
slaxemulator@232
|
244
|
al@419
|
245
|
pankso@15
|
246 #
|
pankso@15
|
247 # xHTML 5 (header and footer skel are from the style)
|
pankso@15
|
248 #
|
pankso@15
|
249
|
pankso@44
|
250 loading_msg() {
|
al@419
|
251 local MSG=${1:-$LOADING_MSG}
|
al@498
|
252 [ -z "$MSG" ] && MSG="$(_ 'Please wait')"
|
al@419
|
253 cat <<EOT
|
al@498
|
254 <script type="text/javascript">statusbar("$MSG", 1)</script>
|
pankso@44
|
255 EOT
|
pankso@44
|
256 }
|
pankso@44
|
257
|
al@419
|
258
|
pankso@15
|
259 xhtml_header() {
|
al@501
|
260 SUBTITLE="$1"
|
al@292
|
261 . ${PANEL}$HEADER
|
pascal@511
|
262 cat <<EOT
|
pascal@511
|
263 <script type="text/javascript">
|
pascal@511
|
264 document.cookie = "guiuser=$GUI_USER";
|
pascal@511
|
265 </script>
|
pascal@511
|
266 EOT
|
al@501
|
267 if [ "$DEBUG" -eq 1 ]; then
|
al@501
|
268 local i j x
|
al@501
|
269 args=''
|
al@419
|
270 for x in GET POST COOKIE; do
|
al@419
|
271 for i in $($x); do
|
pascal@81
|
272 if [ $($x $i count) -gt 1 ]; then
|
pascal@81
|
273 for j in $(seq 1 $($x $i count)); do
|
pascal@81
|
274 args="$args $x($i,$j)='$($x $i $j)'"
|
pascal@81
|
275 done
|
pascal@81
|
276 else
|
pascal@81
|
277 args="$args $x($i)='$($x $i)'"
|
pascal@81
|
278 fi
|
pascal@81
|
279 done
|
pascal@81
|
280 done
|
pascal@81
|
281 for i in $(FILE); do
|
al@419
|
282 for j in name size type tmpname; do
|
pascal@81
|
283 args="$args FILE($i,$j)=$(FILE $i $j)"
|
pascal@81
|
284 done
|
pascal@81
|
285 done
|
al@419
|
286 cat <<EOT
|
al@419
|
287 <pre class="debug">
|
pascal@81
|
288 QUERY_STRING="$QUERY_STRING"$args
|
pankso@70
|
289 </pre>
|
pankso@70
|
290 EOT
|
pankso@67
|
291 fi
|
pankso@15
|
292 }
|
pankso@15
|
293
|
al@419
|
294
|
pankso@15
|
295 xhtml_footer() {
|
al@292
|
296 . ${PANEL}$FOOTER
|
pankso@15
|
297 }
|
pankso@15
|
298
|
al@419
|
299
|
al@501
|
300 table_start() { echo '<table>'; }
|
al@501
|
301 table_end() { echo '</table>'; }
|
pankso@153
|
302
|
al@419
|
303
|
pankso@153
|
304 df_thead() {
|
al@419
|
305 cat <<EOT
|
pankso@153
|
306 <thead>
|
pankso@153
|
307 <tr>
|
al@443
|
308 <td>$(_ 'Disk')</td>
|
al@443
|
309 <td>$(_ 'Label')</td>
|
al@443
|
310 <td>$(_ 'Type')</td>
|
al@443
|
311 <td>$(_ 'Size')</td>
|
al@443
|
312 <td>$(_ 'Available')</td>
|
al@443
|
313 <td>$(_ 'Used')</td>
|
al@443
|
314 <td>$(_ 'Mount point')</td>
|
pascal@343
|
315 <td>UUID</td>
|
pankso@153
|
316 </tr>
|
pankso@153
|
317 </thead>
|
pankso@153
|
318 EOT
|
pankso@153
|
319 }
|
al@318
|
320
|
al@419
|
321
|
al@318
|
322 msg() {
|
al@318
|
323 msgtype="$1"; shift
|
al@318
|
324 case "$msgtype" in
|
al@501
|
325 tip) MSG_ICON='msgtip';;
|
al@501
|
326 warn|warning) MSG_ICON='msgwarn';;
|
al@501
|
327 err|error) MSG_ICON='msgerr';;
|
al@501
|
328 up) MSG_ICON='msgup';;
|
al@501
|
329 *) MSG_ICON='msg';;
|
al@318
|
330 esac
|
al@419
|
331 cat <<EOT
|
al@501
|
332 <section class="box"><span data-icon="$MSG_ICON"></span>$@</section>
|
al@318
|
333 EOT
|
al@318
|
334 }
|
al@318
|
335
|
al@419
|
336
|
al@318
|
337 is_installed() {
|
al@318
|
338 [ -d "$INSTALLED/$1" ]
|
al@318
|
339 }
|
pascal@364
|
340
|
al@419
|
341
|
pascal@364
|
342 blk2h() {
|
pascal@460
|
343 if [ "$1" ]; then
|
pascal@460
|
344 echo $1
|
pascal@460
|
345 else
|
pascal@460
|
346 cat
|
pascal@460
|
347 fi | awk '{
|
pascal@364
|
348 n = $0/2
|
pascal@364
|
349 for (i = 1; n > 1024; i++)
|
pascal@364
|
350 n /= 1024
|
pascal@364
|
351 f = "%1.0f%c"
|
pascal@373
|
352 if (n < 100)
|
pascal@364
|
353 f = "%1.1f%c"
|
pascal@364
|
354 printf f,n,substr("KMGT", i, 1)
|
pascal@364
|
355 }'
|
pascal@364
|
356 }
|
al@419
|
357
|
al@419
|
358
|
al@419
|
359 # Show "Back" button
|
al@419
|
360
|
al@419
|
361 back_button() {
|
al@443
|
362 local URL="$1" default_caption="$(_ 'Back')"
|
al@419
|
363 local caption="${2:-$default_caption}" icon="${3:-back}"
|
al@419
|
364
|
al@419
|
365 if [ -n "$1" ]; then
|
al@437
|
366 printf '<form action="%s" method="post"><button data-icon="%s">%s</button></form>' \
|
al@437
|
367 "$URL" "$icon" "$caption"
|
al@419
|
368 fi
|
al@419
|
369 }
|
al@419
|
370
|
al@419
|
371
|
al@419
|
372 # Mark select option as checked
|
al@419
|
373
|
al@419
|
374 selected() {
|
al@419
|
375 [ "$1" == "$2" ] && echo -n 'selected'
|
al@419
|
376 }
|
al@437
|
377
|
al@437
|
378
|
al@437
|
379 check_root_tazpanel() {
|
al@437
|
380 if [ $(id -u) != '0' ]; then
|
al@437
|
381 msg err "$(_ 'You must be root to show this page.')"
|
al@437
|
382 xhtml_footer; exit 0
|
al@437
|
383 fi
|
al@437
|
384 }
|
pascal@507
|
385
|
pascal@507
|
386 # Get system database. NSS compatible.
|
pascal@507
|
387
|
pascal@507
|
388 getdb() {
|
pascal@507
|
389 getent $1 2>/dev/null || cat /etc/$1
|
pascal@507
|
390 }
|
pascal@507
|
391
|