From a4dafd856e385c9e452eeb270327904b4813621c Mon Sep 17 00:00:00 2001 From: Wolfram Date: Sat, 30 Nov 2024 17:49:03 +0100 Subject: [PATCH] 2024.12a --- CHANGELOG | 12 +++++ config-generator.py | 6 +-- generator/core.py | 114 ++++++++++++++++++++++++++++--------------- generator/globals.py | 2 +- generator/helpers.py | 10 +--- settings.ini | 22 ++++++--- 6 files changed, 107 insertions(+), 59 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 96d451e..29e92cc 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,15 @@ +2024.11 +- **Features** + - Neu: Option zur Erstellung eines Domänen-Managers. (`manager_domain`) + - Neu: Option zur Erstellung eines werkstattweiten Benutzers. (`domain_user`) + - Neu: Option zum Einstellen des CSV-Trennzeichens. (`csv_delimiter`) +- **Konzeptionelle Änderungen** + - +- **Umbenennungen** + - Die Einstellung `fa_update_dhall` heißt jetzt `fa_dhall_update`, damit ein einheitliches Benennungsschema mit der dazugehörigen Einstellungen `fa_dhall_file` gegeben ist. +- **Weiteres** + - Admin-Berechtigungen wurden vollständig auf Wildcard-Zugriffsschema umgestellt. Zuvor wurden Berechtigungen für einzelne Bereiche vergeben. + 2024.6 - **Diagrammerzeugung** - Das Diagramm enthält jetzt eine Icon-Legende diff --git a/config-generator.py b/config-generator.py index d0f9c96..03f2a2c 100644 --- a/config-generator.py +++ b/config-generator.py @@ -1,4 +1,4 @@ -__version__ = '2024.6' +__version__ = '2024.12' import time time_start = time.perf_counter() @@ -49,7 +49,7 @@ if settings["create_file_roles"] == True: content = generate_csv_roles(roles) write_file('output/roles.csv', content) -if settings["fa_update_dhall"] == True: +if settings["fa_dhall_update"] == True: print(' --- Aktualisierung der bffh.dhall') fa_dhall_file = settings["fa_dhall_file"] @@ -65,7 +65,7 @@ if settings["fa_update_dhall"] == True: # Pfadangabe "fa_dhall_file" ist leer else: print('Einstellung "fa_dhall_file" ist leer, es wurde kein Pfad zur bffh.dhall angegeben.') - print('Bitte das Feld ausfüllen oder "fa_update_dhall" auf "False" setzen.') + print('Bitte das Feld ausfüllen oder "fa_dhall_update" auf "False" setzen.') # Mermaid-Code if settings["generate_mermaid"] == True: diff --git a/generator/core.py b/generator/core.py index 311207d..ad9a7ad 100644 --- a/generator/core.py +++ b/generator/core.py @@ -15,8 +15,6 @@ class Domain: perm_handle = domain_id + '.' id_handle = perm_handle.replace('.', '_') - perms_manager = [perm_handle + '*'] - self.domain = { "id": domain_id, "name": domain_name @@ -24,16 +22,29 @@ class Domain: self.domain_manager = { "id": id_handle + 'manager', - "name": string_managerhandle + domain_name, - "perms": perms_manager + "name": '_' + string_managerhandle + domain_name, + "perms": perm_handle + '*' } + self.domain_user = { + "id": id_handle + 'user', + "name": '_' + string_userhandle + domain_name, + "perms": [] + } + + def get_domain(self): return self.domain + def get_domain_perms(self): + return self.domain_manager["perms"] + def get_domain_manager(self): return self.domain_manager + def get_domain_user(self): + return self.domain_user + class Area(Domain): def __init__(self, domain_id, domain_name, area_id, area_name): @@ -274,7 +285,7 @@ class GraphElement: # Maschinen aus der CSV-importieren def import_machines(file): machines = {} - data = csv_listdict(file, csv_match) + data = csv_listdict(file, settings['csv_delimiter'], csv_match) count = 2 print(f'{"Zeile": ^8} | {"Status": ^24} | {"Zusatzinformation": ^20}') @@ -355,28 +366,28 @@ def generate_roles(machines): if roledata["id"] not in roles.keys(): roles[roledata["id"]] = roledata - - # Schichtleitung anlegen - if settings["manager_schichtleitung"] == True: - roledata = manager_schichtleitung - - if roledata["id"] not in roles.keys(): - roles[roledata["id"]] = roledata - - # Domänen durchlaufen for id, m in machines.items(): - # Domänen-Berechtigung an Manager & Schichtleitung vergeben - roledata = m.get_domain_manager() - for perm in roledata["perms"]: - if perm not in roles[admin_global["id"]]["perms"]: - roles[admin_global["id"]]["perms"].append(perm) + # Domänen-Berechtigung an Admin & Manager vergeben - if settings["manager_schichtleitung"] == True: - for perm in roledata["perms"]: - if perm not in roles[manager_schichtleitung["id"]]["perms"]: - roles[manager_schichtleitung["id"]]["perms"].append(perm) + # 2do: Admin - Überflüssige Berechtigungen? + # for perm in roledata["perms"]: + + # if perm not in roles[admin_global["id"]]["perms"]: + # roles[admin_global["id"]]["perms"].append(perm) + + # 2do - end + + perm = m.get_domain_perms() + + if perm not in roles[admin_global["id"]]["perms"]: + roles[admin_global["id"]]["perms"].append(perm) + + if settings["manager_domain"] == True: + + if roledata["id"] not in roles.keys(): + roles[roledata["id"]] = roledata # Manager: Domain if settings["multi_domains"] == True: @@ -385,6 +396,10 @@ def generate_roles(machines): if roledata["id"] not in roles.keys(): roles[roledata["id"]] = roledata + for perm in roledata["perms"]: + if perm not in roles[manager_domain["id"]]["perms"]: + roles[manager_domain["id"]]["perms"].append(perm) + # Manager: Area if settings["manager_area"] == True: roledata = m.get_area_manager() @@ -403,30 +418,51 @@ def generate_roles(machines): # Benutzer: Daten abrufen - if m.has_customrole() == True: - # Extrarolle - roledata = m.get_customrole() - - if roledata["id"] in roles.keys(): - # Extrarolle vorhanden --> Berechtigungen hinzufügen - for p in roledata["perms"]: - roles[roledata["id"]]["perms"].append(p) + if settings["domain_user"] == True: + # Domäne-Benutzer + roledata = m.get_domain_user() else: + # Kein Domäne-Benutzer + if m.has_customrole() == True: + # Extrarolle + roledata = m.get_customrole() + + if roledata["id"] in roles.keys(): + # Extrarolle vorhanden --> Berechtigungen hinzufügen + for p in roledata["perms"]: + roles[roledata["id"]]["perms"].append(p) - if m.has_subarea() == True: - # Unterbereich - roledata = m.get_subarea_user() else: - # Bereich - roledata = m.get_area_user() - # print_dict(roledata) + if m.has_subarea() == True: + # Unterbereich + roledata = m.get_subarea_user() + else: + # Bereich + roledata = m.get_area_user() # Benutzer: Hinzufügen if roledata["id"] not in roles.keys(): roles[roledata["id"]] = roledata + + # Domänen-Benutzer: Berechtigungen hinzufügen + + if settings["domain_user"] == True: + if m.has_subarea() == True: + # Unterbereich + perms = m.get_subarea_user()["perms"] + else: + # Bereich + perms = m.get_area_user()["perms"] + + for p in perms: + if p not in roles[roledata["id"]]["perms"]: + roles[roledata["id"]]["perms"].append(p) + + print_dict(roles) + return roles @@ -686,8 +722,8 @@ def graph_create_elements(machines): data = {} data["_root"] = GraphElement("root", "Infrastruktur", '') data["_root"].add_role(f'{icon_admin}{admin_global["name"]}') - if settings["manager_schichtleitung"] == True: - data["_root"].add_role(f'{icon_manager}{manager_schichtleitung["name"]}') + if settings["manager_domain"] == True: + data["_root"].add_role(f'{icon_manager}{manager_domain["name"]}') for key, m in machines.items(): diff --git a/generator/globals.py b/generator/globals.py index dcd9611..5ab836f 100644 --- a/generator/globals.py +++ b/generator/globals.py @@ -18,7 +18,7 @@ admin_global = { "perms": ["bffh.users.manage", "bffh.users.info", "bffh.users.admin"] } -manager_schichtleitung = { +manager_domain = { "id": "_manager_schichtleitung", "name": "_Manager Schichtleitung", "perms": [] diff --git a/generator/helpers.py b/generator/helpers.py index 698f850..1764bdd 100644 --- a/generator/helpers.py +++ b/generator/helpers.py @@ -50,7 +50,7 @@ def list_join(my_list, insert): return my_string # CSV einlesen: Erzeugt eine Liste, die für jede Zeile ein Dictionary mit Header und Value ausgibt -def csv_listdict(filename, replacedict = {}): +def csv_listdict(filename, csv_delimiter, replacedict = {}): csvfile = open(filename, 'r', encoding='utf-8-sig') tempfile = '' @@ -75,7 +75,7 @@ def csv_listdict(filename, replacedict = {}): # Dictionary bilden csvfile = open(filename, mode='r', encoding='utf-8-sig') - reader = csv.DictReader(csvfile, delimiter=';') + reader = csv.DictReader(csvfile, delimiter=csv_delimiter) finaldata = [] @@ -181,12 +181,6 @@ def config_load(file, section = 'all'): return dict_settings - -# ------------------ ALT --------------- - - -# Maschinen-Dictionary sortieren - # Actor-Library einlesen def load_actors(file): dict_actors = {} diff --git a/settings.ini b/settings.ini index 288532d..9f08119 100644 --- a/settings.ini +++ b/settings.ini @@ -3,25 +3,31 @@ ; Einstellung inkativ = False [generator] -; Verwendung mehrer Domänen. Bei Verwendung mehrer Domänen werden einzelne Admins nur für die Domäne erstellt +; CSV-Trennzeichen. Bei Ververwendung des Kommas als Trennzeichen müssen Beschreibungstexte in Anführungszeichen gesetzt werden. +csv_delimiter = ; + +; Verwendung mehrer Domänen. Bei Verwendung mehrer Domänen werden wird für jede Domäne ein Manager erstellt multi_domains = False -; Rolle "Schichtleitung" erstellen, die über Manager-Berechtigungen für alle Domänen verfügt -manager_schichtleitung = True +; Erstellung einer Benutzerrolle für die gesamte Werkstatt. (Es werden keine Benutzerrollen für Unterbereiche/ Bereiche erstellt) +domain_user = True -; Manager-Rolle für jeden Bereich erstellen -manager_area = True +; Manager-Rolle für die Domäne erstellen. +manager_domain = True + +; Manager-Rolle für jeden Bereich erstellen. +manager_area = False ; Spalte "Unterbereich Manager" der CSV beachten (True) der nicht (False). -manager_subarea = True +manager_subarea = False ; Automatisches Einfügen aller erzeugten Daten (Maschinen, Rolle, Aktoren, Aktor-Verbindungen) in die bffh.dhall ; Die Datei muss über Platzhalter verfügen, siehe Beispieldatei ( /docs/bffh-vorlage.dhall ) -fa_update_dhall = False +fa_dhall_update = True ; Pfad zur bffh.dall von FabAccess. Der Pfad muss vollständig sein und die bffh.dhall beinhalten. ; Beispiel: D:\FabAccess\config\bffh\bffh.dhall bzw. /home/fabaccess/bffh/bffh.dhall -fa_dhall_file = +fa_dhall_file = F:\Git\fabaccess-docker\config\bffh\bffh.dhall ; Mermaid-Code erzeugen generate_mermaid = True