slitaz-base-files view rootfs/lib/libtaz.sh @ rev 340

Remove ashism ==
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Feb 26 08:22:10 2019 +0100 (2019-02-26)
parents 69ad2183be35
children
line source
1 #!/bin/sh
2 #
3 # SliTaz Base functions.
4 # Documentation: `man libtaz` or /usr/share/doc/slitaz/libtaz.txt
5 #
6 # Copyright (C) 2012-2015 SliTaz GNU/Linux - BSD License
7 #
9 [ -z "$TZ" ] && [ -s /etc/TZ ] && export TZ="$(cat /etc/TZ)"
11 . /usr/bin/gettext.sh
12 alias sed="busybox sed"
14 # Internal
15 lgettext() { gettext -d 'slitaz-base' "$@"; }
16 translate_query() {
17 case $1 in
18 y) lgettext "y";;
19 Y) lgettext "Y";;
20 n) lgettext "n";;
21 N) lgettext "N";;
22 # Support other cases but keep them untranslated.
23 *) echo "$1" ;;
24 esac
25 }
26 okmsg="$(lgettext 'Done')"
27 ermsg="$(lgettext 'Failed')"
28 : ${okcolor=32}
29 : ${ercolor=31}
30 : ${decolor=36}
32 # Parse cmdline options and store values in a variable.
33 for opt in "$@"; do
34 opt_name="${opt%%=*}"; opt_name="$(echo -n "${opt_name#--}" | tr -c 'a-zA-Z0-9' '_')"
35 case "$opt" in
36 --[0-9]*=*) export _$opt_name="${opt#*=}" ;;
37 --[0-9]*) export _$opt_name=yes ;;
38 --*=*) export $opt_name="${opt#*=}" ;;
39 --*) export $opt_name=yes ;;
40 esac
41 done
42 [ "$HTTP_REFERER" ] && output='html'
44 # i18n functions
45 _() { local T="$1"; shift; printf "$(gettext "$T")" "$@"; echo; }
46 _n() { local T="$1"; shift; printf "$(gettext "$T")" "$@"; }
47 _p() { local S="$1" P="$2" N="$3"; shift 3; printf "$(ngettext "$S" "$P" "$N")" "$@"; }
49 # Get terminal columns
50 get_cols() { stty size 2>/dev/null | awk -vc=$cols 'END{print c?c:$2?$2:80}'; }
52 # Last command status
53 status() {
54 local ret_code=$?
55 [ -n "$quiet" -a "$ret_code" -eq 0 ] && return
56 [ -n "$quiet" ] && quiet='once' action "$saved_action"
58 case $ret_code in
59 0) local msg="$okmsg" color="$okcolor";;
60 *) local msg="$ermsg" color="$ercolor";;
61 esac
62 case $output in
63 raw|gtk) echo " $msg";;
64 html) echo " <span class=\"float-right color$color\">$msg</span>";;
65 *)
66 local cols=$(get_cols)
67 local scol=$((${cols:-80} - 10))
68 echo -e "\\033[${scol}G[ \\033[1;${color}m$msg\\033[0;39m ]";;
69 esac
70 }
72 # Print info a la status way: info [color] [content]
73 info() {
74 local info="$2"
75 case "$output" in
76 raw|gtk) echo "$info" ;;
77 html) echo " <span class=\"float-right color${1}\">$info</span>";;
78 *)
79 local char="$(echo $info | wc -L)"
80 local in=$((7 + ${char}))
81 indent $(($(get_cols) - ${in})) "[ $(colorize $1 $info) ]" ;;
82 esac
83 }
85 # Line separator
86 separator() {
87 [ -n "$quiet" ] && return
88 case $output in
89 gtk) echo '--------';;
90 html) echo -n '<hr/>';;
91 *) printf "%$(get_cols)s\n" | tr ' ' "${1:-=}";;
92 esac
93 }
95 # New line
96 newline() {
97 [ -z "$quiet" ] && echo
98 }
100 # Display a bold message
101 boldify() {
102 [ -n "$quiet" ] && return
103 case $output in
104 raw) echo "$@" ;;
105 gtk) echo "<b>$@</b>" ;;
106 html) echo "<strong>$@</strong>" ;;
107 *) echo -e "\\033[1m$@\\033[0m" ;;
108 esac
109 }
111 # Colorize message
112 colorize() {
113 [ -n "$quiet" ] && return
114 : ${color=$1}
115 shift
116 case $output in
117 raw|gtk) echo "$@";;
118 html) echo -n "<span class=\"color$color\">$@</span>";;
119 *) case $color in
120 0*) echo -e "\\033[${color:-38}m$@\\033[39m";;
121 *) echo -e "\\033[1;${color:-38}m$@\\033[0;39m";;
122 esac;;
123 esac
124 unset color
125 }
127 # Indent text
128 indent() {
129 [ -n "$quiet" ] && return
130 local in="$1"
131 shift
132 echo -e "\033["$in"G $@";
133 }
135 # Extended MeSsaGe output
136 emsg() {
137 [ -n "$quiet" ] && return
138 local sep="\n$(separator)\n"
139 case $output in
140 raw)
141 echo "$@" | sed -e 's|<b>||g; s|</b>||g; s|<c [0-9]*>||g; \
142 s|</c>||g; s|<->|'$sep'|g; s|<n>|\n|g; s|<i [0-9]*>| |g' ;;
143 gtk)
144 echo "$@" | sed -e 's|<c [0-9]*>||g; s|</c>||g; s|<->|'$sep'|g; \
145 s|<n>|\n|g; s|<i [0-9]*>| |g' ;;
146 html)
147 echo "$@" | sed -e 's|<b>|<strong>|g; s|</b>|</strong>|g; \
148 s|<c \([0-9]*\)>|<span class="color\1">|g; s|</c>|</span>|g; \
149 s|<n>|<br/>|g; s|<->|<hr/>|g; s|<i [0-9]*>| |g' ;;
150 *)
151 echo -en "$(echo "$@" | sed -e 's|<b>|\\033[1m|g; s|</b>|\\033[0m|g;
152 s|<c 0\([0-9]*\)>|\\033[\1m|g; s|<c \([1-9][0-9]*\)>|\\033[1;\1m|g;
153 s|</c>|\\033[0;39m|g; s|<n>|\n|g;
154 s|<->|'$sep'|g; s|<i \([0-9]*\)>|\\033[\1G|g')"
155 [ "$1" != "-n" ] && echo
156 ;;
157 esac
158 }
160 # Check if user is logged as root
161 check_root() {
162 if [ $(id -u) -ne 0 ]; then
163 lgettext "You must be root to execute:"; echo " $(basename $0) $@"
164 exit 1
165 fi
166 }
168 # Display debug info when --debug is used.
169 debug() {
170 [ -n "$debug" ] && echo "$(colorize $decolor 'DEBUG:') $1"
171 }
173 # Report error and finish work
174 die() { longline "$(_ "$@")" >&2; exit 1; }
176 # Interactive mode
177 im() { tty -s; }
179 # Confirmation
180 confirm() {
181 local answer='' defanswer='n'
182 # Check auto-answer, if any
183 [ -n "$yes" ] && answer='y'
184 [ -n "$noconfirm" ] && answer='n'
185 # Print question
186 if [ -n "$1" ]; then
187 case "$2" in
188 '') echo -n "$1 ";;
189 y|Y) echo -n "$1 [$(translate_query Y)/$(translate_query n)] "; defanswer='y';;
190 *) echo -n "$1 [$(translate_query y)/$(translate_query N)] ";;
191 esac
192 else
193 echo -n " [$(translate_query y)/$(translate_query N)] ? "
194 fi
195 # Is it auto-answer?
196 if [ -z "$answer" ]; then
197 im && read -t ${timeout:-30} answer
198 [ -z "$answer" ] && answer="$(translate_query "$defanswer")"
199 else
200 translate_query "$answer"; echo ' (auto)'
201 fi
202 # Return true/false to use in conditions
203 [ "$answer" = "$(translate_query y)" -o "$answer" = "$(translate_query Y)" ]
204 }
206 # Log activities
207 log() {
208 echo "$(date '+%F %R') : $@" >> ${activity:-/var/log/slitaz/libtaz.log}
209 }
211 # Print two-column list of options with descriptions
212 optlist() {
213 [ -n "$quiet" ] && return
214 local in="$(echo "$1" | sed 's| *| |g')" w=$(get_cols) col1=1 line
215 IFS=$'\n'
216 for line in $in; do
217 col=$(echo -n "$line" | cut -f1 | wc -m)
218 [ $col -gt $col1 ] && col1=$col
219 done
220 echo "$in" | sed 's|\t|&\n|' | fold -sw$((w - col1 - 4)) | \
221 sed "/\t/!{s|^.*$|[$((col1 + 4))G&|g}" | sed "/\t$/{N;s|.*| &|;s|\t\n||}"
222 }
224 # Wrap words in long terminal message
225 longline() {
226 [ -n "$quiet" ] && return
227 local w=$(get_cols)
228 echo -e "$@" | fold -sw$w
229 }
231 # Print localized title
232 title() {
233 [ -n "$quiet" ] && return
234 case $output in
235 html) echo "<section><header>$(_ "$@")</header><pre class=\"scroll\">";;
236 *) newline; boldify "$(_ "$@")"; separator;;
237 esac
238 }
240 # Print footer
241 footer() {
242 [ -n "$quiet" ] && return
243 case $output in
244 html) echo "</pre><footer>$1</footer></section>";;
245 *) separator; echo "$1"; [ -n "$1" ] && newline;;
246 esac
247 }
249 # Print current action
250 saved_action=''
251 action() {
252 saved_action="$(_n "$@")"
253 [ "$quiet" = 'yes' ] && return
254 local w c scol msg chars
255 # Translators: 'w' is the width the wider translated message ('[ Done ]' or '[ Failed ]') takes in a terminal; place here the number
256 w=$(_ 'w'); w=${w/w/10}
257 c=$(get_cols)
258 scol=$(( $c - $w ))
259 msg="$(_n "$@" | fold -sw$scol)"
260 chars=$(echo -n "$msg" | tail -n1 | wc -m)
261 msg="$(printf '%s%'$(( $scol - $chars ))'s' "$msg" '')"
263 case $output in
264 raw|gtk|html) echo -n "$msg";;
265 *) echo -ne "\033[0;33m$msg\033[0m";;
266 esac
267 quiet=${quiet/once/yes}
268 }
270 # Print long line as list item
271 itemize() {
272 [ -n "$quiet" ] && return
273 case $output in
274 gtk) echo "$@";;
275 *)
276 local inp="$@" w=$(get_cols) first offset
277 first="$(echo -e "$inp" | fold -sw$w | head -n1)"
278 echo "$first"
279 cols1="$(echo "${first:1}" | wc -c)"
280 offset=$(echo "$first" | sed -n 's|^\([^:\*-]*[:\*-]\).*$|\1|p' | wc -m)
281 echo "${inp:$cols1}" | fold -sw$((w - offset)) | awk \
282 '($0){printf "%'$offset's%s\n","",$0}'
283 ;;
284 esac
285 }