rev |
line source |
pankso@2
|
1 #!/bin/sh
|
pankso@2
|
2 #
|
al@419
|
3 # Main CGI interface for TazPanel. In on word: KISS. Use the main CSS form
|
paul@52
|
4 # command so we are faster and do not load unneeded functions. If necessary
|
pankso@14
|
5 # you can use the lib/ dir to handle external resources.
|
pankso@2
|
6 #
|
al@419
|
7 # Copyright (C) 2011-2015 SliTaz GNU/Linux - BSD License
|
pankso@42
|
8 #
|
pankso@2
|
9
|
al@419
|
10
|
pankso@14
|
11 # Common functions from libtazpanel
|
al@419
|
12
|
pankso@14
|
13 . lib/libtazpanel
|
pankso@14
|
14 get_config
|
pankso@2
|
15
|
al@501
|
16 TITLE='TazPanel'
|
al@292
|
17
|
al@419
|
18
|
al@419
|
19
|
paul@127
|
20 # Check whether a configuration file has been modified after installation
|
al@419
|
21
|
al@437
|
22 file_is_modified() {
|
pascal@91
|
23 grep -l " $1$" $INSTALLED/*/md5sum | while read file; do
|
al@292
|
24
|
al@419
|
25 # Found, but can we do diff?
|
pascal@91
|
26 [ "$(grep -h " $1$" $file)" != "$(md5sum $1)" ] || break
|
al@419
|
27 orig=$(dirname $file)/volatile.cpio.gz
|
al@419
|
28 zcat $orig 2>/dev/null | cpio -t 2>/dev/null | grep -q "^${1#/}$" || break
|
pascal@91
|
29
|
pascal@91
|
30 case "$2" in
|
al@419
|
31 diff)
|
al@419
|
32 tmp=$(mktemp -d)
|
al@419
|
33 ( cd $tmp; zcat $orig | cpio -id ${1#/} )
|
al@419
|
34 diff -abu $tmp$1 $1 | sed "s|$tmp||"
|
al@419
|
35 rm -rf $tmp;;
|
al@419
|
36 button)
|
al@558
|
37 echo -n '<button name="action" value="diff" data-icon="@diff@">'$(_ 'Differences')'</button>';;
|
pascal@91
|
38 esac
|
pascal@93
|
39 break
|
pascal@91
|
40 done
|
pascal@91
|
41 }
|
al@312
|
42
|
al@312
|
43
|
al@303
|
44 # OK status in table
|
al@419
|
45
|
al@303
|
46 ok_status_t() {
|
al@558
|
47 echo '<td><span class="diff-add" data-img="@ok@"></span></td></tr>'
|
al@303
|
48 }
|
al@303
|
49
|
al@303
|
50
|
al@419
|
51
|
al@437
|
52 # Terminal prompt
|
al@437
|
53
|
al@437
|
54 term_prompt() {
|
al@437
|
55 if [ "$user" == 'root' ]; then
|
al@437
|
56 local color1='color31' sign='#'
|
al@437
|
57 else
|
al@437
|
58 local color1='color32' sign='$'
|
al@437
|
59 fi
|
al@437
|
60 echo -n "<span class='$color1'>$user@$(hostname)</span>:<span class='color33'>"
|
al@437
|
61 pwd | sed "s|^$HOME|~|" | tr -d '\n'; echo -n "</span>$sign "
|
al@437
|
62 }
|
al@437
|
63
|
al@437
|
64
|
al@437
|
65
|
pankso@2
|
66 #
|
pankso@2
|
67 # Commands
|
pankso@2
|
68 #
|
pankso@2
|
69
|
pascal@81
|
70 case " $(GET) " in
|
al@419
|
71
|
pascal@553
|
72 *\ do\ *)
|
pascal@553
|
73 case "$(GET do)" in
|
pascal@553
|
74
|
pascal@553
|
75 *-selection) # display Yad file/dir picker (AJAX)
|
al@557
|
76 if [ "$(GET do)" == 'dir-selection' ]; then
|
al@556
|
77 title="$(_ 'Choose directory')"
|
al@557
|
78 extra='--directory'
|
al@557
|
79 icon='folder'
|
al@556
|
80 else
|
al@556
|
81 title="$(_ 'Choose file')"
|
al@557
|
82 extra=''
|
al@557
|
83 icon='text-plain'
|
al@556
|
84 fi
|
pascal@553
|
85 while read name arg ; do
|
pascal@553
|
86 case "$(GET do)" in
|
pascal@553
|
87 *$name*)
|
pascal@553
|
88 extra="$extra $arg" ;;
|
pascal@553
|
89 esac
|
pascal@553
|
90 done <<EOT
|
pascal@553
|
91 multiple --multiple
|
pascal@553
|
92 preview --add-preview
|
pascal@553
|
93 EOT
|
al@557
|
94
|
al@557
|
95 if [ -n "$(GET type)" ]; then
|
al@557
|
96 # Get description and file pattern: yad can select only allowed file types
|
al@557
|
97 # For example, type='application/x-cd-image'
|
al@557
|
98 # Note, here implemented simplified code: not use mimetype aliases and generic icons
|
al@557
|
99 mimefile="/usr/share/mime/$(GET type).xml"
|
al@557
|
100 if [ -f "$mimefile" ]; then
|
al@557
|
101 if [ -n "$LANG" ]; then
|
al@557
|
102 # Localized description
|
al@557
|
103 desc="$(sed -n "s|^.*xml:lang=\"${LANG%%_*}\">\(.*\)<.*|\1|p" $mimefile)"
|
al@557
|
104 fi
|
al@557
|
105 if [ -z "$LANG" -o -z "$desc" ]; then
|
al@557
|
106 # Default (English) description
|
al@557
|
107 desc="$(sed -n "s|^.*<comment>\(.*\)<.*|\1|p" $mimefile)"
|
al@557
|
108 fi
|
al@557
|
109 # File pattern(s), for example, "*.iso\n*.iso9660"
|
al@557
|
110 pattern=$(sed -n 's|^.*pattern=\"\(.*\)\".*|\1|p' $mimefile)
|
al@557
|
111 extra="$extra --file-filter='$desc|$(echo $pattern)'"
|
al@557
|
112 fi
|
al@557
|
113 icon="$(echo $(GET type) | tr '/' '-')"
|
al@557
|
114 fi
|
al@557
|
115
|
pascal@553
|
116 header
|
pascal@555
|
117 cd ${HOME:-/}
|
pascal@555
|
118 if [ -r $HOME/.Xauthority ]; then
|
al@557
|
119 XAUTHORITY="$HOME/.Xauthority"
|
pascal@555
|
120 else
|
al@557
|
121 XAUTHORITY='/var/run/slim.auth'
|
pascal@555
|
122 fi
|
al@557
|
123
|
al@557
|
124 # Problem with inline quoting in the yad option --file-filter
|
al@557
|
125 # Save temp script into file and execute it
|
al@557
|
126 tempsh="$(mktemp)"
|
al@557
|
127 echo "DISPLAY=':0.0' XAUTHORITY=\"$XAUTHORITY\" \
|
al@557
|
128 yad --file-selection --on-top --mouse $extra --width=500 --height=350 \
|
al@557
|
129 --title=\"$title\" --window-icon=\"$icon\"" > "$tempsh"
|
al@557
|
130 echo "<input type=\"text\" name=\"$(GET name)\" value=\"$(sh $tempsh)\"/>"
|
al@557
|
131 rm "$tempsh"
|
al@557
|
132
|
pascal@553
|
133 exit 0 ;;
|
pascal@553
|
134
|
pascal@553
|
135 esac
|
pascal@553
|
136 ;;
|
pascal@553
|
137
|
al@419
|
138
|
pascal@364
|
139 *\ exec\ *)
|
al@419
|
140 # Execute command and display its result in a terminal-like window
|
al@419
|
141
|
al@501
|
142 header; xhtml_header "$(_ 'exec')"
|
al@419
|
143
|
pascal@364
|
144 exec="$(GET exec)"
|
al@419
|
145 font="${TERM_FONT:-monospace}"
|
al@419
|
146 palette=$(echo $TERM_PALETTE | tr A-Z a-z)
|
al@419
|
147
|
al@419
|
148 cat <<EOT
|
al@419
|
149 <section>
|
al@419
|
150 <header>
|
al@419
|
151 $exec
|
al@419
|
152 $(back_button "$(GET back)" "$(GET back_caption)" "$(GET back_icon)")
|
al@419
|
153 </header>
|
al@419
|
154 <div class="term_">
|
al@419
|
155 <pre class="term $palette" style="font-family: '$font'">$($exec 2>&1 | htmlize | filter_taztools_msgs)</pre>
|
al@419
|
156 </div>
|
al@419
|
157 </section>
|
pascal@364
|
158 EOT
|
pascal@364
|
159 ;;
|
al@419
|
160
|
al@419
|
161
|
pascal@81
|
162 *\ file\ *)
|
pankso@56
|
163 #
|
pascal@91
|
164 # Handle files
|
pankso@56
|
165 #
|
al@419
|
166 header
|
pascal@81
|
167 file="$(GET file)"
|
al@419
|
168 action="$(POST action)"; [ -z "$action" ] && action="$(GET action)" # receive 'action' both on POST or GET
|
al@463
|
169 title="$(POST title)"; [ -z "$title" ] && title="$(GET title)" # (optional)
|
al@419
|
170
|
pankso@161
|
171 case $file in
|
pankso@161
|
172 *.html)
|
al@419
|
173 cat $file; exit 0 ;;
|
pankso@161
|
174 *)
|
al@501
|
175 xhtml_header "$(_ 'File')";;
|
pankso@161
|
176 esac
|
al@303
|
177
|
al@419
|
178 case "$action" in
|
al@419
|
179 edit)
|
al@419
|
180 cat <<EOT
|
al@419
|
181 <section>
|
al@419
|
182 <header>
|
al@558
|
183 <span data-icon="@edit@">${title:-$file}</span>
|
al@463
|
184 <form id="editform" method="post" action="?file=$file">
|
al@558
|
185 <button data-icon="@save@">$(_ 'Save')</button>
|
al@558
|
186 <button name="action" value="diff" data-icon="@diff@">$(_ 'Differences')</button>
|
al@419
|
187 </form>
|
pascal@534
|
188 $(back_button)
|
al@419
|
189 </header>
|
pascal@504
|
190 <textarea form="editform" name="content" class="wide" rows="30" autofocus>$(htmlize < $file)</textarea>
|
al@419
|
191 </section>
|
pascal@90
|
192 EOT
|
naitsirhc@267
|
193 #The space before textarea gets muddled when the form is submitted.
|
naitsirhc@267
|
194 #It prevents anything else from getting messed up
|
al@419
|
195 ;;
|
al@419
|
196
|
al@419
|
197 setvar)
|
pascal@364
|
198 data="$(. $(GET file) ;eval echo \$$(GET var))"
|
pascal@364
|
199 cat <<EOT
|
al@419
|
200 <section>
|
al@419
|
201 <header>$(GET var)</header>
|
al@419
|
202 <form method="post" action="?file=$file" class="nogap">
|
al@419
|
203 <input type="hidden" name="var" value="$(GET var)">
|
al@419
|
204 <input type="text" name="content" value="${data:-$(GET default)}">
|
al@558
|
205 <button type="submit" data-icon="@save@">$(_ 'Save')</button>
|
al@419
|
206 </form>
|
al@419
|
207 </section>
|
pascal@364
|
208 EOT
|
al@419
|
209 ;;
|
al@419
|
210
|
al@419
|
211 diff)
|
al@419
|
212 cat <<EOT
|
al@419
|
213 <section>
|
pascal@534
|
214 $(back_button)
|
al@419
|
215 <pre id="diff">$(file_is_modified $file diff | syntax_highlighter diff)</pre>
|
al@419
|
216 </section>
|
al@419
|
217 EOT
|
al@419
|
218 ;;
|
al@419
|
219
|
al@419
|
220 *)
|
al@340
|
221 R=$(echo -en '\r')
|
pascal@364
|
222 if [ -n "$(POST content)" ]; then
|
pascal@364
|
223 if [ -n "$(POST var)" ]; then
|
pascal@364
|
224 sed -i "s|^\\($(POST var)=\\).*|\1\"$(POST content)\"|" $file
|
pascal@364
|
225 else
|
pascal@364
|
226 sed "s/$R /\n/g;s/$R%0//g" > $file <<EOT
|
pascal@90
|
227 $(POST content)
|
pascal@90
|
228 EOT
|
pascal@364
|
229 fi
|
pascal@364
|
230 fi
|
al@419
|
231
|
pascal@90
|
232 cat <<EOT
|
al@463
|
233 <section class="bigNoScrollable">
|
al@439
|
234 <header>
|
al@558
|
235 <span data-icon="@text@">${title:-$file}</span>
|
pascal@433
|
236 EOT
|
pascal@444
|
237 if [ -w "$file" ]; then
|
pascal@444
|
238 cat <<EOT
|
al@472
|
239 <form>
|
al@419
|
240 <input type="hidden" name="file" value="$file"/>
|
al@472
|
241 <button onclick='editFile(); return false' id="edit_button"
|
al@558
|
242 data-icon="@edit@">$(_ 'Edit')</button><!--
|
al@472
|
243 --><button onclick='saveFile("$file", "$title"); return false' id="save_button"
|
al@558
|
244 data-icon="@save@" style="display:none">$(_ 'Save')</button><!--
|
al@419
|
245 -->$(file_is_modified $file button)
|
al@472
|
246 </form>
|
pascal@433
|
247 EOT
|
pascal@444
|
248 elif [ -r "$file" ]; then
|
pascal@444
|
249 cat <<EOT
|
pascal@444
|
250 <form>
|
pascal@444
|
251 <input type="hidden" name="file" value="$file"/>
|
pascal@444
|
252 $(file_is_modified $file button)
|
pascal@444
|
253 </form>
|
pascal@444
|
254 EOT
|
pascal@444
|
255 fi
|
pascal@433
|
256 cat <<EOT
|
al@439
|
257 </header>
|
al@439
|
258
|
al@419
|
259 <div>
|
al@463
|
260 <pre id="fileContent" class="bigScrollable">
|
al@303
|
261 EOT
|
al@463
|
262 end_code=''
|
pascal@90
|
263 # Handle file type by extension as a Web Server does it.
|
pascal@90
|
264 case "$file" in
|
al@463
|
265 *.sh|*.cgi|*/receipt|*.conf)
|
al@463
|
266 echo '<code class="language-bash">'; end_code='</code>'
|
pascal@504
|
267 htmlize ;;
|
al@463
|
268 *.ini)
|
al@463
|
269 echo '<code class="language-ini">'; end_code='</code>'
|
pascal@504
|
270 htmlize ;;
|
pascal@90
|
271 *.conf|*.lst)
|
pascal@90
|
272 syntax_highlighter conf ;;
|
al@419
|
273 *Xorg.0.log)
|
al@419
|
274 syntax_highlighter xlog ;;
|
al@419
|
275 *dmesg.log)
|
al@419
|
276 syntax_highlighter kernel ;;
|
pascal@90
|
277 *)
|
pascal@504
|
278 htmlize ;;
|
pascal@90
|
279 esac < $file
|
al@419
|
280 cat <<EOT
|
al@463
|
281 $end_code</pre>
|
al@419
|
282 </div>
|
al@419
|
283 </section>
|
al@419
|
284 EOT
|
al@419
|
285 esac
|
al@419
|
286 ;;
|
al@419
|
287
|
al@303
|
288
|
al@312
|
289
|
pankso@191
|
290 *\ terminal\ *|*\ cmd\ *)
|
al@419
|
291 # Cmdline terminal
|
al@419
|
292
|
al@501
|
293 header; xhtml_header "$(_ 'Terminal')"
|
al@419
|
294
|
al@437
|
295 user="$REMOTE_USER"
|
pascal@507
|
296 HOME="$(getdb passwd | awk -F: -vu=$user '$1==u{print $6}')"
|
al@437
|
297 historyfile="$HOME/.ash_history"
|
al@437
|
298
|
pankso@191
|
299 cmd=$(GET cmd)
|
al@437
|
300 path="$(GET path)"; path="${path:-/tmp}"; cd "$path"
|
al@419
|
301
|
al@419
|
302 font="${TERM_FONT:-monospace}"
|
al@419
|
303 palette=$(echo $TERM_PALETTE | tr A-Z a-z)
|
al@419
|
304
|
al@419
|
305 [ -n "$cmd" -a "$cmd" != "$(tail -n1 $historyfile)" ] && echo "$cmd" >> $historyfile
|
al@419
|
306
|
al@419
|
307
|
al@419
|
308 # Terminal history
|
al@419
|
309
|
al@419
|
310 if [ "$cmd" == 'history' ]; then
|
al@419
|
311 cat <<EOT
|
al@312
|
312 <section>
|
al@419
|
313 <header>
|
al@443
|
314 $(_ 'History')
|
al@558
|
315 <form><button name="terminal" data-icon="@terminal@">$(_ 'Back')</button></form>
|
al@419
|
316 </header>
|
al@419
|
317 <form>
|
al@419
|
318 <input type="hidden" name="path" value="$path"/>
|
al@419
|
319 <pre class="term $palette" style="font-family: '$font'">
|
pankso@191
|
320 EOT
|
al@501
|
321
|
al@501
|
322 htmlize < $historyfile | awk -vrun="$(_ 'run')" -vpath="$path" -vq="'" '
|
al@501
|
323 BEGIN { num = 1; }
|
al@501
|
324 {
|
al@501
|
325 printf("%3d ", num);
|
al@501
|
326 cmd = $0;
|
al@501
|
327 gsub("%", "%25", cmd); gsub("+", "%2B", cmd); gsub(" ", "+", cmd);
|
al@501
|
328 gsub("\"", "%22", cmd); gsub("!", "%21", cmd); gsub(q, "%27", cmd);
|
al@558
|
329 printf("<a data-icon=\"@run@\" href=\"?cmd=%s&path=%s\">%s</a> ", cmd, path, run);
|
al@501
|
330 printf("<input type=\"checkbox\" name=\"rm\" value=\"%d\" id=\"hist%d\">", num, num);
|
al@501
|
331 printf("<label for=\"hist%d\">%s</label>\n", num, $0);
|
al@501
|
332 num++;
|
al@501
|
333 }'
|
al@501
|
334
|
al@419
|
335 cat <<EOT
|
al@419
|
336 </pre>
|
al@419
|
337 <footer>
|
al@558
|
338 <button name="rmhistory" data-icon="@remove@">$(_ 'Clear')</button>
|
al@419
|
339 </footer>
|
al@419
|
340 </form>
|
al@419
|
341 </section>
|
al@419
|
342 EOT
|
al@419
|
343 xhtml_footer
|
al@419
|
344 exit 0
|
al@419
|
345 fi
|
al@419
|
346
|
al@419
|
347
|
al@419
|
348 # Terminal window
|
al@419
|
349
|
al@419
|
350 cat <<EOT
|
al@419
|
351 <span id="num_hist"></span>
|
al@419
|
352 <section>
|
al@419
|
353 <pre class="term $palette" style="font-family: '$font'" onclick="document.getElementById('typeField').focus()">
|
al@419
|
354 EOT
|
al@419
|
355 if [ -n "$cmd" ]; then
|
al@437
|
356 term_prompt
|
al@419
|
357 echo "$cmd" | htmlize
|
al@419
|
358 fi
|
al@419
|
359
|
al@419
|
360 case "$cmd" in
|
pankso@191
|
361 usage|help)
|
al@443
|
362 _ 'Small non-interactive terminal emulator.'; echo
|
al@463
|
363 _ 'Run any command at your own risk, avoid interactive commands (%s)' 'nano, mc, ...'; echo
|
al@419
|
364 ;;
|
pankso@191
|
365 wget*)
|
al@501
|
366 dl='/var/cache/downloads'
|
pankso@191
|
367 [ ! -d "$dl" ] && mkdir -p $dl
|
al@443
|
368 _ 'Downloading to: %s' $dl; echo
|
al@419
|
369 cd $dl; $cmd 2>&1 ;;
|
al@419
|
370 cd|cd\ *)
|
al@437
|
371 path="${cmd#cd}"; path="${path:-$HOME}";
|
al@437
|
372 path="$(realpath $path)"; cd "$path" ;;
|
al@419
|
373 ls|ls\ *)
|
al@419
|
374 $cmd -w80 --color=always 2>&1 | filter_taztools_msgs ;;
|
al@419
|
375 cat)
|
pankso@194
|
376 # Cmd must be used with an arg.
|
al@443
|
377 _ '%s needs an argument' "$cmd" ;;
|
al@443
|
378 mc|nano|su)
|
al@419
|
379 # List of restricted (interactive) commands
|
al@443
|
380 _ "Please, don't run interactive command \"%s\"" "$cmd"; echo; echo ;;
|
pankso@191
|
381 *)
|
al@419
|
382 unset HTTP_REFERER # for fooling /lib/libtaz.sh formatting utils (<hr> in the terminal is so-so)
|
al@419
|
383 export DISPLAY=:0.0 # for run X applications
|
al@419
|
384 /bin/sh -c "$cmd" 2>&1 | htmlize | filter_taztools_msgs
|
al@419
|
385 ;;
|
pankso@191
|
386 esac
|
al@419
|
387
|
al@419
|
388 cat <<EOT
|
al@419
|
389 <form id="term">
|
al@437
|
390 <div class="cmdline" id="cmdline"><span id="prompt">$(term_prompt)</span><span id="typeField"> </span></div>
|
al@437
|
391 <input type="hidden" name="path" value="$(pwd)"/>
|
al@419
|
392 <input type="hidden" name="cmd" id="cmd"/>
|
al@419
|
393 </form>
|
al@419
|
394 </pre>
|
al@419
|
395 </section>
|
al@419
|
396
|
al@419
|
397 <form>
|
al@558
|
398 <button name="termsettings" data-icon="@settings@">$(_ 'Settings')</button>
|
al@558
|
399 <button name="cmd" value="history" data-icon="@history@">$(_ 'History')</button>
|
al@419
|
400 </form>
|
al@419
|
401
|
al@419
|
402 <script type="text/javascript">
|
al@419
|
403 with (document.getElementById('typeField')) {
|
al@419
|
404 contentEditable=true;
|
al@419
|
405 focus();
|
al@419
|
406 }
|
al@419
|
407 document.onkeydown=keydownHandler;
|
al@419
|
408 EOT
|
al@419
|
409
|
al@419
|
410 # Export history as array.
|
al@419
|
411 # Escape "all \"quotes\" in quotes", and all '\'
|
al@419
|
412 # (because \u, \x, \c has special meaning and can produce syntax error and stop js)
|
al@419
|
413 sed 's|\\|\\\\|g; s|"|\\"|g' $historyfile | awk '
|
al@419
|
414 BEGIN{ i=1; printf("ash_history=[") }
|
al@419
|
415 { printf("\"%s\",", $0); i++ }
|
al@419
|
416 END{
|
al@419
|
417 printf("\"\"];")
|
al@419
|
418 i--; printf("cur_hist=\"%d\";max_hist=\"%d\";", i, i)
|
al@419
|
419 }'
|
al@419
|
420 cat <<EOT
|
al@419
|
421 </script>
|
al@419
|
422 EOT
|
al@312
|
423 ;;
|
al@312
|
424
|
al@312
|
425
|
al@419
|
426 *\ rmhistory\ *)
|
al@419
|
427 # Manage shell commandline history
|
al@437
|
428 user="$REMOTE_USER"
|
pascal@507
|
429 HOME="$(getdb passwd | awk -F: -vu="$user" '$1==u{print $6}')"
|
al@437
|
430 historyfile="$HOME/.ash_history"
|
al@419
|
431
|
al@419
|
432 # Return sed command for removing history lines ('8d12d' to remove 8 and 12 lines)
|
al@419
|
433 rms=$(echo $QUERY_STRING | awk 'BEGIN{RS="&";FS="="}{if($1=="rm")printf "%dd", $2}')
|
al@419
|
434
|
al@419
|
435 if [ -n "$rms" ]; then
|
al@419
|
436 # Actually remove lines
|
al@419
|
437 sed -i $rms $historyfile
|
al@419
|
438 # Redirects back to the history table
|
al@419
|
439 header "HTTP/1.1 301 Moved Permanently" "Location: ?terminal&cmd=history&path=$(GET path)"
|
al@419
|
440 exit 0
|
al@419
|
441 fi
|
al@419
|
442 ;;
|
al@419
|
443
|
al@419
|
444
|
al@419
|
445 *\ termsettings\ *)
|
al@419
|
446 # Terminal settings
|
al@501
|
447 header; xhtml_header "$(_ 'Terminal')"
|
al@419
|
448 user="$REMOTE_USER"
|
al@419
|
449 font="$(GET font)"; font="${font:-$TERM_FONT}"
|
al@419
|
450 palette="$(GET palette)"; palette="${palette:-$TERM_PALETTE}"
|
al@419
|
451 pal=$(echo $palette | tr A-Z a-z)
|
al@419
|
452
|
al@419
|
453 # Add or change settings in TazPanel config
|
al@419
|
454 if [ -z "$TERM_FONT" ]; then
|
al@419
|
455 echo -e "\n# Terminal font family\nTERM_FONT=\"$font\"" >> $CONFIG
|
al@419
|
456 else
|
al@419
|
457 sed -i "s|TERM_FONT=.*|TERM_FONT=\"$font\"|" $CONFIG
|
al@419
|
458 fi
|
al@419
|
459 if [ -z "$TERM_PALETTE" ]; then
|
al@419
|
460 echo -e "\n# Terminal color palette\nTERM_PALETTE=\"$palette\"" >> $CONFIG
|
al@419
|
461 else
|
al@419
|
462 sed -i "s|TERM_PALETTE=.*|TERM_PALETTE=\"$palette\"|" $CONFIG
|
al@419
|
463 fi
|
al@419
|
464
|
al@419
|
465 cat <<EOT
|
al@463
|
466 <section style="position: absolute; top: 0; bottom: 0; left: 0; right: 0; margin: 0.5rem;">
|
al@419
|
467 <header>
|
al@443
|
468 $(_ 'Terminal settings')
|
al@419
|
469 <form>
|
al@558
|
470 <button name="terminal" data-icon="@terminal@">$(_ 'Terminal')</button>
|
al@419
|
471 </form>
|
al@419
|
472 </header>
|
al@419
|
473 <pre class="term $pal" style="height: auto; font-family: '$font'">
|
al@419
|
474 <span class='color31'>$user@$(hostname)</span>:<span class='color33'>~</span># palette
|
al@419
|
475
|
al@419
|
476 $(
|
al@419
|
477 for i in $(seq 30 37); do
|
al@419
|
478 for b in 0 1; do
|
al@419
|
479 for j in $(seq 40 47); do
|
al@419
|
480 echo -n "<span class=\"color$b color$i color$j\">$i:$j</span>"
|
al@419
|
481 done
|
al@419
|
482 done
|
al@419
|
483 echo
|
al@419
|
484 done
|
al@419
|
485 )
|
al@419
|
486 </pre>
|
al@419
|
487 <footer>
|
al@419
|
488 <form class="wide">
|
al@443
|
489 $(_ 'Font:')
|
al@419
|
490 <select name="font">
|
al@443
|
491 <option value="">$(_ 'Default')</option>
|
al@419
|
492 $(fc-list :spacing=mono:lang=en family | sed '/\.pcf/d;/,/d;s|\\-|-|g' | sort -u | \
|
al@419
|
493 awk -vfont="$font" '{
|
al@419
|
494 printf("<option value=\"%s\"%s>%s</option>\n", $0, ($0 == font)?" selected":"", $0)
|
al@419
|
495 }')
|
al@419
|
496 </select>
|
al@443
|
497 $(_ 'Palette:')
|
al@419
|
498 <select name="palette">
|
al@419
|
499 $(echo -e 'Tango\nLinux\nXterm\nRxvt\nEcho' | awk -vpal="$palette" '{
|
al@419
|
500 printf("<option value=\"%s\"%s>%s</option>\n", $0, ($0 == pal)?" selected":"", $0)
|
al@419
|
501 }')
|
al@419
|
502 </select>
|
al@558
|
503 <button name="termsettings" data-icon="@ok@">$(_ 'Apply')</button>
|
al@419
|
504 </form>
|
al@419
|
505 </footer>
|
al@419
|
506 </section>
|
al@419
|
507 EOT
|
al@419
|
508
|
al@419
|
509 ;;
|
al@419
|
510
|
al@419
|
511
|
pascal@144
|
512 *\ top\ *)
|
al@501
|
513 header; xhtml_header "$(_ 'Process activity')"
|
al@419
|
514
|
al@419
|
515 r=$(GET refresh)
|
al@419
|
516 cat <<EOT
|
al@419
|
517 <form>
|
al@443
|
518 <p>$(_ 'Refresh:')
|
naitsirhc@268
|
519 <input type="hidden" name="top"/>
|
al@419
|
520 <input type="radio" name="refresh" value="1" id="r1" $([ "$r" == 1 ] && echo checked) onchange="this.form.submit()"/>
|
al@443
|
521 <label for="r1">$(_ '1s' )</label>
|
al@419
|
522 <input type="radio" name="refresh" value="5" id="r2" $([ "$r" == 5 ] && echo checked) onchange="this.form.submit()"/>
|
al@443
|
523 <label for="r2">$(_ '5s' )</label>
|
al@419
|
524 <input type="radio" name="refresh" value="10" id="r3" $([ "$r" == 10 ] && echo checked) onchange="this.form.submit()"/>
|
al@443
|
525 <label for="r3">$(_ '10s' )</label>
|
al@419
|
526 <input type="radio" name="refresh" value="" id="r4" $([ -z "$r" ] && echo checked) onchange="this.form.submit()"/>
|
al@443
|
527 <label for="r4">$(_ 'none')</label>
|
al@419
|
528 </p>
|
al@303
|
529 </form>
|
al@303
|
530 EOT
|
al@419
|
531 [ -n "$r" ] && echo "<meta http-equiv=\"refresh\" content=\"$r\">"
|
naitsirhc@268
|
532
|
pascal@530
|
533 [ "$(GET renice)" ] && renice $(GET renice)
|
pascal@551
|
534 [ "$(GET ionice)" ] && ionice $(GET ionice)
|
pascal@533
|
535 [ "$(GET kill)" ] && kill $(GET kill)
|
pascal@533
|
536 if [ "$(GET pid)" ] && [ -d /proc/$(GET pid)/ ]; then
|
pascal@533
|
537 curpid=$(GET pid)
|
pascal@549
|
538 curnice=$(awk '{ print int($19) }' /proc/$curpid/stat)
|
pascal@549
|
539 bootttime=$(awk '{print int($22/100)}' /proc/$curpid/stat)
|
pascal@549
|
540 uptime=$(awk '{print int($1)}' /proc/uptime)
|
pascal@548
|
541 now=$(date +%s)
|
pascal@548
|
542 starttime=$(date -d @$(($now - ($uptime - $bootttime))))
|
pascal@530
|
543 cat <<EOT
|
pascal@530
|
544 <section>
|
pascal@533
|
545 <header>
|
al@592
|
546 $(ps auxww 2>/dev/null | sed "/^ *$curpid /!d")
|
pascal@533
|
547 <form>
|
pascal@533
|
548 <input type="hidden" name="top"/>
|
al@558
|
549 <button type="submit" data-icon="@remove@" name="kill" value="$curpid">$(_ 'Kill')</button>
|
pascal@533
|
550 </form>
|
pascal@533
|
551 </header>
|
pascal@530
|
552 <form>
|
pascal@548
|
553 <p>$(_ 'Start time:')
|
pascal@548
|
554 $starttime
|
pascal@547
|
555 </p>
|
pascal@551
|
556 <p>$(_ 'Renice')
|
pascal@530
|
557 <input type="hidden" name="top"/>
|
pascal@551
|
558 <select name "renice" onchange="this.form.submit()">
|
pascal@530
|
559 EOT
|
pascal@551
|
560 values="$(seq 20 -1 -20)"
|
pascal@551
|
561 [ $(id -u) -eq 0 ] || values="$(seq 20 -1 0)"
|
pascal@530
|
562 for i in $values ; do
|
pascal@530
|
563 cat <<EOT
|
pascal@551
|
564 <option value="$i $curpid" $([ $curnice -eq $i ] && echo selected)>$(printf "%+d" $i)</option>
|
pascal@530
|
565 EOT
|
pascal@530
|
566 done
|
pascal@530
|
567 cat <<EOT
|
pascal@551
|
568 </select>
|
pascal@551
|
569 $(_ 'I/O class')
|
pascal@551
|
570 <select name="ionice" onchange="this.form.submit()">
|
pascal@551
|
571 EOT
|
pascal@551
|
572 while read class name max; do
|
pascal@551
|
573 if [ "$max" ]; then
|
pascal@551
|
574 [ $(id -u) -ne 0 ] && continue
|
pascal@551
|
575 for i in $(seq 0 $max); do
|
pascal@551
|
576 selected="selected"
|
pascal@551
|
577 [ "$(ionice $curpid)" = "$name: prio $i" ] || selected=""
|
pascal@551
|
578 echo " <option value=\"-c $class -n $i -p $curpid\" $selected>$name: prio $i</option>"
|
pascal@551
|
579 done
|
pascal@551
|
580 else
|
pascal@551
|
581 selected="selected"
|
pascal@551
|
582 [ "$(ionice $curpid)" = "$name" ] || selected=""
|
pascal@551
|
583 echo " <option value=\"-c $class -p $curpid\" $selected>$name</option>"
|
pascal@551
|
584 fi
|
pascal@551
|
585 done <<EOT
|
pascal@551
|
586 0 none
|
pascal@551
|
587 1 realtime 7
|
pascal@551
|
588 2 best-effort 7
|
pascal@551
|
589 3 idle
|
pascal@551
|
590 EOT
|
pascal@551
|
591 cat <<EOT
|
pascal@551
|
592 </select>
|
pascal@530
|
593 </p>
|
pascal@530
|
594 </form>
|
pascal@530
|
595 </section>
|
pascal@530
|
596 EOT
|
pascal@530
|
597 fi
|
al@419
|
598 echo '<section><div><pre class="term log">'
|
pascal@530
|
599 busybox top -n1 -b | htmlize | sed \
|
pascal@530
|
600 -e 's|^\( *\)\([0-9][0-9]*\)|\1<a href="?top\&pid=\2">\2</a>|' \
|
al@419
|
601 -e 's|^[A-Z].*:|<span class="color1 color31">\0</span>|g' \
|
al@419
|
602 -e 's|^\ *PID|<span class="color1 color32">\0</span>|g'
|
al@419
|
603 echo '</pre></div></section>' ;;
|
al@303
|
604
|
al@312
|
605
|
pascal@81
|
606 *\ debug\ *)
|
al@501
|
607 header; xhtml_header "$(_ 'Debug')"
|
al@419
|
608
|
al@419
|
609 cat <<EOT
|
al@443
|
610 <h2>$(_ 'HTTP Environment')</h2>
|
al@303
|
611
|
al@419
|
612 <section>
|
al@419
|
613 <div>
|
al@419
|
614 <pre>$(httpinfo | syntax_highlighter conf)</pre>
|
al@419
|
615 </div>
|
al@419
|
616 </section>
|
al@303
|
617 EOT
|
al@303
|
618 ;;
|
al@303
|
619
|
al@312
|
620
|
pankso@161
|
621 *\ report\ *)
|
al@501
|
622 header; xhtml_header "$(_ 'System report')"
|
al@419
|
623
|
al@501
|
624 [ -d '/var/cache/slitaz' ] || mkdir -p /var/cache/slitaz
|
al@501
|
625 output='/var/cache/slitaz/sys-report.html'
|
al@419
|
626
|
al@419
|
627 cat <<EOT
|
al@419
|
628 <section>
|
al@443
|
629 <header>$(_ 'Reporting to: %s' "$output")</header>
|
al@419
|
630 <table class="wide zebra">
|
al@419
|
631 <tbody>
|
al@443
|
632 <tr><td>$(_ 'Creating report header...')</td>
|
al@303
|
633 EOT
|
al@419
|
634 cat > $output <<EOT
|
pankso@161
|
635 <!DOCTYPE html>
|
pankso@161
|
636 <html xmlns="http://www.w3.org/1999/xhtml">
|
pankso@161
|
637 <head>
|
al@419
|
638 <meta charset="utf-8"/>
|
al@443
|
639 <title>$(_ 'SliTaz system report')</title>
|
pankso@161
|
640 <style type="text/css">
|
al@303
|
641 body { padding: 20px 60px; font-size: 13px; }
|
al@303
|
642 h1, h2 { color: #444; }
|
pankso@161
|
643 pre { background: #f1f1f1; border: 1px solid #ddd;
|
pankso@161
|
644 padding: 10px; border-radius: 4px; }
|
pascal@166
|
645 span.diff-rm { color: red; }
|
pascal@166
|
646 span.diff-add { color: green; }
|
pankso@161
|
647 </style>
|
pankso@161
|
648 </head>
|
pankso@161
|
649 <body>
|
pankso@161
|
650 EOT
|
al@419
|
651 cat <<EOT
|
al@303
|
652 $(ok_status_t)
|
al@443
|
653 <tr><td>$(_ 'Creating system summary...')</td>
|
al@303
|
654 EOT
|
al@419
|
655 cat >> $output <<EOT
|
al@443
|
656 <h1>$(_ 'SliTaz system report')</h1>
|
al@443
|
657 $(_ 'Date:') $(date)
|
pankso@161
|
658 <pre>
|
pascal@163
|
659 uptime : $(uptime)
|
pankso@161
|
660 cmdline : $(cat /proc/cmdline)
|
pankso@161
|
661 version : $(cat /etc/slitaz-release)
|
pankso@161
|
662 packages : $(ls /var/lib/tazpkg/installed | wc -l) installed
|
pankso@161
|
663 kernel : $(uname -r)
|
pankso@161
|
664 </pre>
|
pankso@161
|
665 EOT
|
al@419
|
666 cat <<EOT
|
al@303
|
667 $(ok_status_t)
|
al@443
|
668 <tr><td>$(_ 'Getting hardware info...')</td>
|
al@303
|
669 EOT
|
al@419
|
670 cat >> $output <<EOT
|
pankso@161
|
671 <h2>free</h2>
|
al@303
|
672 <pre>$(free)</pre>
|
pankso@161
|
673
|
pankso@161
|
674 <h2>lspci -k</h2>
|
al@303
|
675 <pre>$(lspci -k)</pre>
|
pankso@161
|
676
|
pankso@161
|
677 <h2>lsusb</h2>
|
al@303
|
678 <pre>$(lsusb)</pre>
|
pankso@161
|
679
|
pankso@161
|
680 <h2>lsmod</h2>
|
al@303
|
681 <pre>$(lsmod)</pre>
|
pankso@161
|
682
|
pankso@161
|
683 EOT
|
al@419
|
684 cat <<EOT
|
al@303
|
685 $(ok_status_t)
|
al@443
|
686 <tr><td>$(_ 'Getting networking info...')</td>
|
al@303
|
687 EOT
|
al@419
|
688 cat >> $output <<EOT
|
pankso@161
|
689 <h2>ifconfig -a</h2>
|
al@303
|
690 <pre>$(ifconfig -a)</pre>
|
al@303
|
691
|
pascal@163
|
692 <h2>route -n</h2>
|
al@303
|
693 <pre>$(route -n)</pre>
|
al@303
|
694
|
pascal@163
|
695 <h2>/etc/resolv.conf</h2>
|
al@303
|
696 <pre>$(cat /etc/resolv.conf)</pre>
|
pascal@163
|
697 EOT
|
al@419
|
698 cat <<EOT
|
al@303
|
699 $(ok_status_t)
|
al@443
|
700 <tr><td>$(_ 'Getting filesystems info...')</td>
|
al@303
|
701 EOT
|
al@419
|
702 cat >> $output <<EOT
|
pascal@163
|
703 <h2>blkid</h2>
|
al@303
|
704 <pre>$(blkid)</pre>
|
al@303
|
705
|
pascal@163
|
706 <h2>fdisk -l</h2>
|
al@303
|
707 <pre>$(fdisk -l)</pre>
|
al@303
|
708
|
pascal@163
|
709 <h2>mount</h2>
|
al@303
|
710 <pre>$(mount)</pre>
|
al@303
|
711
|
pascal@163
|
712 <h2>df -h</h2>
|
al@303
|
713 <pre>$(df -h)</pre>
|
al@303
|
714
|
pascal@163
|
715 <h2>df -i</h2>
|
al@303
|
716 <pre>$(df -i)</pre>
|
pascal@163
|
717 EOT
|
al@419
|
718 cat <<EOT
|
al@303
|
719 $(ok_status_t)
|
al@443
|
720 <tr><td>$(_ 'Getting boot logs...')</td>
|
al@303
|
721 EOT
|
al@419
|
722 cat >> $output <<EOT
|
al@443
|
723 <h2>$(_ 'Kernel messages')</h2>
|
al@303
|
724 <pre>$(cat /var/log/dmesg.log)</pre>
|
al@303
|
725
|
al@443
|
726 <h2>$(_ 'Boot scripts')</h2>
|
pascal@504
|
727 <pre>$(filter_taztools_msgs < /var/log/boot.log)</pre>
|
pascal@520
|
728 EOT
|
pascal@520
|
729 cat <<EOT
|
pascal@520
|
730 $(ok_status_t)
|
pascal@520
|
731 <tr><td>$(_ 'Getting package list...')</td>
|
pascal@520
|
732 EOT
|
pascal@520
|
733 cat >> $output <<EOT
|
pascal@514
|
734 <h2>$(_ 'Packages')</h2>
|
pankso@161
|
735 EOT
|
pascal@514
|
736 ( cd /var/lib/tazpkg/installed
|
pascal@514
|
737 for i in * ; do
|
pascal@520
|
738 echo "$i $(. $i/receipt ; echo "$VERSION $DEPENDS" | xargs echo ;
|
pascal@520
|
739 echo "$PROVIDE" | sed 's/:[^ ]*//g' | xargs echo PROVIDE)"
|
pascal@520
|
740 done ) | awk '{
|
pascal@520
|
741 if ($1 == "PROVIDE") {
|
pascal@520
|
742 for (i = 2; i <= NF; i++) alias[$i] = 1
|
pascal@520
|
743 }
|
pascal@520
|
744 else { pkg[$1]=$0; idx[c++]=$1 }
|
pascal@520
|
745 }
|
pascal@514
|
746 function name(n)
|
pascal@514
|
747 {
|
pascal@514
|
748 split(pkg[n], x, " ")
|
pascal@514
|
749 return x[1] " (" x[2] ") "
|
pascal@514
|
750 }
|
pascal@514
|
751 END {
|
pascal@514
|
752 print "<pre>"
|
pascal@514
|
753 for (i in pkg) for (j = split(pkg[i], p, " "); j > 2; j--) {
|
pascal@520
|
754 if (pkg[p[j]] || alias[p[j]]) kill[p[j]]=1
|
pascal@523
|
755 else { miss=1 ; print "Missing dep " p[j] " for " name(p[1]) }
|
pascal@514
|
756 }
|
pascal@523
|
757 if (miss) print ""
|
pascal@514
|
758 n=0
|
pascal@514
|
759 for (i=0; i < c; i++) {
|
pascal@514
|
760 if (kill[idx[i]]) continue
|
pascal@514
|
761 printf "%s" name(idx[i])
|
pascal@520
|
762 if (n++ < 2) continue
|
pascal@514
|
763 printf "\n"
|
pascal@514
|
764 n=0
|
pascal@514
|
765 }
|
pascal@514
|
766 print "</pre>"
|
pascal@514
|
767 }
|
pascal@514
|
768 ' >> $output
|
pascal@513
|
769 if [ "$(ls report.d/* 2> /dev/null)" ]; then
|
pascal@513
|
770 cat <<EOT
|
pascal@513
|
771 $(ok_status_t)
|
pascal@513
|
772 <tr><td>$(_ 'Getting extra reports...')</td>
|
pascal@513
|
773 EOT
|
pascal@513
|
774 for i in report.d/* ; do
|
pascal@513
|
775 sh $i $i >> $output
|
pascal@513
|
776 done
|
pascal@513
|
777 fi
|
al@419
|
778 cat <<EOT
|
al@303
|
779 $(ok_status_t)
|
al@443
|
780 <tr><td>$(_ 'Creating report footer...')</td>
|
al@303
|
781 EOT
|
pascal@504
|
782 cat >> $output <<EOT
|
pankso@161
|
783 </body>
|
pankso@161
|
784 </html>
|
pankso@161
|
785 EOT
|
al@419
|
786 cat <<EOT
|
al@303
|
787 $(ok_status_t)
|
al@419
|
788 </tbody>
|
al@419
|
789 </table>
|
al@419
|
790 <footer>
|
al@558
|
791 <form><button name="file" value="$output" data-icon="@view@">$(_ 'View')</button></form>
|
al@419
|
792 </footer>
|
al@419
|
793 </section>
|
al@419
|
794
|
al@419
|
795
|
al@443
|
796 $(msg tip "$(_ 'This report can be attached with a bug report on:')
|
al@419
|
797 <a href="http://bugs.slitaz.org/" target="_blank">bugs.slitaz.org</a></p>")
|
al@303
|
798 EOT
|
al@303
|
799 ;;
|
al@312
|
800
|
al@312
|
801
|
pankso@2
|
802 *)
|
pankso@14
|
803 #
|
pankso@2
|
804 # Default xHTML content
|
pankso@14
|
805 #
|
al@501
|
806 header; xhtml_header "$(_ 'SliTaz administration and configuration Panel')"
|
pascal@81
|
807 [ -n "$(GET gen_locale)" ] && new_locale=$(GET gen_locale)
|
pascal@81
|
808 [ -n "$(GET rdate)" ] && echo ""
|
al@303
|
809 hostname=$(hostname)
|
al@419
|
810
|
al@419
|
811 cat <<EOT
|
al@419
|
812 <form class="nogap"><!--
|
al@558
|
813 --><button name="terminal" data-icon="@terminal@">$(_ 'Terminal')</button><!--
|
al@558
|
814 --><button name="top" data-icon="@proc@">$(_ 'Process activity')</button><!--
|
al@558
|
815 --><button name="report" data-icon="@report@" data-root>$(_ 'Create a report')</button><!--
|
al@437
|
816 --></form>
|
pankso@14
|
817
|
al@312
|
818 <section>
|
al@443
|
819 <header>$(_ 'Summary')</header>
|
al@419
|
820 <table>
|
al@501
|
821 <tr><td>$(_ 'Host:')</td><td>$hostname</td></tr>
|
al@443
|
822 <tr><td>$(_ 'Uptime:')</td>
|
al@419
|
823 <td id="uptime">$(uptime | sed 's|\([0-9.:][0-9.:]*\)|<b>\1</b>|g')</td>
|
al@419
|
824 </tr>
|
al@443
|
825 <tr><td>$(_ 'Memory in Mb:')</td>
|
al@419
|
826 <td>$(free -m | grep Mem: | \
|
al@419
|
827 awk -vline="$(gettext 'Total: %d, Used: %d, Free: %d')" \
|
al@419
|
828 '{ printf(line, $2, $3, $4) }' | \
|
al@419
|
829 sed 's|\([0-9][0-9]*\)|<b>\1</b>|g')</td>
|
al@419
|
830 </tr>
|
al@443
|
831 <tr><td>$(_ 'Linux kernel:')</td>
|
al@419
|
832 <td>$(uname -r)</td>
|
al@419
|
833 </tr>
|
al@419
|
834 </table>
|
al@419
|
835 </section>
|
al@419
|
836
|
al@419
|
837
|
al@419
|
838 <section>
|
al@419
|
839 <header>
|
al@443
|
840 $(_ 'Network status')
|
al@419
|
841 <form action="network.cgi">
|
al@558
|
842 <button data-icon="@wifi@">$(_ 'Network')</button>
|
al@419
|
843 </form>
|
al@419
|
844 </header>
|
al@419
|
845 $(list_network_interfaces)
|
al@419
|
846 </section>
|
al@419
|
847
|
al@419
|
848
|
al@419
|
849 <section>
|
al@419
|
850 <header>
|
al@443
|
851 $(_ 'Filesystem usage statistics')
|
al@419
|
852 <form action="hardware.cgi">
|
al@558
|
853 <button data-icon="@hdd@">$(_ 'Disks')</button>
|
al@419
|
854 </form>
|
al@419
|
855 </header>
|
al@419
|
856 <table class="wide zebra center">
|
al@303
|
857 EOT
|
al@419
|
858 # Disk stats (management is done as hardware.cgi)
|
al@419
|
859 df_thead
|
al@419
|
860 echo '<tbody>'
|
al@419
|
861 df -h | grep ^/dev | while read fs size used av pct mp; do
|
al@419
|
862 cat <<EOT
|
al@419
|
863 <tr>
|
al@558
|
864 <td><span data-icon="@hdd@">${fs#/dev/}</span></td>
|
al@419
|
865 <td>$(blkid $fs | sed '/LABEL=/!d;s/.*LABEL="\([^"]*\).*/\1/')</td>
|
al@419
|
866 <td>$(blkid $fs | sed '/TYPE=/!d;s/.*TYPE="\([^"]*\).*/\1/')</td>
|
al@419
|
867 <td>$size</td>
|
al@419
|
868 <td>$av</td>
|
al@419
|
869 <td class="meter"><meter min="0" max="100" value="$(echo $pct | cut -d% -f1)"
|
al@419
|
870 low="$DU_WARN" high="$DU_CRIT" optimum="10"></meter>
|
al@419
|
871 <span>$used - $pct</span>
|
al@419
|
872 </td>
|
al@419
|
873 <td>$mp</td>
|
al@419
|
874 <td>$(blkid $fs | sed '/UUID=/!d;s/.*UUID="\([^"]*\).*/\1/')</td>
|
al@419
|
875 </tr>
|
al@303
|
876 EOT
|
al@303
|
877 done
|
al@419
|
878 cat <<EOT
|
al@419
|
879 </tbody>
|
al@419
|
880 </table>
|
al@312
|
881 </section>
|
pankso@14
|
882
|
al@312
|
883 <section>
|
al@419
|
884 <header>
|
al@443
|
885 $(_ 'Panel Activity')
|
al@419
|
886 <form>
|
al@558
|
887 <button name="file" value="$LOG_FILE" data-icon="@view@">$(_ 'View')</button>
|
al@419
|
888 </form>
|
al@419
|
889 </header>
|
al@419
|
890 <div>
|
al@419
|
891 <pre id="panel-activity">
|
pascal@504
|
892 $(tail -n 8 < $LOG_FILE | sort -r | syntax_highlighter activity)</pre>
|
al@419
|
893 </div>
|
al@312
|
894 </section>
|
pankso@2
|
895 EOT
|
pankso@2
|
896 ;;
|
pankso@2
|
897 esac
|
pankso@2
|
898
|
pankso@14
|
899 xhtml_footer
|
pankso@14
|
900 exit 0
|