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