# shellcheck shell=bash disable=SC2154 # UTITLITIES # find tool, returns the first|one|found, exit with error message if none found find_tool () { IFS='|' read -ra tools <<< "$*" found=0 for tool in "${tools[@]}"; do if [[ -n $(which "$tool") ]]; then found=1 break fi done if [[ "$found" -eq 0 ]]; then if [[ ${#tools[@]} -gt 1 ]]; then exit_with_error "missing programs: $*; install at least one of these: ${tools[*]} and try again" else exit_with_error "missing program: $1; please install and try again" fi fi echo "$tool" } url_available () { url="$1" dl_tool=$(find_tool "curl|wget") case "$dl_tool" in curl) ${torsocks:-} curl --output /dev/null --silent --fail -r 0-0 "$url" ;; wget) ${torsocks:-} wget -q --spider "$url" ;; *) exit_with_error "unknown download tool ${dl_tool}" ;; esac } add_cron_job () { job="$*" (crontab -l ; echo "*/1 * * * * $job") 2>/dev/null | sort | uniq | crontab - } # leave
and
 to enable some simple formatting tasks
strip_html () {
        #echo "$*"|sed -e 's/
/\n/g;s/<[^>]*>//g;s/\n/
/g' echo "$*" } is_true () { val="${1,,}" if [[ "${val:0:1}" == "y" || "$val" -gt 0 ]]; then true else false fi } # dummmy cleanup function cleanup () { true } # echo error message to stderr and terminate main exit_with_error () { echo -e "$(basename "$0"): $*" >&2 kill -s TERM "$TOP_PID" } trap_error () { cleanup exit 1 } trap_clean () { cleanup exit } _log () { msg="$*" logdir="${XDG_STATE_HOME:-$HOME/.state}/books" logfile=$(basename "$0").log mkdir -p "$logdir" echo "$(date -Iseconds): $msg" >> "$logdir/$logfile" } log_err () { _log "E: $*" } log_warn () { _log "W: $*" } log_info () { _log "I: $*" } log_debug () { _log "D: $*" } # DATABASE dbx () { db="$1" shift mysql=$(find_tool "mysql") if [ $# -gt 0 ]; then "$mysql" -N -Bsss -h "$dbhost" -P "$dbport" -u "$dbuser" "$db" -e "$*" else "$mysql" -N -Bsss -h "$dbhost" -P "$dbport" -u "$dbuser" "$db" fi } # LOCKING exlock () { cmd="$1" lockfile="/var/lock/$(basename "$0")" lockfd=99 flock=$(find_tool "flock") case "$cmd" in prepare) eval "exec $lockfd<>\"$lockfile\"" trap 'exlock nolock' EXIT ;; now) $flock -xn $lockfd ;; lock) $flock -x $lockfd ;; shlock) $flock -s $lockfd ;; unlock) $flock -u $lockfd ;; nolock) $flock -u $lockfd $flock -xn $lockfd && rm -f "$lockfile" trap_clean ;; *) exit_with_error "unknown lock command: $cmd" ;; esac }