tazpanel annotate index.cgi @ rev 548

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