tazpanel annotate lib/libtazpanel @ rev 419
Bunch of changes. Development in progress, please note it have few known bugs.
author | Aleksej Bobylev <al.bobylev@gmail.com> |
---|---|
date | Tue Mar 24 03:39:08 2015 +0200 (2015-03-24) |
parents | f3a7fb3d92ec |
children | 2ce8e949aef9 |
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 |
pankso@15 | 8 |
pascal@377 | 9 [ "$(id -un)" == "${REMOTE_USER:-root}" ] || exec su -c "$(realpath $0) $@" $REMOTE_USER |
pascal@376 | 10 |
al@419 | 11 |
pascal@81 | 12 # Get parameters with GET, POST and FILE functions |
al@419 | 13 |
mojo@310 | 14 . /usr/lib/slitaz/httphelper |
pascal@81 | 15 |
al@419 | 16 |
pankso@109 | 17 # I18n |
al@419 | 18 |
pankso@286 | 19 . /etc/locale.conf |
pankso@40 | 20 . /usr/bin/gettext.sh |
pankso@40 | 21 TEXTDOMAIN='tazpanel' |
pankso@286 | 22 export TEXTDOMAIN LANG LC_ALL |
pankso@40 | 23 |
al@419 | 24 |
pankso@15 | 25 # We need a config file first |
al@419 | 26 |
pankso@15 | 27 get_config() { |
al@419 | 28 CONFIG='/etc/slitaz/tazpanel.conf' |
al@419 | 29 if [ -f "$CONFIG" ]; then |
al@419 | 30 . $CONFIG |
al@419 | 31 else |
al@419 | 32 echo "No config file found: $CONFIG" |
pankso@15 | 33 exit 1 |
al@419 | 34 fi |
pankso@15 | 35 } |
pankso@15 | 36 |
al@419 | 37 |
al@303 | 38 # Display < > & |
al@419 | 39 |
al@303 | 40 htmlize() { |
al@303 | 41 sed -e 's|\&|\&|g; s|<|\<|g; s|>|\>|g' |
al@303 | 42 } |
al@303 | 43 |
al@419 | 44 |
pankso@74 | 45 # Syntax highlighting for config file and SHell scripts |
al@419 | 46 |
pankso@74 | 47 syntax_highlighter() { |
pankso@74 | 48 case $1 in |
pankso@74 | 49 conf) |
al@303 | 50 htmlize | sed \ |
al@419 | 51 -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 | 52 -e 's|^[ \t]*#.*|<span class="conf-comment">\0</span>|g' ;; |
al@419 | 53 #-e s"#^\#\([^']*\)#<span class='conf-comment'>\0</span>#"g \ |
al@419 | 54 #-e s"#^[A-Z]\([^']*\)=#<span class='conf-var'>\0</span>#"g \ |
al@419 | 55 #-e s"#^[a-z]\([^']*\)#<span class='conf-var'>\0</span>#"g \ |
al@419 | 56 #-e s"#[\"']\([^']*\)[\"']#<span class='conf-val'>\0</span>#"g ;; |
pankso@75 | 57 sh) |
al@303 | 58 htmlize | sed \ |
al@419 | 59 -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 | 60 -e 's|^#.*|<span class="sh-comment">\0</span>|g' ;; |
al@419 | 61 #-e s"#^\#\([^']*\)#<span class='sh-comment'>\0</span>#"g \ |
al@419 | 62 #-e s"#\"\([^']*\)\"#<span class='sh-val'>\0</span>#"g ;; |
pascal@91 | 63 diff) |
al@303 | 64 htmlize | sed \ |
al@419 | 65 -e 's|^-.*|<span class="diff-rm">\0</span>|g' \ |
al@419 | 66 -e 's|^+.*|<span class="diff-add">\0</span>|g' \ |
al@419 | 67 -e 's|^@.*|<span class="diff-at">\0</span>|g' ;; |
pankso@120 | 68 activity) |
al@419 | 69 # realize lazy quantification |
al@419 | 70 sed -e "s|: |ⓒ|; s|^\(.*\)ⓒ|<span class='activity-log'>\1:</span> |" ;; |
al@303 | 71 kernel) |
al@419 | 72 # line with "ⓒ": realize lazy quantification |
al@303 | 73 htmlize | sed \ |
al@303 | 74 -e "s|\([^0-9]\)\(0x[0-9a-f]\+\)|\1<span class='kernel-hex'>\2</span>|g" \ |
al@419 | 75 -e "s|: |ⓒ|; s|^\(.*\)ⓒ|<span class='kernel-id'>\1:</span> |" \ |
al@419 | 76 -e "s|\(\[[^ ]\+\]\)|<span class='kernel-id2'>\0</span>|g" \ |
al@419 | 77 -e "s|Call Trace:|<span class='kernel-trace'>\0</span>|" ;; |
al@363 | 78 lsusb) |
al@363 | 79 htmlize | sed \ |
al@363 | 80 -e 's|^[^:]*:[ x0-9a-f^:]*$|<span class="lsusb-t">\0</span>|g' \ |
al@363 | 81 -e 's|^Bus.*$|<span class="lsusb-h">\0</span>|g' ;; |
al@363 | 82 lspci) |
al@363 | 83 htmlize | sed \ |
al@363 | 84 -e 's|^[0-9a-f].*$|<span class="lspci-t">\0</span>|g' \ |
al@363 | 85 -e 's|^ \([^:]*:\)| <span class="lspci-h">\1</span>|g' ;; |
al@419 | 86 xlog) |
al@419 | 87 htmlize | sed \ |
al@419 | 88 -e 's|^[^]]*]|<span class="xlog xlog-timestamp">\0</span>|' \ |
al@419 | 89 -e 's|(--)|<span class="xlog xlog-probed" title="probed">\0</span>|' \ |
al@419 | 90 -e 's|(\*\*)|<span class="xlog xlog-config" title="from config file">\0</span>|' \ |
al@419 | 91 -e 's|(==)|<span class="xlog xlog-default" title="default setting">\0</span>|' \ |
al@419 | 92 -e 's|(++)|<span class="xlog xlog-cmdline" title="from command line">\0</span>|' \ |
al@419 | 93 -e 's|(!!)|<span class="xlog xlog-notice" title="notice">\0</span>|' \ |
al@419 | 94 -e 's|(II)|<span class="xlog xlog-info" title="informational">\0</span>|' \ |
al@419 | 95 -e 's|(WW)|<span class="xlog xlog-warn" title="warning">\0</span>|' \ |
al@419 | 96 -e 's|(EE)|<span class="xlog xlog-error" title="error">\0</span>|' \ |
al@419 | 97 -e 's|(NI)|<span class="xlog xlog-ni" title="not implemented">\0</span>|' \ |
al@419 | 98 -e 's|(??)|<span class="xlog xlog-unknown" title="unknown">\0</span>|' \ |
al@419 | 99 ;; |
pankso@74 | 100 esac |
pankso@53 | 101 } |
pankso@53 | 102 |
al@419 | 103 |
pascal@99 | 104 # Remove status and ESC char from tazpkg/tazlito commands output |
al@419 | 105 |
pascal@99 | 106 filter_taztools_msgs() { |
al@419 | 107 sed \ |
al@419 | 108 -e 's|\\[0m|</span>|g' \ |
al@419 | 109 -e 's|\\[0;39m|</span>|g' \ |
al@419 | 110 -e 's|\\[0*\([0-7]*\);\([0-7]*\)m|<span class="color\1 color\2">|g' \ |
pascal@412 | 111 -e ':a;s/^\(.\{0,69\}\)\(\\[[0-9]*G\[\)/\1 \2/;ta' \ |
al@419 | 112 -e ':b;s|^\([^\]*\)\\[\([0-9]*\)G|<span style="display:inline-block;width:\2ex">\1</span>|;tb' \ |
al@419 | 113 -e 's/\[^Gm]*.//g' |
pascal@99 | 114 } |
pascal@99 | 115 |
al@419 | 116 |
pankso@51 | 117 # LOG activities |
al@419 | 118 |
pankso@51 | 119 log() { |
al@419 | 120 date=$(date "+%F %R") |
al@419 | 121 filter_taztools_msgs | sed "s|[^']*|$date : \0|" >> $LOG_FILE |
pankso@51 | 122 } |
pankso@51 | 123 |
al@419 | 124 |
pankso@161 | 125 ok_status() { |
al@419 | 126 echo '[<span class="diff-add"> OK </span>]' |
pankso@161 | 127 } |
pankso@161 | 128 |
al@419 | 129 |
pankso@40 | 130 # Network interface status |
al@419 | 131 |
pankso@40 | 132 interface_status() { |
al@419 | 133 if ifconfig | grep -A1 $1 | grep -q inet; then |
al@419 | 134 ip=$(ifconfig | grep -A1 $1 | grep inet | awk '{ print $2 }' | cut -d: -f2) |
al@419 | 135 cat <<EOT |
al@419 | 136 <td>$(gettext 'connected')</td> |
al@419 | 137 <td>$ip</td> |
al@419 | 138 <td><a data-icon="scan" href='network.cgi?scan=$ip&back=network.cgi'>$(gettext 'Scan')</a></td> |
al@419 | 139 EOT |
pankso@40 | 140 else |
pascal@136 | 141 echo "<td>----</td><td>----</td><td></td>" |
pankso@40 | 142 fi |
pankso@40 | 143 } |
pankso@40 | 144 |
al@419 | 145 |
pankso@40 | 146 # Catch network interface (used in summary and network main page) |
al@419 | 147 |
pankso@40 | 148 list_network_interfaces() { |
al@419 | 149 cat <<EOT |
al@419 | 150 <table class="wide zebra center"> |
al@303 | 151 <thead> |
al@303 | 152 <tr> |
al@303 | 153 <td>$(gettext 'Interface')</td> |
al@303 | 154 <td>$(gettext 'Name')</td> |
al@303 | 155 <td>$(gettext 'Status')</td> |
al@303 | 156 <td>$(gettext 'IP Address')</td> |
al@303 | 157 <td>$(gettext 'Scan ports')</td> |
al@303 | 158 </tr> |
al@303 | 159 </thead> |
al@303 | 160 <tbody> |
pankso@40 | 161 EOT |
al@419 | 162 for i in $(ls /sys/class/net); do |
pankso@40 | 163 case $i in |
pankso@40 | 164 eth*) |
al@419 | 165 echo " <tr><td><a data-icon='eth' href='/network.cgi?eth'>$i</a></td> |
al@419 | 166 <td>Ethernet</td> $(interface_status $i)</tr>" ;; |
pankso@40 | 167 wlan*|ath*|ra*) |
al@419 | 168 echo " <tr><td><a data-icon='wifi' href='/network.cgi?wifi'>$i</a></td> |
al@419 | 169 <td>Wireless</td> $(interface_status $i)</tr>" ;; |
pankso@40 | 170 lo) |
al@419 | 171 echo " <tr><td><span data-icon='loopback'>$i</span></td> |
al@419 | 172 <td>Loopback</td> $(interface_status $i)</tr>" ;; |
pankso@40 | 173 *) |
pankso@40 | 174 continue ;; |
pankso@40 | 175 esac |
pankso@40 | 176 done |
al@419 | 177 cat <<EOT |
al@303 | 178 </tbody> |
al@303 | 179 </table> |
al@303 | 180 EOT |
pankso@40 | 181 } |
pankso@40 | 182 |
al@419 | 183 |
slaxemulator@232 | 184 # Get the list of panel styles |
al@419 | 185 |
slaxemulator@232 | 186 list_styles() { |
slaxemulator@232 | 187 for style in $PANEL/styles/* |
slaxemulator@232 | 188 do |
slaxemulator@232 | 189 style=$(basename $style) |
slaxemulator@232 | 190 echo "<option value='$style'>$style</option>" |
slaxemulator@232 | 191 done |
slaxemulator@232 | 192 } |
slaxemulator@232 | 193 |
al@419 | 194 |
slaxemulator@232 | 195 # Get the list of system locales |
al@419 | 196 |
slaxemulator@232 | 197 list_locales() { |
slaxemulator@232 | 198 for locale in $(find /usr/share/i18n/locales -type f -name "[a-z][a-z]_[A-Z][A-Z]") |
slaxemulator@232 | 199 do |
slaxemulator@232 | 200 echo "<option value='$locale'>$locale</option>" |
slaxemulator@232 | 201 done |
slaxemulator@232 | 202 } |
slaxemulator@232 | 203 |
al@419 | 204 |
slaxemulator@232 | 205 # Get the list of console keymaps |
al@419 | 206 |
slaxemulator@232 | 207 list_keymaps() { |
al@419 | 208 for keymap in /usr/share/kmap/*.kmap; do |
slaxemulator@232 | 209 basename $keymap .kmap | sed "s|.*|<option value='&'>&</option>|" |
slaxemulator@232 | 210 done |
slaxemulator@232 | 211 } |
slaxemulator@232 | 212 |
al@419 | 213 |
pankso@15 | 214 # |
pankso@15 | 215 # xHTML 5 (header and footer skel are from the style) |
pankso@15 | 216 # |
pankso@15 | 217 |
pankso@44 | 218 loading_msg() { |
al@419 | 219 local MSG=${1:-$LOADING_MSG} |
al@419 | 220 cat <<EOT |
al@419 | 221 <div id="loading"><img src="/styles/default/images/loader.gif"/>$MSG</div> |
pankso@44 | 222 EOT |
pankso@44 | 223 } |
pankso@44 | 224 |
al@419 | 225 |
pankso@15 | 226 xhtml_header() { |
al@292 | 227 . ${PANEL}$HEADER |
pankso@67 | 228 if [ $DEBUG == "1" ]; then |
pascal@81 | 229 local i |
pascal@81 | 230 local j |
pascal@81 | 231 local x |
pascal@81 | 232 args="" |
al@419 | 233 for x in GET POST COOKIE; do |
al@419 | 234 for i in $($x); do |
pascal@81 | 235 if [ $($x $i count) -gt 1 ]; then |
pascal@81 | 236 for j in $(seq 1 $($x $i count)); do |
pascal@81 | 237 args="$args $x($i,$j)='$($x $i $j)'" |
pascal@81 | 238 done |
pascal@81 | 239 else |
pascal@81 | 240 args="$args $x($i)='$($x $i)'" |
pascal@81 | 241 fi |
pascal@81 | 242 done |
pascal@81 | 243 done |
pascal@81 | 244 for i in $(FILE); do |
al@419 | 245 for j in name size type tmpname; do |
pascal@81 | 246 args="$args FILE($i,$j)=$(FILE $i $j)" |
pascal@81 | 247 done |
pascal@81 | 248 done |
al@419 | 249 cat <<EOT |
al@419 | 250 <pre class="debug"> |
pascal@81 | 251 QUERY_STRING="$QUERY_STRING"$args |
pankso@70 | 252 </pre> |
pankso@70 | 253 EOT |
pankso@67 | 254 fi |
pankso@15 | 255 } |
pankso@15 | 256 |
al@419 | 257 |
pankso@15 | 258 xhtml_footer() { |
al@292 | 259 . ${PANEL}$FOOTER |
pankso@15 | 260 } |
pankso@15 | 261 |
al@419 | 262 |
pankso@15 | 263 table_start() { |
al@303 | 264 echo '<table>' |
pankso@15 | 265 } |
pankso@15 | 266 |
al@419 | 267 |
pankso@282 | 268 table_end() { |
al@303 | 269 echo '</table>' |
pankso@15 | 270 } |
pankso@153 | 271 |
al@419 | 272 |
pankso@153 | 273 df_thead() { |
al@419 | 274 cat <<EOT |
pankso@153 | 275 <thead> |
pankso@153 | 276 <tr> |
al@303 | 277 <td>$(gettext 'Disk')</td> |
al@303 | 278 <td>$(gettext 'Label')</td> |
al@303 | 279 <td>$(gettext 'Type')</td> |
al@303 | 280 <td>$(gettext 'Size')</td> |
al@303 | 281 <td>$(gettext 'Available')</td> |
al@303 | 282 <td>$(gettext 'Used')</td> |
al@303 | 283 <td>$(gettext 'Mount point')</td> |
pascal@343 | 284 <td>UUID</td> |
pankso@153 | 285 </tr> |
pankso@153 | 286 </thead> |
pankso@153 | 287 EOT |
pankso@153 | 288 } |
al@318 | 289 |
al@419 | 290 |
al@318 | 291 msg() { |
al@318 | 292 msgtype="$1"; shift |
al@318 | 293 case "$msgtype" in |
al@318 | 294 tip) MSG_ICON="$IMAGES/msg-tip.png" ;; |
al@318 | 295 warn|warning) MSG_ICON="$IMAGES/msg-warn.png" ;; |
al@318 | 296 err|error) MSG_ICON="$IMAGES/msg-err.png" ;; |
al@318 | 297 up) MSG_ICON="$IMAGES/msg-up.png" ;; |
al@318 | 298 *) MSG_ICON="$IMAGES/msg.png" ;; |
al@318 | 299 esac |
al@419 | 300 cat <<EOT |
al@318 | 301 <section class="box" style="width:50%;margin:0.5em auto;"> |
al@318 | 302 <image src="$MSG_ICON" alt="$msgtype" class="float-left" /> |
al@318 | 303 $@ |
al@318 | 304 </section> |
al@318 | 305 EOT |
al@318 | 306 } |
al@318 | 307 |
al@419 | 308 |
al@318 | 309 is_installed() { |
al@318 | 310 [ -d "$INSTALLED/$1" ] |
al@318 | 311 } |
pascal@364 | 312 |
al@419 | 313 |
pascal@364 | 314 blk2h() { |
pascal@364 | 315 echo $1 | awk '{ |
pascal@364 | 316 n = $0/2 |
pascal@364 | 317 for (i = 1; n > 1024; i++) |
pascal@364 | 318 n /= 1024 |
pascal@364 | 319 f = "%1.0f%c" |
pascal@373 | 320 if (n < 100) |
pascal@364 | 321 f = "%1.1f%c" |
pascal@364 | 322 printf f,n,substr("KMGT", i, 1) |
pascal@364 | 323 }' |
pascal@364 | 324 } |
al@419 | 325 |
al@419 | 326 |
al@419 | 327 # Show "Back" button |
al@419 | 328 |
al@419 | 329 back_button() { |
al@419 | 330 local URL="$1" default_caption="$(gettext 'Back')" |
al@419 | 331 local caption="${2:-$default_caption}" icon="${3:-back}" |
al@419 | 332 |
al@419 | 333 if [ -n "$1" ]; then |
al@419 | 334 printf '<form action="%s" method="post"><button data-icon="%s">%s</button></form>' "$URL" "$icon" "$caption" |
al@419 | 335 fi |
al@419 | 336 } |
al@419 | 337 |
al@419 | 338 |
al@419 | 339 # Mark select option as checked |
al@419 | 340 |
al@419 | 341 selected() { |
al@419 | 342 [ "$1" == "$2" ] && echo -n 'selected' |
al@419 | 343 } |