mirror of
https://gitlab.com/sfz.aalen/infra/fabaccess.git
synced 2025-03-13 07:21:44 +01:00
First work adding DB
This commit is contained in:
parent
eb7e7c693c
commit
8b10defed2
@ -1,5 +0,0 @@
|
|||||||
DROP DATABASE IF EXISTS FabAccess;
|
|
||||||
CREATE DATABASE IF NOT EXISTS FabAccess;
|
|
||||||
USE FabAccess;
|
|
||||||
CREATE TABLE `ReaderPlug` (`ReaderID` INT NOT NULL , `PlugName` VARCHAR(255) NOT NULL, `PermissionPath` VARCHAR(255) NOT NULL, `Status` BOOLEAN NOT NULL, `LastUser` VARCHAR(255) NOT NULL) ENGINE = InnoDB;
|
|
||||||
INSERT INTO `ReaderPlug` (`ReaderID`, `PlugName`, `PermissionPath`, `Status`, `LastUser`) VALUES ("001", "lasercutter", "sfz.lasercutter.trotec", 0, "luca.lutz");
|
|
@ -17,7 +17,6 @@ services:
|
|||||||
DB_PASSWORD: ${DB_PASSWORD:?err}
|
DB_PASSWORD: ${DB_PASSWORD:?err}
|
||||||
DB_DATABASE: ${DB_DATABASE:?err}
|
DB_DATABASE: ${DB_DATABASE:?err}
|
||||||
# MQTT config
|
# MQTT config
|
||||||
MQTT_PORT: ${MQTT_PORT:?err}
|
|
||||||
MQTT_USERNAME: ${MQTT_USERNAME:?err}
|
MQTT_USERNAME: ${MQTT_USERNAME:?err}
|
||||||
MQTT_PASSWORD: ${MQTT_PASSWORD:?err}
|
MQTT_PASSWORD: ${MQTT_PASSWORD:?err}
|
||||||
MQTT_BROKER: ${MQTT_BROKER:?err}
|
MQTT_BROKER: ${MQTT_BROKER:?err}
|
||||||
|
@ -1,18 +1,25 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
class Config:
|
class Config:
|
||||||
mqtt_broker = os.getenv('MQTT_BROKER')
|
|
||||||
mqtt_port = int(os.getenv('MQTT_PORT'))
|
|
||||||
mqtt_client_id = os.getenv('MQTT_CLIENT')
|
|
||||||
mqtt_user_name = os.getenv('MQTT_USERNAME')
|
|
||||||
mqtt_password = os.getenv('MQTT_PASSWORD')
|
|
||||||
|
|
||||||
keycloak_url = os.getenv('KEYCLOAK_URL')
|
def _read_from_env(key: str, default: str = None) -> str:
|
||||||
keycloak_user_name = os.getenv('KEYCLOAK_USER_NAME')
|
if (value := os.environ.get(key, default)) is not None:
|
||||||
keycloak_password = os.getenv('KEYCLOAK_USER_PW')
|
return value
|
||||||
keycloak_realm = os.getenv('KEYCLOAK_REALM')
|
raise Exception(f'[Config] Error: Cannot find required value {key}')
|
||||||
|
|
||||||
db_host_name = os.getenv('DB_HOSTNAME')
|
mqtt_broker = _read_from_env('MQTT_BROKER')
|
||||||
db_user_name = os.getenv('DB_USERNAME')
|
mqtt_port = int(_read_from_env('MQTT_PORT','1883'))
|
||||||
db_password = os.getenv('DB_PASSWORD')
|
mqtt_client_id = _read_from_env('MQTT_CLIENT')
|
||||||
db_database = os.getenv('DB_DATABASE')
|
mqtt_user_name = _read_from_env('MQTT_USERNAME')
|
||||||
|
mqtt_password = _read_from_env('MQTT_PASSWORD')
|
||||||
|
|
||||||
|
keycloak_url = _read_from_env('KEYCLOAK_URL')
|
||||||
|
keycloak_user_name = _read_from_env('KEYCLOAK_USER_NAME')
|
||||||
|
keycloak_password = _read_from_env('KEYCLOAK_USER_PW')
|
||||||
|
keycloak_realm = _read_from_env('KEYCLOAK_REALM')
|
||||||
|
|
||||||
|
db_host_name = _read_from_env('DB_HOSTNAME')
|
||||||
|
db_user_name = _read_from_env('DB_USERNAME')
|
||||||
|
db_password = _read_from_env('DB_PASSWORD')
|
||||||
|
db_database = _read_from_env('DB_DATABASE')
|
||||||
|
db_port = int(_read_from_env('DB_PORT','5432'))
|
@ -3,7 +3,7 @@ import os
|
|||||||
from config import Config
|
from config import Config
|
||||||
from mqtt_client import MqttHandler
|
from mqtt_client import MqttHandler
|
||||||
from keycloak_handler import KeycloakHandler
|
from keycloak_handler import KeycloakHandler
|
||||||
|
from sql_handler import SQLHandler
|
||||||
|
|
||||||
def has_permission(user_permissions, machine_id):
|
def has_permission(user_permissions, machine_id):
|
||||||
parsed_permissions = [permission.split('.') for permission in user_permissions]
|
parsed_permissions = [permission.split('.') for permission in user_permissions]
|
||||||
@ -52,6 +52,9 @@ def handle_request(msg, client):
|
|||||||
# - get last_user from database
|
# - get last_user from database
|
||||||
# - get machine_status from database, is 0 for off, 1 for on
|
# - get machine_status from database, is 0 for off, 1 for on
|
||||||
# - get plug_id from database
|
# - get plug_id from database
|
||||||
|
|
||||||
|
print(SQLHandler.get_machine_data(reader_id))
|
||||||
|
|
||||||
machine_id = 'space.foo.lazerspacer'
|
machine_id = 'space.foo.lazerspacer'
|
||||||
last_user = 'foo.bar'
|
last_user = 'foo.bar'
|
||||||
machine_status = 0 # or 1
|
machine_status = 0 # or 1
|
||||||
@ -92,9 +95,13 @@ def handle_request(msg, client):
|
|||||||
|
|
||||||
def main():
|
def main():
|
||||||
MqttHandler.setup(handle_request)
|
MqttHandler.setup(handle_request)
|
||||||
|
KeycloakHandler.login()
|
||||||
|
SQLHandler.setup()
|
||||||
|
|
||||||
MqttHandler.connect_mqtt()
|
MqttHandler.connect_mqtt()
|
||||||
MqttHandler.subscribe("/rfid_reader/#")
|
MqttHandler.subscribe("/rfid_reader/#")
|
||||||
KeycloakHandler.login()
|
SQLHandler.init_db()
|
||||||
|
|
||||||
MqttHandler.loop()
|
MqttHandler.loop()
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
65
fab_access/sql_handler.py
Normal file
65
fab_access/sql_handler.py
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
import psycopg2
|
||||||
|
from psycopg2 import sql, extensions
|
||||||
|
|
||||||
|
from config import Config
|
||||||
|
|
||||||
|
class SQLHandler:
|
||||||
|
@staticmethod
|
||||||
|
def setup():
|
||||||
|
SQLHandler.cursor = None
|
||||||
|
SQLHandler.conn = None
|
||||||
|
SQLHandler.conn = psycopg2.connect(host=Config.db_host_name, user=Config.db_user_name, port=Config.db_port, password=Config.db_password, dbname=Config.db_database)
|
||||||
|
# get the isolation leve for autocommit
|
||||||
|
autocommit = extensions.ISOLATION_LEVEL_AUTOCOMMIT
|
||||||
|
print ("ISOLATION_LEVEL_AUTOCOMMIT:", extensions.ISOLATION_LEVEL_AUTOCOMMIT)
|
||||||
|
|
||||||
|
# set the isolation level for the connection's cursors
|
||||||
|
# will raise ActiveSqlTransaction exception otherwise
|
||||||
|
SQLHandler.conn.set_isolation_level( autocommit )
|
||||||
|
SQLHandler.cursor = SQLHandler.conn.cursor()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_machine_data(reader_id):
|
||||||
|
# TODO Database
|
||||||
|
# - get machine_id from database
|
||||||
|
# - get last_user from database
|
||||||
|
# - get machine_status from database, is 0 for off, 1 for on
|
||||||
|
# - get plug_id from database
|
||||||
|
SQLHandler.cursor.execute("SELECT machine_id,last_user,machine_status,plug_id FROM readerplug WHERE reader_id = %s;", (reader_id,))
|
||||||
|
data = [row for row in SQLHandler.cursor.fetchall()]
|
||||||
|
print(data)
|
||||||
|
return {
|
||||||
|
'machine_id': data[0],
|
||||||
|
'last_user': data[1],
|
||||||
|
'machine_status': data[2],
|
||||||
|
'plug_id': data[3]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def init_db():
|
||||||
|
SQLHandler.cursor.execute("SELECT datname FROM pg_database;")
|
||||||
|
dbs = [row[0] for row in SQLHandler.cursor.fetchall()]
|
||||||
|
if not (Config.db_database in dbs):
|
||||||
|
print(f"Missing database ({Config.db_database}) -> creating new db")
|
||||||
|
SQLHandler.cursor.execute(sql.SQL("CREATE DATABASE {};").format(sql.Identifier( Config.db_database )))
|
||||||
|
else:
|
||||||
|
print(f"Found DB {Config.db_database} -> Using existing one")
|
||||||
|
|
||||||
|
SQLHandler.cursor.execute("SELECT * FROM pg_catalog.pg_tables\
|
||||||
|
WHERE schemaname != 'pg_catalog' AND \
|
||||||
|
schemaname != 'information_schema';")
|
||||||
|
tables = [row[1] for row in SQLHandler.cursor.fetchall()]
|
||||||
|
if not ("readerplug" in tables):
|
||||||
|
print("Missing table -> creating new table in db")
|
||||||
|
SQLHandler.cursor.execute("\
|
||||||
|
CREATE TABLE readerplug (\
|
||||||
|
reader_id int NOT NULL, \
|
||||||
|
plug_id varchar(255) NOT NULL, \
|
||||||
|
machine_id varchar(255) NOT NULL, \
|
||||||
|
machine_status boolean NOT NULL, \
|
||||||
|
last_user varchar(255) NOT NULL \
|
||||||
|
)")
|
||||||
|
else:
|
||||||
|
print("Found Table -> Using existing one")
|
||||||
|
SQLHandler.conn.commit()
|
@ -1,4 +1,4 @@
|
|||||||
keycloak_wrapper
|
keycloak_wrapper
|
||||||
paho-mqtt
|
paho-mqtt
|
||||||
psycopg[binary]
|
psycopg2-binary
|
||||||
python-keycloak
|
python-keycloak
|
Loading…
x
Reference in New Issue
Block a user