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 } |