5 Commits

Author SHA1 Message Date
T cca78896a9 use correct timezone 2026-06-17 13:20:48 +02:00
지지 ᚠד (Jiji Freya Daniel) Maslowski 23e126a08b do not open upstairs on bell ring on a Wednesday
Signed-off-by: 지지 ᚠד (Jiji Freya Daniel) Maslowski <info@orangecms.org>
2026-06-13 12:40:42 +02:00
Daniel Maslowski 3dd171484f Document how key update script runs the commands 2025-07-23 21:20:17 +02:00
T ba2946706b Fix update-keydb 2025-02-13 16:44:08 +01:00
T 80573055d9 Resend last known state on reconnect 2025-01-27 23:50:22 +01:00
6 changed files with 32 additions and 6 deletions
+12 -2
View File
@@ -43,8 +43,18 @@ Das IdentityFile ist der Deploy-SSH-Key, der im [Repo](https://git.chaospott.de/
### Schlüsselupdate ### Schlüsselupdate
`foodoor-update-keydb` Das Script [`foodoor-update-keydb`](debian/usr/sbin/foodoor-update-keydb)
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**. aktualisiert regelmäßig die Schlüssel auf der Tür und baut die `authorized_keys`
für die Benutzer `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 Minuten aktualisiert**.
Das Script beinhaltet auch den Aufruf von `/usr/sbin/foodoor`, das dem Keyfile
für den jeweiligen Schlüssel hinzugefügt wird. Bei Login mit dem Benutzer
`open`/`close`/`door` wird das entsprechende Argument dadurch mitgegeben, um die
Tür zu öffnen oder zu schließen bzw. den Status abzufragen.
### Schlüsselformate ### Schlüsselformate
+1 -1
View File
@@ -1,3 +1,3 @@
#!/bin/bash #!/bin/bash
VERSION=3.3.1 VERSION=$(grep -oP '(?<=Version: ).*$' debian/DEBIAN/control)
dpkg-deb --root-owner-group -b debian "foodoord_${VERSION}_all.deb" dpkg-deb --root-owner-group -b debian "foodoord_${VERSION}_all.deb"
+1 -1
View File
@@ -1,5 +1,5 @@
Package: foodoord Package: foodoord
Version: 3.3.1 Version: 3.4.0
Maintainer: Tobi <tobi@chaospott.de> Maintainer: Tobi <tobi@chaospott.de>
Architecture: all Architecture: all
Description: Control the doors of the club, ja! Description: Control the doors of the club, ja!
+2 -2
View File
@@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
set -e set -e
export PATH="/usr/bin:/bin:/usr/sbin:/sbin" export PATH="/usr/bin:/bin:/usr/sbin:/sbin"
@@ -8,7 +8,7 @@ temp_outfile=$dest.tmp
if [ ! -e "$dest/.git/config" ]; then if [ ! -e "$dest/.git/config" ]; then
#echo "Repo does not exist, trying to clone..." #echo "Repo does not exist, trying to clone..."
git -C "$dest" clone --quiet --single-branch --depth=1 ssh://git.chaospott.de/Keyverwaltung/foodoor-keys.git "$dest" git clone --quiet --single-branch --depth=1 ssh://git.chaospott.de/Keyverwaltung/foodoor-keys.git "$dest"
else else
#echo "Repo exists, updating..." #echo "Repo exists, updating..."
git -C "$dest" fetch --quiet && git -C "$dest" merge --quiet origin/master master git -C "$dest" fetch --quiet && git -C "$dest" merge --quiet origin/master master
+12
View File
@@ -1,6 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# vim: ts=2 sw=2 et # vim: ts=2 sw=2 et
import datetime
import grp import grp
import json import json
import os import os
@@ -12,6 +13,7 @@ import threading
import time import time
from configparser import ConfigParser from configparser import ConfigParser
from dataclasses import dataclass from dataclasses import dataclass
from zoneinfo import ZoneInfo
import paho.mqtt.client as mqtt import paho.mqtt.client as mqtt
import pifacedigitalio import pifacedigitalio
@@ -24,6 +26,7 @@ class FoodoorMQTT:
self.client.on_connect = self.on_connect self.client.on_connect = self.on_connect
self.client.on_message = self.on_message self.client.on_message = self.on_message
self._last_state = None
self._connect_lock = threading.Condition() self._connect_lock = threading.Condition()
def connect(self): def connect(self):
@@ -39,6 +42,8 @@ class FoodoorMQTT:
self.client.loop_stop() self.client.loop_stop()
def on_connect(self, client, userdata, flags, rc): def on_connect(self, client, userdata, flags, rc):
if self._last_state is not None:
self.send_state(self._last_state)
with self._connect_lock: with self._connect_lock:
self._connect_lock.notify() self._connect_lock.notify()
@@ -46,6 +51,7 @@ class FoodoorMQTT:
print(f"MQTT-Server Message: {msg.topic} {msg.payload}") print(f"MQTT-Server Message: {msg.topic} {msg.payload}")
def send_state(self, locked: bool): def send_state(self, locked: bool):
self._last_state = locked
self.client.publish(f"foobar/{self.area}/foodoor/status", { self.client.publish(f"foobar/{self.area}/foodoor/status", {
False: "open", False: "open",
True: "closed", True: "closed",
@@ -143,6 +149,12 @@ class Foodoord:
self.pifacedigital.leds[gpio].turn_off() self.pifacedigital.leds[gpio].turn_off()
def doorbell(self, event): def doorbell(self, event):
# ignore doorbell button on Wednesdays
now = datetime.datetime.now(ZoneInfo("Europe/Berlin"))
if ((now.isoweekday() == 3 and now.time() >= datetime.time(10))
or (now.isoweekday() == 4 and now.time() < datetime.time(2))):
return
if self.status_open: if self.status_open:
self.pifacedigital.relays[self.RELAYS_UNLOCK].toggle() self.pifacedigital.relays[self.RELAYS_UNLOCK].toggle()
time.sleep(2) time.sleep(2)
+4
View File
@@ -22,6 +22,7 @@ class FoodoorMQTT:
self.client.on_connect = self.on_connect self.client.on_connect = self.on_connect
self.client.on_message = self.on_message self.client.on_message = self.on_message
self._last_state = None
self._connect_lock = threading.Condition() self._connect_lock = threading.Condition()
def connect(self): def connect(self):
@@ -37,6 +38,8 @@ class FoodoorMQTT:
self.client.loop_stop() self.client.loop_stop()
def on_connect(self, client, userdata, flags, rc): def on_connect(self, client, userdata, flags, rc):
if self._last_state is not None:
self.send_state(self._last_state)
with self._connect_lock: with self._connect_lock:
self._connect_lock.notify() self._connect_lock.notify()
@@ -44,6 +47,7 @@ class FoodoorMQTT:
print(f"MQTT-Server Message: {msg.topic} {msg.payload}") print(f"MQTT-Server Message: {msg.topic} {msg.payload}")
def send_state(self, locked: bool): def send_state(self, locked: bool):
self._last_state = locked
self.client.publish(f"foobar/{self.area}/foodoor/status", { self.client.publish(f"foobar/{self.area}/foodoor/status", {
False: "open", False: "open",
True: "closed", True: "closed",