-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdoor.sh
executable file
·128 lines (118 loc) · 3.69 KB
/
door.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#! /bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
OPEN_INDICATOR=/tmp/door_status_open
CLOSED_INDICATOR=/tmp/door_status_closed
GPIO_SWITCH=21
WATCHDOG_PID=/tmp/door_watchdog_pid
DELAY=10
DATE_STRING="$(date +%s)#$(date +"%F %X")"
TIMEOUT=30
LOCKDIR="/var/lock"
lock_file() {
OUTFILE=$1
OUTFILE_LOCK="${LOCKDIR}/$(readlink -f $OUTFILE | sed -e "s/\//\!/g").lock"
TIMEOUT_LOCK=$TIMEOUT
while [ $(mkdir "$OUTFILE_LOCK" 2> /dev/null; echo $? ) -ne 0 -a $TIMEOUT_LOCK -gt 0 ]; do
TIMEOUT_LOCK=$(($TIMEOUT_LOCK-1))
if [ -f "$OUTFILE_LOCK/lastaction" -a ! -d "$OUTFILE_LOCK/timeout" ] >> /dev/null 2>&1; then
FILEAGE=$(($(date +%s) - $(stat -c '%Y' "$OUTFILE_LOCK/lastaction" || echo $(date +%s) 2> /dev/null )))
TIMEOUT_LOCK=$(($TIMEOUT-$FILEAGE))
fi
if [ $TIMEOUT_LOCK -le 0 ]; then
if [ $(mkdir "$OUTFILE_LOCK/timeout" >> /dev/null 2>&1; echo $? ) -ne 0 ]; then
TIMEOUTAGE_LOCK=$(($(date +%s) - $(stat -c '%Y' "$OUTFILE_LOCK/timeout")))
if [ $TIMEOUTAGE_LOCK -gt $TIMEOUT ]; then
if [ $(rm -rf "$OUTFILE_LOCK/timeout" >> /dev/null 2>&1; echo $? ) -ne 0 ]; then
TIMEOUT_LOCK=$TIMEOUT
else
TIMEOUT_LOCK=1
fi
else
TIMEOUT_LOCK=$(($TIMEOUT-$TIMEOUTAGE_LOCK))
fi
fi
fi
sleep 1
done
if [ $TIMEOUT_LOCK -le 0 ]; then
echo "Timeout! Ignoring old \"$OUTFILE_LOCK\"." >&2
fi
touch "$OUTFILE_LOCK/lastaction"
}
unlock_file() {
OUTFILE=${1}
OUTFILE_LOCK="${LOCKDIR}/$(readlink -f $OUTFILE | sed -e "s/\//\!/g").lock"
rm -rf "$OUTFILE_LOCK"
}
cd $(dirname $0) || {
echo "konnte verzeichniss nicht wechseln"
exit 1
}
if ! kill -0 $(cat $WATCHDOG_PID 2> /dev/null) > /dev/null 2>&1; then
{
( while true; do
{
if [ $(cat /sys/class/gpio/gpio${GPIO_SWITCH}/value) -ne 1 -a -f $CLOSED_INDICATOR ]; then
{
lock_file $OPEN_INDICATOR
lock_file $CLOSED_INDICATOR
touch $OPEN_INDICATOR
rm -f $CLOSED_INDICATOR >> /dev/null 2>&1
unlock_file $OPEN_INDICATOR
unlock_file $CLOSED_INDICATOR
}
fi
sleep .5
}
done ) &
echo $! > $WATCHDOG_PID
cat $WATCHDOG_PID
}
fi
lock_file $OPEN_INDICATOR
lock_file $CLOSED_INDICATOR
if [ -f $OPEN_INDICATOR ]; then
LOCK_AGE=$(( $(date +%s)-$(stat -c %X $OPEN_INDICATOR) ))
elif [ -f $CLOSED_INDICATOR ]; then
LOCK_AGE=$(( $(date +%s)-$(stat -c %X $CLOSED_INDICATOR) ))
else
LOCK_AGE=$DELAY
fi
if [ $LOCK_AGE -lt $DELAY ]; then
echo "please wait at least $DELAY seconds before a second run of this script" >&2
unlock_file $OPEN_INDICATOR
unlock_file $CLOSED_INDICATOR
exit 1
fi
if [ "$1" == "noverify" ]; then
STATUS=0
else
./door_verify.sh
STATUS=$?
fi
if [ $STATUS -eq 0 ]; then
if [ -f $OPEN_INDICATOR ]; then
echo "closing door"
./door_lock.sh close
rm $OPEN_INDICATOR
touch $CLOSED_INDICATOR
else
echo "opening door"
./door_lock.sh open
rm $CLOSED_INDICATOR
touch $OPEN_INDICATOR
fi
unlock_file $OPEN_INDICATOR
unlock_file $CLOSED_INDICATOR
exit 0
else
echo "the lock won't move" >&2
if [ -f $OPEN_INDICATOR ]; then
touch $OPEN_INDICATOR
else
touch $CLOSED_INDICATOR
fi
unlock_file $OPEN_INDICATOR
unlock_file $CLOSED_INDICATOR
exit 1
fi