dreadlock-ng.sh - dreadlock-ng - Remote locking daemon with a funny name. | |
git clone git://bitreich.org/dreadlock-ng git://enlrupgkhuxnvlhsf6lc3fziv5h2hhf… | |
Log | |
Files | |
Refs | |
Tags | |
README | |
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 "${lockbas… | |
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 … | |
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… | |
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 … | |
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 |