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