# colored output # -------------- BOLD=$(tput bold) RST=$(tput sgr0) RED=$(tput setaf 1) GREEN=$(tput setaf 2) YELLOW=$(tput setaf 3) CYAN=$(tput setaf 6) VERBOSE= echoinfo() { >&2 echo "${CYAN}$@${RST}" } echoerr() { >&2 echo "${RED}${BOLD}error:${RST}${RED} $@${RST}" } echowarn() { >&2 echo "${YELLOW}${BOLD}warning:${RST}${YELLOW} $@${RST}" } die() { echoerr "$@" exit 1 } debug() { if [ -n "$VERBOSE" ]; then >&2 echo "$@" fi } # measuring executing time # ------------------------ __time_started= time_start() { __time_started=$(date +%s) } time_elapsed() { local fin=$(date +%s) echo $(( fin - __time_started )) } # config parsing # -------------- read_config() { local config_file="$1" local dst="$2" [ -f "$config_file" ] || die "read_config: $config_file: no such file" local n=0 local failed= local key local value while read line; do n=$(( n+1 )) # skip empty lines or comments if [ -z "$line" ] || [[ "$line" =~ ^#.* ]]; then continue fi if [[ $line = *"="* ]]; then key="${line%%=*}" value="${line#*=}" eval "$dst[$key]=\"$value\"" else echoerr "config: invalid line $n" failed=1 fi done < <(cat "$config_file") [ -z "$failed" ] } check_config() { local var="$1" local keys="$2" local failed= for key in $keys; do if [ -z "$(eval "echo -n \${$var[$key]}")" ]; then echoerr "config: ${BOLD}${key}${RST}${RED} is missing" failed=1 fi done [ -z "$failed" ] } # other functions # --------------- installed() { command -v "$1" > /dev/null return $? } download() { local source="$1" local target="$2" if installed curl; then curl -f -s -o "$target" "$source" elif installed wget; then wget -q -O "$target" "$source" else die "neither curl nor wget found, can't proceed" fi } file_in_use() { [ -n "$(lsof "$1")" ] } file_mtime() { stat -c %Y "$1" }