tazpanel annotate lib/libtazpanel @ rev 501

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