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

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