tazpanel annotate lib/libtazpanel @ rev 511

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