tazpanel annotate index.cgi @ rev 626

Remove ashism ==
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Feb 26 08:30:05 2019 +0100 (2019-02-26)
parents 608186268f8e
children 8e4c1fe85462
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
pascal@613 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() {
pascal@626 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)
pascal@626 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
pascal@626 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"/>
pascal@626 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>
pascal@626 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>
pascal@626 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@615 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\&amp;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:')
pascal@606 797 <a href="http://bugs.slitaz.org/" target="_blank" rel="noopener">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