import json import os from config import Config from mqtt_client import MqttHandler from keycloak_handler import KeycloakHandler from sql_handler import SQLHandler 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: display_name = f'{user["firstName"][0]}.{user["lastName"][:6]}' else: try: display_name = user['username'][:8] except KeyError: print('user has no username') return 'Error' return(display_name) 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] KeycloakHandler.login() user = KeycloakHandler.get_user_by_card_id(fabcard_id) if not user: MqttHandler.print_to_display(reader_id, 16, fabcard_id) return db_data = SQLHandler.get_machine_data(reader_id) machine_id = db_data["machine_id"] last_user = db_data["last_user"] machine_status = db_data["machine_status"] plug_id = db_data["plug_id"] 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}") MqttHandler.print_to_display(reader_id, 7, '') return username = user['username'] display_name = gen_display_name(user) if not machine_status: 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') SQLHandler.update_machine(reader_id, username, machine_status) MqttHandler.publish(f'/FabLogging/{plug_id}/USER', username) def main(): MqttHandler.setup(handle_request) KeycloakHandler.login() SQLHandler.setup() MqttHandler.connect_mqtt() MqttHandler.subscribe("/rfid_reader/#") SQLHandler.init_db() MqttHandler.loop() if __name__ == '__main__': main()