URI: 
       dreadlock-ng.sh - dreadlock-ng - Remote locking daemon with a funny name.
  HTML git clone git://bitreich.org/dreadlock-ng git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/dreadlock-ng
   DIR Log
   DIR Files
   DIR Refs
   DIR Tags
   DIR README
   DIR LICENSE
       ---
       dreadlock-ng.sh (2176B)
       ---
            1 #!/bin/bash
            2 #
            3 # Copy me, if you can.
            4 # by 20h
            5 #
            6 
            7 #set -x
            8 
            9 lockbasepath="/tmp/dreadlock-ng"
           10 if [ $# -gt 0 ];
           11 then
           12         lockbasepath="$1"
           13 fi
           14 
           15 mkdir -p "${lockbasepath}"
           16 
           17 declare -A locks=()
           18 
           19 function unlock_on_disconnect() {
           20         for lockfd in ${locks[@]};
           21         do
           22                 flock -u "${lockfd}" 2>/dev/null
           23         done
           24         for lockname in ${!locks[@]};
           25         do
           26                 [ -e "${lockbasepath}/${lockname}" ] && rm -f "${lockbasepath}/${lockname}";
           27         done
           28 }
           29 
           30 trap unlock_on_disconnect EXIT
           31 trap unlock_on_disconnect 1
           32 trap unlock_on_disconnect 2
           33 trap unlock_on_disconnect 3
           34 trap unlock_on_disconnect 6
           35 trap unlock_on_disconnect 9
           36 trap unlock_on_disconnect 15
           37 
           38 while read -r line;
           39 do
           40         case "${line}" in
           41         "lock "*)
           42                 lockname="$(printf "%s\n" "${line}" | tr -d $'\r' | cut -d' ' -f 2)"
           43                 if [ -z "${lockname}" ];
           44                 then
           45                         printf "e no lock name specified\r\n"
           46                         exit 1;
           47                 fi
           48                 if [[ "${lockname}" =~ [^a-zA-Z0-9] ]];
           49                 then
           50                         printf "e lock name must be alphanumeric\r\n"
           51                         exit 1
           52                 fi
           53                 timeoutms="$(printf "%s\n" "${line}" | tr -d $'\r' | cut -d' ' -f 3)"
           54                 if [ -z "${timeoutms}" ];
           55                 then
           56                         printf "e no timeout specified\r\n"
           57                         exit 1;
           58                 fi
           59                 if [[ "${timeoutms}" =~ [^0-9] ]];
           60                 then
           61                         printf "e timeout must be numeric\r\n"
           62                         exit 1
           63                 fi
           64                 timeouts="$(units -t "${timeoutms}ms" "s" 2>/dev/null)"
           65                 case "${timeouts}" in
           66                 0*)
           67                         # flock(1) needs at least one second.
           68                         timeouts=1
           69                         ;;
           70                 esac
           71 
           72                 lockpath="${lockbasepath}/${lockname}"
           73                 touch "${lockpath}"
           74                 exec {fd}<>"${lockpath}"
           75                 flock -x -w "${timeouts}" "${fd}"
           76                 if [ $? -gt 0 ];
           77                 then
           78                         printf "t timeout\r\n"
           79                         exit 1
           80                 fi
           81                 locks[${lockname}]+="${fd}"
           82                 printf "l locked\r\n"
           83                 ;;
           84         "unlock "*)
           85                 lockname="$(printf "%s\n" "${line}" | tr -d $'\r' | cut -d' ' -f 2)"
           86                 if [ -z "${lockname}" ];
           87                 then
           88                         printf "e no lock name specified\r\n"
           89                         exit 1;
           90                 fi
           91                 if [[ "${lockname}" =~ [^a-zA-Z0-9] ]];
           92                 then
           93                         printf "e lock name must be alphanumeric\r\n"
           94                         exit 1
           95                 fi
           96 
           97                 lockfd=${locks[${lockname}]}
           98                 if [ -z "${lockfd}" ];
           99                 then
          100                         printf "e unknown lock\r\n"
          101                         exit 1
          102                 fi
          103 
          104                 flock -u "${lockfd}"
          105                 if [ $? -gt 1 ];
          106                 then
          107                         printf "e unlock error\r\n"
          108                         exit 1
          109                 fi
          110                 printf "u unlocked\r\n"
          111                 ;;
          112         *)
          113                 exit 1;
          114         esac        
          115 done
          116 
          117 exit 0
          118