#!/bin/bash
# Usage:
#   lock $PROGNAME [fd] \
#   || eexit "Only one instance of $PROGNAME can run at one time."
#
#   do_A
#   do_B

LOCKFILE_DIR=/run
LOCK_FD=200

lock() {
    local prefix=$1
    local fd=${2:-$LOCK_FD}
    local lock_file=$LOCKFILE_DIR/$prefix.lock
    eval "exec {fd}>$lock_file"

    flock -n $fd \
        && return 0 \
        || return 1
}

unlock() {
  local prefix=$1
  local fd=${2:-$LOCK_FD}
  local lock_file=$LOCKFILE_DIR/$prefix.lock
  rm -f lock_file || true
}

log() {
        lvl=$1
        msg=$2
        date +"%Y-%m-%d %H:%M:%S,%3N - $lvl  ($TASK) $msg"
}

eexit() {
    local error_str="$@"
    echo $error_str
    exit 1
}

retry() {
    local -r -i max_attempts="$1"; shift
    local -r cmd="$@"
    local -i attempt=1

    until $cmd
    do
        if (( attempt == max_attempts ))
        then
            exit 1
        else
            sleep 1
        fi
    done
}
