forked from HeikoBornholdt/alarm-o-bot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
alarm-o-bot.sh
executable file
·105 lines (90 loc) · 3.33 KB
/
alarm-o-bot.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
#!/bin/bash
########################################################################
#
# Dieses Skript liest sekündlich die Belegung eines gegebenen Pins aus. Der Wert
# beträgt im normafall 1 und wechselt bei einer Alarmierung auf 0.
# Sobald festgestellt wurde, dass eine Alarmierung stattfindet, werden alle
# *.sh-Dateien im Ordner ./started/enabled ausgeführt. Beim Ende einer
# Alarmierung werden alle *.sh-Dateien im Ordner ./ended/enabled ausgeführt.
# Außerdem werden jede Sekunde alle *.sh-Dateien im Ordner ./include/enabled
# ausgeführt. Somit ist es z.B. möglich, Daten aus externen Quellen im Vorfeld
# zu laden, damit diese bei einer Alarmierung sofort verfügbar sind.
#
# Eine Alarmierung kann wie folgt simuliert werden:
# $ svc -a /etc/service/alarm-o-bot
#
########################################################################
# erhalten Ordner dieses Skriptes
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
USAGE="Benutzung:\n-h\t\tZeigt diese Hilfe an\n-i string\tDatei zum Auslesen des Melder-Status (obligatorisch), z.B. /sys/class/gpio/gpio21/value\n";
if [ ! $# -ge 1 ]; then
printf "Kein Argument angegeben.\n${USAGE}" >&2
exit 2;
fi
while getopts ":hi::" Option; do
case $Option in
h )
printf "$USAGE" $(basename $0);
exit 0;
;;
i )
INPUT_GIVEN=1;
INPUT=${OPTARG};
;;
* ) # Default.
printf "Unbekanntes Argument: -${OPTARG}\n${USAGE}" >&2
exit 2;
;;
esac
done
# Validiere Eingaben
if [ ! "$INPUT_GIVEN" ]; then
printf "Keine Datei zum Auslesen des Melder-Status angeben.\n${USAGE}" >&2
exit 2;
fi
# Prüfe, ob Status ausgelesen werden kann
LAST_STATUS=`cat $INPUT 2> /dev/null`
if [ ! "$?" = "0" ]; then
echo "Datei existiert nicht oder kann nicht ausgelesen werden: ${INPUT}. Wurde der GPIO exportiert?" >&2
exit 2;
fi
# Gebe aktuellen Status aus
echo -n "Beginne mit Überwachung des Status. Aktuell: "
if [ "$LAST_STATUS" = "1" ]; then
echo 'Keine unquittieren Alarmierungen'
elif [ "$LAST_STATUS" = "0" ]; then
echo 'Unquittiere Alarmierungen vorhanden!'
else
echo "Unbekannt!? (${LAST_STATUS})"
fi
# Simuliere Alarmierung, bei SIGALRM
trap "SIMULATE_ALARM=1" SIGALRM
# Prüfe jede Sekunde, ob sich der Status geändert hat.
LAST_LAST_STATUS=$LAST_STATUS
while true; do
# Prüft, ob es gerade einen Alarm gibt. Gibt 0 zurück, wenn dies der Fall ist.
# Andernfalls 1.
STATUS=`cat $INPUT`
# Alarmierung wurde simuliert
if [ "$SIMULATE_ALARM" = "1" ]; then
unset SIMULATE_ALARM
STATUS=0
echo "Simuliere Alarmierung"
fi
if [ "$STATUS" = "0" ] && [ "$LAST_STATUS" = "1" ] && [ "$LAST_LAST_STATUS" = "1" ]; then
# Alarmierung begonnen
echo "Alarmierung gestartet: $(date)"
for f in ${DIR}/started/enabled/*.sh; do source $f; done
elif [ "$STATUS" = "1" ] && [ "$LAST_STATUS" = "1" ] && [ "$LAST_LAST_STATUS" = "0" ]; then
# Es kam vor, dass wenn im Melder eine unquittierte Nachricht vorlag, dass der Melder
# kurzeitig (nur wenige Hunderstel), auf 1 und dann wieder auf 0 sprang. Deswegen gucken
# wir hier auch auf LAST_LAST_STATUS
# Alarmierung beendet
echo "Alarmierung beendet: $(date)"
for f in ${DIR}/ended/enabled/*.sh; do source $f; done
fi
for f in ${DIR}/include/enabled/*.sh; do source $f; done
LAST_LAST_STATUS=$LAST_STATUS
LAST_STATUS=$STATUS
sleep 0.25
done