#!/bin/bash
# Skrypt filelock - elastyczny mechanizm blokowania plików.

retries="10"            # Domyślna liczba prób.
action="lock"           # Domyślna operacja.
nullcmd="`which true`"  # Puste polecenie dla lockfile.

while getopts "lur:" opt; do
  case $opt in
    l ) action="lock"      ;;
    u ) action="unlock"    ;;
    r ) retries="$OPTARG"  ;;
  esac
done
shift $(($OPTIND - 1))

if [ $# -eq 0 ] ; then # Wyświetlenie wielowierszowego komunikatu w stdout.
  cat << EOF >&2
Użycie: $0 [-l|-u] [-r retries] LOCKFILE
Gdzie -l oznacza żądanie blokady (domyślna operacja),
-u żądanie zdjęcia blokady, -r X oznacza maksymalną liczbę prób
przed zgłoszeniem problemu (domyślnie = $retries).
EOF
  exit 1
fi

# Sprawdzenie, czy jest dostępne polecenie lockfile.

if [ -z "$(which lockfile | grep -v '^no ')" ] ; then
  echo "$0 błąd: narzędzie 'lockfile' nie istnieje w katalogach PATH." >&2
  exit 1
fi
if [ "$action" = "lock" ] ; then
  if ! lockfile -1 -r $retries "$1" 2> /dev/null; then
    echo "$0: błąd: plik blokady nie został utworzony w przewidzianym czasie." >&2
    exit 1
  fi
else    # Operacja zdjęcia blokady
  if [ ! -f "$1" ] ; then
    echo "$0: uwaga: blokada pliku$1 nie istnieje." >&2
    exit 1
  fi
  rm -f "$1"
fi

exit 0
