slitaz-base-files annotate rootfs/lib/libtaz.sh @ rev 258

libpkg.sh: unset TAGS too in unset_receipt(); and code reformatting
author Aleksej Bobylev <al.bobylev@gmail.com>
date Thu Nov 27 16:26:29 2014 +0200 (2014-11-27)
parents 02334b7ae2f7
children d3bc87df0f19
rev   line source
pankso@125 1 #!/bin/sh
pankso@125 2 #
pankso@125 3 # SliTaz Base functions used from boot scripts to end user tools. Use
pankso@125 4 # gettext and not echo for messages. Keep output suitable for GTK boxes
pankso@125 5 # and Ncurses dialog. LibTaz should not depend on any configuration file.
paul@166 6 # No bloated code here, functions must be used by at least 3-4 tools.
pankso@139 7 #
pankso@139 8 # Documentation: man libtaz or /usr/share/doc/slitaz/libtaz.txt
pankso@125 9 #
pascal@226 10 # Copyright (C) 2012-2014 SliTaz GNU/Linux - BSD License
pankso@125 11 #
pankso@125 12
pankso@125 13 . /usr/bin/gettext.sh
al@177 14
al@219 15 # short names for common i18n functions (like 'echo' and 'echo -n')
al@219 16 _() { eval_gettext "$@"; echo; }
al@219 17 _n() { eval_gettext "$@"; }
al@219 18
al@219 19 # internal i18n
al@219 20 lgettext() { gettext -d 'slitaz-base' "$@"; }
pankso@125 21
pankso@125 22 # Internal variables.
al@177 23 okmsg="$(lgettext 'Done')"
al@177 24 ermsg="$(lgettext 'Failed')"
pankso@174 25 : ${okcolor=32}
pankso@174 26 : ${ercolor=31}
pankso@174 27 : ${decolor=36}
pankso@125 28
pankso@137 29 # Parse cmdline options and store values in a variable.
pankso@125 30 for opt in "$@"
pankso@125 31 do
pankso@125 32 case "$opt" in
al@223 33 --*=*) export "${opt#--}" ;;
al@258 34 --*) export ${opt#--}="yes" ;;
pankso@125 35 esac
pankso@125 36 done
pankso@131 37 [ "$HTTP_REFERER" ] && output="html"
pankso@125 38
pankso@187 39 # Get terminal columns
pankso@187 40 get_cols() {
al@249 41 stty size 2>/dev/null | busybox cut -d " " -f 2
pankso@187 42 }
pankso@187 43
pankso@125 44 # Return command status. Default to colored console output.
pankso@125 45 status() {
pankso@125 46 local check=$?
pankso@131 47 case $output in
pankso@161 48 raw|gtk)
pankso@161 49 done=" $okmsg"
pankso@131 50 error=" $ermsg" ;;
pankso@131 51 html)
pankso@167 52 done=" <span style='color: $okcolor;'>$okmsg</span>"
pankso@167 53 error=" <span style='color: $ercolor;'>$ermsg</span>" ;;
pankso@136 54 *)
pankso@187 55 local cols=$(get_cols)
pankso@187 56 [ "$cols" ] || cols=80
pankso@131 57 local scol=$(($cols - 10))
pankso@131 58 done="\\033[${scol}G[ \\033[1;${okcolor}m${okmsg}\\033[0;39m ]"
pankso@131 59 error="\\033[${scol}G[ \\033[1;${ercolor}m${ermsg}\\033[0;39m ]" ;;
pankso@131 60 esac
pankso@125 61 if [ $check = 0 ]; then
pankso@125 62 echo -e "$done"
pankso@125 63 else
pankso@125 64 echo -e "$error"
pankso@125 65 fi
pankso@125 66 }
pankso@125 67
pankso@125 68 # Line separator.
pankso@125 69 separator() {
pankso@132 70 local sepchar="="
pankso@132 71 [ "$HTTP_REFERER" ] && local sepchar="<hr />"
pankso@132 72 case $output in
al@258 73 raw|gtk) local sepchar="-"; local cols="8" ;;
al@258 74 html) local sepchar="<hr />" ;;
pankso@187 75 *)
pankso@187 76 local cols=$(get_cols)
pankso@187 77 [ "$cols" ] || cols=80 ;;
pankso@132 78 esac
pankso@125 79 for c in $(seq 1 $cols); do
pankso@131 80 echo -n "$sepchar"
pankso@125 81 done && echo ""
pankso@125 82 }
pankso@125 83
pankso@164 84 # New line for echo -n or gettext.
pankso@164 85 newline() {
pankso@164 86 echo ""
pankso@164 87 }
pankso@164 88
pankso@125 89 # Display a bold message. GTK Yad: Works only in --text=""
pankso@125 90 boldify() {
pankso@125 91 case $output in
al@258 92 raw) echo "$@" ;;
al@258 93 gtk) echo "<b>$@</b>" ;;
meshca@149 94 html) echo "<strong>$@</strong>" ;;
meshca@149 95 *) echo -e "\\033[1m$@\\033[0m" ;;
pankso@125 96 esac
pankso@125 97 }
pankso@125 98
al@193 99 # Usage: colorize colorNB "Message" or use --color=NB option
pankso@167 100 # when running a tool. Default to white/38 and no html or gtk.
pankso@167 101 colorize() {
meshca@175 102 : ${color=$1}
meshca@175 103 shift
meshca@175 104 local content="$@"
pankso@167 105 case $output in
meshca@175 106 raw|gtk|html) echo "$content" ;;
pankso@167 107 *)
pankso@168 108 [ "$color" ] || color=38
meshca@175 109 echo -e "\\033[1;${color}m${content}\\033[0;39m" ;;
pankso@167 110 esac
pankso@167 111 unset color
pankso@167 112 }
pankso@167 113
pankso@174 114 # Indent text $1 spaces.
pankso@161 115 indent() {
meshca@158 116 local in="$1"
meshca@158 117 shift
pankso@161 118 echo -e "\033["$in"G $@";
meshca@158 119 }
meshca@158 120
al@193 121 # Extended MeSsaGe output
al@193 122 emsg() {
al@193 123 local sep="\n--------\n"
al@193 124 case $output in
al@193 125 raw)
al@193 126 echo "$@" | sed -e 's|<b>||g; s|</b>||g; s|<c [0-9]*>||g; \
al@193 127 s|</c>||g; s|<->|'$sep'|g; s|<n>|\n|g; s|<i [0-9]*>| |g' ;;
al@193 128 gtk)
al@193 129 echo "$@" | sed -e 's|<c [0-9]*>||g; s|</c>||g; s|<->|'$sep'|g; \
al@193 130 s|<n>|\n|g; s|<i [0-9]*>| |g' ;;
al@193 131 html)
al@193 132 echo "$@" | sed -e 's|<b>|<strong>|g; s|</b>|</strong>|g; \
al@193 133 s|<n>|<br/>|g; s|<->|<hr/>|g; s|<i [0-9]*>| |g' ;;
al@193 134 *)
al@193 135 local sep="\n"
al@193 136 local cols=$(get_cols)
al@193 137 [ "$cols" ] || cols=80
al@258 138 for c in $(seq 1 $cols); do
al@193 139 sep="${sep}="
al@193 140 done
al@193 141 echo -en "$(echo "$@" | sed -e 's|<b>|\\033[1m|g; s|</b>|\\033[0m|g; \
al@193 142 s|<c \([0-9]*\)>|\\033[1;\1m|g; s|</c>|\\033[0;39m|g; s|<n>|\n|g; \
al@193 143 s|<->|'$sep'|g; s|<i \([0-9]*\)>|\\033[\1G|g')"
al@193 144 [ "$1" != "-n" ] && echo
al@193 145 ;;
al@193 146 esac
al@193 147 }
al@193 148
pankso@125 149 # Check if user is logged as root.
pankso@125 150 check_root() {
pankso@125 151 if [ $(id -u) != 0 ]; then
al@258 152 lgettext "You must be root to execute:"; echo " $(basename $0) $@"
pankso@125 153 exit 1
pankso@125 154 fi
pankso@125 155 }
meshca@158 156
pankso@174 157 # Display debug info when --debug is used.
meshca@169 158 debug() {
al@193 159 [ "$debug" ] && echo "$(colorize $decolor 'DEBUG:') $1"
meshca@169 160 }
meshca@169 161
pankso@161 162 # Gettextize yes/no.
meshca@158 163 translate_query() {
meshca@158 164 case $1 in
al@177 165 y) lgettext "y" ;;
al@177 166 Y) lgettext "Y" ;;
al@177 167 n) lgettext "n" ;;
al@177 168 N) lgettext "N" ;;
meshca@158 169 # Support other cases but keep them untranslated.
meshca@158 170 *) echo "$1" ;;
meshca@158 171 esac
meshca@158 172 }
meshca@160 173
pankso@161 174 # Usage: echo -n "The question" && confirm
pankso@161 175 confirm() {
pankso@161 176 [ "$yes" ] && true
pankso@161 177 echo -n " ($(translate_query y)/$(translate_query N)) ? "
pankso@161 178 read answer
pankso@161 179 [ "$answer" == "$(translate_query y)" ]
meshca@160 180 }
pankso@161 181
pankso@164 182 # Log activities. $activity should be set by the script. The log format
pankso@164 183 # is suitable for web interfaces like cook. Usage: log "String"
pankso@162 184 log() {
pankso@163 185 [ "$activity" ] || activity=/var/log/slitaz/libtaz.log
pankso@164 186 echo "$(date '+%Y-%m-%d %H:%M') : $@" >> $activity
pankso@162 187 }
al@221 188
al@221 189 # Sophisticated function to print two-column list of options with descriptions
al@221 190 # Be UTF-8 friendly, not use `wc -L`, `awk length`, `${#string}`
al@221 191 optlist() {
al@221 192 local in cols col1=1 line
al@221 193 in="$(echo "$1" | sed 's| *| |g')"
al@221 194 cols=$(get_cols); [ "$cols" ] || cols=80
al@258 195 IFS=$'\n'
al@221 196 for line in $in; do
al@221 197 col=$(echo -n "$line" | cut -f1 | wc -m)
al@221 198 [ $col -gt $col1 ] && col1=$col
al@221 199 done
al@221 200 echo "$in" | sed 's|\t|&\n|' | fold -sw$((cols - col1 - 4)) | \
al@221 201 sed "/\t/!{s|^.*$|[$((col1 + 4))G&|g}" | sed "/\t$/{N;s|.*| &|;s|\t\n||}"
al@221 202 }
al@221 203
al@221 204 # Wrap words in long terminal message
al@221 205 longline() {
al@221 206 cols=$(get_cols); [ "$cols" ] || cols=80
al@221 207 echo -e "$@" | fold -sw$cols
al@221 208 }