Configuration is no longer hardcoded, spaceapi support implemented

This commit is contained in:
Mrkva 2017-04-22 23:12:17 +02:00
parent 70d0e3e936
commit 6027f1327a
4 changed files with 232 additions and 31 deletions

View file

@ -1,20 +1,12 @@
#!/bin/bash
GPIO_LOCK=24
GPIO_LED=22
GPIO_BEEP=23
GPIO_SWITCH=18
GPIO_MAGSWITCH=17
NFC_BINARY=/root/brmdoor/nfc-getcard
ALLOWED_LIST=/root/brmdoor/allowed.list
IRSSIFIFO=/home/brmdoor/.irssi/remote-control
IRCCHANS=("#brmlab" "#brmbiolab" "#brmstatus")
IRSSITOPICS=/home/brmdoor/.irssi/topics/
WD=$(dirname $(readlink -f $0))
if [ -e $WD/brmdoor.conf ]; then
echo "Loading config file $WD/brmdoor.conf..."
. $WD/brmdoor.conf
else
echo "ERROR: Config file not found. Please create brmdoor.conf in the same directory as brmdoor-rpi.sh."
exit 1
fi
# WARNING - OPEN/DOOR are stored as GPIO values. Since we have pullups and switches that grounds these pins, values are inverted (ie. 1 means "CLOSED")
OPEN=1
@ -27,10 +19,8 @@ IGNORE_ALARM_SET=50
IGNORE_ALARM=0
export LD_LIBRARY_PATH=/usr/local/lib
clean_gpio() {
for i in $GPIO_LOCK $GPIO_LED $GPIO_BEEP $GPIO_SWITCH $GPIO_MAGSWITCH; do
echo in > /sys/class/gpio/gpio${i}/direction
@ -85,8 +75,12 @@ irc_status() {
echo "TINFO" > "$IRSSIFIFO"
sleep 5s
for chan in ${IRCCHANS[*]}; do
echo "chan: $chan"
T=`cat "${IRSSITOPICS}/${chan}"`
NT=`echo "$T"|sed "s/BRMBIOLAB OPEN\|BRMBIOLAB CLOSED/BRMBIOLAB $1/"`
NT=`echo "$T"|sed "s/$ROOM OPEN\|$ROOM CLOSED/$ROOM $1/"`
echo "t: $T"
echo "nt: $NT"
echo "sed: s/$ROOM OPEN\|$ROOM CLOSED/$ROOM $1/"
if [ "$NT" = "$T" ]; then
continue;
fi
@ -99,6 +93,16 @@ log_message() {
echo "`date "+%Y-%m-%d %T"` $1" >> ~/brmdoor.log
}
updateSpaceApi() {
local open=$1
local changestamp=$2
if [ -z $SPACEAPI_DST ] || [ ! -f $SPACEAPI_TPL ]; then
return
fi
cat "$SPACEAPI_TPL"| sed "s/##OPEN##/$open/g;s/##LASTCHANGE##/$changestamp/g" > $SPACEAPI_DST
}
trap clean_gpio EXIT
@ -106,6 +110,8 @@ for i in $GPIO_LOCK $GPIO_LED $GPIO_BEEP $GPIO_SWITCH $GPIO_MAGSWITCH; do
echo $i > /sys/class/gpio/export
done
sleep 1 # do not remove unless running as root... few ms after exporting the GPIO the file is owned by root:root
for i in $GPIO_LOCK $GPIO_LED $GPIO_BEEP; do
echo "out" > /sys/class/gpio/gpio${i}/direction
done
@ -119,21 +125,32 @@ LOOP=0
NFC_FAILED=1
CURRENT_OPEN=`cat /sys/class/gpio/gpio${GPIO_SWITCH}/value`
LASTCHANGE=`date +%s`
if [ $CURRENT_OPEN -eq 1 ]; then
irc_status "CLOSED" &
updateSpaceApi false $LASTCHANGE
else
irc_status "OPEN" &
updateSpaceApi true $LASTCHANGE
fi
while true; do
CARD=`$NFC_BINARY`
RET=$?
if [ $RET -ne 0 ] && [ $NFC_FAILED -eq 1 ] ; then
NFC_FAILED=0
log_message "NFC_FAILURE"
logger -p user.error "[biodoor] NFC failure"
irc_message "[biodoor] NFC error! Might be out of order!"
logger -p user.error "[$IDENTITY] NFC failure"
# irc_message "[$IDENTITY] NFC error! Might be out of order!"
sleep 1s
continue
elif [ $RET -eq 0 ] && [ $NFC_FAILED -eq 0 ]; then
NFC_FAILED=1
log_message "NFC_BACK"
logger -p user.error "[biodoor] NFC back"
irc_message "[biodoor] NFC communication is back!"
logger -p user.error "[$IDENTITY] NFC back"
# irc_message "[$IDENTITY] NFC communication is back!"
fi
if [ $IGNORE_ALARM -gt 0 ]; then
@ -144,13 +161,13 @@ while true; do
NAME=`grep -i "^[0-9a-zA-Z_-]* ${CARD}$" "$ALLOWED_LIST"| cut -d ' ' -f 1`
if [ -z "$NAME" ]; then
log_message "UNKNOWN_CARD $CARD" &
logger "[biodoor] unauthorized access denied for card $CARD" &
irc_message "[biodoor] unauthorized access denied" &
logger "[$IDENTITY] unauthorized access denied for card $CARD" &
irc_message "[$IDENTITY] unauthorized access denied" &
beep_invalid
else
log_message "DOOR_UNLOCKED $NAME $CARD" &
logger "[biodoor] unlocked by $NAME $CARD" &
irc_message "[biodoor] door unlocked" &
logger "[$IDENTITY] unlocked by $NAME $CARD" &
irc_message "[$IDENTITY] door unlocked" &
echo 1 > /sys/class/gpio/gpio${GPIO_LOCK}/value
beep_unlocked &
sleep $LOCK_TIMEOUT
@ -163,15 +180,24 @@ while true; do
CURRENT_OPEN=`cat /sys/class/gpio/gpio${GPIO_SWITCH}/value`
if [ $CURRENT_OPEN -eq 1 -a $OPEN -eq 0 ]; then
log_message "STATUS_CLOSED" &
irc_message "[biostatus] update: CLOSED" &
irc_message "[${STATUS}] update: CLOSED" &
irc_status "CLOSED" &
LASTCHANGE=`date +%s`
updateSpaceApi false $LASTCHANGE
IGNORE_ALARM=$IGNORE_ALARM_SET
if [ -n $IMAGE_DST ]; then
cp $IMAGE_CLOSED $IMAGE_DST
fi
fi
if [ $CURRENT_OPEN -eq 0 -a $OPEN -eq 1 ]; then
log_message "STATUS_OPEN" &
irc_message "[biostatus] update: OPEN" &
irc_message "[${STATUS}] update: OPEN" &
irc_status "OPEN" &
LASTCHANGE=`date +%s`
updateSpaceApi true $LASTCHANGE
if [ -n $IMAGE_DST ]; then
cp $IMAGE_OPEN $IMAGE_DST
fi
fi
CURRENT_DOOR=`cat /sys/class/gpio/gpio${GPIO_MAGSWITCH}/value`
@ -180,7 +206,7 @@ while true; do
if [ $CURRENT_DOOR -eq 1 ] && [ $DOOR -eq 0 ] && [ $OPEN -eq 1 ] && [ $IGNORE_ALARM -eq 0 ]; then
log_message "DOOR_ALARM" &
irc_message "[biodoor] alarm! (status closed, door opened, not unlocked)" &
irc_message "[$IDENTITY] alarm! (status closed, door opened, not unlocked)" &
beep_alarm
fi
@ -206,4 +232,5 @@ while true; do
fi
let LOOP=$LOOP+1
sleep 1
done