Hauptkonfiguration - bffh.dhall
BFFH verwendet DHALL für die Struktur der Konfigurationsdateien BFFH verwendet RBAC für die Zugriffskontrolle.
Die Konfiguration von BFFH befindet sich in der Datei bffh.dhall
.
Allgemeine Konfiguration
listens
Enthält die Adressen, auf die BFFH bei der Verbindung für die API hört. Standardport für BFFH ist 59661
Beispiel:
listens =
[
{ address = "127.0.0.1", port = Some 59661 }
]
mqtt_url
Enthält die Adresse des MQTT-Servers, mit dem sich BFFH verbindet.
Die Adresse hat das Format <protocol>://[user]:[password]@<server>:[port]
protocol
wird benötigt und kann eins der folgenden Werte annehmen:mqtt
,tcp
,mqtts
,ssl
user
undpassword
sind optionalserver
ist erforderlich und kann eine IP-Adresse oder ein Hostname seinport
ist optional. Der Standardport ist59661
Beispiele:
mqtt_url = "tcp://localhost:1883"
mqtt_url = "mqtts://user:password@server.tld:port"
db_path
Enthält den Pfad für die interne Datenbank, die BFFH verwendet. BFFH wird zwei Dateien erstellen: <db_path>
und <db_path>-lock
. Es sollte sichergestellt werden, dass BFFH Schreibzugriff auf das entsprechende Verzeichnis hat.
Beispiel:
db_path = "/tmp/bffh"
Berechtigungen (Permissions)
Standardberechtigungen
BFFH verfügt über einige Standardberechtigungen, die der Verwaltung und den Admin-Rechten zugewiesen werden können.
bffh.users.info
- Nutzerliste bekommen und Infos über diese Accounts erhaltenbffh.users.manage
- Nutzerliste bekommen und Nutzer verwaltenbffh.users.admin
- Globale Administration: Nutzer hinzufügen, löschen, ändern (z.B. Passwort-Reset)
Modellieren von Berechtigungen
Allgemeines Schema: space.type.category.permission.model
Administratorspace.machines.printers.*
Offene Berechtigungspace.machines.printers.read.*
BFFH verwendet eine pfadähnliche Zeichenkette als Erlaubnisformat, getrennt durch einen .
Punkt. So besteht zum Beispiel this.is.a.permission
aus den Teilen this
, is
, a
und permission
. Bei der Anforderung von Berechtigungen, z. B. in Maschinen, muss immer eine genaue Berechtigung angegeben werden, also z. B. test.write
. Bei der Erteilung von Berechtigungen, z. B. in Rollen, können entweder eine genaue Berechtigung angegeben oder die beiden Platzhalter *
und +
verwendet werden. Diese Wildcards verhalten sich ähnlich wie Regex- oder Bash-Wildcards:
*
gewährt alle Berechtigungen in diesem Teilbaum. So wirdperms.read.*
für jedes von passen:
perms.read
perms.read.machineA
perms.read.machineB
perms.read.machineC.manage
+
gewährt alle Berechtigungen unter des Wertes. So wirdperms.read.+*
für jedes von passen:
perms.read.machineA
perms.read.machineB
perms.read.machineC.manage
- aber nicht
perms.read
Wildcards sind wahrscheinlich am nützlichsten, um Maschinen zu gruppieren, z.B. 3D-Drucker und eine Bandsäge:
- Write (schreiben) Berechtigungen
machines.printers.write.prusa.sl1
machines.printers.write.prusa.i3
machines.printers.write.anycubic
machines.bandsaws.write.bandsaw1
- Manage (verwalten) Berechtigungen
machines.printers.manage.prusa.sl1
machines.printers.manage.prusa.i3
machines.printers.manage.anycubic
machines.bandsaws.manage.bandsaw1
- Admin Berechtigungen
machines.printers
- Für alle Drucker
- Für alle Drucker
machines.bandsaws
- Für alle Bandsägen
- Für alle Bandsägen
Dann erteilen wir den Rollen die entsprechenden Rechte:
- Nutze beliebige 3D-Drucker:
machines.printers.write.+
- Erlaube nur die Nutzung "billiger" Drucker:
machines.printers.write.anycubic.*
machines.printers.write.prusa.i3
- Erlaube das Verwalten der Drucker:
machines.printers.+
- Erlaubte das Administrieren aller Drucker:
machines.printers.*
Auf diese Weise klappt es trotzdem mit der Aufteilung, wenn später ein weitere Anycubic Drucker gekauft wird:
machines.printers.write.anycubic.i3
machines.printers.write.anycubic.megax
Konfiguration von Maschinen
machines
Enthält eine Liste der definierten Maschinen. Die Maschinen haben verschiedene Wahrnehmungsebenen, mit denen interagiert werden kann:
disclose
(offenlegen): Benutzer kann die Maschine in der Maschinenliste sehenread
(lesen): Der Benutzer kann Informationen über die Maschine und ihren Zustand lesenwrite
(schreiben): Der Benutzer kann die Maschine benutzenmanage
(verwalten): Der Benutzer kann als Manager mit dem System interagieren (Prüfen, Freigeben, Transferieren)
Jede Maschine muss eine ID haben, um in anderen Teilen dieser Konfiguration oder über die API auf die Maschine verweisen zu können. Und jede Maschine muss einen Namen haben.
Optionale Informationen
Um weitere Informationen über die Maschine bereitzustellen, können diesen Beschreibungen hinzugefügt oder ein externer Wiki-Link bereitstellt werden. Beide Attribute sind nur optional und müssen nicht gesetzt werden.
Beispiel:
machines =
{
machine123 =
{
name = "Testmachine",
description = Some "A test machine",
wiki = "https://someurl"
disclose = "lab.test.read",
read = "lab.test.read",
write = "lab.test.write",
manage = "lab.test.admin"
}
}
“machine123” is in this case the “Machine-ID”
Konfiguration von Rollen (roles)
Die Rollen werden in der Datei bffh.dhall
konfiguriert. Wenn die Datei roles.toml
im Verzeichnis vorhanden ist, kann sie gelöscht werden und kann nicht zur Verwaltung von Rollen verwendet werden.
roles
Enthält die Liste der definierten Rollen. Rollen haben eine Liste von Berechtigungen und können vererbt werden. Die Berechtigung kann ein Platzhalter in der Berechtigungsliste sein.
Beispiel:
roles =
{
testrole =
{
permissions = [ "lab.test.*" ]
},
somerole =
{
parents = ["testparent"],
permissions = [ "lab.some.admin" ]
},
testparent =
{
permissions =
[
"lab.some.write",
"lab.some.read",
"lab.some.disclose"
]
}
}
Konfiguration von Aktoren (actors)
actors
Enthält eine Liste von Aktoren. Aktoren werden durch ein Modul und einen oder mehrere Parameter definiert. Aktuell unterstützte Aktoren sind:
Shelly Actor
Dieser Aktor verbindet BFFH über einen MQTT-Server mit einem Shelly Gerät.
Der topic
Parameter des Shelly muss auf das Shelly-spezifische MQTT-Topic gesetzt werden.
Beispiel:
actors =
{
Shelly_123 =
{
module = "Shelly",
params =
{
topic = "shellyplug-s-123456"
}
}
}
„Shelly_123“ ist in diesem Fall die "Actor-ID".
Process Actor
Dieser Aktor ermöglicht es, eigene Geräte mit dem BFFH Server zu verbinden.
cmd
= Pfad der ausführbaren Dateiargs
= Argumente der ausführbaren Datei
Beispiel:
actors =
{
Bash =
{
module = "Process", params =
{
cmd = "./examples/actor.sh",
args = "your ad could be here"
}
}
}
actor_connections
Verbindet den Aktor mit einer Maschine. Eine Maschine kann mehrere Aktoren haben. Verwenden Sie die "Machine-ID" und "Actor-ID".
Beispiel:
actor_connections =
[
{ machine = "Testmachine", actor = "Shelly_1234" },
{ machine = "Another", actor = "Bash" },
{ machine = "Yetmore", actor = "Bash2" }
]
Konfiguration exportieren
BASE="/opt/fabinfra/bffh/target/release"
CFG="$DATA/config/cfg.dhall"
$BASE/bffhd --verbose --config $CFG --dump-users /tmp/users.toml --force