101 lines
3.2 KiB
Python
Raw Normal View History

2022-11-03 00:41:51 +01:00
import json
import os
from config import Config
from mqtt_client import MqttHandler
from keycloak_handler import KeycloakHandler
2022-11-04 00:15:23 +01:00
from sql_handler import SQLHandler
2022-11-03 00:41:51 +01:00
def has_permission(user_permissions, machine_id):
parsed_permissions = [permission.split('.') for permission in user_permissions]
parsed_machine_id = machine_id.split('.')
for permission in parsed_permissions:
missmatch = False
for i, id_sequence in enumerate(parsed_machine_id):
if permission[i] == '*':
return True
if permission[i] != id_sequence:
missmatch = True
break
if not missmatch:
return True
return False
def gen_display_name(user):
# display names must be not longer than 8 chrs
if 'firstName' in user.keys() and 'lastName' in user.keys():
full_name = f'{user["firstName"]} {user["lastName"]}'
if len(full_name) > 8:
2022-11-04 19:07:35 +01:00
display_name = f'{user["firstName"][0]}.{user["lastName"][:6]}'
2022-11-03 00:41:51 +01:00
else:
try:
display_name = user['username'][:8]
except KeyError:
print('user has no username')
return 'Error'
2022-11-04 19:07:35 +01:00
return(display_name)
2022-11-03 00:41:51 +01:00
def handle_request(msg, client):
print('')
print(f'Received `{msg.payload.decode()}` from `{msg.topic}` topic')
fabcard_id = json.loads(msg.payload.decode())['UID']
reader_id = msg.topic.split('/')[-1]
2022-11-04 18:38:44 +01:00
KeycloakHandler.login()
2022-11-03 00:41:51 +01:00
user = KeycloakHandler.get_user_by_card_id(fabcard_id)
if not user:
MqttHandler.print_to_display(reader_id, 16, fabcard_id)
return
2022-11-04 18:38:44 +01:00
db_data = SQLHandler.get_machine_data(reader_id)
2022-11-04 00:15:23 +01:00
2022-11-04 18:38:44 +01:00
machine_id = db_data["machine_id"]
2022-11-04 19:07:35 +01:00
last_user = db_data["last_user"]
machine_status = db_data["machine_status"]
plug_id = db_data["plug_id"]
2022-11-03 00:41:51 +01:00
try:
user_permissions = json.loads(user['attributes']['FabPermissions'][0])
except KeyError:
print(f'user with id {fabcard_id} is missing FabPermissions attr')
except IndexError:
print(f'user with id {fabcard_id} is missing FabPermissions attr')
if not has_permission(user_permissions, machine_id):
print(f"user with id {fabcard_id} is missing {machine_id}")
2022-11-03 00:41:51 +01:00
MqttHandler.print_to_display(reader_id, 7, '')
return
username = user['username']
display_name = gen_display_name(user)
2022-11-04 18:38:44 +01:00
if not machine_status:
2022-11-03 00:41:51 +01:00
print(f'Turn Plug {plug_id} on')
MqttHandler.switch_plug(plug_id, 1)
MqttHandler.print_to_display(reader_id, 20, f'Login\n{display_name}')
else:
if not (username == last_user or KeycloakHandler.user_is_privileged(username)):
MqttHandler.print_to_display(reader_id, 9, last_user)
return
print(f'Turn Plug {plug_id} off')
MqttHandler.switch_plug(plug_id, 0)
MqttHandler.print_to_display(reader_id, 20, f'Bitte anmelden')
2022-11-04 19:07:35 +01:00
SQLHandler.update_machine(reader_id, username, machine_status)
2022-11-03 00:41:51 +01:00
MqttHandler.publish(f'/FabLogging/{plug_id}/USER', username)
def main():
MqttHandler.setup(handle_request)
2022-11-04 00:15:23 +01:00
KeycloakHandler.login()
SQLHandler.setup()
2022-11-03 21:22:03 +01:00
MqttHandler.connect_mqtt()
2022-11-03 00:41:51 +01:00
MqttHandler.subscribe("/rfid_reader/#")
2022-11-04 00:15:23 +01:00
SQLHandler.init_db()
2022-11-03 00:41:51 +01:00
MqttHandler.loop()
if __name__ == '__main__':
main()