Compare commits

...

3 Commits

Author SHA1 Message Date
T
e2e5878630 Add API v2 2024-07-04 23:03:35 +02:00
T
5724fcad2a Code style and shellcheck 2024-06-07 22:17:06 +02:00
bb8be95468
Foodoor-Systemd-Service; Paketinstaller fragt nach oben/unten 2022-11-01 18:56:45 +01:00
12 changed files with 348 additions and 437 deletions

View File

@ -10,7 +10,7 @@ Falls `/etc/foodoord.conf` nicht vorhanden ist:
* `mv /etc/foodoord.conf_example /etc/foodoord.conf`
1. Trage dort die API-Config für den Türstatus ein.
2. Sind wir oben oder unten? Diese Information in `where` eintragen. Also bspw. `where = oben`.
2. Falls nicht schon beim Paketinstall geschehen, mit `systemctl enable --now foodoord@oben` oder `systemctl enable --now foodoord@unten` enablen und starten.
@ -18,13 +18,13 @@ Falls `/etc/foodoord.conf` nicht vorhanden ist:
### Dateiliste
Der Deamon besteht aus folgenden Dateien.
Der Daemon besteht aus folgenden Dateien.
* foodoor
* foodoord
* foodoord.conf
* foodoord_initd
* foodoor-update-keydb
* foodoord@.service
Zusätzlich sollte für das git-repo eine Config angelegt werden:
@ -44,7 +44,7 @@ Das IdentityFile ist der Deploy-SSH-Key, der im [Repo](https://git.chaospott.de/
### Schlüsselupdate
`foodoor-update-keydb`
Aktualisiert die die Schlüssel auf der Tür und baut die *Authorized_Keys* für die User *open* und *close*. Keys die nicht dem OpenSSH-Format mit 4096 bit entsprechen, werden ignoriert. Wenn das Script von Hand aufgerufen wird, werden die betroffenen Keys angezeigt. Über einen Cronjob werden die Keys alle **5 Min aktualisiert**.
Aktualisiert die Schlüssel auf der Tür und baut die *Authorized_Keys* für die User *open* und *close*. Keys die nicht dem OpenSSH-Format mit 4096 bit entsprechen, werden ignoriert. Wenn das Script von Hand aufgerufen wird, werden die betroffenen Keys angezeigt. Über einen Cronjob werden die Keys alle **5 Min aktualisiert**.
### Schlüsselformate
@ -59,27 +59,27 @@ Der foodoord akzeptiert nur Pub-Keys im *OpenSSH2-Format*. Keys lassen sich unte
* `ssh-kegen -l -f $Pfad_zum_Key` gibt den Fingerprint und andere Informationen zurück.
####Keys konvertieren(PuTTy>OpenSSH):####
#### Keys konvertieren (PuTTy > OpenSSH):
* `ssh-keygen -i $Pfad_zum_Key > $Pfad_neuer_Pfad.pub<` liest ssh2-kompatible Keys (RFC 4716) ein und speichert diese im OpenSSH-Format.
###PuTTy###
### PuTTy
Da die Tür nur Keys im OpenSSH-Format verträgt, dürfen auch mit Putty nur OpenSSH-Keys genutzt werden.
###Keys generieren (OpenSSH-Format mit PuttyGen):###
#### Keys generieren (OpenSSH-Format mit PuttyGen):
1. PuTTYgen öffnen
2. Unten "Number of Bits in a generated Key:" 4096 eintippen
3. "Generate" klicken um Key zu generieren
4. Nach dem generieren oben im Menu "Conversions" > "Export OpenSSH-Key"
4. Nach dem Generieren oben im Menu "Conversions" > "Export OpenSSH-Key"
5. Speichern
Es ist zu beachten, dass Putty den PrivateKey im Putty-Format benötigt! Das heißt, falls der generierte Key vor dem Export nicht gespeichert wurde, muss der private Key noch konvertiert werden, siehe nächster Punkt!
###Keys konvertieren(OpenSSH>PuTTy):###
#### Keys konvertieren (OpenSSH > PuTTy):
1. PuTTYgen öffnen
2. "Load" drücken
@ -88,7 +88,6 @@ Es ist zu beachten, dass Putty den PrivateKey im Putty-Format benötigt! Das hei
5. Speichern
## Hardware
### Input:
@ -97,7 +96,6 @@ Es ist zu beachten, dass Putty den PrivateKey im Putty-Format benötigt! Das hei
* Klingel
* Statustaster
### Output:
* Status LEDs

View File

@ -1,3 +1,3 @@
#!/bin/bash
VERSION=3.0.3
dpkg-deb --root-owner-group -b debian foodoord_${VERSION}_all.deb
VERSION=3.2.0
dpkg-deb --root-owner-group -b debian "foodoord_${VERSION}_all.deb"

4
debian/DEBIAN/control vendored Normal file → Executable file
View File

@ -1,6 +1,6 @@
Package: foodoord
Version: 3.0.3
Version: 3.2.0
Maintainer: Bandie <bandie@chaospott.de>
Architecture: all
Description: Control the doors of the club, ja!
Depends: dash, git, python3
Depends: dash, git, python3, pip, tmux

View File

@ -1,5 +1,5 @@
#!/bin/bash
set -x
echo "Creating group and users.."
groupadd foodoor
useradd -M -d /var/lib/foodoor/close -G foodoor -s /bin/sh close
@ -12,11 +12,25 @@ for u in close open door; do
chown ${u}:${u} /var/lib/foodoor/${u}
done
echo "Chmod foodoor"
chmod 755 /var/lib/foodoor
echo "Create /state"
touch /state
chown root:foodoor /state
chmod 664 /state
echo "##################"
while [ "$prompt" != "oben" ] && [ "$prompt" != "unten" ]; do
read -r -p "Sind wir oben oder unten? (oben, unten): " prompt
done
echo "##################"
echo "Installing dependencies via pip: pifacecommon pifacedigitalio"
pip install pifacecommon pifacedigitalio
echo "Enabling and starting systemd-Services"
systemctl daemon-reload
systemctl enable foodoord
systemctl restart foodoord
systemctl enable "foodoord@$prompt"
systemctl restart "foodoord@$prompt"
systemctl status "foodoord@$prompt"

0
debian/etc/cron.d/foodoord vendored Normal file → Executable file
View File

7
debian/etc/foodoord.conf_example vendored Normal file → Executable file
View File

@ -3,6 +3,7 @@ status_url =
key =
secret =
[foodoord]
# oben or unten
where=
[doorstatusv2]
status_url =
key =
secret =

View File

@ -1,156 +0,0 @@
#! /bin/sh
### BEGIN INIT INFO
# Provides: foodoor
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: foodoor initscript
# Description: Daemon to lock and unlock the foodoor
### END INIT INFO
# Author: gammlaa <gammlaa@die-foobar.de>
# Do NOT "set -e"
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="foodoor daemon"
WHERE=$(cat /etc/foodoord.conf | grep 'where' | awk -F '=' '{ print $2 }' | tr -d ' ')
NAME=foodoord_${WHERE}
DAEMON=/usr/sbin/$NAME
#DAEMON_ARGS="--options args"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions
#
# Function that starts the daemon/service
#
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet --background --make-pidfile --pidfile $PIDFILE --exec $DAEMON -- \
$DAEMON_ARGS \
|| return 2
# Add code here, if necessary, that waits for the process to be ready
# to handle requests from services started subsequently which depend
# on this one. As a last resort, sleep for some time.
}
#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name python2
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Wait for children to finish too if this is a daemon that forks
# and if the daemon is only ever run from this initscript.
# If the above conditions are not satisfied then add some other code
# that waits for the process to drop all resources that could be
# needed by services started subsequently. A last resort is to
# sleep for some time.
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --pidfile $PIDFILE --exec $DAEMON
[ "$?" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
return "$RETVAL"
}
#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
#
# If the daemon can reload its configuration without
# restarting (for example, when it is sent a SIGHUP),
# then implement that here.
#
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
return 0
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
#reload|force-reload)
#
# If do_reload() is not implemented then leave this commented out
# and leave 'force-reload' as an alias for 'restart'.
#
#log_daemon_msg "Reloading $DESC" "$NAME"
#do_reload
#log_end_msg $?
#;;
restart|force-reload)
#
# If the "reload" option is implemented then remove the
# 'force-reload' alias
#
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
exit 3
;;
esac
:

13
debian/etc/systemd/system/foodoord@.service vendored Executable file
View File

@ -0,0 +1,13 @@
[Unit]
Description=foodoord %i
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service
[Service]
Type=simple
ExecStart=/usr/sbin/foodoord_%i
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target

View File

@ -1,37 +1,34 @@
#!/bin/sh
set -e
PIPE_PATH=/var/run/foodoord.pipe
if [ ! -e $PIPE_PATH ]
then
if [ ! -e $PIPE_PATH ]; then
echo "Pipe missing. Check daemon status."
exit 1
fi
action="$1"
isTriggerActivated="0"
action=$1
isTriggerActivated=0
if [ -z "$action" ]
then
action="$SSH_ORIGINAL_COMMAND"
isTriggerActivated="1"
if [ -z "$action" ]; then
action=$SSH_ORIGINAL_COMMAND
isTriggerActivated=1
fi
case $action in
close | open)
echo $action | tee $PIPE_PATH |sed 's/open/UNLOCKED/;s/close/LOCKED/' > /state
;;
status)
echo "$action" | tee "$PIPE_PATH" | sed 's/open/UNLOCKED/;s/close/LOCKED/' > /state
;;
status) ;;
*)
echo "Usage: $(basename $0) { close, open, status }"
echo "Usage: $(basename "$0") { close, open, status }"
exit 1
;;
esac
if [ $isTriggerActivated -eq 1 ]
then
if [ $isTriggerActivated -eq 1 ]; then
cat /state
sleep 2
fi

View File

@ -4,60 +4,51 @@ set -e
export PATH="/usr/bin:/bin:/usr/sbin:/sbin"
dest=/var/run/foodoor-keys
temp_outfile="$dest.tmp"
temp_outfile=$dest.tmp
if [ ! -e "${dest}/.git/config" ]
then
if [ ! -e "$dest/.git/config" ]; then
#echo "Repo does not exist, trying to clone..."
( cd /var/run && git clone --quiet --single-branch --depth=1 ssh://git.chaospott.de/Keyverwaltung/foodoor-keys.git "${dest}" )
git -C "$dest" clone --quiet --single-branch --depth=1 ssh://git.chaospott.de/Keyverwaltung/foodoor-keys.git "$dest"
else
#echo "Repo exists, updating..."
( cd "${dest}" && git fetch --quiet && git merge --quiet origin/master master )
git -C "$dest" fetch --quiet && git -C "$dest" merge --quiet origin/master master
fi
rm -f ${temp_outfile}
find "${dest}/keys" -name '*.pub' | sort | \
while read keyfile
do
ssh-keygen -l -f ${keyfile} &> /dev/null
if [ $? -eq 0 ]; then
valid=false
keyinfo=$(ssh-keygen -l -f ${keyfile}) # The whole key information
crypto=$(echo "${keyinfo}" | sed 's/.*(\(.*\))/\1/') # Looks like "RSA" or "ED25519"
key_length=$(echo "${keyinfo}" | cut -d" " -f1)
rm -f "$temp_outfile"
find "$dest/keys" -type f -name '*.pub' | sort |
while read -r keyfile; do
if ssh-keygen -l -f "$keyfile" &> /dev/null; then
keyinfo=$(ssh-keygen -l -f "$keyfile") # The whole key information
crypto=$(echo "$keyinfo" | sed 's/.*(\(.*\))/\1/') # Looks like "RSA" or "ED25519"
key_length=$(echo "$keyinfo" | cut -d" " -f1)
if [ "${crypto}" == "RSA" ]; then
if [ ${key_length} -lt 4096 ]; then
echo "Key size of key ${keyfile} not equal to 4096. Not adding it to key database." >&2
if [ "$crypto" == "RSA" ]; then
if [ "$key_length" -lt 4096 ]; then
echo "Key size of key $keyfile less than 4096. Not adding it to key database." >&2
continue
fi
# valid
elif [ "$crypto" == "ED25519" ]; then
: # valid
else
valid=true
continue
fi
elif [ "${crypto}" == "ED25519" ]; then
valid=true
fi
if [ "$valid" = true ]; then
echo "command=\"/usr/sbin/foodoor \$action \",no-port-forwarding,no-X11-forwarding,no-agent-forwarding $(cat ${keyfile} | sed 's/\r//g') ${keyfile}" >> ${temp_outfile}
fi
echo "command=\"/usr/sbin/foodoor \$action \",no-port-forwarding,no-X11-forwarding,no-agent-forwarding $(sed 's/\r//g' "$keyfile") $keyfile" >> $temp_outfile
fi
done
for appendix in open close door
do
action="$appendix"
for appendix in open close door; do
action=$appendix
if [ "$appendix" = "door" ]; then
action=""
fi
export action
outfile="${dest}/authorized_keys.${appendix}"
cat ${temp_outfile} |envsubst > ${outfile}
outfile=$dest/authorized_keys.$appendix
envsubst < "$temp_outfile" > "$outfile"
# Oben und unten
install -d -o ${appendix} -g nogroup -m 0700 /var/lib/foodoor/${appendix}/.ssh
install -b -S .last -o ${appendix} -g nogroup -m 0600 ${outfile} /var/lib/foodoor/${appendix}/.ssh/authorized_keys
install -d -o "$appendix" -g nogroup -m 0700 "/var/lib/foodoor/$appendix/.ssh"
install -b -S .last -o "$appendix" -g nogroup -m 0600 "$outfile" "/var/lib/foodoor/$appendix/.ssh/authorized_keys"
done

View File

@ -1,23 +1,18 @@
#!/usr/bin/env python3
# vim: ts=2 sw=2 et
import os
import stat
import time
import pifacedigitalio
import signal
import sys
import grp
import json
import os
import signal
import stat
import subprocess
import sys
import time
from configparser import ConfigParser
from dataclasses import dataclass
#Read config
parser = ConfigParser()
parser.read('/etc/foodoord.conf')
doorapi = parser.get('doorstatus', 'status_url')
consumerkey = parser.get('doorstatus', 'key')
consumersecret = parser.get('doorstatus', 'secret')
import pifacedigitalio
# Definitions for output
LED_RED = 6
@ -27,76 +22,108 @@ RELAYS_UNLOCK=1
# Definitions for input
DOOR_BELL = 0
REED_RELAYS=1 #not implementet yet
REED_RELAYS = 1 # not implemented yet
# Definitions for LED color
RED = 1
GREEN = 2
ORANGE = 3
# Read config
parser = ConfigParser()
parser.read('/etc/foodoord.conf')
@dataclass
class API:
api_url: str
consumer_key: str
consumer_secret: str
APIv1 = API(
parser.get('doorstatus', 'status_url'),
parser.get('doorstatus', 'key'),
parser.get('doorstatus', 'secret'),
)
APIv2 = API(
parser.get('doorstatusv2', 'status_url'),
parser.get('doorstatusv2', 'key'),
parser.get('doorstatusv2', 'secret'),
)
def update_api(locked):
try:
os.system("/usr/bin/curl -XPOST --header 'Content-Type: application/json' --data '{ \"consumer_key\": \"" + consumerkey + "\", \"consumer_secret\": \"" + consumersecret + "\", \"aerie\": " + str(locked).lower() + " }' '" + doorapi + "' ")
# API v1
subprocess.check_call([
"/usr/bin/curl", "-XPOST",
"--header", "Content-Type: application/json",
"--data",
json.dumps({"consumer_key": APIv1.consumer_key, "consumer_secret": APIv1.consumer_secret, "aerie": locked}),
APIv1.api_url
])
except:
pass
if __name__ == "__main__":
def doorbell(event):
if (STATUS):
pifacedigital.relays[RELAYS_UNLOCK].toggle()
time.sleep(2)
pifacedigital.relays[RELAYS_UNLOCK].toggle()
#print 'got doorbell'
def close_button(event):
global STATUS
STATUS = False
try:
update_api(True)
# API v2
subprocess.check_call([
"/usr/bin/curl", "-XPOST",
"--header", "Content-Type: application/json",
"--data",
json.dumps({"consumer_key": APIv2.consumer_key, "consumer_secret": APIv2.consumer_secret, "aerie": locked}),
APIv2.api_url
])
except:
pass
set_led(RED)
def set_led(color):
if color == RED:
pifacedigital.leds[LED_RED].turn_on()
pifacedigital.leds[LED_GREEN].turn_off()
elif color == GREEN:
pifacedigital.leds[LED_GREEN].turn_on()
pifacedigital.leds[LED_RED].turn_off()
elif color == ORANGE:
pifacedigital.leds[LED_RED].turn_on()
pifacedigital.leds[LED_GREEN].turn_on()
listener = pifacedigitalio.InputEventListener()
listener.register(0, pifacedigitalio.IODIR_RISING_EDGE, doorbell, settle_time=10)
listener.register(1, pifacedigitalio.IODIR_RISING_EDGE, close_button, settle_time=5)
listener.activate()
class Foodoord:
def __init__(self):
self.status_open = False
def signal_handler(signal, frame):
listener.deactivate()
self.listener = pifacedigitalio.InputEventListener()
self.listener.register(0, pifacedigitalio.IODIR_RISING_EDGE, self.doorbell, settle_time=10)
self.listener.register(1, pifacedigitalio.IODIR_RISING_EDGE, self.close_button, settle_time=5)
def signal_handler(self, _signal, _frame):
self.listener.deactivate()
os.remove("/var/run/foodoord.pipe")
try:
update_api(True)
except:
pass
set_led(RED)
sys.exit(0)
def set_led(color):
if (color==RED):
pifacedigital.leds[LED_RED].turn_on()
pifacedigital.leds[LED_GREEN].turn_off()
def doorbell(self, event):
if self.status_open:
pifacedigital.relays[RELAYS_UNLOCK].toggle()
time.sleep(2)
pifacedigital.relays[RELAYS_UNLOCK].toggle()
elif (color==GREEN):
pifacedigital.leds[LED_GREEN].turn_on()
pifacedigital.leds[LED_RED].turn_off()
def close_button(self, _event):
self.status_open = False
update_api(True)
set_led(RED)
elif (color==ORANGE):
pifacedigital.leds[LED_RED].turn_on()
pifacedigital.leds[LED_GREEN].turn_on()
def main(self):
self.listener.activate()
pifacedigital = pifacedigitalio.PiFaceDigital()
signal.signal(signal.SIGTERM, signal_handler)
signal.signal(signal.SIGTERM, self.signal_handler)
# Start settings
STATUS = False
pifacedigital.leds[LED_RED].turn_on()
# Setting up FiFo to get sshd-output
@ -107,37 +134,32 @@ if __name__ == "__main__":
except OSError:
pass
with open("/var/run/foodoord.pipe", "r") as ssh_input:
while 1:
ssh_input = open("/var/run/foodoord.pipe", "r")
while True:
# Read sshd-output from pipe
Pipe = ssh_input.readline()[:-1]
pipe_cmd = ssh_input.readline().strip()
if (Pipe == "close" and STATUS):
if pipe_cmd == "close" and self.status_open:
pifacedigital.relays[RELAYS_LOCK].toggle()
time.sleep(1)
pifacedigital.relays[RELAYS_LOCK].toggle()
STATUS = False
try:
self.status_open = False
update_api(True)
except:
pass
set_led(RED)
elif (Pipe == "open"):
elif pipe_cmd == "open":
pifacedigital.relays[RELAYS_UNLOCK].toggle()
time.sleep(2)
pifacedigital.relays[RELAYS_UNLOCK].toggle()
if (STATUS==False):
try:
if not self.status_open:
update_api(False)
except:
pass
STATUS = True
self.status_open = True
set_led(GREEN)
time.sleep(0.1)
if __name__ == "__main__":
Foodoord().main()

View File

@ -1,22 +1,16 @@
#! /usr/bin/python3
#!/usr/bin/env python3
# vim: ts=2 sw=2 et
import grp
import json
import os
import stat
import subprocess
import time
import signal
import sys
import RPi.GPIO as gpio
import grp
from configparser import ConfigParser
from dataclasses import dataclass
#Read config
parser = ConfigParser()
parser.read('/etc/foodoord.conf')
doorapi = parser.get('doorstatus', 'status_url')
consumerkey = parser.get('doorstatus', 'key')
consumersecret = parser.get('doorstatus', 'secret')
import RPi.GPIO as gpio
# Definitions for output
LED_RED = 6
@ -27,37 +21,76 @@ PIN_OPEN=24
PIN_CLOSE = 27
# Definitions for input
DOOR_BELL = 0
REED_RELAYS=1 #not implementet yet
REED_RELAYS = 1 # not implemented yet
# Definitions for LED color
RED = 1
GREEN = 2
ORANGE = 3
# Read config
parser = ConfigParser()
parser.read('/etc/foodoord.conf')
@dataclass
class API:
api_url: str
consumer_key: str
consumer_secret: str
APIv1 = API(
parser.get('doorstatus', 'status_url'),
parser.get('doorstatus', 'key'),
parser.get('doorstatus', 'secret'),
)
APIv2 = API(
parser.get('doorstatusv2', 'status_url'),
parser.get('doorstatusv2', 'key'),
parser.get('doorstatusv2', 'secret'),
)
def write_state(state):
try:
handle = open("/tmp/door_state", "w")
with open("/tmp/door_state", "w") as handle:
handle.write(state)
handle.close()
except:
pass
def update_api(locked):
try:
os.system("/usr/bin/curl -XPOST --header 'Content-Type: application/json' --data '{ \"consumer_key\": \"" + consumerkey + "\", \"consumer_secret\": \"" + consumersecret + "\", \"cellar\": " + str(locked).lower() + " }' '" + doorapi + "' ")
# API v1
subprocess.check_call([
"/usr/bin/curl", "-XPOST",
"--header", "Content-Type: application/json",
"--data",
json.dumps({"consumer_key": APIv1.consumer_key, "consumer_secret": APIv1.consumer_secret, "cellar": locked}),
APIv1.api_url
])
except:
pass
try:
# API v2
subprocess.check_call([
"/usr/bin/curl", "-XPOST",
"--header", "Content-Type: application/json",
"--data",
json.dumps({"consumer_key": APIv2.consumer_key, "consumer_secret": APIv2.consumer_secret, "cellar": locked}),
APIv2.api_url
])
except:
pass
if __name__ == "__main__":
def main():
# Start settings
STATUS=False
gpio.setmode(gpio.BCM)
gpio.setup(PIN_OPEN, gpio.OUT)
gpio.setup(PIN_CLOSE, gpio.OUT)
# Setting up FiFo to get sshd-output
try:
os.mkfifo("/var/run/foodoord.pipe")
@ -66,12 +99,12 @@ if __name__ == "__main__":
except OSError:
pass
with open("/var/run/foodoord.pipe", "r") as ssh_input:
while 1:
#Read sshd-output from pipe
Pipe = ssh_input.readline()[:-1]
ssh_input = open("/var/run/foodoord.pipe", "r")
while True:
# Read sshd output from pipe
pipe_cmd = ssh_input.readline().strip()
if (Pipe == "close"):
if pipe_cmd == "close":
gpio.output(PIN_CLOSE, 1)
time.sleep(1)
gpio.output(PIN_CLOSE, 0)
@ -79,19 +112,17 @@ if __name__ == "__main__":
write_state("closed")
update_api(True)
elif (Pipe == "open"):
elif pipe_cmd == "open":
# Locking
gpio.output(PIN_OPEN, 1)
time.sleep(1)
gpio.output(PIN_OPEN, 0)
#Save State
write_state("open")
#Status Update
update_api(False)
write_state("open") # Save State
update_api(False) # Status Update
time.sleep(0.2)
if __name__ == "__main__":
main()