Einfache Konfiguration mit dem FabAccess Config Generator
Wolfram vom MakerSpace Leipzig hat 2024 ein umfangreiches Tool - den FabAccess Config Generator - entwickelt, um eine Konfiguration (bffh.dhall
) anhang einer Maschinenliste im CSV-Format zu erzeugen.
Funktionsumfang
- Generierung von Maschinen
- Generierung von Rollen
- Generierung von Aktoren
- Generierung von einfachen Aktoren-Verbindungen
- Export einer gesonderten Rollenliste (interne ID & Anzeigename der Rolle)
- Abbildung der Struktur mittels Mermaid-Diagramm
- Direkte Aktualisierung einer bestehenden
bffh.dhall
Funktionsweise
Die CSV-Datei enthält pro Zeile einen Eintrag für eine Maschine. Neben Angaben zur Maschine selbst (ID, Wiki-URL etc.) werden Angaben zum Bereich vermerkt, in dem sich die Maschine befindet. Aus den Angaben zu den Bereichen werden dann alle Rollen abgeleitet.
Installation
cd /opt/fabinfra/
git clone https://github.com/elem74/fabaccess-config-generator.git
cd fabaccess-config-generator/
Konfigurationsdatei maschinenliste.csv editieren
vim maschinenliste.csv
Konfigurationsdatei bffh.dhall erzeugen
python3 config-generator.py
Das Tool schreibt automatisch ins Unterverzeichnis output/
die folgenden Dateien:
- bffh-dhall-data.txt
- mermaid-code.txt
- roles.csv
Der Beispiel Mermaid Code sieht wie folgt aus:aus und kann in https://mermaid.live gerendet werden.
Mermaid
%%{init: {"flowchart" : {"curve" : "linear"}}}%%
flowchart TD
subgraph legende["<b>Legende</b><p style="text-align:left;">👑 = Administrator
🛠️ = Manager
👷♂️ = Benutzer
👩🚀 = Benutzer (Alternativrolle)"]
end
subgraph root["
<p style="font-size: 2em">Infrastruktur</p><p style="text-align: left; margin-top: 20px;"><b><center>Rollen</center></b>👑_Admin FabAccess<br>🛠️_Manager Schichtleitung</p></p>
<p style="text-align: left; margin-top: 0px;"></p>
<p style="opacity: 0;">.</p>
"]
end
subgraph root_beispielw["
<p style="font-size: 1.75em">Beispielwerkstatt </p><p style="text-align: left; margin-top: 20px;"><b><center>Rollen</center></b>🛠️Manager Beispielwerkstatt </p></p>
<p style="text-align: left; margin-top: 0px;"></p>
<p style="opacity: 0;">.</p>
"]
end
root ------ root_beispielw
root_beispielw ---- root_beispielw_buero_wrapper
subgraph root_beispielw_buero_wrapper["<p style="opacity: 0;">.</p>"]
style root_beispielw_buero_wrapper stroke: none, fill: none
subgraph root_beispielw_buero["
<p style="font-size: 1.5em">Büro</p><p style="text-align: left; margin-top: 20px;"><b><center>Rollen</center></b>🛠️Manager Büro<br>👷♂️Benutzer Büro<br>👩🚀Benutzer Druckernutzung</p></p>
<p style="text-align: left; margin-top: 0px;"><b><center>Maschinen</center></b>Drucker (👩🚀Benutzer Druckernutzung)</p>
<p style="opacity: 0;">.</p>
"]
end
subgraph filler_root_beispielw_buero_1["
<p style="opacity: 0;">
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
</p>"]
end
style filler_root_beispielw_buero_1 fill: none, stroke: none
root_beispielw_buero~~~~~~filler_root_beispielw_buero_1
subgraph filler_root_beispielw_buero_2["
<p style="opacity: 0;">
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
</p>"]
end
style filler_root_beispielw_buero_2 fill: none, stroke: none
filler_root_beispielw_buero_1~~~~~filler_root_beispielw_buero_2
end
root_beispielw ---- root_beispielw_fablab_wrapper
subgraph root_beispielw_fablab_wrapper["<p style="opacity: 0;">.</p>"]
style root_beispielw_fablab_wrapper stroke: none, fill: none
subgraph root_beispielw_fablab["
<p style="font-size: 1.5em">FabLab</p><p style="text-align: left; margin-top: 20px;"><b><center>Rollen</center></b>🛠️Manager FabLab<br>👷♂️Benutzer FabLab</p></p>
<p style="text-align: left; margin-top: 0px;"></p>
<p style="opacity: 0;">.</p>
"]
end
subgraph root_beispielw_fablab_3dprint["
<p style="font-size: 1.25em">3D-Druck</p><p style="text-align: left; margin-top: 20px;"><b><center>Rollen</center></b>🛠️Manager FabLab 3D-Druck<br>👷♂️Benutzer FabLab 3D-Druck</p></p>
<p style="text-align: left; margin-top: 0px;"><b><center>Maschinen</center></b>3D-Drucker 1<br>3D-Drucker 2</p>
<p style="opacity: 0;">.</p>
"]
end
root_beispielw_fablab ------ root_beispielw_fablab_3dprint
subgraph root_beispielw_fablab_laser["
<p style="font-size: 1.25em">Laser</p><p style="text-align: left; margin-top: 20px;"><b><center>Rollen</center></b>🛠️Manager FabLab Laser<br>👷♂️Benutzer FabLab Laser</p></p>
<p style="text-align: left; margin-top: 0px;"><b><center>Maschinen</center></b>Lasercutter<br>Kühlung</p>
<p style="opacity: 0;">.</p>
"]
end
root_beispielw_fablab ------ root_beispielw_fablab_laser
end
root_beispielw ---- root_beispielw_holz_wrapper
subgraph root_beispielw_holz_wrapper["<p style="opacity: 0;">.</p>"]
style root_beispielw_holz_wrapper stroke: none, fill: none
subgraph root_beispielw_holz["
<p style="font-size: 1.5em">Holzwerkstatt</p><p style="text-align: left; margin-top: 20px;"><b><center>Rollen</center></b>🛠️Manager Holzwerkstatt<br>👷♂️Benutzer Holzwerkstatt</p></p>
<p style="text-align: left; margin-top: 0px;"><b><center>Maschinen</center></b>Kappsäge<br>Bandschleifer<br>Ständerbohrmaschine</p>
<p style="opacity: 0;">.</p>
"]
end
subgraph root_beispielw_holz_bandsaege["
<p style="font-size: 1.25em">Bandsäge</p><p style="text-align: left; margin-top: 20px;"><b><center>Rollen</center></b>🛠️Manager Holzwerkstatt Bandsäge<br>👷♂️Benutzer Holzwerkstatt Bandsäge</p></p>
<p style="text-align: left; margin-top: 0px;"><b><center>Maschinen</center></b>Bandsäge</p>
<p style="opacity: 0;">.</p>
"]
end
root_beispielw_holz ------ root_beispielw_holz_bandsaege
subgraph root_beispielw_holz_hobelmaschine["
<p style="font-size: 1.25em">Hobelmaschine</p><p style="text-align: left; margin-top: 20px;"><b><center>Rollen</center></b>🛠️Manager Holzwerkstatt Hobelmaschine<br>👷♂️Benutzer Holzwerkstatt Hobelmaschine</p></p>
<p style="text-align: left; margin-top: 0px;"><b><center>Maschinen</center></b>Hobelmaschine</p>
<p style="opacity: 0;">.</p>
"]
end
root_beispielw_holz ------ root_beispielw_holz_hobelmaschine
subgraph root_beispielw_holz_holzcnc["
<p style="font-size: 1.25em">CNC-Fräse</p><p style="text-align: left; margin-top: 20px;"><b><center>Rollen</center></b>🛠️Manager Holzwerkstatt CNC-Fräse<br>👷♂️Benutzer Holzwerkstatt CNC-Fräse</p></p>
<p style="text-align: left; margin-top: 0px;"><b><center>Maschinen</center></b>CNC-Fräse</p>
<p style="opacity: 0;">.</p>
"]
end
root_beispielw_holz ------ root_beispielw_holz_holzcnc
end
root_beispielw ---- root_beispielw_siebdruck_wrapper
subgraph root_beispielw_siebdruck_wrapper["<p style="opacity: 0;">.</p>"]
style root_beispielw_siebdruck_wrapper stroke: none, fill: none
subgraph root_beispielw_siebdruck["
<p style="font-size: 1.5em">Siebdruck</p><p style="text-align: left; margin-top: 20px;"><b><center>Rollen</center></b>🛠️Manager Siebdruck<br>👷♂️Benutzer Siebdruck<br>👩🚀Benutzer Druckernutzung</p></p>
<p style="text-align: left; margin-top: 0px;"><b><center>Maschinen</center></b>SD-Belichter<br>A3-Drucker (👩🚀Benutzer Druckernutzung)</p>
<p style="opacity: 0;">.</p>
"]
end
subgraph filler_root_beispielw_siebdruck_1["
<p style="opacity: 0;">
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
</p>"]
end
style filler_root_beispielw_siebdruck_1 fill: none, stroke: none
root_beispielw_siebdruck~~~~~~filler_root_beispielw_siebdruck_1
subgraph filler_root_beispielw_siebdruck_2["
<p style="opacity: 0;">
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
</p>"]
end
style filler_root_beispielw_siebdruck_2 fill: none, stroke: none
filler_root_beispielw_siebdruck_1~~~~~filler_root_beispielw_siebdruck_2
end
root_beispielw ---- root_beispielw_textil_wrapper
subgraph root_beispielw_textil_wrapper["<p style="opacity: 0;">.</p>"]
style root_beispielw_textil_wrapper stroke: none, fill: none
subgraph root_beispielw_textil["
<p style="font-size: 1.5em">Textilwerkstatt</p><p style="text-align: left; margin-top: 20px;"><b><center>Rollen</center></b>🛠️Manager Textilwerkstatt<br>👷♂️Benutzer Textilwerkstatt</p></p>
<p style="text-align: left; margin-top: 0px;"><b><center>Maschinen</center></b>Nähmaschine 1<br>Nähmaschine 2</p>
<p style="opacity: 0;">.</p>
"]
end
subgraph filler_root_beispielw_textil_1["
<p style="opacity: 0;">
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
</p>"]
end
style filler_root_beispielw_textil_1 fill: none, stroke: none
root_beispielw_textil~~~~~~filler_root_beispielw_textil_1
subgraph filler_root_beispielw_textil_2["
<p style="opacity: 0;">
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
</p>"]
end
style filler_root_beispielw_textil_2 fill: none, stroke: none
filler_root_beispielw_textil_1~~~~~filler_root_beispielw_textil_2
end