slitaz-base-files annotate rootfs/lib/libtaz.sh @ rev 249
libtaz.sh: fix bug with installing coreutils-line package
author | Aleksej Bobylev <al.bobylev@gmail.com> |
---|---|
date | Mon May 26 15:59:05 2014 +0300 (2014-05-26) |
parents | 793c2b7ed97f |
children | 8a1ed3d7ebc2 |
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#--}" ;; |
pankso@137 | 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 |
pankso@132 | 73 raw|gtk) local sepchar="-" && local cols="8" ;; |
pankso@132 | 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 |
meshca@149 | 92 raw) echo "$@" ;; |
meshca@149 | 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@193 | 138 for c in $(seq 1 $cols) |
al@193 | 139 do |
al@193 | 140 sep="${sep}=" |
al@193 | 141 done |
al@193 | 142 echo -en "$(echo "$@" | sed -e 's|<b>|\\033[1m|g; s|</b>|\\033[0m|g; \ |
al@193 | 143 s|<c \([0-9]*\)>|\\033[1;\1m|g; s|</c>|\\033[0;39m|g; s|<n>|\n|g; \ |
al@193 | 144 s|<->|'$sep'|g; s|<i \([0-9]*\)>|\\033[\1G|g')" |
al@193 | 145 [ "$1" != "-n" ] && echo |
al@193 | 146 ;; |
al@193 | 147 esac |
al@193 | 148 } |
al@193 | 149 |
pankso@125 | 150 # Check if user is logged as root. |
pankso@125 | 151 check_root() { |
pankso@125 | 152 if [ $(id -u) != 0 ]; then |
al@177 | 153 lgettext "You must be root to execute:" && echo " $(basename $0) $@" |
pankso@125 | 154 exit 1 |
pankso@125 | 155 fi |
pankso@125 | 156 } |
meshca@158 | 157 |
pankso@174 | 158 # Display debug info when --debug is used. |
meshca@169 | 159 debug() { |
al@193 | 160 [ "$debug" ] && echo "$(colorize $decolor 'DEBUG:') $1" |
meshca@169 | 161 } |
meshca@169 | 162 |
pankso@161 | 163 # Gettextize yes/no. |
meshca@158 | 164 translate_query() { |
meshca@158 | 165 case $1 in |
al@177 | 166 y) lgettext "y" ;; |
al@177 | 167 Y) lgettext "Y" ;; |
al@177 | 168 n) lgettext "n" ;; |
al@177 | 169 N) lgettext "N" ;; |
meshca@158 | 170 # Support other cases but keep them untranslated. |
meshca@158 | 171 *) echo "$1" ;; |
meshca@158 | 172 esac |
meshca@158 | 173 } |
meshca@160 | 174 |
pankso@161 | 175 # Usage: echo -n "The question" && confirm |
pankso@161 | 176 confirm() { |
pankso@161 | 177 [ "$yes" ] && true |
pankso@161 | 178 echo -n " ($(translate_query y)/$(translate_query N)) ? " |
pankso@161 | 179 read answer |
pankso@161 | 180 [ "$answer" == "$(translate_query y)" ] |
meshca@160 | 181 } |
pankso@161 | 182 |
pankso@164 | 183 # Log activities. $activity should be set by the script. The log format |
pankso@164 | 184 # is suitable for web interfaces like cook. Usage: log "String" |
pankso@162 | 185 log() { |
pankso@163 | 186 [ "$activity" ] || activity=/var/log/slitaz/libtaz.log |
pankso@164 | 187 echo "$(date '+%Y-%m-%d %H:%M') : $@" >> $activity |
pankso@162 | 188 } |
al@221 | 189 |
al@221 | 190 # Sophisticated function to print two-column list of options with descriptions |
al@221 | 191 # Be UTF-8 friendly, not use `wc -L`, `awk length`, `${#string}` |
al@221 | 192 optlist() { |
al@221 | 193 local in cols col1=1 line |
al@221 | 194 in="$(echo "$1" | sed 's| *| |g')" |
al@221 | 195 cols=$(get_cols); [ "$cols" ] || cols=80 |
al@221 | 196 IFS=" |
al@221 | 197 " |
al@221 | 198 for line in $in; do |
al@221 | 199 col=$(echo -n "$line" | cut -f1 | wc -m) |
al@221 | 200 [ $col -gt $col1 ] && col1=$col |
al@221 | 201 done |
al@221 | 202 echo "$in" | sed 's|\t|&\n|' | fold -sw$((cols - col1 - 4)) | \ |
al@221 | 203 sed "/\t/!{s|^.*$|[$((col1 + 4))G&|g}" | sed "/\t$/{N;s|.*| &|;s|\t\n||}" |
al@221 | 204 } |
al@221 | 205 |
al@221 | 206 # Wrap words in long terminal message |
al@221 | 207 longline() { |
al@221 | 208 cols=$(get_cols); [ "$cols" ] || cols=80 |
al@221 | 209 echo -e "$@" | fold -sw$cols |
al@221 | 210 } |